diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/HtmlFormatter.php | 252 | ||||
-rw-r--r-- | lib/ckeditor5/LICENSE.md | 98 | ||||
-rw-r--r-- | lib/ckeditor5/README.md | 136 | ||||
-rw-r--r-- | lib/ckeditor5/build/ckeditor.js | 10 | ||||
-rw-r--r-- | lib/ckeditor5/package.json | 86 | ||||
-rw-r--r-- | lib/ckeditor5/sample/index.html | 326 | ||||
-rw-r--r-- | lib/ckeditor5/sample/styles.css | 930 | ||||
-rw-r--r-- | lib/ckeditor5/src/ckeditor.js | 158 | ||||
-rw-r--r-- | lib/ckeditor5/webpack.config.js | 192 | ||||
-rwxr-xr-x | lib/htmlawed/htmLawed.php | 1458 | ||||
-rwxr-xr-x | lib/htmlawed/htmLawedTest.php | 1354 | ||||
-rw-r--r-- | lib/htmlawed/htmLawed_README.htm | 4576 | ||||
-rwxr-xr-x | lib/htmlawed/htmLawed_README.txt | 3634 | ||||
-rwxr-xr-x | lib/htmlawed/htmLawed_TESTCASE.txt | 910 |
14 files changed, 7060 insertions, 7060 deletions
diff --git a/lib/HtmlFormatter.php b/lib/HtmlFormatter.php index 89605ac..0101f1b 100644 --- a/lib/HtmlFormatter.php +++ b/lib/HtmlFormatter.php | |||
@@ -1,126 +1,126 @@ | |||
1 | <?php | 1 | <?php |
2 | // https://github.com/mihaeu/html-formatter | 2 | // https://github.com/mihaeu/html-formatter |
3 | 3 | ||
4 | namespace Mihaeu; | 4 | namespace Mihaeu; |
5 | 5 | ||
6 | class HtmlFormatter | 6 | class HtmlFormatter |
7 | { | 7 | { |
8 | /** | 8 | /** |
9 | * Formats HTML by re-indenting the tags and removing unnecessary whitespace. | 9 | * Formats HTML by re-indenting the tags and removing unnecessary whitespace. |
10 | * | 10 | * |
11 | * @param string $html HTML string. | 11 | * @param string $html HTML string. |
12 | * @param string $indentWith Characters that are being used for indentation (default = 4 spaces). | 12 | * @param string $indentWith Characters that are being used for indentation (default = 4 spaces). |
13 | * @param string $tagsWithoutIndentation Comma-separated list of HTML tags that should not be indented (default = html,link,img,meta) | 13 | * @param string $tagsWithoutIndentation Comma-separated list of HTML tags that should not be indented (default = html,link,img,meta) |
14 | * @return string Re-indented HTML. | 14 | * @return string Re-indented HTML. |
15 | */ | 15 | */ |
16 | public static function format($html, $indentWith = ' ', $tagsWithoutIndentation = 'html,link,img,meta') | 16 | public static function format($html, $indentWith = ' ', $tagsWithoutIndentation = 'html,link,img,meta') |
17 | { | 17 | { |
18 | // replace newlines (CRLF and LF), followed by a non-whitespace character, with a space | 18 | // replace newlines (CRLF and LF), followed by a non-whitespace character, with a space |
19 | $html = preg_replace('/\\r?\\n([^\s])/', ' $1', $html); | 19 | $html = preg_replace('/\\r?\\n([^\s])/', ' $1', $html); |
20 | 20 | ||
21 | // remove all remaining line feeds and replace tabs with spaces | 21 | // remove all remaining line feeds and replace tabs with spaces |
22 | $html = str_replace(["\n", "\r", "\t"], ['', '', ' '], $html); | 22 | $html = str_replace(["\n", "\r", "\t"], ['', '', ' '], $html); |
23 | $elements = preg_split('/(<.+>)/U', $html, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); | 23 | $elements = preg_split('/(<.+>)/U', $html, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); |
24 | $dom = self::parseDom($elements); | 24 | $dom = self::parseDom($elements); |
25 | 25 | ||
26 | $indent = 0; | 26 | $indent = 0; |
27 | $output = array(); | 27 | $output = array(); |
28 | foreach ($dom as $index => $element) | 28 | foreach ($dom as $index => $element) |
29 | { | 29 | { |
30 | if ($element['opening']) | 30 | if ($element['opening']) |
31 | { | 31 | { |
32 | $output[] = "\n".str_repeat($indentWith, $indent).trim($element['content']); | 32 | $output[] = "\n".str_repeat($indentWith, $indent).trim($element['content']); |
33 | 33 | ||
34 | // make sure that only the elements who have not been blacklisted are being indented | 34 | // make sure that only the elements who have not been blacklisted are being indented |
35 | if ( ! in_array($element['type'], explode(',', $tagsWithoutIndentation))) | 35 | if ( ! in_array($element['type'], explode(',', $tagsWithoutIndentation))) |
36 | { | 36 | { |
37 | ++$indent; | 37 | ++$indent; |
38 | } | 38 | } |
39 | } | 39 | } |
40 | else if ($element['standalone']) | 40 | else if ($element['standalone']) |
41 | { | 41 | { |
42 | $output[] = "\n".str_repeat($indentWith, $indent).trim($element['content']); | 42 | $output[] = "\n".str_repeat($indentWith, $indent).trim($element['content']); |
43 | } | 43 | } |
44 | else if ($element['closing']) | 44 | else if ($element['closing']) |
45 | { | 45 | { |
46 | --$indent; | 46 | --$indent; |
47 | $lf = "\n".str_repeat($indentWith, abs($indent)); | 47 | $lf = "\n".str_repeat($indentWith, abs($indent)); |
48 | if (isset($dom[$index - 1]) && $dom[$index - 1]['opening']) | 48 | if (isset($dom[$index - 1]) && $dom[$index - 1]['opening']) |
49 | { | 49 | { |
50 | $lf = ''; | 50 | $lf = ''; |
51 | } | 51 | } |
52 | $output[] = $lf.trim($element['content']); | 52 | $output[] = $lf.trim($element['content']); |
53 | } | 53 | } |
54 | else if ($element['text']) | 54 | else if ($element['text']) |
55 | { | 55 | { |
56 | // $output[] = "\n".str_repeat($indentWith, $indent).trim($element['content']); | 56 | // $output[] = "\n".str_repeat($indentWith, $indent).trim($element['content']); |
57 | $output[] = "\n".str_repeat($indentWith, $indent).preg_replace('/ [ \t]*/', ' ', $element['content']); | 57 | $output[] = "\n".str_repeat($indentWith, $indent).preg_replace('/ [ \t]*/', ' ', $element['content']); |
58 | } | 58 | } |
59 | else if ($element['comment']) | 59 | else if ($element['comment']) |
60 | { | 60 | { |
61 | $output[] = "\n".str_repeat($indentWith, $indent).trim($element['content']); | 61 | $output[] = "\n".str_repeat($indentWith, $indent).trim($element['content']); |
62 | } | 62 | } |
63 | } | 63 | } |
64 | 64 | ||
65 | return trim(implode('', $output)); | 65 | return trim(implode('', $output)); |
66 | } | 66 | } |
67 | 67 | ||
68 | /** | 68 | /** |
69 | * Parses an array of HTML tokens and adds basic information about about the type of | 69 | * Parses an array of HTML tokens and adds basic information about about the type of |
70 | * tag the token represents. | 70 | * tag the token represents. |
71 | * | 71 | * |
72 | * @param Array $elements Array of HTML tokens (tags and text tokens). | 72 | * @param Array $elements Array of HTML tokens (tags and text tokens). |
73 | * @return Array HTML elements with extra information. | 73 | * @return Array HTML elements with extra information. |
74 | */ | 74 | */ |
75 | public static function parseDom(Array $elements) | 75 | public static function parseDom(Array $elements) |
76 | { | 76 | { |
77 | $dom = array(); | 77 | $dom = array(); |
78 | foreach ($elements as $element) | 78 | foreach ($elements as $element) |
79 | { | 79 | { |
80 | $isText = false; | 80 | $isText = false; |
81 | $isComment = false; | 81 | $isComment = false; |
82 | $isClosing = false; | 82 | $isClosing = false; |
83 | $isOpening = false; | 83 | $isOpening = false; |
84 | $isStandalone = false; | 84 | $isStandalone = false; |
85 | 85 | ||
86 | $currentElement = trim($element); | 86 | $currentElement = trim($element); |
87 | 87 | ||
88 | // comment | 88 | // comment |
89 | if (strpos($currentElement, '<!') === 0) | 89 | if (strpos($currentElement, '<!') === 0) |
90 | { | 90 | { |
91 | $isComment = true; | 91 | $isComment = true; |
92 | } | 92 | } |
93 | // closing tag | 93 | // closing tag |
94 | else if (strpos($currentElement, '</') === 0) | 94 | else if (strpos($currentElement, '</') === 0) |
95 | { | 95 | { |
96 | $isClosing = true; | 96 | $isClosing = true; |
97 | } | 97 | } |
98 | // stand-alone tag | 98 | // stand-alone tag |
99 | else if (preg_match('/\/>$/', $currentElement)) | 99 | else if (preg_match('/\/>$/', $currentElement)) |
100 | { | 100 | { |
101 | $isStandalone = true; | 101 | $isStandalone = true; |
102 | } | 102 | } |
103 | // normal opening tag | 103 | // normal opening tag |
104 | else if (strpos($currentElement, '<') === 0) | 104 | else if (strpos($currentElement, '<') === 0) |
105 | { | 105 | { |
106 | $isOpening = true; | 106 | $isOpening = true; |
107 | } | 107 | } |
108 | // text | 108 | // text |
109 | else | 109 | else |
110 | { | 110 | { |
111 | $isText = true; | 111 | $isText = true; |
112 | } | 112 | } |
113 | 113 | ||
114 | $dom[] = array( | 114 | $dom[] = array( |
115 | 'text' => $isText, | 115 | 'text' => $isText, |
116 | 'comment' => $isComment, | 116 | 'comment' => $isComment, |
117 | 'closing' => $isClosing, | 117 | 'closing' => $isClosing, |
118 | 'opening' => $isOpening, | 118 | 'opening' => $isOpening, |
119 | 'standalone' => $isStandalone, | 119 | 'standalone' => $isStandalone, |
120 | 'content' => $element, | 120 | 'content' => $element, |
121 | 'type' => preg_replace('/^<\/?(\w+)[ >].*$/U', '$1', $element) | 121 | 'type' => preg_replace('/^<\/?(\w+)[ >].*$/U', '$1', $element) |
122 | ); | 122 | ); |
123 | } | 123 | } |
124 | return $dom; | 124 | return $dom; |
125 | } | 125 | } |
126 | } | 126 | } |
diff --git a/lib/ckeditor5/LICENSE.md b/lib/ckeditor5/LICENSE.md index 95eabee..868e64d 100644 --- a/lib/ckeditor5/LICENSE.md +++ b/lib/ckeditor5/LICENSE.md | |||
@@ -1,49 +1,49 @@ | |||
1 | Software License Agreement | 1 | Software License Agreement |
2 | ========================== | 2 | ========================== |
3 | 3 | ||
4 | Copyright (c) 2014-2021, CKSource - Frederico Knabben. All rights reserved. | 4 | Copyright (c) 2014-2021, CKSource - Frederico Knabben. All rights reserved. |
5 | 5 | ||
6 | Online builder code samples are licensed under the terms of the MIT License (see Appendix A): | 6 | Online builder code samples are licensed under the terms of the MIT License (see Appendix A): |
7 | 7 | ||
8 | http://en.wikipedia.org/wiki/MIT_License | 8 | http://en.wikipedia.org/wiki/MIT_License |
9 | 9 | ||
10 | CKEditor 5 collaboration features are only available under a commercial license. [Contact us](https://ckeditor.com/contact/) for more details. | 10 | CKEditor 5 collaboration features are only available under a commercial license. [Contact us](https://ckeditor.com/contact/) for more details. |
11 | 11 | ||
12 | Free 30-days trials of CKEditor 5 collaboration features are available: | 12 | Free 30-days trials of CKEditor 5 collaboration features are available: |
13 | * https://ckeditor.com/collaboration/ - Real-time collaboration (with all features). | 13 | * https://ckeditor.com/collaboration/ - Real-time collaboration (with all features). |
14 | * https://ckeditor.com/collaboration/comments/ - Inline comments feature (without real-time collaborative editing). | 14 | * https://ckeditor.com/collaboration/comments/ - Inline comments feature (without real-time collaborative editing). |
15 | * https://ckeditor.com/collaboration/track-changes/ - Track changes feature (without real-time collaborative editing). | 15 | * https://ckeditor.com/collaboration/track-changes/ - Track changes feature (without real-time collaborative editing). |
16 | 16 | ||
17 | Trademarks | 17 | Trademarks |
18 | ---------- | 18 | ---------- |
19 | 19 | ||
20 | CKEditor is a trademark of CKSource - Frederico Knabben. All other brand | 20 | CKEditor is a trademark of CKSource - Frederico Knabben. All other brand |
21 | and product names are trademarks, registered trademarks or service | 21 | and product names are trademarks, registered trademarks or service |
22 | marks of their respective holders. | 22 | marks of their respective holders. |
23 | 23 | ||
24 | --- | 24 | --- |
25 | 25 | ||
26 | Appendix A: The MIT License | 26 | Appendix A: The MIT License |
27 | --------------------------- | 27 | --------------------------- |
28 | 28 | ||
29 | The MIT License (MIT) | 29 | The MIT License (MIT) |
30 | 30 | ||
31 | Copyright (c) 2014-2021, CKSource - Frederico Knabben | 31 | Copyright (c) 2014-2021, CKSource - Frederico Knabben |
32 | 32 | ||
33 | Permission is hereby granted, free of charge, to any person obtaining a copy | 33 | Permission is hereby granted, free of charge, to any person obtaining a copy |
34 | of this software and associated documentation files (the "Software"), to deal | 34 | of this software and associated documentation files (the "Software"), to deal |
35 | in the Software without restriction, including without limitation the rights | 35 | in the Software without restriction, including without limitation the rights |
36 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | 36 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
37 | copies of the Software, and to permit persons to whom the Software is | 37 | copies of the Software, and to permit persons to whom the Software is |
38 | furnished to do so, subject to the following conditions: | 38 | furnished to do so, subject to the following conditions: |
39 | 39 | ||
40 | The above copyright notice and this permission notice shall be included in | 40 | The above copyright notice and this permission notice shall be included in |
41 | all copies or substantial portions of the Software. | 41 | all copies or substantial portions of the Software. |
42 | 42 | ||
43 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 43 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
44 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 44 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
45 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | 45 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
46 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 46 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
47 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 47 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
48 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | 48 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
49 | THE SOFTWARE. | 49 | THE SOFTWARE. |
diff --git a/lib/ckeditor5/README.md b/lib/ckeditor5/README.md index fc116c4..c5438a7 100644 --- a/lib/ckeditor5/README.md +++ b/lib/ckeditor5/README.md | |||
@@ -1,68 +1,68 @@ | |||
1 | # CKEditor 5 editor generated with the online builder | 1 | # CKEditor 5 editor generated with the online builder |
2 | 2 | ||
3 | This repository presents a CKEditor 5 editor build generated by the [Online builder tool](https://ckeditor.com/ckeditor-5/online-builder) | 3 | This repository presents a CKEditor 5 editor build generated by the [Online builder tool](https://ckeditor.com/ckeditor-5/online-builder) |
4 | 4 | ||
5 | ## Quick start | 5 | ## Quick start |
6 | 6 | ||
7 | 1. Open the `sample/index.html` page in the browser. | 7 | 1. Open the `sample/index.html` page in the browser. |
8 | 8 | ||
9 | If you picked the real-time collaboration plugins: | 9 | If you picked the real-time collaboration plugins: |
10 | 10 | ||
11 | 2. Fill the dialog with correct token, websocket and upload URL endpoints. If you do not have these yet or do not know their meaning, [contact us](https://ckeditor.com/contact/). | 11 | 2. Fill the dialog with correct token, websocket and upload URL endpoints. If you do not have these yet or do not know their meaning, [contact us](https://ckeditor.com/contact/). |
12 | 12 | ||
13 | 3. Copy the URL and share it or paste in another tab to enjoy real-time collaborative editing. | 13 | 3. Copy the URL and share it or paste in another tab to enjoy real-time collaborative editing. |
14 | 14 | ||
15 | If you picked the non-real-time collaboration plugins: | 15 | If you picked the non-real-time collaboration plugins: |
16 | 16 | ||
17 | 2. Fill the prompt with the license key. If you do not have the license key yet [contact us](https://ckeditor.com/contact/). | 17 | 2. Fill the prompt with the license key. If you do not have the license key yet [contact us](https://ckeditor.com/contact/). |
18 | 18 | ||
19 | ## Configuring build | 19 | ## Configuring build |
20 | 20 | ||
21 | Changes like changing toolbar items, changing order of icons or customizing plugin configurations should be relatively easy to make. Open the `sample/index.html` file and edit the script that initialized the CKEditor 5. Save the file and refresh the browser. That's all. | 21 | Changes like changing toolbar items, changing order of icons or customizing plugin configurations should be relatively easy to make. Open the `sample/index.html` file and edit the script that initialized the CKEditor 5. Save the file and refresh the browser. That's all. |
22 | 22 | ||
23 | *Note:* If you have any problems with browser caching use the `Ctrl + R` or `Cmd + R` shortcut depending on your system. | 23 | *Note:* If you have any problems with browser caching use the `Ctrl + R` or `Cmd + R` shortcut depending on your system. |
24 | 24 | ||
25 | However if you want to remove or add a plugin to the build you need to follow the next step of this guide. | 25 | However if you want to remove or add a plugin to the build you need to follow the next step of this guide. |
26 | 26 | ||
27 | Note that it is also possible to go back to the [Online builder tool](https://ckeditor.com/ckeditor-5/online-builder) and pick other set of plugins. But we encourage you to try the harder way and to learn the principles of Node.js and CKEditor 5 ecosystems that will allow you to do more cool things in the future! | 27 | Note that it is also possible to go back to the [Online builder tool](https://ckeditor.com/ckeditor-5/online-builder) and pick other set of plugins. But we encourage you to try the harder way and to learn the principles of Node.js and CKEditor 5 ecosystems that will allow you to do more cool things in the future! |
28 | 28 | ||
29 | ### Installation | 29 | ### Installation |
30 | 30 | ||
31 | In order to rebuild the application you need to install all dependencies first. To do it, open the terminal in the project directory and type: | 31 | In order to rebuild the application you need to install all dependencies first. To do it, open the terminal in the project directory and type: |
32 | 32 | ||
33 | ``` | 33 | ``` |
34 | npm install | 34 | npm install |
35 | ``` | 35 | ``` |
36 | 36 | ||
37 | Make sure that you have the `node` and `npm` installed first. If not, then follow the instructions on the [Node.js documentation page](https://nodejs.org/en/). | 37 | Make sure that you have the `node` and `npm` installed first. If not, then follow the instructions on the [Node.js documentation page](https://nodejs.org/en/). |
38 | 38 | ||
39 | ### Adding or removing plugins | 39 | ### Adding or removing plugins |
40 | 40 | ||
41 | Now you can install additional plugin in the build. Just follow the [Adding a plugin to an editor tutorial](https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/installing-plugins.html#adding-a-plugin-to-an-editor) | 41 | Now you can install additional plugin in the build. Just follow the [Adding a plugin to an editor tutorial](https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/installing-plugins.html#adding-a-plugin-to-an-editor) |
42 | 42 | ||
43 | ### Rebuilding editor | 43 | ### Rebuilding editor |
44 | 44 | ||
45 | If you have already done the [Installation](#installation) and [Adding or removing plugins](#adding-or-removing-plugins) steps, you're ready to rebuild the editor by running the following command: | 45 | If you have already done the [Installation](#installation) and [Adding or removing plugins](#adding-or-removing-plugins) steps, you're ready to rebuild the editor by running the following command: |
46 | 46 | ||
47 | ``` | 47 | ``` |
48 | npm run build | 48 | npm run build |
49 | ``` | 49 | ``` |
50 | 50 | ||
51 | This will build the CKEditor 5 to the `build` directory. You can open your browser and you should be able to see the changes you've made in the code. If not, then try to refresh also the browser cache by typing `Ctrl + R` or `Cmd + R` depending on your system. | 51 | This will build the CKEditor 5 to the `build` directory. You can open your browser and you should be able to see the changes you've made in the code. If not, then try to refresh also the browser cache by typing `Ctrl + R` or `Cmd + R` depending on your system. |
52 | 52 | ||
53 | ## What's next? | 53 | ## What's next? |
54 | 54 | ||
55 | Follow the guides available on https://ckeditor.com/docs/ckeditor5/latest/framework/index.html and enjoy the document editing. | 55 | Follow the guides available on https://ckeditor.com/docs/ckeditor5/latest/framework/index.html and enjoy the document editing. |
56 | 56 | ||
57 | ## FAQ | 57 | ## FAQ |
58 | | Where is the place to report bugs and feature requests? | 58 | | Where is the place to report bugs and feature requests? |
59 | 59 | ||
60 | You can create an issue on https://github.com/ckeditor/ckeditor5/issues including the build id - `aovpauzd25hi-dqoovaepm42n`. Make sure that the question / problem is unique, please look for a possibly asked questions in the search box. Duplicates will be closed. | 60 | You can create an issue on https://github.com/ckeditor/ckeditor5/issues including the build id - `aovpauzd25hi-dqoovaepm42n`. Make sure that the question / problem is unique, please look for a possibly asked questions in the search box. Duplicates will be closed. |
61 | 61 | ||
62 | | Where can I learn more about the CKEditor 5 framework? | 62 | | Where can I learn more about the CKEditor 5 framework? |
63 | 63 | ||
64 | Here: https://ckeditor.com/docs/ckeditor5/latest/framework/ | 64 | Here: https://ckeditor.com/docs/ckeditor5/latest/framework/ |
65 | 65 | ||
66 | | Is it possible to use online builder with common frameworks like React, Vue or Angular? | 66 | | Is it possible to use online builder with common frameworks like React, Vue or Angular? |
67 | 67 | ||
68 | Not yet, but it these integrations will be available at some point in the future. | 68 | Not yet, but it these integrations will be available at some point in the future. |
diff --git a/lib/ckeditor5/build/ckeditor.js b/lib/ckeditor5/build/ckeditor.js index 6de3d4e..3b01c40 100644 --- a/lib/ckeditor5/build/ckeditor.js +++ b/lib/ckeditor5/build/ckeditor.js | |||
@@ -1,6 +1,6 @@ | |||
1 | /*! | 1 | /*! |
2 | * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved. | 2 | * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved. |
3 | * For licensing, see LICENSE.md. | 3 | * For licensing, see LICENSE.md. |
4 | */ | 4 | */ |
5 | (function(t){const e=t["fr"]=t["fr"]||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 sur %1","Align center":"Centrer","Align left":"Aligner à gauche","Align right":"Aligner à droite","Align table to the left":"Aligner le tableau à gauche","Align table to the right":"Aligner le tableau à droite",Alignment:"Alignement",Aquamarine:"Bleu vert",Background:"Fond",Big:"Grand",Black:"Noir","Block quote":"Citation",Blue:"Bleu","Blue marker":"Marqueur bleu",Bold:"Gras",Border:"Bordure","Bulleted List":"Liste à puces",Cancel:"Annuler","Center table":"Centrer le tableau ","Centered image":"Image centrée","Change image text alternative":"Changer le texte alternatif à l’image","Choose heading":"Choisir l'en-tête",Color:"Couleur","Color picker":"Pipette à couleurs",Column:"Colonne",Dashed:"Tirets",Default:"Par défaut","Delete column":"Supprimer la colonne","Delete row":"Supprimer la ligne","Dim grey":"Gris pâle",Dimensions:"Dimensions","Document colors":"Couleurs du document",Dotted:"Pointillés",Double:"Double",Downloadable:"Fichier téléchargeable","Dropdown toolbar":"Barre d'outils dans un menu déroulant","Edit block":"Modifier le bloc","Edit link":"Modifier le lien","Edit source":"Modifier la source","Editor toolbar":"Barre d'outils de l'éditeur","Empty snippet content":"Aucun contenu pour ce fragment de code","Enter image caption":"Saisir la légende de l’image","Font Color":"Couleur de police","Font Family":"Police","Font Size":"Taille de police","Full size image":"Image taille réelle",Green:"Vert","Green marker":"Marqueur vert","Green pen":"Crayon vert",Grey:"Gris",Groove:"Rainuré","Header column":"Colonne d'entête","Header row":"Ligne d'entête",Heading:"En-tête","Heading 1":"Titre 1","Heading 2":"Titre 2","Heading 3":"Titre 3","Heading 4":"Titre 4","Heading 5":"Titre 5","Heading 6":"Titre 6",Height:"Hauteur",Highlight:"Surlignage","Horizontal line":"Ligne horizontale","HTML snippet":"Code HTML",Huge:"Enorme","Image toolbar":"Barre d'outils des images","image widget":"Objet image",Insert:"Insérer","Insert column left":"Insérer une colonne à gauche","Insert column right":"Insérer une colonne à droite","Insert HTML":"Insérer du code HTML","Insert image":"Insérer une image","Insert image via URL":"Insérer une image à partir d'une URL","Insert paragraph after block":"Insérer du texte après ce bloc","Insert paragraph before block":"Insérer du texte avant ce bloc","Insert row above":"Insérer une ligne au-dessus","Insert row below":"Insérer une ligne en-dessous","Insert table":"Insérer un tableau",Inset:"Relief intérieur",Italic:"Italique",Justify:"Justifier","Left aligned image":"Image alignée à gauche","Light blue":"Bleu clair","Light green":"Vert clair","Light grey":"Gris clair",Link:"Lien","Link image":"Lien d'image","Link URL":"URL du lien","Merge cell down":"Fusionner la cellule en-dessous","Merge cell left":"Fusionner la cellule à gauche","Merge cell right":"Fusionner la cellule à droite","Merge cell up":"Fusionner la cellule au-dessus","Merge cells":"Fusionner les cellules",Next:"Suivant","No preview available":"Aucun aperçu disponible",None:"Aucun","Numbered List":"Liste numérotée","Open in a new tab":"Ouvrir dans un nouvel onglet","Open link in new tab":"Ouvrir le lien dans un nouvel onglet",Orange:"Orange",Outset:"Relief extérieur",Paragraph:"Paragraphe","Paste raw HTML here...":"Collez le code HTML brut ici...","Pink marker":"Marqueur rose",Previous:"Précedent",Purple:"Violet",Red:"Rouge","Red pen":"Crayon rouge",Redo:"Restaurer","Remove color":"Enlever la couleur","Remove highlight":"Enlever le surlignage","Rich Text Editor":"Éditeur de texte enrichi","Rich Text Editor, %0":"Éditeur de texte enrichi, %0",Ridge:"Relief","Right aligned image":"Image alignée à droite",Row:"Ligne",Save:"Enregistrer","Save changes":"Enregistrer les changements","Saving changes":"Enregistrement des modifications","Select all":"Sélectionner tout","Select column":"Sélectionner la colonne","Select row":"Sélectionner la ligne","Show more items":"Montrer plus d'éléments","Side image":"Image latérale",Small:"Petit",Solid:"Continu","Split cell horizontally":"Scinder la cellule horizontalement","Split cell vertically":"Scinder la cellule verticalement",Style:"Style","Table alignment toolbar":"Barre d'outils pour modifier l'alignement du tableau","Table properties":"Propriétés du tableau","Table toolbar":"Barre d'outils des tableaux","Text alignment":"Alignement du texte","Text alignment toolbar":"Barre d'outils d'alignement du texte","Text alternative":"Texte alternatif","Text highlight toolbar":"Barre d'outils du surlignage",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'La couleur est invalide. Essayez "#FF0000" ou "rgb(255,0,0)" ou "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'La valeur est invalide. Essayez "10px" ou "2em" ou simplement "2".',"This link has no URL":"Ce lien n'a pas d'URL",Tiny:"Minuscule","To-do List":"Liste de tâches",Turquoise:"Turquoise",Underline:"Souligné",Undo:"Annuler",Unlink:"Supprimer le lien",Update:"Modifier","Update image URL":"Modifier l'URL de l'image","Upload failed":"Échec de l'envoi","Upload in progress":"Téléchargement en cours",White:"Blanc","Widget toolbar":"Barre d'outils du widget",Width:"Largeur",Yellow:"Jaune","Yellow marker":"Marqueur jaune"});e.getPluralForm=function(t){return t>1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));(function t(e,n){if(typeof exports==="object"&&typeof module==="object")module.exports=n();else if(typeof define==="function"&&define.amd)define([],n);else if(typeof exports==="object")exports["ClassicEditor"]=n();else e["ClassicEditor"]=n()})(window,(function(){return function(t){var e={};function n(o){if(e[o]){return e[o].exports}var i=e[o]={i:o,l:false,exports:{}};t[o].call(i.exports,i,i.exports,n);i.l=true;return i.exports}n.m=t;n.c=e;n.d=function(t,e,o){if(!n.o(t,e)){Object.defineProperty(t,e,{enumerable:true,get:o})}};n.r=function(t){if(typeof Symbol!=="undefined"&&Symbol.toStringTag){Object.defineProperty(t,Symbol.toStringTag,{value:"Module"})}Object.defineProperty(t,"__esModule",{value:true})};n.t=function(t,e){if(e&1)t=n(t);if(e&8)return t;if(e&4&&typeof t==="object"&&t&&t.__esModule)return t;var o=Object.create(null);n.r(o);Object.defineProperty(o,"default",{enumerable:true,value:t});if(e&2&&typeof t!="string")for(var i in t)n.d(o,i,function(e){return t[e]}.bind(null,i));return o};n.n=function(t){var e=t&&t.__esModule?function e(){return t["default"]}:function e(){return t};n.d(e,"a",e);return e};n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)};n.p="";return n(n.s=74)}([function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));n.d(e,"b",(function(){return r}));const o="https://ckeditor.com/docs/ckeditor5/latest/framework/guides/support/error-codes.html";class i extends Error{constructor(t,e,n){const o=`${t}${n?` ${JSON.stringify(n)}`:""}${a(t)}`;super(o);this.name="CKEditorError";this.context=e;this.data=n}is(t){return t==="CKEditorError"}static rethrowUnexpectedError(t,e){if(t.is&&t.is("CKEditorError")){throw t}const n=new i(t.message,e);n.stack=t.stack;throw n}}function r(t,e){console.warn(...c(t,e))}function s(t,e){console.error(...c(t,e))}function a(t){return`\nRead more: ${o}#error-${t}`}function c(t,e){const n=a(t);return e?[t,e,n]:[t,n]}},function(t,e,n){"use strict";var o=function t(){var e;return function t(){if(typeof e==="undefined"){e=Boolean(window&&document&&document.all&&!window.atob)}return e}}();var i=function t(){var e={};return function t(n){if(typeof e[n]==="undefined"){var o=document.querySelector(n);if(window.HTMLIFrameElement&&o instanceof window.HTMLIFrameElement){try{o=o.contentDocument.head}catch(t){o=null}}e[n]=o}return e[n]}}();var r=[];function s(t){var e=-1;for(var n=0;n<r.length;n++){if(r[n].identifier===t){e=n;break}}return e}function a(t,e){var n={};var o=[];for(var i=0;i<t.length;i++){var a=t[i];var c=e.base?a[0]+e.base:a[0];var l=n[c]||0;var d="".concat(c," ").concat(l);n[c]=l+1;var u=s(d);var h={css:a[1],media:a[2],sourceMap:a[3]};if(u!==-1){r[u].references++;r[u].updater(h)}else{r.push({identifier:d,updater:g(h,e),references:1})}o.push(d)}return o}function c(t){var e=document.createElement("style");var o=t.attributes||{};if(typeof o.nonce==="undefined"){var r=true?n.nc:undefined;if(r){o.nonce=r}}Object.keys(o).forEach((function(t){e.setAttribute(t,o[t])}));if(typeof t.insert==="function"){t.insert(e)}else{var s=i(t.insert||"head");if(!s){throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.")}s.appendChild(e)}return e}function l(t){if(t.parentNode===null){return false}t.parentNode.removeChild(t)}var d=function t(){var e=[];return function t(n,o){e[n]=o;return e.filter(Boolean).join("\n")}}();function u(t,e,n,o){var i=n?"":o.media?"@media ".concat(o.media," {").concat(o.css,"}"):o.css;if(t.styleSheet){t.styleSheet.cssText=d(e,i)}else{var r=document.createTextNode(i);var s=t.childNodes;if(s[e]){t.removeChild(s[e])}if(s.length){t.insertBefore(r,s[e])}else{t.appendChild(r)}}}function h(t,e,n){var o=n.css;var i=n.media;var r=n.sourceMap;if(i){t.setAttribute("media",i)}else{t.removeAttribute("media")}if(r&&typeof btoa!=="undefined"){o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")}if(t.styleSheet){t.styleSheet.cssText=o}else{while(t.firstChild){t.removeChild(t.firstChild)}t.appendChild(document.createTextNode(o))}}var f=null;var m=0;function g(t,e){var n;var o;var i;if(e.singleton){var r=m++;n=f||(f=c(e));o=u.bind(null,n,r,false);i=u.bind(null,n,r,true)}else{n=c(e);o=h.bind(null,n,e);i=function t(){l(n)}}o(t);return function e(n){if(n){if(n.css===t.css&&n.media===t.media&&n.sourceMap===t.sourceMap){return}o(t=n)}else{i()}}}t.exports=function(t,e){e=e||{};if(!e.singleton&&typeof e.singleton!=="boolean"){e.singleton=o()}t=t||[];var n=a(t,e);return function t(o){o=o||[];if(Object.prototype.toString.call(o)!=="[object Array]"){return}for(var i=0;i<n.length;i++){var c=n[i];var l=s(c);r[l].references--}var d=a(o,e);for(var u=0;u<n.length;u++){var h=n[u];var f=s(h);if(r[f].references===0){r[f].updater();r.splice(f,1)}}n=d}}},function(t,e,n){"use strict";function o(t,e){return c(t)||a(t,e)||r(t,e)||i()}function i(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function r(t,e){if(!t)return;if(typeof t==="string")return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);if(n==="Object"&&t.constructor)n=t.constructor.name;if(n==="Map"||n==="Set")return Array.from(t);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return s(t,e)}function s(t,e){if(e==null||e>t.length)e=t.length;for(var n=0,o=new Array(e);n<e;n++){o[n]=t[n]}return o}function a(t,e){if(typeof Symbol==="undefined"||!(Symbol.iterator in Object(t)))return;var n=[];var o=true;var i=false;var r=undefined;try{for(var s=t[Symbol.iterator](),a;!(o=(a=s.next()).done);o=true){n.push(a.value);if(e&&n.length===e)break}}catch(t){i=true;r=t}finally{try{if(!o&&s["return"]!=null)s["return"]()}finally{if(i)throw r}}return n}function c(t){if(Array.isArray(t))return t}t.exports=function t(e){var n=o(e,4),i=n[1],r=n[3];if(typeof btoa==="function"){var s=btoa(unescape(encodeURIComponent(JSON.stringify(r))));var a="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(s);var c="/*# ".concat(a," */");var l=r.sources.map((function(t){return"/*# sourceURL=".concat(r.sourceRoot||"").concat(t," */")}));return[i].concat(l).concat([c]).join("\n")}return[i].join("\n")}},function(t,e,n){"use strict";t.exports=function(t){var e=[];e.toString=function e(){return this.map((function(e){var n=t(e);if(e[2]){return"@media ".concat(e[2]," {").concat(n,"}")}return n})).join("")};e.i=function(t,n,o){if(typeof t==="string"){t=[[null,t,""]]}var i={};if(o){for(var r=0;r<this.length;r++){var s=this[r][0];if(s!=null){i[s]=true}}}for(var a=0;a<t.length;a++){var c=[].concat(t[a]);if(o&&i[c[0]]){continue}if(n){if(!c[2]){c[2]=n}else{c[2]="".concat(n," and ").concat(c[2])}}e.push(c)}};return e}},,function(t,e,n){"use strict";var o=n(9);var i=typeof self=="object"&&self&&self.Object===Object&&self;var r=o["a"]||i||Function("return this")();e["a"]=r},function(t,e,n){"use strict";(function(t){var o=n(5);var i=n(73);var r=typeof exports=="object"&&exports&&!exports.nodeType&&exports;var s=r&&typeof t=="object"&&t&&!t.nodeType&&t;var a=s&&s.exports===r;var c=a?o["a"].Buffer:undefined;var l=c?c.isBuffer:undefined;var d=l||i["a"];e["a"]=d}).call(this,n(11)(t))},function(t,e,n){"use strict";(function(t){var o=n(9);var i=typeof exports=="object"&&exports&&!exports.nodeType&&exports;var r=i&&typeof t=="object"&&t&&!t.nodeType&&t;var s=r&&r.exports===i;var a=s&&o["a"].process;var c=function(){try{var t=r&&r.require&&r.require("util").types;if(t){return t}return a&&a.binding&&a.binding("util")}catch(t){}}();e["a"]=c}).call(this,n(11)(t))},function(t,e,n){"use strict";(function(t){var e=n(0);const o="27.0.0";var i=o;const r=typeof window==="object"?window:t;if(r.CKEDITOR_VERSION){throw new e["a"]("ckeditor-duplicated-modules",null)}else{r.CKEDITOR_VERSION=o}}).call(this,n(72))},function(t,e,n){"use strict";(function(t){var n=typeof t=="object"&&t&&t.Object===Object&&t;e["a"]=n}).call(this,n(72))},function(t,e,n){"use strict";(function(t){var o=n(5);var i=typeof exports=="object"&&exports&&!exports.nodeType&&exports;var r=i&&typeof t=="object"&&t&&!t.nodeType&&t;var s=r&&r.exports===i;var a=s?o["a"].Buffer:undefined,c=a?a.allocUnsafe:undefined;function l(t,e){if(e){return t.slice()}var n=t.length,o=c?c(n):new t.constructor(n);t.copy(o);return o}e["a"]=l}).call(this,n(11)(t))},function(t,e){t.exports=function(t){if(!t.webpackPolyfill){var e=Object.create(t);if(!e.children)e.children=[];Object.defineProperty(e,"loaded",{enumerable:true,get:function(){return e.l}});Object.defineProperty(e,"id",{enumerable:true,get:function(){return e.i}});Object.defineProperty(e,"exports",{enumerable:true});e.webpackPolyfill=1}return e}},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck-hidden{display:none!important}.ck.ck-reset,.ck.ck-reset_all,.ck.ck-reset_all *{box-sizing:border-box;width:auto;height:auto;position:static}:root{--ck-z-default:1;--ck-z-modal:calc(var(--ck-z-default) + 999)}.ck-transitions-disabled,.ck-transitions-disabled *{transition:none!important}:root{--ck-color-base-foreground:#fafafa;--ck-color-base-background:#fff;--ck-color-base-border:#c4c4c4;--ck-color-base-action:#61b045;--ck-color-base-focus:#6cb5f9;--ck-color-base-text:#333;--ck-color-base-active:#198cf0;--ck-color-base-active-focus:#0e7fe1;--ck-color-base-error:#db3700;--ck-color-focus-border-coordinates:208,79%,51%;--ck-color-focus-border:hsl(var(--ck-color-focus-border-coordinates));--ck-color-focus-outer-shadow:#bcdefb;--ck-color-focus-disabled-shadow:rgba(119,186,248,0.3);--ck-color-focus-error-shadow:rgba(255,64,31,0.3);--ck-color-text:var(--ck-color-base-text);--ck-color-shadow-drop:rgba(0,0,0,0.15);--ck-color-shadow-drop-active:rgba(0,0,0,0.2);--ck-color-shadow-inner:rgba(0,0,0,0.1);--ck-color-button-default-background:transparent;--ck-color-button-default-hover-background:#e6e6e6;--ck-color-button-default-active-background:#d9d9d9;--ck-color-button-default-active-shadow:#bfbfbf;--ck-color-button-default-disabled-background:transparent;--ck-color-button-on-background:#dedede;--ck-color-button-on-hover-background:#c4c4c4;--ck-color-button-on-active-background:#bababa;--ck-color-button-on-active-shadow:#a1a1a1;--ck-color-button-on-disabled-background:#dedede;--ck-color-button-action-background:var(--ck-color-base-action);--ck-color-button-action-hover-background:#579e3d;--ck-color-button-action-active-background:#53973b;--ck-color-button-action-active-shadow:#498433;--ck-color-button-action-disabled-background:#7ec365;--ck-color-button-action-text:var(--ck-color-base-background);--ck-color-button-save:#008a00;--ck-color-button-cancel:#db3700;--ck-color-switch-button-off-background:#b0b0b0;--ck-color-switch-button-off-hover-background:#a3a3a3;--ck-color-switch-button-on-background:var(--ck-color-button-action-background);--ck-color-switch-button-on-hover-background:#579e3d;--ck-color-switch-button-inner-background:var(--ck-color-base-background);--ck-color-switch-button-inner-shadow:rgba(0,0,0,0.1);--ck-color-dropdown-panel-background:var(--ck-color-base-background);--ck-color-dropdown-panel-border:var(--ck-color-base-border);--ck-color-input-background:var(--ck-color-base-background);--ck-color-input-border:#c7c7c7;--ck-color-input-error-border:var(--ck-color-base-error);--ck-color-input-text:var(--ck-color-base-text);--ck-color-input-disabled-background:#f2f2f2;--ck-color-input-disabled-border:#c7c7c7;--ck-color-input-disabled-text:#757575;--ck-color-list-background:var(--ck-color-base-background);--ck-color-list-button-hover-background:var(--ck-color-button-default-hover-background);--ck-color-list-button-on-background:var(--ck-color-base-active);--ck-color-list-button-on-background-focus:var(--ck-color-base-active-focus);--ck-color-list-button-on-text:var(--ck-color-base-background);--ck-color-panel-background:var(--ck-color-base-background);--ck-color-panel-border:var(--ck-color-base-border);--ck-color-toolbar-background:var(--ck-color-base-foreground);--ck-color-toolbar-border:var(--ck-color-base-border);--ck-color-tooltip-background:var(--ck-color-base-text);--ck-color-tooltip-text:var(--ck-color-base-background);--ck-color-engine-placeholder-text:#707070;--ck-color-upload-bar-background:#6cb5f9;--ck-color-link-default:#0000f0;--ck-color-link-selected-background:rgba(31,177,255,0.1);--ck-color-link-fake-selection:rgba(31,177,255,0.3);--ck-disabled-opacity:.5;--ck-focus-outer-shadow-geometry:0 0 0 3px;--ck-focus-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-outer-shadow);--ck-focus-disabled-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-disabled-shadow);--ck-focus-error-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-error-shadow);--ck-focus-ring:1px solid var(--ck-color-focus-border);--ck-font-size-base:13px;--ck-line-height-base:1.84615;--ck-font-face:Helvetica,Arial,Tahoma,Verdana,Sans-Serif;--ck-font-size-tiny:0.7em;--ck-font-size-small:0.75em;--ck-font-size-normal:1em;--ck-font-size-big:1.4em;--ck-font-size-large:1.8em;--ck-ui-component-min-height:2.3em}.ck.ck-reset,.ck.ck-reset_all,.ck.ck-reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;vertical-align:middle;transition:none;word-wrap:break-word}.ck.ck-reset_all,.ck.ck-reset_all *{border-collapse:collapse;font:normal normal normal var(--ck-font-size-base)/var(--ck-line-height-base) var(--ck-font-face);color:var(--ck-color-text);text-align:left;white-space:nowrap;cursor:auto;float:none}.ck.ck-reset_all .ck-rtl *{text-align:right}.ck.ck-reset_all iframe{vertical-align:inherit}.ck.ck-reset_all textarea{white-space:pre-wrap}.ck.ck-reset_all input[type=password],.ck.ck-reset_all input[type=text],.ck.ck-reset_all textarea{cursor:text}.ck.ck-reset_all input[type=password][disabled],.ck.ck-reset_all input[type=text][disabled],.ck.ck-reset_all textarea[disabled]{cursor:default}.ck.ck-reset_all fieldset{padding:10px;border:2px groove #dfdee3}.ck.ck-reset_all button::-moz-focus-inner{padding:0;border:0}.ck[dir=rtl],.ck[dir=rtl] .ck{text-align:right}:root{--ck-border-radius:2px;--ck-inner-shadow:2px 2px 3px var(--ck-color-shadow-inner) inset;--ck-drop-shadow:0 1px 2px 1px var(--ck-color-shadow-drop);--ck-drop-shadow-active:0 3px 6px 1px var(--ck-color-shadow-drop-active);--ck-spacing-unit:0.6em;--ck-spacing-large:calc(var(--ck-spacing-unit)*1.5);--ck-spacing-standard:var(--ck-spacing-unit);--ck-spacing-medium:calc(var(--ck-spacing-unit)*0.8);--ck-spacing-small:calc(var(--ck-spacing-unit)*0.5);--ck-spacing-tiny:calc(var(--ck-spacing-unit)*0.3);--ck-spacing-extra-tiny:calc(var(--ck-spacing-unit)*0.16)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/globals/_hidden.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/globals/_reset.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/globals/_zindex.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/globals/_transition.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_colors.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_disabled.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_focus.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_fonts.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_reset.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_shadow.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_spacing.css"],names:[],mappings:"AAQA,WAGC,sBACD,CCPA,iDAGC,qBAAsB,CACtB,UAAW,CACX,WAAY,CACZ,eACD,CCPA,MACC,gBAAiB,CACjB,4CACD,CCAA,oDAEC,yBACD,CCNA,MACC,kCAAmD,CACnD,+BAAoD,CACpD,8BAAgD,CAChD,8BAAmD,CACnD,6BAAmD,CACnD,yBAA+C,CAC/C,8BAAmD,CACnD,oCAAuD,CACvD,6BAAkD,CAIlD,+CAAwD,CACxD,qEAA+E,CAC/E,qCAAwD,CACxD,sDAA8D,CAC9D,iDAAyD,CACzD,yCAAqD,CACrD,uCAAsD,CACtD,6CAA0D,CAC1D,uCAAsD,CAItD,gDAAuD,CACvD,kDAA+D,CAC/D,mDAAgE,CAChE,+CAA6D,CAC7D,yDAA8D,CAE9D,uCAAuD,CACvD,6CAA4D,CAC5D,8CAA4D,CAC5D,0CAAyD,CACzD,gDAA8D,CAE9D,+DAAsE,CACtE,iDAAkE,CAClE,kDAAkE,CAClE,8CAA+D,CAC/D,oDAAoE,CACpE,6DAAsE,CAEtE,8BAAoD,CACpD,gCAAqD,CAErD,+CAA4D,CAC5D,qDAAiE,CACjE,+EAAqF,CACrF,oDAAmE,CACnE,yEAA8E,CAC9E,qDAAgE,CAIhE,oEAA2E,CAC3E,4DAAoE,CAIpE,2DAAoE,CACpE,+BAAiD,CACjD,wDAAgE,CAChE,+CAA0D,CAC1D,4CAA2D,CAC3D,wCAAwD,CACxD,sCAAsD,CAItD,0DAAmE,CACnE,uFAA6F,CAC7F,gEAAuE,CACvE,4EAAiF,CACjF,8DAAsE,CAItE,2DAAoE,CACpE,mDAA6D,CAI7D,6DAAsE,CACtE,qDAA+D,CAI/D,uDAAgE,CAChE,uDAAiE,CAIjE,0CAAyD,CAIzD,wCAA2D,CAI3D,+BAAoD,CACpD,wDAAmE,CACnE,mDAAgE,CCpGhE,wBAAyB,CCAzB,0CAA2C,CAK3C,gGAAiG,CAKjG,4GAA6G,CAK7G,sGAAuG,CAKvG,sDAAuD,CCvBvD,wBAAyB,CACzB,6BAA8B,CAC9B,wDAA6D,CAE7D,yBAA0B,CAC1B,2BAA4B,CAC5B,yBAA0B,CAC1B,wBAAyB,CACzB,0BAA2B,CCJ3B,kCJoGD,CI9FA,iDAIC,QAAS,CACT,SAAU,CACV,QAAS,CACT,sBAAuB,CACvB,oBAAqB,CACrB,qBAAsB,CACtB,eAAgB,CAGhB,oBACD,CAKA,oCAGC,wBAAyB,CACzB,iGAAkG,CAClG,0BAA2B,CAC3B,eAAgB,CAChB,kBAAmB,CACnB,WAAY,CACZ,UACD,CAGC,2BACC,gBACD,CAEA,wBAEC,sBACD,CAEA,0BACC,oBACD,CAEA,kGAGC,WACD,CAEA,gIAGC,cACD,CAEA,0BACC,YAAa,CACb,yBACD,CAEA,0CAEC,SAAU,CACV,QACD,CAMD,8BAEC,gBACD,CCnFA,MACC,sBAAuB,CCAvB,gEAAiE,CAKjE,0DAA2D,CAK3D,wEAAyE,CCbzE,uBAA8B,CAC9B,mDAA2D,CAC3D,4CAAkD,CAClD,oDAA4D,CAC5D,mDAA2D,CAC3D,kDAA2D,CAC3D,yDFFD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which hides an element in DOM.\n */\n.ck-hidden {\n\t/* Override selector specificity. Otherwise, all elements with some display\n\tstyle defined will override this one, which is not a desired result. */\n\tdisplay: none !important;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-reset,\n.ck.ck-reset_all,\n.ck.ck-reset_all * {\n\tbox-sizing: border-box;\n\twidth: auto;\n\theight: auto;\n\tposition: static;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-z-default: 1;\n\t--ck-z-modal: calc( var(--ck-z-default) + 999 );\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class that disables all transitions of the element and its children.\n */\n.ck-transitions-disabled,\n.ck-transitions-disabled * {\n\ttransition: none !important;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-base-foreground: \t\t\t\t\t\t\t\thsl(0, 0%, 98%);\n\t--ck-color-base-background: \t\t\t\t\t\t\t\thsl(0, 0%, 100%);\n\t--ck-color-base-border: \t\t\t\t\t\t\t\t\thsl(0, 0%, 77%);\n\t--ck-color-base-action: \t\t\t\t\t\t\t\t\thsl(104, 44%, 48%);\n\t--ck-color-base-focus: \t\t\t\t\t\t\t\t\t\thsl(209, 92%, 70%);\n\t--ck-color-base-text: \t\t\t\t\t\t\t\t\t\thsl(0, 0%, 20%);\n\t--ck-color-base-active: \t\t\t\t\t\t\t\t\thsl(208, 88%, 52%);\n\t--ck-color-base-active-focus:\t\t\t\t\t\t\t\thsl(208, 88%, 47%);\n\t--ck-color-base-error:\t\t\t\t\t\t\t\t\t\thsl(15, 100%, 43%);\n\n\t/* -- Generic colors ------------------------------------------------------------------------ */\n\n\t--ck-color-focus-border-coordinates: \t\t\t\t\t\t208, 79%, 51%;\n\t--ck-color-focus-border: \t\t\t\t\t\t\t\t\thsl(var(--ck-color-focus-border-coordinates));\n\t--ck-color-focus-outer-shadow:\t\t\t\t\t\t\t\thsl(207, 89%, 86%);\n\t--ck-color-focus-disabled-shadow:\t\t\t\t\t\t\thsla(209, 90%, 72%,.3);\n\t--ck-color-focus-error-shadow:\t\t\t\t\t\t\t\thsla(9,100%,56%,.3);\n\t--ck-color-text: \t\t\t\t\t\t\t\t\t\t\tvar(--ck-color-base-text);\n\t--ck-color-shadow-drop: \t\t\t\t\t\t\t\t\thsla(0, 0%, 0%, 0.15);\n\t--ck-color-shadow-drop-active:\t\t\t\t\t\t\t\thsla(0, 0%, 0%, 0.2);\n\t--ck-color-shadow-inner: \t\t\t\t\t\t\t\t\thsla(0, 0%, 0%, 0.1);\n\n\t/* -- Buttons ------------------------------------------------------------------------------- */\n\n\t--ck-color-button-default-background: \t\t\t\t\t\ttransparent;\n\t--ck-color-button-default-hover-background: \t\t\t\thsl(0, 0%, 90%);\n\t--ck-color-button-default-active-background: \t\t\t\thsl(0, 0%, 85%);\n\t--ck-color-button-default-active-shadow: \t\t\t\t\thsl(0, 0%, 75%);\n\t--ck-color-button-default-disabled-background: \t\t\t\ttransparent;\n\n\t--ck-color-button-on-background: \t\t\t\t\t\t\thsl(0, 0%, 87%);\n\t--ck-color-button-on-hover-background: \t\t\t\t\t\thsl(0, 0%, 77%);\n\t--ck-color-button-on-active-background: \t\t\t\t\thsl(0, 0%, 73%);\n\t--ck-color-button-on-active-shadow: \t\t\t\t\t\thsl(0, 0%, 63%);\n\t--ck-color-button-on-disabled-background: \t\t\t\t\thsl(0, 0%, 87%);\n\n\t--ck-color-button-action-background: \t\t\t\t\t\tvar(--ck-color-base-action);\n\t--ck-color-button-action-hover-background: \t\t\t\t\thsl(104, 44%, 43%);\n\t--ck-color-button-action-active-background: \t\t\t\thsl(104, 44%, 41%);\n\t--ck-color-button-action-active-shadow: \t\t\t\t\thsl(104, 44%, 36%);\n\t--ck-color-button-action-disabled-background: \t\t\t\thsl(104, 44%, 58%);\n\t--ck-color-button-action-text: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\n\t--ck-color-button-save: \t\t\t\t\t\t\t\t\thsl(120, 100%, 27%);\n\t--ck-color-button-cancel: \t\t\t\t\t\t\t\t\thsl(15, 100%, 43%);\n\n\t--ck-color-switch-button-off-background:\t\t\t\t\thsl(0, 0%, 69%);\n\t--ck-color-switch-button-off-hover-background:\t\t\t\thsl(0, 0%, 64%);\n\t--ck-color-switch-button-on-background:\t\t\t\t\t\tvar(--ck-color-button-action-background);\n\t--ck-color-switch-button-on-hover-background:\t\t\t\thsl(104, 44%, 43%);\n\t--ck-color-switch-button-inner-background:\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-switch-button-inner-shadow:\t\t\t\t\t\thsla(0, 0%, 0%, 0.1);\n\n\t/* -- Dropdown ------------------------------------------------------------------------------ */\n\n\t--ck-color-dropdown-panel-background: \t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-dropdown-panel-border: \t\t\t\t\t\t\tvar(--ck-color-base-border);\n\n\t/* -- Input --------------------------------------------------------------------------------- */\n\n\t--ck-color-input-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-input-border: \t\t\t\t\t\t\t\t\thsl(0, 0%, 78%);\n\t--ck-color-input-error-border:\t\t\t\t\t\t\t\tvar(--ck-color-base-error);\n\t--ck-color-input-text: \t\t\t\t\t\t\t\t\t\tvar(--ck-color-base-text);\n\t--ck-color-input-disabled-background: \t\t\t\t\t\thsl(0, 0%, 95%);\n\t--ck-color-input-disabled-border: \t\t\t\t\t\t\thsl(0, 0%, 78%);\n\t--ck-color-input-disabled-text: \t\t\t\t\t\t\thsl(0, 0%, 46%);\n\n\t/* -- List ---------------------------------------------------------------------------------- */\n\n\t--ck-color-list-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-list-button-hover-background: \t\t\t\t\tvar(--ck-color-button-default-hover-background);\n\t--ck-color-list-button-on-background: \t\t\t\t\t\tvar(--ck-color-base-active);\n\t--ck-color-list-button-on-background-focus: \t\t\t\tvar(--ck-color-base-active-focus);\n\t--ck-color-list-button-on-text:\t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\n\t/* -- Panel --------------------------------------------------------------------------------- */\n\n\t--ck-color-panel-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-panel-border: \t\t\t\t\t\t\t\t\tvar(--ck-color-base-border);\n\n\t/* -- Toolbar ------------------------------------------------------------------------------- */\n\n\t--ck-color-toolbar-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-foreground);\n\t--ck-color-toolbar-border: \t\t\t\t\t\t\t\t\tvar(--ck-color-base-border);\n\n\t/* -- Tooltip ------------------------------------------------------------------------------- */\n\n\t--ck-color-tooltip-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-text);\n\t--ck-color-tooltip-text: \t\t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\n\t/* -- Engine -------------------------------------------------------------------------------- */\n\n\t--ck-color-engine-placeholder-text: \t\t\t\t\t\thsl(0, 0%, 44%);\n\n\t/* -- Upload -------------------------------------------------------------------------------- */\n\n\t--ck-color-upload-bar-background:\t\t \t\t\t\t\thsl(209, 92%, 70%);\n\n\t/* -- Link -------------------------------------------------------------------------------- */\n\n\t--ck-color-link-default:\t\t\t\t\t\t\t\t\thsl(240, 100%, 47%);\n\t--ck-color-link-selected-background:\t\t\t\t\t\thsla(201, 100%, 56%, 0.1);\n\t--ck-color-link-fake-selection:\t\t\t\t\t\t\t\thsla(201, 100%, 56%, 0.3);\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/**\n\t * An opacity value of disabled UI item.\n\t */\n\t--ck-disabled-opacity: .5;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/**\n\t * The geometry of the of focused element's outer shadow.\n\t */\n\t--ck-focus-outer-shadow-geometry: 0 0 0 3px;\n\n\t/**\n\t * A visual style of focused element's outer shadow.\n\t */\n\t--ck-focus-outer-shadow: var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-outer-shadow);\n\n\t/**\n\t * A visual style of focused element's outer shadow (when disabled).\n\t */\n\t--ck-focus-disabled-outer-shadow: var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-disabled-shadow);\n\n\t/**\n\t * A visual style of focused element's outer shadow (when has errors).\n\t */\n\t--ck-focus-error-outer-shadow: var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-error-shadow);\n\n\t/**\n\t * A visual style of focused element's border or outline.\n\t */\n\t--ck-focus-ring: 1px solid var(--ck-color-focus-border);\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-font-size-base: 13px;\n\t--ck-line-height-base: 1.84615;\n\t--ck-font-face: Helvetica, Arial, Tahoma, Verdana, Sans-Serif;\n\n\t--ck-font-size-tiny: 0.7em;\n\t--ck-font-size-small: 0.75em;\n\t--ck-font-size-normal: 1em;\n\t--ck-font-size-big: 1.4em;\n\t--ck-font-size-large: 1.8em;\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/* This is super-important. This is **manually** adjusted so a button without an icon\n\tis never smaller than a button with icon, additionally making sure that text-less buttons\n\tare perfect squares. The value is also shared by other components which should stay "in-line"\n\twith buttons. */\n\t--ck-ui-component-min-height: 2.3em;\n}\n\n/**\n * Resets an element, ignoring its children.\n */\n.ck.ck-reset,\n.ck.ck-reset_all,\n.ck.ck-reset_all * {\n\t/* Do not include inheritable rules here. */\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: transparent;\n\ttext-decoration: none;\n\tvertical-align: middle;\n\ttransition: none;\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/105 */\n\tword-wrap: break-word;\n}\n\n/**\n * Resets an element AND its children.\n */\n.ck.ck-reset_all,\n.ck.ck-reset_all * {\n\t/* These are rule inherited by all children elements. */\n\tborder-collapse: collapse;\n\tfont: normal normal normal var(--ck-font-size-base)/var(--ck-line-height-base) var(--ck-font-face);\n\tcolor: var(--ck-color-text);\n\ttext-align: left;\n\twhite-space: nowrap;\n\tcursor: auto;\n\tfloat: none;\n}\n\n.ck.ck-reset_all {\n\t& .ck-rtl * {\n\t\ttext-align: right;\n\t}\n\n\t& iframe {\n\t\t/* For IE */\n\t\tvertical-align: inherit;\n\t}\n\n\t& textarea {\n\t\twhite-space: pre-wrap;\n\t}\n\n\t& textarea,\n\t& input[type="text"],\n\t& input[type="password"] {\n\t\tcursor: text;\n\t}\n\n\t& textarea[disabled],\n\t& input[type="text"][disabled],\n\t& input[type="password"][disabled] {\n\t\tcursor: default;\n\t}\n\n\t& fieldset {\n\t\tpadding: 10px;\n\t\tborder: 2px groove hsl(255, 7%, 88%);\n\t}\n\n\t& button::-moz-focus-inner {\n\t\t/* See http://stackoverflow.com/questions/5517744/remove-extra-button-spacing-padding-in-firefox */\n\t\tpadding: 0;\n\t\tborder: 0\n\t}\n}\n\n/**\n * Default UI rules for RTL languages.\n */\n.ck[dir="rtl"],\n.ck[dir="rtl"] .ck {\n\ttext-align: right;\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Default border-radius value.\n */\n:root{\n\t--ck-border-radius: 2px;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/**\n\t * A visual style of element's inner shadow (i.e. input).\n\t */\n\t--ck-inner-shadow: 2px 2px 3px var(--ck-color-shadow-inner) inset;\n\n\t/**\n\t * A visual style of element's drop shadow (i.e. panel).\n\t */\n\t--ck-drop-shadow: 0 1px 2px 1px var(--ck-color-shadow-drop);\n\n\t/**\n\t * A visual style of element's active shadow (i.e. comment or suggestion).\n\t */\n\t--ck-drop-shadow-active: 0 3px 6px 1px var(--ck-color-shadow-drop-active);\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-spacing-unit: \t\t\t\t\t\t0.6em;\n\t--ck-spacing-large: \t\t\t\t\tcalc(var(--ck-spacing-unit) * 1.5);\n\t--ck-spacing-standard: \t\t\t\t\tvar(--ck-spacing-unit);\n\t--ck-spacing-medium: \t\t\t\t\tcalc(var(--ck-spacing-unit) * 0.8);\n\t--ck-spacing-small: \t\t\t\t\tcalc(var(--ck-spacing-unit) * 0.5);\n\t--ck-spacing-tiny: \t\t\t\t\t\tcalc(var(--ck-spacing-unit) * 0.3);\n\t--ck-spacing-extra-tiny: \t\t\t\tcalc(var(--ck-spacing-unit) * 0.16);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-icon{vertical-align:middle}:root{--ck-icon-size:calc(var(--ck-line-height-base)*var(--ck-font-size-normal))}.ck.ck-icon{width:var(--ck-icon-size);height:var(--ck-icon-size);font-size:.8333350694em;will-change:transform}.ck.ck-icon,.ck.ck-icon *{color:inherit;cursor:inherit}.ck.ck-icon :not([fill]){fill:currentColor}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/icon/icon.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/icon/icon.css"],names:[],mappings:"AAKA,YACC,qBACD,CCFA,MACC,0EACD,CAEA,YACC,yBAA0B,CAC1B,0BAA2B,CAG3B,uBAAwB,CAQxB,qBAcD,CAZC,0BARA,aAAc,CAGd,cAgBA,CAJC,yBAEC,iBACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-icon {\n\tvertical-align: middle;\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-icon-size: calc(var(--ck-line-height-base) * var(--ck-font-size-normal));\n}\n\n.ck.ck-icon {\n\twidth: var(--ck-icon-size);\n\theight: var(--ck-icon-size);\n\n\t/* Multiplied by the height of the line in "px" should give SVG "viewport" dimensions */\n\tfont-size: .8333350694em;\n\n\tcolor: inherit;\n\n\t/* Inherit cursor style (#5). */\n\tcursor: inherit;\n\n\t/* This will prevent blurry icons on Firefox. See #340. */\n\twill-change: transform;\n\n\t& * {\n\t\t/* Inherit cursor style (#5). */\n\t\tcursor: inherit;\n\n\t\t/* Allows dynamic coloring of the icons. */\n\t\tcolor: inherit;\n\n\t\t&:not([fill]) {\n\t\t\t/* Needed by FF. */\n\t\t\tfill: currentColor;\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,'.ck.ck-tooltip,.ck.ck-tooltip .ck-tooltip__text:after{position:absolute;pointer-events:none;-webkit-backface-visibility:hidden}.ck.ck-tooltip{visibility:hidden;opacity:0;display:none;z-index:var(--ck-z-modal)}.ck.ck-tooltip .ck-tooltip__text{display:inline-block}.ck.ck-tooltip .ck-tooltip__text:after{content:"";width:0;height:0}:root{--ck-tooltip-arrow-size:5px}.ck.ck-tooltip{left:50%;top:0;transition:opacity .2s ease-in-out .2s}.ck.ck-tooltip .ck-tooltip__text{border-radius:0}.ck-rounded-corners .ck.ck-tooltip .ck-tooltip__text,.ck.ck-tooltip .ck-tooltip__text.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-tooltip .ck-tooltip__text{font-size:.9em;line-height:1.5;color:var(--ck-color-tooltip-text);padding:var(--ck-spacing-small) var(--ck-spacing-medium);background:var(--ck-color-tooltip-background);position:relative;left:-50%}.ck.ck-tooltip .ck-tooltip__text:after{transition:opacity .2s ease-in-out .2s;border-style:solid;left:50%}.ck.ck-tooltip.ck-tooltip_s,.ck.ck-tooltip.ck-tooltip_se,.ck.ck-tooltip.ck-tooltip_sw{bottom:calc(var(--ck-tooltip-arrow-size)*-1);transform:translateY(100%)}.ck.ck-tooltip.ck-tooltip_s .ck-tooltip__text:after,.ck.ck-tooltip.ck-tooltip_se .ck-tooltip__text:after,.ck.ck-tooltip.ck-tooltip_sw .ck-tooltip__text:after{top:calc(var(--ck-tooltip-arrow-size)*-1 + 1px);transform:translateX(-50%);border-left-color:transparent;border-bottom-color:var(--ck-color-tooltip-background);border-right-color:transparent;border-top-color:transparent;border-left-width:var(--ck-tooltip-arrow-size);border-bottom-width:var(--ck-tooltip-arrow-size);border-right-width:var(--ck-tooltip-arrow-size);border-top-width:0}.ck.ck-tooltip.ck-tooltip_sw{right:50%;left:auto}.ck.ck-tooltip.ck-tooltip_sw .ck-tooltip__text{left:auto;right:calc(var(--ck-tooltip-arrow-size)*-2)}.ck.ck-tooltip.ck-tooltip_sw .ck-tooltip__text:after{left:auto;right:0}.ck.ck-tooltip.ck-tooltip_se{left:50%;right:auto}.ck.ck-tooltip.ck-tooltip_se .ck-tooltip__text{right:auto;left:calc(var(--ck-tooltip-arrow-size)*-2)}.ck.ck-tooltip.ck-tooltip_se .ck-tooltip__text:after{right:auto;left:0;transform:translateX(50%)}.ck.ck-tooltip.ck-tooltip_n{top:calc(var(--ck-tooltip-arrow-size)*-1);transform:translateY(-100%)}.ck.ck-tooltip.ck-tooltip_n .ck-tooltip__text:after{bottom:calc(var(--ck-tooltip-arrow-size)*-1);transform:translateX(-50%);border-left-color:transparent;border-bottom-color:transparent;border-right-color:transparent;border-top-color:var(--ck-color-tooltip-background);border-left-width:var(--ck-tooltip-arrow-size);border-bottom-width:0;border-right-width:var(--ck-tooltip-arrow-size);border-top-width:var(--ck-tooltip-arrow-size)}.ck.ck-tooltip.ck-tooltip_e{left:calc(100% + var(--ck-tooltip-arrow-size));top:50%}.ck.ck-tooltip.ck-tooltip_e .ck-tooltip__text{left:0;transform:translateY(-50%)}.ck.ck-tooltip.ck-tooltip_e .ck-tooltip__text:after{left:calc(var(--ck-tooltip-arrow-size)*-1);top:calc(50% - var(--ck-tooltip-arrow-size)*1);border-left-color:transparent;border-bottom-color:transparent;border-right-color:var(--ck-color-tooltip-background);border-top-color:transparent;border-left-width:0;border-bottom-width:var(--ck-tooltip-arrow-size);border-right-width:var(--ck-tooltip-arrow-size);border-top-width:var(--ck-tooltip-arrow-size)}.ck.ck-tooltip.ck-tooltip_w{right:calc(100% + var(--ck-tooltip-arrow-size));left:auto;top:50%}.ck.ck-tooltip.ck-tooltip_w .ck-tooltip__text{left:0;transform:translateY(-50%)}.ck.ck-tooltip.ck-tooltip_w .ck-tooltip__text:after{left:100%;top:calc(50% - var(--ck-tooltip-arrow-size)*1);border-left-color:var(--ck-color-tooltip-background);border-bottom-color:transparent;border-right-color:transparent;border-top-color:transparent;border-left-width:var(--ck-tooltip-arrow-size);border-bottom-width:var(--ck-tooltip-arrow-size);border-right-width:0;border-top-width:var(--ck-tooltip-arrow-size)}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/tooltip.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/tooltip/tooltip.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAKA,sDAEC,iBAAkB,CAGlB,mBAAoB,CAIpB,kCACD,CAEA,eAEC,iBAAkB,CAClB,SAAU,CACV,YAAa,CACb,yBAWD,CATC,iCACC,oBAOD,CALC,uCACC,UAAW,CACX,OAAQ,CACR,QACD,CCxBF,MACC,2BACD,CAEA,eACC,QAAS,CAMT,KAAM,CAON,sCAwKD,CAtKC,iCChBA,eDqCA,CArBA,yGCZC,qCDiCD,CArBA,iCAGC,cAAe,CACf,eAAgB,CAChB,kCAAmC,CACnC,wDAAyD,CACzD,6CAA8C,CAC9C,iBAAkB,CAClB,SAYD,CAVC,uCAMC,sCAAuC,CACvC,kBAAmB,CACnB,QACD,CAYD,sFAGC,4CAA+C,CAC/C,0BASD,CAPC,8JAEC,+CAAkD,CAClD,0BAA6B,CAC7B,6BAAoF,CAApF,sDAAoF,CAApF,8BAAoF,CAApF,4BAAoF,CACpF,8CAAsG,CAAtG,gDAAsG,CAAtG,+CAAsG,CAAtG,kBACD,CAaD,6BACC,SAAU,CACV,SAWD,CATC,+CACC,SAAU,CACV,2CACD,CAEA,qDACC,SAAU,CACV,OACD,CAYD,6BACC,QAAS,CACT,UAYD,CAVC,+CACC,UAAW,CACX,0CACD,CAEA,qDACC,UAAW,CACX,MAAO,CACP,yBACD,CAYD,4BACC,yCAA4C,CAC5C,2BAQD,CANC,oDACC,4CAA+C,CAC/C,0BAA6B,CAC7B,6BAAoF,CAApF,+BAAoF,CAApF,8BAAoF,CAApF,mDAAoF,CACpF,8CAAsG,CAAtG,qBAAsG,CAAtG,+CAAsG,CAAtG,6CACD,CAUD,4BACC,8CAA+C,CAC/C,OAaD,CAXC,8CACC,MAAO,CACP,0BAQD,CANC,oDACC,0CAA6C,CAC7C,8CAAiD,CACjD,6BAAoF,CAApF,+BAAoF,CAApF,qDAAoF,CAApF,4BAAoF,CACpF,mBAAsG,CAAtG,gDAAsG,CAAtG,+CAAsG,CAAtG,6CACD,CAWF,4BACC,+CAAgD,CAChD,SAAU,CACV,OAaD,CAXC,8CACC,MAAO,CACP,0BAQD,CANC,oDACC,SAAU,CACV,8CAAiD,CACjD,oDAAoF,CAApF,+BAAoF,CAApF,8BAAoF,CAApF,4BAAoF,CACpF,8CAAsG,CAAtG,gDAAsG,CAAtG,oBAAsG,CAAtG,6CACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-tooltip,\n.ck.ck-tooltip .ck-tooltip__text::after {\n\tposition: absolute;\n\n\t/* Without this, hovering the tooltip could keep it visible. */\n\tpointer-events: none;\n\n\t/* This is to get rid of flickering when transitioning opacity in Chrome.\n\tIt\'s weird but it works. */\n\t-webkit-backface-visibility: hidden;\n}\n\n.ck.ck-tooltip {\n\t/* Tooltip is hidden by default. */\n\tvisibility: hidden;\n\topacity: 0;\n\tdisplay: none;\n\tz-index: var(--ck-z-modal);\n\n\t& .ck-tooltip__text {\n\t\tdisplay: inline-block;\n\n\t\t&::after {\n\t\t\tcontent: "";\n\t\t\twidth: 0;\n\t\t\theight: 0;\n\t\t}\n\t}\n}\n','/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n:root {\n\t--ck-tooltip-arrow-size: 5px;\n}\n\n.ck.ck-tooltip {\n\tleft: 50%;\n\n\t/*\n\t * Prevent blurry tooltips in LoDPI environments.\n\t * See https://github.com/ckeditor/ckeditor5/issues/1802.\n\t */\n\ttop: 0;\n\n\t/*\n\t * For the transition to work, the tooltip must be controlled\n\t * using visibility+opacity. A delay prevents a "tooltip avalanche"\n\t * i.e. when scanning the toolbar with mouse cursor.\n\t */\n\ttransition: opacity .2s ease-in-out .2s;\n\n\t& .ck-tooltip__text {\n\t\t@mixin ck-rounded-corners;\n\n\t\tfont-size: .9em;\n\t\tline-height: 1.5;\n\t\tcolor: var(--ck-color-tooltip-text);\n\t\tpadding: var(--ck-spacing-small) var(--ck-spacing-medium);\n\t\tbackground: var(--ck-color-tooltip-background);\n\t\tposition: relative;\n\t\tleft: -50%;\n\n\t\t&::after {\n\t\t\t/*\n\t\t\t * For the transition to work, the tooltip must be controlled\n\t\t\t * using visibility+opacity. A delay prevents a "tooltip avalanche"\n\t\t\t * i.e. when scanning the toolbar with mouse cursor.\n\t\t\t */\n\t\t\ttransition: opacity .2s ease-in-out .2s;\n\t\t\tborder-style: solid;\n\t\t\tleft: 50%;\n\t\t}\n\t}\n\n\t/**\n\t * A class that displays the tooltip south of the element.\n\t *\n\t * [element]\n\t * ^\n\t * +-----------+\n\t * | Tooltip |\n\t * +-----------+\n\t */\n\t&.ck-tooltip_s,\n\t&.ck-tooltip_sw,\n\t&.ck-tooltip_se {\n\t\tbottom: calc(-1 * var(--ck-tooltip-arrow-size));\n\t\ttransform: translateY( 100% );\n\n\t\t& .ck-tooltip__text::after {\n\t\t\t/* 1px addresses gliches in rendering causing gap between the triangle and the text */\n\t\t\ttop: calc(-1 * var(--ck-tooltip-arrow-size) + 1px);\n\t\t\ttransform: translateX( -50% );\n\t\t\tborder-color: transparent transparent var(--ck-color-tooltip-background) transparent;\n\t\t\tborder-width: 0 var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size);\n\t\t}\n\t}\n\n\t/**\n\t * A class that displays the tooltip south-west of the element.\n\t *\n\t * [element]\n\t * ^\n\t * +-----------+\n\t * | Tooltip |\n\t * +-----------+\n\t */\n\n\t&.ck-tooltip_sw {\n\t\tright: 50%;\n\t\tleft: auto;\n\n\t\t& .ck-tooltip__text {\n\t\t\tleft: auto;\n\t\t\tright: calc( -2 * var(--ck-tooltip-arrow-size));\n\t\t}\n\n\t\t& .ck-tooltip__text::after {\n\t\t\tleft: auto;\n\t\t\tright: 0;\n\t\t}\n\t}\n\n\t/**\n\t * A class that displays the tooltip south-east of the element.\n\t *\n\t * [element]\n\t * ^\n\t * +-----------+\n\t * | Tooltip |\n\t * +-----------+\n\t */\n\t&.ck-tooltip_se {\n\t\tleft: 50%;\n\t\tright: auto;\n\n\t\t& .ck-tooltip__text {\n\t\t\tright: auto;\n\t\t\tleft: calc( -2 * var(--ck-tooltip-arrow-size));\n\t\t}\n\n\t\t& .ck-tooltip__text::after {\n\t\t\tright: auto;\n\t\t\tleft: 0;\n\t\t\ttransform: translateX( 50% );\n\t\t}\n\t}\n\n\t/**\n\t * A class that displays the tooltip north of the element.\n\t *\n\t * +-----------+\n\t * | Tooltip |\n\t * +-----------+\n\t * V\n\t * [element]\n\t */\n\t&.ck-tooltip_n {\n\t\ttop: calc(-1 * var(--ck-tooltip-arrow-size));\n\t\ttransform: translateY( -100% );\n\n\t\t& .ck-tooltip__text::after {\n\t\t\tbottom: calc(-1 * var(--ck-tooltip-arrow-size));\n\t\t\ttransform: translateX( -50% );\n\t\t\tborder-color: var(--ck-color-tooltip-background) transparent transparent transparent;\n\t\t\tborder-width: var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size) 0 var(--ck-tooltip-arrow-size);\n\t\t}\n\t}\n\n\t/**\n\t * A class that displays the tooltip east of the element.\n\t *\n\t * +----------+\n\t * [element] < | east |\n\t * +----------+\n\t */\n\t&.ck-tooltip_e {\n\t\tleft: calc(100% + var(--ck-tooltip-arrow-size));\n\t\ttop: 50%;\n\n\t\t& .ck-tooltip__text {\n\t\t\tleft: 0;\n\t\t\ttransform: translateY( -50% );\n\n\t\t\t&::after {\n\t\t\t\tleft: calc(-1 * var(--ck-tooltip-arrow-size));\n\t\t\t\ttop: calc(50% - 1 * var(--ck-tooltip-arrow-size));\n\t\t\t\tborder-color: transparent var(--ck-color-tooltip-background) transparent transparent;\n\t\t\t\tborder-width: var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size) 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * A class that displays the tooltip west of the element.\n\t *\n\t * +----------+\n\t * | west | > [element]\n\t * +----------+\n\t */\n\t&.ck-tooltip_w {\n\t\tright: calc(100% + var(--ck-tooltip-arrow-size));\n\t\tleft: auto;\n\t\ttop: 50%;\n\n\t\t& .ck-tooltip__text {\n\t\t\tleft: 0;\n\t\t\ttransform: translateY( -50% );\n\n\t\t\t&::after {\n\t\t\t\tleft: 100%;\n\t\t\t\ttop: calc(50% - 1 * var(--ck-tooltip-arrow-size));\n\t\t\t\tborder-color: transparent transparent transparent var(--ck-color-tooltip-background);\n\t\t\t\tborder-width: var(--ck-tooltip-arrow-size) 0 var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size);\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-button,a.ck.ck-button{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.ck.ck-button .ck-tooltip,a.ck.ck-button .ck-tooltip{display:block}@media (hover:none){.ck.ck-button .ck-tooltip,a.ck.ck-button .ck-tooltip{display:none}}.ck.ck-button,a.ck.ck-button{position:relative;display:inline-flex;align-items:center;justify-content:left}.ck.ck-button .ck-button__label,a.ck.ck-button .ck-button__label{display:none}.ck.ck-button.ck-button_with-text .ck-button__label,a.ck.ck-button.ck-button_with-text .ck-button__label{display:inline-block}.ck.ck-button:not(.ck-button_with-text),a.ck.ck-button:not(.ck-button_with-text){justify-content:center}.ck.ck-button:hover .ck-tooltip,a.ck.ck-button:hover .ck-tooltip{visibility:visible;opacity:1}.ck.ck-button:focus:not(:hover) .ck-tooltip,a.ck.ck-button:focus:not(:hover) .ck-tooltip{display:none}.ck.ck-button,a.ck.ck-button{background:var(--ck-color-button-default-background)}.ck.ck-button:not(.ck-disabled):hover,a.ck.ck-button:not(.ck-disabled):hover{background:var(--ck-color-button-default-hover-background)}.ck.ck-button:not(.ck-disabled):active,a.ck.ck-button:not(.ck-disabled):active{background:var(--ck-color-button-default-active-background);box-shadow:inset 0 2px 2px var(--ck-color-button-default-active-shadow)}.ck.ck-button.ck-disabled,a.ck.ck-button.ck-disabled{background:var(--ck-color-button-default-disabled-background)}.ck.ck-button,a.ck.ck-button{border-radius:0}.ck-rounded-corners .ck.ck-button,.ck-rounded-corners a.ck.ck-button,.ck.ck-button.ck-rounded-corners,a.ck.ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-button,a.ck.ck-button{white-space:nowrap;cursor:default;vertical-align:middle;padding:var(--ck-spacing-tiny);text-align:center;min-width:var(--ck-ui-component-min-height);min-height:var(--ck-ui-component-min-height);line-height:1;font-size:inherit;border:1px solid transparent;transition:box-shadow .2s ease-in-out,border .2s ease-in-out;-webkit-appearance:none}.ck.ck-button:active,.ck.ck-button:focus,a.ck.ck-button:active,a.ck.ck-button:focus{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-focus-outer-shadow),0 0}.ck.ck-button .ck-button__icon use,.ck.ck-button .ck-button__icon use *,a.ck.ck-button .ck-button__icon use,a.ck.ck-button .ck-button__icon use *{color:inherit}.ck.ck-button .ck-button__label,a.ck.ck-button .ck-button__label{font-size:inherit;font-weight:inherit;color:inherit;cursor:inherit;vertical-align:middle}[dir=ltr] .ck.ck-button .ck-button__label,[dir=ltr] a.ck.ck-button .ck-button__label{text-align:left}[dir=rtl] .ck.ck-button .ck-button__label,[dir=rtl] a.ck.ck-button .ck-button__label{text-align:right}.ck.ck-button .ck-button__keystroke,a.ck.ck-button .ck-button__keystroke{color:inherit}[dir=ltr] .ck.ck-button .ck-button__keystroke,[dir=ltr] a.ck.ck-button .ck-button__keystroke{margin-left:var(--ck-spacing-large)}[dir=rtl] .ck.ck-button .ck-button__keystroke,[dir=rtl] a.ck.ck-button .ck-button__keystroke{margin-right:var(--ck-spacing-large)}.ck.ck-button .ck-button__keystroke,a.ck.ck-button .ck-button__keystroke{font-weight:700;opacity:.7}.ck.ck-button.ck-disabled:active,.ck.ck-button.ck-disabled:focus,a.ck.ck-button.ck-disabled:active,a.ck.ck-button.ck-disabled:focus{box-shadow:var(--ck-focus-disabled-outer-shadow),0 0}.ck.ck-button.ck-disabled .ck-button__icon,a.ck.ck-button.ck-disabled .ck-button__icon{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-disabled .ck-button__label,a.ck.ck-button.ck-disabled .ck-button__label{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-disabled .ck-button__keystroke,a.ck.ck-button.ck-disabled .ck-button__keystroke{opacity:.3}.ck.ck-button.ck-button_with-text,a.ck.ck-button.ck-button_with-text{padding:var(--ck-spacing-tiny) var(--ck-spacing-standard)}[dir=ltr] .ck.ck-button.ck-button_with-text .ck-button__icon,[dir=ltr] a.ck.ck-button.ck-button_with-text .ck-button__icon{margin-left:calc(var(--ck-spacing-small)*-1);margin-right:var(--ck-spacing-small)}[dir=rtl] .ck.ck-button.ck-button_with-text .ck-button__icon,[dir=rtl] a.ck.ck-button.ck-button_with-text .ck-button__icon{margin-right:calc(var(--ck-spacing-small)*-1);margin-left:var(--ck-spacing-small)}.ck.ck-button.ck-button_with-keystroke .ck-button__label,a.ck.ck-button.ck-button_with-keystroke .ck-button__label{flex-grow:1}.ck.ck-button.ck-on,a.ck.ck-button.ck-on{background:var(--ck-color-button-on-background)}.ck.ck-button.ck-on:not(.ck-disabled):hover,a.ck.ck-button.ck-on:not(.ck-disabled):hover{background:var(--ck-color-button-on-hover-background)}.ck.ck-button.ck-on:not(.ck-disabled):active,a.ck.ck-button.ck-on:not(.ck-disabled):active{background:var(--ck-color-button-on-active-background);box-shadow:inset 0 2px 2px var(--ck-color-button-on-active-shadow)}.ck.ck-button.ck-on.ck-disabled,a.ck.ck-button.ck-on.ck-disabled{background:var(--ck-color-button-on-disabled-background)}.ck.ck-button.ck-button-save,a.ck.ck-button.ck-button-save{color:var(--ck-color-button-save)}.ck.ck-button.ck-button-cancel,a.ck.ck-button.ck-button-cancel{color:var(--ck-color-button-cancel)}.ck.ck-button-action,a.ck.ck-button-action{background:var(--ck-color-button-action-background)}.ck.ck-button-action:not(.ck-disabled):hover,a.ck.ck-button-action:not(.ck-disabled):hover{background:var(--ck-color-button-action-hover-background)}.ck.ck-button-action:not(.ck-disabled):active,a.ck.ck-button-action:not(.ck-disabled):active{background:var(--ck-color-button-action-active-background);box-shadow:inset 0 2px 2px var(--ck-color-button-action-active-shadow)}.ck.ck-button-action.ck-disabled,a.ck.ck-button-action.ck-disabled{background:var(--ck-color-button-action-disabled-background)}.ck.ck-button-action,a.ck.ck-button-action{color:var(--ck-color-button-action-text)}.ck.ck-button-bold,a.ck.ck-button-bold{font-weight:700}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/button/button.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/mixins/_tooltip.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/button/button.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/mixins/_button.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_disabled.css"],names:[],mappings:"AAQA,6BCCC,qBAAsB,CACtB,wBAAyB,CACzB,oBAAqB,CACrB,gBD6BD,CE/BC,qDACC,aAqBD,CAHC,oBAnBD,qDAoBE,YAEF,CADC,CFvBF,6BAKC,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,oBAyBD,CAvBC,iEACC,YACD,CAGC,yGACC,oBACD,CAID,iFACC,sBACD,CEkBA,iEACC,kBAAmB,CACnB,SACD,CAbA,yFACC,YACD,CC7BD,6BCAC,oDD0ID,CCvIE,6EACC,0DACD,CAEA,+EACC,2DAA4C,CAC5C,uEACD,CAID,qDACC,6DACD,CDhBD,6BEDC,eF2ID,CA1IA,wIEGE,qCFuIF,CA1IA,6BAKC,kBAAmB,CACnB,cAAe,CACf,qBAAsB,CACtB,8BAA+B,CAC/B,iBAAkB,CAGlB,2CAA4C,CAC5C,4CAA6C,CAI7C,aAAc,CAGd,iBAAkB,CAGlB,4BAA6B,CAG7B,4DAA8D,CAG9D,uBA6GD,CA3GC,oFGjCA,YAAa,CACb,2BAA2B,CCF3B,2CJsCA,CAIC,kJAEC,aACD,CAGD,iEAEC,iBAAkB,CAClB,mBAAoB,CACpB,aAAc,CACd,cAAe,CAIf,qBASD,CAlBA,qFAYE,eAMF,CAlBA,qFAgBE,gBAEF,CAEA,yEACC,aAYD,CAbA,6FAIE,mCASF,CAbA,6FAQE,oCAKF,CAbA,yEAWC,eAAiB,CACjB,UACD,CAIC,oIIrFD,oDJyFC,CAEA,uFK3FD,kCL6FC,CAGA,yFKhGD,kCLkGC,CAEA,iGACC,UACD,CAGD,qEACC,yDAcD,CAXC,2HAEE,4CAA+C,CAC/C,oCAOF,CAVA,2HAOE,6CAAgD,CAChD,mCAEF,CAKA,mHACC,WACD,CAID,yCC/HA,+CDiIA,CC9HC,yFACC,qDACD,CAEA,2FACC,sDAA4C,CAC5C,kEACD,CAID,iEACC,wDACD,CDmHA,2DACC,iCACD,CAEA,+DACC,mCACD,CAID,2CC7IC,mDDkJD,CC/IE,2FACC,yDACD,CAEA,6FACC,0DAA4C,CAC5C,sEACD,CAID,mEACC,4DACD,CD6HD,2CAIC,wCACD,CAEA,uCAEC,eACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../mixins/_unselectable.css";\n@import "../tooltip/mixins/_tooltip.css";\n\n.ck.ck-button,\na.ck.ck-button {\n\t@mixin ck-unselectable;\n\t@mixin ck-tooltip_enabled;\n\n\tposition: relative;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: left;\n\n\t& .ck-button__label {\n\t\tdisplay: none;\n\t}\n\n\t&.ck-button_with-text {\n\t\t& .ck-button__label {\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n\n\t/* Center the icon horizontally in a button without text. */\n\t&:not(.ck-button_with-text) {\n\t\tjustify-content: center;\n\t}\n\n\t&:hover {\n\t\t@mixin ck-tooltip_visible;\n\t}\n\n\t/* Get rid of the native focus outline around the tooltip when focused (but not :hover). */\n\t&:focus:not(:hover) {\n\t\t@mixin ck-tooltip_disabled;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Makes element unselectable.\n */\n@define-mixin ck-unselectable {\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Enables the tooltip, which is the tooltip is in DOM but\n * not yet displayed.\n */\n@define-mixin ck-tooltip_enabled {\n\t& .ck-tooltip {\n\t\tdisplay: block;\n\n\t\t/*\n\t\t * Don't display tooltips in devices which don't support :hover.\n\t\t * In fact, it's all about iOS, which forces user to click UI elements twice to execute\n\t\t * the primary action, when tooltips are enabled.\n\t\t *\n\t\t * Q: OK, but why not the following query?\n\t\t *\n\t\t * @media (hover) {\n\t\t * display: block;\n\t\t * }\n\t\t *\n\t\t * A: Because FF does not support it and it would completely disable tooltips\n\t\t * in that browser.\n\t\t *\n\t\t * More in https://github.com/ckeditor/ckeditor5/issues/920.\n\t\t */\n\t\t@media (hover:none) {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n/**\n * Disables the tooltip making it disappear from DOM.\n */\n@define-mixin ck-tooltip_disabled {\n\t& .ck-tooltip {\n\t\tdisplay: none;\n\t}\n}\n\n/**\n * Shows the tooltip, which is already in DOM.\n * Requires `ck-tooltip_enabled` first.\n */\n@define-mixin ck-tooltip_visible {\n\t& .ck-tooltip {\n\t\tvisibility: visible;\n\t\topacity: 1;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_focus.css";\n@import "../../../mixins/_shadow.css";\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_rounded.css";\n@import "../../mixins/_button.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-button,\na.ck.ck-button {\n\t@mixin ck-button-colors --ck-color-button-default;\n\t@mixin ck-rounded-corners;\n\n\twhite-space: nowrap;\n\tcursor: default;\n\tvertical-align: middle;\n\tpadding: var(--ck-spacing-tiny);\n\ttext-align: center;\n\n\t/* A very important piece of styling. Go to variable declaration to learn more. */\n\tmin-width: var(--ck-ui-component-min-height);\n\tmin-height: var(--ck-ui-component-min-height);\n\n\t/* Normalize the height of the line. Removing this will break consistent height\n\tamong text and text-less buttons (with icons). */\n\tline-height: 1;\n\n\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\tfont-size: inherit;\n\n\t/* Avoid flickering when the foucs border shows up. */\n\tborder: 1px solid transparent;\n\n\t/* Apply some smooth transition to the box-shadow and border. */\n\ttransition: box-shadow .2s ease-in-out, border .2s ease-in-out;\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/189 */\n\t-webkit-appearance: none;\n\n\t&:active,\n\t&:focus {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\n\t}\n\n\t/* Allow icon coloring using the text "color" property. */\n\t& .ck-button__icon {\n\t\t& use,\n\t\t& use * {\n\t\t\tcolor: inherit;\n\t\t}\n\t}\n\n\t& .ck-button__label {\n\t\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\t\tfont-size: inherit;\n\t\tfont-weight: inherit;\n\t\tcolor: inherit;\n\t\tcursor: inherit;\n\n\t\t/* Must be consistent with .ck-icon\'s vertical align. Otherwise, buttons with and\n\t\twithout labels (but with icons) have different sizes in Chrome */\n\t\tvertical-align: middle;\n\n\t\t@mixin ck-dir ltr {\n\t\t\ttext-align: left;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\ttext-align: right;\n\t\t}\n\t}\n\n\t& .ck-button__keystroke {\n\t\tcolor: inherit;\n\n\t\t@mixin ck-dir ltr {\n\t\t\tmargin-left: var(--ck-spacing-large);\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tmargin-right: var(--ck-spacing-large);\n\t\t}\n\n\t\tfont-weight: bold;\n\t\topacity: .7;\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/70 */\n\t&.ck-disabled {\n\t\t&:active,\n\t\t&:focus {\n\t\t\t/* The disabled button should have a slightly less visible shadow when focused. */\n\t\t\t@mixin ck-box-shadow var(--ck-focus-disabled-outer-shadow);\n\t\t}\n\n\t\t& .ck-button__icon {\n\t\t\t@mixin ck-disabled;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/98 */\n\t\t& .ck-button__label {\n\t\t\t@mixin ck-disabled;\n\t\t}\n\n\t\t& .ck-button__keystroke {\n\t\t\topacity: .3;\n\t\t}\n\t}\n\n\t&.ck-button_with-text {\n\t\tpadding: var(--ck-spacing-tiny) var(--ck-spacing-standard);\n\n\t\t/* stylelint-disable-next-line no-descending-specificity */\n\t\t& .ck-button__icon {\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: calc(-1 * var(--ck-spacing-small));\n\t\t\t\tmargin-right: var(--ck-spacing-small);\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-right: calc(-1 * var(--ck-spacing-small));\n\t\t\t\tmargin-left: var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\t}\n\n\t&.ck-button_with-keystroke {\n\t\t/* stylelint-disable-next-line no-descending-specificity */\n\t\t& .ck-button__label {\n\t\t\tflex-grow: 1;\n\t\t}\n\t}\n\n\t/* A style of the button which is currently on, e.g. its feature is active. */\n\t&.ck-on {\n\t\t@mixin ck-button-colors --ck-color-button-on;\n\t}\n\n\t&.ck-button-save {\n\t\tcolor: var(--ck-color-button-save);\n\t}\n\n\t&.ck-button-cancel {\n\t\tcolor: var(--ck-color-button-cancel);\n\t}\n}\n\n/* A style of the button which handles the primary action. */\n.ck.ck-button-action,\na.ck.ck-button-action {\n\t@mixin ck-button-colors --ck-color-button-action;\n\n\tcolor: var(--ck-color-button-action-text);\n}\n\n.ck.ck-button-bold,\na.ck.ck-button-bold {\n\tfont-weight: bold;\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements a button of given background color.\n *\n * @param {String} $background - Background color of the button.\n * @param {String} $border - Border color of the button.\n */\n@define-mixin ck-button-colors $prefix {\n\tbackground: var($(prefix)-background);\n\n\t&:not(.ck-disabled) {\n\t\t&:hover {\n\t\t\tbackground: var($(prefix)-hover-background);\n\t\t}\n\n\t\t&:active {\n\t\t\tbackground: var($(prefix)-active-background);\n\t\t\tbox-shadow: inset 0 2px 2px var($(prefix)-active-shadow);\n\t\t}\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/98 */\n\t&.ck-disabled {\n\t\tbackground: var($(prefix)-disabled-background);\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which indicates that an element holding it is disabled.\n */\n@define-mixin ck-disabled {\n\topacity: var(--ck-disabled-opacity);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-button.ck-switchbutton .ck-button__toggle,.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{display:block}:root{--ck-switch-button-toggle-width:2.6153846154em;--ck-switch-button-toggle-inner-size:1.0769230769em;--ck-switch-button-toggle-spacing:1px;--ck-switch-button-translation:calc(var(--ck-switch-button-toggle-width) - var(--ck-switch-button-toggle-inner-size) - var(--ck-switch-button-toggle-spacing)*2)}[dir=ltr] .ck.ck-button.ck-switchbutton .ck-button__label{margin-right:calc(var(--ck-spacing-large)*2)}[dir=rtl] .ck.ck-button.ck-switchbutton .ck-button__label{margin-left:calc(var(--ck-spacing-large)*2)}.ck.ck-button.ck-switchbutton .ck-button__toggle{border-radius:0}.ck-rounded-corners .ck.ck-button.ck-switchbutton .ck-button__toggle,.ck.ck-button.ck-switchbutton .ck-button__toggle.ck-rounded-corners{border-radius:var(--ck-border-radius)}[dir=ltr] .ck.ck-button.ck-switchbutton .ck-button__toggle{margin-left:auto}[dir=rtl] .ck.ck-button.ck-switchbutton .ck-button__toggle{margin-right:auto}.ck.ck-button.ck-switchbutton .ck-button__toggle{transition:background .4s ease;width:var(--ck-switch-button-toggle-width);background:var(--ck-color-switch-button-off-background)}.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{border-radius:0}.ck-rounded-corners .ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner,.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner.ck-rounded-corners{border-radius:var(--ck-border-radius);border-radius:calc(var(--ck-border-radius)*0.5)}.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{margin:var(--ck-switch-button-toggle-spacing);width:var(--ck-switch-button-toggle-inner-size);height:var(--ck-switch-button-toggle-inner-size);background:var(--ck-color-switch-button-inner-background);transition:all .3s ease}.ck.ck-button.ck-switchbutton .ck-button__toggle:hover{background:var(--ck-color-switch-button-off-hover-background)}.ck.ck-button.ck-switchbutton .ck-button__toggle:hover .ck-button__toggle__inner{box-shadow:0 0 0 5px var(--ck-color-switch-button-inner-shadow)}.ck.ck-button.ck-switchbutton.ck-disabled .ck-button__toggle{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle{background:var(--ck-color-switch-button-on-background)}.ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle:hover{background:var(--ck-color-switch-button-on-hover-background)}[dir=ltr] .ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle .ck-button__toggle__inner{transform:translateX(var(--ck-switch-button-translation))}[dir=rtl] .ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle .ck-button__toggle__inner{transform:translateX(calc(var(--ck-switch-button-translation)*-1))}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/button/switchbutton.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/button/switchbutton.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_disabled.css"],names:[],mappings:"AASE,4HACC,aACD,CCCF,MAEC,8CAA+C,CAE/C,mDAAoD,CACpD,qCAAsC,CACtC,gKAKD,CAGC,0DAGE,4CAOF,CAVA,0DAQE,2CAEF,CAEA,iDC3BA,eDoEA,CAzCA,yICvBC,qCDgED,CAzCA,2DAKE,gBAoCF,CAzCA,2DAUE,iBA+BF,CAzCA,iDAcC,8BAAiC,CAEjC,0CAA2C,CAC3C,uDAwBD,CAtBC,2EC9CD,eD2DC,CAbA,6LC1CA,qCAAsC,CD4CpC,+CAWF,CAbA,2EAMC,6CAA8C,CAC9C,+CAAgD,CAChD,gDAAiD,CACjD,yDAA0D,CAG1D,uBACD,CAEA,uDACC,6DAKD,CAHC,iFACC,+DACD,CAIF,6DExEA,kCF0EA,CAEA,uDACC,sDAkBD,CAhBC,6DACC,4DACD,CAEA,2FAKE,yDAMF,CAXA,2FASE,kEAEF",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-button.ck-switchbutton {\n\t& .ck-button__toggle {\n\t\tdisplay: block;\n\n\t\t& .ck-button__toggle__inner {\n\t\t\tdisplay: block;\n\t\t}\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_disabled.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n/* Note: To avoid rendering issues (aliasing) but to preserve the responsive nature\nof the component, floating–point numbers have been used which, for the default font size\n(see: --ck-font-size-base), will generate simple integers. */\n:root {\n\t/* 34px at 13px font-size */\n\t--ck-switch-button-toggle-width: 2.6153846154em;\n\t/* 14px at 13px font-size */\n\t--ck-switch-button-toggle-inner-size: 1.0769230769em;\n\t--ck-switch-button-toggle-spacing: 1px;\n\t--ck-switch-button-translation: calc(\n\t\tvar(--ck-switch-button-toggle-width) -\n\t\tvar(--ck-switch-button-toggle-inner-size) -\n\t\t2 * var(--ck-switch-button-toggle-spacing)\n\t);\n}\n\n.ck.ck-button.ck-switchbutton {\n\t& .ck-button__label {\n\t\t@mixin ck-dir ltr {\n\t\t\t/* Separate the label from the switch */\n\t\t\tmargin-right: calc(2 * var(--ck-spacing-large));\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\t/* Separate the label from the switch */\n\t\t\tmargin-left: calc(2 * var(--ck-spacing-large));\n\t\t}\n\t}\n\n\t& .ck-button__toggle {\n\t\t@mixin ck-rounded-corners;\n\n\t\t@mixin ck-dir ltr {\n\t\t\t/* Make sure the toggle is always to the right as far as possible. */\n\t\t\tmargin-left: auto;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\t/* Make sure the toggle is always to the left as far as possible. */\n\t\t\tmargin-right: auto;\n\t\t}\n\n\t\t/* Gently animate the background color of the toggle switch */\n\t\ttransition: background 400ms ease;\n\n\t\twidth: var(--ck-switch-button-toggle-width);\n\t\tbackground: var(--ck-color-switch-button-off-background);\n\n\t\t& .ck-button__toggle__inner {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-radius: calc(.5 * var(--ck-border-radius));\n\t\t\t}\n\n\t\t\t/* Leave some tiny bit of space around the inner part of the switch */\n\t\t\tmargin: var(--ck-switch-button-toggle-spacing);\n\t\t\twidth: var(--ck-switch-button-toggle-inner-size);\n\t\t\theight: var(--ck-switch-button-toggle-inner-size);\n\t\t\tbackground: var(--ck-color-switch-button-inner-background);\n\n\t\t\t/* Gently animate the inner part of the toggle switch */\n\t\t\ttransition: all 300ms ease;\n\t\t}\n\n\t\t&:hover {\n\t\t\tbackground: var(--ck-color-switch-button-off-hover-background);\n\n\t\t\t& .ck-button__toggle__inner {\n\t\t\t\tbox-shadow: 0 0 0 5px var(--ck-color-switch-button-inner-shadow);\n\t\t\t}\n\t\t}\n\t}\n\n\t&.ck-disabled .ck-button__toggle {\n\t\t@mixin ck-disabled;\n\t}\n\n\t&.ck-on .ck-button__toggle {\n\t\tbackground: var(--ck-color-switch-button-on-background);\n\n\t\t&:hover {\n\t\t\tbackground: var(--ck-color-switch-button-on-hover-background);\n\t\t}\n\n\t\t& .ck-button__toggle__inner {\n\t\t\t/*\n\t\t\t * Move the toggle switch to the right. It will be animated.\n\t\t\t */\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\ttransform: translateX( var( --ck-switch-button-translation ) );\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\ttransform: translateX( calc( -1 * var( --ck-switch-button-translation ) ) );\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which indicates that an element holding it is disabled.\n */\n@define-mixin ck-disabled {\n\topacity: var(--ck-disabled-opacity);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-color-grid{display:grid}:root{--ck-color-grid-tile-size:24px;--ck-color-color-grid-check-icon:#000}.ck.ck-color-grid{grid-gap:5px;padding:8px}.ck.ck-color-grid__tile{width:var(--ck-color-grid-tile-size);height:var(--ck-color-grid-tile-size);min-width:var(--ck-color-grid-tile-size);min-height:var(--ck-color-grid-tile-size);padding:0;transition:box-shadow .2s ease;border:0}.ck.ck-color-grid__tile.ck-disabled{cursor:unset;transition:unset}.ck.ck-color-grid__tile.ck-color-table__color-tile_bordered{box-shadow:0 0 0 1px var(--ck-color-base-border)}.ck.ck-color-grid__tile .ck.ck-icon{display:none;color:var(--ck-color-color-grid-check-icon)}.ck.ck-color-grid__tile.ck-on{box-shadow:inset 0 0 0 1px var(--ck-color-base-background),0 0 0 2px var(--ck-color-base-text)}.ck.ck-color-grid__tile.ck-on .ck.ck-icon{display:block}.ck.ck-color-grid__tile.ck-on,.ck.ck-color-grid__tile:focus:not(.ck-disabled),.ck.ck-color-grid__tile:hover:not(.ck-disabled){border:0}.ck.ck-color-grid__tile:focus:not(.ck-disabled),.ck.ck-color-grid__tile:hover:not(.ck-disabled){box-shadow:inset 0 0 0 1px var(--ck-color-base-background),0 0 0 2px var(--ck-color-focus-border)}.ck.ck-color-grid__label{padding:0 var(--ck-spacing-standard)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/colorgrid/colorgrid.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/colorgrid/colorgrid.css"],names:[],mappings:"AAKA,kBACC,YACD,CCAA,MACC,8BAA+B,CAK/B,qCACD,CAEA,kBACC,YAAa,CACb,WACD,CAEA,wBACC,oCAAqC,CACrC,qCAAsC,CACtC,wCAAyC,CACzC,yCAA0C,CAC1C,SAAU,CACV,8BAA+B,CAC/B,QAmCD,CAjCC,oCACC,YAAa,CACb,gBACD,CAEA,4DACC,gDACD,CAEA,oCACC,YAAa,CACb,2CACD,CAEA,8BACC,8FAKD,CAHC,0CACC,aACD,CAGD,8HAIC,QACD,CAEA,gGAEC,iGACD,CAGD,yBACC,oCACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-color-grid {\n\tdisplay: grid;\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n:root {\n\t--ck-color-grid-tile-size: 24px;\n\n\t/* Not using global colors here because these may change but some colors in a pallette\n\t * require special treatment. For instance, this ensures no matter what the UI text color is,\n\t * the check icon will look good on the black color tile. */\n\t--ck-color-color-grid-check-icon: hsl(0, 0%, 0%);\n}\n\n.ck.ck-color-grid {\n\tgrid-gap: 5px;\n\tpadding: 8px;\n}\n\n.ck.ck-color-grid__tile {\n\twidth: var(--ck-color-grid-tile-size);\n\theight: var(--ck-color-grid-tile-size);\n\tmin-width: var(--ck-color-grid-tile-size);\n\tmin-height: var(--ck-color-grid-tile-size);\n\tpadding: 0;\n\ttransition: .2s ease box-shadow;\n\tborder: 0;\n\n\t&.ck-disabled {\n\t\tcursor: unset;\n\t\ttransition: unset;\n\t}\n\n\t&.ck-color-table__color-tile_bordered {\n\t\tbox-shadow: 0 0 0 1px var(--ck-color-base-border);\n\t}\n\n\t& .ck.ck-icon {\n\t\tdisplay: none;\n\t\tcolor: var(--ck-color-color-grid-check-icon);\n\t}\n\n\t&.ck-on {\n\t\tbox-shadow: inset 0 0 0 1px var(--ck-color-base-background), 0 0 0 2px var(--ck-color-base-text);\n\n\t\t& .ck.ck-icon {\n\t\t\tdisplay: block;\n\t\t}\n\t}\n\n\t&.ck-on,\n\t&:focus:not( .ck-disabled ),\n\t&:hover:not( .ck-disabled ) {\n\t\t/* Disable the default .ck-button\'s border ring. */\n\t\tborder: 0;\n\t}\n\n\t&:focus:not( .ck-disabled ),\n\t&:hover:not( .ck-disabled ) {\n\t\tbox-shadow: inset 0 0 0 1px var(--ck-color-base-background), 0 0 0 2px var(--ck-color-focus-border);\n\t}\n}\n\n.ck.ck-color-grid__label {\n\tpadding: 0 var(--ck-spacing-standard);\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-splitbutton{font-size:inherit}.ck.ck-splitbutton .ck-splitbutton__action:focus{z-index:calc(var(--ck-z-default) + 1)}.ck.ck-splitbutton.ck-splitbutton_open>.ck-button .ck-tooltip{display:none}:root{--ck-color-split-button-hover-background:#ebebeb;--ck-color-split-button-hover-border:#b3b3b3}[dir=ltr] .ck.ck-splitbutton>.ck-splitbutton__action{border-top-right-radius:unset;border-bottom-right-radius:unset}[dir=rtl] .ck.ck-splitbutton>.ck-splitbutton__action{border-top-left-radius:unset;border-bottom-left-radius:unset}.ck.ck-splitbutton>.ck-splitbutton__arrow{min-width:unset}[dir=ltr] .ck.ck-splitbutton>.ck-splitbutton__arrow{border-radius:0}.ck-rounded-corners [dir=ltr] .ck.ck-splitbutton>.ck-splitbutton__arrow,[dir=ltr] .ck.ck-splitbutton>.ck-splitbutton__arrow.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:unset;border-bottom-left-radius:unset}[dir=rtl] .ck.ck-splitbutton>.ck-splitbutton__arrow{border-top-right-radius:unset;border-bottom-right-radius:unset}.ck.ck-splitbutton>.ck-splitbutton__arrow svg{width:var(--ck-dropdown-arrow-size)}.ck.ck-splitbutton.ck-splitbutton_open>.ck-button:not(.ck-on):not(.ck-disabled):not(:hover),.ck.ck-splitbutton:hover>.ck-button:not(.ck-on):not(.ck-disabled):not(:hover){background:var(--ck-color-split-button-hover-background)}[dir=ltr] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled),[dir=ltr] .ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled){border-left-color:var(--ck-color-split-button-hover-border)}[dir=rtl] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled),[dir=rtl] .ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled){border-right-color:var(--ck-color-split-button-hover-border)}.ck.ck-splitbutton.ck-splitbutton_open{border-radius:0}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__action,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners>.ck-splitbutton__action{border-bottom-left-radius:0}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners>.ck-splitbutton__arrow{border-bottom-right-radius:0}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/splitbutton.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/mixins/_tooltip.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/splitbutton.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,mBAEC,iBAUD,CARC,iDACC,qCACD,CC0BA,8DACC,YACD,CClCD,MACC,gDAAyD,CACzD,4CACD,CAMC,qDAGE,6BAA8B,CAC9B,gCAQF,CAZA,qDASE,4BAA6B,CAC7B,+BAEF,CAEA,0CAGC,eAmBD,CAtBA,oDCnBA,eDyCA,CAtBA,+ICfC,qCAAsC,CDuBpC,4BAA6B,CAC7B,+BAaH,CAtBA,oDAeE,6BAA8B,CAC9B,gCAMF,CAHC,8CACC,mCACD,CASA,0KACC,wDACD,CAGC,sKACC,2DACD,CAIA,sKACC,4DACD,CAMF,uCCpEA,eD8EA,CAVA,qHChEC,qCD0ED,CARE,qKACC,2BACD,CAEA,mKACC,4BACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../tooltip/mixins/_tooltip.css";\n\n.ck.ck-splitbutton {\n\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\tfont-size: inherit;\n\n\t& .ck-splitbutton__action:focus {\n\t\tz-index: calc(var(--ck-z-default) + 1);\n\t}\n\n\t/* Disable tooltips for the buttons when the button is "open" */\n\t&.ck-splitbutton_open > .ck-button {\n\t\t@mixin ck-tooltip_disabled;\n\t}\n}\n\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Enables the tooltip, which is the tooltip is in DOM but\n * not yet displayed.\n */\n@define-mixin ck-tooltip_enabled {\n\t& .ck-tooltip {\n\t\tdisplay: block;\n\n\t\t/*\n\t\t * Don't display tooltips in devices which don't support :hover.\n\t\t * In fact, it's all about iOS, which forces user to click UI elements twice to execute\n\t\t * the primary action, when tooltips are enabled.\n\t\t *\n\t\t * Q: OK, but why not the following query?\n\t\t *\n\t\t * @media (hover) {\n\t\t * display: block;\n\t\t * }\n\t\t *\n\t\t * A: Because FF does not support it and it would completely disable tooltips\n\t\t * in that browser.\n\t\t *\n\t\t * More in https://github.com/ckeditor/ckeditor5/issues/920.\n\t\t */\n\t\t@media (hover:none) {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n/**\n * Disables the tooltip making it disappear from DOM.\n */\n@define-mixin ck-tooltip_disabled {\n\t& .ck-tooltip {\n\t\tdisplay: none;\n\t}\n}\n\n/**\n * Shows the tooltip, which is already in DOM.\n * Requires `ck-tooltip_enabled` first.\n */\n@define-mixin ck-tooltip_visible {\n\t& .ck-tooltip {\n\t\tvisibility: visible;\n\t\topacity: 1;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n:root {\n\t--ck-color-split-button-hover-background: hsl(0, 0%, 92%);\n\t--ck-color-split-button-hover-border: hsl(0, 0%, 70%);\n}\n\n.ck.ck-splitbutton {\n\t/*\n\t * Note: ck-rounded and ck-dir mixins don\'t go together (because they both use @nest).\n\t */\n\t& > .ck-splitbutton__action {\n\t\t@nest [dir="ltr"] & {\n\t\t\t/* Don\'t round the action button on the right side */\n\t\t\tborder-top-right-radius: unset;\n\t\t\tborder-bottom-right-radius: unset;\n\t\t}\n\n\t\t@nest [dir="rtl"] & {\n\t\t\t/* Don\'t round the action button on the left side */\n\t\t\tborder-top-left-radius: unset;\n\t\t\tborder-bottom-left-radius: unset;\n\t\t}\n\t}\n\n\t& > .ck-splitbutton__arrow {\n\t\t/* It\'s a text-less button and since the icon is positioned absolutely in such situation,\n\t\tit must get some arbitrary min-width. */\n\t\tmin-width: unset;\n\n\t\t@nest [dir="ltr"] & {\n\t\t\t/* Don\'t round the arrow button on the left side */\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-top-left-radius: unset;\n\t\t\t\tborder-bottom-left-radius: unset;\n\t\t\t}\n\t\t}\n\n\t\t@nest [dir="rtl"] & {\n\t\t\t/* Don\'t round the arrow button on the right side */\n\t\t\tborder-top-right-radius: unset;\n\t\t\tborder-bottom-right-radius: unset;\n\t\t}\n\n\t\t& svg {\n\t\t\twidth: var(--ck-dropdown-arrow-size);\n\t\t}\n\t}\n\n\t/* When the split button is "open" (the arrow is on) or being hovered, it should get some styling\n\tas a whole. The background of both buttons should stand out and there should be a visual\n\tseparation between both buttons. */\n\t&.ck-splitbutton_open,\n\t&:hover {\n\t\t/* When the split button hovered as a whole, not as individual buttons. */\n\t\t& > .ck-button:not(.ck-on):not(.ck-disabled):not(:hover) {\n\t\t\tbackground: var(--ck-color-split-button-hover-background);\n\t\t}\n\n\t\t@nest [dir="ltr"] & {\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled) {\n\t\t\t\tborder-left-color: var(--ck-color-split-button-hover-border);\n\t\t\t}\n\t\t}\n\n\t\t@nest [dir="rtl"] & {\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled) {\n\t\t\t\tborder-right-color: var(--ck-color-split-button-hover-border);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Don\'t round the bottom left and right corners of the buttons when "open"\n\thttps://github.com/ckeditor/ckeditor5/issues/816 */\n\t&.ck-splitbutton_open {\n\t\t@mixin ck-rounded-corners {\n\t\t\t& > .ck-splitbutton__action {\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t}\n\n\t\t\t& > .ck-splitbutton__arrow {\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,":root{--ck-dropdown-max-width:75vw}.ck.ck-dropdown{display:inline-block;position:relative}.ck.ck-dropdown .ck-dropdown__arrow{pointer-events:none;z-index:var(--ck-z-default)}.ck.ck-dropdown .ck-button.ck-dropdown__button{width:100%}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on .ck-tooltip{display:none}.ck.ck-dropdown .ck-dropdown__panel{-webkit-backface-visibility:hidden;display:none;z-index:var(--ck-z-modal);max-width:var(--ck-dropdown-max-width);position:absolute}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel-visible{display:inline-block}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_n,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_ne,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nmw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nw{bottom:100%}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_s,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_smw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sw{top:100%;bottom:auto}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_ne,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se{left:0}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sw{right:0}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_n,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_s{left:50%;transform:translateX(-50%)}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nmw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_smw{left:75%;transform:translateX(-75%)}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sme{left:25%;transform:translateX(-25%)}.ck.ck-toolbar .ck-dropdown__panel{z-index:calc(var(--ck-z-modal) + 1)}:root{--ck-dropdown-arrow-size:calc(var(--ck-icon-size)*0.5)}.ck.ck-dropdown{font-size:inherit}.ck.ck-dropdown .ck-dropdown__arrow{width:var(--ck-dropdown-arrow-size)}[dir=ltr] .ck.ck-dropdown .ck-dropdown__arrow{right:var(--ck-spacing-standard);margin-left:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-dropdown .ck-dropdown__arrow{left:var(--ck-spacing-standard);margin-right:var(--ck-spacing-small)}.ck.ck-dropdown.ck-disabled .ck-dropdown__arrow{opacity:var(--ck-disabled-opacity)}[dir=ltr] .ck.ck-dropdown .ck-button.ck-dropdown__button:not(.ck-button_with-text){padding-left:var(--ck-spacing-small)}[dir=rtl] .ck.ck-dropdown .ck-button.ck-dropdown__button:not(.ck-button_with-text){padding-right:var(--ck-spacing-small)}.ck.ck-dropdown .ck-button.ck-dropdown__button .ck-button__label{width:7em;overflow:hidden;text-overflow:ellipsis}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-disabled .ck-button__label{opacity:var(--ck-disabled-opacity)}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on{border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-dropdown__button_label-width_auto .ck-button__label{width:auto}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-off:active,.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on:active{box-shadow:none}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-off:active:focus,.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on:active:focus{box-shadow:var(--ck-focus-outer-shadow),0 0}.ck.ck-dropdown__panel{border-radius:0}.ck-rounded-corners .ck.ck-dropdown__panel,.ck.ck-dropdown__panel.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-dropdown__panel{box-shadow:var(--ck-drop-shadow),0 0;background:var(--ck-color-dropdown-panel-background);border:1px solid var(--ck-color-dropdown-panel-border);bottom:0;min-width:100%}.ck.ck-dropdown__panel.ck-dropdown__panel_se{border-top-left-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_sw{border-top-right-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_ne{border-bottom-left-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_nw{border-bottom-right-radius:0}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/dropdown.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/mixins/_tooltip.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/dropdown.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_disabled.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,MACC,4BACD,CAEA,gBACC,oBAAqB,CACrB,iBAqFD,CAnFC,oCACC,mBAAoB,CACpB,2BACD,CAGA,+CACC,UAOD,CCUA,iEACC,YACD,CDVA,oCAGC,kCAAmC,CAEnC,YAAa,CACb,yBAA0B,CAC1B,sCAAuC,CAEvC,iBAyDD,CAvDC,+DACC,oBACD,CAEA,mSAKC,WACD,CAEA,mSASC,QAAS,CACT,WACD,CAEA,oHAEC,MACD,CAEA,oHAEC,OACD,CAEA,kHAGC,QAAS,CACT,0BACD,CAEA,sHAGC,QAAS,CACT,0BACD,CAEA,sHAGC,QAAS,CACT,0BACD,CAQF,mCACC,mCACD,CEhGA,MACC,sDACD,CAEA,gBAEC,iBA2ED,CAzEC,oCACC,mCACD,CAGC,8CACC,gCAAiC,CAGjC,sCACD,CAIA,8CACC,+BAAgC,CAGhC,oCACD,CAGD,gDC/BA,kCDiCA,CAIE,mFAEC,oCACD,CAIA,mFAEC,qCACD,CAID,iEACC,SAAU,CACV,eAAgB,CAChB,sBACD,CAGA,6EC1DD,kCD4DC,CAGA,qDACC,2BAA4B,CAC5B,4BACD,CAEA,sGACC,UACD,CAGA,yHAEC,eAKD,CAHC,qIE7EF,2CF+EE,CAKH,uBGlFC,eH8GD,CA5BA,qFG9EE,qCH0GF,CA5BA,uBEpFC,oCAA8B,CFwF9B,oDAAqD,CACrD,sDAAuD,CACvD,QAAS,CAGT,cAmBD,CAfC,6CACC,wBACD,CAEA,6CACC,yBACD,CAEA,6CACC,2BACD,CAEA,6CACC,4BACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import \"../tooltip/mixins/_tooltip.css\";\n\n:root {\n\t--ck-dropdown-max-width: 75vw;\n}\n\n.ck.ck-dropdown {\n\tdisplay: inline-block;\n\tposition: relative;\n\n\t& .ck-dropdown__arrow {\n\t\tpointer-events: none;\n\t\tz-index: var(--ck-z-default);\n\t}\n\n\t/* Dropdown button should span horizontally, e.g. in vertical toolbars */\n\t& .ck-button.ck-dropdown__button {\n\t\twidth: 100%;\n\n\t\t/* Disable main button's tooltip when the dropdown is open. Otherwise the panel may\n\t\tpartially cover the tooltip */\n\t\t&.ck-on {\n\t\t\t@mixin ck-tooltip_disabled;\n\t\t}\n\t}\n\n\t& .ck-dropdown__panel {\n\t\t/* This is to get rid of flickering when the tooltip is shown under the panel,\n\t\twhich looks like the panel moves vertically a pixel down and up. */\n\t\t-webkit-backface-visibility: hidden;\n\n\t\tdisplay: none;\n\t\tz-index: var(--ck-z-modal);\n\t\tmax-width: var(--ck-dropdown-max-width);\n\n\t\tposition: absolute;\n\n\t\t&.ck-dropdown__panel-visible {\n\t\t\tdisplay: inline-block;\n\t\t}\n\n\t\t&.ck-dropdown__panel_ne,\n\t\t&.ck-dropdown__panel_nw,\n\t\t&.ck-dropdown__panel_n,\n\t\t&.ck-dropdown__panel_nmw,\n\t\t&.ck-dropdown__panel_nme {\n\t\t\tbottom: 100%;\n\t\t}\n\n\t\t&.ck-dropdown__panel_se,\n\t\t&.ck-dropdown__panel_sw,\n\t\t&.ck-dropdown__panel_smw,\n\t\t&.ck-dropdown__panel_sme,\n\t\t&.ck-dropdown__panel_s {\n\t\t\t/*\n\t\t\t * Using transform: translate3d( 0, 100%, 0 ) causes blurry dropdown on Chrome 67-78+ on non-retina displays.\n\t\t\t * See https://github.com/ckeditor/ckeditor5/issues/1053.\n\t\t\t */\n\t\t\ttop: 100%;\n\t\t\tbottom: auto;\n\t\t}\n\n\t\t&.ck-dropdown__panel_ne,\n\t\t&.ck-dropdown__panel_se {\n\t\t\tleft: 0px;\n\t\t}\n\n\t\t&.ck-dropdown__panel_nw,\n\t\t&.ck-dropdown__panel_sw {\n\t\t\tright: 0px;\n\t\t}\n\n\t\t&.ck-dropdown__panel_s,\n\t\t&.ck-dropdown__panel_n {\n\t\t\t/* Positioning panels relative to the center of the button */\n\t\t\tleft: 50%;\n\t\t\ttransform: translateX(-50%);\n\t\t}\n\n\t\t&.ck-dropdown__panel_nmw,\n\t\t&.ck-dropdown__panel_smw {\n\t\t\t/* Positioning panels relative to the middle-west of the button */\n\t\t\tleft: 75%;\n\t\t\ttransform: translateX(-75%);\n\t\t}\n\n\t\t&.ck-dropdown__panel_nme,\n\t\t&.ck-dropdown__panel_sme {\n\t\t\t/* Positioning panels relative to the middle-east of the button */\n\t\t\tleft: 25%;\n\t\t\ttransform: translateX(-25%);\n\t\t}\n\t}\n}\n\n/*\n * Toolbar dropdown panels should be always above the UI (eg. other dropdown panels) from the editor's content.\n * See https://github.com/ckeditor/ckeditor5/issues/7874\n */\n.ck.ck-toolbar .ck-dropdown__panel {\n\tz-index: calc( var(--ck-z-modal) + 1 );\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Enables the tooltip, which is the tooltip is in DOM but\n * not yet displayed.\n */\n@define-mixin ck-tooltip_enabled {\n\t& .ck-tooltip {\n\t\tdisplay: block;\n\n\t\t/*\n\t\t * Don't display tooltips in devices which don't support :hover.\n\t\t * In fact, it's all about iOS, which forces user to click UI elements twice to execute\n\t\t * the primary action, when tooltips are enabled.\n\t\t *\n\t\t * Q: OK, but why not the following query?\n\t\t *\n\t\t * @media (hover) {\n\t\t * display: block;\n\t\t * }\n\t\t *\n\t\t * A: Because FF does not support it and it would completely disable tooltips\n\t\t * in that browser.\n\t\t *\n\t\t * More in https://github.com/ckeditor/ckeditor5/issues/920.\n\t\t */\n\t\t@media (hover:none) {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n/**\n * Disables the tooltip making it disappear from DOM.\n */\n@define-mixin ck-tooltip_disabled {\n\t& .ck-tooltip {\n\t\tdisplay: none;\n\t}\n}\n\n/**\n * Shows the tooltip, which is already in DOM.\n * Requires `ck-tooltip_enabled` first.\n */\n@define-mixin ck-tooltip_visible {\n\t& .ck-tooltip {\n\t\tvisibility: visible;\n\t\topacity: 1;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_shadow.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n:root {\n\t--ck-dropdown-arrow-size: calc(0.5 * var(--ck-icon-size));\n}\n\n.ck.ck-dropdown {\n\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\tfont-size: inherit;\n\n\t& .ck-dropdown__arrow {\n\t\twidth: var(--ck-dropdown-arrow-size);\n\t}\n\n\t@mixin ck-dir ltr {\n\t\t& .ck-dropdown__arrow {\n\t\t\tright: var(--ck-spacing-standard);\n\n\t\t\t/* A space to accommodate the triangle. */\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-dir rtl {\n\t\t& .ck-dropdown__arrow {\n\t\t\tleft: var(--ck-spacing-standard);\n\n\t\t\t/* A space to accommodate the triangle. */\n\t\t\tmargin-right: var(--ck-spacing-small);\n\t\t}\n\t}\n\n\t&.ck-disabled .ck-dropdown__arrow {\n\t\t@mixin ck-disabled;\n\t}\n\n\t& .ck-button.ck-dropdown__button {\n\t\t@mixin ck-dir ltr {\n\t\t\t&:not(.ck-button_with-text) {\n\t\t\t\t/* Make sure dropdowns with just an icon have the right inner spacing */\n\t\t\t\tpadding-left: var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\t&:not(.ck-button_with-text) {\n\t\t\t\t/* Make sure dropdowns with just an icon have the right inner spacing */\n\t\t\t\tpadding-right: var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\n\t\t/* #23 */\n\t\t& .ck-button__label {\n\t\t\twidth: 7em;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/70 */\n\t\t&.ck-disabled .ck-button__label {\n\t\t\t@mixin ck-disabled;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5/issues/816 */\n\t\t&.ck-on {\n\t\t\tborder-bottom-left-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\n\t\t&.ck-dropdown__button_label-width_auto .ck-button__label {\n\t\t\twidth: auto;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5/issues/8699 */\n\t\t&.ck-off:active,\n\t\t&.ck-on:active {\n\t\t\tbox-shadow: none;\n\t\t\t\n\t\t\t&:focus {\n\t\t\t\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\n\t\t\t}\n\t\t}\n\t}\n}\n\n.ck.ck-dropdown__panel {\n\t@mixin ck-rounded-corners;\n\t@mixin ck-drop-shadow;\n\n\tbackground: var(--ck-color-dropdown-panel-background);\n\tborder: 1px solid var(--ck-color-dropdown-panel-border);\n\tbottom: 0;\n\n\t/* Make sure the panel is at least as wide as the drop-down\'s button. */\n\tmin-width: 100%;\n\n\t/* Disabled corner border radius to be consistent with the .dropdown__button\n\thttps://github.com/ckeditor/ckeditor5/issues/816 */\n\t&.ck-dropdown__panel_se {\n\t\tborder-top-left-radius: 0;\n\t}\n\n\t&.ck-dropdown__panel_sw {\n\t\tborder-top-right-radius: 0;\n\t}\n\n\t&.ck-dropdown__panel_ne {\n\t\tborder-bottom-left-radius: 0;\n\t}\n\n\t&.ck-dropdown__panel_nw {\n\t\tborder-bottom-right-radius: 0;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which indicates that an element holding it is disabled.\n */\n@define-mixin ck-disabled {\n\topacity: var(--ck-disabled-opacity);\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-toolbar{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-flow:row nowrap;align-items:center}.ck.ck-toolbar>.ck-toolbar__items{display:flex;flex-flow:row wrap;align-items:center;flex-grow:1}.ck.ck-toolbar .ck.ck-toolbar__separator{display:inline-block}.ck.ck-toolbar .ck.ck-toolbar__separator:first-child,.ck.ck-toolbar .ck.ck-toolbar__separator:last-child{display:none}.ck.ck-toolbar .ck-toolbar__line-break{flex-basis:100%}.ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items{flex-wrap:nowrap}.ck.ck-toolbar.ck-toolbar_vertical>.ck-toolbar__items{flex-direction:column}.ck.ck-toolbar.ck-toolbar_floating>.ck-toolbar__items{flex-wrap:nowrap}.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown>.ck-dropdown__button .ck-dropdown__arrow{display:none}.ck.ck-toolbar{border-radius:0}.ck-rounded-corners .ck.ck-toolbar,.ck.ck-toolbar.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-toolbar{background:var(--ck-color-toolbar-background);padding:0 var(--ck-spacing-small);border:1px solid var(--ck-color-toolbar-border)}.ck.ck-toolbar .ck.ck-toolbar__separator{align-self:stretch;width:1px;min-width:1px;background:var(--ck-color-toolbar-border);margin-top:var(--ck-spacing-small);margin-bottom:var(--ck-spacing-small)}.ck.ck-toolbar .ck-toolbar__line-break{height:0}.ck.ck-toolbar>.ck-toolbar__items>:not(.ck-toolbar__line-break){margin-right:var(--ck-spacing-small)}.ck.ck-toolbar>.ck-toolbar__items:empty+.ck.ck-toolbar__separator{display:none}.ck.ck-toolbar>.ck-toolbar__items>:not(.ck-toolbar__line-break),.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown{margin-top:var(--ck-spacing-small);margin-bottom:var(--ck-spacing-small)}.ck.ck-toolbar.ck-toolbar_vertical{padding:0}.ck.ck-toolbar.ck-toolbar_vertical>.ck-toolbar__items>.ck{width:100%;margin:0;border-radius:0;border:0}.ck.ck-toolbar.ck-toolbar_compact{padding:0}.ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>*{margin:0}.ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>:not(:first-child):not(:last-child){border-radius:0}.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown>.ck.ck-button.ck-dropdown__button{padding-left:var(--ck-spacing-tiny)}.ck-toolbar-container .ck.ck-toolbar{border:0}.ck.ck-toolbar[dir=rtl]>.ck-toolbar__items>.ck,[dir=rtl] .ck.ck-toolbar>.ck-toolbar__items>.ck{margin-right:0}.ck.ck-toolbar[dir=rtl]:not(.ck-toolbar_compact)>.ck-toolbar__items>.ck,[dir=rtl] .ck.ck-toolbar:not(.ck-toolbar_compact)>.ck-toolbar__items>.ck{margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=rtl]>.ck-toolbar__items>.ck:last-child,[dir=rtl] .ck.ck-toolbar>.ck-toolbar__items>.ck:last-child{margin-left:0}.ck.ck-toolbar[dir=rtl].ck-toolbar_compact>.ck-toolbar__items>.ck:first-child,[dir=rtl] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.ck.ck-toolbar[dir=rtl].ck-toolbar_compact>.ck-toolbar__items>.ck:last-child,[dir=rtl] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:last-child{border-top-right-radius:0;border-bottom-right-radius:0}.ck.ck-toolbar[dir=rtl]>.ck.ck-toolbar__separator,[dir=rtl] .ck.ck-toolbar>.ck.ck-toolbar__separator{margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=rtl].ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child),[dir=rtl] .ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child){margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=ltr]>.ck-toolbar__items>.ck:last-child,[dir=ltr] .ck.ck-toolbar>.ck-toolbar__items>.ck:last-child{margin-right:0}.ck.ck-toolbar[dir=ltr].ck-toolbar_compact>.ck-toolbar__items>.ck:first-child,[dir=ltr] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.ck.ck-toolbar[dir=ltr].ck-toolbar_compact>.ck-toolbar__items>.ck:last-child,[dir=ltr] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.ck.ck-toolbar[dir=ltr]>.ck.ck-toolbar__separator,[dir=ltr] .ck.ck-toolbar>.ck.ck-toolbar__separator{margin-right:var(--ck-spacing-small)}.ck.ck-toolbar[dir=ltr].ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child),[dir=ltr] .ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child){margin-right:var(--ck-spacing-small)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/toolbar.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/toolbar/toolbar.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,eCEC,qBAAsB,CACtB,wBAAyB,CACzB,oBAAqB,CACrB,gBAAgB,CDFhB,YAAa,CACb,oBAAqB,CACrB,kBA6CD,CA3CC,kCACC,YAAa,CACb,kBAAmB,CACnB,kBAAmB,CACnB,WAED,CAEA,yCACC,oBAWD,CAJC,yGAEC,YACD,CAGD,uCACC,eACD,CAEA,sDACC,gBACD,CAEA,sDACC,qBACD,CAEA,sDACC,gBACD,CAGC,yFACC,YACD,CE/CF,eCGC,eD0FD,CA7FA,qECOE,qCDsFF,CA7FA,eAGC,6CAA8C,CAC9C,iCAAkC,CAClC,+CAwFD,CAtFC,yCACC,kBAAmB,CACnB,SAAU,CACV,aAAc,CACd,yCAA0C,CAM1C,kCAAmC,CACnC,qCACD,CAEA,uCACC,QACD,CAGC,gEAEC,oCACD,CAIA,kEACC,YACD,CAGD,gHAGC,kCAAmC,CACnC,qCACD,CAEA,mCAEC,SAgBD,CAbC,0DAEC,UAAW,CAGX,QAAS,CAGT,eAAgB,CAGhB,QACD,CAGD,kCAEC,SAWD,CATC,uDAEC,QAMD,CAHC,yFACC,eACD,CASD,kFACC,mCACD,CAvFF,qCA2FE,QAEF,CAYC,+FACC,cACD,CAEA,iJAEC,mCACD,CAEA,qHACC,aACD,CAIC,6JACC,wBAAyB,CACzB,2BACD,CAGA,2JACC,yBAA0B,CAC1B,4BACD,CAID,qGACC,mCACD,CAGA,yLACC,mCACD,CAWA,qHACC,cACD,CAIC,6JACC,yBAA0B,CAC1B,4BACD,CAGA,2JACC,wBAAyB,CACzB,2BACD,CAID,qGACC,oCACD,CAGA,yLACC,oCACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../mixins/_unselectable.css";\n\n.ck.ck-toolbar {\n\t@mixin ck-unselectable;\n\n\tdisplay: flex;\n\tflex-flow: row nowrap;\n\talign-items: center;\n\n\t& > .ck-toolbar__items {\n\t\tdisplay: flex;\n\t\tflex-flow: row wrap;\n\t\talign-items: center;\n\t\tflex-grow: 1;\n\n\t}\n\n\t& .ck.ck-toolbar__separator {\n\t\tdisplay: inline-block;\n\n\t\t/*\n\t\t * A leading or trailing separator makes no sense (separates from nothing on one side).\n\t\t * For instance, it can happen when toolbar items (also separators) are getting grouped one by one and\n\t\t * moved to another toolbar in the dropdown.\n\t\t */\n\t\t&:first-child,\n\t\t&:last-child {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t& .ck-toolbar__line-break {\n\t\tflex-basis: 100%;\n\t}\n\n\t&.ck-toolbar_grouping > .ck-toolbar__items {\n\t\tflex-wrap: nowrap;\n\t}\n\n\t&.ck-toolbar_vertical > .ck-toolbar__items {\n\t\tflex-direction: column;\n\t}\n\n\t&.ck-toolbar_floating > .ck-toolbar__items {\n\t\tflex-wrap: nowrap;\n\t}\n\n\t& > .ck.ck-toolbar__grouped-dropdown {\n\t\t& > .ck-dropdown__button .ck-dropdown__arrow {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Makes element unselectable.\n */\n@define-mixin ck-unselectable {\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-toolbar {\n\t@mixin ck-rounded-corners;\n\n\tbackground: var(--ck-color-toolbar-background);\n\tpadding: 0 var(--ck-spacing-small);\n\tborder: 1px solid var(--ck-color-toolbar-border);\n\n\t& .ck.ck-toolbar__separator {\n\t\talign-self: stretch;\n\t\twidth: 1px;\n\t\tmin-width: 1px;\n\t\tbackground: var(--ck-color-toolbar-border);\n\n\t\t/*\n\t\t * These margins make the separators look better in balloon toolbars (when aligned with the "tip").\n\t\t * See https://github.com/ckeditor/ckeditor5/issues/7493.\n\t\t */\n\t\tmargin-top: var(--ck-spacing-small);\n\t\tmargin-bottom: var(--ck-spacing-small);\n\t}\n\n\t& .ck-toolbar__line-break {\n\t\theight: 0;\n\t}\n\n\t& > .ck-toolbar__items {\n\t\t& > *:not(.ck-toolbar__line-break) {\n\t\t\t/* (#11) Separate toolbar items. */\n\t\t\tmargin-right: var(--ck-spacing-small);\n\t\t}\n\n\t\t/* Don\'t display a separator after an empty items container, for instance,\n\t\twhen all items were grouped */\n\t\t&:empty + .ck.ck-toolbar__separator {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t& > .ck-toolbar__items > *:not(.ck-toolbar__line-break),\n\t& > .ck.ck-toolbar__grouped-dropdown {\n\t\t/* Make sure items wrapped to the next line have v-spacing */\n\t\tmargin-top: var(--ck-spacing-small);\n\t\tmargin-bottom: var(--ck-spacing-small);\n\t}\n\n\t&.ck-toolbar_vertical {\n\t\t/* Items in a vertical toolbar span the entire width. */\n\t\tpadding: 0;\n\n\t\t/* Specificity matters here. See https://github.com/ckeditor/ckeditor5-theme-lark/issues/168. */\n\t\t& > .ck-toolbar__items > .ck {\n\t\t\t/* Items in a vertical toolbar should span the horizontal space. */\n\t\t\twidth: 100%;\n\n\t\t\t/* Items in a vertical toolbar should have no margin. */\n\t\t\tmargin: 0;\n\n\t\t\t/* Items in a vertical toolbar span the entire width so rounded corners are pointless. */\n\t\t\tborder-radius: 0;\n\n\t\t\t/* Items in a vertical toolbar span the entire width so any border is pointless. */\n\t\t\tborder: 0;\n\t\t}\n\t}\n\n\t&.ck-toolbar_compact {\n\t\t/* No spacing around items. */\n\t\tpadding: 0;\n\n\t\t& > .ck-toolbar__items > * {\n\t\t\t/* Compact toolbar items have no spacing between them. */\n\t\t\tmargin: 0;\n\n\t\t\t/* "Middle" children should have no rounded corners. */\n\t\t\t&:not(:first-child):not(:last-child) {\n\t\t\t\tborder-radius: 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t& > .ck.ck-toolbar__grouped-dropdown {\n\t\t/*\n\t\t * Dropdown button has asymmetric padding to fit the arrow.\n\t\t * This button has no arrow so let\'s revert that padding back to normal.\n\t\t */\n\t\t& > .ck.ck-button.ck-dropdown__button {\n\t\t\tpadding-left: var(--ck-spacing-tiny);\n\t\t}\n\t}\n\n\t@nest .ck-toolbar-container & {\n\t\tborder: 0;\n\t}\n}\n\n/* stylelint-disable */\n\n/*\n * Styles for RTL toolbars.\n *\n * Note: In some cases (e.g. a decoupled editor), the toolbar has its own "dir"\n * because its parent is not controlled by the editor framework.\n */\n[dir="rtl"] .ck.ck-toolbar,\n.ck.ck-toolbar[dir="rtl"] {\n\t& > .ck-toolbar__items > .ck {\n\t\tmargin-right: 0;\n\t}\n\n\t&:not(.ck-toolbar_compact) > .ck-toolbar__items > .ck {\n\t\t/* (#11) Separate toolbar items. */\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n\n\t& > .ck-toolbar__items > .ck:last-child {\n\t\tmargin-left: 0;\n\t}\n\n\t&.ck-toolbar_compact > .ck-toolbar__items > .ck {\n\t\t/* No rounded corners on the right side of the first child. */\n\t\t&:first-child {\n\t\t\tborder-top-left-radius: 0;\n\t\t\tborder-bottom-left-radius: 0;\n\t\t}\n\n\t\t/* No rounded corners on the left side of the last child. */\n\t\t&:last-child {\n\t\t\tborder-top-right-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\t}\n\n\t/* Separate the the separator form the grouping dropdown when some items are grouped. */\n\t& > .ck.ck-toolbar__separator {\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n\n\t/* Some spacing between the items and the separator before the grouped items dropdown. */\n\t&.ck-toolbar_grouping > .ck-toolbar__items:not(:empty):not(:only-child) {\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n}\n\n/*\n * Styles for LTR toolbars.\n *\n * Note: In some cases (e.g. a decoupled editor), the toolbar has its own "dir"\n * because its parent is not controlled by the editor framework.\n */\n[dir="ltr"] .ck.ck-toolbar,\n.ck.ck-toolbar[dir="ltr"] {\n\t& > .ck-toolbar__items > .ck:last-child {\n\t\tmargin-right: 0;\n\t}\n\n\t&.ck-toolbar_compact > .ck-toolbar__items > .ck {\n\t\t/* No rounded corners on the right side of the first child. */\n\t\t&:first-child {\n\t\t\tborder-top-right-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\n\t\t/* No rounded corners on the left side of the last child. */\n\t\t&:last-child {\n\t\t\tborder-top-left-radius: 0;\n\t\t\tborder-bottom-left-radius: 0;\n\t\t}\n\t}\n\n\t/* Separate the the separator form the grouping dropdown when some items are grouped. */\n\t& > .ck.ck-toolbar__separator {\n\t\tmargin-right: var(--ck-spacing-small);\n\t}\n\n\t/* Some spacing between the items and the separator before the grouped items dropdown. */\n\t&.ck-toolbar_grouping > .ck-toolbar__items:not(:empty):not(:only-child) {\n\t\tmargin-right: var(--ck-spacing-small);\n\t}\n}\n\n/* stylelint-enable */\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-list{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-direction:column}.ck.ck-list .ck-list__item,.ck.ck-list .ck-list__separator{display:block}.ck.ck-list .ck-list__item>:focus{position:relative;z-index:var(--ck-z-default)}.ck.ck-list{border-radius:0}.ck-rounded-corners .ck.ck-list,.ck.ck-list.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-list{list-style-type:none;background:var(--ck-color-list-background)}.ck.ck-list__item{cursor:default;min-width:12em}.ck.ck-list__item .ck-button{min-height:unset;width:100%;text-align:left;border-radius:0;padding:calc(var(--ck-line-height-base)*0.2*var(--ck-font-size-base)) calc(var(--ck-line-height-base)*0.4*var(--ck-font-size-base))}.ck.ck-list__item .ck-button .ck-button__label{line-height:calc(var(--ck-line-height-base)*1.2*var(--ck-font-size-base))}.ck.ck-list__item .ck-button:active{box-shadow:none}.ck.ck-list__item .ck-button.ck-on{background:var(--ck-color-list-button-on-background);color:var(--ck-color-list-button-on-text)}.ck.ck-list__item .ck-button.ck-on:active{box-shadow:none}.ck.ck-list__item .ck-button.ck-on:hover:not(.ck-disabled){background:var(--ck-color-list-button-on-background-focus)}.ck.ck-list__item .ck-button.ck-on:focus:not(.ck-disabled){border-color:var(--ck-color-base-background)}.ck.ck-list__item .ck-button:hover:not(.ck-disabled){background:var(--ck-color-list-button-hover-background)}.ck.ck-list__item .ck-switchbutton.ck-on{background:var(--ck-color-list-background);color:inherit}.ck.ck-list__item .ck-switchbutton.ck-on:hover:not(.ck-disabled){background:var(--ck-color-list-button-hover-background);color:inherit}.ck.ck-list__separator{height:1px;width:100%;background:var(--ck-color-base-border)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/list/list.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/list/list.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,YCEC,qBAAsB,CACtB,wBAAyB,CACzB,oBAAqB,CACrB,gBAAgB,CDFhB,YAAa,CACb,qBAcD,CAZC,2DAEC,aACD,CAKA,kCACC,iBAAkB,CAClB,2BACD,CEfD,YCEC,eDGD,CALA,+DCME,qCDDF,CALA,YAGC,oBAAqB,CACrB,0CACD,CAEA,kBACC,cAAe,CACf,cA2DD,CAzDC,6BACC,gBAAiB,CACjB,UAAW,CACX,eAAgB,CAChB,eAAgB,CAKhB,mIAiCD,CA7BC,+CAEC,yEACD,CAEA,oCACC,eACD,CAEA,mCACC,oDAAqD,CACrD,yCAaD,CAXC,0CACC,eACD,CAEA,2DACC,0DACD,CAEA,2DACC,4CACD,CAGD,qDACC,uDACD,CAMA,yCACC,0CAA2C,CAC3C,aAMD,CAJC,iEACC,uDAAwD,CACxD,aACD,CAKH,uBACC,UAAW,CACX,UAAW,CACX,sCACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../mixins/_unselectable.css";\n\n.ck.ck-list {\n\t@mixin ck-unselectable;\n\n\tdisplay: flex;\n\tflex-direction: column;\n\n\t& .ck-list__item,\n\t& .ck-list__separator {\n\t\tdisplay: block;\n\t}\n\n\t/* Make sure that whatever child of the list item gets focus, it remains on the\n\ttop. Thanks to that, styles like box-shadow, outline, etc. are not masked by\n\tadjacent list items. */\n\t& .ck-list__item > *:focus {\n\t\tposition: relative;\n\t\tz-index: var(--ck-z-default);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Makes element unselectable.\n */\n@define-mixin ck-unselectable {\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_shadow.css";\n\n.ck.ck-list {\n\t@mixin ck-rounded-corners;\n\n\tlist-style-type: none;\n\tbackground: var(--ck-color-list-background);\n}\n\n.ck.ck-list__item {\n\tcursor: default;\n\tmin-width: 12em;\n\n\t& .ck-button {\n\t\tmin-height: unset;\n\t\twidth: 100%;\n\t\ttext-align: left;\n\t\tborder-radius: 0;\n\n\t\t/* List items should have the same height. Use absolute units to make sure it is so\n\t\t because e.g. different heading styles may have different height\n\t\t https://github.com/ckeditor/ckeditor5-heading/issues/63 */\n\t\tpadding:\n\t\t\tcalc(.2 * var(--ck-line-height-base) * var(--ck-font-size-base))\n\t\t\tcalc(.4 * var(--ck-line-height-base) * var(--ck-font-size-base));\n\n\t\t& .ck-button__label {\n\t\t\t/* https://github.com/ckeditor/ckeditor5-heading/issues/63 */\n\t\t\tline-height: calc(1.2 * var(--ck-line-height-base) * var(--ck-font-size-base));\n\t\t}\n\n\t\t&:active {\n\t\t\tbox-shadow: none;\n\t\t}\n\n\t\t&.ck-on {\n\t\t\tbackground: var(--ck-color-list-button-on-background);\n\t\t\tcolor: var(--ck-color-list-button-on-text);\n\n\t\t\t&:active {\n\t\t\t\tbox-shadow: none;\n\t\t\t}\n\n\t\t\t&:hover:not(.ck-disabled) {\n\t\t\t\tbackground: var(--ck-color-list-button-on-background-focus);\n\t\t\t}\n\n\t\t\t&:focus:not(.ck-disabled) {\n\t\t\t\tborder-color: var(--ck-color-base-background);\n\t\t\t}\n\t\t}\n\n\t\t&:hover:not(.ck-disabled) {\n\t\t\tbackground: var(--ck-color-list-button-hover-background);\n\t\t}\n\t}\n\n\t/* It\'s unnecessary to change the background/text of a switch toggle; it has different ways\n\tof conveying its state (like the switcher) */\n\t& .ck-switchbutton {\n\t\t&.ck-on {\n\t\t\tbackground: var(--ck-color-list-background);\n\t\t\tcolor: inherit;\n\n\t\t\t&:hover:not(.ck-disabled) {\n\t\t\t\tbackground: var(--ck-color-list-button-hover-background);\n\t\t\t\tcolor: inherit;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.ck.ck-list__separator {\n\theight: 1px;\n\twidth: 100%;\n\tbackground: var(--ck-color-base-border);\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,":root{--ck-toolbar-dropdown-max-width:60vw}.ck.ck-toolbar-dropdown>.ck-dropdown__panel{width:max-content;max-width:var(--ck-toolbar-dropdown-max-width)}.ck.ck-toolbar-dropdown>.ck-dropdown__panel .ck-button:focus{z-index:calc(var(--ck-z-default) + 1)}.ck.ck-toolbar-dropdown .ck-toolbar{border:0}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/toolbardropdown.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/toolbardropdown.css"],names:[],mappings:"AAKA,MACC,oCACD,CAEA,4CAEC,iBAAkB,CAClB,8CAOD,CAJE,6DACC,qCACD,CCZF,oCACC,QACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-toolbar-dropdown-max-width: 60vw;\n}\n\n.ck.ck-toolbar-dropdown > .ck-dropdown__panel {\n\t/* https://github.com/ckeditor/ckeditor5/issues/5586 */\n\twidth: max-content;\n\tmax-width: var(--ck-toolbar-dropdown-max-width);\n\n\t& .ck-button {\n\t\t&:focus {\n\t\t\tz-index: calc(var(--ck-z-default) + 1);\n\t\t}\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-toolbar-dropdown .ck-toolbar {\n\tborder: 0;\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-dropdown .ck-dropdown__panel .ck-list{border-radius:0}.ck-rounded-corners .ck.ck-dropdown .ck-dropdown__panel .ck-list,.ck.ck-dropdown .ck-dropdown__panel .ck-list.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0}.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:first-child .ck-button{border-radius:0}.ck-rounded-corners .ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:first-child .ck-button,.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:first-child .ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:last-child .ck-button{border-radius:0}.ck-rounded-corners .ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:last-child .ck-button,.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:last-child .ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/listdropdown.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,6CCIC,eDqBD,CAzBA,iICQE,qCAAsC,CDJtC,wBAqBF,CAfE,mFCND,eDYC,CANA,6MCFA,qCAAsC,CDIpC,wBAAyB,CACzB,2BAA4B,CAC5B,4BAEF,CAEA,kFCdD,eDmBC,CALA,2MCVA,qCAAsC,CDYpC,wBAAyB,CACzB,yBAEF",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n.ck.ck-dropdown .ck-dropdown__panel .ck-list {\n\t/* Disabled radius of top-left border to be consistent with .dropdown__button\n\thttps://github.com/ckeditor/ckeditor5/issues/816 */\n\t@mixin ck-rounded-corners {\n\t\tborder-top-left-radius: 0;\n\t}\n\n\t/* Make sure the button belonging to the first/last child of the list goes well with the\n\tborder radius of the entire panel. */\n\t& .ck-list__item {\n\t\t&:first-child .ck-button {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\t\t}\n\n\t\t&:last-child .ck-button {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\tborder-top-right-radius: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,":root{--ck-color-editable-blur-selection:#d9d9d9}.ck.ck-editor__editable:not(.ck-editor__nested-editable){border-radius:0}.ck-rounded-corners .ck.ck-editor__editable:not(.ck-editor__nested-editable),.ck.ck-editor__editable:not(.ck-editor__nested-editable).ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-editor__editable:not(.ck-editor__nested-editable).ck-focused{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0}.ck.ck-editor__editable_inline{overflow:auto;padding:0 var(--ck-spacing-standard);border:1px solid transparent}.ck.ck-editor__editable_inline[dir=ltr]{text-align:left}.ck.ck-editor__editable_inline[dir=rtl]{text-align:right}.ck.ck-editor__editable_inline>:first-child{margin-top:var(--ck-spacing-large)}.ck.ck-editor__editable_inline>:last-child{margin-bottom:var(--ck-spacing-large)}.ck.ck-editor__editable_inline.ck-blurred ::selection{background:var(--ck-color-editable-blur-selection)}.ck.ck-balloon-panel.ck-toolbar-container[class*=arrow_n]:after{border-bottom-color:var(--ck-color-base-foreground)}.ck.ck-balloon-panel.ck-toolbar-container[class*=arrow_s]:after{border-top-color:var(--ck-color-base-foreground)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/editorui/editorui.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAWA,MACC,0CACD,CAEA,yDCJC,eDWD,CAPA,yJCAE,qCDOF,CAJC,oEERA,YAAa,CACb,2BAA2B,CCF3B,qCHYA,CAGD,+BACC,aAAc,CACd,oCAAqC,CACrC,4BAwBD,CAtBC,wCACC,eACD,CAEA,wCACC,gBACD,CAGA,4CACC,kCACD,CAGA,2CACC,qCACD,CAGA,sDACC,kDACD,CAKA,gEACC,mDACD,CAIA,gEACC,gDACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_shadow.css";\n@import "../../../mixins/_focus.css";\n@import "../../mixins/_button.css";\n\n:root {\n\t--ck-color-editable-blur-selection: hsl(0, 0%, 85%);\n}\n\n.ck.ck-editor__editable:not(.ck-editor__nested-editable) {\n\t@mixin ck-rounded-corners;\n\n\t&.ck-focused {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-inner-shadow);\n\t}\n}\n\n.ck.ck-editor__editable_inline {\n\toverflow: auto;\n\tpadding: 0 var(--ck-spacing-standard);\n\tborder: 1px solid transparent;\n\n\t&[dir="ltr"] {\n\t\ttext-align: left;\n\t}\n\n\t&[dir="rtl"] {\n\t\ttext-align: right;\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/116 */\n\t& > *:first-child {\n\t\tmargin-top: var(--ck-spacing-large);\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5/issues/847 */\n\t& > *:last-child {\n\t\tmargin-bottom: var(--ck-spacing-large);\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5/issues/6517 */\n\t&.ck-blurred ::selection {\n\t\tbackground: var(--ck-color-editable-blur-selection);\n\t}\n}\n\n/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/111 */\n.ck.ck-balloon-panel.ck-toolbar-container[class*="arrow_n"] {\n\t&::after {\n\t\tborder-bottom-color: var(--ck-color-base-foreground);\n\t}\n}\n\n.ck.ck-balloon-panel.ck-toolbar-container[class*="arrow_s"] {\n\t&::after {\n\t\tborder-top-color: var(--ck-color-base-foreground);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-label{display:block}.ck.ck-voice-label{display:none}.ck.ck-label{font-weight:700}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/label/label.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/label/label.css"],names:[],mappings:"AAKA,aACC,aACD,CAEA,mBACC,YACD,CCNA,aACC,eACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-label {\n\tdisplay: block;\n}\n\n.ck.ck-voice-label {\n\tdisplay: none;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-label {\n\tfont-weight: bold;\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-form__header{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:space-between}:root{--ck-form-header-height:38px}.ck.ck-form__header{padding:var(--ck-spacing-small) var(--ck-spacing-large);height:var(--ck-form-header-height);line-height:var(--ck-form-header-height);border-bottom:1px solid var(--ck-color-base-border)}.ck.ck-form__header .ck-form__header__label{font-weight:700}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/formheader/formheader.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/formheader/formheader.css"],names:[],mappings:"AAKA,oBACC,YAAa,CACb,kBAAmB,CACnB,gBAAiB,CACjB,kBAAmB,CACnB,6BACD,CCNA,MACC,4BACD,CAEA,oBACC,uDAAwD,CACxD,mCAAoC,CACpC,wCAAyC,CACzC,mDAKD,CAHC,4CACC,eACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-form__header {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-form-header-height: 38px;\n}\n\n.ck.ck-form__header {\n\tpadding: var(--ck-spacing-small) var(--ck-spacing-large);\n\theight: var(--ck-form-header-height);\n\tline-height: var(--ck-form-header-height);\n\tborder-bottom: 1px solid var(--ck-color-base-border);\n\n\t& .ck-form__header__label {\n\t\tfont-weight: bold;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,":root{--ck-input-text-width:18em}.ck.ck-input-text{border-radius:0}.ck-rounded-corners .ck.ck-input-text,.ck.ck-input-text.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-input-text{background:var(--ck-color-input-background);border:1px solid var(--ck-color-input-border);padding:var(--ck-spacing-extra-tiny) var(--ck-spacing-medium);min-width:var(--ck-input-text-width);min-height:var(--ck-ui-component-min-height);transition:box-shadow .1s ease-in-out,border .1s ease-in-out}.ck.ck-input-text:focus{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-focus-outer-shadow),0 0}.ck.ck-input-text[readonly]{border:1px solid var(--ck-color-input-disabled-border);background:var(--ck-color-input-disabled-background);color:var(--ck-color-input-disabled-text)}.ck.ck-input-text[readonly]:focus{box-shadow:var(--ck-focus-disabled-outer-shadow),0 0}.ck.ck-input-text.ck-error{border-color:var(--ck-color-input-error-border);animation:ck-text-input-shake .3s ease both}.ck.ck-input-text.ck-error:focus{box-shadow:var(--ck-focus-error-outer-shadow),0 0}@keyframes ck-text-input-shake{20%{transform:translateX(-2px)}40%{transform:translateX(2px)}60%{transform:translateX(-1px)}80%{transform:translateX(1px)}}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/inputtext/inputtext.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AASA,MACC,0BACD,CAEA,kBCFC,eDwCD,CAtCA,2ECEE,qCDoCF,CAtCA,kBAGC,2CAA4C,CAC5C,6CAA8C,CAC9C,6DAA8D,CAC9D,oCAAqC,CAGrC,4CAA6C,CAG7C,4DA0BD,CAxBC,wBEjBA,YAAa,CACb,2BAA2B,CCF3B,2CHqBA,CAEA,4BACC,sDAAuD,CACvD,oDAAqD,CACrD,yCAMD,CAJC,kCG5BD,oDH+BC,CAGD,2BACC,+CAAgD,CAChD,2CAKD,CAHC,iCGtCD,iDHwCC,CAIF,+BACC,IACC,0BACD,CAEA,IACC,yBACD,CAEA,IACC,0BACD,CAEA,IACC,yBACD,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_focus.css";\n@import "../../../mixins/_shadow.css";\n\n:root {\n\t--ck-input-text-width: 18em;\n}\n\n.ck.ck-input-text {\n\t@mixin ck-rounded-corners;\n\n\tbackground: var(--ck-color-input-background);\n\tborder: 1px solid var(--ck-color-input-border);\n\tpadding: var(--ck-spacing-extra-tiny) var(--ck-spacing-medium);\n\tmin-width: var(--ck-input-text-width);\n\n\t/* This is important to stay of the same height as surrounding buttons */\n\tmin-height: var(--ck-ui-component-min-height);\n\n\t/* Apply some smooth transition to the box-shadow and border. */\n\ttransition: box-shadow .1s ease-in-out, border .1s ease-in-out;\n\n\t&:focus {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\n\t}\n\n\t&[readonly] {\n\t\tborder: 1px solid var(--ck-color-input-disabled-border);\n\t\tbackground: var(--ck-color-input-disabled-background);\n\t\tcolor: var(--ck-color-input-disabled-text);\n\n\t\t&:focus {\n\t\t\t/* The read-only input should have a slightly less visible shadow when focused. */\n\t\t\t@mixin ck-box-shadow var(--ck-focus-disabled-outer-shadow);\n\t\t}\n\t}\n\n\t&.ck-error {\n\t\tborder-color: var(--ck-color-input-error-border);\n\t\tanimation: ck-text-input-shake .3s ease both;\n\n\t\t&:focus {\n\t\t\t@mixin ck-box-shadow var(--ck-focus-error-outer-shadow);\n\t\t}\n\t}\n}\n\n@keyframes ck-text-input-shake {\n\t20% {\n\t\ttransform: translateX(-2px);\n\t}\n\n\t40% {\n\t\ttransform: translateX(2px);\n\t}\n\n\t60% {\n\t\ttransform: translateX(-1px);\n\t}\n\n\t80% {\n\t\ttransform: translateX(1px);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper{display:flex;position:relative}.ck.ck-labeled-field-view .ck.ck-label{display:block;position:absolute}:root{--ck-labeled-field-view-transition:.1s cubic-bezier(0,0,0.24,0.95);--ck-labeled-field-empty-unfocused-max-width:100% - 2 * var(--ck-spacing-medium);--ck-color-labeled-field-label-background:var(--ck-color-base-background)}.ck.ck-labeled-field-view{border-radius:0}.ck-rounded-corners .ck.ck-labeled-field-view,.ck.ck-labeled-field-view.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper{width:100%}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{top:0}[dir=ltr] .ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{left:0}[dir=rtl] .ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{right:0}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{pointer-events:none;transform-origin:0 0;transform:translate(var(--ck-spacing-medium),-6px) scale(.75);background:var(--ck-color-labeled-field-label-background);padding:0 calc(var(--ck-font-size-tiny)*0.5);line-height:normal;font-weight:400;text-overflow:ellipsis;overflow:hidden;max-width:100%;transition:transform var(--ck-labeled-field-view-transition),padding var(--ck-labeled-field-view-transition),background var(--ck-labeled-field-view-transition)}.ck.ck-labeled-field-view.ck-error .ck-input:not([readonly])+.ck.ck-label,.ck.ck-labeled-field-view.ck-error>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{color:var(--ck-color-base-error)}.ck.ck-labeled-field-view .ck-labeled-field-view__status{font-size:var(--ck-font-size-small);margin-top:var(--ck-spacing-small);white-space:normal}.ck.ck-labeled-field-view .ck-labeled-field-view__status.ck-labeled-field-view__status_error{color:var(--ck-color-base-error)}.ck.ck-labeled-field-view.ck-disabled>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{color:var(--ck-color-input-disabled-text)}[dir=ltr] .ck.ck-labeled-field-view.ck-disabled>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,[dir=ltr] .ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{transform:translate(var(--ck-spacing-medium),calc(var(--ck-font-size-base)*0.6)) scale(1)}[dir=rtl] .ck.ck-labeled-field-view.ck-disabled>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,[dir=rtl] .ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{transform:translate(calc(var(--ck-spacing-medium)*-1),calc(var(--ck-font-size-base)*0.6)) scale(1)}.ck.ck-labeled-field-view.ck-disabled>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{max-width:calc(var(--ck-labeled-field-empty-unfocused-max-width));background:transparent;padding:0}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown>.ck.ck-button{background:transparent}.ck.ck-labeled-field-view.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown>.ck-button>.ck-button__label{opacity:0}.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown+.ck-label{max-width:calc(var(--ck-labeled-field-empty-unfocused-max-width) - var(--ck-dropdown-arrow-size) - var(--ck-spacing-standard))}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/labeledfield/labeledfieldview.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAMC,mEACC,YAAa,CACb,iBACD,CAEA,uCACC,aAAc,CACd,iBACD,CCND,MACC,kEAAsE,CACtE,gFAAiF,CACjF,yEACD,CAEA,0BCHC,eD4GD,CAzGA,2FCCE,qCDwGF,CAtGC,mEACC,UAmCD,CAjCC,gFACC,KA+BD,CAhCA,0FAIE,MA4BF,CAhCA,0FAQE,OAwBF,CAhCA,gFAWC,mBAAoB,CACpB,oBAAqB,CAGrB,6DAA+D,CAE/D,yDAA0D,CAC1D,4CAA8C,CAC9C,kBAAoB,CACpB,eAAmB,CAGnB,sBAAuB,CACvB,eAAgB,CAEhB,cAAe,CAEf,+JAID,CAQA,mKACC,gCACD,CAGD,yDACC,mCAAoC,CACpC,kCAAmC,CAInC,kBAKD,CAHC,6FACC,gCACD,CAID,4OAEC,yCACD,CAIA,wSAGE,yFAYF,CAfA,wSAOE,kGAQF,CAfA,oRAWC,iEAAkE,CAElE,sBAAuB,CACvB,SACD,CAKA,8FACC,sBACD,CAGA,yIACC,SACD,CAGA,kMACC,8HACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-labeled-field-view {\n\t& > .ck.ck-labeled-field-view__input-wrapper {\n\t\tdisplay: flex;\n\t\tposition: relative;\n\t}\n\n\t& .ck.ck-label {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n@import "../../../mixins/_rounded.css";\n\n:root {\n\t--ck-labeled-field-view-transition: .1s cubic-bezier(0, 0, 0.24, 0.95);\n\t--ck-labeled-field-empty-unfocused-max-width: 100% - 2 * var(--ck-spacing-medium);\n\t--ck-color-labeled-field-label-background: var(--ck-color-base-background);\n}\n\n.ck.ck-labeled-field-view {\n\t@mixin ck-rounded-corners;\n\n\t& > .ck.ck-labeled-field-view__input-wrapper {\n\t\twidth: 100%;\n\n\t\t& > .ck.ck-label {\n\t\t\ttop: 0px;\n\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tleft: 0px;\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tright: 0px;\n\t\t\t}\n\n\t\t\tpointer-events: none;\n\t\t\ttransform-origin: 0 0;\n\n\t\t\t/* By default, display the label scaled down above the field. */\n\t\t\ttransform: translate(var(--ck-spacing-medium), -6px) scale(.75);\n\n\t\t\tbackground: var(--ck-color-labeled-field-label-background);\n\t\t\tpadding: 0 calc(.5 * var(--ck-font-size-tiny));\n\t\t\tline-height: initial;\n\t\t\tfont-weight: normal;\n\n\t\t\t/* Prevent overflow when the label is longer than the input */\n\t\t\ttext-overflow: ellipsis;\n\t\t\toverflow: hidden;\n\n\t\t\tmax-width: 100%;\n\n\t\t\ttransition:\n\t\t\t\ttransform var(--ck-labeled-field-view-transition),\n\t\t\t\tpadding var(--ck-labeled-field-view-transition),\n\t\t\t\tbackground var(--ck-labeled-field-view-transition);\n\t\t}\n\t}\n\n\t&.ck-error {\n\t\t& > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label {\n\t\t\tcolor: var(--ck-color-base-error);\n\t\t}\n\n\t\t& .ck-input:not([readonly]) + .ck.ck-label {\n\t\t\tcolor: var(--ck-color-base-error);\n\t\t}\n\t}\n\n\t& .ck-labeled-field-view__status {\n\t\tfont-size: var(--ck-font-size-small);\n\t\tmargin-top: var(--ck-spacing-small);\n\n\t\t/* Let the info wrap to the next line to avoid stretching the layout horizontally.\n\t\tThe status could be very long. */\n\t\twhite-space: normal;\n\n\t\t&.ck-labeled-field-view__status_error {\n\t\t\tcolor: var(--ck-color-base-error);\n\t\t}\n\t}\n\n\t/* Disabled fields and fields that have no focus should fade out. */\n\t&.ck-disabled > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label,\n\t&.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused) > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label {\n\t\tcolor: var(--ck-color-input-disabled-text);\n\t}\n\n\t/* Fields that are disabled or not focused and without a placeholder should have full-sized labels. */\n\t/* stylelint-disable-next-line no-descending-specificity */\n\t&.ck-disabled > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label,\n\t&.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder) > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label {\n\t\t@mixin ck-dir ltr {\n\t\t\ttransform: translate(var(--ck-spacing-medium), calc(0.6 * var(--ck-font-size-base))) scale(1);\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\ttransform: translate(calc(-1 * var(--ck-spacing-medium)), calc(0.6 * var(--ck-font-size-base))) scale(1);\n\t\t}\n\n\t\t/* Compensate for the default translate position. */\n\t\tmax-width: calc(var(--ck-labeled-field-empty-unfocused-max-width));\n\n\t\tbackground: transparent;\n\t\tpadding: 0;\n\t}\n\n\t/*------ DropdownView integration ----------------------------------------------------------------------------------- */\n\n\t/* Make sure dropdown\' background color in any of dropdown\'s state does not collide with labeled field. */\n\t& > .ck.ck-labeled-field-view__input-wrapper > .ck-dropdown > .ck.ck-button {\n\t\tbackground: transparent;\n\t}\n\n\t/* When the dropdown is "empty", the labeled field label replaces its label. */\n\t&.ck-labeled-field-view_empty > .ck.ck-labeled-field-view__input-wrapper > .ck-dropdown > .ck-button > .ck-button__label {\n\t\topacity: 0;\n\t}\n\n\t/* Make sure the label of the empty, unfocused input does not cover the dropdown arrow. */\n\t&.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder) > .ck.ck-labeled-field-view__input-wrapper > .ck-dropdown + .ck-label {\n\t\tmax-width: calc(var(--ck-labeled-field-empty-unfocused-max-width) - var(--ck-dropdown-arrow-size) - var(--ck-spacing-standard));\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,':root{--ck-balloon-panel-arrow-z-index:calc(var(--ck-z-default) - 3)}.ck.ck-balloon-panel{display:none;position:absolute;z-index:var(--ck-z-modal)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after,.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{content:"";position:absolute}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel[class*=arrow_n]:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel[class*=arrow_n]:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel[class*=arrow_s]:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel[class*=arrow_s]:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel.ck-balloon-panel_visible{display:block}:root{--ck-balloon-arrow-offset:2px;--ck-balloon-arrow-height:10px;--ck-balloon-arrow-half-width:8px;--ck-balloon-arrow-drop-shadow:0 2px 2px var(--ck-color-shadow-drop)}.ck.ck-balloon-panel{border-radius:0}.ck-rounded-corners .ck.ck-balloon-panel,.ck.ck-balloon-panel.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-balloon-panel{box-shadow:var(--ck-drop-shadow),0 0;min-height:15px;background:var(--ck-color-panel-background);border:1px solid var(--ck-color-panel-border)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after,.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{width:0;height:0;border-style:solid}.ck.ck-balloon-panel[class*=arrow_n]:after,.ck.ck-balloon-panel[class*=arrow_n]:before{border-left-width:var(--ck-balloon-arrow-half-width);border-bottom-width:var(--ck-balloon-arrow-height);border-right-width:var(--ck-balloon-arrow-half-width);border-top-width:0}.ck.ck-balloon-panel[class*=arrow_n]:before{border-bottom-color:var(--ck-color-panel-border)}.ck.ck-balloon-panel[class*=arrow_n]:after,.ck.ck-balloon-panel[class*=arrow_n]:before{border-left-color:transparent;border-right-color:transparent;border-top-color:transparent}.ck.ck-balloon-panel[class*=arrow_n]:after{border-bottom-color:var(--ck-color-panel-background);margin-top:var(--ck-balloon-arrow-offset)}.ck.ck-balloon-panel[class*=arrow_s]:after,.ck.ck-balloon-panel[class*=arrow_s]:before{border-left-width:var(--ck-balloon-arrow-half-width);border-bottom-width:0;border-right-width:var(--ck-balloon-arrow-half-width);border-top-width:var(--ck-balloon-arrow-height)}.ck.ck-balloon-panel[class*=arrow_s]:before{border-top-color:var(--ck-color-panel-border);filter:drop-shadow(var(--ck-balloon-arrow-drop-shadow))}.ck.ck-balloon-panel[class*=arrow_s]:after,.ck.ck-balloon-panel[class*=arrow_s]:before{border-left-color:transparent;border-bottom-color:transparent;border-right-color:transparent}.ck.ck-balloon-panel[class*=arrow_s]:after{border-top-color:var(--ck-color-panel-background);margin-bottom:var(--ck-balloon-arrow-offset)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_n:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_n:before{left:50%;margin-left:calc(var(--ck-balloon-arrow-half-width)*-1);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nw:before{left:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_ne:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_ne:before{right:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_s:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_s:before{left:50%;margin-left:calc(var(--ck-balloon-arrow-half-width)*-1);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:before{left:calc(var(--ck-balloon-arrow-half-width)*2);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:before{right:calc(var(--ck-balloon-arrow-half-width)*2);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sme:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sme:before{right:25%;margin-right:calc(var(--ck-balloon-arrow-half-width)*2);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_smw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_smw:before{left:25%;margin-left:calc(var(--ck-balloon-arrow-half-width)*2);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nme:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nme:before{right:25%;margin-right:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nmw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nmw:before{left:25%;margin-left:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonpanel.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/balloonpanel.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAKA,MAEC,8DACD,CAEA,qBACC,YAAa,CACb,iBAAkB,CAElB,yBAyCD,CAtCE,+GAEC,UAAW,CACX,iBACD,CAEA,wDACC,6CACD,CAEA,uDACC,uDACD,CAIA,4CACC,6CACD,CAEA,2CACC,uDACD,CAIA,4CACC,6CACD,CAEA,2CACC,uDACD,CAGD,8CACC,aACD,CC9CD,MACC,6BAA8B,CAC9B,8BAA+B,CAC/B,iCAAkC,CAClC,oEACD,CAEA,qBCJC,eD4ID,CAxIA,iFCAE,qCDwIF,CAxIA,qBENC,oCAA8B,CFU9B,eAAgB,CAEhB,2CAA4C,CAC5C,6CAiID,CA9HE,+GAEC,OAAQ,CACR,QAAS,CACT,kBACD,CAIA,uFAEC,oDAAoH,CAApH,kDAAoH,CAApH,qDAAoH,CAApH,kBACD,CAEA,4CACC,gDACD,CAEA,uFAHC,6BAA8E,CAA9E,8BAA8E,CAA9E,4BAMD,CAHA,2CACC,oDAAkF,CAClF,yCACD,CAIA,uFAEC,oDAAoH,CAApH,qBAAoH,CAApH,qDAAoH,CAApH,+CACD,CAEA,4CACC,6CAAkE,CAClE,uDACD,CAEA,uFAJC,6BAAkE,CAAlE,+BAAkE,CAAlE,8BAOD,CAHA,2CACC,iDAAkF,CAClF,4CACD,CAIA,yGAEC,QAAS,CACT,uDAA0D,CAC1D,2CACD,CAIA,2GAEC,+CAAkD,CAClD,2CACD,CAIA,2GAEC,gDAAmD,CACnD,2CACD,CAIA,yGAEC,QAAS,CACT,uDAA0D,CAC1D,8CACD,CAIA,2GAEC,+CAAkD,CAClD,8CACD,CAIA,2GAEC,gDAAmD,CACnD,8CACD,CAIA,6GAEC,SAAU,CACV,uDAA0D,CAC1D,8CACD,CAIA,6GAEC,QAAS,CACT,sDAAyD,CACzD,8CACD,CAIA,6GAEC,SAAU,CACV,uDAA0D,CAC1D,2CACD,CAIA,6GAEC,QAAS,CACT,sDAAyD,CACzD,2CACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/* Make sure the balloon arrow does not float over its children. */\n\t--ck-balloon-panel-arrow-z-index: calc(var(--ck-z-default) - 3);\n}\n\n.ck.ck-balloon-panel {\n\tdisplay: none;\n\tposition: absolute;\n\n\tz-index: var(--ck-z-modal);\n\n\t&.ck-balloon-panel_with-arrow {\n\t\t&::before,\n\t\t&::after {\n\t\t\tcontent: "";\n\t\t\tposition: absolute;\n\t\t}\n\n\t\t&::before {\n\t\t\tz-index: var(--ck-balloon-panel-arrow-z-index);\n\t\t}\n\n\t\t&::after {\n\t\t\tz-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1);\n\t\t}\n\t}\n\n\t&[class*="arrow_n"] {\n\t\t&::before {\n\t\t\tz-index: var(--ck-balloon-panel-arrow-z-index);\n\t\t}\n\n\t\t&::after {\n\t\t\tz-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1);\n\t\t}\n\t}\n\n\t&[class*="arrow_s"] {\n\t\t&::before {\n\t\t\tz-index: var(--ck-balloon-panel-arrow-z-index);\n\t\t}\n\n\t\t&::after {\n\t\t\tz-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1);\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_visible {\n\t\tdisplay: block;\n\t}\n}\n','/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_shadow.css";\n\n:root {\n\t--ck-balloon-arrow-offset: 2px;\n\t--ck-balloon-arrow-height: 10px;\n\t--ck-balloon-arrow-half-width: 8px;\n\t--ck-balloon-arrow-drop-shadow: 0 2px 2px var(--ck-color-shadow-drop);\n}\n\n.ck.ck-balloon-panel {\n\t@mixin ck-rounded-corners;\n\t@mixin ck-drop-shadow;\n\n\tmin-height: 15px;\n\n\tbackground: var(--ck-color-panel-background);\n\tborder: 1px solid var(--ck-color-panel-border);\n\n\t&.ck-balloon-panel_with-arrow {\n\t\t&::before,\n\t\t&::after {\n\t\t\twidth: 0;\n\t\t\theight: 0;\n\t\t\tborder-style: solid;\n\t\t}\n\t}\n\n\t&[class*="arrow_n"] {\n\t\t&::before,\n\t\t&::after {\n\t\t\tborder-width: 0 var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width);\n\t\t}\n\n\t\t&::before {\n\t\t\tborder-color: transparent transparent var(--ck-color-panel-border) transparent;\n\t\t}\n\n\t\t&::after {\n\t\t\tborder-color: transparent transparent var(--ck-color-panel-background) transparent;\n\t\t\tmargin-top: var(--ck-balloon-arrow-offset);\n\t\t}\n\t}\n\n\t&[class*="arrow_s"] {\n\t\t&::before,\n\t\t&::after {\n\t\t\tborder-width: var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width) 0 var(--ck-balloon-arrow-half-width);\n\t\t}\n\n\t\t&::before {\n\t\t\tborder-color: var(--ck-color-panel-border) transparent transparent;\n\t\t\tfilter: drop-shadow(var(--ck-balloon-arrow-drop-shadow));\n\t\t}\n\n\t\t&::after {\n\t\t\tborder-color: var(--ck-color-panel-background) transparent transparent transparent;\n\t\t\tmargin-bottom: var(--ck-balloon-arrow-offset);\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_n {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 50%;\n\t\t\tmargin-left: calc(-1 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_nw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_ne {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_s {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 50%;\n\t\t\tmargin-left: calc(-1 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_sw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_se {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_sme {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: 25%;\n\t\t\tmargin-right: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_smw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 25%;\n\t\t\tmargin-left: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_nme {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: 25%;\n\t\t\tmargin-right: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_nmw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 25%;\n\t\t\tmargin-left: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck .ck-balloon-rotator__navigation{display:flex;align-items:center;justify-content:center}.ck .ck-balloon-rotator__content .ck-toolbar{justify-content:center}.ck .ck-balloon-rotator__navigation{background:var(--ck-color-toolbar-background);border-bottom:1px solid var(--ck-color-toolbar-border);padding:0 var(--ck-spacing-small)}.ck .ck-balloon-rotator__navigation>*{margin-right:var(--ck-spacing-small);margin-top:var(--ck-spacing-small);margin-bottom:var(--ck-spacing-small)}.ck .ck-balloon-rotator__navigation .ck-balloon-rotator__counter{margin-right:var(--ck-spacing-standard);margin-left:var(--ck-spacing-small)}.ck .ck-balloon-rotator__content .ck.ck-annotation-wrapper{box-shadow:none}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonrotator.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/balloonrotator.css"],names:[],mappings:"AAKA,oCACC,YAAa,CACb,kBAAmB,CACnB,sBACD,CAKA,6CACC,sBACD,CCXA,oCACC,6CAA8C,CAC9C,sDAAuD,CACvD,iCAgBD,CAbC,sCACC,oCAAqC,CACrC,kCAAmC,CACnC,qCACD,CAGA,iEACC,uCAAwC,CAGxC,mCACD,CAMA,2DACC,eACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-balloon-rotator__navigation {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n/* Buttons inside a toolbar should be centered when rotator bar is wider.\n * See: https://github.com/ckeditor/ckeditor5-ui/issues/495\n */\n.ck .ck-balloon-rotator__content .ck-toolbar {\n\tjustify-content: center;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-balloon-rotator__navigation {\n\tbackground: var(--ck-color-toolbar-background);\n\tborder-bottom: 1px solid var(--ck-color-toolbar-border);\n\tpadding: 0 var(--ck-spacing-small);\n\n\t/* Let's keep similar appearance to `ck-toolbar`. */\n\t& > * {\n\t\tmargin-right: var(--ck-spacing-small);\n\t\tmargin-top: var(--ck-spacing-small);\n\t\tmargin-bottom: var(--ck-spacing-small);\n\t}\n\n\t/* Gives counter more breath than buttons. */\n\t& .ck-balloon-rotator__counter {\n\t\tmargin-right: var(--ck-spacing-standard);\n\n\t\t/* We need to use smaller margin because of previous button's right margin. */\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n}\n\n.ck .ck-balloon-rotator__content {\n\n\t/* Disable default annotation shadow inside rotator with fake panels. */\n\t& .ck.ck-annotation-wrapper {\n\t\tbox-shadow: none;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck .ck-fake-panel{position:absolute;z-index:calc(var(--ck-z-modal) - 1)}.ck .ck-fake-panel div{position:absolute}.ck .ck-fake-panel div:first-child{z-index:2}.ck .ck-fake-panel div:nth-child(2){z-index:1}:root{--ck-balloon-fake-panel-offset-horizontal:6px;--ck-balloon-fake-panel-offset-vertical:6px}.ck .ck-fake-panel div{box-shadow:var(--ck-drop-shadow),0 0;min-height:15px;background:var(--ck-color-panel-background);border:1px solid var(--ck-color-panel-border);border-radius:var(--ck-border-radius);width:100%;height:100%}.ck .ck-fake-panel div:first-child{margin-left:var(--ck-balloon-fake-panel-offset-horizontal);margin-top:var(--ck-balloon-fake-panel-offset-vertical)}.ck .ck-fake-panel div:nth-child(2){margin-left:calc(var(--ck-balloon-fake-panel-offset-horizontal)*2);margin-top:calc(var(--ck-balloon-fake-panel-offset-vertical)*2)}.ck .ck-fake-panel div:nth-child(3){margin-left:calc(var(--ck-balloon-fake-panel-offset-horizontal)*3);margin-top:calc(var(--ck-balloon-fake-panel-offset-vertical)*3)}.ck .ck-balloon-panel_arrow_s+.ck-fake-panel,.ck .ck-balloon-panel_arrow_se+.ck-fake-panel,.ck .ck-balloon-panel_arrow_sw+.ck-fake-panel{--ck-balloon-fake-panel-offset-vertical:-6px}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/fakepanel.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/fakepanel.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAKA,mBACC,iBAAkB,CAGlB,mCACD,CAEA,uBACC,iBACD,CAEA,mCACC,SACD,CAEA,oCACC,SACD,CCfA,MACC,6CAA8C,CAC9C,2CACD,CAGA,uBCJC,oCAA8B,CDO9B,eAAgB,CAEhB,2CAA4C,CAC5C,6CAA8C,CAC9C,qCAAsC,CAEtC,UAAW,CACX,WACD,CAEA,mCACC,0DAA2D,CAC3D,uDACD,CAEA,oCACC,kEAAqE,CACrE,+DACD,CACA,oCACC,kEAAqE,CACrE,+DACD,CAGA,yIAGC,4CACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-fake-panel {\n\tposition: absolute;\n\n\t/* Fake panels should be placed under main balloon content. */\n\tz-index: calc(var(--ck-z-modal) - 1);\n}\n\n.ck .ck-fake-panel div {\n\tposition: absolute;\n}\n\n.ck .ck-fake-panel div:nth-child( 1 ) {\n\tz-index: 2;\n}\n\n.ck .ck-fake-panel div:nth-child( 2 ) {\n\tz-index: 1;\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_shadow.css";\n\n:root {\n\t--ck-balloon-fake-panel-offset-horizontal: 6px;\n\t--ck-balloon-fake-panel-offset-vertical: 6px;\n}\n\n/* Let\'s use `.ck-balloon-panel` appearance. See: balloonpanel.css. */\n.ck .ck-fake-panel div {\n\t@mixin ck-drop-shadow;\n\n\tmin-height: 15px;\n\n\tbackground: var(--ck-color-panel-background);\n\tborder: 1px solid var(--ck-color-panel-border);\n\tborder-radius: var(--ck-border-radius);\n\n\twidth: 100%;\n\theight: 100%;\n}\n\n.ck .ck-fake-panel div:nth-child( 1 ) {\n\tmargin-left: var(--ck-balloon-fake-panel-offset-horizontal);\n\tmargin-top: var(--ck-balloon-fake-panel-offset-vertical);\n}\n\n.ck .ck-fake-panel div:nth-child( 2 ) {\n\tmargin-left: calc(var(--ck-balloon-fake-panel-offset-horizontal) * 2);\n\tmargin-top: calc(var(--ck-balloon-fake-panel-offset-vertical) * 2);\n}\n.ck .ck-fake-panel div:nth-child( 3 ) {\n\tmargin-left: calc(var(--ck-balloon-fake-panel-offset-horizontal) * 3);\n\tmargin-top: calc(var(--ck-balloon-fake-panel-offset-vertical) * 3);\n}\n\n/* If balloon is positioned above element, we need to move fake panel to the top. */\n.ck .ck-balloon-panel_arrow_s + .ck-fake-panel,\n.ck .ck-balloon-panel_arrow_se + .ck-fake-panel,\n.ck .ck-balloon-panel_arrow_sw + .ck-fake-panel {\n\t--ck-balloon-fake-panel-offset-vertical: -6px;\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-sticky-panel .ck-sticky-panel__content_sticky{z-index:var(--ck-z-modal);position:fixed;top:0}.ck.ck-sticky-panel .ck-sticky-panel__content_sticky_bottom-limit{top:auto;position:absolute}.ck.ck-sticky-panel .ck-sticky-panel__content_sticky{box-shadow:var(--ck-drop-shadow),0 0;border-width:0 1px 1px;border-top-left-radius:0;border-top-right-radius:0}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/stickypanel.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/stickypanel.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAMC,qDACC,yBAA0B,CAC1B,cAAe,CACf,KACD,CAEA,kEACC,QAAS,CACT,iBACD,CCPA,qDCCA,oCAA8B,CDE7B,sBAAuB,CACvB,wBAAyB,CACzB,yBACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-sticky-panel {\n\t& .ck-sticky-panel__content_sticky {\n\t\tz-index: var(--ck-z-modal); /* #315 */\n\t\tposition: fixed;\n\t\ttop: 0;\n\t}\n\n\t& .ck-sticky-panel__content_sticky_bottom-limit {\n\t\ttop: auto;\n\t\tposition: absolute;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_shadow.css";\n\n.ck.ck-sticky-panel {\n\t& .ck-sticky-panel__content_sticky {\n\t\t@mixin ck-drop-shadow;\n\n\t\tborder-width: 0 1px 1px;\n\t\tborder-top-left-radius: 0;\n\t\tborder-top-right-radius: 0;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-block-toolbar-button{position:absolute;z-index:var(--ck-z-default)}:root{--ck-color-block-toolbar-button:var(--ck-color-text);--ck-block-toolbar-button-size:var(--ck-font-size-normal)}.ck.ck-block-toolbar-button{color:var(--ck-color-block-toolbar-button);font-size:var(--ck-block-toolbar-size)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/blocktoolbar.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/toolbar/blocktoolbar.css"],names:[],mappings:"AAKA,4BACC,iBAAkB,CAClB,2BACD,CCHA,MACC,oDAAqD,CACrD,yDACD,CAEA,4BACC,0CAA2C,CAC3C,sCACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-block-toolbar-button {\n\tposition: absolute;\n\tz-index: var(--ck-z-default);\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-block-toolbar-button: var(--ck-color-text);\n\t--ck-block-toolbar-button-size: var(--ck-font-size-normal);\n}\n\n.ck.ck-block-toolbar-button {\n\tcolor: var(--ck-color-block-toolbar-button);\n\tfont-size: var(--ck-block-toolbar-size);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-placeholder,.ck .ck-placeholder{position:relative}.ck.ck-placeholder:before,.ck .ck-placeholder:before{position:absolute;left:0;right:0;content:attr(data-placeholder);pointer-events:none}.ck.ck-read-only .ck-placeholder:before{display:none}.ck.ck-placeholder:before,.ck .ck-placeholder:before{cursor:text;color:var(--ck-color-engine-placeholder-text)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-engine/theme/placeholder.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-engine/placeholder.css"],names:[],mappings:"AAMA,uCAEC,iBAWD,CATC,qDACC,iBAAkB,CAClB,MAAO,CACP,OAAQ,CACR,8BAA+B,CAG/B,mBACD,CAKA,wCACC,YACD,CClBA,qDACC,WAAY,CACZ,6CACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* See ckeditor/ckeditor5#936. */\n.ck.ck-placeholder,\n.ck .ck-placeholder {\n\tposition: relative;\n\n\t&::before {\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\tright: 0;\n\t\tcontent: attr(data-placeholder);\n\n\t\t/* See ckeditor/ckeditor5#469. */\n\t\tpointer-events: none;\n\t}\n}\n\n/* See ckeditor/ckeditor5#1987. */\n.ck.ck-read-only .ck-placeholder {\n\t&::before {\n\t\tdisplay: none;\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* See ckeditor/ckeditor5#936. */\n.ck.ck-placeholder, .ck .ck-placeholder {\n\t&::before {\n\t\tcursor: text;\n\t\tcolor: var(--ck-color-engine-placeholder-text);\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-editor{position:relative}.ck.ck-editor .ck-editor__top .ck-sticky-panel .ck-toolbar{z-index:var(--ck-z-modal)}.ck.ck-editor__top .ck-sticky-panel .ck-toolbar{border-radius:0}.ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-toolbar,.ck.ck-editor__top .ck-sticky-panel .ck-toolbar.ck-rounded-corners{border-radius:var(--ck-border-radius);border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-editor__top .ck-sticky-panel .ck-toolbar{border-bottom-width:0}.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content_sticky .ck-toolbar{border-bottom-width:1px;border-radius:0}.ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content_sticky .ck-toolbar,.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content_sticky .ck-toolbar.ck-rounded-corners{border-radius:var(--ck-border-radius);border-radius:0}.ck.ck-editor__main>.ck-editor__editable{background:var(--ck-color-base-background);border-radius:0}.ck-rounded-corners .ck.ck-editor__main>.ck-editor__editable,.ck.ck-editor__main>.ck-editor__editable.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}.ck.ck-editor__main>.ck-editor__editable:not(.ck-focused){border-color:var(--ck-color-base-border)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-editor-classic/theme/classiceditor.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-editor-classic/classiceditor.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAKA,cAIC,iBAMD,CAJC,2DAEC,yBACD,CCLC,gDCED,eDKC,CAPA,uICMA,qCAAsC,CDJpC,2BAA4B,CAC5B,4BAIF,CAPA,gDAMC,qBACD,CAEA,iFACC,uBAAwB,CCR1B,eDaC,CANA,yMCHA,qCAAsC,CDOpC,eAEF,CAKF,yCAEC,0CAA2C,CCpB3C,eD8BD,CAZA,yHCdE,qCAAsC,CDmBtC,wBAAyB,CACzB,yBAMF,CAHC,0DACC,wCACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor {\n\t/* All the elements within `.ck-editor` are positioned relatively to it.\n\t If any element needs to be positioned with respect to the <body>, etc.,\n\t it must land outside of the `.ck-editor` in DOM. */\n\tposition: relative;\n\n\t& .ck-editor__top .ck-sticky-panel .ck-toolbar {\n\t\t/* https://github.com/ckeditor/ckeditor5-editor-classic/issues/62 */\n\t\tz-index: var(--ck-z-modal);\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../mixins/_rounded.css";\n\n.ck.ck-editor__top {\n\t& .ck-sticky-panel {\n\t\t& .ck-toolbar {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\n\t\t\tborder-bottom-width: 0;\n\t\t}\n\n\t\t& .ck-sticky-panel__content_sticky .ck-toolbar {\n\t\t\tborder-bottom-width: 1px;\n\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-radius: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/* Note: Use ck-editor__main to make sure these styles don\'t apply to other editor types */\n.ck.ck-editor__main > .ck-editor__editable {\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/113 */\n\tbackground: var(--ck-color-base-background);\n\n\t@mixin ck-rounded-corners {\n\t\tborder-top-left-radius: 0;\n\t\tborder-top-right-radius: 0;\n\t}\n\n\t&:not(.ck-focused) {\n\t\tborder-color: var(--ck-color-base-border);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,'.ck .ck-widget .ck-widget__type-around__button{display:block;position:absolute;overflow:hidden;z-index:var(--ck-z-default)}.ck .ck-widget .ck-widget__type-around__button svg{position:absolute;top:50%;left:50%;z-index:calc(var(--ck-z-default) + 2)}.ck .ck-widget .ck-widget__type-around__button.ck-widget__type-around__button_before{top:calc(var(--ck-widget-outline-thickness)*-0.5);left:min(10%,30px);transform:translateY(-50%)}.ck .ck-widget .ck-widget__type-around__button.ck-widget__type-around__button_after{bottom:calc(var(--ck-widget-outline-thickness)*-0.5);right:min(10%,30px);transform:translateY(50%)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:after,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover:after{content:"";display:block;position:absolute;top:1px;left:1px;z-index:calc(var(--ck-z-default) + 1)}.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__fake-caret{display:none;position:absolute;left:0;right:0}.ck .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__fake-caret{left:calc(var(--ck-widget-outline-thickness)*-1);right:calc(var(--ck-widget-outline-thickness)*-1)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_before>.ck-widget__type-around>.ck-widget__type-around__fake-caret{top:calc(var(--ck-widget-outline-thickness)*-1 - 1px);display:block}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after>.ck-widget__type-around>.ck-widget__type-around__fake-caret{bottom:calc(var(--ck-widget-outline-thickness)*-1 - 1px);display:block}.ck.ck-editor__editable.ck-read-only .ck-widget__type-around,.ck.ck-editor__editable.ck-restricted-editing_mode_restricted .ck-widget__type-around,.ck.ck-editor__editable.ck-widget__type-around_disabled .ck-widget__type-around{display:none}:root{--ck-widget-type-around-button-size:20px;--ck-color-widget-type-around-button-active:var(--ck-color-focus-border);--ck-color-widget-type-around-button-hover:var(--ck-color-widget-hover-border);--ck-color-widget-type-around-button-blurred-editable:var(--ck-color-widget-blurred-border);--ck-color-widget-type-around-button-radar-start-alpha:0;--ck-color-widget-type-around-button-radar-end-alpha:.3;--ck-color-widget-type-around-button-icon:var(--ck-color-base-background)}.ck .ck-widget .ck-widget__type-around__button{width:var(--ck-widget-type-around-button-size);height:var(--ck-widget-type-around-button-size);background:var(--ck-color-widget-type-around-button);border-radius:100px;transition:opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);opacity:0;pointer-events:none}.ck .ck-widget .ck-widget__type-around__button svg{width:10px;height:8px;transform:translate(-50%,-50%);transition:transform .5s ease;margin-top:1px}.ck .ck-widget .ck-widget__type-around__button svg *{stroke-dasharray:10;stroke-dashoffset:0;fill:none;stroke:var(--ck-color-widget-type-around-button-icon);stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.ck .ck-widget .ck-widget__type-around__button svg line{stroke-dasharray:7}.ck .ck-widget .ck-widget__type-around__button:hover{animation:ck-widget-type-around-button-sonar 1s ease infinite}.ck .ck-widget .ck-widget__type-around__button:hover svg polyline{animation:ck-widget-type-around-arrow-dash 2s linear}.ck .ck-widget .ck-widget__type-around__button:hover svg line{animation:ck-widget-type-around-arrow-tip-dash 2s linear}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__button{opacity:1;pointer-events:auto}.ck .ck-widget:not(.ck-widget_selected)>.ck-widget__type-around>.ck-widget__type-around__button{background:var(--ck-color-widget-type-around-button-hover)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover{background:var(--ck-color-widget-type-around-button-active)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:after,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover:after{width:calc(var(--ck-widget-type-around-button-size) - 2px);height:calc(var(--ck-widget-type-around-button-size) - 2px);border-radius:100px;background:linear-gradient(135deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.3))}.ck .ck-widget.ck-widget_with-selection-handle>.ck-widget__type-around>.ck-widget__type-around__button_before{margin-left:20px}.ck .ck-widget .ck-widget__type-around__fake-caret{pointer-events:none;height:1px;animation:ck-widget-type-around-fake-caret-pulse 1s linear infinite normal forwards;outline:1px solid hsla(0,0%,100%,.5);background:var(--ck-color-base-text)}.ck .ck-widget.ck-widget_selected.ck-widget_type-around_show-fake-caret_after,.ck .ck-widget.ck-widget_selected.ck-widget_type-around_show-fake-caret_before{outline-color:transparent}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_selected:hover,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_selected:hover{outline-color:var(--ck-color-widget-hover-border)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before>.ck-widget__type-around>.ck-widget__type-around__button{opacity:0;pointer-events:none}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle{opacity:0}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_selected.ck-widget_with-resizer>.ck-widget__resizer,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_selected.ck-widget_with-resizer>.ck-widget__resizer{opacity:0}.ck[dir=rtl] .ck-widget.ck-widget_with-selection-handle .ck-widget__type-around>.ck-widget__type-around__button_before{margin-left:0;margin-right:20px}.ck-editor__nested-editable.ck-editor__editable_selected .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck-editor__nested-editable.ck-editor__editable_selected .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__button{opacity:0;pointer-events:none}.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:not(:hover){background:var(--ck-color-widget-type-around-button-blurred-editable)}.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:not(:hover) svg *{stroke:#999}@keyframes ck-widget-type-around-arrow-dash{0%{stroke-dashoffset:10}20%,to{stroke-dashoffset:0}}@keyframes ck-widget-type-around-arrow-tip-dash{0%,20%{stroke-dashoffset:7}40%,to{stroke-dashoffset:0}}@keyframes ck-widget-type-around-button-sonar{0%{box-shadow:0 0 0 0 hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-start-alpha))}50%{box-shadow:0 0 0 5px hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-end-alpha))}to{box-shadow:0 0 0 5px hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-start-alpha))}}@keyframes ck-widget-type-around-fake-caret-pulse{0%{opacity:1}49%{opacity:1}50%{opacity:0}99%{opacity:0}to{opacity:1}}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-widget/theme/widgettypearound.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-widget/widgettypearound.css"],names:[],mappings:"AASC,+CACC,aAAc,CACd,iBAAkB,CAClB,eAAgB,CAChB,2BAwBD,CAtBC,mDACC,iBAAkB,CAClB,OAAQ,CACR,QAAS,CACT,qCACD,CAEA,qFAEC,iDAAoD,CACpD,kBAAoB,CAEpB,0BACD,CAEA,oFAEC,oDAAuD,CACvD,mBAAqB,CAErB,yBACD,CAUA,mLACC,UAAW,CACX,aAAc,CACd,iBAAkB,CAClB,OAAQ,CACR,QAAS,CACT,qCACD,CAMD,2EACC,YAAa,CACb,iBAAkB,CAClB,MAAO,CACP,OACD,CAOA,iFACC,gDAAqD,CACrD,iDACD,CAKA,wHACC,qDAA0D,CAC1D,aACD,CAKA,uHACC,wDAA6D,CAC7D,aACD,CAoBD,mOACC,YACD,CC3GA,MACC,wCAAyC,CACzC,wEAAyE,CACzE,8EAA+E,CAC/E,2FAA4F,CAC5F,wDAAyD,CACzD,uDAAwD,CACxD,yEACD,CAgBC,+CACC,8CAA+C,CAC/C,+CAAgD,CAChD,oDAAqD,CACrD,mBAAoB,CACpB,uMAAyM,CAb1M,SAAU,CACV,mBA0DA,CA1CC,mDACC,UAAW,CACX,UAAW,CACX,8BAA+B,CAC/B,6BAA8B,CAC9B,cAgBD,CAdC,qDACC,mBAAoB,CACpB,mBAAoB,CAEpB,SAAU,CACV,qDAAsD,CACtD,kBAAmB,CACnB,oBAAqB,CACrB,qBACD,CAEA,wDACC,kBACD,CAGD,qDAIC,6DAcD,CARE,kEACC,oDACD,CAEA,8DACC,wDACD,CAUF,uKAvED,SAAU,CACV,mBAwEC,CAOD,gGACC,0DACD,CAOA,uKAEC,2DAQD,CANC,mLACC,0DAA2D,CAC3D,2DAA4D,CAC5D,mBAAoB,CACpB,uEACD,CAOD,8GACC,gBACD,CAKA,mDACC,mBAAoB,CACpB,UAAW,CACX,mFAAoF,CAMpF,oCAAwC,CACxC,oCACD,CAOC,6JAEC,yBACD,CAUA,yKACC,iDACD,CAMA,uOAlJD,SAAU,CACV,mBAmJC,CASE,0jBACC,SACD,CASF,mPACC,SACD,CASF,uHACC,aAAc,CACd,iBACD,CAYG,iRAlMF,SAAU,CACV,mBAmME,CAQH,kIACC,qEAKD,CAHC,wIACC,WACD,CAGD,4CACC,GACC,oBACD,CACA,OACC,mBACD,CACD,CAEA,gDACC,OACC,mBACD,CACA,OACC,mBACD,CACD,CAEA,8CACC,GACC,6HACD,CACA,IACC,6HACD,CACA,GACC,+HACD,CACD,CAEA,kDACC,GACC,SACD,CACA,IACC,SACD,CACA,IACC,SACD,CACA,IACC,SACD,CACA,GACC,SACD,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-widget {\n\t/*\n\t * Styles of the type around buttons\n\t */\n\t& .ck-widget__type-around__button {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\toverflow: hidden;\n\t\tz-index: var(--ck-z-default);\n\n\t\t& svg {\n\t\t\tposition: absolute;\n\t\t\ttop: 50%;\n\t\t\tleft: 50%;\n\t\t\tz-index: calc(var(--ck-z-default) + 2);\n\t\t}\n\n\t\t&.ck-widget__type-around__button_before {\n\t\t\t/* Place it in the middle of the outline */\n\t\t\ttop: calc(-0.5 * var(--ck-widget-outline-thickness));\n\t\t\tleft: min(10%, 30px);\n\n\t\t\ttransform: translateY(-50%);\n\t\t}\n\n\t\t&.ck-widget__type-around__button_after {\n\t\t\t/* Place it in the middle of the outline */\n\t\t\tbottom: calc(-0.5 * var(--ck-widget-outline-thickness));\n\t\t\tright: min(10%, 30px);\n\n\t\t\ttransform: translateY(50%);\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the buttons when:\n\t * - the widget is selected,\n\t * - or the button is being hovered (regardless of the widget state).\n\t */\n\t&.ck-widget_selected > .ck-widget__type-around > .ck-widget__type-around__button,\n\t& > .ck-widget__type-around > .ck-widget__type-around__button:hover {\n\t\t&::after {\n\t\t\tcontent: "";\n\t\t\tdisplay: block;\n\t\t\tposition: absolute;\n\t\t\ttop: 1px;\n\t\t\tleft: 1px;\n\t\t\tz-index: calc(var(--ck-z-default) + 1);\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" which is displayed when the user navigates using the keyboard.\n\t */\n\t& > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\tdisplay: none;\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\tright: 0;\n\t}\n\n\t/*\n\t * When the widget is hovered the "fake caret" would normally be narrower than the\n\t * extra outline displayed around the widget. Let\'s extend the "fake caret" to match\n\t * the full width of the widget.\n\t */\n\t&:hover > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\tleft: calc( -1 * var(--ck-widget-outline-thickness) );\n\t\tright: calc( -1 * var(--ck-widget-outline-thickness) );\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" when it should be displayed before the widget (backward keyboard navigation).\n\t */\n\t&.ck-widget_type-around_show-fake-caret_before > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\ttop: calc( -1 * var(--ck-widget-outline-thickness) - 1px );\n\t\tdisplay: block;\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" when it should be displayed after the widget (forward keyboard navigation).\n\t */\n\t&.ck-widget_type-around_show-fake-caret_after > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\tbottom: calc( -1 * var(--ck-widget-outline-thickness) - 1px );\n\t\tdisplay: block;\n\t}\n}\n\n/*\n * Integration with the read-only mode of the editor.\n */\n.ck.ck-editor__editable.ck-read-only .ck-widget__type-around {\n\tdisplay: none;\n}\n\n/*\n * Integration with the restricted editing mode (feature) of the editor.\n */\n.ck.ck-editor__editable.ck-restricted-editing_mode_restricted .ck-widget__type-around {\n\tdisplay: none;\n}\n\n/*\n * Integration with the #isEnabled property of the WidgetTypeAround plugin.\n */\n.ck.ck-editor__editable.ck-widget__type-around_disabled .ck-widget__type-around {\n\tdisplay: none;\n}\n','/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-widget-type-around-button-size: 20px;\n\t--ck-color-widget-type-around-button-active: var(--ck-color-focus-border);\n\t--ck-color-widget-type-around-button-hover: var(--ck-color-widget-hover-border);\n\t--ck-color-widget-type-around-button-blurred-editable: var(--ck-color-widget-blurred-border);\n\t--ck-color-widget-type-around-button-radar-start-alpha: 0;\n\t--ck-color-widget-type-around-button-radar-end-alpha: .3;\n\t--ck-color-widget-type-around-button-icon: var(--ck-color-base-background);\n}\n\n@define-mixin ck-widget-type-around-button-visible {\n\topacity: 1;\n\tpointer-events: auto;\n}\n\n@define-mixin ck-widget-type-around-button-hidden {\n\topacity: 0;\n\tpointer-events: none;\n}\n\n.ck .ck-widget {\n\t/*\n\t * Styles of the type around buttons\n\t */\n\t& .ck-widget__type-around__button {\n\t\twidth: var(--ck-widget-type-around-button-size);\n\t\theight: var(--ck-widget-type-around-button-size);\n\t\tbackground: var(--ck-color-widget-type-around-button);\n\t\tborder-radius: 100px;\n\t\ttransition: opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve), background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\n\n\t\t@mixin ck-widget-type-around-button-hidden;\n\n\t\t& svg {\n\t\t\twidth: 10px;\n\t\t\theight: 8px;\n\t\t\ttransform: translate(-50%,-50%);\n\t\t\ttransition: transform .5s ease;\n\t\t\tmargin-top: 1px;\n\n\t\t\t& * {\n\t\t\t\tstroke-dasharray: 10;\n\t\t\t\tstroke-dashoffset: 0;\n\n\t\t\t\tfill: none;\n\t\t\t\tstroke: var(--ck-color-widget-type-around-button-icon);\n\t\t\t\tstroke-width: 1.5px;\n\t\t\t\tstroke-linecap: round;\n\t\t\t\tstroke-linejoin: round;\n\t\t\t}\n\n\t\t\t& line {\n\t\t\t\tstroke-dasharray: 7;\n\t\t\t}\n\t\t}\n\n\t\t&:hover {\n\t\t\t/*\n\t\t\t * Display the "sonar" around the button when hovered.\n\t\t\t */\n\t\t\tanimation: ck-widget-type-around-button-sonar 1s ease infinite;\n\n\t\t\t/*\n\t\t\t * Animate active button\'s icon.\n\t\t\t */\n\t\t\t& svg {\n\t\t\t\t& polyline {\n\t\t\t\t\tanimation: ck-widget-type-around-arrow-dash 2s linear;\n\t\t\t\t}\n\n\t\t\t\t& line {\n\t\t\t\t\tanimation: ck-widget-type-around-arrow-tip-dash 2s linear;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t * Show type around buttons when the widget gets selected or being hovered.\n\t */\n\t&.ck-widget_selected,\n\t&:hover {\n\t\t& > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\t\t@mixin ck-widget-type-around-button-visible;\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the buttons when the widget is NOT selected (but the buttons are visible\n\t * and still can be hovered).\n\t */\n\t&:not(.ck-widget_selected) > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\tbackground: var(--ck-color-widget-type-around-button-hover);\n\t}\n\n\t/*\n\t * Styles for the buttons when:\n\t * - the widget is selected,\n\t * - or the button is being hovered (regardless of the widget state).\n\t */\n\t&.ck-widget_selected > .ck-widget__type-around > .ck-widget__type-around__button,\n\t& > .ck-widget__type-around > .ck-widget__type-around__button:hover {\n\t\tbackground: var(--ck-color-widget-type-around-button-active);\n\n\t\t&::after {\n\t\t\twidth: calc(var(--ck-widget-type-around-button-size) - 2px);\n\t\t\theight: calc(var(--ck-widget-type-around-button-size) - 2px);\n\t\t\tborder-radius: 100px;\n\t\t\tbackground: linear-gradient(135deg, hsla(0,0%,100%,0) 0%, hsla(0,0%,100%,.3) 100%);\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the "before" button when the widget has a selection handle. Because some space\n\t * is consumed by the handle, the button must be moved slightly to the right to let it breathe.\n\t */\n\t&.ck-widget_with-selection-handle > .ck-widget__type-around > .ck-widget__type-around__button_before {\n\t\tmargin-left: 20px;\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" which is displayed when the user navigates using the keyboard.\n\t */\n\t& .ck-widget__type-around__fake-caret {\n\t\tpointer-events: none;\n\t\theight: 1px;\n\t\tanimation: ck-widget-type-around-fake-caret-pulse linear 1s infinite normal forwards;\n\n\t\t/*\n\t\t * The semi-transparent-outline+background combo improves the contrast\n\t\t * when the background underneath the fake caret is dark.\n\t\t */\n\t\toutline: solid 1px hsla(0, 0%, 100%, .5);\n\t\tbackground: var(--ck-color-base-text);\n\t}\n\n\t/*\n\t * Styles of the widget when the "fake caret" is blinking (e.g. upon keyboard navigation).\n\t * Despite the widget being physically selected in the model, its outline should disappear.\n\t */\n\t&.ck-widget_selected {\n\t\t&.ck-widget_type-around_show-fake-caret_before,\n\t\t&.ck-widget_type-around_show-fake-caret_after {\n\t\t\toutline-color: transparent;\n\t\t}\n\t}\n\n\t&.ck-widget_type-around_show-fake-caret_before,\n\t&.ck-widget_type-around_show-fake-caret_after {\n\t\t/*\n\t\t * When the "fake caret" is visible we simulate that the widget is not selected\n\t\t * (despite being physically selected), so the outline color should be for the\n\t\t * unselected widget.\n\t\t */\n\t\t&.ck-widget_selected:hover {\n\t\t\toutline-color: var(--ck-color-widget-hover-border);\n\t\t}\n\n\t\t/*\n\t\t * Styles of the type around buttons when the "fake caret" is blinking (e.g. upon keyboard navigation).\n\t\t * In this state, the type around buttons would collide with the fake carets so they should disappear.\n\t\t */\n\t\t& > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\t\t@mixin ck-widget-type-around-button-hidden;\n\t\t}\n\n\t\t/*\n\t\t * Fake horizontal caret integration with the selection handle. When the caret is visible, simply\n\t\t * hide the handle because it intersects with the caret (and does not make much sense anyway).\n\t\t */\n\t\t&.ck-widget_with-selection-handle {\n\t\t\t&.ck-widget_selected,\n\t\t\t&.ck-widget_selected:hover {\n\t\t\t\t& > .ck-widget__selection-handle {\n\t\t\t\t\topacity: 0\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t * Fake horizontal caret integration with the resize UI. When the caret is visible, simply\n\t\t * hide the resize UI because it creates too much noise. It can be visible when the user\n\t\t * hovers the widget, though.\n\t\t */\n\t\t&.ck-widget_selected.ck-widget_with-resizer > .ck-widget__resizer {\n\t\t\topacity: 0\n\t\t}\n\t}\n}\n\n/*\n * Styles for the "before" button when the widget has a selection handle in an RTL environment.\n * The selection handler is aligned to the right side of the widget so there is no need to create\n * additional space for it next to the "before" button.\n */\n.ck[dir="rtl"] .ck-widget.ck-widget_with-selection-handle .ck-widget__type-around > .ck-widget__type-around__button_before {\n\tmargin-left: 0;\n\tmargin-right: 20px;\n}\n\n/*\n * Hide type around buttons when the widget is selected as a child of a selected\n * nested editable (e.g. mulit-cell table selection).\n *\n * See https://github.com/ckeditor/ckeditor5/issues/7263.\n */\n.ck-editor__nested-editable.ck-editor__editable_selected {\n\t& .ck-widget {\n\t\t&.ck-widget_selected,\n\t\t&:hover {\n\t\t\t& > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\t\t\t@mixin ck-widget-type-around-button-hidden;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/*\n * Styles for the buttons when the widget is selected but the user clicked outside of the editor (blurred the editor).\n */\n.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected > .ck-widget__type-around > .ck-widget__type-around__button:not(:hover) {\n\tbackground: var(--ck-color-widget-type-around-button-blurred-editable);\n\n\t& svg * {\n\t\tstroke: hsl(0,0%,60%);\n\t}\n}\n\n@keyframes ck-widget-type-around-arrow-dash {\n\t0% {\n\t\tstroke-dashoffset: 10;\n\t}\n\t20%, 100% {\n\t\tstroke-dashoffset: 0;\n\t}\n}\n\n@keyframes ck-widget-type-around-arrow-tip-dash {\n\t0%, 20% {\n\t\tstroke-dashoffset: 7;\n\t}\n\t40%, 100% {\n\t\tstroke-dashoffset: 0;\n\t}\n}\n\n@keyframes ck-widget-type-around-button-sonar {\n\t0% {\n\t\tbox-shadow: 0 0 0 0 hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-start-alpha));\n\t}\n\t50% {\n\t\tbox-shadow: 0 0 0 5px hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-end-alpha));\n\t}\n\t100% {\n\t\tbox-shadow: 0 0 0 5px hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-start-alpha));\n\t}\n}\n\n@keyframes ck-widget-type-around-fake-caret-pulse {\n\t0% {\n\t\topacity: 1;\n\t}\n\t49% {\n\t\topacity: 1;\n\t}\n\t50% {\n\t\topacity: 0;\n\t}\n\t99% {\n\t\topacity: 0;\n\t}\n\t100% {\n\t\topacity: 1;\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,":root{--ck-color-resizer:var(--ck-color-focus-border);--ck-color-resizer-tooltip-background:#262626;--ck-color-resizer-tooltip-text:#f2f2f2;--ck-resizer-border-radius:var(--ck-border-radius);--ck-resizer-tooltip-offset:10px}.ck .ck-widget,.ck .ck-widget.ck-widget_with-selection-handle{position:relative}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{position:absolute}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon{display:block}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected .ck-widget__selection-handle,.ck .ck-widget.ck-widget_with-selection-handle:hover .ck-widget__selection-handle{visibility:visible}.ck .ck-size-view{background:var(--ck-color-resizer-tooltip-background);color:var(--ck-color-resizer-tooltip-text);border:1px solid var(--ck-color-resizer-tooltip-text);border-radius:var(--ck-resizer-border-radius);font-size:var(--ck-font-size-tiny);display:block;padding:var(--ck-spacing-small)}.ck .ck-size-view.ck-orientation-bottom-left,.ck .ck-size-view.ck-orientation-bottom-right,.ck .ck-size-view.ck-orientation-top-left,.ck .ck-size-view.ck-orientation-top-right{position:absolute}.ck .ck-size-view.ck-orientation-top-left{top:var(--ck-resizer-tooltip-offset);left:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-top-right{top:var(--ck-resizer-tooltip-offset);right:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-bottom-right{bottom:var(--ck-resizer-tooltip-offset);right:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-bottom-left{bottom:var(--ck-resizer-tooltip-offset);left:var(--ck-resizer-tooltip-offset)}:root{--ck-widget-outline-thickness:3px;--ck-widget-handler-icon-size:16px;--ck-widget-handler-animation-duration:200ms;--ck-widget-handler-animation-curve:ease;--ck-color-widget-blurred-border:#dedede;--ck-color-widget-hover-border:#ffc83d;--ck-color-widget-editable-focus-background:var(--ck-color-base-background);--ck-color-widget-drag-handler-icon-color:var(--ck-color-base-background)}.ck .ck-widget{outline-width:var(--ck-widget-outline-thickness);outline-style:solid;outline-color:transparent;transition:outline-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve)}.ck .ck-widget.ck-widget_selected,.ck .ck-widget.ck-widget_selected:hover{outline:var(--ck-widget-outline-thickness) solid var(--ck-color-focus-border)}.ck .ck-widget:hover{outline-color:var(--ck-color-widget-hover-border)}.ck .ck-editor__nested-editable{border:1px solid transparent}.ck .ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck .ck-editor__nested-editable:focus{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0;background-color:var(--ck-color-widget-editable-focus-background)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{padding:4px;box-sizing:border-box;background-color:transparent;opacity:0;transition:background-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),visibility var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);border-radius:var(--ck-border-radius) var(--ck-border-radius) 0 0;transform:translateY(-100%);left:calc(0px - var(--ck-widget-outline-thickness))}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon{width:var(--ck-widget-handler-icon-size);height:var(--ck-widget-handler-icon-size);color:var(--ck-color-widget-drag-handler-icon-color)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator{opacity:0;transition:opacity .3s var(--ck-widget-handler-animation-curve)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle:hover .ck-icon .ck-icon__selected-indicator{opacity:1}.ck .ck-widget.ck-widget_with-selection-handle:hover .ck-widget__selection-handle{opacity:1;background-color:var(--ck-color-widget-hover-border)}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected .ck-widget__selection-handle,.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected:hover .ck-widget__selection-handle{opacity:1;background-color:var(--ck-color-focus-border)}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected .ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator,.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected:hover .ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator{opacity:1}.ck[dir=rtl] .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{left:auto;right:calc(0px - var(--ck-widget-outline-thickness))}.ck.ck-editor__editable.ck-read-only .ck-widget{transition:none}.ck.ck-editor__editable.ck-read-only .ck-widget:not(.ck-widget_selected){--ck-widget-outline-thickness:0px}.ck.ck-editor__editable.ck-read-only .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle,.ck.ck-editor__editable.ck-read-only .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle:hover{background:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected:hover{outline-color:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle .ck-widget__selection-handle,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle .ck-widget__selection-handle:hover,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected:hover.ck-widget_with-selection-handle .ck-widget__selection-handle,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected:hover.ck-widget_with-selection-handle .ck-widget__selection-handle:hover{background:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable>.ck-widget.ck-widget_with-selection-handle:first-child,.ck.ck-editor__editable blockquote>.ck-widget.ck-widget_with-selection-handle:first-child{margin-top:calc(1em + var(--ck-widget-handler-icon-size))}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-widget/theme/widget.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-widget/widget.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAKA,MACC,+CAAgD,CAChD,6CAAsD,CACtD,uCAAgD,CAEhD,kDAAmD,CACnD,gCACD,CAOA,8DAEC,iBAuBD,CArBC,4EACC,iBAOD,CALC,qFAGC,aACD,CAWD,iLACC,kBACD,CAGD,kBACC,qDAAsD,CACtD,0CAA2C,CAC3C,qDAAsD,CACtD,6CAA8C,CAC9C,kCAAmC,CACnC,aAAc,CACd,+BA4BD,CA1BC,gLAIC,iBACD,CAEA,0CACC,oCAAqC,CACrC,qCACD,CAEA,2CACC,oCAAqC,CACrC,sCACD,CAEA,8CACC,uCAAwC,CACxC,sCACD,CAEA,6CACC,uCAAwC,CACxC,qCACD,CCxED,MACC,iCAAkC,CAClC,kCAAmC,CACnC,4CAA6C,CAC7C,wCAAyC,CAEzC,wCAAiD,CACjD,sCAAkD,CAClD,2EAA4E,CAC5E,yEACD,CAEA,eACC,gDAAiD,CACjD,mBAAoB,CACpB,yBAA0B,CAC1B,6GAUD,CARC,0EAEC,6EACD,CAEA,qBACC,iDACD,CAGD,gCACC,4BAWD,CAPC,yGC/BA,YAAa,CACb,2BAA2B,CCF3B,qCAA8B,CFqC7B,iEACD,CAIA,4EACC,WAAY,CACZ,qBAAsB,CAGtB,4BAA6B,CAC7B,SAAU,CAMV,6SAG6F,CAG7F,iEAAkE,CAGlE,2BAA4B,CAC5B,mDAqBD,CAnBC,qFAEC,wCAAyC,CACzC,yCAA0C,CAC1C,oDASD,CANC,kHACC,SAAU,CAGV,+DACD,CAID,wHACC,SACD,CAID,kFACC,SAAU,CACV,oDACD,CAKC,oMACC,SAAU,CACV,6CAMD,CAHC,gRACC,SACD,CAOH,qFACC,SAAU,CACV,oDACD,CAGA,gDAEC,eAkBD,CAhBC,yEAOC,iCACD,CAGC,gOAEC,gDACD,CAOD,wIAEC,mDAQD,CALE,ghBAEC,gDACD,CAKH,yKAOC,yDACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-resizer: var(--ck-color-focus-border);\n\t--ck-color-resizer-tooltip-background: hsl(0, 0%, 15%);\n\t--ck-color-resizer-tooltip-text: hsl(0, 0%, 95%);\n\n\t--ck-resizer-border-radius: var(--ck-border-radius);\n\t--ck-resizer-tooltip-offset: 10px;\n}\n\n.ck .ck-widget {\n\t/* This is neccessary for type around UI to be positioned properly. */\n\tposition: relative;\n}\n\n.ck .ck-widget.ck-widget_with-selection-handle {\n\t/* Make the widget wrapper a relative positioning container for the drag handle. */\n\tposition: relative;\n\n\t& .ck-widget__selection-handle {\n\t\tposition: absolute;\n\n\t\t& .ck-icon {\n\t\t\t/* Make sure the icon in not a subject to font-size or line-height to avoid\n\t\t\tunnecessary spacing around it. */\n\t\t\tdisplay: block;\n\t\t}\n\t}\n\n\t/* Show the selection handle on mouse hover over the widget. */\n\t&:hover {\n\t\t& .ck-widget__selection-handle {\n\t\t\tvisibility: visible;\n\t\t}\n\t}\n\n\t/* Show the selection handle when the widget is selected. */\n\t&.ck-widget_selected .ck-widget__selection-handle {\n\t\tvisibility: visible;\n\t}\n}\n\n.ck .ck-size-view {\n\tbackground: var(--ck-color-resizer-tooltip-background);\n\tcolor: var(--ck-color-resizer-tooltip-text);\n\tborder: 1px solid var(--ck-color-resizer-tooltip-text);\n\tborder-radius: var(--ck-resizer-border-radius);\n\tfont-size: var(--ck-font-size-tiny);\n\tdisplay: block;\n\tpadding: var(--ck-spacing-small);\n\n\t&.ck-orientation-top-left,\n\t&.ck-orientation-top-right,\n\t&.ck-orientation-bottom-right,\n\t&.ck-orientation-bottom-left {\n\t\tposition: absolute;\n\t}\n\n\t&.ck-orientation-top-left {\n\t\ttop: var(--ck-resizer-tooltip-offset);\n\t\tleft: var(--ck-resizer-tooltip-offset);\n\t}\n\n\t&.ck-orientation-top-right {\n\t\ttop: var(--ck-resizer-tooltip-offset);\n\t\tright: var(--ck-resizer-tooltip-offset);\n\t}\n\n\t&.ck-orientation-bottom-right {\n\t\tbottom: var(--ck-resizer-tooltip-offset);\n\t\tright: var(--ck-resizer-tooltip-offset);\n\t}\n\n\t&.ck-orientation-bottom-left {\n\t\tbottom: var(--ck-resizer-tooltip-offset);\n\t\tleft: var(--ck-resizer-tooltip-offset);\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../mixins/_focus.css";\n@import "../mixins/_shadow.css";\n\n:root {\n\t--ck-widget-outline-thickness: 3px;\n\t--ck-widget-handler-icon-size: 16px;\n\t--ck-widget-handler-animation-duration: 200ms;\n\t--ck-widget-handler-animation-curve: ease;\n\n\t--ck-color-widget-blurred-border: hsl(0, 0%, 87%);\n\t--ck-color-widget-hover-border: hsl(43, 100%, 62%);\n\t--ck-color-widget-editable-focus-background: var(--ck-color-base-background);\n\t--ck-color-widget-drag-handler-icon-color: var(--ck-color-base-background);\n}\n\n.ck .ck-widget {\n\toutline-width: var(--ck-widget-outline-thickness);\n\toutline-style: solid;\n\toutline-color: transparent;\n\ttransition: outline-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\n\n\t&.ck-widget_selected,\n\t&.ck-widget_selected:hover {\n\t\toutline: var(--ck-widget-outline-thickness) solid var(--ck-color-focus-border);\n\t}\n\n\t&:hover {\n\t\toutline-color: var(--ck-color-widget-hover-border);\n\t}\n}\n\n.ck .ck-editor__nested-editable {\n\tborder: 1px solid transparent;\n\n\t/* The :focus style is applied before .ck-editor__nested-editable_focused class is rendered in the view.\n\tThese styles show a different border for a blink of an eye, so `:focus` need to have same styles applied. */\n\t&.ck-editor__nested-editable_focused,\n\t&:focus {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-inner-shadow);\n\n\t\tbackground-color: var(--ck-color-widget-editable-focus-background);\n\t}\n}\n\n.ck .ck-widget.ck-widget_with-selection-handle {\n\t& .ck-widget__selection-handle {\n\t\tpadding: 4px;\n\t\tbox-sizing: border-box;\n\n\t\t/* Background and opacity will be animated as the handler shows up or the widget gets selected. */\n\t\tbackground-color: transparent;\n\t\topacity: 0;\n\n\t\t/* Transition:\n\t\t * background-color for the .ck-widget_selected state change,\n\t\t * visibility for hiding the handler,\n\t\t * opacity for the proper look of the icon when the handler disappears. */\n\t\ttransition:\n\t\t\tbackground-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),\n\t\t\tvisibility var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),\n\t\t\topacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\n\n\t\t/* Make only top corners round. */\n\t\tborder-radius: var(--ck-border-radius) var(--ck-border-radius) 0 0;\n\n\t\t/* Place the drag handler outside the widget wrapper. */\n\t\ttransform: translateY(-100%);\n\t\tleft: calc(0px - var(--ck-widget-outline-thickness));\n\n\t\t& .ck-icon {\n\t\t\t/* Make sure the dimensions of the icon are independent of the fon-size of the content. */\n\t\t\twidth: var(--ck-widget-handler-icon-size);\n\t\t\theight: var(--ck-widget-handler-icon-size);\n\t\t\tcolor: var(--ck-color-widget-drag-handler-icon-color);\n\n\t\t\t/* The "selected" part of the icon is invisible by default */\n\t\t\t& .ck-icon__selected-indicator {\n\t\t\t\topacity: 0;\n\n\t\t\t\t/* Note: The animation is longer on purpose. Simply feels better. */\n\t\t\t\ttransition: opacity 300ms var(--ck-widget-handler-animation-curve);\n\t\t\t}\n\t\t}\n\n\t\t/* Advertise using the look of the icon that once clicked the handler, the widget will be selected. */\n\t\t&:hover .ck-icon .ck-icon__selected-indicator {\n\t\t\topacity: 1;\n\t\t}\n\t}\n\n\t/* Show the selection handler on mouse hover over the widget. */\n\t&:hover .ck-widget__selection-handle {\n\t\topacity: 1;\n\t\tbackground-color: var(--ck-color-widget-hover-border);\n\t}\n\n\t/* Show the selection handler when the widget is selected. */\n\t&.ck-widget_selected,\n\t&.ck-widget_selected:hover {\n\t\t& .ck-widget__selection-handle {\n\t\t\topacity: 1;\n\t\t\tbackground-color: var(--ck-color-focus-border);\n\n\t\t\t/* When the widget is selected, notify the user using the proper look of the icon. */\n\t\t\t& .ck-icon .ck-icon__selected-indicator {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/* In a RTL environment, align the selection handler to the right side of the widget */\n/* stylelint-disable-next-line no-descending-specificity */\n.ck[dir="rtl"] .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle {\n\tleft: auto;\n\tright: calc(0px - var(--ck-widget-outline-thickness));\n}\n\n/* https://github.com/ckeditor/ckeditor5/issues/6415 */\n.ck.ck-editor__editable.ck-read-only .ck-widget {\n\t/* Prevent the :hover outline from showing up because of the used outline-color transition. */\n\ttransition: none;\n\n\t&:not(.ck-widget_selected) {\n\t\t/* Disable visual effects of hover/active widget when CKEditor is in readOnly mode.\n\t\t * See: https://github.com/ckeditor/ckeditor5/issues/1261\n\t\t *\n\t\t * Leave the unit because this custom property is used in calc() by other features.\n\t\t * See: https://github.com/ckeditor/ckeditor5/issues/6775\n\t\t */\n\t\t--ck-widget-outline-thickness: 0px;\n\t}\n\n\t&.ck-widget_with-selection-handle {\n\t\t& .ck-widget__selection-handle,\n\t\t& .ck-widget__selection-handle:hover {\n\t\t\tbackground: var(--ck-color-widget-blurred-border);\n\t\t}\n\t}\n}\n\n/* Style the widget when it\'s selected but the editable it belongs to lost focus. */\n/* stylelint-disable-next-line no-descending-specificity */\n.ck.ck-editor__editable.ck-blurred .ck-widget {\n\t&.ck-widget_selected,\n\t&.ck-widget_selected:hover {\n\t\toutline-color: var(--ck-color-widget-blurred-border);\n\n\t\t&.ck-widget_with-selection-handle {\n\t\t\t& .ck-widget__selection-handle,\n\t\t\t& .ck-widget__selection-handle:hover {\n\t\t\t\tbackground: var(--ck-color-widget-blurred-border);\n\t\t\t}\n\t\t}\n\t}\n}\n\n.ck.ck-editor__editable > .ck-widget.ck-widget_with-selection-handle:first-child,\n.ck.ck-editor__editable blockquote > .ck-widget.ck-widget_with-selection-handle:first-child {\n\t/* Do not crop selection handler if a widget is a first-child in the blockquote or in the root editable.\n\tIn fact, anything with overflow: hidden.\n\thttps://github.com/ckeditor/ckeditor5-block-quote/issues/28\n\thttps://github.com/ckeditor/ckeditor5-widget/issues/44\n\thttps://github.com/ckeditor/ckeditor5-widget/issues/66 */\n\tmargin-top: calc(1em + var(--ck-widget-handler-icon-size));\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,'.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position{display:inline;position:relative;pointer-events:none}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span{position:absolute;width:0}.ck.ck-editor__editable .ck-widget:-webkit-drag>.ck-widget__selection-handle,.ck.ck-editor__editable .ck-widget:-webkit-drag>.ck-widget__type-around{display:none}:root{--ck-clipboard-drop-target-dot-width:12px;--ck-clipboard-drop-target-dot-height:8px;--ck-clipboard-drop-target-color:var(--ck-color-focus-border)}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span{bottom:calc(var(--ck-clipboard-drop-target-dot-height)*-0.5);top:calc(var(--ck-clipboard-drop-target-dot-height)*-0.5);border:1px solid var(--ck-clipboard-drop-target-color);background:var(--ck-clipboard-drop-target-color);margin-left:-1px}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span:after{content:"";width:0;height:0;display:block;position:absolute;left:50%;top:calc(var(--ck-clipboard-drop-target-dot-height)*-0.5);transform:translateX(-50%);border-left:calc(var(--ck-clipboard-drop-target-dot-width)*0.5) solid transparent;border-bottom:0 solid transparent;border-right:calc(var(--ck-clipboard-drop-target-dot-width)*0.5) solid transparent;border-top:calc(var(--ck-clipboard-drop-target-dot-height)) solid var(--ck-clipboard-drop-target-color)}.ck.ck-editor__editable .ck-widget.ck-clipboard-drop-target-range{outline:var(--ck-widget-outline-thickness) solid var(--ck-clipboard-drop-target-color)!important}.ck.ck-editor__editable .ck-widget:-webkit-drag{zoom:.6;outline:none!important}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-clipboard/theme/clipboard.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-clipboard/clipboard.css"],names:[],mappings:"AASC,8DACC,cAAe,CACf,iBAAkB,CAClB,mBAMD,CAJC,mEACC,iBAAkB,CAClB,OACD,CAWA,qJACC,YACD,CCzBF,MACC,yCAA0C,CAC1C,yCAA0C,CAC1C,6DACD,CAOE,mEACC,4DAA8D,CAC9D,yDAA2D,CAC3D,sDAAuD,CACvD,gDAAiD,CACjD,gBAkBD,CAfC,yEACC,UAAW,CACX,OAAQ,CACR,QAAS,CAET,aAAc,CACd,iBAAkB,CAClB,QAAS,CACT,yDAA2D,CAE3D,0BAA2B,CAG3B,iFAAmB,CAAnB,iCAAmB,CAAnB,kFAAmB,CAAnB,uGACD,CA2DF,kEACC,gGACD,CAKA,gDACC,OAAS,CACT,sBACD",sourcesContent:["/*\n * Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor__editable {\n\t/*\n\t * Vertical drop target (in text).\n\t */\n\t& .ck.ck-clipboard-drop-target-position {\n\t\tdisplay: inline;\n\t\tposition: relative;\n\t\tpointer-events: none;\n\n\t\t& span {\n\t\t\tposition: absolute;\n\t\t\twidth: 0;\n\t\t}\n\t}\n\n\t/*\n\t * Styles of the widget being dragged (its preview).\n\t */\n\t& .ck-widget:-webkit-drag {\n\t\t& > .ck-widget__selection-handle {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t& > .ck-widget__type-around {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n",'/*\n * Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-clipboard-drop-target-dot-width: 12px;\n\t--ck-clipboard-drop-target-dot-height: 8px;\n\t--ck-clipboard-drop-target-color: var(--ck-color-focus-border)\n}\n\n.ck.ck-editor__editable {\n\t/*\n\t * Vertical drop target (in text).\n\t */\n\t& .ck.ck-clipboard-drop-target-position {\n\t\t& span {\n\t\t\tbottom: calc(-.5 * var(--ck-clipboard-drop-target-dot-height));\n\t\t\ttop: calc(-.5 * var(--ck-clipboard-drop-target-dot-height));\n\t\t\tborder: 1px solid var(--ck-clipboard-drop-target-color);\n\t\t\tbackground: var(--ck-clipboard-drop-target-color);\n\t\t\tmargin-left: -1px;\n\n\t\t\t/* The triangle above the marker */\n\t\t\t&::after {\n\t\t\t\tcontent: "";\n\t\t\t\twidth: 0;\n\t\t\t\theight: 0;\n\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 50%;\n\t\t\t\ttop: calc(var(--ck-clipboard-drop-target-dot-height) * -.5);\n\n\t\t\t\ttransform: translateX(-50%);\n\t\t\t\tborder-color: var(--ck-clipboard-drop-target-color) transparent transparent transparent;\n\t\t\t\tborder-width: calc(var(--ck-clipboard-drop-target-dot-height)) calc(.5 * var(--ck-clipboard-drop-target-dot-width)) 0 calc(.5 * var(--ck-clipboard-drop-target-dot-width));\n\t\t\t\tborder-style: solid;\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t// Horizontal drop target (between blocks).\n\t& .ck.ck-clipboard-drop-target-position {\n\t\tdisplay: block;\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\theight: 0;\n\t\tmargin: 0;\n\t\ttext-align: initial;\n\n\t\t& .ck-clipboard-drop-target__line {\n\t\t\tposition: absolute;\n\t\t\twidth: 100%;\n\t\t\theight: 0;\n\t\t\tborder: 1px solid var(--ck-clipboard-drop-target-color);\n\t\t\tmargin-top: -1px;\n\n\t\t\t&::before {\n\t\t\t\tcontent: "";\n\t\t\t\twidth: 0;\n\t\t\t\theight: 0;\n\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: calc(-1 * var(--ck-clipboard-drop-target-dot-size));\n\t\t\t\ttop: 0;\n\n\t\t\t\ttransform: translateY(-50%);\n\t\t\t\tborder-color: transparent transparent transparent var(--ck-clipboard-drop-target-color);\n\t\t\t\tborder-width: var(--ck-clipboard-drop-target-dot-size) 0 var(--ck-clipboard-drop-target-dot-size) calc(2 * var(--ck-clipboard-drop-target-dot-size));\n\t\t\t\tborder-style: solid;\n\t\t\t}\n\n\t\t\t&::after {\n\t\t\t\tcontent: "";\n\t\t\t\twidth: 0;\n\t\t\t\theight: 0;\n\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tright: calc(-1 * var(--ck-clipboard-drop-target-dot-size));\n\t\t\t\ttop: 0;\n\n\t\t\t\ttransform: translateY(-50%);\n\t\t\t\tborder-color: transparent var(--ck-clipboard-drop-target-color) transparent transparent;\n\t\t\t\tborder-width: var(--ck-clipboard-drop-target-dot-size) calc(2 * var(--ck-clipboard-drop-target-dot-size)) var(--ck-clipboard-drop-target-dot-size) 0;\n\t\t\t\tborder-style: solid;\n\t\t\t}\n\t\t}\n\t}\n\t*/\n\n\t/*\n\t * Styles of the widget that it a drop target.\n\t */\n\t& .ck-widget.ck-clipboard-drop-target-range {\n\t\toutline: var(--ck-widget-outline-thickness) solid var(--ck-clipboard-drop-target-color) !important;\n\t}\n\n\t/*\n\t * Styles of the widget being dragged (its preview).\n\t */\n\t& .ck-widget:-webkit-drag {\n\t\tzoom: 0.6;\n\t\toutline: none !important;\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck .ck-widget_with-resizer{position:relative}.ck .ck-widget__resizer{display:none;position:absolute;pointer-events:none;left:0;top:0}.ck-focused .ck-widget_with-resizer.ck-widget_selected>.ck-widget__resizer{display:block}.ck .ck-widget__resizer__handle{position:absolute;pointer-events:all}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right,.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{cursor:nwse-resize}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left,.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{cursor:nesw-resize}:root{--ck-resizer-size:10px;--ck-resizer-offset:calc(var(--ck-resizer-size)/-2 - 2px);--ck-resizer-border-width:1px}.ck .ck-widget__resizer{outline:1px solid var(--ck-color-resizer)}.ck .ck-widget__resizer__handle{width:var(--ck-resizer-size);height:var(--ck-resizer-size);background:var(--ck-color-focus-border);border:var(--ck-resizer-border-width) solid #fff;border-radius:var(--ck-resizer-border-radius)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{top:var(--ck-resizer-offset);left:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{top:var(--ck-resizer-offset);right:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right{bottom:var(--ck-resizer-offset);right:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left{bottom:var(--ck-resizer-offset);left:var(--ck-resizer-offset)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-widget/theme/widgetresize.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-widget/widgetresize.css"],names:[],mappings:"AAKA,4BAEC,iBACD,CAEA,wBACC,YAAa,CACb,iBAAkB,CAGlB,mBAAoB,CAEpB,MAAO,CACP,KACD,CAGC,2EACC,aACD,CAGD,gCACC,iBAAkB,CAGlB,kBAWD,CATC,4IAEC,kBACD,CAEA,4IAEC,kBACD,CCpCD,MACC,sBAAuB,CAGvB,yDAAiE,CACjE,6BACD,CAEA,wBACC,yCACD,CAEA,gCACC,4BAA6B,CAC7B,6BAA8B,CAC9B,uCAAwC,CACxC,gDAA6D,CAC7D,6CAqBD,CAnBC,oEACC,4BAA6B,CAC7B,6BACD,CAEA,qEACC,4BAA6B,CAC7B,8BACD,CAEA,wEACC,+BAAgC,CAChC,8BACD,CAEA,uEACC,+BAAgC,CAChC,6BACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-widget_with-resizer {\n\t/* Make the widget wrapper a relative positioning container for the drag handle. */\n\tposition: relative;\n}\n\n.ck .ck-widget__resizer {\n\tdisplay: none;\n\tposition: absolute;\n\n\t/* The wrapper itself should not interfere with the pointer device, only the handles should. */\n\tpointer-events: none;\n\n\tleft: 0;\n\ttop: 0;\n}\n\n.ck-focused .ck-widget_with-resizer.ck-widget_selected {\n\t& > .ck-widget__resizer {\n\t\tdisplay: block;\n\t}\n}\n\n.ck .ck-widget__resizer__handle {\n\tposition: absolute;\n\n\t/* Resizers are the only UI elements that should interfere with a pointer device. */\n\tpointer-events: all;\n\n\t&.ck-widget__resizer__handle-top-left,\n\t&.ck-widget__resizer__handle-bottom-right {\n\t\tcursor: nwse-resize;\n\t}\n\n\t&.ck-widget__resizer__handle-top-right,\n\t&.ck-widget__resizer__handle-bottom-left {\n\t\tcursor: nesw-resize;\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-resizer-size: 10px;\n\n\t/* Set the resizer with a 50% offset. */\n\t--ck-resizer-offset: calc( ( var(--ck-resizer-size) / -2 ) - 2px);\n\t--ck-resizer-border-width: 1px;\n}\n\n.ck .ck-widget__resizer {\n\toutline: 1px solid var(--ck-color-resizer);\n}\n\n.ck .ck-widget__resizer__handle {\n\twidth: var(--ck-resizer-size);\n\theight: var(--ck-resizer-size);\n\tbackground: var(--ck-color-focus-border);\n\tborder: var(--ck-resizer-border-width) solid hsl(0, 0%, 100%);\n\tborder-radius: var(--ck-resizer-border-radius);\n\n\t&.ck-widget__resizer__handle-top-left {\n\t\ttop: var(--ck-resizer-offset);\n\t\tleft: var(--ck-resizer-offset);\n\t}\n\n\t&.ck-widget__resizer__handle-top-right {\n\t\ttop: var(--ck-resizer-offset);\n\t\tright: var(--ck-resizer-offset);\n\t}\n\n\t&.ck-widget__resizer__handle-bottom-right {\n\t\tbottom: var(--ck-resizer-offset);\n\t\tright: var(--ck-resizer-offset);\n\t}\n\n\t&.ck-widget__resizer__handle-bottom-left {\n\t\tbottom: var(--ck-resizer-offset);\n\t\tleft: var(--ck-resizer-offset);\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck-content blockquote{overflow:hidden;padding-right:1.5em;padding-left:1.5em;margin-left:0;margin-right:0;font-style:italic;border-left:5px solid #ccc}.ck-content[dir=rtl] blockquote{border-left:0;border-right:5px solid #ccc}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-block-quote/theme/blockquote.css"],names:[],mappings:"AAKA,uBAEC,eAAgB,CAGhB,mBAAoB,CACpB,kBAAmB,CAEnB,aAAc,CACd,cAAe,CACf,iBAAkB,CAClB,0BACD,CAEA,gCACC,aAAc,CACd,2BACD",sourcesContent:['/**\n * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content blockquote {\n\t/* See #12 */\n\toverflow: hidden;\n\n\t/* https://github.com/ckeditor/ckeditor5-block-quote/issues/15 */\n\tpadding-right: 1.5em;\n\tpadding-left: 1.5em;\n\n\tmargin-left: 0;\n\tmargin-right: 0;\n\tfont-style: italic;\n\tborder-left: solid 5px hsl(0, 0%, 80%);\n}\n\n.ck-content[dir="rtl"] blockquote {\n\tborder-left: 0;\n\tborder-right: solid 5px hsl(0, 0%, 80%);\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck .ck-button.ck-color-table__remove-color{display:flex;align-items:center;width:100%}label.ck.ck-color-grid__label{font-weight:unset}.ck .ck-button.ck-color-table__remove-color{padding:calc(var(--ck-spacing-standard)/2) var(--ck-spacing-standard);border-bottom-left-radius:0;border-bottom-right-radius:0}.ck .ck-button.ck-color-table__remove-color:not(:focus){border-bottom:1px solid var(--ck-color-base-border)}[dir=ltr] .ck .ck-button.ck-color-table__remove-color .ck.ck-icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck .ck-button.ck-color-table__remove-color .ck.ck-icon{margin-left:var(--ck-spacing-standard)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-font/theme/fontcolor.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-font/fontcolor.css"],names:[],mappings:"AAKA,4CACC,YAAa,CACb,kBAAmB,CACnB,UACD,CAEA,8BACC,iBACD,CCNA,4CACC,qEAAyE,CACzE,2BAA4B,CAC5B,4BAeD,CAbC,wDACC,mDACD,CAEA,kEAEE,uCAMF,CARA,kEAME,sCAEF",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-button.ck-color-table__remove-color {\n\tdisplay: flex;\n\talign-items: center;\n\twidth: 100%;\n}\n\nlabel.ck.ck-color-grid__label {\n\tfont-weight: unset;\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck .ck-button.ck-color-table__remove-color {\n\tpadding: calc(var(--ck-spacing-standard) / 2 ) var(--ck-spacing-standard);\n\tborder-bottom-left-radius: 0;\n\tborder-bottom-right-radius: 0;\n\n\t&:not(:focus) {\n\t\tborder-bottom: 1px solid var(--ck-color-base-border);\n\t}\n\n\t& .ck.ck-icon {\n\t\t@mixin ck-dir ltr {\n\t\t\tmargin-right: var(--ck-spacing-standard);\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n}\n\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck-content .text-tiny{font-size:.7em}.ck-content .text-small{font-size:.85em}.ck-content .text-big{font-size:1.4em}.ck-content .text-huge{font-size:1.8em}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-font/theme/fontsize.css"],names:[],mappings:"AAUC,uBACC,cACD,CAEA,wBACC,eACD,CAEA,sBACC,eACD,CAEA,uBACC,eACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* The values should be synchronized with the "FONT_SIZE_PRESET_UNITS" object in the "/src/fontsize/utils.js" file. */\n\n/* Styles should be prefixed with the `.ck-content` class.\nSee https://github.com/ckeditor/ckeditor5/issues/6636 */\n.ck-content {\n\t& .text-tiny {\n\t\tfont-size: .7em;\n\t}\n\n\t& .text-small {\n\t\tfont-size: .85em;\n\t}\n\n\t& .text-big {\n\t\tfont-size: 1.4em;\n\t}\n\n\t& .text-huge {\n\t\tfont-size: 1.8em;\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-heading_heading1{font-size:20px}.ck.ck-heading_heading2{font-size:17px}.ck.ck-heading_heading3{font-size:14px}.ck[class*=ck-heading_heading]{font-weight:700}.ck.ck-dropdown.ck-heading-dropdown .ck-dropdown__button .ck-button__label{width:8em}.ck.ck-dropdown.ck-heading-dropdown .ck-dropdown__panel .ck-list__item{min-width:18em}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-heading/theme/heading.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-heading/heading.css"],names:[],mappings:"AAKA,wBACC,cACD,CAEA,wBACC,cACD,CAEA,wBACC,cACD,CAEA,+BACC,eACD,CCZC,2EACC,SACD,CAEA,uEACC,cACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-heading_heading1 {\n\tfont-size: 20px;\n}\n\n.ck.ck-heading_heading2 {\n\tfont-size: 17px;\n}\n\n.ck.ck-heading_heading3 {\n\tfont-size: 14px;\n}\n\n.ck[class*="ck-heading_heading"] {\n\tfont-weight: bold;\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* Resize dropdown's button label. */\n.ck.ck-dropdown.ck-heading-dropdown {\n\t& .ck-dropdown__button .ck-button__label {\n\t\twidth: 8em;\n\t}\n\n\t& .ck-dropdown__panel .ck-list__item {\n\t\tmin-width: 18em;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,":root{--ck-highlight-marker-yellow:#fdfd77;--ck-highlight-marker-green:#62f962;--ck-highlight-marker-pink:#fc7899;--ck-highlight-marker-blue:#72ccfd;--ck-highlight-pen-red:#e71313;--ck-highlight-pen-green:#128a00}.ck-content .marker-yellow{background-color:var(--ck-highlight-marker-yellow)}.ck-content .marker-green{background-color:var(--ck-highlight-marker-green)}.ck-content .marker-pink{background-color:var(--ck-highlight-marker-pink)}.ck-content .marker-blue{background-color:var(--ck-highlight-marker-blue)}.ck-content .pen-red{color:var(--ck-highlight-pen-red);background-color:transparent}.ck-content .pen-green{color:var(--ck-highlight-pen-green);background-color:transparent}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-highlight/theme/highlight.css"],names:[],mappings:"AAKA,MACC,oCAA+C,CAC/C,mCAA+C,CAC/C,kCAA8C,CAC9C,kCAA8C,CAC9C,8BAAwC,CACxC,gCACD,CAGC,2BACC,kDACD,CAFA,0BACC,iDACD,CAFA,yBACC,gDACD,CAFA,yBACC,gDACD,CAIA,qBACC,iCAAqC,CAGrC,4BACD,CALA,uBACC,mCAAqC,CAGrC,4BACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-highlight-marker-yellow: hsl(60, 97%, 73%);\n\t--ck-highlight-marker-green: hsl(120, 93%, 68%);\n\t--ck-highlight-marker-pink: hsl(345, 96%, 73%);\n\t--ck-highlight-marker-blue: hsl(201, 97%, 72%);\n\t--ck-highlight-pen-red: hsl(0, 85%, 49%);\n\t--ck-highlight-pen-green: hsl(112, 100%, 27%);\n}\n\n@define-mixin highlight-marker-color $color {\n\t.ck-content .marker-$color {\n\t\tbackground-color: var(--ck-highlight-marker-$color);\n\t}\n}\n\n@define-mixin highlight-pen-color $color {\n\t.ck-content .pen-$color {\n\t\tcolor: var(--ck-highlight-pen-$color);\n\n\t\t/* Override default yellow background of `<mark>` from user agent stylesheet */\n\t\tbackground-color: transparent;\n\t}\n}\n\n@mixin highlight-marker-color yellow;\n@mixin highlight-marker-color green;\n@mixin highlight-marker-color pink;\n@mixin highlight-marker-color blue;\n\n@mixin highlight-pen-color red;\n@mixin highlight-pen-color green;\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck-editor__editable .ck-horizontal-line{display:flow-root}.ck-content hr{margin:15px 0;height:4px;background:#dedede;border:0}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-horizontal-line/theme/horizontalline.css"],names:[],mappings:"AAMA,yCAEC,iBACD,CAEA,eACC,aAAc,CACd,UAAW,CACX,kBAA2B,CAC3B,QACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n\n.ck-editor__editable .ck-horizontal-line {\n\t/* Necessary to render properly next to floated objects, e.g. side image case. */\n\tdisplay: flow-root;\n}\n\n.ck-content hr {\n\tmargin: 15px 0;\n\theight: 4px;\n\tbackground: hsl(0, 0%, 87%);\n\tborder: 0;\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck-widget.raw-html-embed{margin:1em auto;position:relative;display:flow-root}.ck-widget.raw-html-embed:before{position:absolute;z-index:1}.ck-widget.raw-html-embed .raw-html-embed__buttons-wrapper{position:absolute;display:flex;flex-direction:column}.ck-widget.raw-html-embed .raw-html-embed__preview{position:relative;overflow:hidden;display:flex}.ck-widget.raw-html-embed .raw-html-embed__preview-content{width:100%;position:relative;margin:auto;display:table;border-collapse:separate;border-spacing:7px}.ck-widget.raw-html-embed .raw-html-embed__preview-placeholder{position:absolute;left:0;top:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center}.ck-content .raw-html-embed{margin:1em auto;min-width:15em;font-style:normal}:root{--ck-html-embed-content-width:calc(100% - var(--ck-icon-size)*1.5);--ck-html-embed-source-height:10em;--ck-html-embed-unfocused-outline-width:1px;--ck-html-embed-content-min-height:calc(var(--ck-icon-size) + var(--ck-spacing-standard));--ck-html-embed-source-disabled-background:var(--ck-color-base-foreground);--ck-html-embed-source-disabled-color:hsl(0deg 0% 45%)}.ck-widget.raw-html-embed{font-size:var(--ck-font-size-base);background-color:var(--ck-color-base-foreground)}.ck-widget.raw-html-embed:not(.ck-widget_selected):not(:hover){outline:var(--ck-html-embed-unfocused-outline-width) dashed var(--ck-color-widget-blurred-border)}.ck-widget.raw-html-embed[dir=ltr]{text-align:left}.ck-widget.raw-html-embed[dir=rtl]{text-align:right}.ck-widget.raw-html-embed:before{content:attr(data-html-embed-label);top:calc(var(--ck-html-embed-unfocused-outline-width)*-1);left:var(--ck-spacing-standard);background:hsl(0deg 0% 60%);transition:background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);padding:calc(var(--ck-spacing-tiny) + var(--ck-html-embed-unfocused-outline-width)) var(--ck-spacing-small) var(--ck-spacing-tiny);border-radius:0 0 var(--ck-border-radius) var(--ck-border-radius);color:var(--ck-color-base-background);font-size:var(--ck-font-size-tiny);font-family:var(--ck-font-face)}.ck-widget.raw-html-embed[dir=rtl]:before{left:auto;right:var(--ck-spacing-standard)}.ck-widget.raw-html-embed[dir=ltr] .ck-widget__type-around .ck-widget__type-around__button.ck-widget__type-around__button_before{margin-left:50px}.ck.ck-editor__editable.ck-blurred .ck-widget.raw-html-embed.ck-widget_selected:before{top:0;padding:var(--ck-spacing-tiny) var(--ck-spacing-small)}.ck.ck-editor__editable:not(.ck-blurred) .ck-widget.raw-html-embed.ck-widget_selected:before{top:0;padding:var(--ck-spacing-tiny) var(--ck-spacing-small);background:var(--ck-color-focus-border)}.ck.ck-editor__editable .ck-widget.raw-html-embed:not(.ck-widget_selected):hover:before{top:0;padding:var(--ck-spacing-tiny) var(--ck-spacing-small)}.ck-widget.raw-html-embed .raw-html-embed__content-wrapper{padding:var(--ck-spacing-standard)}.ck-widget.raw-html-embed .raw-html-embed__buttons-wrapper{top:var(--ck-spacing-standard);right:var(--ck-spacing-standard)}.ck-widget.raw-html-embed .raw-html-embed__buttons-wrapper .ck-button.raw-html-embed__save-button{color:var(--ck-color-button-save)}.ck-widget.raw-html-embed .raw-html-embed__buttons-wrapper .ck-button.raw-html-embed__cancel-button{color:var(--ck-color-button-cancel)}.ck-widget.raw-html-embed .raw-html-embed__buttons-wrapper .ck-button:not(:first-child){margin-top:var(--ck-spacing-small)}.ck-widget.raw-html-embed[dir=rtl] .raw-html-embed__buttons-wrapper{left:var(--ck-spacing-standard);right:auto}.ck-widget.raw-html-embed .raw-html-embed__source{box-sizing:border-box;height:var(--ck-html-embed-source-height);width:var(--ck-html-embed-content-width);resize:none;min-width:0;padding:var(--ck-spacing-standard);font-family:monospace;tab-size:4;white-space:pre-wrap;font-size:var(--ck-font-size-base);text-align:left;direction:ltr}.ck-widget.raw-html-embed .raw-html-embed__source[disabled]{background:var(--ck-html-embed-source-disabled-background);color:var(--ck-html-embed-source-disabled-color);-webkit-text-fill-color:var(--ck-html-embed-source-disabled-color);opacity:1}.ck-widget.raw-html-embed .raw-html-embed__preview{min-height:var(--ck-html-embed-content-min-height);width:var(--ck-html-embed-content-width)}.ck-editor__editable:not(.ck-read-only) .ck-widget.raw-html-embed .raw-html-embed__preview{pointer-events:none}.ck-widget.raw-html-embed .raw-html-embed__preview-content{box-sizing:border-box;text-align:center;background-color:var(--ck-color-base-foreground)}.ck-widget.raw-html-embed .raw-html-embed__preview-content>*{margin-left:auto;margin-right:auto}.ck-widget.raw-html-embed .raw-html-embed__preview-placeholder{color:var(--ck-html-embed-source-disabled-color)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-html-embed/theme/htmlembed.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-html-embed/htmlembed.css"],names:[],mappings:"AAMA,0BAEC,eAAgB,CAChB,iBAAkB,CAClB,iBAgDD,CA5CC,iCACC,iBAAkB,CAGlB,SACD,CAKA,2DACC,iBAAkB,CAClB,YAAa,CACb,qBACD,CAEA,mDACC,iBAAkB,CAClB,eAAgB,CAChB,YACD,CAEA,2DACC,UAAW,CACX,iBAAkB,CAClB,WAAY,CAGZ,aAAc,CACd,wBAAyB,CACzB,kBACD,CAEA,+DACC,iBAAkB,CAClB,MAAO,CACP,KAAM,CACN,OAAQ,CACR,QAAS,CAET,YAAa,CACb,kBAAmB,CACnB,sBACD,CAGD,4BAEC,eAAgB,CAIhB,cAAe,CAGf,iBACD,CCjEA,MACC,kEAAqE,CACrE,kCAAmC,CACnC,2CAA4C,CAC5C,yFAA0F,CAE1F,0EAA2E,CAC3E,sDACD,CAGA,0BACC,kCAAmC,CACnC,gDA0ID,CAxIC,+DACC,iGACD,CAGA,mCACC,eACD,CAEA,mCACC,gBACD,CAIA,iCACC,mCAAoC,CACpC,yDAA4D,CAC5D,+BAAgC,CAChC,2BAA4B,CAC5B,0GAA2G,CAC3G,kIAAmI,CACnI,iEAAkE,CAClE,qCAAsC,CACtC,kCAAmC,CACnC,+BACD,CAEA,0CACC,SAAU,CACV,gCACD,CAGA,iIACC,gBACD,CAxCD,uFA2CE,KAAQ,CACR,sDAgGF,CA5IA,6FAgDE,KAAM,CACN,sDAAuD,CACvD,uCA0FF,CA5IA,wFAsDE,KAAQ,CACR,sDAqFF,CAhFC,2DACC,kCACD,CAGA,2DACC,8BAA+B,CAC/B,gCAaD,CAXC,kGACC,iCACD,CAEA,oGACC,mCACD,CAEA,wFACC,kCACD,CAGD,oEACC,+BAAgC,CAChC,UACD,CAGA,kDACC,qBAAsB,CACtB,yCAA0C,CAC1C,wCAAyC,CACzC,WAAY,CACZ,WAAY,CACZ,kCAAmC,CAEnC,qBAAsB,CACtB,UAAW,CACX,oBAAqB,CACrB,kCAAmC,CAGnC,eAAgB,CAChB,aAUD,CARC,4DACC,0DAA2D,CAC3D,gDAAiD,CAGjD,kEAAmE,CACnE,SACD,CAID,mDACC,kDAAmD,CACnD,wCAMD,CARA,2FAME,mBAEF,CAEA,2DACC,qBAAsB,CACtB,iBAAkB,CAClB,gDAMD,CAJC,6DACC,gBAAiB,CACjB,iBACD,CAGD,+DACC,gDACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* The feature container. */\n.ck-widget.raw-html-embed {\n\t/* Give the embed some air. */\n\tmargin: 1em auto;\n\tposition: relative;\n\tdisplay: flow-root;\n\n\t/* ----- Emebed label in the upper left corner ----------------------------------------------- */\n\n\t&::before {\n\t\tposition: absolute;\n\n\t\t/* Make sure the content does not cover the label. */\n\t\tz-index: 1;\n\t}\n\n\t/* ----- Emebed internals --------------------------------------------------------------------- */\n\n\t/* The switch mode button wrapper. */\n\t& .raw-html-embed__buttons-wrapper {\n\t\tposition: absolute;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t& .raw-html-embed__preview {\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tdisplay: flex;\n\t}\n\n\t& .raw-html-embed__preview-content {\n\t\twidth: 100%;\n\t\tposition: relative;\n\t\tmargin: auto;\n\n\t\t/* Gives spacing to the small renderable elements, so they always cover the placeholder. */\n\t\tdisplay: table;\n\t\tborder-collapse: separate;\n\t\tborder-spacing: 7px;\n\t}\n\n\t& .raw-html-embed__preview-placeholder {\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\ttop: 0;\n\t\tright: 0;\n\t\tbottom: 0;\n\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n}\n\n.ck-content .raw-html-embed {\n\t/* Give the embed some air. */\n\tmargin: 1em auto;\n\n\t/* Give the html embed some minimal width in the content to prevent them\n\tfrom being "squashed" in tight spaces, e.g. in table cells (https://github.com/ckeditor/ckeditor5/issues/8331) */\n\tmin-width: 15em;\n\n\t/* Don\'t inherit the style, e.g. when in a block quote. */\n\tfont-style: normal;\n}\n','/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-html-embed-content-width: calc(100% - 1.5 * var(--ck-icon-size));\n\t--ck-html-embed-source-height: 10em;\n\t--ck-html-embed-unfocused-outline-width: 1px;\n\t--ck-html-embed-content-min-height: calc(var(--ck-icon-size) + var(--ck-spacing-standard));\n\n\t--ck-html-embed-source-disabled-background: var(--ck-color-base-foreground);\n\t--ck-html-embed-source-disabled-color: hsl(0deg 0% 45%);\n}\n\n/* The feature container. */\n.ck-widget.raw-html-embed {\n\tfont-size: var(--ck-font-size-base);\n\tbackground-color: var(--ck-color-base-foreground);\n\n\t&:not(.ck-widget_selected):not(:hover) {\n\t\toutline: var(--ck-html-embed-unfocused-outline-width) dashed var(--ck-color-widget-blurred-border);\n\t}\n\n\t/* HTML embed widget itself should respect UI language direction */\n\t&[dir="ltr"] {\n\t\ttext-align: left;\n\t}\n\n\t&[dir="rtl"] {\n\t\ttext-align: right;\n\t}\n\n\t/* ----- Embed label in the upper left corner ----------------------------------------------- */\n\n\t&::before {\n\t\tcontent: attr(data-html-embed-label);\n\t\ttop: calc(-1 * var(--ck-html-embed-unfocused-outline-width));\n\t\tleft: var(--ck-spacing-standard);\n\t\tbackground: hsl(0deg 0% 60%);\n\t\ttransition: background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\n\t\tpadding: calc(var(--ck-spacing-tiny) + var(--ck-html-embed-unfocused-outline-width)) var(--ck-spacing-small) var(--ck-spacing-tiny);\n\t\tborder-radius: 0 0 var(--ck-border-radius) var(--ck-border-radius);\n\t\tcolor: var(--ck-color-base-background);\n\t\tfont-size: var(--ck-font-size-tiny);\n\t\tfont-family: var(--ck-font-face);\n\t}\n\n\t&[dir="rtl"]::before {\n\t\tleft: auto;\n\t\tright: var(--ck-spacing-standard);\n\t}\n\n\t/* Make space for label but it only collides in LTR languages */\n\t&[dir="ltr"] .ck-widget__type-around .ck-widget__type-around__button.ck-widget__type-around__button_before {\n\t\tmargin-left: 50px;\n\t}\n\n\t@nest .ck.ck-editor__editable.ck-blurred &.ck-widget_selected::before {\n\t\ttop: 0px;\n\t\tpadding: var(--ck-spacing-tiny) var(--ck-spacing-small);\n\t}\n\n\t@nest .ck.ck-editor__editable:not(.ck-blurred) &.ck-widget_selected::before {\n\t\ttop: 0;\n\t\tpadding: var(--ck-spacing-tiny) var(--ck-spacing-small);\n\t\tbackground: var(--ck-color-focus-border);\n\t}\n\n\t@nest .ck.ck-editor__editable &:not(.ck-widget_selected):hover::before {\n\t\ttop: 0px;\n\t\tpadding: var(--ck-spacing-tiny) var(--ck-spacing-small);\n\t}\n\n\t/* ----- Emebed internals --------------------------------------------------------------------- */\n\n\t& .raw-html-embed__content-wrapper {\n\t\tpadding: var(--ck-spacing-standard);\n\t}\n\n\t/* The switch mode button wrapper. */\n\t& .raw-html-embed__buttons-wrapper {\n\t\ttop: var(--ck-spacing-standard);\n\t\tright: var(--ck-spacing-standard);\n\n\t\t& .ck-button.raw-html-embed__save-button {\n\t\t\tcolor: var(--ck-color-button-save);\n\t\t}\n\n\t\t& .ck-button.raw-html-embed__cancel-button {\n\t\t\tcolor: var(--ck-color-button-cancel);\n\t\t}\n\n\t\t& .ck-button:not(:first-child) {\n\t\t\tmargin-top: var(--ck-spacing-small);\n\t\t}\n\t}\n\n\t&[dir="rtl"] .raw-html-embed__buttons-wrapper {\n\t\tleft: var(--ck-spacing-standard);\n\t\tright: auto;\n\t}\n\n\t/* The edit source element. */\n\t& .raw-html-embed__source {\n\t\tbox-sizing: border-box;\n\t\theight: var(--ck-html-embed-source-height);\n\t\twidth: var(--ck-html-embed-content-width);\n\t\tresize: none;\n\t\tmin-width: 0;\n\t\tpadding: var(--ck-spacing-standard);\n\n\t\tfont-family: monospace;\n\t\ttab-size: 4;\n\t\twhite-space: pre-wrap;\n\t\tfont-size: var(--ck-font-size-base); /* Safari needs this. */\n\n\t\t/* HTML code is direction–agnostic. */\n\t\ttext-align: left;\n\t\tdirection: ltr;\n\n\t\t&[disabled] {\n\t\t\tbackground: var(--ck-html-embed-source-disabled-background);\n\t\t\tcolor: var(--ck-html-embed-source-disabled-color);\n\n\t\t\t/* Safari needs this for the proper text color in disabled input (https://github.com/ckeditor/ckeditor5/issues/8320). */\n\t\t\t-webkit-text-fill-color: var(--ck-html-embed-source-disabled-color);\n\t\t\topacity: 1;\n\t\t}\n\t}\n\n\t/* The preview data container. */\n\t& .raw-html-embed__preview {\n\t\tmin-height: var(--ck-html-embed-content-min-height);\n\t\twidth: var(--ck-html-embed-content-width);\n\n\t\t/* Disable all mouse interaction as long as the editor is not read–only. */\n\t\t@nest .ck-editor__editable:not(.ck-read-only) & {\n\t\t\tpointer-events: none;\n\t\t}\n\t}\n\n\t& .raw-html-embed__preview-content {\n\t\tbox-sizing: border-box;\n\t\ttext-align: center;\n\t\tbackground-color: var(--ck-color-base-foreground);\n\n\t\t& > * {\n\t\t\tmargin-left: auto;\n\t\t\tmargin-right: auto;\n\t\t}\n\t}\n\n\t& .raw-html-embed__preview-placeholder {\n\t\tcolor: var(--ck-html-embed-source-disabled-color)\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-text-alternative-form{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-text-alternative-form .ck-labeled-field-view{display:inline-block}.ck.ck-text-alternative-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-text-alternative-form{flex-wrap:wrap}.ck.ck-text-alternative-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-text-alternative-form .ck-button{flex-basis:50%}}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/textalternativeform.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css"],names:[],mappings:"AAOA,6BACC,YAAa,CACb,kBAAmB,CACnB,gBAqBD,CAnBC,oDACC,oBACD,CAEA,uCACC,YACD,CCZA,oCDCD,6BAcE,cAUF,CARE,oDACC,eACD,CAEA,wCACC,cACD,CCrBD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-text-alternative-form {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\n\t& .ck-labeled-field-view {\n\t\tdisplay: inline-block;\n\t}\n\n\t& .ck-label {\n\t\tdisplay: none;\n\t}\n\n\t@mixin ck-media-phone {\n\t\tflex-wrap: wrap;\n\n\t\t& .ck-labeled-field-view {\n\t\t\tflex-basis: 100%;\n\t\t}\n\n\t\t& .ck-button {\n\t\t\tflex-basis: 50%;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,'.ck-vertical-form .ck-button:after{content:"";width:0;position:absolute;right:-1px;top:var(--ck-spacing-small);bottom:var(--ck-spacing-small);z-index:1}@media screen and (max-width:600px){.ck.ck-responsive-form .ck-button:after{content:"";width:0;position:absolute;right:-1px;top:var(--ck-spacing-small);bottom:var(--ck-spacing-small);z-index:1}}.ck-vertical-form>.ck-button:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form{padding:var(--ck-spacing-large)}.ck.ck-responsive-form:focus{outline:none}[dir=ltr] .ck.ck-responsive-form>:not(:first-child),[dir=rtl] .ck.ck-responsive-form>:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-responsive-form{padding:0;width:calc(var(--ck-input-text-width)*0.8)}.ck.ck-responsive-form .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) 0}.ck.ck-responsive-form .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-responsive-form .ck-labeled-field-view .ck-labeled-field-view__error{white-space:normal}.ck.ck-responsive-form>.ck-button:last-child,.ck.ck-responsive-form>.ck-button:nth-last-child(2){padding:var(--ck-spacing-standard);margin-top:var(--ck-spacing-large);border-radius:0;border:0;border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-responsive-form>.ck-button:last-child,[dir=ltr] .ck.ck-responsive-form>.ck-button:nth-last-child(2),[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2){margin-left:0}.ck.ck-responsive-form>.ck-button:nth-last-child(2):after,[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child:last-of-type,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2):last-of-type{border-right:1px solid var(--ck-color-base-border)}}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/responsive-form/responsiveform.css"],names:[],mappings:"AAOA,mCACC,UAAW,CACX,OAAQ,CACR,iBAAkB,CAClB,UAAW,CACX,2BAA4B,CAC5B,8BAA+B,CAC/B,SACD,CCTC,oCDaC,wCACC,UAAW,CACX,OAAQ,CACR,iBAAkB,CAClB,UAAW,CACX,2BAA4B,CAC5B,8BAA+B,CAC/B,SACD,CCnBD,CCAD,qDACC,kDACD,CAEA,uBACC,+BAkED,CAhEC,6BAEC,YACD,CASC,uGACC,sCACD,CDvBD,oCCMD,uBAqBE,SAAU,CACV,0CA6CF,CA3CE,8CACC,wDAWD,CATC,6DACC,WAAY,CACZ,UACD,CAGA,4EACC,kBACD,CAID,iGAEC,kCAAmC,CACnC,kCAAmC,CAEnC,eAAgB,CAChB,QAAS,CACT,gDAaD,CApBA,0OAcE,aAMF,CAGC,yMACC,kDACD,CDpEF",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck-vertical-form .ck-button::after {\n\tcontent: "";\n\twidth: 0;\n\tposition: absolute;\n\tright: -1px;\n\ttop: var(--ck-spacing-small);\n\tbottom: var(--ck-spacing-small);\n\tz-index: 1;\n}\n\n.ck.ck-responsive-form {\n\t@mixin ck-media-phone {\n\t\t& .ck-button::after {\n\t\t\tcontent: "";\n\t\t\twidth: 0;\n\t\t\tposition: absolute;\n\t\t\tright: -1px;\n\t\t\ttop: var(--ck-spacing-small);\n\t\t\tbottom: var(--ck-spacing-small);\n\t\t\tz-index: 1;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck-vertical-form > .ck-button:nth-last-child(2)::after {\n\tborder-right: 1px solid var(--ck-color-base-border);\n}\n\n.ck.ck-responsive-form {\n\tpadding: var(--ck-spacing-large);\n\n\t&:focus {\n\t\t/* See: https://github.com/ckeditor/ckeditor5/issues/4773 */\n\t\toutline: none;\n\t}\n\n\t@mixin ck-dir ltr {\n\t\t& > :not(:first-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-dir rtl {\n\t\t& > :not(:last-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-media-phone {\n\t\tpadding: 0;\n\t\twidth: calc(.8 * var(--ck-input-text-width));\n\n\t\t& .ck-labeled-field-view {\n\t\t\tmargin: var(--ck-spacing-large) var(--ck-spacing-large) 0;\n\n\t\t\t& .ck-input-text {\n\t\t\t\tmin-width: 0;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t/* Let the long error messages wrap in the narrow form. */\n\t\t\t& .ck-labeled-field-view__error {\n\t\t\t\twhite-space: normal;\n\t\t\t}\n\t\t}\n\n\t\t/* Styles for two last buttons in the form (save&cancel, edit&unlink, etc.). */\n\t\t& > .ck-button:nth-last-child(1),\n\t\t& > .ck-button:nth-last-child(2) {\n\t\t\tpadding: var(--ck-spacing-standard);\n\t\t\tmargin-top: var(--ck-spacing-large);\n\n\t\t\tborder-radius: 0;\n\t\t\tborder: 0;\n\t\t\tborder-top: 1px solid var(--ck-color-base-border);\n\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-left: 0;\n\n\t\t\t\t&:last-of-type {\n\t\t\t\t\tborder-right: 1px solid var(--ck-color-base-border);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t& > .ck-button:nth-last-child(2) {\n\t\t\t&::after {\n\t\t\t\tborder-right: 1px solid var(--ck-color-base-border);\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck-content .image{display:table;clear:both;text-align:center;margin:1em auto}.ck-content .image img{display:block;margin:0 auto;max-width:100%;min-width:50px}.ck.ck-editor__editable .image>figcaption.ck-placeholder:before{position:static}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/image.css"],names:[],mappings:"AAKA,mBACC,aAAc,CACd,UAAW,CACX,iBAAkB,CAGlB,eAeD,CAbC,uBAEC,aAAc,CAGd,aAAc,CAGd,cAAe,CAGf,cACD,CAQD,gEACC,eACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content .image {\n\tdisplay: table;\n\tclear: both;\n\ttext-align: center;\n\n\t/* Make sure there is some space between the content and the image. Center image by default. */\n\tmargin: 1em auto;\n\n\t& img {\n\t\t/* Prevent unnecessary margins caused by line-height (see #44). */\n\t\tdisplay: block;\n\n\t\t/* Center the image if its width is smaller than the content's width. */\n\t\tmargin: 0 auto;\n\n\t\t/* Make sure the image never exceeds the size of the parent container (ckeditor/ckeditor5-ui#67). */\n\t\tmax-width: 100%;\n\n\t\t/* Make sure the caption will be displayed properly (See: https://github.com/ckeditor/ckeditor5/issues/1870). */\n\t\tmin-width: 50px;\n\t}\n}\n\n/*\n * Since the caption placeholder for images disappears when focused, it does not require special treatment\n * and can go with a position that follows text alignment of an .image out-of-the-box (center by default).\n * See https://github.com/ckeditor/ckeditor5/issues/8689.\n */\n.ck.ck-editor__editable .image > figcaption.ck-placeholder::before {\n\tposition: static;\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck-content .image>figcaption{display:table-caption;caption-side:bottom;word-break:break-word;color:#333;background-color:#f7f7f7;padding:.6em;font-size:.75em;outline-offset:-1px}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imagecaption.css"],names:[],mappings:"AAKA,8BACC,qBAAsB,CACtB,mBAAoB,CACpB,qBAAsB,CACtB,UAAsB,CACtB,wBAAiC,CACjC,YAAa,CACb,eAAgB,CAChB,mBACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content .image > figcaption {\n\tdisplay: table-caption;\n\tcaption-side: bottom;\n\tword-break: break-word;\n\tcolor: hsl(0, 0%, 20%);\n\tbackground-color: hsl(0, 0%, 97%);\n\tpadding: .6em;\n\tfont-size: .75em;\n\toutline-offset: -1px;\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-editor__editable .image{position:relative}.ck.ck-editor__editable .image .ck-progress-bar{position:absolute;top:0;left:0}.ck.ck-editor__editable .image.ck-appear{animation:fadeIn .7s}.ck.ck-editor__editable .image .ck-progress-bar{height:2px;width:0;background:var(--ck-color-upload-bar-background);transition:width .1s}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageuploadprogress.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadprogress.css"],names:[],mappings:"AAKA,+BACC,iBACD,CAGA,gDACC,iBAAkB,CAClB,KAAM,CACN,MACD,CCPC,yCACC,oBACD,CAID,gDACC,UAAW,CACX,OAAQ,CACR,gDAAiD,CACjD,oBACD,CAEA,kBACC,GAAO,SAAY,CACnB,GAAO,SAAY,CACpB",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor__editable .image {\n\tposition: relative;\n}\n\n/* Upload progress bar. */\n.ck.ck-editor__editable .image .ck-progress-bar {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor__editable .image {\n\t/* Showing animation. */\n\t&.ck-appear {\n\t\tanimation: fadeIn 700ms;\n\t}\n}\n\n/* Upload progress bar. */\n.ck.ck-editor__editable .image .ck-progress-bar {\n\theight: 2px;\n\twidth: 0;\n\tbackground: var(--ck-color-upload-bar-background);\n\ttransition: width 100ms;\n}\n\n@keyframes fadeIn {\n\tfrom { opacity: 0; }\n\tto { opacity: 1; }\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,'.ck-image-upload-complete-icon{display:block;position:absolute;top:10px;right:10px;border-radius:50%}.ck-image-upload-complete-icon:after{content:"";position:absolute}:root{--ck-color-image-upload-icon:#fff;--ck-color-image-upload-icon-background:#008a00;--ck-image-upload-icon-size:20px;--ck-image-upload-icon-width:2px}.ck-image-upload-complete-icon{width:var(--ck-image-upload-icon-size);height:var(--ck-image-upload-icon-size);opacity:0;background:var(--ck-color-image-upload-icon-background);animation-name:ck-upload-complete-icon-show,ck-upload-complete-icon-hide;animation-fill-mode:forwards,forwards;animation-duration:.5s,.5s;font-size:var(--ck-image-upload-icon-size);animation-delay:0ms,3s}.ck-image-upload-complete-icon:after{left:25%;top:50%;opacity:0;height:0;width:0;transform:scaleX(-1) rotate(135deg);transform-origin:left top;border-top:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);border-right:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);animation-name:ck-upload-complete-icon-check;animation-duration:.5s;animation-delay:.5s;animation-fill-mode:forwards;box-sizing:border-box}@keyframes ck-upload-complete-icon-show{0%{opacity:0}to{opacity:1}}@keyframes ck-upload-complete-icon-hide{0%{opacity:1}to{opacity:0}}@keyframes ck-upload-complete-icon-check{0%{opacity:1;width:0;height:0}33%{width:.3em;height:0}to{opacity:1;width:.3em;height:.45em}}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageuploadicon.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadicon.css"],names:[],mappings:"AAKA,+BACC,aAAc,CACd,iBAAkB,CAClB,QAAS,CACT,UAAW,CACX,iBAMD,CAJC,qCACC,UAAW,CACX,iBACD,CCVD,MACC,iCAA8C,CAC9C,+CAA4D,CAE5D,gCAAiC,CACjC,gCACD,CAEA,+BACC,sCAAuC,CACvC,uCAAwC,CACxC,SAAU,CACV,uDAAwD,CACxD,wEAA0E,CAC1E,qCAAuC,CACvC,0BAAgC,CAGhC,0CAA2C,CAG3C,sBAyBD,CAtBC,qCAEC,QAAS,CAET,OAAQ,CACR,SAAU,CACV,QAAS,CACT,OAAQ,CAER,mCAAoC,CACpC,yBAA0B,CAC1B,oFAAqF,CACrF,sFAAuF,CAEvF,4CAA6C,CAC7C,sBAAyB,CACzB,mBAAsB,CACtB,4BAA6B,CAG7B,qBACD,CAGD,wCACC,GACC,SACD,CAEA,GACC,SACD,CACD,CAEA,wCACC,GACC,SACD,CAEA,GACC,SACD,CACD,CAEA,yCACC,GACC,SAAU,CACV,OAAQ,CACR,QACD,CACA,IACC,UAAY,CACZ,QACD,CACA,GACC,SAAU,CACV,UAAY,CACZ,YACD,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-image-upload-complete-icon {\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 10px;\n\tright: 10px;\n\tborder-radius: 50%;\n\n\t&::after {\n\t\tcontent: "";\n\t\tposition: absolute;\n\t}\n}\n','/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-image-upload-icon: hsl(0, 0%, 100%);\n\t--ck-color-image-upload-icon-background: hsl(120, 100%, 27%);\n\n\t--ck-image-upload-icon-size: 20px;\n\t--ck-image-upload-icon-width: 2px;\n}\n\n.ck-image-upload-complete-icon {\n\twidth: var(--ck-image-upload-icon-size);\n\theight: var(--ck-image-upload-icon-size);\n\topacity: 0;\n\tbackground: var(--ck-color-image-upload-icon-background);\n\tanimation-name: ck-upload-complete-icon-show, ck-upload-complete-icon-hide;\n\tanimation-fill-mode: forwards, forwards;\n\tanimation-duration: 500ms, 500ms;\n\n\t/* To make animation scalable. */\n\tfont-size: var(--ck-image-upload-icon-size);\n\n\t/* Hide completed upload icon after 3 seconds. */\n\tanimation-delay: 0ms, 3000ms;\n\n\t/* This is check icon element made from border-width mixed with animations. */\n\t&::after {\n\t\t/* Because of border transformation we need to "hard code" left position. */\n\t\tleft: 25%;\n\n\t\ttop: 50%;\n\t\topacity: 0;\n\t\theight: 0;\n\t\twidth: 0;\n\n\t\ttransform: scaleX(-1) rotate(135deg);\n\t\ttransform-origin: left top;\n\t\tborder-top: var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);\n\t\tborder-right: var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);\n\n\t\tanimation-name: ck-upload-complete-icon-check;\n\t\tanimation-duration: 500ms;\n\t\tanimation-delay: 500ms;\n\t\tanimation-fill-mode: forwards;\n\n\t\t/* #1095. While reset is not providing proper box-sizing for pseudoelements, we need to handle it. */\n\t\tbox-sizing: border-box;\n\t}\n}\n\n@keyframes ck-upload-complete-icon-show {\n\tfrom {\n\t\topacity: 0;\n\t}\n\n\tto {\n\t\topacity: 1;\n\t}\n}\n\n@keyframes ck-upload-complete-icon-hide {\n\tfrom {\n\t\topacity: 1;\n\t}\n\n\tto {\n\t\topacity: 0;\n\t}\n}\n\n@keyframes ck-upload-complete-icon-check {\n\t0% {\n\t\topacity: 1;\n\t\twidth: 0;\n\t\theight: 0;\n\t}\n\t33% {\n\t\twidth: 0.3em;\n\t\theight: 0;\n\t}\n\t100% {\n\t\topacity: 1;\n\t\twidth: 0.3em;\n\t\theight: 0.45em;\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,'.ck .ck-upload-placeholder-loader{position:absolute;display:flex;align-items:center;justify-content:center;top:0;left:0}.ck .ck-upload-placeholder-loader:before{content:"";position:relative}:root{--ck-color-upload-placeholder-loader:#b3b3b3;--ck-upload-placeholder-loader-size:32px}.ck .ck-image-upload-placeholder{width:100%;margin:0}.ck .ck-upload-placeholder-loader{width:100%;height:100%}.ck .ck-upload-placeholder-loader:before{width:var(--ck-upload-placeholder-loader-size);height:var(--ck-upload-placeholder-loader-size);border-radius:50%;border-top:3px solid var(--ck-color-upload-placeholder-loader);border-right:2px solid transparent;animation:ck-upload-placeholder-loader 1s linear infinite}@keyframes ck-upload-placeholder-loader{to{transform:rotate(1turn)}}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageuploadloader.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadloader.css"],names:[],mappings:"AAKA,kCACC,iBAAkB,CAClB,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,KAAM,CACN,MAMD,CAJC,yCACC,UAAW,CACX,iBACD,CCXD,MACC,4CAAqD,CACrD,wCACD,CAEA,iCAEC,UAAW,CACX,QACD,CAEA,kCACC,UAAW,CACX,WAUD,CARC,yCACC,8CAA+C,CAC/C,+CAAgD,CAChD,iBAAkB,CAClB,8DAA+D,CAC/D,kCAAmC,CACnC,yDACD,CAGD,wCACC,GACC,uBACD,CACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-upload-placeholder-loader {\n\tposition: absolute;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\ttop: 0;\n\tleft: 0;\n\n\t&::before {\n\t\tcontent: '';\n\t\tposition: relative;\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-upload-placeholder-loader: hsl(0, 0%, 70%);\n\t--ck-upload-placeholder-loader-size: 32px;\n}\n\n.ck .ck-image-upload-placeholder {\n\t/* We need to control the full width of the SVG gray background. */\n\twidth: 100%;\n\tmargin: 0;\n}\n\n.ck .ck-upload-placeholder-loader {\n\twidth: 100%;\n\theight: 100%;\n\n\t&::before {\n\t\twidth: var(--ck-upload-placeholder-loader-size);\n\t\theight: var(--ck-upload-placeholder-loader-size);\n\t\tborder-radius: 50%;\n\t\tborder-top: 3px solid var(--ck-color-upload-placeholder-loader);\n\t\tborder-right: 2px solid transparent;\n\t\tanimation: ck-upload-placeholder-loader 1s linear infinite;\n\t}\n}\n\n@keyframes ck-upload-placeholder-loader {\n\tto {\n\t\ttransform: rotate( 360deg );\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-image-insert-form:focus{outline:none}.ck.ck-form__row{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.ck.ck-form__row>:not(.ck-label){flex-grow:1}.ck.ck-form__row.ck-image-insert-form__action-row{margin-top:var(--ck-spacing-standard)}.ck.ck-form__row.ck-image-insert-form__action-row .ck-button-cancel,.ck.ck-form__row.ck-image-insert-form__action-row .ck-button-save{justify-content:center}.ck.ck-form__row.ck-image-insert-form__action-row .ck-button .ck-button__label{color:var(--ck-color-text)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageinsertformrowview.css"],names:[],mappings:"AAMC,+BAEC,YACD,CAGD,iBACC,YAAa,CACb,kBAAmB,CACnB,gBAAiB,CACjB,6BAmBD,CAhBC,iCACC,WACD,CAEA,kDACC,qCAUD,CARC,sIAEC,sBACD,CAEA,+EACC,0BACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-image-insert-form {\n\t&:focus {\n\t\t/* See: https://github.com/ckeditor/ckeditor5/issues/4773 */\n\t\toutline: none;\n\t}\n}\n\n.ck.ck-form__row {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\tjustify-content: space-between;\n\n\t/* Ignore labels that work as fieldset legends */\n\t& > *:not(.ck-label) {\n\t\tflex-grow: 1;\n\t}\n\n\t&.ck-image-insert-form__action-row {\n\t\tmargin-top: var(--ck-spacing-standard);\n\n\t\t& .ck-button-save,\n\t\t& .ck-button-cancel {\n\t\t\tjustify-content: center;\n\t\t}\n\n\t\t& .ck-button .ck-button__label {\n\t\t\tcolor: var(--ck-color-text);\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-image-insert__panel{padding:var(--ck-spacing-large)}.ck.ck-image-insert__ck-finder-button{display:block;width:100%;margin:var(--ck-spacing-standard) auto;border:1px solid #ccc;border-radius:var(--ck-border-radius)}.ck.ck-splitbutton>.ck-file-dialog-button.ck-button{padding:0;margin:0;border:none}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageinsert.css"],names:[],mappings:"AAKA,2BACC,+BACD,CAEA,sCACC,aAAc,CACd,UAAW,CACX,sCAAuC,CACvC,qBAAiC,CACjC,qCACD,CAGA,oDACC,SAAU,CACV,QAAS,CACT,WACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-image-insert__panel {\n\tpadding: var(--ck-spacing-large);\n}\n\n.ck.ck-image-insert__ck-finder-button {\n\tdisplay: block;\n\twidth: 100%;\n\tmargin: var(--ck-spacing-standard) auto;\n\tborder: 1px solid hsl(0, 0%, 80%);\n\tborder-radius: var(--ck-border-radius);\n}\n\n/* https://github.com/ckeditor/ckeditor5/issues/7986 */\n.ck.ck-splitbutton > .ck-file-dialog-button.ck-button {\n\tpadding: 0;\n\tmargin: 0;\n\tborder: none;\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,":root{--ck-image-style-spacing:1.5em}.ck-content .image-style-side{float:right;margin-left:var(--ck-image-style-spacing);max-width:50%}.ck-content .image-style-align-left{float:left;margin-right:var(--ck-image-style-spacing)}.ck-content .image-style-align-center{margin-left:auto;margin-right:auto}.ck-content .image-style-align-right{float:right;margin-left:var(--ck-image-style-spacing)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imagestyle.css"],names:[],mappings:"AAKA,MACC,8BACD,CAGC,8BACC,WAAY,CACZ,yCAA0C,CAC1C,aACD,CAEA,oCACC,UAAW,CACX,0CACD,CAEA,sCACC,gBAAiB,CACjB,iBACD,CAEA,qCACC,WAAY,CACZ,yCACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-image-style-spacing: 1.5em;\n}\n\n.ck-content {\n\t& .image-style-side {\n\t\tfloat: right;\n\t\tmargin-left: var(--ck-image-style-spacing);\n\t\tmax-width: 50%;\n\t}\n\n\t& .image-style-align-left {\n\t\tfloat: left;\n\t\tmargin-right: var(--ck-image-style-spacing);\n\t}\n\n\t& .image-style-align-center {\n\t\tmargin-left: auto;\n\t\tmargin-right: auto;\n\t}\n\n\t& .image-style-align-right {\n\t\tfloat: right;\n\t\tmargin-left: var(--ck-image-style-spacing);\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck .ck-link_selected{background:var(--ck-color-link-selected-background)}.ck .ck-fake-link-selection{background:var(--ck-color-link-fake-selection)}.ck .ck-fake-link-selection_collapsed{height:100%;border-right:1px solid var(--ck-color-base-text);margin-right:-1px;outline:1px solid hsla(0,0%,100%,.5)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-link/link.css"],names:[],mappings:"AAMA,sBACC,mDACD,CAMA,4BACC,8CACD,CAGA,sCACC,WAAY,CACZ,gDAAiD,CACjD,iBAAkB,CAClB,oCACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* Class added to span element surrounding currently selected link. */\n.ck .ck-link_selected {\n\tbackground: var(--ck-color-link-selected-background);\n}\n\n/*\n * Classes used by the "fake visual selection" displayed in the content when an input\n * in the link UI has focus (the browser does not render the native selection in this state).\n */\n.ck .ck-fake-link-selection {\n\tbackground: var(--ck-color-link-fake-selection);\n}\n\n/* A collapsed fake visual selection. */\n.ck .ck-fake-link-selection_collapsed {\n\theight: 100%;\n\tborder-right: 1px solid var(--ck-color-base-text);\n\tmargin-right: -1px;\n\toutline: solid 1px hsla(0, 0%, 100%, .5);\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-link-form{display:flex}.ck.ck-link-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-link-form{flex-wrap:wrap}.ck.ck-link-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-link-form .ck-button{flex-basis:50%}}.ck.ck-link-form_layout-vertical{display:block}.ck.ck-link-form_layout-vertical .ck-button.ck-button-cancel,.ck.ck-link-form_layout-vertical .ck-button.ck-button-save{margin-top:var(--ck-spacing-medium)}.ck.ck-link-form_layout-vertical{padding:0;min-width:var(--ck-input-text-width)}.ck.ck-link-form_layout-vertical .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) var(--ck-spacing-small)}.ck.ck-link-form_layout-vertical .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-link-form_layout-vertical .ck-button{padding:var(--ck-spacing-standard);margin:0;border-radius:0;border:0;border-top:1px solid var(--ck-color-base-border);width:50%}[dir=ltr] .ck.ck-link-form_layout-vertical .ck-button,[dir=rtl] .ck.ck-link-form_layout-vertical .ck-button{margin-left:0}[dir=rtl] .ck.ck-link-form_layout-vertical .ck-button:last-of-type{border-right:1px solid var(--ck-color-base-border)}.ck.ck-link-form_layout-vertical .ck.ck-list{margin:var(--ck-spacing-standard) var(--ck-spacing-large)}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton{border:0;padding:0;width:100%}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton:hover{background:none}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-link/theme/linkform.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-link/linkform.css"],names:[],mappings:"AAOA,iBACC,YAiBD,CAfC,2BACC,YACD,CCNA,oCDCD,iBAQE,cAUF,CARE,wCACC,eACD,CAEA,4BACC,cACD,CCfD,CDuBD,iCACC,aAYD,CALE,wHAEC,mCACD,CE/BF,iCACC,SAAU,CACV,oCA8CD,CA5CC,wDACC,8EAMD,CAJC,uEACC,WAAY,CACZ,UACD,CAGD,4CACC,kCAAmC,CACnC,QAAS,CACT,eAAgB,CAChB,QAAS,CACT,gDAAiD,CACjD,SAaD,CAnBA,4GAaE,aAMF,CAJE,mEACC,kDACD,CAKF,6CACC,yDAWD,CATC,wEACC,QAAS,CACT,SAAU,CACV,UAKD,CAHC,8EACC,eACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-link-form {\n\tdisplay: flex;\n\n\t& .ck-label {\n\t\tdisplay: none;\n\t}\n\n\t@mixin ck-media-phone {\n\t\tflex-wrap: wrap;\n\n\t\t& .ck-labeled-field-view {\n\t\t\tflex-basis: 100%;\n\t\t}\n\n\t\t& .ck-button {\n\t\t\tflex-basis: 50%;\n\t\t}\n\t}\n}\n\n/*\n * Style link form differently when manual decorators are available.\n * See: https://github.com/ckeditor/ckeditor5-link/issues/186.\n */\n.ck.ck-link-form_layout-vertical {\n\tdisplay: block;\n\n\t/*\n\t * Whether the form is in the responsive mode or not, if there are decorator buttons\n\t * keep the top margin of action buttons medium.\n\t */\n\t& .ck-button {\n\t\t&.ck-button-save,\n\t\t&.ck-button-cancel {\n\t\t\tmargin-top: var(--ck-spacing-medium);\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n/*\n * Style link form differently when manual decorators are available.\n * See: https://github.com/ckeditor/ckeditor5-link/issues/186.\n */\n.ck.ck-link-form_layout-vertical {\n\tpadding: 0;\n\tmin-width: var(--ck-input-text-width);\n\n\t& .ck-labeled-field-view {\n\t\tmargin: var(--ck-spacing-large) var(--ck-spacing-large) var(--ck-spacing-small);\n\n\t\t& .ck-input-text {\n\t\t\tmin-width: 0;\n\t\t\twidth: 100%;\n\t\t}\n\t}\n\n\t& .ck-button {\n\t\tpadding: var(--ck-spacing-standard);\n\t\tmargin: 0;\n\t\tborder-radius: 0;\n\t\tborder: 0;\n\t\tborder-top: 1px solid var(--ck-color-base-border);\n\t\twidth: 50%;\n\n\t\t@mixin ck-dir ltr {\n\t\t\tmargin-left: 0;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tmargin-left: 0;\n\n\t\t\t&:last-of-type {\n\t\t\t\tborder-right: 1px solid var(--ck-color-base-border);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Using additional `.ck` class for stronger CSS specificity than `.ck.ck-link-form > :not(:first-child)`. */\n\t& .ck.ck-list {\n\t\tmargin: var(--ck-spacing-standard) var(--ck-spacing-large);\n\n\t\t& .ck-button.ck-switchbutton {\n\t\t\tborder: 0;\n\t\t\tpadding: 0;\n\t\t\twidth: 100%;\n\n\t\t\t&:hover {\n\t\t\t\tbackground: none;\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-link-actions{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-link-actions .ck-link-actions__preview{display:inline-block}.ck.ck-link-actions .ck-link-actions__preview .ck-button__label{overflow:hidden}@media screen and (max-width:600px){.ck.ck-link-actions{flex-wrap:wrap}.ck.ck-link-actions .ck-link-actions__preview{flex-basis:100%}.ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){flex-basis:50%}}.ck.ck-link-actions .ck-button.ck-link-actions__preview{padding-left:0;padding-right:0}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label{padding:0 var(--ck-spacing-medium);color:var(--ck-color-link-default);text-overflow:ellipsis;cursor:pointer;max-width:var(--ck-input-text-width);min-width:3em;text-align:center}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label:hover{text-decoration:underline}.ck.ck-link-actions .ck-button.ck-link-actions__preview,.ck.ck-link-actions .ck-button.ck-link-actions__preview:active,.ck.ck-link-actions .ck-button.ck-link-actions__preview:focus,.ck.ck-link-actions .ck-button.ck-link-actions__preview:hover{background:none}.ck.ck-link-actions .ck-button.ck-link-actions__preview:active{box-shadow:none}.ck.ck-link-actions .ck-button.ck-link-actions__preview:focus .ck-button__label{text-decoration:underline}[dir=ltr] .ck.ck-link-actions .ck-button:not(:first-child),[dir=rtl] .ck.ck-link-actions .ck-button:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-link-actions .ck-button.ck-link-actions__preview{margin:var(--ck-spacing-standard) var(--ck-spacing-standard) 0}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label{min-width:0;max-width:100%}[dir=ltr] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview),[dir=rtl] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){margin-left:0}}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-link/theme/linkactions.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-link/linkactions.css"],names:[],mappings:"AAOA,oBACC,YAAa,CACb,kBAAmB,CACnB,gBAqBD,CAnBC,8CACC,oBAKD,CAHC,gEACC,eACD,CCXD,oCDCD,oBAcE,cAUF,CARE,8CACC,eACD,CAEA,8DACC,cACD,CCrBD,CCKA,wDACC,cAAe,CACf,eAmCD,CAjCC,0EACC,kCAAmC,CACnC,kCAAmC,CACnC,sBAAuB,CACvB,cAAe,CAIf,oCAAqC,CACrC,aAAc,CACd,iBAKD,CAHC,gFACC,yBACD,CAGD,mPAIC,eACD,CAEA,+DACC,eACD,CAGC,gFACC,yBACD,CAWD,qHACC,sCACD,CDvDD,oCC2DC,wDACC,8DAMD,CAJC,0EACC,WAAY,CACZ,cACD,CAGD,gJAME,aAEF,CD1ED",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-link-actions {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\n\t& .ck-link-actions__preview {\n\t\tdisplay: inline-block;\n\n\t\t& .ck-button__label {\n\t\t\toverflow: hidden;\n\t\t}\n\t}\n\n\t@mixin ck-media-phone {\n\t\tflex-wrap: wrap;\n\n\t\t& .ck-link-actions__preview {\n\t\t\tflex-basis: 100%;\n\t\t}\n\n\t\t& .ck-button:not(.ck-link-actions__preview) {\n\t\t\tflex-basis: 50%;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/components/tooltip/mixins/_tooltip.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n@import "../mixins/_focus.css";\n@import "../mixins/_shadow.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-link-actions {\n\t& .ck-button.ck-link-actions__preview {\n\t\tpadding-left: 0;\n\t\tpadding-right: 0;\n\n\t\t& .ck-button__label {\n\t\t\tpadding: 0 var(--ck-spacing-medium);\n\t\t\tcolor: var(--ck-color-link-default);\n\t\t\ttext-overflow: ellipsis;\n\t\t\tcursor: pointer;\n\n\t\t\t/* Match the box model of the link editor form\'s input so the balloon\n\t\t\tdoes not change width when moving between actions and the form. */\n\t\t\tmax-width: var(--ck-input-text-width);\n\t\t\tmin-width: 3em;\n\t\t\ttext-align: center;\n\n\t\t\t&:hover {\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\n\t\t&,\n\t\t&:hover,\n\t\t&:focus,\n\t\t&:active {\n\t\t\tbackground: none;\n\t\t}\n\n\t\t&:active {\n\t\t\tbox-shadow: none;\n\t\t}\n\n\t\t&:focus {\n\t\t\t& .ck-button__label {\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\t}\n\n\t@mixin ck-dir ltr {\n\t\t& .ck-button:not(:first-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-dir rtl {\n\t\t& .ck-button:not(:last-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-media-phone {\n\t\t& .ck-button.ck-link-actions__preview {\n\t\t\tmargin: var(--ck-spacing-standard) var(--ck-spacing-standard) 0;\n\n\t\t\t& .ck-button__label {\n\t\t\t\tmin-width: 0;\n\t\t\t\tmax-width: 100%;\n\t\t\t}\n\t\t}\n\n\t\t& .ck-button:not(.ck-link-actions__preview) {\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-link-image_icon{position:absolute;top:var(--ck-spacing-medium);right:var(--ck-spacing-medium);width:28px;height:28px;padding:4px;box-sizing:border-box;border-radius:var(--ck-border-radius)}.ck.ck-link-image_icon svg{fill:currentColor}.ck.ck-link-image_icon{color:#fff;background:rgba(0,0,0,.4)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-link/theme/linkimage.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-link/linkimage.css"],names:[],mappings:"AAKA,uBACC,iBAAkB,CAClB,4BAA6B,CAC7B,8BAA+B,CAC/B,UAAW,CACX,WAAY,CACZ,WAAY,CACZ,qBAAsB,CACtB,qCAKD,CAHC,2BACC,iBACD,CCZD,uBACC,UAAuB,CACvB,yBACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-link-image_icon {\n\tposition: absolute;\n\ttop: var(--ck-spacing-medium);\n\tright: var(--ck-spacing-medium);\n\twidth: 28px;\n\theight: 28px;\n\tpadding: 4px;\n\tbox-sizing: border-box;\n\tborder-radius: var(--ck-border-radius);\n\n\t& svg {\n\t\tfill: currentColor;\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-link-image_icon {\n\tcolor: hsl(0, 0%, 100%);\n\tbackground: hsla(0, 0%, 0%, .4);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,":root{--ck-color-table-focused-cell-background:rgba(158,207,250,0.3)}.ck-widget.table td.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table td.ck-editor__nested-editable:focus,.ck-widget.table th.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table th.ck-editor__nested-editable:focus{background:var(--ck-color-table-focused-cell-background);border-style:none;outline:1px solid var(--ck-color-focus-border);outline-offset:-1px}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/tableediting.css"],names:[],mappings:"AAKA,MACC,8DACD,CAKE,8QAGC,wDAAyD,CAKzD,iBAAkB,CAClB,8CAA+C,CAC/C,mBACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-table-focused-cell-background: hsla(208, 90%, 80%, .3);\n}\n\n.ck-widget.table {\n\t& td,\n\t& th {\n\t\t&.ck-editor__nested-editable.ck-editor__nested-editable_focused,\n\t\t&.ck-editor__nested-editable:focus {\n\t\t\t/* A very slight background to highlight the focused cell */\n\t\t\tbackground: var(--ck-color-table-focused-cell-background);\n\n\t\t\t/* Fixes the problem where surrounding cells cover the focused cell's border.\n\t\t\tIt does not fix the problem in all places but the UX is improved.\n\t\t\tSee https://github.com/ckeditor/ckeditor5-table/issues/29. */\n\t\t\tborder-style: none;\n\t\t\toutline: 1px solid var(--ck-color-focus-border);\n\t\t\toutline-offset: -1px; /* progressive enhancement - no IE support */\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck .ck-insert-table-dropdown__grid{display:flex;flex-direction:row;flex-wrap:wrap}:root{--ck-insert-table-dropdown-padding:10px;--ck-insert-table-dropdown-box-height:11px;--ck-insert-table-dropdown-box-width:12px;--ck-insert-table-dropdown-box-margin:1px}.ck .ck-insert-table-dropdown__grid{width:calc(var(--ck-insert-table-dropdown-box-width)*10 + var(--ck-insert-table-dropdown-box-margin)*20 + var(--ck-insert-table-dropdown-padding)*2);padding:var(--ck-insert-table-dropdown-padding) var(--ck-insert-table-dropdown-padding) 0}.ck .ck-insert-table-dropdown__label{text-align:center}.ck .ck-insert-table-dropdown-grid-box{width:var(--ck-insert-table-dropdown-box-width);height:var(--ck-insert-table-dropdown-box-height);margin:var(--ck-insert-table-dropdown-box-margin);border:1px solid var(--ck-color-base-border);border-radius:1px}.ck .ck-insert-table-dropdown-grid-box.ck-on{border-color:var(--ck-color-focus-border);background:var(--ck-color-focus-outer-shadow)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/inserttable.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/inserttable.css"],names:[],mappings:"AAKA,oCACC,YAAa,CACb,kBAAmB,CACnB,cACD,CCJA,MACC,uCAAwC,CACxC,0CAA2C,CAC3C,yCAA0C,CAC1C,yCACD,CAEA,oCAEC,oJAA2J,CAC3J,yFACD,CAEA,qCACC,iBACD,CAEA,uCACC,+CAAgD,CAChD,iDAAkD,CAClD,iDAAkD,CAClD,4CAA6C,CAC7C,iBAMD,CAJC,6CACC,yCAA0C,CAC1C,6CACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-insert-table-dropdown__grid {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: wrap;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-insert-table-dropdown-padding: 10px;\n\t--ck-insert-table-dropdown-box-height: 11px;\n\t--ck-insert-table-dropdown-box-width: 12px;\n\t--ck-insert-table-dropdown-box-margin: 1px;\n}\n\n.ck .ck-insert-table-dropdown__grid {\n\t/* The width of a container should match 10 items in a row so there will be a 10x10 grid. */\n\twidth: calc(var(--ck-insert-table-dropdown-box-width) * 10 + var(--ck-insert-table-dropdown-box-margin) * 20 + var(--ck-insert-table-dropdown-padding) * 2);\n\tpadding: var(--ck-insert-table-dropdown-padding) var(--ck-insert-table-dropdown-padding) 0;\n}\n\n.ck .ck-insert-table-dropdown__label {\n\ttext-align: center;\n}\n\n.ck .ck-insert-table-dropdown-grid-box {\n\twidth: var(--ck-insert-table-dropdown-box-width);\n\theight: var(--ck-insert-table-dropdown-box-height);\n\tmargin: var(--ck-insert-table-dropdown-box-margin);\n\tborder: 1px solid var(--ck-color-base-border);\n\tborder-radius: 1px;\n\n\t&.ck-on {\n\t\tborder-color: var(--ck-color-focus-border);\n\t\tbackground: var(--ck-color-focus-outer-shadow);\n\t}\n}\n\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,':root{--ck-table-selected-cell-background:rgba(158,207,250,0.3)}.ck.ck-editor__editable .table table td.ck-editor__editable_selected,.ck.ck-editor__editable .table table th.ck-editor__editable_selected{position:relative;caret-color:transparent;outline:unset;box-shadow:unset}.ck.ck-editor__editable .table table td.ck-editor__editable_selected:after,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:after{content:"";pointer-events:none;background-color:var(--ck-table-selected-cell-background);position:absolute;top:0;left:0;right:0;bottom:0}.ck.ck-editor__editable .table table td.ck-editor__editable_selected ::selection,.ck.ck-editor__editable .table table td.ck-editor__editable_selected:focus,.ck.ck-editor__editable .table table th.ck-editor__editable_selected ::selection,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:focus{background-color:transparent}.ck.ck-editor__editable .table table td.ck-editor__editable_selected .ck-widget_selected,.ck.ck-editor__editable .table table th.ck-editor__editable_selected .ck-widget_selected{outline:unset}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/tableselection.css"],names:[],mappings:"AAKA,MACC,yDACD,CAGC,0IAEC,iBAAkB,CAClB,uBAAwB,CACxB,aAAc,CACd,gBAsBD,CAnBC,sJACC,UAAW,CACX,mBAAoB,CACpB,yDAA0D,CAC1D,iBAAkB,CAClB,KAAM,CACN,MAAO,CACP,OAAQ,CACR,QACD,CAEA,wTAEC,4BACD,CAEA,kLACC,aACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-table-selected-cell-background: hsla(208, 90%, 80%, .3);\n}\n\n.ck.ck-editor__editable .table table {\n\t& td.ck-editor__editable_selected,\n\t& th.ck-editor__editable_selected {\n\t\tposition: relative;\n\t\tcaret-color: transparent;\n\t\toutline: unset;\n\t\tbox-shadow: unset;\n\n\t\t/* https://github.com/ckeditor/ckeditor5/issues/6446 */\n\t\t&:after {\n\t\t\tcontent: '';\n\t\t\tpointer-events: none;\n\t\t\tbackground-color: var(--ck-table-selected-cell-background);\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\tright: 0;\n\t\t\tbottom: 0;\n\t\t}\n\n\t\t& ::selection,\n\t\t&:focus {\n\t\t\tbackground-color: transparent;\n\t\t}\n\n\t\t& .ck-widget_selected {\n\t\t\toutline: unset;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck-content .table{margin:1em auto;display:table}.ck-content .table table{border-collapse:collapse;border-spacing:0;width:100%;height:100%;border:1px double #b3b3b3}.ck-content .table table td,.ck-content .table table th{min-width:2em;padding:.4em;border:1px solid #bfbfbf}.ck-content .table table th{font-weight:700;background:hsla(0,0%,0%,5%)}.ck-content[dir=rtl] .table th{text-align:right}.ck-content[dir=ltr] .table th{text-align:left}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/table.css"],names:[],mappings:"AAKA,mBAEC,eAAgB,CAChB,aAgCD,CA9BC,yBAEC,wBAAyB,CACzB,gBAAiB,CAIjB,UAAW,CACX,WAAY,CAIZ,yBAiBD,CAfC,wDAEC,aAAc,CACd,YAAa,CAKb,wBACD,CAEA,4BACC,eAAiB,CACjB,2BACD,CAMF,+BACC,gBACD,CAEA,+BACC,eACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content .table {\n\t/* Give the table widget some air and center it horizontally */\n\tmargin: 1em auto;\n\tdisplay: table;\n\n\t& table {\n\t\t/* The table cells should have slight borders */\n\t\tborder-collapse: collapse;\n\t\tborder-spacing: 0;\n\n\t\t/* Table width and height are set on the parent <figure>. Make sure the table inside stretches\n\t\tto the full dimensions of the container (https://github.com/ckeditor/ckeditor5/issues/6186). */\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t\t/* The outer border of the table should be slightly darker than the inner lines.\n\t\tAlso see https://github.com/ckeditor/ckeditor5-table/issues/50. */\n\t\tborder: 1px double hsl(0, 0%, 70%);\n\n\t\t& td,\n\t\t& th {\n\t\t\tmin-width: 2em;\n\t\t\tpadding: .4em;\n\n\t\t\t/* The border is inherited from .ck-editor__nested-editable styles, so theoretically it\'s not necessary here.\n\t\t\tHowever, the border is a content style, so it should use .ck-content (so it works outside the editor).\n\t\t\tHence, the duplication. See https://github.com/ckeditor/ckeditor5/issues/6314 */\n\t\t\tborder: 1px solid hsl(0, 0%, 75%);\n\t\t}\n\n\t\t& th {\n\t\t\tfont-weight: bold;\n\t\t\tbackground: hsla(0, 0%, 0%, 5%);\n\t\t}\n\t}\n}\n\n/* Text alignment of the table header should match the editor settings and override the native browser styling,\nwhen content is available outside the ediitor. See https://github.com/ckeditor/ckeditor5/issues/6638 */\n.ck-content[dir="rtl"] .table th {\n\ttext-align: right;\n}\n\n.ck-content[dir="ltr"] .table th {\n\ttext-align: left;\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-input-color{width:100%;display:flex;flex-direction:row-reverse}.ck.ck-input-color>input.ck.ck-input-text{min-width:auto;flex-grow:1}.ck.ck-input-color>div.ck.ck-dropdown{min-width:auto}.ck.ck-input-color>div.ck.ck-dropdown>.ck-input-color__button .ck-dropdown__arrow{display:none}.ck.ck-input-color .ck.ck-input-color__button .ck.ck-input-color__button__preview{position:relative;overflow:hidden}.ck.ck-input-color .ck.ck-input-color__button .ck.ck-input-color__button__preview>.ck.ck-input-color__button__preview__no-color-indicator{position:absolute;display:block}[dir=ltr] .ck.ck-input-color>.ck.ck-input-text{border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .ck.ck-input-color>.ck.ck-input-text{border-top-left-radius:0;border-bottom-left-radius:0}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{padding:0}[dir=ltr] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{border-left-width:0;border-top-left-radius:0;border-bottom-left-radius:0}[dir=rtl] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{border-right-width:0;border-top-right-radius:0;border-bottom-right-radius:0}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button.ck-disabled{background:var(--ck-color-input-disabled-background)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview{border-radius:0}.ck-rounded-corners .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview,.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview{width:20px;height:20px;border:1px solid var(--ck-color-input-border)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview>.ck.ck-input-color__button__preview__no-color-indicator{top:-30%;left:50%;height:150%;width:8%;background:red;border-radius:2px;transform:rotate(45deg);transform-origin:50%}.ck.ck-input-color .ck.ck-input-color__remove-color{width:100%;border-bottom:1px solid var(--ck-color-input-border);padding:calc(var(--ck-spacing-standard)/2) var(--ck-spacing-standard);border-bottom-left-radius:0;border-bottom-right-radius:0}[dir=ltr] .ck.ck-input-color .ck.ck-input-color__remove-color{border-top-right-radius:0}[dir=rtl] .ck.ck-input-color .ck.ck-input-color__remove-color{border-top-left-radius:0}.ck.ck-input-color .ck.ck-input-color__remove-color .ck.ck-icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-input-color .ck.ck-input-color__remove-color .ck.ck-icon{margin-right:0;margin-left:var(--ck-spacing-standard)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/colorinput.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/colorinput.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAKA,mBACC,UAAW,CACX,YAAa,CACb,0BA2BD,CAzBC,0CACC,cAAe,CACf,WACD,CAEA,sCACC,cAMD,CAHC,kFACC,YACD,CAIA,kFACC,iBAAkB,CAClB,eAMD,CAJC,0IACC,iBAAkB,CAClB,aACD,CCvBF,+CAEE,yBAA0B,CAC1B,4BAOF,CAVA,+CAOE,wBAAyB,CACzB,2BAEF,CAGC,wEACC,SAoCD,CArCA,kFAIE,mBAAoB,CACpB,wBAAyB,CACzB,2BA+BF,CArCA,kFAUE,oBAAqB,CACrB,yBAA0B,CAC1B,4BAyBF,CAtBC,oFACC,oDACD,CAEA,4GC9BF,eD+CE,CAjBA,+PC1BD,qCD2CC,CAjBA,4GAGC,UAAW,CACX,WAAY,CACZ,6CAYD,CAVC,oKACC,QAAS,CACT,QAAS,CACT,WAAY,CACZ,QAAS,CACT,cAA6B,CAC7B,iBAAkB,CAClB,uBAAwB,CACxB,oBACD,CAKH,oDACC,UAAW,CACX,oDAAqD,CACrD,qEAAwE,CAExE,2BAA4B,CAC5B,4BAkBD,CAxBA,8DASE,yBAeF,CAxBA,8DAaE,wBAWF,CARC,gEACC,uCAMD,CAPA,0EAIE,cAAe,CACf,sCAEF",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-input-color {\n\twidth: 100%;\n\tdisplay: flex;\n\tflex-direction: row-reverse;\n\n\t& > input.ck.ck-input-text {\n\t\tmin-width: auto;\n\t\tflex-grow: 1;\n\t}\n\n\t& > div.ck.ck-dropdown {\n\t\tmin-width: auto;\n\n\t\t/* This dropdown has no arrow but a color preview instead. */\n\t\t& > .ck-input-color__button .ck-dropdown__arrow {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t& .ck.ck-input-color__button {\n\t\t& .ck.ck-input-color__button__preview {\n\t\t\tposition: relative;\n\t\t\toverflow: hidden;\n\n\t\t\t& > .ck.ck-input-color__button__preview__no-color-indicator {\n\t\t\t\tposition: absolute;\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t}\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n@import "../mixins/_rounded.css";\n\n.ck.ck-input-color {\n\t& > .ck.ck-input-text {\n\t\t@mixin ck-dir ltr {\n\t\t\tborder-top-right-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tborder-top-left-radius: 0;\n\t\t\tborder-bottom-left-radius: 0;\n\t\t}\n\t}\n\n\t& > .ck.ck-dropdown {\n\t\t& > .ck.ck-button.ck-input-color__button {\n\t\t\tpadding: 0;\n\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tborder-left-width: 0;\n\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tborder-right-width: 0;\n\t\t\t\tborder-top-right-radius: 0;\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\n\t\t\t&.ck-disabled {\n\t\t\t\tbackground: var(--ck-color-input-disabled-background);\n\t\t\t}\n\n\t\t\t& > .ck.ck-input-color__button__preview {\n\t\t\t\t@mixin ck-rounded-corners;\n\n\t\t\t\twidth: 20px;\n\t\t\t\theight: 20px;\n\t\t\t\tborder: 1px solid var(--ck-color-input-border);\n\n\t\t\t\t& > .ck.ck-input-color__button__preview__no-color-indicator {\n\t\t\t\t\ttop: -30%;\n\t\t\t\t\tleft: 50%;\n\t\t\t\t\theight: 150%;\n\t\t\t\t\twidth: 8%;\n\t\t\t\t\tbackground: hsl(0, 100%, 50%);\n\t\t\t\t\tborder-radius: 2px;\n\t\t\t\t\ttransform: rotate(45deg);\n\t\t\t\t\ttransform-origin: 50%;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t& .ck.ck-input-color__remove-color {\n\t\twidth: 100%;\n\t\tborder-bottom: 1px solid var(--ck-color-input-border);\n\t\tpadding: calc(var(--ck-spacing-standard) / 2) var(--ck-spacing-standard);\n\n\t\tborder-bottom-left-radius: 0;\n\t\tborder-bottom-right-radius: 0;\n\n\t\t@mixin ck-dir ltr {\n\t\t\tborder-top-right-radius: 0;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tborder-top-left-radius: 0;\n\t\t}\n\n\t\t& .ck.ck-icon {\n\t\t\tmargin-right: var(--ck-spacing-standard);\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-right: 0;\n\t\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-form__row{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.ck.ck-form__row>:not(.ck-label){flex-grow:1}.ck.ck-form__row.ck-table-form__action-row .ck-button-cancel,.ck.ck-form__row.ck-table-form__action-row .ck-button-save{justify-content:center}.ck.ck-form__row{padding:var(--ck-spacing-standard) var(--ck-spacing-large) 0}[dir=ltr] .ck.ck-form__row>:not(.ck-label)+*{margin-left:var(--ck-spacing-large)}[dir=rtl] .ck.ck-form__row>:not(.ck-label)+*{margin-right:var(--ck-spacing-large)}.ck.ck-form__row>.ck-label{width:100%;min-width:100%}.ck.ck-form__row.ck-table-form__action-row{margin-top:var(--ck-spacing-large)}.ck.ck-form__row.ck-table-form__action-row .ck-button .ck-button__label{color:var(--ck-color-text)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/formrow.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/formrow.css"],names:[],mappings:"AAKA,iBACC,YAAa,CACb,kBAAmB,CACnB,gBAAiB,CACjB,6BAaD,CAVC,iCACC,WACD,CAGC,wHAEC,sBACD,CCbF,iBACC,4DA2BD,CAvBE,6CAEE,mCAMF,CARA,6CAME,oCAEF,CAGD,2BACC,UAAW,CACX,cACD,CAEA,2CACC,kCAKD,CAHC,wEACC,0BACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-form__row {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\tjustify-content: space-between;\n\n\t/* Ignore labels that work as fieldset legends */\n\t& > *:not(.ck-label) {\n\t\tflex-grow: 1;\n\t}\n\n\t&.ck-table-form__action-row {\n\t\t& .ck-button-save,\n\t\t& .ck-button-cancel {\n\t\t\tjustify-content: center;\n\t\t}\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-form__row {\n\tpadding: var(--ck-spacing-standard) var(--ck-spacing-large) 0;\n\n\t/* Ignore labels that work as fieldset legends */\n\t& > *:not(.ck-label) {\n\t\t& + * {\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: var(--ck-spacing-large);\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-right: var(--ck-spacing-large);\n\t\t\t}\n\t\t}\n\t}\n\n\t& > .ck-label {\n\t\twidth: 100%;\n\t\tmin-width: 100%;\n\t}\n\n\t&.ck-table-form__action-row {\n\t\tmargin-top: var(--ck-spacing-large);\n\n\t\t& .ck-button .ck-button__label {\n\t\t\tcolor: var(--ck-color-text);\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-form{padding:0 0 var(--ck-spacing-large)}.ck.ck-form:focus{outline:none}.ck.ck-form .ck.ck-input-text{min-width:100%;width:0}.ck.ck-form .ck.ck-dropdown{min-width:100%}.ck.ck-form .ck.ck-dropdown .ck-dropdown__button:not(:focus){border:1px solid var(--ck-color-base-border)}.ck.ck-form .ck.ck-dropdown .ck-dropdown__button .ck-button__label{width:100%}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/form.css"],names:[],mappings:"AAKA,YACC,mCAyBD,CAvBC,kBAEC,YACD,CAEA,8BACC,cAAe,CACf,OACD,CAEA,4BACC,cAWD,CARE,6DACC,4CACD,CAEA,mEACC,UACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-form {\n\tpadding: 0 0 var(--ck-spacing-large);\n\n\t&:focus {\n\t\t/* See: https://github.com/ckeditor/ckeditor5/issues/4773 */\n\t\toutline: none;\n\t}\n\n\t& .ck.ck-input-text {\n\t\tmin-width: 100%;\n\t\twidth: 0;\n\t}\n\n\t& .ck.ck-dropdown {\n\t\tmin-width: 100%;\n\n\t\t& .ck-dropdown__button {\n\t\t\t&:not(:focus) {\n\t\t\t\tborder: 1px solid var(--ck-color-base-border);\n\t\t\t}\n\n\t\t\t& .ck-button__label {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,'.ck.ck-table-form .ck-form__row.ck-table-form__background-row,.ck.ck-table-form .ck-form__row.ck-table-form__border-row{flex-wrap:wrap}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row{flex-wrap:wrap;align-items:center}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-labeled-field-view{display:flex;flex-direction:column-reverse;align-items:center}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-labeled-field-view .ck.ck-dropdown,.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimension-operator{flex-grow:0}.ck.ck-table-form .ck.ck-labeled-field-view{position:relative}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{position:absolute;left:50%;bottom:calc(var(--ck-table-properties-error-arrow-size)*-1);transform:translate(-50%,100%);z-index:1}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status:after{content:"";position:absolute;top:calc(var(--ck-table-properties-error-arrow-size)*-1);left:50%;transform:translateX(-50%)}:root{--ck-table-properties-error-arrow-size:6px;--ck-table-properties-min-error-width:150px}.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-labeled-field-view>.ck-label{font-size:var(--ck-font-size-tiny);text-align:center}.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-table-form__border-style,.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-table-form__border-width{width:80px;min-width:80px;max-width:80px}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row{padding:0}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimensions-row__height,.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimensions-row__width{margin:0}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimension-operator{align-self:flex-end;display:inline-block;height:var(--ck-ui-component-min-height);line-height:var(--ck-ui-component-min-height);margin:0 var(--ck-spacing-small)}.ck.ck-table-form .ck.ck-labeled-field-view{padding-top:var(--ck-spacing-standard)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{border-radius:0}.ck-rounded-corners .ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status,.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{background:var(--ck-color-base-error);color:var(--ck-color-base-background);padding:var(--ck-spacing-small) var(--ck-spacing-medium);min-width:var(--ck-table-properties-min-error-width);text-align:center}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status:after{border-left:var(--ck-table-properties-error-arrow-size) solid transparent;border-bottom:var(--ck-table-properties-error-arrow-size) solid var(--ck-color-base-error);border-right:var(--ck-table-properties-error-arrow-size) solid transparent;border-top:0 solid transparent}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{animation:ck-table-form-labeled-view-status-appear .15s ease both}.ck.ck-table-form .ck.ck-labeled-field-view .ck-input.ck-error:not(:focus)+.ck.ck-labeled-field-view__status{display:none}@keyframes ck-table-form-labeled-view-status-appear{0%{opacity:0}to{opacity:1}}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/tableform.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/tableform.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAWE,wHACC,cACD,CAEA,8DACC,cAAe,CACf,kBAeD,CAbC,qFACC,YAAa,CACb,6BAA8B,CAC9B,kBAKD,CAEA,sMACC,WACD,CAIF,4CAEC,iBAoBD,CAlBC,8EACC,iBAAkB,CAClB,QAAS,CACT,2DAAgE,CAChE,8BAA+B,CAG/B,SAUD,CAPC,oFACC,UAAW,CACX,iBAAkB,CAClB,wDAA6D,CAC7D,QAAS,CACT,0BACD,CChDH,MACC,0CAA2C,CAC3C,2CACD,CAMI,2FACC,kCAAmC,CACnC,iBACD,CAGD,8KAEC,UAAW,CACX,cAAe,CACf,cACD,CAGD,8DACC,SAcD,CAZC,yMAEC,QACD,CAEA,iGACC,mBAAoB,CACpB,oBAAqB,CACrB,wCAAyC,CACzC,6CAA8C,CAC9C,gCACD,CAIF,4CACC,sCAyBD,CAvBC,8ECxCD,eDyDC,CAjBA,mMCpCA,qCDqDA,CAjBA,8EAGC,qCAAsC,CACtC,qCAAsC,CACtC,wDAAyD,CACzD,oDAAqD,CACrD,iBAUD,CAPC,oFAGC,yEAAmB,CAAnB,0FAAmB,CAAnB,0EAAmB,CAAnB,8BACD,CAdD,8EAgBC,iEACD,CAGA,6GACC,YACD,CAIF,oDACC,GACC,SACD,CAEA,GACC,SACD,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-table-form {\n\t& .ck-form__row {\n\t\t&.ck-table-form__border-row {\n\t\t\tflex-wrap: wrap;\n\t\t}\n\n\t\t&.ck-table-form__background-row {\n\t\t\tflex-wrap: wrap;\n\t\t}\n\n\t\t&.ck-table-form__dimensions-row {\n\t\t\tflex-wrap: wrap;\n\t\t\talign-items: center;\n\n\t\t\t& .ck-labeled-field-view {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column-reverse;\n\t\t\t\talign-items: center;\n\n\t\t\t\t& .ck.ck-dropdown {\n\t\t\t\t\tflex-grow: 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t& .ck-table-form__dimension-operator {\n\t\t\t\tflex-grow: 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t& .ck.ck-labeled-field-view {\n\t\t/* Allow absolute positioning of the status (error) balloons. */\n\t\tposition: relative;\n\n\t\t& .ck.ck-labeled-field-view__status {\n\t\t\tposition: absolute;\n\t\t\tleft: 50%;\n\t\t\tbottom: calc( -1 * var(--ck-table-properties-error-arrow-size) );\n\t\t\ttransform: translate(-50%,100%);\n\n\t\t\t/* Make sure the balloon status stays on top of other form elements. */\n\t\t\tz-index: 1;\n\n\t\t\t/* The arrow pointing towards the field. */\n\t\t\t&::after {\n\t\t\t\tcontent: "";\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: calc( -1 * var(--ck-table-properties-error-arrow-size) );\n\t\t\t\tleft: 50%;\n\t\t\t\ttransform: translateX( -50% );\n\t\t\t}\n\t\t}\n\t}\n}\n','/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../mixins/_rounded.css";\n\n:root {\n\t--ck-table-properties-error-arrow-size: 6px;\n\t--ck-table-properties-min-error-width: 150px;\n}\n\n.ck.ck-table-form {\n\t& .ck-form__row {\n\t\t&.ck-table-form__border-row {\n\t\t\t& .ck-labeled-field-view {\n\t\t\t\t& > .ck-label {\n\t\t\t\t\tfont-size: var(--ck-font-size-tiny);\n\t\t\t\t\ttext-align: center;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t& .ck-table-form__border-style,\n\t\t\t& .ck-table-form__border-width {\n\t\t\t\twidth: 80px;\n\t\t\t\tmin-width: 80px;\n\t\t\t\tmax-width: 80px;\n\t\t\t}\n\t\t}\n\n\t\t&.ck-table-form__dimensions-row {\n\t\t\tpadding: 0;\n\n\t\t\t& .ck-table-form__dimensions-row__width,\n\t\t\t& .ck-table-form__dimensions-row__height {\n\t\t\t\tmargin: 0\n\t\t\t}\n\n\t\t\t& .ck-table-form__dimension-operator {\n\t\t\t\talign-self: flex-end;\n\t\t\t\tdisplay: inline-block;\n\t\t\t\theight: var(--ck-ui-component-min-height);\n\t\t\t\tline-height: var(--ck-ui-component-min-height);\n\t\t\t\tmargin: 0 var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\t}\n\n\t& .ck.ck-labeled-field-view {\n\t\tpadding-top: var(--ck-spacing-standard);\n\n\t\t& .ck.ck-labeled-field-view__status {\n\t\t\t@mixin ck-rounded-corners;\n\n\t\t\tbackground: var(--ck-color-base-error);\n\t\t\tcolor: var(--ck-color-base-background);\n\t\t\tpadding: var(--ck-spacing-small) var(--ck-spacing-medium);\n\t\t\tmin-width: var(--ck-table-properties-min-error-width);\n\t\t\ttext-align: center;\n\n\t\t\t/* The arrow pointing towards the field. */\n\t\t\t&::after {\n\t\t\t\tborder-color: transparent transparent var(--ck-color-base-error) transparent;\n\t\t\t\tborder-width: 0 var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size);\n\t\t\t\tborder-style: solid;\n\t\t\t}\n\n\t\t\tanimation: ck-table-form-labeled-view-status-appear .15s ease both;\n\t\t}\n\n\t\t/* Hide the error balloon when the field is blurred. Makes the experience much more clear. */\n\t\t& .ck-input.ck-error:not(:focus) + .ck.ck-labeled-field-view__status {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n@keyframes ck-table-form-labeled-view-status-appear {\n\t0% {\n\t\topacity: 0;\n\t}\n\n\t100% {\n\t\topacity: 1;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row{flex-wrap:wrap;flex-basis:0;align-content:baseline}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar .ck-toolbar__items{flex-wrap:nowrap}.ck.ck-table-properties-form{width:320px}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row{align-self:flex-end;padding:0}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar{background:none;margin-top:var(--ck-spacing-standard)}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar .ck-toolbar__items>*{width:40px}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/tableproperties.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/tableproperties.css"],names:[],mappings:"AAOE,mFACC,cAAe,CACf,YAAa,CACb,sBAKD,CAHC,qHACC,gBACD,CCTH,6BACC,WAmBD,CAhBE,mFACC,mBAAoB,CACpB,SAYD,CAVC,kGACC,eAAgB,CAGhB,qCAKD,CAHC,uHACC,UACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-table-properties-form {\n\t& .ck-form__row {\n\t\t&.ck-table-properties-form__alignment-row {\n\t\t\tflex-wrap: wrap;\n\t\t\tflex-basis: 0;\n\t\t\talign-content: baseline;\n\n\t\t\t& .ck.ck-toolbar .ck-toolbar__items {\n\t\t\t\tflex-wrap: nowrap;\n\t\t\t}\n\t\t}\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-table-properties-form {\n\twidth: 320px;\n\n\t& .ck-form__row {\n\t\t&.ck-table-properties-form__alignment-row {\n\t\t\talign-self: flex-end;\n\t\t\tpadding: 0;\n\n\t\t\t& .ck.ck-toolbar {\n\t\t\t\tbackground: none;\n\n\t\t\t\t/* Compensate for missing input label that would push the margin (toolbar has no inputs). */\n\t\t\t\tmargin-top: var(--ck-spacing-standard);\n\n\t\t\t\t& .ck-toolbar__items > * {\n\t\t\t\t\twidth: 40px;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck-content span[lang]{font-style:italic}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-language/theme/language.css"],names:[],mappings:"AAAA,uBACC,iBACD",sourcesContent:[".ck-content span[lang] {\n\tfont-style: italic;\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,':root{--ck-todo-list-checkmark-size:16px}.ck-content .todo-list{list-style:none}.ck-content .todo-list li{margin-bottom:5px}.ck-content .todo-list li .todo-list{margin-top:5px}.ck-content .todo-list .todo-list__label>input{-webkit-appearance:none;display:inline-block;position:relative;width:var(--ck-todo-list-checkmark-size);height:var(--ck-todo-list-checkmark-size);vertical-align:middle;border:0;left:-25px;margin-right:-15px;right:0;margin-left:0}.ck-content .todo-list .todo-list__label>input:before{display:block;position:absolute;box-sizing:border-box;content:"";width:100%;height:100%;border:1px solid #333;border-radius:2px;transition:box-shadow .25s ease-in-out,background .25s ease-in-out,border .25s ease-in-out}.ck-content .todo-list .todo-list__label>input:after{display:block;position:absolute;box-sizing:content-box;pointer-events:none;content:"";left:calc(var(--ck-todo-list-checkmark-size)/3);top:calc(var(--ck-todo-list-checkmark-size)/5.3);width:calc(var(--ck-todo-list-checkmark-size)/5.3);height:calc(var(--ck-todo-list-checkmark-size)/2.6);border-left:0 solid transparent;border-bottom:calc(var(--ck-todo-list-checkmark-size)/8) solid transparent;border-right:calc(var(--ck-todo-list-checkmark-size)/8) solid transparent;border-top:0 solid transparent;transform:rotate(45deg)}.ck-content .todo-list .todo-list__label>input[checked]:before{background:#26ab33;border-color:#26ab33}.ck-content .todo-list .todo-list__label>input[checked]:after{border-color:#fff}.ck-content .todo-list .todo-list__label .todo-list__label__description{vertical-align:middle}[dir=rtl] .todo-list .todo-list__label>input{left:0;margin-right:0;right:-25px;margin-left:-15px}.ck-editor__editable .todo-list .todo-list__label>input{cursor:pointer}.ck-editor__editable .todo-list .todo-list__label>input:hover:before{box-shadow:0 0 0 5px rgba(0,0,0,.1)}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-list/theme/todolist.css"],names:[],mappings:"AAKA,MACC,kCACD,CAEA,uBACC,eA0ED,CAxEC,0BACC,iBAKD,CAHC,qCACC,cACD,CAIA,+CACC,uBAAwB,CACxB,oBAAqB,CACrB,iBAAkB,CAClB,wCAAyC,CACzC,yCAA0C,CAC1C,qBAAsB,CAGtB,QAAS,CAGT,UAAW,CACX,kBAAmB,CACnB,OAAQ,CACR,aA0CD,CAxCC,sDACC,aAAc,CACd,iBAAkB,CAClB,qBAAsB,CACtB,UAAW,CACX,UAAW,CACX,WAAY,CACZ,qBAAiC,CACjC,iBAAkB,CAClB,0FACD,CAEA,qDACC,aAAc,CACd,iBAAkB,CAClB,sBAAuB,CACvB,mBAAoB,CACpB,UAAW,CAGX,+CAAoD,CACpD,gDAAqD,CACrD,kDAAuD,CACvD,mDAAwD,CAGxD,+BAA+G,CAA/G,0EAA+G,CAA/G,yEAA+G,CAA/G,8BAA+G,CAC/G,uBACD,CAGC,+DACC,kBAA8B,CAC9B,oBACD,CAEA,8DACC,iBACD,CAIF,wEACC,qBACD,CAKF,6CACC,MAAO,CACP,cAAe,CACf,WAAY,CACZ,iBACD,CAMA,wDACC,cAKD,CAHC,qEACC,mCACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-todo-list-checkmark-size: 16px;\n}\n\n.ck-content .todo-list {\n\tlist-style: none;\n\n\t& li {\n\t\tmargin-bottom: 5px;\n\n\t\t& .todo-list {\n\t\t\tmargin-top: 5px;\n\t\t}\n\t}\n\n\t& .todo-list__label {\n\t\t& > input {\n\t\t\t-webkit-appearance: none;\n\t\t\tdisplay: inline-block;\n\t\t\tposition: relative;\n\t\t\twidth: var(--ck-todo-list-checkmark-size);\n\t\t\theight: var(--ck-todo-list-checkmark-size);\n\t\t\tvertical-align: middle;\n\n\t\t\t/* Needed on iOS */\n\t\t\tborder: 0;\n\n\t\t\t/* LTR styles */\n\t\t\tleft: -25px;\n\t\t\tmargin-right: -15px;\n\t\t\tright: 0;\n\t\t\tmargin-left: 0;\n\n\t\t\t&::before {\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tcontent: '';\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tborder: 1px solid hsl(0, 0%, 20%);\n\t\t\t\tborder-radius: 2px;\n\t\t\t\ttransition: 250ms ease-in-out box-shadow, 250ms ease-in-out background, 250ms ease-in-out border;\n\t\t\t}\n\n\t\t\t&::after {\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tbox-sizing: content-box;\n\t\t\t\tpointer-events: none;\n\t\t\t\tcontent: '';\n\n\t\t\t\t/* Calculate tick position, size and border-width proportional to the checkmark size. */\n\t\t\t\tleft: calc( var(--ck-todo-list-checkmark-size) / 3 );\n\t\t\t\ttop: calc( var(--ck-todo-list-checkmark-size) / 5.3 );\n\t\t\t\twidth: calc( var(--ck-todo-list-checkmark-size) / 5.3 );\n\t\t\t\theight: calc( var(--ck-todo-list-checkmark-size) / 2.6 );\n\t\t\t\tborder-style: solid;\n\t\t\t\tborder-color: transparent;\n\t\t\t\tborder-width: 0 calc( var(--ck-todo-list-checkmark-size) / 8 ) calc( var(--ck-todo-list-checkmark-size) / 8 ) 0;\n\t\t\t\ttransform: rotate(45deg);\n\t\t\t}\n\n\t\t\t&[checked] {\n\t\t\t\t&::before {\n\t\t\t\t\tbackground: hsl(126, 64%, 41%);\n\t\t\t\t\tborder-color: hsl(126, 64%, 41%);\n\t\t\t\t}\n\n\t\t\t\t&::after {\n\t\t\t\t\tborder-color: hsl(0, 0%, 100%);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t& .todo-list__label__description {\n\t\t\tvertical-align: middle;\n\t\t}\n\t}\n}\n\n/* RTL styles */\n[dir=\"rtl\"] .todo-list .todo-list__label > input {\n\tleft: 0;\n\tmargin-right: 0;\n\tright: -25px;\n\tmargin-left: -15px;\n}\n\n/*\n * To-do list should be interactive only during the editing\n * (https://github.com/ckeditor/ckeditor5/issues/2090).\n */\n.ck-editor__editable .todo-list .todo-list__label > input {\n\tcursor: pointer;\n\n\t&:hover::before {\n\t\tbox-shadow: 0 0 0 5px hsla(0, 0%, 0%, 0.1);\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(t){if(typeof window==="object")n=window}t.exports=n},function(t,e,n){"use strict";function o(){return false}e["a"]=o},function(t,e,n){"use strict";n.r(e);function o(){return function t(){t.called=true}}var i=o;class r{constructor(t,e){this.source=t;this.name=e;this.path=[];this.stop=i();this.off=i()}}const s=new Array(256).fill().map(((t,e)=>("0"+e.toString(16)).slice(-2)));function a(){const t=Math.random()*4294967296>>>0;const e=Math.random()*4294967296>>>0;const n=Math.random()*4294967296>>>0;const o=Math.random()*4294967296>>>0;return"e"+s[t>>0&255]+s[t>>8&255]+s[t>>16&255]+s[t>>24&255]+s[e>>0&255]+s[e>>8&255]+s[e>>16&255]+s[e>>24&255]+s[n>>0&255]+s[n>>8&255]+s[n>>16&255]+s[n>>24&255]+s[o>>0&255]+s[o>>8&255]+s[o>>16&255]+s[o>>24&255]}const c={get(t){if(typeof t!="number"){return this[t]||this.normal}else{return t}},highest:1e5,high:1e3,normal:0,low:-1e3,lowest:-1e5};var l=c;var d=n(8);var u=n(0);const h=Symbol("listeningTo");const f=Symbol("emitterId");const m={on(t,e,n={}){this.listenTo(this,t,e,n)},once(t,e,n){let o=false;const i=function(t,...n){if(!o){o=true;t.off();e.call(this,t,...n)}};this.listenTo(this,t,i,n)},off(t,e){this.stopListening(this,t,e)},listenTo(t,e,n,o={}){let i,r;if(!this[h]){this[h]={}}const s=this[h];if(!k(t)){b(t)}const a=k(t);if(!(i=s[a])){i=s[a]={emitter:t,callbacks:{}}}if(!(r=i.callbacks[e])){r=i.callbacks[e]=[]}r.push(n);x(this,t,e,n,o)},stopListening(t,e,n){const o=this[h];let i=t&&k(t);const r=o&&i&&o[i];const s=r&&e&&r.callbacks[e];if(!o||t&&!r||e&&!s){return}if(n){E(this,t,e,n);const o=s.indexOf(n);if(o!==-1){if(s.length===1){delete r.callbacks[e]}else{E(this,t,e,n)}}}else if(s){while(n=s.pop()){E(this,t,e,n)}delete r.callbacks[e]}else if(r){for(e in r.callbacks){this.stopListening(t,e)}delete o[i]}else{for(i in o){this.stopListening(o[i].emitter)}delete this[h]}},fire(t,...e){try{const n=t instanceof r?t:new r(this,t);const o=n.name;let i=v(this,o);n.path.push(this);if(i){const t=[n,...e];i=Array.from(i);for(let e=0;e<i.length;e++){i[e].callback.apply(this,t);if(n.off.called){delete n.off.called;this._removeEventListener(o,i[e].callback)}if(n.stop.called){break}}}if(this._delegations){const t=this._delegations.get(o);const i=this._delegations.get("*");if(t){y(t,n,e)}if(i){y(i,n,e)}}return n.return}catch(t){u["a"].rethrowUnexpectedError(t,this)}},delegate(...t){return{to:(e,n)=>{if(!this._delegations){this._delegations=new Map}t.forEach((t=>{const o=this._delegations.get(t);if(!o){this._delegations.set(t,new Map([[e,n]]))}else{o.set(e,n)}}))}}},stopDelegating(t,e){if(!this._delegations){return}if(!t){this._delegations.clear()}else if(!e){this._delegations.delete(t)}else{const n=this._delegations.get(t);if(n){n.delete(e)}}},_addEventListener(t,e,n){A(this,t);const o=_(this,t);const i=l.get(n.priority);const r={callback:e,priority:i};for(const t of o){let e=false;for(let n=0;n<t.length;n++){if(t[n].priority<i){t.splice(n,0,r);e=true;break}}if(!e){t.push(r)}}},_removeEventListener(t,e){const n=_(this,t);for(const t of n){for(let n=0;n<t.length;n++){if(t[n].callback==e){t.splice(n,1);n--}}}}};var g=m;function p(t,e){if(t[h]&&t[h][e]){return t[h][e].emitter}return null}function b(t,e){if(!t[f]){t[f]=e||a()}}function k(t){return t[f]}function w(t){if(!t._events){Object.defineProperty(t,"_events",{value:{}})}return t._events}function C(){return{callbacks:[],childEvents:[]}}function A(t,e){const n=w(t);if(n[e]){return}let o=e;let i=null;const r=[];while(o!==""){if(n[o]){break}n[o]=C();r.push(n[o]);if(i){n[o].childEvents.push(i)}i=o;o=o.substr(0,o.lastIndexOf(":"))}if(o!==""){for(const t of r){t.callbacks=n[o].callbacks.slice()}n[o].childEvents.push(i)}}function _(t,e){const n=w(t)[e];if(!n){return[]}let o=[n.callbacks];for(let e=0;e<n.childEvents.length;e++){const i=_(t,n.childEvents[e]);o=o.concat(i)}return o}function v(t,e){let n;if(!t._events||!(n=t._events[e])||!n.callbacks.length){if(e.indexOf(":")>-1){return v(t,e.substr(0,e.lastIndexOf(":")))}else{return null}}return n.callbacks}function y(t,e,n){for(let[o,i]of t){if(!i){i=e.name}else if(typeof i=="function"){i=i(e.name)}const t=new r(e.source,i);t.path=[...e.path];o.fire(t,...n)}}function x(t,e,n,o,i){if(e._addEventListener){e._addEventListener(n,o,i)}else{t._addEventListener.call(e,n,o,i)}}function E(t,e,n,o){if(e._removeEventListener){e._removeEventListener(n,o)}else{t._removeEventListener.call(e,n,o)}}function D(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}var S=D;var B=n(5);var T=B["a"].Symbol;var P=T;var I=Object.prototype;var R=I.hasOwnProperty;var F=I.toString;var z=P?P.toStringTag:undefined;function O(t){var e=R.call(t,z),n=t[z];try{t[z]=undefined;var o=true}catch(t){}var i=F.call(t);if(o){if(e){t[z]=n}else{delete t[z]}}return i}var N=O;var M=Object.prototype;var V=M.toString;function L(t){return V.call(t)}var H=L;var K="[object Null]",q="[object Undefined]";var j=P?P.toStringTag:undefined;function W(t){if(t==null){return t===undefined?q:K}return j&&j in Object(t)?N(t):H(t)}var G=W;var U="[object AsyncFunction]",$="[object Function]",J="[object GeneratorFunction]",Y="[object Proxy]";function Q(t){if(!S(t)){return false}var e=G(t);return e==$||e==J||e==U||e==Y}var X=Q;var Z=B["a"]["__core-js_shared__"];var tt=Z;var et=function(){var t=/[^.]+$/.exec(tt&&tt.keys&&tt.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();function nt(t){return!!et&&et in t}var ot=nt;var it=Function.prototype;var rt=it.toString;function st(t){if(t!=null){try{return rt.call(t)}catch(t){}try{return t+""}catch(t){}}return""}var at=st;var ct=/[\\^$.*+?()[\]{}|]/g;var lt=/^\[object .+?Constructor\]$/;var dt=Function.prototype,ut=Object.prototype;var ht=dt.toString;var ft=ut.hasOwnProperty;var mt=RegExp("^"+ht.call(ft).replace(ct,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function gt(t){if(!S(t)||ot(t)){return false}var e=X(t)?mt:lt;return e.test(at(t))}var pt=gt;function bt(t,e){return t==null?undefined:t[e]}var kt=bt;function wt(t,e){var n=kt(t,e);return pt(n)?n:undefined}var Ct=wt;var At=function(){try{var t=Ct(Object,"defineProperty");t({},"",{});return t}catch(t){}}();var _t=At;function vt(t,e,n){if(e=="__proto__"&&_t){_t(t,e,{configurable:true,enumerable:true,value:n,writable:true})}else{t[e]=n}}var yt=vt;function xt(t,e){return t===e||t!==t&&e!==e}var Et=xt;var Dt=Object.prototype;var St=Dt.hasOwnProperty;function Bt(t,e,n){var o=t[e];if(!(St.call(t,e)&&Et(o,n))||n===undefined&&!(e in t)){yt(t,e,n)}}var Tt=Bt;function Pt(t,e,n,o){var i=!n;n||(n={});var r=-1,s=e.length;while(++r<s){var a=e[r];var c=o?o(n[a],t[a],a,n,t):undefined;if(c===undefined){c=t[a]}if(i){yt(n,a,c)}else{Tt(n,a,c)}}return n}var It=Pt;function Rt(t){return t}var Ft=Rt;function zt(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}var Ot=zt;var Nt=Math.max;function Mt(t,e,n){e=Nt(e===undefined?t.length-1:e,0);return function(){var o=arguments,i=-1,r=Nt(o.length-e,0),s=Array(r);while(++i<r){s[i]=o[e+i]}i=-1;var a=Array(e+1);while(++i<e){a[i]=o[i]}a[e]=n(s);return Ot(t,this,a)}}var Vt=Mt;function Lt(t){return function(){return t}}var Ht=Lt;var Kt=!_t?Ft:function(t,e){return _t(t,"toString",{configurable:true,enumerable:false,value:Ht(e),writable:true})};var qt=Kt;var jt=800,Wt=16;var Gt=Date.now;function Ut(t){var e=0,n=0;return function(){var o=Gt(),i=Wt-(o-n);n=o;if(i>0){if(++e>=jt){return arguments[0]}}else{e=0}return t.apply(undefined,arguments)}}var $t=Ut;var Jt=$t(qt);var Yt=Jt;function Qt(t,e){return Yt(Vt(t,e,Ft),t+"")}var Xt=Qt;var Zt=9007199254740991;function te(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=Zt}var ee=te;function ne(t){return t!=null&&ee(t.length)&&!X(t)}var oe=ne;var ie=9007199254740991;var re=/^(?:0|[1-9]\d*)$/;function se(t,e){var n=typeof t;e=e==null?ie:e;return!!e&&(n=="number"||n!="symbol"&&re.test(t))&&(t>-1&&t%1==0&&t<e)}var ae=se;function ce(t,e,n){if(!S(n)){return false}var o=typeof e;if(o=="number"?oe(n)&&ae(e,n.length):o=="string"&&e in n){return Et(n[e],t)}return false}var le=ce;function de(t){return Xt((function(e,n){var o=-1,i=n.length,r=i>1?n[i-1]:undefined,s=i>2?n[2]:undefined;r=t.length>3&&typeof r=="function"?(i--,r):undefined;if(s&&le(n[0],n[1],s)){r=i<3?undefined:r;i=1}e=Object(e);while(++o<i){var a=n[o];if(a){t(e,a,o,r)}}return e}))}var ue=de;function he(t,e){var n=-1,o=Array(t);while(++n<t){o[n]=e(n)}return o}var fe=he;function me(t){return t!=null&&typeof t=="object"}var ge=me;var pe="[object Arguments]";function be(t){return ge(t)&&G(t)==pe}var ke=be;var we=Object.prototype;var Ce=we.hasOwnProperty;var Ae=we.propertyIsEnumerable;var _e=ke(function(){return arguments}())?ke:function(t){return ge(t)&&Ce.call(t,"callee")&&!Ae.call(t,"callee")};var ve=_e;var ye=Array.isArray;var xe=ye;var Ee=n(6);var De="[object Arguments]",Se="[object Array]",Be="[object Boolean]",Te="[object Date]",Pe="[object Error]",Ie="[object Function]",Re="[object Map]",Fe="[object Number]",ze="[object Object]",Oe="[object RegExp]",Ne="[object Set]",Me="[object String]",Ve="[object WeakMap]";var Le="[object ArrayBuffer]",He="[object DataView]",Ke="[object Float32Array]",qe="[object Float64Array]",je="[object Int8Array]",We="[object Int16Array]",Ge="[object Int32Array]",Ue="[object Uint8Array]",$e="[object Uint8ClampedArray]",Je="[object Uint16Array]",Ye="[object Uint32Array]";var Qe={};Qe[Ke]=Qe[qe]=Qe[je]=Qe[We]=Qe[Ge]=Qe[Ue]=Qe[$e]=Qe[Je]=Qe[Ye]=true;Qe[De]=Qe[Se]=Qe[Le]=Qe[Be]=Qe[He]=Qe[Te]=Qe[Pe]=Qe[Ie]=Qe[Re]=Qe[Fe]=Qe[ze]=Qe[Oe]=Qe[Ne]=Qe[Me]=Qe[Ve]=false;function Xe(t){return ge(t)&&ee(t.length)&&!!Qe[G(t)]}var Ze=Xe;function tn(t){return function(e){return t(e)}}var en=tn;var nn=n(7);var on=nn["a"]&&nn["a"].isTypedArray;var rn=on?en(on):Ze;var sn=rn;var an=Object.prototype;var cn=an.hasOwnProperty;function ln(t,e){var n=xe(t),o=!n&&ve(t),i=!n&&!o&&Object(Ee["a"])(t),r=!n&&!o&&!i&&sn(t),s=n||o||i||r,a=s?fe(t.length,String):[],c=a.length;for(var l in t){if((e||cn.call(t,l))&&!(s&&(l=="length"||i&&(l=="offset"||l=="parent")||r&&(l=="buffer"||l=="byteLength"||l=="byteOffset")||ae(l,c)))){a.push(l)}}return a}var dn=ln;var un=Object.prototype;function hn(t){var e=t&&t.constructor,n=typeof e=="function"&&e.prototype||un;return t===n}var fn=hn;function mn(t){var e=[];if(t!=null){for(var n in Object(t)){e.push(n)}}return e}var gn=mn;var pn=Object.prototype;var bn=pn.hasOwnProperty;function kn(t){if(!S(t)){return gn(t)}var e=fn(t),n=[];for(var o in t){if(!(o=="constructor"&&(e||!bn.call(t,o)))){n.push(o)}}return n}var wn=kn;function Cn(t){return oe(t)?dn(t,true):wn(t)}var An=Cn;var _n=ue((function(t,e){It(e,An(e),t)}));var vn=_n;const yn=Symbol("observableProperties");const xn=Symbol("boundObservables");const En=Symbol("boundProperties");const Dn=Symbol("decoratedMethods");const Sn=Symbol("decoratedOriginal");const Bn={set(t,e){if(S(t)){Object.keys(t).forEach((e=>{this.set(e,t[e])}),this);return}Pn(this);const n=this[yn];if(t in this&&!n.has(t)){throw new u["a"]("observable-set-cannot-override",this)}Object.defineProperty(this,t,{enumerable:true,configurable:true,get(){return n.get(t)},set(e){const o=n.get(t);let i=this.fire("set:"+t,t,e,o);if(i===undefined){i=e}if(o!==i||!n.has(t)){n.set(t,i);this.fire("change:"+t,t,i,o)}}});this[t]=e},bind(...t){if(!t.length||!zn(t)){throw new u["a"]("observable-bind-wrong-properties",this)}if(new Set(t).size!==t.length){throw new u["a"]("observable-bind-duplicate-properties",this)}Pn(this);const e=this[En];t.forEach((t=>{if(e.has(t)){throw new u["a"]("observable-bind-rebind",this)}}));const n=new Map;t.forEach((t=>{const o={property:t,to:[]};e.set(t,o);n.set(t,o)}));return{to:In,toMany:Rn,_observable:this,_bindProperties:t,_to:[],_bindings:n}},unbind(...t){if(!this[yn]){return}const e=this[En];const n=this[xn];if(t.length){if(!zn(t)){throw new u["a"]("observable-unbind-wrong-properties",this)}t.forEach((t=>{const o=e.get(t);if(!o){return}let i,r,s,a;o.to.forEach((t=>{i=t[0];r=t[1];s=n.get(i);a=s[r];a.delete(o);if(!a.size){delete s[r]}if(!Object.keys(s).length){n.delete(i);this.stopListening(i,"change")}}));e.delete(t)}))}else{n.forEach(((t,e)=>{this.stopListening(e,"change")}));n.clear();e.clear()}},decorate(t){const e=this[t];if(!e){throw new u["a"]("observablemixin-cannot-decorate-undefined",this,{object:this,methodName:t})}this.on(t,((t,n)=>{t.return=e.apply(this,n)}));this[t]=function(...e){return this.fire(t,e)};this[t][Sn]=e;if(!this[Dn]){this[Dn]=[]}this[Dn].push(t)}};vn(Bn,g);Bn.stopListening=function(t,e,n){if(!t&&this[Dn]){for(const t of this[Dn]){this[t]=this[t][Sn]}delete this[Dn]}g.stopListening.call(this,t,e,n)};var Tn=Bn;function Pn(t){if(t[yn]){return}Object.defineProperty(t,yn,{value:new Map});Object.defineProperty(t,xn,{value:new Map});Object.defineProperty(t,En,{value:new Map})}function In(...t){const e=On(...t);const n=Array.from(this._bindings.keys());const o=n.length;if(!e.callback&&e.to.length>1){throw new u["a"]("observable-bind-to-no-callback",this)}if(o>1&&e.callback){throw new u["a"]("observable-bind-to-extra-callback",this)}e.to.forEach((t=>{if(t.properties.length&&t.properties.length!==o){throw new u["a"]("observable-bind-to-properties-length",this)}if(!t.properties.length){t.properties=this._bindProperties}}));this._to=e.to;if(e.callback){this._bindings.get(n[0]).callback=e.callback}Ln(this._observable,this._to);Mn(this);this._bindProperties.forEach((t=>{Vn(this._observable,t)}))}function Rn(t,e,n){if(this._bindings.size>1){throw new u["a"]("observable-bind-to-many-not-one-binding",this)}this.to(...Fn(t,e),n)}function Fn(t,e){const n=t.map((t=>[t,e]));return Array.prototype.concat.apply([],n)}function zn(t){return t.every((t=>typeof t=="string"))}function On(...t){if(!t.length){throw new u["a"]("observable-bind-to-parse-error",null)}const e={to:[]};let n;if(typeof t[t.length-1]=="function"){e.callback=t.pop()}t.forEach((t=>{if(typeof t=="string"){n.properties.push(t)}else if(typeof t=="object"){n={observable:t,properties:[]};e.to.push(n)}else{throw new u["a"]("observable-bind-to-parse-error",null)}}));return e}function Nn(t,e,n,o){const i=t[xn];const r=i.get(n);const s=r||{};if(!s[o]){s[o]=new Set}s[o].add(e);if(!r){i.set(n,s)}}function Mn(t){let e;t._bindings.forEach(((n,o)=>{t._to.forEach((i=>{e=i.properties[n.callback?0:t._bindProperties.indexOf(o)];n.to.push([i.observable,e]);Nn(t._observable,n,i.observable,e)}))}))}function Vn(t,e){const n=t[En];const o=n.get(e);let i;if(o.callback){i=o.callback.apply(t,o.to.map((t=>t[0][t[1]])))}else{i=o.to[0];i=i[0][i[1]]}if(Object.prototype.hasOwnProperty.call(t,e)){t[e]=i}else{t.set(e,i)}}function Ln(t,e){e.forEach((e=>{const n=t[xn];let o;if(!n.get(e.observable)){t.listenTo(e.observable,"change",((i,r)=>{o=n.get(e.observable)[r];if(o){o.forEach((e=>{Vn(t,e.property)}))}}))}}))}function Hn(t,...e){e.forEach((e=>{Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e)).forEach((n=>{if(n in t.prototype){return}const o=Object.getOwnPropertyDescriptor(e,n);o.enumerable=false;Object.defineProperty(t.prototype,n,o)}))}))}class Kn{constructor(t){this.editor=t;this.set("isEnabled",true);this._disableStack=new Set}forceDisabled(t){this._disableStack.add(t);if(this._disableStack.size==1){this.on("set:isEnabled",qn,{priority:"highest"});this.isEnabled=false}}clearForceDisabled(t){this._disableStack.delete(t);if(this._disableStack.size==0){this.off("set:isEnabled",qn);this.isEnabled=true}}destroy(){this.stopListening()}static get isContextPlugin(){return false}}Hn(Kn,Tn);function qn(t){t.return=false;t.stop()}class jn{constructor(t){this.editor=t;this.set("value",undefined);this.set("isEnabled",false);this._disableStack=new Set;this.decorate("execute");this.listenTo(this.editor.model.document,"change",(()=>{this.refresh()}));this.on("execute",(t=>{if(!this.isEnabled){t.stop()}}),{priority:"high"});this.listenTo(t,"change:isReadOnly",((t,e,n)=>{if(n){this.forceDisabled("readOnlyMode")}else{this.clearForceDisabled("readOnlyMode")}}))}refresh(){this.isEnabled=true}forceDisabled(t){this._disableStack.add(t);if(this._disableStack.size==1){this.on("set:isEnabled",Wn,{priority:"highest"});this.isEnabled=false}}clearForceDisabled(t){this._disableStack.delete(t);if(this._disableStack.size==0){this.off("set:isEnabled",Wn);this.refresh()}}execute(){}destroy(){this.stopListening()}}Hn(jn,Tn);function Wn(t){t.return=false;t.stop()}class Gn extends jn{constructor(t){super(t);this._childCommands=[]}refresh(){}execute(...t){const e=this._getFirstEnabledCommand();return e.execute(t)}registerChildCommand(t){this._childCommands.push(t);t.on("change:isEnabled",(()=>this._checkEnabled()));this._checkEnabled()}_checkEnabled(){this.isEnabled=!!this._getFirstEnabledCommand()}_getFirstEnabledCommand(){return this._childCommands.find((t=>t.isEnabled))}}function Un(t,e){return function(n){return t(e(n))}}var $n=Un;var Jn=$n(Object.getPrototypeOf,Object);var Yn=Jn;var Qn="[object Object]";var Xn=Function.prototype,Zn=Object.prototype;var to=Xn.toString;var eo=Zn.hasOwnProperty;var no=to.call(Object);function oo(t){if(!ge(t)||G(t)!=Qn){return false}var e=Yn(t);if(e===null){return true}var n=eo.call(e,"constructor")&&e.constructor;return typeof n=="function"&&n instanceof n&&to.call(n)==no}var io=oo;function ro(){this.__data__=[];this.size=0}var so=ro;function ao(t,e){var n=t.length;while(n--){if(Et(t[n][0],e)){return n}}return-1}var co=ao;var lo=Array.prototype;var uo=lo.splice;function ho(t){var e=this.__data__,n=co(e,t);if(n<0){return false}var o=e.length-1;if(n==o){e.pop()}else{uo.call(e,n,1)}--this.size;return true}var fo=ho;function mo(t){var e=this.__data__,n=co(e,t);return n<0?undefined:e[n][1]}var go=mo;function po(t){return co(this.__data__,t)>-1}var bo=po;function ko(t,e){var n=this.__data__,o=co(n,t);if(o<0){++this.size;n.push([t,e])}else{n[o][1]=e}return this}var wo=ko;function Co(t){var e=-1,n=t==null?0:t.length;this.clear();while(++e<n){var o=t[e];this.set(o[0],o[1])}}Co.prototype.clear=so;Co.prototype["delete"]=fo;Co.prototype.get=go;Co.prototype.has=bo;Co.prototype.set=wo;var Ao=Co;function _o(){this.__data__=new Ao;this.size=0}var vo=_o;function yo(t){var e=this.__data__,n=e["delete"](t);this.size=e.size;return n}var xo=yo;function Eo(t){return this.__data__.get(t)}var Do=Eo;function So(t){return this.__data__.has(t)}var Bo=So;var To=Ct(B["a"],"Map");var Po=To;var Io=Ct(Object,"create");var Ro=Io;function Fo(){this.__data__=Ro?Ro(null):{};this.size=0}var zo=Fo;function Oo(t){var e=this.has(t)&&delete this.__data__[t];this.size-=e?1:0;return e}var No=Oo;var Mo="__lodash_hash_undefined__";var Vo=Object.prototype;var Lo=Vo.hasOwnProperty;function Ho(t){var e=this.__data__;if(Ro){var n=e[t];return n===Mo?undefined:n}return Lo.call(e,t)?e[t]:undefined}var Ko=Ho;var qo=Object.prototype;var jo=qo.hasOwnProperty;function Wo(t){var e=this.__data__;return Ro?e[t]!==undefined:jo.call(e,t)}var Go=Wo;var Uo="__lodash_hash_undefined__";function $o(t,e){var n=this.__data__;this.size+=this.has(t)?0:1;n[t]=Ro&&e===undefined?Uo:e;return this}var Jo=$o;function Yo(t){var e=-1,n=t==null?0:t.length;this.clear();while(++e<n){var o=t[e];this.set(o[0],o[1])}}Yo.prototype.clear=zo;Yo.prototype["delete"]=No;Yo.prototype.get=Ko;Yo.prototype.has=Go;Yo.prototype.set=Jo;var Qo=Yo;function Xo(){this.size=0;this.__data__={hash:new Qo,map:new(Po||Ao),string:new Qo}}var Zo=Xo;function ti(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}var ei=ti;function ni(t,e){var n=t.__data__;return ei(e)?n[typeof e=="string"?"string":"hash"]:n.map}var oi=ni;function ii(t){var e=oi(this,t)["delete"](t);this.size-=e?1:0;return e}var ri=ii;function si(t){return oi(this,t).get(t)}var ai=si;function ci(t){return oi(this,t).has(t)}var li=ci;function di(t,e){var n=oi(this,t),o=n.size;n.set(t,e);this.size+=n.size==o?0:1;return this}var ui=di;function hi(t){var e=-1,n=t==null?0:t.length;this.clear();while(++e<n){var o=t[e];this.set(o[0],o[1])}}hi.prototype.clear=Zo;hi.prototype["delete"]=ri;hi.prototype.get=ai;hi.prototype.has=li;hi.prototype.set=ui;var fi=hi;var mi=200;function gi(t,e){var n=this.__data__;if(n instanceof Ao){var o=n.__data__;if(!Po||o.length<mi-1){o.push([t,e]);this.size=++n.size;return this}n=this.__data__=new fi(o)}n.set(t,e);this.size=n.size;return this}var pi=gi;function bi(t){var e=this.__data__=new Ao(t);this.size=e.size}bi.prototype.clear=vo;bi.prototype["delete"]=xo;bi.prototype.get=Do;bi.prototype.has=Bo;bi.prototype.set=pi;var ki=bi;function wi(t,e){var n=-1,o=t==null?0:t.length;while(++n<o){if(e(t[n],n,t)===false){break}}return t}var Ci=wi;var Ai=$n(Object.keys,Object);var _i=Ai;var vi=Object.prototype;var yi=vi.hasOwnProperty;function xi(t){if(!fn(t)){return _i(t)}var e=[];for(var n in Object(t)){if(yi.call(t,n)&&n!="constructor"){e.push(n)}}return e}var Ei=xi;function Di(t){return oe(t)?dn(t):Ei(t)}var Si=Di;function Bi(t,e){return t&&It(e,Si(e),t)}var Ti=Bi;function Pi(t,e){return t&&It(e,An(e),t)}var Ii=Pi;var Ri=n(10);function Fi(t,e){var n=-1,o=t.length;e||(e=Array(o));while(++n<o){e[n]=t[n]}return e}var zi=Fi;function Oi(t,e){var n=-1,o=t==null?0:t.length,i=0,r=[];while(++n<o){var s=t[n];if(e(s,n,t)){r[i++]=s}}return r}var Ni=Oi;function Mi(){return[]}var Vi=Mi;var Li=Object.prototype;var Hi=Li.propertyIsEnumerable;var Ki=Object.getOwnPropertySymbols;var qi=!Ki?Vi:function(t){if(t==null){return[]}t=Object(t);return Ni(Ki(t),(function(e){return Hi.call(t,e)}))};var ji=qi;function Wi(t,e){return It(t,ji(t),e)}var Gi=Wi;function Ui(t,e){var n=-1,o=e.length,i=t.length;while(++n<o){t[i+n]=e[n]}return t}var $i=Ui;var Ji=Object.getOwnPropertySymbols;var Yi=!Ji?Vi:function(t){var e=[];while(t){$i(e,ji(t));t=Yn(t)}return e};var Qi=Yi;function Xi(t,e){return It(t,Qi(t),e)}var Zi=Xi;function tr(t,e,n){var o=e(t);return xe(t)?o:$i(o,n(t))}var er=tr;function nr(t){return er(t,Si,ji)}var or=nr;function ir(t){return er(t,An,Qi)}var rr=ir;var sr=Ct(B["a"],"DataView");var ar=sr;var cr=Ct(B["a"],"Promise");var lr=cr;var dr=Ct(B["a"],"Set");var ur=dr;var hr=Ct(B["a"],"WeakMap");var fr=hr;var mr="[object Map]",gr="[object Object]",pr="[object Promise]",br="[object Set]",kr="[object WeakMap]";var wr="[object DataView]";var Cr=at(ar),Ar=at(Po),_r=at(lr),vr=at(ur),yr=at(fr);var xr=G;if(ar&&xr(new ar(new ArrayBuffer(1)))!=wr||Po&&xr(new Po)!=mr||lr&&xr(lr.resolve())!=pr||ur&&xr(new ur)!=br||fr&&xr(new fr)!=kr){xr=function(t){var e=G(t),n=e==gr?t.constructor:undefined,o=n?at(n):"";if(o){switch(o){case Cr:return wr;case Ar:return mr;case _r:return pr;case vr:return br;case yr:return kr}}return e}}var Er=xr;var Dr=Object.prototype;var Sr=Dr.hasOwnProperty;function Br(t){var e=t.length,n=new t.constructor(e);if(e&&typeof t[0]=="string"&&Sr.call(t,"index")){n.index=t.index;n.input=t.input}return n}var Tr=Br;var Pr=B["a"].Uint8Array;var Ir=Pr;function Rr(t){var e=new t.constructor(t.byteLength);new Ir(e).set(new Ir(t));return e}var Fr=Rr;function zr(t,e){var n=e?Fr(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}var Or=zr;var Nr=/\w*$/;function Mr(t){var e=new t.constructor(t.source,Nr.exec(t));e.lastIndex=t.lastIndex;return e}var Vr=Mr;var Lr=P?P.prototype:undefined,Hr=Lr?Lr.valueOf:undefined;function Kr(t){return Hr?Object(Hr.call(t)):{}}var qr=Kr;function jr(t,e){var n=e?Fr(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}var Wr=jr;var Gr="[object Boolean]",Ur="[object Date]",$r="[object Map]",Jr="[object Number]",Yr="[object RegExp]",Qr="[object Set]",Xr="[object String]",Zr="[object Symbol]";var ts="[object ArrayBuffer]",es="[object DataView]",ns="[object Float32Array]",os="[object Float64Array]",is="[object Int8Array]",rs="[object Int16Array]",ss="[object Int32Array]",as="[object Uint8Array]",cs="[object Uint8ClampedArray]",ls="[object Uint16Array]",ds="[object Uint32Array]";function us(t,e,n){var o=t.constructor;switch(e){case ts:return Fr(t);case Gr:case Ur:return new o(+t);case es:return Or(t,n);case ns:case os:case is:case rs:case ss:case as:case cs:case ls:case ds:return Wr(t,n);case $r:return new o;case Jr:case Xr:return new o(t);case Yr:return Vr(t);case Qr:return new o;case Zr:return qr(t)}}var hs=us;var fs=Object.create;var ms=function(){function t(){}return function(e){if(!S(e)){return{}}if(fs){return fs(e)}t.prototype=e;var n=new t;t.prototype=undefined;return n}}();var gs=ms;function ps(t){return typeof t.constructor=="function"&&!fn(t)?gs(Yn(t)):{}}var bs=ps;var ks="[object Map]";function ws(t){return ge(t)&&Er(t)==ks}var Cs=ws;var As=nn["a"]&&nn["a"].isMap;var _s=As?en(As):Cs;var vs=_s;var ys="[object Set]";function xs(t){return ge(t)&&Er(t)==ys}var Es=xs;var Ds=nn["a"]&&nn["a"].isSet;var Ss=Ds?en(Ds):Es;var Bs=Ss;var Ts=1,Ps=2,Is=4;var Rs="[object Arguments]",Fs="[object Array]",zs="[object Boolean]",Os="[object Date]",Ns="[object Error]",Ms="[object Function]",Vs="[object GeneratorFunction]",Ls="[object Map]",Hs="[object Number]",Ks="[object Object]",qs="[object RegExp]",js="[object Set]",Ws="[object String]",Gs="[object Symbol]",Us="[object WeakMap]";var $s="[object ArrayBuffer]",Js="[object DataView]",Ys="[object Float32Array]",Qs="[object Float64Array]",Xs="[object Int8Array]",Zs="[object Int16Array]",ta="[object Int32Array]",ea="[object Uint8Array]",na="[object Uint8ClampedArray]",oa="[object Uint16Array]",ia="[object Uint32Array]";var ra={};ra[Rs]=ra[Fs]=ra[$s]=ra[Js]=ra[zs]=ra[Os]=ra[Ys]=ra[Qs]=ra[Xs]=ra[Zs]=ra[ta]=ra[Ls]=ra[Hs]=ra[Ks]=ra[qs]=ra[js]=ra[Ws]=ra[Gs]=ra[ea]=ra[na]=ra[oa]=ra[ia]=true;ra[Ns]=ra[Ms]=ra[Us]=false;function sa(t,e,n,o,i,r){var s,a=e&Ts,c=e&Ps,l=e&Is;if(n){s=i?n(t,o,i,r):n(t)}if(s!==undefined){return s}if(!S(t)){return t}var d=xe(t);if(d){s=Tr(t);if(!a){return zi(t,s)}}else{var u=Er(t),h=u==Ms||u==Vs;if(Object(Ee["a"])(t)){return Object(Ri["a"])(t,a)}if(u==Ks||u==Rs||h&&!i){s=c||h?{}:bs(t);if(!a){return c?Zi(t,Ii(s,t)):Gi(t,Ti(s,t))}}else{if(!ra[u]){return i?t:{}}s=hs(t,u,a)}}r||(r=new ki);var f=r.get(t);if(f){return f}r.set(t,s);if(Bs(t)){t.forEach((function(o){s.add(sa(o,e,n,o,t,r))}))}else if(vs(t)){t.forEach((function(o,i){s.set(i,sa(o,e,n,i,t,r))}))}var m=l?c?rr:or:c?An:Si;var g=d?undefined:m(t);Ci(g||t,(function(o,i){if(g){i=o;o=t[i]}Tt(s,i,sa(o,e,n,i,t,r))}));return s}var aa=sa;var ca=1,la=4;function da(t,e){e=typeof e=="function"?e:undefined;return aa(t,ca|la,e)}var ua=da;function ha(t){return ge(t)&&t.nodeType===1&&!io(t)}var fa=ha;class ma{constructor(t,e){this._config={};if(e){this.define(ga(e))}if(t){this._setObjectToTarget(this._config,t)}}set(t,e){this._setToTarget(this._config,t,e)}define(t,e){const n=true;this._setToTarget(this._config,t,e,n)}get(t){return this._getFromSource(this._config,t)}*names(){for(const t of Object.keys(this._config)){yield t}}_setToTarget(t,e,n,o=false){if(io(e)){this._setObjectToTarget(t,e,o);return}const i=e.split(".");e=i.pop();for(const e of i){if(!io(t[e])){t[e]={}}t=t[e]}if(io(n)){if(!io(t[e])){t[e]={}}t=t[e];this._setObjectToTarget(t,n,o);return}if(o&&typeof t[e]!="undefined"){return}t[e]=n}_getFromSource(t,e){const n=e.split(".");e=n.pop();for(const e of n){if(!io(t[e])){t=null;break}t=t[e]}return t?ga(t[e]):undefined}_setObjectToTarget(t,e,n){Object.keys(e).forEach((o=>{this._setToTarget(t,o,e[o],n)}))}}function ga(t){return ua(t,pa)}function pa(t){return fa(t)?t:undefined}function ba(t){return!!(t&&t[Symbol.iterator])}class ka{constructor(t={},e={}){const n=ba(t);if(!n){e=t}this._items=[];this._itemMap=new Map;this._idProperty=e.idProperty||"id";this._bindToExternalToInternalMap=new WeakMap;this._bindToInternalToExternalMap=new WeakMap;this._skippedIndexesFromExternal=[];if(n){for(const e of t){this._items.push(e);this._itemMap.set(this._getItemIdBeforeAdding(e),e)}}}get length(){return this._items.length}get first(){return this._items[0]||null}get last(){return this._items[this.length-1]||null}add(t,e){return this.addMany([t],e)}addMany(t,e){if(e===undefined){e=this._items.length}else if(e>this._items.length||e<0){throw new u["a"]("collection-add-item-invalid-index",this)}for(let n=0;n<t.length;n++){const o=t[n];const i=this._getItemIdBeforeAdding(o);const r=e+n;this._items.splice(r,0,o);this._itemMap.set(i,o);this.fire("add",o,r)}this.fire("change",{added:t,removed:[],index:e});return this}get(t){let e;if(typeof t=="string"){e=this._itemMap.get(t)}else if(typeof t=="number"){e=this._items[t]}else{throw new u["a"]("collection-get-invalid-arg",this)}return e||null}has(t){if(typeof t=="string"){return this._itemMap.has(t)}else{const e=this._idProperty;const n=t[e];return this._itemMap.has(n)}}getIndex(t){let e;if(typeof t=="string"){e=this._itemMap.get(t)}else{e=t}return this._items.indexOf(e)}remove(t){const[e,n]=this._remove(t);this.fire("change",{added:[],removed:[e],index:n});return e}map(t,e){return this._items.map(t,e)}find(t,e){return this._items.find(t,e)}filter(t,e){return this._items.filter(t,e)}clear(){if(this._bindToCollection){this.stopListening(this._bindToCollection);this._bindToCollection=null}const t=Array.from(this._items);while(this.length){this._remove(0)}this.fire("change",{added:[],removed:t,index:0})}bindTo(t){if(this._bindToCollection){throw new u["a"]("collection-bind-to-rebind",this)}this._bindToCollection=t;return{as:t=>{this._setUpBindToBinding((e=>new t(e)))},using:t=>{if(typeof t=="function"){this._setUpBindToBinding((e=>t(e)))}else{this._setUpBindToBinding((e=>e[t]))}}}}_setUpBindToBinding(t){const e=this._bindToCollection;const n=(n,o,i)=>{const r=e._bindToCollection==this;const s=e._bindToInternalToExternalMap.get(o);if(r&&s){this._bindToExternalToInternalMap.set(o,s);this._bindToInternalToExternalMap.set(s,o)}else{const n=t(o);if(!n){this._skippedIndexesFromExternal.push(i);return}let r=i;for(const t of this._skippedIndexesFromExternal){if(i>t){r--}}for(const t of e._skippedIndexesFromExternal){if(r>=t){r++}}this._bindToExternalToInternalMap.set(o,n);this._bindToInternalToExternalMap.set(n,o);this.add(n,r);for(let t=0;t<e._skippedIndexesFromExternal.length;t++){if(r<=e._skippedIndexesFromExternal[t]){e._skippedIndexesFromExternal[t]++}}}};for(const t of e){n(null,t,e.getIndex(t))}this.listenTo(e,"add",n);this.listenTo(e,"remove",((t,e,n)=>{const o=this._bindToExternalToInternalMap.get(e);if(o){this.remove(o)}this._skippedIndexesFromExternal=this._skippedIndexesFromExternal.reduce(((t,e)=>{if(n<e){t.push(e-1)}if(n>e){t.push(e)}return t}),[])}))}_getItemIdBeforeAdding(t){const e=this._idProperty;let n;if(e in t){n=t[e];if(typeof n!="string"){throw new u["a"]("collection-add-invalid-id",this)}if(this.get(n)){throw new u["a"]("collection-add-item-already-exists",this)}}else{t[e]=n=a()}return n}_remove(t){let e,n,o;let i=false;const r=this._idProperty;if(typeof t=="string"){n=t;o=this._itemMap.get(n);i=!o;if(o){e=this._items.indexOf(o)}}else if(typeof t=="number"){e=t;o=this._items[e];i=!o;if(o){n=o[r]}}else{o=t;n=o[r];e=this._items.indexOf(o);i=e==-1||!this._itemMap.get(n)}if(i){throw new u["a"]("collection-remove-404",this)}this._items.splice(e,1);this._itemMap.delete(n);const s=this._bindToInternalToExternalMap.get(o);this._bindToInternalToExternalMap.delete(o);this._bindToExternalToInternalMap.delete(s);this.fire("remove",o,e);return[o,e]}[Symbol.iterator](){return this._items[Symbol.iterator]()}}Hn(ka,g);class wa{constructor(t,e=[],n=[]){this._context=t;this._plugins=new Map;this._availablePlugins=new Map;for(const t of e){if(t.pluginName){this._availablePlugins.set(t.pluginName,t)}}this._contextPlugins=new Map;for(const[t,e]of n){this._contextPlugins.set(t,e);this._contextPlugins.set(e,t);if(t.pluginName){this._availablePlugins.set(t.pluginName,t)}}}*[Symbol.iterator](){for(const t of this._plugins){if(typeof t[0]=="function"){yield t}}}get(t){const e=this._plugins.get(t);if(!e){let e=t;if(typeof t=="function"){e=t.pluginName||t.name}throw new u["a"]("plugincollection-plugin-not-loaded",this._context,{plugin:e})}return e}has(t){return this._plugins.has(t)}init(t,e=[],n=[]){const o=this;const i=this._context;f(t);g(t);const r=t.filter((t=>!d(t,e)));const s=[...m(r)];A(s,n);const a=w(s);return C(a,"init").then((()=>C(a,"afterInit"))).then((()=>a));function c(t){return typeof t==="function"}function l(t){return c(t)&&t.isContextPlugin}function d(t,e){return e.some((e=>{if(e===t){return true}if(h(t)===e){return true}if(h(e)===t){return true}return false}))}function h(t){return c(t)?t.pluginName||t.name:t}function f(t,e=new Set){t.forEach((t=>{if(!c(t)){return}if(e.has(t)){return}e.add(t);if(t.pluginName&&!o._availablePlugins.has(t.pluginName)){o._availablePlugins.set(t.pluginName,t)}if(t.requires){f(t.requires,e)}}))}function m(t,e=new Set){return t.map((t=>c(t)?t:o._availablePlugins.get(t))).reduce(((t,n)=>{if(e.has(n)){return t}e.add(n);if(n.requires){g(n.requires,n);m(n.requires,e).forEach((e=>t.add(e)))}return t.add(n)}),new Set)}function g(t,e=null){t.map((t=>c(t)?t:o._availablePlugins.get(t)||t)).forEach((t=>{p(t,e);b(t,e);k(t,e)}))}function p(t,e){if(c(t)){return}if(e){throw new u["a"]("plugincollection-soft-required",i,{missingPlugin:t,requiredBy:h(e)})}throw new u["a"]("plugincollection-plugin-not-found",i,{plugin:t})}function b(t,e){if(!l(e)){return}if(l(t)){return}throw new u["a"]("plugincollection-context-required",i,{plugin:h(t),requiredBy:h(e)})}function k(t,n){if(!n){return}if(!d(t,e)){return}throw new u["a"]("plugincollection-required",i,{plugin:h(t),requiredBy:h(n)})}function w(t){return t.map((t=>{const e=o._contextPlugins.get(t)||new t(i);o._add(t,e);return e}))}function C(t,e){return t.reduce(((t,n)=>{if(!n[e]){return t}if(o._contextPlugins.has(n)){return t}return t.then(n[e].bind(n))}),Promise.resolve())}function A(t,e){for(const n of e){if(typeof n!="function"){throw new u["a"]("plugincollection-replace-plugin-invalid-type",null,{pluginItem:n})}const e=n.pluginName;if(!e){throw new u["a"]("plugincollection-replace-plugin-missing-name",null,{pluginItem:n})}if(n.requires&&n.requires.length){throw new u["a"]("plugincollection-plugin-for-replacing-cannot-have-dependencies",null,{pluginName:e})}const i=o._availablePlugins.get(e);if(!i){throw new u["a"]("plugincollection-plugin-for-replacing-not-exist",null,{pluginName:e})}const r=t.indexOf(i);if(r===-1){if(o._contextPlugins.has(i)){return}throw new u["a"]("plugincollection-plugin-for-replacing-not-loaded",null,{pluginName:e})}if(i.requires&&i.requires.length){throw new u["a"]("plugincollection-replaced-plugin-cannot-have-dependencies",null,{pluginName:e})}t.splice(r,1,n);o._availablePlugins.set(e,n)}}}destroy(){const t=[];for(const[,e]of this){if(typeof e.destroy=="function"&&!this._contextPlugins.has(e)){t.push(e.destroy())}}return Promise.all(t)}_add(t,e){this._plugins.set(t,e);const n=t.pluginName;if(!n){return}if(this._plugins.has(n)){throw new u["a"]("plugincollection-plugin-name-conflict",null,{pluginName:n,plugin1:this._plugins.get(n).constructor,plugin2:t})}this._plugins.set(n,e)}}Hn(wa,g);function Ca(t){return Array.isArray(t)?t:[t]}if(!window.CKEDITOR_TRANSLATIONS){window.CKEDITOR_TRANSLATIONS={}}function Aa(t,e,n){if(!window.CKEDITOR_TRANSLATIONS[t]){window.CKEDITOR_TRANSLATIONS[t]={}}const o=window.CKEDITOR_TRANSLATIONS[t];o.dictionary=o.dictionary||{};o.getPluralForm=n||o.getPluralForm;Object.assign(o.dictionary,e)}function _a(t,e,n=1){if(typeof n!=="number"){throw new u["a"]("translation-service-quantity-not-a-number",null,{quantity:n})}const o=xa();if(o===1){t=Object.keys(window.CKEDITOR_TRANSLATIONS)[0]}const i=e.id||e.string;if(o===0||!ya(t,i)){if(n!==1){return e.plural}return e.string}const r=window.CKEDITOR_TRANSLATIONS[t].dictionary;const s=window.CKEDITOR_TRANSLATIONS[t].getPluralForm||(t=>t===1?0:1);if(typeof r[i]==="string"){return r[i]}const a=Number(s(n));return r[i][a]}function va(){window.CKEDITOR_TRANSLATIONS={}}function ya(t,e){return!!window.CKEDITOR_TRANSLATIONS[t]&&!!window.CKEDITOR_TRANSLATIONS[t].dictionary[e]}function xa(){return Object.keys(window.CKEDITOR_TRANSLATIONS).length}const Ea=["ar","ara","fa","per","fas","he","heb","ku","kur","ug","uig"];function Da(t){return Ea.includes(t)?"rtl":"ltr"}class Sa{constructor(t={}){this.uiLanguage=t.uiLanguage||"en";this.contentLanguage=t.contentLanguage||this.uiLanguage;this.uiLanguageDirection=Da(this.uiLanguage);this.contentLanguageDirection=Da(this.contentLanguage);this.t=(t,e)=>this._t(t,e)}get language(){console.warn("locale-deprecated-language-property: "+"The Locale#language property has been deprecated and will be removed in the near future. "+"Please use #uiLanguage and #contentLanguage properties instead.");return this.uiLanguage}_t(t,e=[]){e=Ca(e);if(typeof t==="string"){t={string:t}}const n=!!t.plural;const o=n?e[0]:1;const i=_a(this.uiLanguage,t,o);return Ba(i,e)}}function Ba(t,e){return t.replace(/%(\d+)/g,((t,n)=>n<e.length?e[n]:t))}class Ta{constructor(t){this.config=new ma(t,this.constructor.defaultConfig);const e=this.constructor.builtinPlugins;this.config.define("plugins",e);this.plugins=new wa(this,e);const n=this.config.get("language")||{};this.locale=new Sa({uiLanguage:typeof n==="string"?n:n.ui,contentLanguage:this.config.get("language.content")});this.t=this.locale.t;this.editors=new ka;this._contextOwner=null}initPlugins(){const t=this.config.get("plugins")||[];const e=this.config.get("substitutePlugins")||[];for(const n of t.concat(e)){if(typeof n!="function"){throw new u["a"]("context-initplugins-constructor-only",null,{Plugin:n})}if(n.isContextPlugin!==true){throw new u["a"]("context-initplugins-invalid-plugin",null,{Plugin:n})}}return this.plugins.init(t,[],e)}destroy(){return Promise.all(Array.from(this.editors,(t=>t.destroy()))).then((()=>this.plugins.destroy()))}_addEditor(t,e){if(this._contextOwner){throw new u["a"]("context-addeditor-private-context")}this.editors.add(t);if(e){this._contextOwner=t}}_removeEditor(t){if(this.editors.has(t)){this.editors.remove(t)}if(this._contextOwner===t){return this.destroy()}return Promise.resolve()}_getEditorConfig(){const t={};for(const e of this.config.names()){if(!["plugins","removePlugins","extraPlugins"].includes(e)){t[e]=this.config.get(e)}}return t}static create(t){return new Promise((e=>{const n=new this(t);e(n.initPlugins().then((()=>n)))}))}}class Pa{constructor(t){this.context=t}destroy(){this.stopListening()}static get isContextPlugin(){return true}}Hn(Pa,Tn);function Ia(t,e){const n=Math.min(t.length,e.length);for(let o=0;o<n;o++){if(t[o]!=e[o]){return o}}if(t.length==e.length){return"same"}else if(t.length<e.length){return"prefix"}else{return"extension"}}var Ra=4;function Fa(t){return aa(t,Ra)}var za=Fa;class Oa{constructor(t){this.document=t;this.parent=null}get index(){let t;if(!this.parent){return null}if((t=this.parent.getChildIndex(this))==-1){throw new u["a"]("view-node-not-found-in-parent",this)}return t}get nextSibling(){const t=this.index;return t!==null&&this.parent.getChild(t+1)||null}get previousSibling(){const t=this.index;return t!==null&&this.parent.getChild(t-1)||null}get root(){let t=this;while(t.parent){t=t.parent}return t}isAttached(){return this.root.is("rootElement")}getPath(){const t=[];let e=this;while(e.parent){t.unshift(e.index);e=e.parent}return t}getAncestors(t={includeSelf:false,parentFirst:false}){const e=[];let n=t.includeSelf?this:this.parent;while(n){e[t.parentFirst?"push":"unshift"](n);n=n.parent}return e}getCommonAncestor(t,e={}){const n=this.getAncestors(e);const o=t.getAncestors(e);let i=0;while(n[i]==o[i]&&n[i]){i++}return i===0?null:n[i-1]}isBefore(t){if(this==t){return false}if(this.root!==t.root){return false}const e=this.getPath();const n=t.getPath();const o=Ia(e,n);switch(o){case"prefix":return true;case"extension":return false;default:return e[o]<n[o]}}isAfter(t){if(this==t){return false}if(this.root!==t.root){return false}return!this.isBefore(t)}_remove(){this.parent._removeChildren(this.index)}_fireChange(t,e){this.fire("change:"+t,e);if(this.parent){this.parent._fireChange(t,e)}}toJSON(){const t=za(this);delete t.parent;return t}is(t){return t==="node"||t==="view:node"}}Hn(Oa,g);class Na extends Oa{constructor(t,e){super(t);this._textData=e}is(t){return t==="$text"||t==="view:$text"||t==="text"||t==="view:text"||t==="node"||t==="view:node"}get data(){return this._textData}get _data(){return this.data}set _data(t){this._fireChange("text",this);this._textData=t}isSimilar(t){if(!(t instanceof Na)){return false}return this===t||this.data===t.data}_clone(){return new Na(this.document,this.data)}}class Ma{constructor(t,e,n){this.textNode=t;if(e<0||e>t.data.length){throw new u["a"]("view-textproxy-wrong-offsetintext",this)}if(n<0||e+n>t.data.length){throw new u["a"]("view-textproxy-wrong-length",this)}this.data=t.data.substring(e,e+n);this.offsetInText=e}get offsetSize(){return this.data.length}get isPartial(){return this.data.length!==this.textNode.data.length}get parent(){return this.textNode.parent}get root(){return this.textNode.root}get document(){return this.textNode.document}is(t){return t==="$textProxy"||t==="view:$textProxy"||t==="textProxy"||t==="view:textProxy"}getAncestors(t={includeSelf:false,parentFirst:false}){const e=[];let n=t.includeSelf?this.textNode:this.parent;while(n!==null){e[t.parentFirst?"push":"unshift"](n);n=n.parent}return e}}function Va(t){const e=new Map;for(const n in t){e.set(n,t[n])}return e}function La(t){if(ba(t)){return new Map(t)}else{return Va(t)}}class Ha{constructor(...t){this._patterns=[];this.add(...t)}add(...t){for(let e of t){if(typeof e=="string"||e instanceof RegExp){e={name:e}}if(e.classes&&(typeof e.classes=="string"||e.classes instanceof RegExp)){e.classes=[e.classes]}this._patterns.push(e)}}match(...t){for(const e of t){for(const t of this._patterns){const n=Ka(e,t);if(n){return{element:e,pattern:t,match:n}}}}return null}matchAll(...t){const e=[];for(const n of t){for(const t of this._patterns){const o=Ka(n,t);if(o){e.push({element:n,pattern:t,match:o})}}}return e.length>0?e:null}getElementName(){if(this._patterns.length!==1){return null}const t=this._patterns[0];const e=t.name;return typeof t!="function"&&e&&!(e instanceof RegExp)?e:null}}function Ka(t,e){if(typeof e=="function"){return e(t)}const n={};if(e.name){n.name=qa(e.name,t.name);if(!n.name){return null}}if(e.attributes){n.attributes=ja(e.attributes,t);if(!n.attributes){return null}}if(e.classes){n.classes=Wa(e.classes,t);if(!n.classes){return false}}if(e.styles){n.styles=Ga(e.styles,t);if(!n.styles){return false}}return n}function qa(t,e){if(t instanceof RegExp){return t.test(e)}return t===e}function ja(t,e){const n=[];for(const o in t){const i=t[o];if(e.hasAttribute(o)){const t=e.getAttribute(o);if(i===true){n.push(o)}else if(i instanceof RegExp){if(i.test(t)){n.push(o)}else{return null}}else if(t===i){n.push(o)}else{return null}}else{return null}}return n}function Wa(t,e){const n=[];for(const o of t){if(o instanceof RegExp){const t=e.getClassNames();for(const e of t){if(o.test(e)){n.push(e)}}if(n.length===0){return null}}else if(e.hasClass(o)){n.push(o)}else{return null}}return n}function Ga(t,e){const n=[];for(const o in t){const i=t[o];if(e.hasStyle(o)){const t=e.getStyle(o);if(i instanceof RegExp){if(i.test(t)){n.push(o)}else{return null}}else if(t===i){n.push(o)}else{return null}}else{return null}}return n}var Ua="[object Symbol]";function $a(t){return typeof t=="symbol"||ge(t)&&G(t)==Ua}var Ja=$a;var Ya=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Qa=/^\w*$/;function Xa(t,e){if(xe(t)){return false}var n=typeof t;if(n=="number"||n=="symbol"||n=="boolean"||t==null||Ja(t)){return true}return Qa.test(t)||!Ya.test(t)||e!=null&&t in Object(e)}var Za=Xa;var tc="Expected a function";function ec(t,e){if(typeof t!="function"||e!=null&&typeof e!="function"){throw new TypeError(tc)}var n=function(){var o=arguments,i=e?e.apply(this,o):o[0],r=n.cache;if(r.has(i)){return r.get(i)}var s=t.apply(this,o);n.cache=r.set(i,s)||r;return s};n.cache=new(ec.Cache||fi);return n}ec.Cache=fi;var nc=ec;var oc=500;function ic(t){var e=nc(t,(function(t){if(n.size===oc){n.clear()}return t}));var n=e.cache;return e}var rc=ic;var sc=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;var ac=/\\(\\)?/g;var cc=rc((function(t){var e=[];if(t.charCodeAt(0)===46){e.push("")}t.replace(sc,(function(t,n,o,i){e.push(o?i.replace(ac,"$1"):n||t)}));return e}));var lc=cc;function dc(t,e){var n=-1,o=t==null?0:t.length,i=Array(o);while(++n<o){i[n]=e(t[n],n,t)}return i}var uc=dc;var hc=1/0;var fc=P?P.prototype:undefined,mc=fc?fc.toString:undefined;function gc(t){if(typeof t=="string"){return t}if(xe(t)){return uc(t,gc)+""}if(Ja(t)){return mc?mc.call(t):""}var e=t+"";return e=="0"&&1/t==-hc?"-0":e}var pc=gc;function bc(t){return t==null?"":pc(t)}var kc=bc;function wc(t,e){if(xe(t)){return t}return Za(t,e)?[t]:lc(kc(t))}var Cc=wc;function Ac(t){var e=t==null?0:t.length;return e?t[e-1]:undefined}var _c=Ac;var vc=1/0;function yc(t){if(typeof t=="string"||Ja(t)){return t}var e=t+"";return e=="0"&&1/t==-vc?"-0":e}var xc=yc;function Ec(t,e){e=Cc(e,t);var n=0,o=e.length;while(t!=null&&n<o){t=t[xc(e[n++])]}return n&&n==o?t:undefined}var Dc=Ec;function Sc(t,e,n){var o=-1,i=t.length;if(e<0){e=-e>i?0:i+e}n=n>i?i:n;if(n<0){n+=i}i=e>n?0:n-e>>>0;e>>>=0;var r=Array(i);while(++o<i){r[o]=t[o+e]}return r}var Bc=Sc;function Tc(t,e){return e.length<2?t:Dc(t,Bc(e,0,-1))}var Pc=Tc;function Ic(t,e){e=Cc(e,t);t=Pc(t,e);return t==null||delete t[xc(_c(e))]}var Rc=Ic;function Fc(t,e){return t==null?true:Rc(t,e)}var zc=Fc;function Oc(t,e,n){var o=t==null?undefined:Dc(t,e);return o===undefined?n:o}var Nc=Oc;function Mc(t,e,n){if(n!==undefined&&!Et(t[e],n)||n===undefined&&!(e in t)){yt(t,e,n)}}var Vc=Mc;function Lc(t){return function(e,n,o){var i=-1,r=Object(e),s=o(e),a=s.length;while(a--){var c=s[t?a:++i];if(n(r[c],c,r)===false){break}}return e}}var Hc=Lc;var Kc=Hc();var qc=Kc;function jc(t){return ge(t)&&oe(t)}var Wc=jc;function Gc(t,e){if(e==="constructor"&&typeof t[e]==="function"){return}if(e=="__proto__"){return}return t[e]}var Uc=Gc;function $c(t){return It(t,An(t))}var Jc=$c;function Yc(t,e,n,o,i,r,s){var a=Uc(t,n),c=Uc(e,n),l=s.get(c);if(l){Vc(t,n,l);return}var d=r?r(a,c,n+"",t,e,s):undefined;var u=d===undefined;if(u){var h=xe(c),f=!h&&Object(Ee["a"])(c),m=!h&&!f&&sn(c);d=c;if(h||f||m){if(xe(a)){d=a}else if(Wc(a)){d=zi(a)}else if(f){u=false;d=Object(Ri["a"])(c,true)}else if(m){u=false;d=Wr(c,true)}else{d=[]}}else if(io(c)||ve(c)){d=a;if(ve(a)){d=Jc(a)}else if(!S(a)||X(a)){d=bs(c)}}else{u=false}}if(u){s.set(c,d);i(d,c,o,r,s);s["delete"](c)}Vc(t,n,d)}var Qc=Yc;function Xc(t,e,n,o,i){if(t===e){return}qc(e,(function(r,s){i||(i=new ki);if(S(r)){Qc(t,e,s,n,Xc,o,i)}else{var a=o?o(Uc(t,s),r,s+"",t,e,i):undefined;if(a===undefined){a=r}Vc(t,s,a)}}),An)}var Zc=Xc;var tl=ue((function(t,e,n){Zc(t,e,n)}));var el=tl;function nl(t,e,n,o){if(!S(t)){return t}e=Cc(e,t);var i=-1,r=e.length,s=r-1,a=t;while(a!=null&&++i<r){var c=xc(e[i]),l=n;if(c==="__proto__"||c==="constructor"||c==="prototype"){return t}if(i!=s){var d=a[c];l=o?o(d,c,a):undefined;if(l===undefined){l=S(d)?d:ae(e[i+1])?[]:{}}}Tt(a,c,l);a=a[c]}return t}var ol=nl;function il(t,e,n){return t==null?t:ol(t,e,n)}var rl=il;class sl{constructor(t){this._styles={};this._styleProcessor=t}get isEmpty(){const t=Object.entries(this._styles);const e=Array.from(t);return!e.length}get size(){if(this.isEmpty){return 0}return this.getStyleNames().length}setTo(t){this.clear();const e=Array.from(cl(t).entries());for(const[t,n]of e){this._styleProcessor.toNormalizedForm(t,n,this._styles)}}has(t){if(this.isEmpty){return false}const e=this._styleProcessor.getReducedForm(t,this._styles);const n=e.find((([e])=>e===t));return Array.isArray(n)}set(t,e){if(S(t)){for(const[e,n]of Object.entries(t)){this._styleProcessor.toNormalizedForm(e,n,this._styles)}}else{this._styleProcessor.toNormalizedForm(t,e,this._styles)}}remove(t){const e=ll(t);zc(this._styles,e);delete this._styles[t];this._cleanEmptyObjectsOnPath(e)}getNormalized(t){return this._styleProcessor.getNormalized(t,this._styles)}toString(){if(this.isEmpty){return""}return this._getStylesEntries().map((t=>t.join(":"))).sort().join(";")+";"}getAsString(t){if(this.isEmpty){return}if(this._styles[t]&&!S(this._styles[t])){return this._styles[t]}const e=this._styleProcessor.getReducedForm(t,this._styles);const n=e.find((([e])=>e===t));if(Array.isArray(n)){return n[1]}}getStyleNames(){if(this.isEmpty){return[]}const t=this._getStylesEntries();return t.map((([t])=>t))}clear(){this._styles={}}_getStylesEntries(){const t=[];const e=Object.keys(this._styles);for(const n of e){t.push(...this._styleProcessor.getReducedForm(n,this._styles))}return t}_cleanEmptyObjectsOnPath(t){const e=t.split(".");const n=e.length>1;if(!n){return}const o=e.splice(0,e.length-1).join(".");const i=Nc(this._styles,o);if(!i){return}const r=!Array.from(Object.keys(i)).length;if(r){this.remove(o)}}}class al{constructor(){this._normalizers=new Map;this._extractors=new Map;this._reducers=new Map;this._consumables=new Map}toNormalizedForm(t,e,n){if(S(e)){dl(n,ll(t),e);return}if(this._normalizers.has(t)){const o=this._normalizers.get(t);const{path:i,value:r}=o(e);dl(n,i,r)}else{dl(n,t,e)}}getNormalized(t,e){if(!t){return el({},e)}if(e[t]!==undefined){return e[t]}if(this._extractors.has(t)){const n=this._extractors.get(t);if(typeof n==="string"){return Nc(e,n)}const o=n(t,e);if(o){return o}}return Nc(e,ll(t))}getReducedForm(t,e){const n=this.getNormalized(t,e);if(n===undefined){return[]}if(this._reducers.has(t)){const e=this._reducers.get(t);return e(n)}return[[t,n]]}getRelatedStyles(t){return this._consumables.get(t)||[]}setNormalizer(t,e){this._normalizers.set(t,e)}setExtractor(t,e){this._extractors.set(t,e)}setReducer(t,e){this._reducers.set(t,e)}setStyleRelation(t,e){this._mapStyleNames(t,e);for(const n of e){this._mapStyleNames(n,[t])}}_mapStyleNames(t,e){if(!this._consumables.has(t)){this._consumables.set(t,[])}this._consumables.get(t).push(...e)}}function cl(t){let e=null;let n=0;let o=0;let i=null;const r=new Map;if(t===""){return r}if(t.charAt(t.length-1)!=";"){t=t+";"}for(let s=0;s<t.length;s++){const a=t.charAt(s);if(e===null){switch(a){case":":if(!i){i=t.substr(n,s-n);o=s+1}break;case'"':case"'":e=a;break;case";":{const e=t.substr(o,s-o);if(i){r.set(i.trim(),e.trim())}i=null;n=s+1;break}}}else if(a===e){e=null}}return r}function ll(t){return t.replace("-",".")}function dl(t,e,n){let o=n;if(S(n)){o=el({},Nc(t,e),n)}rl(t,e,o)}class ul extends Oa{constructor(t,e,n,o){super(t);this.name=e;this._attrs=hl(n);this._children=[];if(o){this._insertChild(0,o)}this._classes=new Set;if(this._attrs.has("class")){const t=this._attrs.get("class");fl(this._classes,t);this._attrs.delete("class")}this._styles=new sl(this.document.stylesProcessor);if(this._attrs.has("style")){this._styles.setTo(this._attrs.get("style"));this._attrs.delete("style")}this._customProperties=new Map;this._isAllowedInsideAttributeElement=false}get childCount(){return this._children.length}get isEmpty(){return this._children.length===0}get isAllowedInsideAttributeElement(){return this._isAllowedInsideAttributeElement}is(t,e=null){if(!e){return t==="element"||t==="view:element"||t==="node"||t==="view:node"}else{return e===this.name&&(t==="element"||t==="view:element")}}getChild(t){return this._children[t]}getChildIndex(t){return this._children.indexOf(t)}getChildren(){return this._children[Symbol.iterator]()}*getAttributeKeys(){if(this._classes.size>0){yield"class"}if(!this._styles.isEmpty){yield"style"}yield*this._attrs.keys()}*getAttributes(){yield*this._attrs.entries();if(this._classes.size>0){yield["class",this.getAttribute("class")]}if(!this._styles.isEmpty){yield["style",this.getAttribute("style")]}}getAttribute(t){if(t=="class"){if(this._classes.size>0){return[...this._classes].join(" ")}return undefined}if(t=="style"){const t=this._styles.toString();return t==""?undefined:t}return this._attrs.get(t)}hasAttribute(t){if(t=="class"){return this._classes.size>0}if(t=="style"){return!this._styles.isEmpty}return this._attrs.has(t)}isSimilar(t){if(!(t instanceof ul)){return false}if(this===t){return true}if(this.name!=t.name){return false}if(this.isAllowedInsideAttributeElement!=t.isAllowedInsideAttributeElement){return false}if(this._attrs.size!==t._attrs.size||this._classes.size!==t._classes.size||this._styles.size!==t._styles.size){return false}for(const[e,n]of this._attrs){if(!t._attrs.has(e)||t._attrs.get(e)!==n){return false}}for(const e of this._classes){if(!t._classes.has(e)){return false}}for(const e of this._styles.getStyleNames()){if(!t._styles.has(e)||t._styles.getAsString(e)!==this._styles.getAsString(e)){return false}}return true}hasClass(...t){for(const e of t){if(!this._classes.has(e)){return false}}return true}getClassNames(){return this._classes.keys()}getStyle(t){return this._styles.getAsString(t)}getNormalizedStyle(t){return this._styles.getNormalized(t)}getStyleNames(){return this._styles.getStyleNames()}hasStyle(...t){for(const e of t){if(!this._styles.has(e)){return false}}return true}findAncestor(...t){const e=new Ha(...t);let n=this.parent;while(n){if(e.match(n)){return n}n=n.parent}return null}getCustomProperty(t){return this._customProperties.get(t)}*getCustomProperties(){yield*this._customProperties.entries()}getIdentity(){const t=Array.from(this._classes).sort().join(",");const e=this._styles.toString();const n=Array.from(this._attrs).map((t=>`${t[0]}="${t[1]}"`)).sort().join(" ");return this.name+(t==""?"":` class="${t}"`)+(!e?"":` style="${e}"`)+(n==""?"":` ${n}`)}_clone(t=false){const e=[];if(t){for(const n of this.getChildren()){e.push(n._clone(t))}}const n=new this.constructor(this.document,this.name,this._attrs,e);n._classes=new Set(this._classes);n._styles.set(this._styles.getNormalized());n._customProperties=new Map(this._customProperties);n.getFillerOffset=this.getFillerOffset;n._isAllowedInsideAttributeElement=this.isAllowedInsideAttributeElement;return n}_appendChild(t){return this._insertChild(this.childCount,t)}_insertChild(t,e){this._fireChange("children",this);let n=0;const o=ml(this.document,e);for(const e of o){if(e.parent!==null){e._remove()}e.parent=this;e.document=this.document;this._children.splice(t,0,e);t++;n++}return n}_removeChildren(t,e=1){this._fireChange("children",this);for(let n=t;n<t+e;n++){this._children[n].parent=null}return this._children.splice(t,e)}_setAttribute(t,e){e=String(e);this._fireChange("attributes",this);if(t=="class"){fl(this._classes,e)}else if(t=="style"){this._styles.setTo(e)}else{this._attrs.set(t,e)}}_removeAttribute(t){this._fireChange("attributes",this);if(t=="class"){if(this._classes.size>0){this._classes.clear();return true}return false}if(t=="style"){if(!this._styles.isEmpty){this._styles.clear();return true}return false}return this._attrs.delete(t)}_addClass(t){this._fireChange("attributes",this);for(const e of Ca(t)){this._classes.add(e)}}_removeClass(t){this._fireChange("attributes",this);for(const e of Ca(t)){this._classes.delete(e)}}_setStyle(t,e){this._fireChange("attributes",this);this._styles.set(t,e)}_removeStyle(t){this._fireChange("attributes",this);for(const e of Ca(t)){this._styles.remove(e)}}_setCustomProperty(t,e){this._customProperties.set(t,e)}_removeCustomProperty(t){return this._customProperties.delete(t)}}function hl(t){t=La(t);for(const[e,n]of t){if(n===null){t.delete(e)}else if(typeof n!="string"){t.set(e,String(n))}}return t}function fl(t,e){const n=e.split(/\s+/);t.clear();n.forEach((e=>t.add(e)))}function ml(t,e){if(typeof e=="string"){return[new Na(t,e)]}if(!ba(e)){e=[e]}return Array.from(e).map((e=>{if(typeof e=="string"){return new Na(t,e)}if(e instanceof Ma){return new Na(t,e.data)}return e}))}class gl extends ul{constructor(t,e,n,o){super(t,e,n,o);this.getFillerOffset=pl}is(t,e=null){if(!e){return t==="containerElement"||t==="view:containerElement"||t==="element"||t==="view:element"||t==="node"||t==="view:node"}else{return e===this.name&&(t==="containerElement"||t==="view:containerElement"||t==="element"||t==="view:element")}}}function pl(){const t=[...this.getChildren()];const e=t[this.childCount-1];if(e&&e.is("element","br")){return this.childCount}for(const e of t){if(!e.is("uiElement")){return null}}return this.childCount}class bl extends gl{constructor(t,e,n,o){super(t,e,n,o);this.set("isReadOnly",false);this.set("isFocused",false);this.bind("isReadOnly").to(t);this.bind("isFocused").to(t,"isFocused",(e=>e&&t.selection.editableElement==this));this.listenTo(t.selection,"change",(()=>{this.isFocused=t.isFocused&&t.selection.editableElement==this}))}is(t,e=null){if(!e){return t==="editableElement"||t==="view:editableElement"||t==="containerElement"||t==="view:containerElement"||t==="element"||t==="view:element"||t==="node"||t==="view:node"}else{return e===this.name&&(t==="editableElement"||t==="view:editableElement"||t==="containerElement"||t==="view:containerElement"||t==="element"||t==="view:element")}}destroy(){this.stopListening()}}Hn(bl,Tn);const kl=Symbol("rootName");class wl extends bl{constructor(t,e){super(t,e);this.rootName="main"}is(t,e=null){if(!e){return t==="rootElement"||t==="view:rootElement"||t==="editableElement"||t==="view:editableElement"||t==="containerElement"||t==="view:containerElement"||t==="element"||t==="view:element"||t==="node"||t==="view:node"}else{return e===this.name&&(t==="rootElement"||t==="view:rootElement"||t==="editableElement"||t==="view:editableElement"||t==="containerElement"||t==="view:containerElement"||t==="element"||t==="view:element")}}get rootName(){return this.getCustomProperty(kl)}set rootName(t){this._setCustomProperty(kl,t)}set _name(t){this.name=t}}class Cl{constructor(t={}){if(!t.boundaries&&!t.startPosition){throw new u["a"]("view-tree-walker-no-start-position",null)}if(t.direction&&t.direction!="forward"&&t.direction!="backward"){throw new u["a"]("view-tree-walker-unknown-direction",t.startPosition,{direction:t.direction})}this.boundaries=t.boundaries||null;if(t.startPosition){this.position=Al._createAt(t.startPosition)}else{this.position=Al._createAt(t.boundaries[t.direction=="backward"?"end":"start"])}this.direction=t.direction||"forward";this.singleCharacters=!!t.singleCharacters;this.shallow=!!t.shallow;this.ignoreElementEnd=!!t.ignoreElementEnd;this._boundaryStartParent=this.boundaries?this.boundaries.start.parent:null;this._boundaryEndParent=this.boundaries?this.boundaries.end.parent:null}[Symbol.iterator](){return this}skip(t){let e,n,o;do{o=this.position;({done:e,value:n}=this.next())}while(!e&&t(n));if(!e){this.position=o}}next(){if(this.direction=="forward"){return this._next()}else{return this._previous()}}_next(){let t=this.position.clone();const e=this.position;const n=t.parent;if(n.parent===null&&t.offset===n.childCount){return{done:true}}if(n===this._boundaryEndParent&&t.offset==this.boundaries.end.offset){return{done:true}}let o;if(n instanceof Na){if(t.isAtEnd){this.position=Al._createAfter(n);return this._next()}o=n.data[t.offset]}else{o=n.getChild(t.offset)}if(o instanceof ul){if(!this.shallow){t=new Al(o,0)}else{t.offset++}this.position=t;return this._formatReturnValue("elementStart",o,e,t,1)}else if(o instanceof Na){if(this.singleCharacters){t=new Al(o,0);this.position=t;return this._next()}else{let n=o.data.length;let i;if(o==this._boundaryEndParent){n=this.boundaries.end.offset;i=new Ma(o,0,n);t=Al._createAfter(i)}else{i=new Ma(o,0,o.data.length);t.offset++}this.position=t;return this._formatReturnValue("text",i,e,t,n)}}else if(typeof o=="string"){let o;if(this.singleCharacters){o=1}else{const e=n===this._boundaryEndParent?this.boundaries.end.offset:n.data.length;o=e-t.offset}const i=new Ma(n,t.offset,o);t.offset+=o;this.position=t;return this._formatReturnValue("text",i,e,t,o)}else{t=Al._createAfter(n);this.position=t;if(this.ignoreElementEnd){return this._next()}else{return this._formatReturnValue("elementEnd",n,e,t)}}}_previous(){let t=this.position.clone();const e=this.position;const n=t.parent;if(n.parent===null&&t.offset===0){return{done:true}}if(n==this._boundaryStartParent&&t.offset==this.boundaries.start.offset){return{done:true}}let o;if(n instanceof Na){if(t.isAtStart){this.position=Al._createBefore(n);return this._previous()}o=n.data[t.offset-1]}else{o=n.getChild(t.offset-1)}if(o instanceof ul){if(!this.shallow){t=new Al(o,o.childCount);this.position=t;if(this.ignoreElementEnd){return this._previous()}else{return this._formatReturnValue("elementEnd",o,e,t)}}else{t.offset--;this.position=t;return this._formatReturnValue("elementStart",o,e,t,1)}}else if(o instanceof Na){if(this.singleCharacters){t=new Al(o,o.data.length);this.position=t;return this._previous()}else{let n=o.data.length;let i;if(o==this._boundaryStartParent){const e=this.boundaries.start.offset;i=new Ma(o,e,o.data.length-e);n=i.data.length;t=Al._createBefore(i)}else{i=new Ma(o,0,o.data.length);t.offset--}this.position=t;return this._formatReturnValue("text",i,e,t,n)}}else if(typeof o=="string"){let o;if(!this.singleCharacters){const e=n===this._boundaryStartParent?this.boundaries.start.offset:0;o=t.offset-e}else{o=1}t.offset-=o;const i=new Ma(n,t.offset,o);this.position=t;return this._formatReturnValue("text",i,e,t,o)}else{t=Al._createBefore(n);this.position=t;return this._formatReturnValue("elementStart",n,e,t,1)}}_formatReturnValue(t,e,n,o,i){if(e instanceof Ma){if(e.offsetInText+e.data.length==e.textNode.data.length){if(this.direction=="forward"&&!(this.boundaries&&this.boundaries.end.isEqual(this.position))){o=Al._createAfter(e.textNode);this.position=o}else{n=Al._createAfter(e.textNode)}}if(e.offsetInText===0){if(this.direction=="backward"&&!(this.boundaries&&this.boundaries.start.isEqual(this.position))){o=Al._createBefore(e.textNode);this.position=o}else{n=Al._createBefore(e.textNode)}}}return{done:false,value:{type:t,item:e,previousPosition:n,nextPosition:o,length:i}}}}class Al{constructor(t,e){this.parent=t;this.offset=e}get nodeAfter(){if(this.parent.is("$text")){return null}return this.parent.getChild(this.offset)||null}get nodeBefore(){if(this.parent.is("$text")){return null}return this.parent.getChild(this.offset-1)||null}get isAtStart(){return this.offset===0}get isAtEnd(){const t=this.parent.is("$text")?this.parent.data.length:this.parent.childCount;return this.offset===t}get root(){return this.parent.root}get editableElement(){let t=this.parent;while(!(t instanceof bl)){if(t.parent){t=t.parent}else{return null}}return t}getShiftedBy(t){const e=Al._createAt(this);const n=e.offset+t;e.offset=n<0?0:n;return e}getLastMatchingPosition(t,e={}){e.startPosition=this;const n=new Cl(e);n.skip(t);return n.position}getAncestors(){if(this.parent.is("documentFragment")){return[this.parent]}else{return this.parent.getAncestors({includeSelf:true})}}getCommonAncestor(t){const e=this.getAncestors();const n=t.getAncestors();let o=0;while(e[o]==n[o]&&e[o]){o++}return o===0?null:e[o-1]}is(t){return t==="position"||t==="view:position"}isEqual(t){return this.parent==t.parent&&this.offset==t.offset}isBefore(t){return this.compareWith(t)=="before"}isAfter(t){return this.compareWith(t)=="after"}compareWith(t){if(this.root!==t.root){return"different"}if(this.isEqual(t)){return"same"}const e=this.parent.is("node")?this.parent.getPath():[];const n=t.parent.is("node")?t.parent.getPath():[];e.push(this.offset);n.push(t.offset);const o=Ia(e,n);switch(o){case"prefix":return"before";case"extension":return"after";default:return e[o]<n[o]?"before":"after"}}getWalker(t={}){t.startPosition=this;return new Cl(t)}clone(){return new Al(this.parent,this.offset)}static _createAt(t,e){if(t instanceof Al){return new this(t.parent,t.offset)}else{const n=t;if(e=="end"){e=n.is("$text")?n.data.length:n.childCount}else if(e=="before"){return this._createBefore(n)}else if(e=="after"){return this._createAfter(n)}else if(e!==0&&!e){throw new u["a"]("view-createpositionat-offset-required",n)}return new Al(n,e)}}static _createAfter(t){if(t.is("$textProxy")){return new Al(t.textNode,t.offsetInText+t.data.length)}if(!t.parent){throw new u["a"]("view-position-after-root",t,{root:t})}return new Al(t.parent,t.index+1)}static _createBefore(t){if(t.is("$textProxy")){return new Al(t.textNode,t.offsetInText)}if(!t.parent){throw new u["a"]("view-position-before-root",t,{root:t})}return new Al(t.parent,t.index)}}class _l{constructor(t,e=null){this.start=t.clone();this.end=e?e.clone():t.clone()}*[Symbol.iterator](){yield*new Cl({boundaries:this,ignoreElementEnd:true})}get isCollapsed(){return this.start.isEqual(this.end)}get isFlat(){return this.start.parent===this.end.parent}get root(){return this.start.root}getEnlarged(){let t=this.start.getLastMatchingPosition(vl,{direction:"backward"});let e=this.end.getLastMatchingPosition(vl);if(t.parent.is("$text")&&t.isAtStart){t=Al._createBefore(t.parent)}if(e.parent.is("$text")&&e.isAtEnd){e=Al._createAfter(e.parent)}return new _l(t,e)}getTrimmed(){let t=this.start.getLastMatchingPosition(vl);if(t.isAfter(this.end)||t.isEqual(this.end)){return new _l(t,t)}let e=this.end.getLastMatchingPosition(vl,{direction:"backward"});const n=t.nodeAfter;const o=e.nodeBefore;if(n&&n.is("$text")){t=new Al(n,0)}if(o&&o.is("$text")){e=new Al(o,o.data.length)}return new _l(t,e)}isEqual(t){return this==t||this.start.isEqual(t.start)&&this.end.isEqual(t.end)}containsPosition(t){return t.isAfter(this.start)&&t.isBefore(this.end)}containsRange(t,e=false){if(t.isCollapsed){e=false}const n=this.containsPosition(t.start)||e&&this.start.isEqual(t.start);const o=this.containsPosition(t.end)||e&&this.end.isEqual(t.end);return n&&o}getDifference(t){const e=[];if(this.isIntersecting(t)){if(this.containsPosition(t.start)){e.push(new _l(this.start,t.start))}if(this.containsPosition(t.end)){e.push(new _l(t.end,this.end))}}else{e.push(this.clone())}return e}getIntersection(t){if(this.isIntersecting(t)){let e=this.start;let n=this.end;if(this.containsPosition(t.start)){e=t.start}if(this.containsPosition(t.end)){n=t.end}return new _l(e,n)}return null}getWalker(t={}){t.boundaries=this;return new Cl(t)}getCommonAncestor(){return this.start.getCommonAncestor(this.end)}getContainedElement(){if(this.isCollapsed){return null}let t=this.start.nodeAfter;let e=this.end.nodeBefore;if(this.start.parent.is("$text")&&this.start.isAtEnd&&this.start.parent.nextSibling){t=this.start.parent.nextSibling}if(this.end.parent.is("$text")&&this.end.isAtStart&&this.end.parent.previousSibling){e=this.end.parent.previousSibling}if(t&&t.is("element")&&t===e){return t}return null}clone(){return new _l(this.start,this.end)}*getItems(t={}){t.boundaries=this;t.ignoreElementEnd=true;const e=new Cl(t);for(const t of e){yield t.item}}*getPositions(t={}){t.boundaries=this;const e=new Cl(t);yield e.position;for(const t of e){yield t.nextPosition}}is(t){return t==="range"||t==="view:range"}isIntersecting(t){return this.start.isBefore(t.end)&&this.end.isAfter(t.start)}static _createFromParentsAndOffsets(t,e,n,o){return new this(new Al(t,e),new Al(n,o))}static _createFromPositionAndShift(t,e){const n=t;const o=t.getShiftedBy(e);return e>0?new this(n,o):new this(o,n)}static _createIn(t){return this._createFromParentsAndOffsets(t,0,t,t.childCount)}static _createOn(t){const e=t.is("$textProxy")?t.offsetSize:1;return this._createFromPositionAndShift(Al._createBefore(t),e)}}function vl(t){if(t.item.is("attributeElement")||t.item.is("uiElement")){return true}return false}function yl(t){let e=0;for(const n of t){e++}return e}class xl{constructor(t=null,e,n){this._ranges=[];this._lastRangeBackward=false;this._isFake=false;this._fakeSelectionLabel="";this.setTo(t,e,n)}get isFake(){return this._isFake}get fakeSelectionLabel(){return this._fakeSelectionLabel}get anchor(){if(!this._ranges.length){return null}const t=this._ranges[this._ranges.length-1];const e=this._lastRangeBackward?t.end:t.start;return e.clone()}get focus(){if(!this._ranges.length){return null}const t=this._ranges[this._ranges.length-1];const e=this._lastRangeBackward?t.start:t.end;return e.clone()}get isCollapsed(){return this.rangeCount===1&&this._ranges[0].isCollapsed}get rangeCount(){return this._ranges.length}get isBackward(){return!this.isCollapsed&&this._lastRangeBackward}get editableElement(){if(this.anchor){return this.anchor.editableElement}return null}*getRanges(){for(const t of this._ranges){yield t.clone()}}getFirstRange(){let t=null;for(const e of this._ranges){if(!t||e.start.isBefore(t.start)){t=e}}return t?t.clone():null}getLastRange(){let t=null;for(const e of this._ranges){if(!t||e.end.isAfter(t.end)){t=e}}return t?t.clone():null}getFirstPosition(){const t=this.getFirstRange();return t?t.start.clone():null}getLastPosition(){const t=this.getLastRange();return t?t.end.clone():null}isEqual(t){if(this.isFake!=t.isFake){return false}if(this.isFake&&this.fakeSelectionLabel!=t.fakeSelectionLabel){return false}if(this.rangeCount!=t.rangeCount){return false}else if(this.rangeCount===0){return true}if(!this.anchor.isEqual(t.anchor)||!this.focus.isEqual(t.focus)){return false}for(const e of this._ranges){let n=false;for(const o of t._ranges){if(e.isEqual(o)){n=true;break}}if(!n){return false}}return true}isSimilar(t){if(this.isBackward!=t.isBackward){return false}const e=yl(this.getRanges());const n=yl(t.getRanges());if(e!=n){return false}if(e==0){return true}for(let e of this.getRanges()){e=e.getTrimmed();let n=false;for(let o of t.getRanges()){o=o.getTrimmed();if(e.start.isEqual(o.start)&&e.end.isEqual(o.end)){n=true;break}}if(!n){return false}}return true}getSelectedElement(){if(this.rangeCount!==1){return null}return this.getFirstRange().getContainedElement()}setTo(t,e,n){if(t===null){this._setRanges([]);this._setFakeOptions(e)}else if(t instanceof xl||t instanceof El){this._setRanges(t.getRanges(),t.isBackward);this._setFakeOptions({fake:t.isFake,label:t.fakeSelectionLabel})}else if(t instanceof _l){this._setRanges([t],e&&e.backward);this._setFakeOptions(e)}else if(t instanceof Al){this._setRanges([new _l(t)]);this._setFakeOptions(e)}else if(t instanceof Oa){const o=!!n&&!!n.backward;let i;if(e===undefined){throw new u["a"]("view-selection-setto-required-second-parameter",this)}else if(e=="in"){i=_l._createIn(t)}else if(e=="on"){i=_l._createOn(t)}else{i=new _l(Al._createAt(t,e))}this._setRanges([i],o);this._setFakeOptions(n)}else if(ba(t)){this._setRanges(t,e&&e.backward);this._setFakeOptions(e)}else{throw new u["a"]("view-selection-setto-not-selectable",this)}this.fire("change")}setFocus(t,e){if(this.anchor===null){throw new u["a"]("view-selection-setfocus-no-ranges",this)}const n=Al._createAt(t,e);if(n.compareWith(this.focus)=="same"){return}const o=this.anchor;this._ranges.pop();if(n.compareWith(o)=="before"){this._addRange(new _l(n,o),true)}else{this._addRange(new _l(o,n))}this.fire("change")}is(t){return t==="selection"||t==="view:selection"}_setRanges(t,e=false){t=Array.from(t);this._ranges=[];for(const e of t){this._addRange(e)}this._lastRangeBackward=!!e}_setFakeOptions(t={}){this._isFake=!!t.fake;this._fakeSelectionLabel=t.fake?t.label||"":""}_addRange(t,e=false){if(!(t instanceof _l)){throw new u["a"]("view-selection-add-range-not-range",this)}this._pushRange(t);this._lastRangeBackward=!!e}_pushRange(t){for(const e of this._ranges){if(t.isIntersecting(e)){throw new u["a"]("view-selection-range-intersects",this,{addedRange:t,intersectingRange:e})}}this._ranges.push(new _l(t.start,t.end))}}Hn(xl,g);class El{constructor(t=null,e,n){this._selection=new xl;this._selection.delegate("change").to(this);this._selection.setTo(t,e,n)}get isFake(){return this._selection.isFake}get fakeSelectionLabel(){return this._selection.fakeSelectionLabel}get anchor(){return this._selection.anchor}get focus(){return this._selection.focus}get isCollapsed(){return this._selection.isCollapsed}get rangeCount(){return this._selection.rangeCount}get isBackward(){return this._selection.isBackward}get editableElement(){return this._selection.editableElement}get _ranges(){return this._selection._ranges}*getRanges(){yield*this._selection.getRanges()}getFirstRange(){return this._selection.getFirstRange()}getLastRange(){return this._selection.getLastRange()}getFirstPosition(){return this._selection.getFirstPosition()}getLastPosition(){return this._selection.getLastPosition()}getSelectedElement(){return this._selection.getSelectedElement()}isEqual(t){return this._selection.isEqual(t)}isSimilar(t){return this._selection.isSimilar(t)}is(t){return t==="selection"||t=="documentSelection"||t=="view:selection"||t=="view:documentSelection"}_setTo(t,e,n){this._selection.setTo(t,e,n)}_setFocus(t,e){this._selection.setFocus(t,e)}}Hn(El,g);class Dl extends r{constructor(t,e,n){super(t,e);this.startRange=n;this._eventPhase="none";this._currentTarget=null}get eventPhase(){return this._eventPhase}get currentTarget(){return this._currentTarget}}const Sl=Symbol("bubbling contexts");const Bl={fire(t,...e){try{const n=t instanceof r?t:new r(this,t);const o=Fl(this);if(!o.size){return}Pl(n,"capturing",this);if(Il(o,"$capture",n,...e)){return n.return}const i=n.startRange||this.selection.getFirstRange();const s=i?i.getContainedElement():null;const a=s?Boolean(Rl(o,s)):false;let c=s||zl(i);Pl(n,"atTarget",c);if(!a){if(Il(o,"$text",n,...e)){return n.return}Pl(n,"bubbling",c)}while(c){if(c.is("rootElement")){if(Il(o,"$root",n,...e)){return n.return}}else if(c.is("element")){if(Il(o,c.name,n,...e)){return n.return}}if(Il(o,c,n,...e)){return n.return}c=c.parent;Pl(n,"bubbling",c)}Pl(n,"bubbling",this);Il(o,"$document",n,...e);return n.return}catch(t){u["a"].rethrowUnexpectedError(t,this)}},_addEventListener(t,e,n){const o=Ca(n.context||"$document");const i=Fl(this);for(const r of o){let o=i.get(r);if(!o){o=Object.create(g);i.set(r,o)}this.listenTo(o,t,e,n)}},_removeEventListener(t,e){const n=Fl(this);for(const o of n.values()){this.stopListening(o,t,e)}}};var Tl=Bl;function Pl(t,e,n){if(t instanceof Dl){t._eventPhase=e;t._currentTarget=n}}function Il(t,e,n,...o){const i=typeof e=="string"?t.get(e):Rl(t,e);if(!i){return false}i.fire(n,...o);return n.stop.called}function Rl(t,e){for(const[n,o]of t){if(typeof n=="function"&&n(e)){return o}}return null}function Fl(t){if(!t[Sl]){t[Sl]=new Map}return t[Sl]}function zl(t){if(!t){return null}const e=t.start.parent;const n=t.end.parent;const o=e.getPath();const i=n.getPath();return o.length>i.length?e:n}class Ol{constructor(t){this.selection=new El;this.roots=new ka({idProperty:"rootName"});this.stylesProcessor=t;this.set("isReadOnly",false);this.set("isFocused",false);this.set("isComposing",false);this._postFixers=new Set}getRoot(t="main"){return this.roots.get(t)}registerPostFixer(t){this._postFixers.add(t)}destroy(){this.roots.map((t=>t.destroy()));this.stopListening()}_callPostFixers(t){let e=false;do{for(const n of this._postFixers){e=n(t);if(e){break}}}while(e)}}Hn(Ol,Tl);Hn(Ol,Tn);const Nl=10;class Ml extends ul{constructor(t,e,n,o){super(t,e,n,o);this.getFillerOffset=Vl;this._priority=Nl;this._id=null;this._clonesGroup=null}get priority(){return this._priority}get id(){return this._id}getElementsWithSameId(){if(this.id===null){throw new u["a"]("attribute-element-get-elements-with-same-id-no-id",this)}return new Set(this._clonesGroup)}is(t,e=null){if(!e){return t==="attributeElement"||t==="view:attributeElement"||t==="element"||t==="view:element"||t==="node"||t==="view:node"}else{return e===this.name&&(t==="attributeElement"||t==="view:attributeElement"||t==="element"||t==="view:element")}}isSimilar(t){if(this.id!==null||t.id!==null){return this.id===t.id}return super.isSimilar(t)&&this.priority==t.priority}_clone(t){const e=super._clone(t);e._priority=this._priority;e._id=this._id;return e}}Ml.DEFAULT_PRIORITY=Nl;function Vl(){if(Ll(this)){return null}let t=this.parent;while(t&&t.is("attributeElement")){if(Ll(t)>1){return null}t=t.parent}if(!t||Ll(t)>1){return null}return this.childCount}function Ll(t){return Array.from(t.getChildren()).filter((t=>!t.is("uiElement"))).length}class Hl extends ul{constructor(t,e,n,o){super(t,e,n,o);this._isAllowedInsideAttributeElement=true;this.getFillerOffset=Kl}is(t,e=null){if(!e){return t==="emptyElement"||t==="view:emptyElement"||t==="element"||t==="view:element"||t==="node"||t==="view:node"}else{return e===this.name&&(t==="emptyElement"||t==="view:emptyElement"||t==="element"||t==="view:element")}}_insertChild(t,e){if(e&&(e instanceof Oa||Array.from(e).length>0)){throw new u["a"]("view-emptyelement-cannot-add",[this,e])}}}function Kl(){return null}const ql=navigator.userAgent.toLowerCase();const jl={isMac:Gl(ql),isGecko:Ul(ql),isSafari:$l(ql),isAndroid:Jl(ql),isBlink:Yl(ql),features:{isRegExpUnicodePropertySupported:Ql()}};var Wl=jl;function Gl(t){return t.indexOf("macintosh")>-1}function Ul(t){return!!t.match(/gecko\/\d+/)}function $l(t){return t.indexOf(" applewebkit/")>-1&&t.indexOf("chrome")===-1}function Jl(t){return t.indexOf("android")>-1}function Yl(t){return t.indexOf("chrome/")>-1&&t.indexOf("edge/")<0}function Ql(){let t=false;try{t="ć".search(new RegExp("[\\p{L}]","u"))===0}catch(t){}return t}const Xl={ctrl:"⌃",cmd:"⌘",alt:"⌥",shift:"⇧"};const Zl={ctrl:"Ctrl+",alt:"Alt+",shift:"Shift+"};const td=ld();const ed=Object.fromEntries(Object.entries(td).map((([t,e])=>[e,t.charAt(0).toUpperCase()+t.slice(1)])));function nd(t){let e;if(typeof t=="string"){e=td[t.toLowerCase()];if(!e){throw new u["a"]("keyboard-unknown-key",null,{key:t})}}else{e=t.keyCode+(t.altKey?td.alt:0)+(t.ctrlKey?td.ctrl:0)+(t.shiftKey?td.shift:0)+(t.metaKey?td.cmd:0)}return e}function od(t){if(typeof t=="string"){t=dd(t)}return t.map((t=>typeof t=="string"?ad(t):t)).reduce(((t,e)=>e+t),0)}function id(t){let e=od(t);const n=Object.entries(Wl.isMac?Xl:Zl);const o=n.reduce(((t,[n,o])=>{if((e&td[n])!=0){e&=~td[n];t+=o}return t}),"");return o+(e?ed[e]:"")}function rd(t){return t==td.arrowright||t==td.arrowleft||t==td.arrowup||t==td.arrowdown}function sd(t,e){const n=e==="ltr";switch(t){case td.arrowleft:return n?"left":"right";case td.arrowright:return n?"right":"left";case td.arrowup:return"up";case td.arrowdown:return"down"}}function ad(t){if(t.endsWith("!")){return nd(t.slice(0,-1))}const e=nd(t);return Wl.isMac&&e==td.ctrl?td.cmd:e}function cd(t,e){const n=sd(t,e);return n==="down"||n==="right"}function ld(){const t={arrowleft:37,arrowup:38,arrowright:39,arrowdown:40,backspace:8,delete:46,enter:13,space:32,esc:27,tab:9,ctrl:1114112,shift:2228224,alt:4456448,cmd:8912896};for(let e=65;e<=90;e++){const n=String.fromCharCode(e);t[n.toLowerCase()]=e}for(let e=48;e<=57;e++){t[e-48]=e}for(let e=112;e<=123;e++){t["f"+(e-111)]=e}return t}function dd(t){return t.split("+").map((t=>t.trim()))}class ud extends ul{constructor(t,e,n,o){super(t,e,n,o);this._isAllowedInsideAttributeElement=true;this.getFillerOffset=fd}is(t,e=null){if(!e){return t==="uiElement"||t==="view:uiElement"||t==="element"||t==="view:element"||t==="node"||t==="view:node"}else{return e===this.name&&(t==="uiElement"||t==="view:uiElement"||t==="element"||t==="view:element")}}_insertChild(t,e){if(e&&(e instanceof Oa||Array.from(e).length>0)){throw new u["a"]("view-uielement-cannot-add",this)}}render(t){return this.toDomElement(t)}toDomElement(t){const e=t.createElement(this.name);for(const t of this.getAttributeKeys()){e.setAttribute(t,this.getAttribute(t))}return e}}function hd(t){t.document.on("arrowKey",((e,n)=>md(e,n,t.domConverter)),{priority:"low"})}function fd(){return null}function md(t,e,n){if(e.keyCode==td.arrowright){const t=e.domTarget.ownerDocument.defaultView.getSelection();const o=t.rangeCount==1&&t.getRangeAt(0).collapsed;if(o||e.shiftKey){const e=t.focusNode;const i=t.focusOffset;const r=n.domPositionToView(e,i);if(r===null){return}let s=false;const a=r.getLastMatchingPosition((t=>{if(t.item.is("uiElement")){s=true}if(t.item.is("uiElement")||t.item.is("attributeElement")){return true}return false}));if(s){const e=n.viewPositionToDom(a);if(o){t.collapse(e.parent,e.offset)}else{t.extend(e.parent,e.offset)}}}}}class gd extends ul{constructor(t,e,n,o){super(t,e,n,o);this._isAllowedInsideAttributeElement=true;this.getFillerOffset=pd}is(t,e=null){if(!e){return t==="rawElement"||t==="view:rawElement"||t===this.name||t==="view:"+this.name||t==="element"||t==="view:element"||t==="node"||t==="view:node"}else{return e===this.name&&(t==="rawElement"||t==="view:rawElement"||t==="element"||t==="view:element")}}_insertChild(t,e){if(e&&(e instanceof Oa||Array.from(e).length>0)){throw new u["a"]("view-rawelement-cannot-add",[this,e])}}}function pd(){return null}class bd{constructor(t,e){this.document=t;this._children=[];if(e){this._insertChild(0,e)}}[Symbol.iterator](){return this._children[Symbol.iterator]()}get childCount(){return this._children.length}get isEmpty(){return this.childCount===0}get root(){return this}get parent(){return null}is(t){return t==="documentFragment"||t==="view:documentFragment"}_appendChild(t){return this._insertChild(this.childCount,t)}getChild(t){return this._children[t]}getChildIndex(t){return this._children.indexOf(t)}getChildren(){return this._children[Symbol.iterator]()}_insertChild(t,e){this._fireChange("children",this);let n=0;const o=kd(this.document,e);for(const e of o){if(e.parent!==null){e._remove()}e.parent=this;this._children.splice(t,0,e);t++;n++}return n}_removeChildren(t,e=1){this._fireChange("children",this);for(let n=t;n<t+e;n++){this._children[n].parent=null}return this._children.splice(t,e)}_fireChange(t,e){this.fire("change:"+t,e)}}Hn(bd,g);function kd(t,e){if(typeof e=="string"){return[new Na(t,e)]}if(!ba(e)){e=[e]}return Array.from(e).map((e=>{if(typeof e=="string"){return new Na(t,e)}if(e instanceof Ma){return new Na(t,e.data)}return e}))}class wd{constructor(t){this.document=t;this._cloneGroups=new Map}setSelection(t,e,n){this.document.selection._setTo(t,e,n)}setSelectionFocus(t,e){this.document.selection._setFocus(t,e)}createDocumentFragment(t){return new bd(this.document,t)}createText(t){return new Na(this.document,t)}createAttributeElement(t,e,n={}){const o=new Ml(this.document,t,e);if(n.priority){o._priority=n.priority}if(n.id){o._id=n.id}return o}createContainerElement(t,e,n={}){const o=new gl(this.document,t,e);if(n.isAllowedInsideAttributeElement!==undefined){o._isAllowedInsideAttributeElement=n.isAllowedInsideAttributeElement}return o}createEditableElement(t,e){const n=new bl(this.document,t,e);n._document=this.document;return n}createEmptyElement(t,e,n={}){const o=new Hl(this.document,t,e);if(n.isAllowedInsideAttributeElement!==undefined){o._isAllowedInsideAttributeElement=n.isAllowedInsideAttributeElement}return o}createUIElement(t,e,n,o={}){const i=new ud(this.document,t,e);if(n){i.render=n}if(o.isAllowedInsideAttributeElement!==undefined){i._isAllowedInsideAttributeElement=o.isAllowedInsideAttributeElement}return i}createRawElement(t,e,n,o={}){const i=new gd(this.document,t,e);i.render=n||(()=>{});if(o.isAllowedInsideAttributeElement!==undefined){i._isAllowedInsideAttributeElement=o.isAllowedInsideAttributeElement}return i}setAttribute(t,e,n){n._setAttribute(t,e)}removeAttribute(t,e){e._removeAttribute(t)}addClass(t,e){e._addClass(t)}removeClass(t,e){e._removeClass(t)}setStyle(t,e,n){if(io(t)&&n===undefined){n=e}n._setStyle(t,e)}removeStyle(t,e){e._removeStyle(t)}setCustomProperty(t,e,n){n._setCustomProperty(t,e)}removeCustomProperty(t,e){return e._removeCustomProperty(t)}breakAttributes(t){if(t instanceof Al){return this._breakAttributes(t)}else{return this._breakAttributesRange(t)}}breakContainer(t){const e=t.parent;if(!e.is("containerElement")){throw new u["a"]("view-writer-break-non-container-element",this.document)}if(!e.parent){throw new u["a"]("view-writer-break-root",this.document)}if(t.isAtStart){return Al._createBefore(e)}else if(!t.isAtEnd){const n=e._clone(false);this.insert(Al._createAfter(e),n);const o=new _l(t,Al._createAt(e,"end"));const i=new Al(n,0);this.move(o,i)}return Al._createAfter(e)}mergeAttributes(t){const e=t.offset;const n=t.parent;if(n.is("$text")){return t}if(n.is("attributeElement")&&n.childCount===0){const t=n.parent;const e=n.index;n._remove();this._removeFromClonedElementsGroup(n);return this.mergeAttributes(new Al(t,e))}const o=n.getChild(e-1);const i=n.getChild(e);if(!o||!i){return t}if(o.is("$text")&&i.is("$text")){return xd(o,i)}else if(o.is("attributeElement")&&i.is("attributeElement")&&o.isSimilar(i)){const t=o.childCount;o._appendChild(i.getChildren());i._remove();this._removeFromClonedElementsGroup(i);return this.mergeAttributes(new Al(o,t))}return t}mergeContainers(t){const e=t.nodeBefore;const n=t.nodeAfter;if(!e||!n||!e.is("containerElement")||!n.is("containerElement")){throw new u["a"]("view-writer-merge-containers-invalid-position",this.document)}const o=e.getChild(e.childCount-1);const i=o instanceof Na?Al._createAt(o,"end"):Al._createAt(e,"end");this.move(_l._createIn(n),Al._createAt(e,"end"));this.remove(_l._createOn(n));return i}insert(t,e){e=ba(e)?[...e]:[e];Ed(e,this.document);const n=e.reduce(((t,e)=>{const n=t[t.length-1];const o=!(e.is("uiElement")&&e.isAllowedInsideAttributeElement);if(!n||n.breakAttributes!=o){t.push({breakAttributes:o,nodes:[e]})}else{n.nodes.push(e)}return t}),[]);let o=null;let i=t;for(const{nodes:t,breakAttributes:e}of n){const n=this._insertNodes(i,t,e);if(!o){o=n.start}i=n.end}if(!o){return new _l(t)}return new _l(o,i)}remove(t){const e=t instanceof _l?t:_l._createOn(t);Bd(e,this.document);if(e.isCollapsed){return new bd(this.document)}const{start:n,end:o}=this._breakAttributesRange(e,true);const i=n.parent;const r=o.offset-n.offset;const s=i._removeChildren(n.offset,r);for(const t of s){this._removeFromClonedElementsGroup(t)}const a=this.mergeAttributes(n);e.start=a;e.end=a.clone();return new bd(this.document,s)}clear(t,e){Bd(t,this.document);const n=t.getWalker({direction:"backward",ignoreElementEnd:true});for(const o of n){const n=o.item;let i;if(n.is("element")&&e.isSimilar(n)){i=_l._createOn(n)}else if(!o.nextPosition.isAfter(t.start)&&n.is("$textProxy")){const t=n.getAncestors().find((t=>t.is("element")&&e.isSimilar(t)));if(t){i=_l._createIn(t)}}if(i){if(i.end.isAfter(t.end)){i.end=t.end}if(i.start.isBefore(t.start)){i.start=t.start}this.remove(i)}}}move(t,e){let n;if(e.isAfter(t.end)){e=this._breakAttributes(e,true);const o=e.parent;const i=o.childCount;t=this._breakAttributesRange(t,true);n=this.remove(t);e.offset+=o.childCount-i}else{n=this.remove(t)}return this.insert(e,n)}wrap(t,e){if(!(e instanceof Ml)){throw new u["a"]("view-writer-wrap-invalid-attribute",this.document)}Bd(t,this.document);if(!t.isCollapsed){return this._wrapRange(t,e)}else{let n=t.start;if(n.parent.is("element")&&!Cd(n.parent)){n=n.getLastMatchingPosition((t=>t.item.is("uiElement")))}n=this._wrapPosition(n,e);const o=this.document.selection;if(o.isCollapsed&&o.getFirstPosition().isEqual(t.start)){this.setSelection(n)}return new _l(n)}}unwrap(t,e){if(!(e instanceof Ml)){throw new u["a"]("view-writer-unwrap-invalid-attribute",this.document)}Bd(t,this.document);if(t.isCollapsed){return t}const{start:n,end:o}=this._breakAttributesRange(t,true);const i=n.parent;const r=this._unwrapChildren(i,n.offset,o.offset,e);const s=this.mergeAttributes(r.start);if(!s.isEqual(r.start)){r.end.offset--}const a=this.mergeAttributes(r.end);return new _l(s,a)}rename(t,e){const n=new gl(this.document,t,e.getAttributes());this.insert(Al._createAfter(e),n);this.move(_l._createIn(e),Al._createAt(n,0));this.remove(_l._createOn(e));return n}clearClonedElementsGroup(t){this._cloneGroups.delete(t)}createPositionAt(t,e){return Al._createAt(t,e)}createPositionAfter(t){return Al._createAfter(t)}createPositionBefore(t){return Al._createBefore(t)}createRange(t,e){return new _l(t,e)}createRangeOn(t){return _l._createOn(t)}createRangeIn(t){return _l._createIn(t)}createSelection(t,e,n){return new xl(t,e,n)}_insertNodes(t,e,n){let o;if(n){o=Ad(t)}else{o=t.parent.is("$text")?t.parent.parent:t.parent}if(!o){throw new u["a"]("view-writer-invalid-position-container",this.document)}let i;if(n){i=this._breakAttributes(t,true)}else{i=t.parent.is("$text")?yd(t):t}const r=o._insertChild(i.offset,e);for(const t of e){this._addToClonedElementsGroup(t)}const s=i.getShiftedBy(r);const a=this.mergeAttributes(i);if(!a.isEqual(i)){s.offset--}const c=this.mergeAttributes(s);return new _l(a,c)}_wrapChildren(t,e,n,o){let i=e;const r=[];while(i<n){const e=t.getChild(i);const n=e.is("$text");const s=e.is("attributeElement");const a=e.isAllowedInsideAttributeElement;if(s&&this._wrapAttributeElement(o,e)){r.push(new Al(t,i))}else if(n||a||s&&_d(o,e)){const n=o._clone();e._remove();n._appendChild(e);t._insertChild(i,n);this._addToClonedElementsGroup(n);r.push(new Al(t,i))}else if(s){this._wrapChildren(e,0,e.childCount,o)}i++}let s=0;for(const t of r){t.offset-=s;if(t.offset==e){continue}const o=this.mergeAttributes(t);if(!o.isEqual(t)){s++;n--}}return _l._createFromParentsAndOffsets(t,e,t,n)}_unwrapChildren(t,e,n,o){let i=e;const r=[];while(i<n){const e=t.getChild(i);if(!e.is("attributeElement")){i++;continue}if(e.isSimilar(o)){const o=e.getChildren();const s=e.childCount;e._remove();t._insertChild(i,o);this._removeFromClonedElementsGroup(e);r.push(new Al(t,i),new Al(t,i+s));i+=s;n+=s-1;continue}if(this._unwrapAttributeElement(o,e)){r.push(new Al(t,i),new Al(t,i+1));i++;continue}this._unwrapChildren(e,0,e.childCount,o);i++}let s=0;for(const t of r){t.offset-=s;if(t.offset==e||t.offset==n){continue}const o=this.mergeAttributes(t);if(!o.isEqual(t)){s++;n--}}return _l._createFromParentsAndOffsets(t,e,t,n)}_wrapRange(t,e){const{start:n,end:o}=this._breakAttributesRange(t,true);const i=n.parent;const r=this._wrapChildren(i,n.offset,o.offset,e);const s=this.mergeAttributes(r.start);if(!s.isEqual(r.start)){r.end.offset--}const a=this.mergeAttributes(r.end);return new _l(s,a)}_wrapPosition(t,e){if(e.isSimilar(t.parent)){return vd(t.clone())}if(t.parent.is("$text")){t=yd(t)}const n=this.createAttributeElement();n._priority=Number.POSITIVE_INFINITY;n.isSimilar=()=>false;t.parent._insertChild(t.offset,n);const o=new _l(t,t.getShiftedBy(1));this.wrap(o,e);const i=new Al(n.parent,n.index);n._remove();const r=i.nodeBefore;const s=i.nodeAfter;if(r instanceof Na&&s instanceof Na){return xd(r,s)}return vd(i)}_wrapAttributeElement(t,e){if(!Td(t,e)){return false}if(t.name!==e.name||t.priority!==e.priority){return false}for(const n of t.getAttributeKeys()){if(n==="class"||n==="style"){continue}if(e.hasAttribute(n)&&e.getAttribute(n)!==t.getAttribute(n)){return false}}for(const n of t.getStyleNames()){if(e.hasStyle(n)&&e.getStyle(n)!==t.getStyle(n)){return false}}for(const n of t.getAttributeKeys()){if(n==="class"||n==="style"){continue}if(!e.hasAttribute(n)){this.setAttribute(n,t.getAttribute(n),e)}}for(const n of t.getStyleNames()){if(!e.hasStyle(n)){this.setStyle(n,t.getStyle(n),e)}}for(const n of t.getClassNames()){if(!e.hasClass(n)){this.addClass(n,e)}}return true}_unwrapAttributeElement(t,e){if(!Td(t,e)){return false}if(t.name!==e.name||t.priority!==e.priority){return false}for(const n of t.getAttributeKeys()){if(n==="class"||n==="style"){continue}if(!e.hasAttribute(n)||e.getAttribute(n)!==t.getAttribute(n)){return false}}if(!e.hasClass(...t.getClassNames())){return false}for(const n of t.getStyleNames()){if(!e.hasStyle(n)||e.getStyle(n)!==t.getStyle(n)){return false}}for(const n of t.getAttributeKeys()){if(n==="class"||n==="style"){continue}this.removeAttribute(n,e)}this.removeClass(Array.from(t.getClassNames()),e);this.removeStyle(Array.from(t.getStyleNames()),e);return true}_breakAttributesRange(t,e=false){const n=t.start;const o=t.end;Bd(t,this.document);if(t.isCollapsed){const n=this._breakAttributes(t.start,e);return new _l(n,n)}const i=this._breakAttributes(o,e);const r=i.parent.childCount;const s=this._breakAttributes(n,e);i.offset+=i.parent.childCount-r;return new _l(s,i)}_breakAttributes(t,e=false){const n=t.offset;const o=t.parent;if(t.parent.is("emptyElement")){throw new u["a"]("view-writer-cannot-break-empty-element",this.document)}if(t.parent.is("uiElement")){throw new u["a"]("view-writer-cannot-break-ui-element",this.document)}if(t.parent.is("rawElement")){throw new u["a"]("view-writer-cannot-break-raw-element",this.document)}if(!e&&o.is("$text")&&Sd(o.parent)){return t.clone()}if(Sd(o)){return t.clone()}if(o.is("$text")){return this._breakAttributes(yd(t),e)}const i=o.childCount;if(n==i){const t=new Al(o.parent,o.index+1);return this._breakAttributes(t,e)}else{if(n===0){const t=new Al(o.parent,o.index);return this._breakAttributes(t,e)}else{const t=o.index+1;const i=o._clone();o.parent._insertChild(t,i);this._addToClonedElementsGroup(i);const r=o.childCount-n;const s=o._removeChildren(n,r);i._appendChild(s);const a=new Al(o.parent,t);return this._breakAttributes(a,e)}}}_addToClonedElementsGroup(t){if(!t.root.is("rootElement")){return}if(t.is("element")){for(const e of t.getChildren()){this._addToClonedElementsGroup(e)}}const e=t.id;if(!e){return}let n=this._cloneGroups.get(e);if(!n){n=new Set;this._cloneGroups.set(e,n)}n.add(t);t._clonesGroup=n}_removeFromClonedElementsGroup(t){if(t.is("element")){for(const e of t.getChildren()){this._removeFromClonedElementsGroup(e)}}const e=t.id;if(!e){return}const n=this._cloneGroups.get(e);if(!n){return}n.delete(t)}}function Cd(t){return Array.from(t.getChildren()).some((t=>!t.is("uiElement")))}function Ad(t){let e=t.parent;while(!Sd(e)){if(!e){return undefined}e=e.parent}return e}function _d(t,e){if(t.priority<e.priority){return true}else if(t.priority>e.priority){return false}return t.getIdentity()<e.getIdentity()}function vd(t){const e=t.nodeBefore;if(e&&e.is("$text")){return new Al(e,e.data.length)}const n=t.nodeAfter;if(n&&n.is("$text")){return new Al(n,0)}return t}function yd(t){if(t.offset==t.parent.data.length){return new Al(t.parent.parent,t.parent.index+1)}if(t.offset===0){return new Al(t.parent.parent,t.parent.index)}const e=t.parent.data.slice(t.offset);t.parent._data=t.parent.data.slice(0,t.offset);t.parent.parent._insertChild(t.parent.index+1,new Na(t.root.document,e));return new Al(t.parent.parent,t.parent.index+1)}function xd(t,e){const n=t.data.length;t._data+=e.data;e._remove();return new Al(t,n)}function Ed(t,e){for(const n of t){if(!Dd.some((t=>n instanceof t))){throw new u["a"]("view-writer-insert-invalid-node-type",e)}if(!n.is("$text")){Ed(n.getChildren(),e)}}}const Dd=[Na,Ml,gl,Hl,gd,ud];function Sd(t){return t&&(t.is("containerElement")||t.is("documentFragment"))}function Bd(t,e){const n=Ad(t.start);const o=Ad(t.end);if(!n||!o||n!==o){throw new u["a"]("view-writer-invalid-range-container",e)}}function Td(t,e){return t.id===null&&e.id===null}function Pd(t){return Object.prototype.toString.call(t)=="[object Text]"}const Id=t=>t.createTextNode(" ");const Rd=t=>{const e=t.createElement("br");e.dataset.ckeFiller=true;return e};const Fd=7;const zd="".repeat(Fd);function Od(t){return Pd(t)&&t.data.substr(0,Fd)===zd}function Nd(t){return t.data.length==Fd&&Od(t)}function Md(t){if(Od(t)){return t.data.slice(Fd)}else{return t.data}}function Vd(t){t.document.on("arrowKey",Ld,{priority:"low"})}function Ld(t,e){if(e.keyCode==td.arrowleft){const t=e.domTarget.ownerDocument.defaultView.getSelection();if(t.rangeCount==1&&t.getRangeAt(0).collapsed){const e=t.getRangeAt(0).startContainer;const n=t.getRangeAt(0).startOffset;if(Od(e)&&n<=Fd){t.collapse(e,0)}}}}function Hd(t,e,n,o=false){n=n||function(t,e){return t===e};if(!Array.isArray(t)){t=Array.prototype.slice.call(t)}if(!Array.isArray(e)){e=Array.prototype.slice.call(e)}const i=Kd(t,e,n);return o?Gd(i,e.length):Wd(e,i)}function Kd(t,e,n){const o=qd(t,e,n);if(o===-1){return{firstIndex:-1,lastIndexOld:-1,lastIndexNew:-1}}const i=jd(t,o);const r=jd(e,o);const s=qd(i,r,n);const a=t.length-s;const c=e.length-s;return{firstIndex:o,lastIndexOld:a,lastIndexNew:c}}function qd(t,e,n){for(let o=0;o<Math.max(t.length,e.length);o++){if(t[o]===undefined||e[o]===undefined||!n(t[o],e[o])){return o}}return-1}function jd(t,e){return t.slice(e).reverse()}function Wd(t,e){const n=[];const{firstIndex:o,lastIndexOld:i,lastIndexNew:r}=e;if(r-o>0){n.push({index:o,type:"insert",values:t.slice(o,r)})}if(i-o>0){n.push({index:o+(r-o),type:"delete",howMany:i-o})}return n}function Gd(t,e){const{firstIndex:n,lastIndexOld:o,lastIndexNew:i}=t;if(n===-1){return Array(e).fill("equal")}let r=[];if(n>0){r=r.concat(Array(n).fill("equal"))}if(i-n>0){r=r.concat(Array(i-n).fill("insert"))}if(o-n>0){r=r.concat(Array(o-n).fill("delete"))}if(i<e){r=r.concat(Array(e-i).fill("equal"))}return r}function Ud(t,e,n){n=n||function(t,e){return t===e};const o=t.length;const i=e.length;if(o>200||i>200||o+i>300){return Ud.fastDiff(t,e,n,true)}let r,s;if(i<o){const n=t;t=e;e=n;r="delete";s="insert"}else{r="insert";s="delete"}const a=t.length;const c=e.length;const l=c-a;const d={};const u={};function h(o){const i=(u[o-1]!==undefined?u[o-1]:-1)+1;const l=u[o+1]!==undefined?u[o+1]:-1;const h=i>l?-1:1;if(d[o+h]){d[o]=d[o+h].slice(0)}if(!d[o]){d[o]=[]}d[o].push(i>l?r:s);let f=Math.max(i,l);let m=f-o;while(m<a&&f<c&&n(t[m],e[f])){m++;f++;d[o].push("equal")}return f}let f=0;let m;do{for(m=-f;m<l;m++){u[m]=h(m)}for(m=l+f;m>l;m--){u[m]=h(m)}u[l]=h(l);f++}while(u[l]!==c);return d[l].slice(1)}Ud.fastDiff=Hd;function $d(t,e,n){t.insertBefore(n,t.childNodes[e]||null)}function Jd(t){const e=t.parentNode;if(e){e.removeChild(t)}}function Yd(t){if(t){if(t.defaultView){return t instanceof t.defaultView.Document}else if(t.ownerDocument&&t.ownerDocument.defaultView){return t instanceof t.ownerDocument.defaultView.Node}}return false}class Qd{constructor(t,e){this.domDocuments=new Set;this.domConverter=t;this.markedAttributes=new Set;this.markedChildren=new Set;this.markedTexts=new Set;this.selection=e;this.isFocused=false;this._inlineFiller=null;this._fakeSelectionContainer=null}markToSync(t,e){if(t==="text"){if(this.domConverter.mapViewToDom(e.parent)){this.markedTexts.add(e)}}else{if(!this.domConverter.mapViewToDom(e)){return}if(t==="attributes"){this.markedAttributes.add(e)}else if(t==="children"){this.markedChildren.add(e)}else{throw new u["a"]("view-renderer-unknown-type",this)}}}render(){let t;for(const t of this.markedChildren){this._updateChildrenMappings(t)}if(this._inlineFiller&&!this._isSelectionInInlineFiller()){this._removeInlineFiller()}if(this._inlineFiller){t=this._getInlineFillerPosition()}else if(this._needsInlineFillerAtSelection()){t=this.selection.getFirstPosition();this.markedChildren.add(t.parent)}for(const t of this.markedAttributes){this._updateAttrs(t)}for(const e of this.markedChildren){this._updateChildren(e,{inlineFillerPosition:t})}for(const e of this.markedTexts){if(!this.markedChildren.has(e.parent)&&this.domConverter.mapViewToDom(e.parent)){this._updateText(e,{inlineFillerPosition:t})}}if(t){const e=this.domConverter.viewPositionToDom(t);const n=e.parent.ownerDocument;if(!Od(e.parent)){this._inlineFiller=Zd(n,e.parent,e.offset)}else{this._inlineFiller=e.parent}}else{this._inlineFiller=null}this._updateFocus();this._updateSelection();this.markedTexts.clear();this.markedAttributes.clear();this.markedChildren.clear()}_updateChildrenMappings(t){const e=this.domConverter.mapViewToDom(t);if(!e){return}const n=this.domConverter.mapViewToDom(t).childNodes;const o=Array.from(this.domConverter.viewChildrenToDom(t,e.ownerDocument,{withChildren:false}));const i=this._diffNodeLists(n,o);const r=this._findReplaceActions(i,n,o);if(r.indexOf("replace")!==-1){const e={equal:0,insert:0,delete:0};for(const i of r){if(i==="replace"){const i=e.equal+e.insert;const r=e.equal+e.delete;const s=t.getChild(i);if(s&&!(s.is("uiElement")||s.is("rawElement"))){this._updateElementMappings(s,n[r])}Jd(o[i]);e.equal++}else{e[i]++}}}}_updateElementMappings(t,e){this.domConverter.unbindDomElement(e);this.domConverter.bindElements(e,t);this.markedChildren.add(t);this.markedAttributes.add(t)}_getInlineFillerPosition(){const t=this.selection.getFirstPosition();if(t.parent.is("$text")){return Al._createBefore(this.selection.getFirstPosition().parent)}else{return t}}_isSelectionInInlineFiller(){if(this.selection.rangeCount!=1||!this.selection.isCollapsed){return false}const t=this.selection.getFirstPosition();const e=this.domConverter.viewPositionToDom(t);if(e&&Pd(e.parent)&&Od(e.parent)){return true}return false}_removeInlineFiller(){const t=this._inlineFiller;if(!Od(t)){throw new u["a"]("view-renderer-filler-was-lost",this)}if(Nd(t)){t.parentNode.removeChild(t)}else{t.data=t.data.substr(Fd)}this._inlineFiller=null}_needsInlineFillerAtSelection(){if(this.selection.rangeCount!=1||!this.selection.isCollapsed){return false}const t=this.selection.getFirstPosition();const e=t.parent;const n=t.offset;if(!this.domConverter.mapViewToDom(e.root)){return false}if(!e.is("element")){return false}if(!Xd(e)){return false}if(n===e.getFillerOffset()){return false}const o=t.nodeBefore;const i=t.nodeAfter;if(o instanceof Na||i instanceof Na){return false}return true}_updateText(t,e){const n=this.domConverter.findCorrespondingDomText(t);const o=this.domConverter.viewToDom(t,n.ownerDocument);const i=n.data;let r=o.data;const s=e.inlineFillerPosition;if(s&&s.parent==t.parent&&s.offset==t.index){r=zd+r}if(i!=r){const t=Hd(i,r);for(const e of t){if(e.type==="insert"){n.insertData(e.index,e.values.join(""))}else{n.deleteData(e.index,e.howMany)}}}}_updateAttrs(t){const e=this.domConverter.mapViewToDom(t);if(!e){return}const n=Array.from(e.attributes).map((t=>t.name));const o=t.getAttributeKeys();for(const n of o){e.setAttribute(n,t.getAttribute(n))}for(const o of n){if(!t.hasAttribute(o)){e.removeAttribute(o)}}}_updateChildren(t,e){const n=this.domConverter.mapViewToDom(t);if(!n){return}const o=e.inlineFillerPosition;const i=this.domConverter.mapViewToDom(t).childNodes;const r=Array.from(this.domConverter.viewChildrenToDom(t,n.ownerDocument,{bind:true,inlineFillerPosition:o}));if(o&&o.parent===t){Zd(n.ownerDocument,r,o.offset)}const s=this._diffNodeLists(i,r);let a=0;const c=new Set;for(const t of s){if(t==="delete"){c.add(i[a]);Jd(i[a])}else if(t==="equal"){a++}}a=0;for(const t of s){if(t==="insert"){$d(n,a,r[a]);a++}else if(t==="equal"){this._markDescendantTextToSync(this.domConverter.domToView(r[a]));a++}}for(const t of c){if(!t.parentNode){this.domConverter.unbindDomElement(t)}}}_diffNodeLists(t,e){t=ou(t,this._fakeSelectionContainer);return Ud(t,e,eu.bind(null,this.domConverter))}_findReplaceActions(t,e,n){if(t.indexOf("insert")===-1||t.indexOf("delete")===-1){return t}let o=[];let i=[];let r=[];const s={equal:0,insert:0,delete:0};for(const a of t){if(a==="insert"){r.push(n[s.equal+s.insert])}else if(a==="delete"){i.push(e[s.equal+s.delete])}else{o=o.concat(Ud(i,r,tu).map((t=>t==="equal"?"replace":t)));o.push("equal");i=[];r=[]}s[a]++}return o.concat(Ud(i,r,tu).map((t=>t==="equal"?"replace":t)))}_markDescendantTextToSync(t){if(!t){return}if(t.is("$text")){this.markedTexts.add(t)}else if(t.is("element")){for(const e of t.getChildren()){this._markDescendantTextToSync(e)}}}_updateSelection(){if(this.selection.rangeCount===0){this._removeDomSelection();this._removeFakeSelection();return}const t=this.domConverter.mapViewToDom(this.selection.editableElement);if(!this.isFocused||!t){return}if(this.selection.isFake){this._updateFakeSelection(t)}else{this._removeFakeSelection();this._updateDomSelection(t)}}_updateFakeSelection(t){const e=t.ownerDocument;if(!this._fakeSelectionContainer){this._fakeSelectionContainer=iu(e)}const n=this._fakeSelectionContainer;this.domConverter.bindFakeSelection(n,this.selection);if(!this._fakeSelectionNeedsUpdate(t)){return}if(!n.parentElement||n.parentElement!=t){t.appendChild(n)}n.textContent=this.selection.fakeSelectionLabel||" ";const o=e.getSelection();const i=e.createRange();o.removeAllRanges();i.selectNodeContents(n);o.addRange(i)}_updateDomSelection(t){const e=t.ownerDocument.defaultView.getSelection();if(!this._domSelectionNeedsUpdate(e)){return}const n=this.domConverter.viewPositionToDom(this.selection.anchor);const o=this.domConverter.viewPositionToDom(this.selection.focus);e.collapse(n.parent,n.offset);e.extend(o.parent,o.offset);if(Wl.isGecko){nu(o,e)}}_domSelectionNeedsUpdate(t){if(!this.domConverter.isDomSelectionCorrect(t)){return true}const e=t&&this.domConverter.domSelectionToView(t);if(e&&this.selection.isEqual(e)){return false}if(!this.selection.isCollapsed&&this.selection.isSimilar(e)){return false}return true}_fakeSelectionNeedsUpdate(t){const e=this._fakeSelectionContainer;const n=t.ownerDocument.getSelection();if(!e||e.parentElement!==t){return true}if(n.anchorNode!==e&&!e.contains(n.anchorNode)){return true}return e.textContent!==this.selection.fakeSelectionLabel}_removeDomSelection(){for(const t of this.domDocuments){const e=t.getSelection();if(e.rangeCount){const e=t.activeElement;const n=this.domConverter.mapDomToView(e);if(e&&n){t.getSelection().removeAllRanges()}}}}_removeFakeSelection(){const t=this._fakeSelectionContainer;if(t){t.remove()}}_updateFocus(){if(this.isFocused){const t=this.selection.editableElement;if(t){this.domConverter.focus(t)}}}}Hn(Qd,Tn);function Xd(t){if(t.getAttribute("contenteditable")=="false"){return false}const e=t.findAncestor((t=>t.hasAttribute("contenteditable")));return!e||e.getAttribute("contenteditable")=="true"}function Zd(t,e,n){const o=e instanceof Array?e:e.childNodes;const i=o[n];if(Pd(i)){i.data=zd+i.data;return i}else{const i=t.createTextNode(zd);if(Array.isArray(e)){o.splice(n,0,i)}else{$d(e,n,i)}return i}}function tu(t,e){return Yd(t)&&Yd(e)&&!Pd(t)&&!Pd(e)&&t.nodeType!==Node.COMMENT_NODE&&e.nodeType!==Node.COMMENT_NODE&&t.tagName.toLowerCase()===e.tagName.toLowerCase()}function eu(t,e,n){if(e===n){return true}else if(Pd(e)&&Pd(n)){return e.data===n.data}else if(t.isBlockFiller(e)&&t.isBlockFiller(n)){return true}return false}function nu(t,e){const n=t.parent;if(n.nodeType!=Node.ELEMENT_NODE||t.offset!=n.childNodes.length-1){return}const o=n.childNodes[t.offset];if(o&&o.tagName=="BR"){e.addRange(e.getRangeAt(0))}}function ou(t,e){const n=Array.from(t);if(n.length==0||!e){return n}const o=n[n.length-1];if(o==e){n.pop()}return n}function iu(t){const e=t.createElement("div");e.className="ck-fake-selection-container";Object.assign(e.style,{position:"fixed",top:0,left:"-9999px",width:"42px"});e.textContent=" ";return e}var ru={window:window,document:document};function su(t){let e=0;while(t.previousSibling){t=t.previousSibling;e++}return e}function au(t){const e=[];while(t&&t.nodeType!=Node.DOCUMENT_NODE){e.unshift(t);t=t.parentNode}return e}function cu(t,e){const n=au(t);const o=au(e);let i=0;while(n[i]==o[i]&&n[i]){i++}return i===0?null:n[i-1]}const lu=Rd(document);class du{constructor(t,e={}){this.document=t;this.blockFillerMode=e.blockFillerMode||"br";this.preElements=["pre"];this.blockElements=["p","div","h1","h2","h3","h4","h5","h6","li","dd","dt","figcaption","td","th"];this._blockFiller=this.blockFillerMode=="br"?Rd:Id;this._domToViewMapping=new WeakMap;this._viewToDomMapping=new WeakMap;this._fakeSelectionMapping=new WeakMap;this._rawContentElementMatcher=new Ha;this._encounteredRawContentDomNodes=new WeakSet}bindFakeSelection(t,e){this._fakeSelectionMapping.set(t,new xl(e))}fakeSelectionToView(t){return this._fakeSelectionMapping.get(t)}bindElements(t,e){this._domToViewMapping.set(t,e);this._viewToDomMapping.set(e,t)}unbindDomElement(t){const e=this._domToViewMapping.get(t);if(e){this._domToViewMapping.delete(t);this._viewToDomMapping.delete(e);for(const e of t.childNodes){this.unbindDomElement(e)}}}bindDocumentFragments(t,e){this._domToViewMapping.set(t,e);this._viewToDomMapping.set(e,t)}viewToDom(t,e,n={}){if(t.is("$text")){const n=this._processDataFromViewText(t);return e.createTextNode(n)}else{if(this.mapViewToDom(t)){return this.mapViewToDom(t)}let o;if(t.is("documentFragment")){o=e.createDocumentFragment();if(n.bind){this.bindDocumentFragments(o,t)}}else if(t.is("uiElement")){o=t.render(e);if(n.bind){this.bindElements(o,t)}return o}else{if(t.hasAttribute("xmlns")){o=e.createElementNS(t.getAttribute("xmlns"),t.name)}else{o=e.createElement(t.name)}if(t.is("rawElement")){t.render(o)}if(n.bind){this.bindElements(o,t)}for(const e of t.getAttributeKeys()){o.setAttribute(e,t.getAttribute(e))}}if(n.withChildren!==false){for(const i of this.viewChildrenToDom(t,e,n)){o.appendChild(i)}}return o}}*viewChildrenToDom(t,e,n={}){const o=t.getFillerOffset&&t.getFillerOffset();let i=0;for(const r of t.getChildren()){if(o===i){yield this._blockFiller(e)}yield this.viewToDom(r,e,n);i++}if(o===i){yield this._blockFiller(e)}}viewRangeToDom(t){const e=this.viewPositionToDom(t.start);const n=this.viewPositionToDom(t.end);const o=document.createRange();o.setStart(e.parent,e.offset);o.setEnd(n.parent,n.offset);return o}viewPositionToDom(t){const e=t.parent;if(e.is("$text")){const n=this.findCorrespondingDomText(e);if(!n){return null}let o=t.offset;if(Od(n)){o+=Fd}return{parent:n,offset:o}}else{let n,o,i;if(t.offset===0){n=this.mapViewToDom(e);if(!n){return null}i=n.childNodes[0]}else{const e=t.nodeBefore;o=e.is("$text")?this.findCorrespondingDomText(e):this.mapViewToDom(t.nodeBefore);if(!o){return null}n=o.parentNode;i=o.nextSibling}if(Pd(i)&&Od(i)){return{parent:i,offset:Fd}}const r=o?su(o)+1:0;return{parent:n,offset:r}}}domToView(t,e={}){if(this.isBlockFiller(t,this.blockFillerMode)){return null}const n=this.getHostViewElement(t);if(n){return n}if(Pd(t)){if(Nd(t)){return null}else{const e=this._processDataFromDomText(t);return e===""?null:new Na(this.document,e)}}else if(this.isComment(t)){return null}else{if(this.mapDomToView(t)){return this.mapDomToView(t)}let n;if(this.isDocumentFragment(t)){n=new bd(this.document);if(e.bind){this.bindDocumentFragments(t,n)}}else{const o=e.keepOriginalCase?t.tagName:t.tagName.toLowerCase();n=new ul(this.document,o);if(e.bind){this.bindElements(t,n)}const i=t.attributes;for(let t=i.length-1;t>=0;t--){n._setAttribute(i[t].name,i[t].value)}if(e.withChildren!==false&&this._rawContentElementMatcher.match(n)){n._setCustomProperty("$rawContent",t.innerHTML);this._encounteredRawContentDomNodes.add(t);return n}}if(e.withChildren!==false){for(const o of this.domChildrenToView(t,e)){n._appendChild(o)}}return n}}*domChildrenToView(t,e={}){for(let n=0;n<t.childNodes.length;n++){const o=t.childNodes[n];const i=this.domToView(o,e);if(i!==null){yield i}}}domSelectionToView(t){if(t.rangeCount===1){let e=t.getRangeAt(0).startContainer;if(Pd(e)){e=e.parentNode}const n=this.fakeSelectionToView(e);if(n){return n}}const e=this.isDomSelectionBackward(t);const n=[];for(let e=0;e<t.rangeCount;e++){const o=t.getRangeAt(e);const i=this.domRangeToView(o);if(i){n.push(i)}}return new xl(n,{backward:e})}domRangeToView(t){const e=this.domPositionToView(t.startContainer,t.startOffset);const n=this.domPositionToView(t.endContainer,t.endOffset);if(e&&n){return new _l(e,n)}return null}domPositionToView(t,e){if(this.isBlockFiller(t,this.blockFillerMode)){return this.domPositionToView(t.parentNode,su(t))}const n=this.mapDomToView(t);if(n&&(n.is("uiElement")||n.is("rawElement"))){return Al._createBefore(n)}if(Pd(t)){if(Nd(t)){return this.domPositionToView(t.parentNode,su(t))}const n=this.findCorrespondingViewText(t);let o=e;if(!n){return null}if(Od(t)){o-=Fd;o=o<0?0:o}return new Al(n,o)}else{if(e===0){const e=this.mapDomToView(t);if(e){return new Al(e,0)}}else{const n=t.childNodes[e-1];const o=Pd(n)?this.findCorrespondingViewText(n):this.mapDomToView(n);if(o&&o.parent){return new Al(o.parent,o.index+1)}}return null}}mapDomToView(t){const e=this.getHostViewElement(t);return e||this._domToViewMapping.get(t)}findCorrespondingViewText(t){if(Nd(t)){return null}const e=this.getHostViewElement(t);if(e){return e}const n=t.previousSibling;if(n){if(!this.isElement(n)){return null}const t=this.mapDomToView(n);if(t){const e=t.nextSibling;if(e instanceof Na){return t.nextSibling}else{return null}}}else{const e=this.mapDomToView(t.parentNode);if(e){const t=e.getChild(0);if(t instanceof Na){return t}else{return null}}}return null}mapViewToDom(t){return this._viewToDomMapping.get(t)}findCorrespondingDomText(t){const e=t.previousSibling;if(e&&this.mapViewToDom(e)){return this.mapViewToDom(e).nextSibling}if(!e&&t.parent&&this.mapViewToDom(t.parent)){return this.mapViewToDom(t.parent).childNodes[0]}return null}focus(t){const e=this.mapViewToDom(t);if(e&&e.ownerDocument.activeElement!==e){const{scrollX:t,scrollY:n}=ru.window;const o=[];hu(e,(t=>{const{scrollLeft:e,scrollTop:n}=t;o.push([e,n])}));e.focus();hu(e,(t=>{const[e,n]=o.shift();t.scrollLeft=e;t.scrollTop=n}));ru.window.scrollTo(t,n)}}isElement(t){return t&&t.nodeType==Node.ELEMENT_NODE}isDocumentFragment(t){return t&&t.nodeType==Node.DOCUMENT_FRAGMENT_NODE}isComment(t){return t&&t.nodeType==Node.COMMENT_NODE}isBlockFiller(t){if(this.blockFillerMode=="br"){return t.isEqualNode(lu)}if(t.tagName==="BR"&&mu(t,this.blockElements)&&t.parentNode.childNodes.length===1){return true}return fu(t,this.blockElements)}isDomSelectionBackward(t){if(t.isCollapsed){return false}const e=document.createRange();e.setStart(t.anchorNode,t.anchorOffset);e.setEnd(t.focusNode,t.focusOffset);const n=e.collapsed;e.detach();return n}getHostViewElement(t){const e=au(t);e.pop();while(e.length){const t=e.pop();const n=this._domToViewMapping.get(t);if(n&&(n.is("uiElement")||n.is("rawElement"))){return n}}return null}isDomSelectionCorrect(t){return this._isDomSelectionPositionCorrect(t.anchorNode,t.anchorOffset)&&this._isDomSelectionPositionCorrect(t.focusNode,t.focusOffset)}registerRawContentMatcher(t){this._rawContentElementMatcher.add(t)}_isDomSelectionPositionCorrect(t,e){if(Pd(t)&&Od(t)&&e<Fd){return false}if(this.isElement(t)&&Od(t.childNodes[e])){return false}const n=this.mapDomToView(t);if(n&&(n.is("uiElement")||n.is("rawElement"))){return false}return true}_processDataFromViewText(t){let e=t.data;if(t.getAncestors().some((t=>this.preElements.includes(t.name)))){return e}if(e.charAt(0)==" "){const n=this._getTouchingViewTextNode(t,false);const o=n&&this._nodeEndsWithSpace(n);if(o||!n){e=" "+e.substr(1)}}if(e.charAt(e.length-1)==" "){const n=this._getTouchingViewTextNode(t,true);if(e.charAt(e.length-2)==" "||!n||n.data.charAt(0)==" "){e=e.substr(0,e.length-1)+" "}}return e.replace(/ {2}/g," ")}_nodeEndsWithSpace(t){if(t.getAncestors().some((t=>this.preElements.includes(t.name)))){return false}const e=this._processDataFromViewText(t);return e.charAt(e.length-1)==" "}_processDataFromDomText(t){let e=t.data;if(uu(t,this.preElements)){return Md(t)}e=e.replace(/[ \n\t\r]{1,}/g," ");const n=this._getTouchingInlineDomNode(t,false);const o=this._getTouchingInlineDomNode(t,true);const i=this._checkShouldLeftTrimDomText(t,n);const r=this._checkShouldRightTrimDomText(t,o);if(i){e=e.replace(/^ /,"")}if(r){e=e.replace(/ $/,"")}e=Md(new Text(e));e=e.replace(/ \u00A0/g," ");if(/( |\u00A0)\u00A0$/.test(e)||!o||o.data&&o.data.charAt(0)==" "){e=e.replace(/\u00A0$/," ")}if(i){e=e.replace(/^\u00A0/," ")}return e}_checkShouldLeftTrimDomText(t,e){if(!e){return true}if(fa(e)){return true}if(this._encounteredRawContentDomNodes.has(t.previousSibling)){return false}return/[^\S\u00A0]/.test(e.data.charAt(e.data.length-1))}_checkShouldRightTrimDomText(t,e){if(e){return false}return!Od(t)}_getTouchingViewTextNode(t,e){const n=new Cl({startPosition:e?Al._createAfter(t):Al._createBefore(t),direction:e?"forward":"backward"});for(const t of n){if(t.item.is("containerElement")){return null}else if(t.item.is("element","br")){return null}else if(t.item.is("$textProxy")){return t.item}}return null}_getTouchingInlineDomNode(t,e){if(!t.parentNode){return null}const n=e?"nextNode":"previousNode";const o=t.ownerDocument;const i=au(t)[0];const r=o.createTreeWalker(i,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,{acceptNode(t){if(Pd(t)){return NodeFilter.FILTER_ACCEPT}if(t.tagName=="BR"){return NodeFilter.FILTER_ACCEPT}return NodeFilter.FILTER_SKIP}});r.currentNode=t;const s=r[n]();if(s!==null){const e=cu(t,s);if(e&&!uu(t,this.blockElements,e)&&!uu(s,this.blockElements,e)){return s}}return null}}function uu(t,e,n){let o=au(t);if(n){o=o.slice(o.indexOf(n)+1)}return o.some((t=>t.tagName&&e.includes(t.tagName.toLowerCase())))}function hu(t,e){while(t&&t!=ru.document){e(t);t=t.parentNode}}function fu(t,e){const n=Pd(t)&&t.data==" ";return n&&mu(t,e)&&t.parentNode.childNodes.length===1}function mu(t,e){const n=t.parentNode;return n&&n.tagName&&e.includes(n.tagName.toLowerCase())}function gu(t){const e=Object.prototype.toString.apply(t);if(e=="[object Window]"){return true}if(e=="[object global]"){return true}return false}const pu=vn({},g,{listenTo(t,...e){if(Yd(t)||gu(t)){const n=this._getProxyEmitter(t)||new ku(t);n.attach(...e);t=n}g.listenTo.call(this,t,...e)},stopListening(t,e,n){if(Yd(t)||gu(t)){const e=this._getProxyEmitter(t);if(!e){return}t=e}g.stopListening.call(this,t,e,n);if(t instanceof ku){t.detach(e)}},_getProxyEmitter(t){return p(this,wu(t))}});var bu=pu;class ku{constructor(t){b(this,wu(t));this._domNode=t}}vn(ku.prototype,g,{attach(t,e,n={}){if(this._domListeners&&this._domListeners[t]){return}const o={capture:!!n.useCapture,passive:!!n.usePassive};const i=this._createDomListener(t,o);this._domNode.addEventListener(t,i,o);if(!this._domListeners){this._domListeners={}}this._domListeners[t]=i},detach(t){let e;if(this._domListeners[t]&&(!(e=this._events[t])||!e.callbacks.length)){this._domListeners[t].removeListener()}},_createDomListener(t,e){const n=e=>{this.fire(t,e)};n.removeListener=()=>{this._domNode.removeEventListener(t,n,e);delete this._domListeners[t]};return n}});function wu(t){return t["data-ck-expando"]||(t["data-ck-expando"]=a())}class Cu{constructor(t){this.view=t;this.document=t.document;this.isEnabled=false}enable(){this.isEnabled=true}disable(){this.isEnabled=false}destroy(){this.disable();this.stopListening()}checkShouldIgnoreEventFromTarget(t){if(t&&t.nodeType===3){t=t.parentNode}if(!t||t.nodeType!==1){return false}return t.matches("[data-cke-ignore-events], [data-cke-ignore-events] *")}}Hn(Cu,bu);var Au="__lodash_hash_undefined__";function _u(t){this.__data__.set(t,Au);return this}var vu=_u;function yu(t){return this.__data__.has(t)}var xu=yu;function Eu(t){var e=-1,n=t==null?0:t.length;this.__data__=new fi;while(++e<n){this.add(t[e])}}Eu.prototype.add=Eu.prototype.push=vu;Eu.prototype.has=xu;var Du=Eu;function Su(t,e){var n=-1,o=t==null?0:t.length;while(++n<o){if(e(t[n],n,t)){return true}}return false}var Bu=Su;function Tu(t,e){return t.has(e)}var Pu=Tu;var Iu=1,Ru=2;function Fu(t,e,n,o,i,r){var s=n&Iu,a=t.length,c=e.length;if(a!=c&&!(s&&c>a)){return false}var l=r.get(t);var d=r.get(e);if(l&&d){return l==e&&d==t}var u=-1,h=true,f=n&Ru?new Du:undefined;r.set(t,e);r.set(e,t);while(++u<a){var m=t[u],g=e[u];if(o){var p=s?o(g,m,u,e,t,r):o(m,g,u,t,e,r)}if(p!==undefined){if(p){continue}h=false;break}if(f){if(!Bu(e,(function(t,e){if(!Pu(f,e)&&(m===t||i(m,t,n,o,r))){return f.push(e)}}))){h=false;break}}else if(!(m===g||i(m,g,n,o,r))){h=false;break}}r["delete"](t);r["delete"](e);return h}var zu=Fu;function Ou(t){var e=-1,n=Array(t.size);t.forEach((function(t,o){n[++e]=[o,t]}));return n}var Nu=Ou;function Mu(t){var e=-1,n=Array(t.size);t.forEach((function(t){n[++e]=t}));return n}var Vu=Mu;var Lu=1,Hu=2;var Ku="[object Boolean]",qu="[object Date]",ju="[object Error]",Wu="[object Map]",Gu="[object Number]",Uu="[object RegExp]",$u="[object Set]",Ju="[object String]",Yu="[object Symbol]";var Qu="[object ArrayBuffer]",Xu="[object DataView]";var Zu=P?P.prototype:undefined,th=Zu?Zu.valueOf:undefined;function eh(t,e,n,o,i,r,s){switch(n){case Xu:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset){return false}t=t.buffer;e=e.buffer;case Qu:if(t.byteLength!=e.byteLength||!r(new Ir(t),new Ir(e))){return false}return true;case Ku:case qu:case Gu:return Et(+t,+e);case ju:return t.name==e.name&&t.message==e.message;case Uu:case Ju:return t==e+"";case Wu:var a=Nu;case $u:var c=o&Lu;a||(a=Vu);if(t.size!=e.size&&!c){return false}var l=s.get(t);if(l){return l==e}o|=Hu;s.set(t,e);var d=zu(a(t),a(e),o,i,r,s);s["delete"](t);return d;case Yu:if(th){return th.call(t)==th.call(e)}}return false}var nh=eh;var oh=1;var ih=Object.prototype;var rh=ih.hasOwnProperty;function sh(t,e,n,o,i,r){var s=n&oh,a=or(t),c=a.length,l=or(e),d=l.length;if(c!=d&&!s){return false}var u=c;while(u--){var h=a[u];if(!(s?h in e:rh.call(e,h))){return false}}var f=r.get(t);var m=r.get(e);if(f&&m){return f==e&&m==t}var g=true;r.set(t,e);r.set(e,t);var p=s;while(++u<c){h=a[u];var b=t[h],k=e[h];if(o){var w=s?o(k,b,h,e,t,r):o(b,k,h,t,e,r)}if(!(w===undefined?b===k||i(b,k,n,o,r):w)){g=false;break}p||(p=h=="constructor")}if(g&&!p){var C=t.constructor,A=e.constructor;if(C!=A&&("constructor"in t&&"constructor"in e)&&!(typeof C=="function"&&C instanceof C&&typeof A=="function"&&A instanceof A)){g=false}}r["delete"](t);r["delete"](e);return g}var ah=sh;var ch=1;var lh="[object Arguments]",dh="[object Array]",uh="[object Object]";var hh=Object.prototype;var fh=hh.hasOwnProperty;function mh(t,e,n,o,i,r){var s=xe(t),a=xe(e),c=s?dh:Er(t),l=a?dh:Er(e);c=c==lh?uh:c;l=l==lh?uh:l;var d=c==uh,u=l==uh,h=c==l;if(h&&Object(Ee["a"])(t)){if(!Object(Ee["a"])(e)){return false}s=true;d=false}if(h&&!d){r||(r=new ki);return s||sn(t)?zu(t,e,n,o,i,r):nh(t,e,c,n,o,i,r)}if(!(n&ch)){var f=d&&fh.call(t,"__wrapped__"),m=u&&fh.call(e,"__wrapped__");if(f||m){var g=f?t.value():t,p=m?e.value():e;r||(r=new ki);return i(g,p,n,o,r)}}if(!h){return false}r||(r=new ki);return ah(t,e,n,o,i,r)}var gh=mh;function ph(t,e,n,o,i){if(t===e){return true}if(t==null||e==null||!ge(t)&&!ge(e)){return t!==t&&e!==e}return gh(t,e,n,o,ph,i)}var bh=ph;function kh(t,e,n){n=typeof n=="function"?n:undefined;var o=n?n(t,e):undefined;return o===undefined?bh(t,e,undefined,n):!!o}var wh=kh;class Ch extends Cu{constructor(t){super(t);this._config={childList:true,characterData:true,characterDataOldValue:true,subtree:true};this.domConverter=t.domConverter;this.renderer=t._renderer;this._domElements=[];this._mutationObserver=new window.MutationObserver(this._onMutations.bind(this))}flush(){this._onMutations(this._mutationObserver.takeRecords())}observe(t){this._domElements.push(t);if(this.isEnabled){this._mutationObserver.observe(t,this._config)}}enable(){super.enable();for(const t of this._domElements){this._mutationObserver.observe(t,this._config)}}disable(){super.disable();this._mutationObserver.disconnect()}destroy(){super.destroy();this._mutationObserver.disconnect()}_onMutations(t){if(t.length===0){return}const e=this.domConverter;const n=new Map;const o=new Set;for(const n of t){if(n.type==="childList"){const t=e.mapDomToView(n.target);if(t&&(t.is("uiElement")||t.is("rawElement"))){continue}if(t&&!this._isBogusBrMutation(n)){o.add(t)}}}for(const i of t){const t=e.mapDomToView(i.target);if(t&&(t.is("uiElement")||t.is("rawElement"))){continue}if(i.type==="characterData"){const t=e.findCorrespondingViewText(i.target);if(t&&!o.has(t.parent)){n.set(t,{type:"text",oldText:t.data,newText:Md(i.target),node:t})}else if(!t&&Od(i.target)){o.add(e.mapDomToView(i.target.parentNode))}}}const i=[];for(const t of n.values()){this.renderer.markToSync("text",t.node);i.push(t)}for(const t of o){const n=e.mapViewToDom(t);const o=Array.from(t.getChildren());const r=Array.from(e.domChildrenToView(n,{withChildren:false}));if(!wh(o,r,a)){this.renderer.markToSync("children",t);i.push({type:"children",oldChildren:o,newChildren:r,node:t})}}const r=t[0].target.ownerDocument.getSelection();let s=null;if(r&&r.anchorNode){const t=e.domPositionToView(r.anchorNode,r.anchorOffset);const n=e.domPositionToView(r.focusNode,r.focusOffset);if(t&&n){s=new xl(t);s.setFocus(n)}}if(i.length){this.document.fire("mutations",i,s);this.view.forceRender()}function a(t,e){if(Array.isArray(t)){return}if(t===e){return true}else if(t.is("$text")&&e.is("$text")){return t.data===e.data}return false}}_isBogusBrMutation(t){let e=null;if(t.nextSibling===null&&t.removedNodes.length===0&&t.addedNodes.length==1){e=this.domConverter.domToView(t.addedNodes[0],{withChildren:false})}return e&&e.is("element","br")}}class Ah{constructor(t,e,n){this.view=t;this.document=t.document;this.domEvent=e;this.domTarget=e.target;vn(this,n)}get target(){return this.view.domConverter.mapDomToView(this.domTarget)}preventDefault(){this.domEvent.preventDefault()}stopPropagation(){this.domEvent.stopPropagation()}}class _h extends Cu{constructor(t){super(t);this.useCapture=false}observe(t){const e=typeof this.domEventType=="string"?[this.domEventType]:this.domEventType;e.forEach((e=>{this.listenTo(t,e,((t,e)=>{if(this.isEnabled&&!this.checkShouldIgnoreEventFromTarget(e.target)){this.onDomEvent(e)}}),{useCapture:this.useCapture})}))}fire(t,e,n){if(this.isEnabled){this.document.fire(t,new Ah(this.view,e,n))}}}class vh extends _h{constructor(t){super(t);this.domEventType=["keydown","keyup"]}onDomEvent(t){this.fire(t.type,t,{keyCode:t.keyCode,altKey:t.altKey,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,metaKey:t.metaKey,get keystroke(){return nd(this)}})}}var yh=function(){return B["a"].Date.now()};var xh=yh;var Eh=/\s/;function Dh(t){var e=t.length;while(e--&&Eh.test(t.charAt(e))){}return e}var Sh=Dh;var Bh=/^\s+/;function Th(t){return t?t.slice(0,Sh(t)+1).replace(Bh,""):t}var Ph=Th;var Ih=0/0;var Rh=/^[-+]0x[0-9a-f]+$/i;var Fh=/^0b[01]+$/i;var zh=/^0o[0-7]+$/i;var Oh=parseInt;function Nh(t){if(typeof t=="number"){return t}if(Ja(t)){return Ih}if(S(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=S(e)?e+"":e}if(typeof t!="string"){return t===0?t:+t}t=Ph(t);var n=Fh.test(t);return n||zh.test(t)?Oh(t.slice(2),n?2:8):Rh.test(t)?Ih:+t}var Mh=Nh;var Vh="Expected a function";var Lh=Math.max,Hh=Math.min;function Kh(t,e,n){var o,i,r,s,a,c,l=0,d=false,u=false,h=true;if(typeof t!="function"){throw new TypeError(Vh)}e=Mh(e)||0;if(S(n)){d=!!n.leading;u="maxWait"in n;r=u?Lh(Mh(n.maxWait)||0,e):r;h="trailing"in n?!!n.trailing:h}function f(e){var n=o,r=i;o=i=undefined;l=e;s=t.apply(r,n);return s}function m(t){l=t;a=setTimeout(b,e);return d?f(t):s}function g(t){var n=t-c,o=t-l,i=e-n;return u?Hh(i,r-o):i}function p(t){var n=t-c,o=t-l;return c===undefined||n>=e||n<0||u&&o>=r}function b(){var t=xh();if(p(t)){return k(t)}a=setTimeout(b,g(t))}function k(t){a=undefined;if(h&&o){return f(t)}o=i=undefined;return s}function w(){if(a!==undefined){clearTimeout(a)}l=0;o=c=i=a=undefined}function C(){return a===undefined?s:k(xh())}function A(){var t=xh(),n=p(t);o=arguments;i=this;c=t;if(n){if(a===undefined){return m(c)}if(u){clearTimeout(a);a=setTimeout(b,e);return f(c)}}if(a===undefined){a=setTimeout(b,e)}return s}A.cancel=w;A.flush=C;return A}var qh=Kh;class jh extends Cu{constructor(t){super(t);this._fireSelectionChangeDoneDebounced=qh((t=>this.document.fire("selectionChangeDone",t)),200)}observe(){const t=this.document;t.on("arrowKey",((e,n)=>{const o=t.selection;if(o.isFake&&this.isEnabled){n.preventDefault()}}),{context:"$capture"});t.on("arrowKey",((e,n)=>{const o=t.selection;if(o.isFake&&this.isEnabled){this._handleSelectionMove(n.keyCode)}}),{priority:"lowest"})}destroy(){super.destroy();this._fireSelectionChangeDoneDebounced.cancel()}_handleSelectionMove(t){const e=this.document.selection;const n=new xl(e.getRanges(),{backward:e.isBackward,fake:false});if(t==td.arrowleft||t==td.arrowup){n.setTo(n.getFirstPosition())}if(t==td.arrowright||t==td.arrowdown){n.setTo(n.getLastPosition())}const o={oldSelection:e,newSelection:n,domSelection:null};this.document.fire("selectionChange",o);this._fireSelectionChangeDoneDebounced(o)}}class Wh extends Cu{constructor(t){super(t);this.mutationObserver=t.getObserver(Ch);this.selection=this.document.selection;this.domConverter=t.domConverter;this._documents=new WeakSet;this._fireSelectionChangeDoneDebounced=qh((t=>this.document.fire("selectionChangeDone",t)),200);this._clearInfiniteLoopInterval=setInterval((()=>this._clearInfiniteLoop()),1e3);this._loopbackCounter=0}observe(t){const e=t.ownerDocument;if(this._documents.has(e)){return}this.listenTo(e,"selectionchange",((t,n)=>{this._handleSelectionChange(n,e)}));this._documents.add(e)}destroy(){super.destroy();clearInterval(this._clearInfiniteLoopInterval);this._fireSelectionChangeDoneDebounced.cancel()}_handleSelectionChange(t,e){if(!this.isEnabled){return}const n=e.defaultView.getSelection();if(this.checkShouldIgnoreEventFromTarget(n.anchorNode)){return}this.mutationObserver.flush();const o=this.domConverter.domSelectionToView(n);if(o.rangeCount==0){this.view.hasDomSelection=false;return}this.view.hasDomSelection=true;if(this.selection.isEqual(o)&&this.domConverter.isDomSelectionCorrect(n)){return}if(++this._loopbackCounter>60){return}if(this.selection.isSimilar(o)){this.view.forceRender()}else{const t={oldSelection:this.selection,newSelection:o,domSelection:n};this.document.fire("selectionChange",t);this._fireSelectionChangeDoneDebounced(t)}}_clearInfiniteLoop(){this._loopbackCounter=0}}class Gh extends _h{constructor(t){super(t);this.domEventType=["focus","blur"];this.useCapture=true;const e=this.document;e.on("focus",(()=>{e.isFocused=true;this._renderTimeoutId=setTimeout((()=>t.forceRender()),50)}));e.on("blur",((n,o)=>{const i=e.selection.editableElement;if(i===null||i===o.target){e.isFocused=false;t.forceRender()}}))}onDomEvent(t){this.fire(t.type,t)}destroy(){if(this._renderTimeoutId){clearTimeout(this._renderTimeoutId)}super.destroy()}}class Uh extends _h{constructor(t){super(t);this.domEventType=["compositionstart","compositionupdate","compositionend"];const e=this.document;e.on("compositionstart",(()=>{e.isComposing=true}));e.on("compositionend",(()=>{e.isComposing=false}))}onDomEvent(t){this.fire(t.type,t)}}class $h extends _h{constructor(t){super(t);this.domEventType=["beforeinput"]}onDomEvent(t){this.fire(t.type,t)}}class Jh{constructor(){this._replacedElements=[]}replace(t,e){this._replacedElements.push({element:t,newElement:e});t.style.display="none";if(e){t.parentNode.insertBefore(e,t.nextSibling)}}restore(){this._replacedElements.forEach((({element:t,newElement:e})=>{t.style.display="";if(e){e.remove()}}));this._replacedElements=[]}}var Yh="[object String]";function Qh(t){return typeof t=="string"||!xe(t)&&ge(t)&&G(t)==Yh}var Xh=Qh;function Zh(t,e,n={},o=[]){const i=n&&n.xmlns;const r=i?t.createElementNS(i,e):t.createElement(e);for(const t in n){r.setAttribute(t,n[t])}if(Xh(o)||!ba(o)){o=[o]}for(let e of o){if(Xh(e)){e=t.createTextNode(e)}r.appendChild(e)}return r}function tf(t){if(t instanceof HTMLTextAreaElement){return t.value}return t.innerHTML}function ef(t){return Object.prototype.toString.apply(t)=="[object Range]"}function nf(t){const e=t.ownerDocument.defaultView.getComputedStyle(t);return{top:parseInt(e.borderTopWidth,10),right:parseInt(e.borderRightWidth,10),bottom:parseInt(e.borderBottomWidth,10),left:parseInt(e.borderLeftWidth,10)}}const of=["top","right","bottom","left","width","height"];class rf{constructor(t){const e=ef(t);Object.defineProperty(this,"_source",{value:t._source||t,writable:true,enumerable:false});if(fa(t)||e){if(e){const e=rf.getDomRangeRects(t);sf(this,rf.getBoundingRect(e))}else{sf(this,t.getBoundingClientRect())}}else if(gu(t)){const{innerWidth:e,innerHeight:n}=t;sf(this,{top:0,right:e,bottom:n,left:0,width:e,height:n})}else{sf(this,t)}}clone(){return new rf(this)}moveTo(t,e){this.top=e;this.right=t+this.width;this.bottom=e+this.height;this.left=t;return this}moveBy(t,e){this.top+=e;this.right+=t;this.left+=t;this.bottom+=e;return this}getIntersection(t){const e={top:Math.max(this.top,t.top),right:Math.min(this.right,t.right),bottom:Math.min(this.bottom,t.bottom),left:Math.max(this.left,t.left)};e.width=e.right-e.left;e.height=e.bottom-e.top;if(e.width<0||e.height<0){return null}else{return new rf(e)}}getIntersectionArea(t){const e=this.getIntersection(t);if(e){return e.getArea()}else{return 0}}getArea(){return this.width*this.height}getVisible(){const t=this._source;let e=this.clone();if(!af(t)){let n=t.parentNode||t.commonAncestorContainer;while(n&&!af(n)){const t=new rf(n);const o=e.getIntersection(t);if(o){if(o.getArea()<e.getArea()){e=o}}else{return null}n=n.parentNode}}return e}isEqual(t){for(const e of of){if(this[e]!==t[e]){return false}}return true}contains(t){const e=this.getIntersection(t);return!!(e&&e.isEqual(t))}excludeScrollbarsAndBorders(){const t=this._source;let e,n,o;if(gu(t)){e=t.innerWidth-t.document.documentElement.clientWidth;n=t.innerHeight-t.document.documentElement.clientHeight;o=t.getComputedStyle(t.document.documentElement).direction}else{const i=nf(this._source);e=t.offsetWidth-t.clientWidth-i.left-i.right;n=t.offsetHeight-t.clientHeight-i.top-i.bottom;o=t.ownerDocument.defaultView.getComputedStyle(t).direction;this.left+=i.left;this.top+=i.top;this.right-=i.right;this.bottom-=i.bottom;this.width=this.right-this.left;this.height=this.bottom-this.top}this.width-=e;if(o==="ltr"){this.right-=e}else{this.left+=e}this.height-=n;this.bottom-=n;return this}static getDomRangeRects(t){const e=[];const n=Array.from(t.getClientRects());if(n.length){for(const t of n){e.push(new rf(t))}}else{let n=t.startContainer;if(Pd(n)){n=n.parentNode}const o=new rf(n.getBoundingClientRect());o.right=o.left;o.width=0;e.push(o)}return e}static getBoundingRect(t){const e={left:Number.POSITIVE_INFINITY,top:Number.POSITIVE_INFINITY,right:Number.NEGATIVE_INFINITY,bottom:Number.NEGATIVE_INFINITY};let n=0;for(const o of t){n++;e.left=Math.min(e.left,o.left);e.top=Math.min(e.top,o.top);e.right=Math.max(e.right,o.right);e.bottom=Math.max(e.bottom,o.bottom)}if(n==0){return null}e.width=e.right-e.left;e.height=e.bottom-e.top;return new rf(e)}}function sf(t,e){for(const n of of){t[n]=e[n]}}function af(t){if(!fa(t)){return false}return t===t.ownerDocument.body}const cf=100;class lf{constructor(t,e){if(!lf._observerInstance){lf._createObserver()}this._element=t;this._callback=e;lf._addElementCallback(t,e);lf._observerInstance.observe(t)}destroy(){lf._deleteElementCallback(this._element,this._callback)}static _addElementCallback(t,e){if(!lf._elementCallbacks){lf._elementCallbacks=new Map}let n=lf._elementCallbacks.get(t);if(!n){n=new Set;lf._elementCallbacks.set(t,n)}n.add(e)}static _deleteElementCallback(t,e){const n=lf._getElementCallbacks(t);if(n){n.delete(e);if(!n.size){lf._elementCallbacks.delete(t);lf._observerInstance.unobserve(t)}}if(lf._elementCallbacks&&!lf._elementCallbacks.size){lf._observerInstance=null;lf._elementCallbacks=null}}static _getElementCallbacks(t){if(!lf._elementCallbacks){return null}return lf._elementCallbacks.get(t)}static _createObserver(){let t;if(typeof ru.window.ResizeObserver==="function"){t=ru.window.ResizeObserver}else{t=df}lf._observerInstance=new t((t=>{for(const e of t){const t=lf._getElementCallbacks(e.target);if(t){for(const n of t){n(e)}}}}))}}lf._observerInstance=null;lf._elementCallbacks=null;class df{constructor(t){this._callback=t;this._elements=new Set;this._previousRects=new Map;this._periodicCheckTimeout=null}observe(t){this._elements.add(t);this._checkElementRectsAndExecuteCallback();if(this._elements.size===1){this._startPeriodicCheck()}}unobserve(t){this._elements.delete(t);this._previousRects.delete(t);if(!this._elements.size){this._stopPeriodicCheck()}}_startPeriodicCheck(){const t=()=>{this._checkElementRectsAndExecuteCallback();this._periodicCheckTimeout=setTimeout(t,cf)};this.listenTo(ru.window,"resize",(()=>{this._checkElementRectsAndExecuteCallback()}));this._periodicCheckTimeout=setTimeout(t,cf)}_stopPeriodicCheck(){clearTimeout(this._periodicCheckTimeout);this.stopListening();this._previousRects.clear()}_checkElementRectsAndExecuteCallback(){const t=[];for(const e of this._elements){if(this._hasRectChanged(e)){t.push({target:e,contentRect:this._previousRects.get(e)})}}if(t.length){this._callback(t)}}_hasRectChanged(t){if(!t.ownerDocument.body.contains(t)){return false}const e=new rf(t);const n=this._previousRects.get(t);const o=!n||!n.isEqual(e);this._previousRects.set(t,e);return o}}Hn(df,bu);function uf(t,e){if(t instanceof HTMLTextAreaElement){t.value=e}t.innerHTML=e}function hf(t){return e=>e+t}function ff(t){const e=t.next();if(e.done){return null}return e.value}class mf{constructor(){this.set("isFocused",false);this.set("focusedElement",null);this._elements=new Set;this._nextEventLoopTimeout=null}add(t){if(this._elements.has(t)){throw new u["a"]("focustracker-add-element-already-exist",this)}this.listenTo(t,"focus",(()=>this._focus(t)),{useCapture:true});this.listenTo(t,"blur",(()=>this._blur()),{useCapture:true});this._elements.add(t)}remove(t){if(t===this.focusedElement){this._blur(t)}if(this._elements.has(t)){this.stopListening(t);this._elements.delete(t)}}destroy(){this.stopListening()}_focus(t){clearTimeout(this._nextEventLoopTimeout);this.focusedElement=t;this.isFocused=true}_blur(){clearTimeout(this._nextEventLoopTimeout);this._nextEventLoopTimeout=setTimeout((()=>{this.focusedElement=null;this.isFocused=false}),0)}}Hn(mf,bu);Hn(mf,Tn);class gf{constructor(){this._listener=Object.create(bu)}listenTo(t){this._listener.listenTo(t,"keydown",((t,e)=>{this._listener.fire("_keydown:"+nd(e),e)}))}set(t,e,n={}){const o=od(t);const i=n.priority;this._listener.listenTo(this._listener,"_keydown:"+o,((t,n)=>{e(n,(()=>{n.preventDefault();n.stopPropagation();t.stop()}));t.return=true}),{priority:i})}press(t){return!!this._listener.fire("_keydown:"+nd(t),t)}destroy(){this._listener.stopListening()}}class pf extends Cu{constructor(t){super(t);this.document.on("keydown",((t,e)=>{if(this.isEnabled&&rd(e.keyCode)){const n=new Dl(this.document,"arrowKey",this.document.selection.getFirstRange());this.document.fire(n,e);if(n.stop.called){t.stop()}}}))}observe(){}}const bf={};function kf({target:t,viewportOffset:e=0}){const n=Ef(t);let o=n;let i=null;while(o){let r;if(o==n){r=Df(t)}else{r=Df(i)}Af(r,(()=>Sf(t,o)));const s=Sf(t,o);Cf(o,s,e);if(o.parent!=o){i=o.frameElement;o=o.parent;if(!i){return}}else{o=null}}}function wf(t){const e=Df(t);Af(e,(()=>new rf(t)))}Object.assign(bf,{scrollViewportToShowTarget:kf,scrollAncestorsToShowTarget:wf});function Cf(t,e,n){const o=e.clone().moveBy(0,n);const i=e.clone().moveBy(0,-n);const r=new rf(t).excludeScrollbarsAndBorders();const s=[i,o];if(!s.every((t=>r.contains(t)))){let{scrollX:s,scrollY:a}=t;if(vf(i,r)){a-=r.top-e.top+n}else if(_f(o,r)){a+=e.bottom-r.bottom+n}if(yf(e,r)){s-=r.left-e.left+n}else if(xf(e,r)){s+=e.right-r.right+n}t.scrollTo(s,a)}}function Af(t,e){const n=Ef(t);let o,i;while(t!=n.document.body){i=e();o=new rf(t).excludeScrollbarsAndBorders();if(!o.contains(i)){if(vf(i,o)){t.scrollTop-=o.top-i.top}else if(_f(i,o)){t.scrollTop+=i.bottom-o.bottom}if(yf(i,o)){t.scrollLeft-=o.left-i.left}else if(xf(i,o)){t.scrollLeft+=i.right-o.right}}t=t.parentNode}}function _f(t,e){return t.bottom>e.bottom}function vf(t,e){return t.top<e.top}function yf(t,e){return t.left<e.left}function xf(t,e){return t.right>e.right}function Ef(t){if(ef(t)){return t.startContainer.ownerDocument.defaultView}else{return t.ownerDocument.defaultView}}function Df(t){if(ef(t)){let e=t.commonAncestorContainer;if(Pd(e)){e=e.parentNode}return e}else{return t.parentNode}}function Sf(t,e){const n=Ef(t);const o=new rf(t);if(n===e){return o}else{let t=n;while(t!=e){const e=t.frameElement;const n=new rf(e).excludeScrollbarsAndBorders();o.moveBy(n.left,n.top);t=t.parent}}return o}class Bf{constructor(t){this.document=new Ol(t);this.domConverter=new du(this.document);this.domRoots=new Map;this.set("isRenderingInProgress",false);this.set("hasDomSelection",false);this._renderer=new Qd(this.domConverter,this.document.selection);this._renderer.bind("isFocused").to(this.document);this._initialDomRootAttributes=new WeakMap;this._observers=new Map;this._ongoingChange=false;this._postFixersInProgress=false;this._renderingDisabled=false;this._hasChangedSinceTheLastRendering=false;this._writer=new wd(this.document);this.addObserver(Ch);this.addObserver(Wh);this.addObserver(Gh);this.addObserver(vh);this.addObserver(jh);this.addObserver(Uh);this.addObserver(pf);if(Wl.isAndroid){this.addObserver($h)}Vd(this);hd(this);this.on("render",(()=>{this._render();this.document.fire("layoutChanged");this._hasChangedSinceTheLastRendering=false}));this.listenTo(this.document.selection,"change",(()=>{this._hasChangedSinceTheLastRendering=true}))}attachDomRoot(t,e="main"){const n=this.document.getRoot(e);n._name=t.tagName.toLowerCase();const o={};for(const{name:e,value:i}of Array.from(t.attributes)){o[e]=i;if(e==="class"){this._writer.addClass(i.split(" "),n)}else{this._writer.setAttribute(e,i,n)}}this._initialDomRootAttributes.set(t,o);const i=()=>{this._writer.setAttribute("contenteditable",!n.isReadOnly,n);if(n.isReadOnly){this._writer.addClass("ck-read-only",n)}else{this._writer.removeClass("ck-read-only",n)}};i();this.domRoots.set(e,t);this.domConverter.bindElements(t,n);this._renderer.markToSync("children",n);this._renderer.markToSync("attributes",n);this._renderer.domDocuments.add(t.ownerDocument);n.on("change:children",((t,e)=>this._renderer.markToSync("children",e)));n.on("change:attributes",((t,e)=>this._renderer.markToSync("attributes",e)));n.on("change:text",((t,e)=>this._renderer.markToSync("text",e)));n.on("change:isReadOnly",(()=>this.change(i)));n.on("change",(()=>{this._hasChangedSinceTheLastRendering=true}));for(const n of this._observers.values()){n.observe(t,e)}}detachDomRoot(t){const e=this.domRoots.get(t);Array.from(e.attributes).forEach((({name:t})=>e.removeAttribute(t)));const n=this._initialDomRootAttributes.get(e);for(const t in n){e.setAttribute(t,n[t])}this.domRoots.delete(t);this.domConverter.unbindDomElement(e)}getDomRoot(t="main"){return this.domRoots.get(t)}addObserver(t){let e=this._observers.get(t);if(e){return e}e=new t(this);this._observers.set(t,e);for(const[t,n]of this.domRoots){e.observe(n,t)}e.enable();return e}getObserver(t){return this._observers.get(t)}disableObservers(){for(const t of this._observers.values()){t.disable()}}enableObservers(){for(const t of this._observers.values()){t.enable()}}scrollToTheSelection(){const t=this.document.selection.getFirstRange();if(t){kf({target:this.domConverter.viewRangeToDom(t),viewportOffset:20})}}focus(){if(!this.document.isFocused){const t=this.document.selection.editableElement;if(t){this.domConverter.focus(t);this.forceRender()}else{}}}change(t){if(this.isRenderingInProgress||this._postFixersInProgress){throw new u["a"]("cannot-change-view-tree",this)}try{if(this._ongoingChange){return t(this._writer)}this._ongoingChange=true;const e=t(this._writer);this._ongoingChange=false;if(!this._renderingDisabled&&this._hasChangedSinceTheLastRendering){this._postFixersInProgress=true;this.document._callPostFixers(this._writer);this._postFixersInProgress=false;this.fire("render")}return e}catch(t){u["a"].rethrowUnexpectedError(t,this)}}forceRender(){this._hasChangedSinceTheLastRendering=true;this.change((()=>{}))}destroy(){for(const t of this._observers.values()){t.destroy()}this.document.destroy();this.stopListening()}createPositionAt(t,e){return Al._createAt(t,e)}createPositionAfter(t){return Al._createAfter(t)}createPositionBefore(t){return Al._createBefore(t)}createRange(t,e){return new _l(t,e)}createRangeOn(t){return _l._createOn(t)}createRangeIn(t){return _l._createIn(t)}createSelection(t,e,n){return new xl(t,e,n)}_disableRendering(t){this._renderingDisabled=t;if(t==false){this.change((()=>{}))}}_render(){this.isRenderingInProgress=true;this.disableObservers();this._renderer.render();this.enableObservers();this.isRenderingInProgress=false}}Hn(Bf,Tn);class Tf{constructor(t){this.parent=null;this._attrs=La(t)}get index(){let t;if(!this.parent){return null}if((t=this.parent.getChildIndex(this))===null){throw new u["a"]("model-node-not-found-in-parent",this)}return t}get startOffset(){let t;if(!this.parent){return null}if((t=this.parent.getChildStartOffset(this))===null){throw new u["a"]("model-node-not-found-in-parent",this)}return t}get offsetSize(){return 1}get endOffset(){if(!this.parent){return null}return this.startOffset+this.offsetSize}get nextSibling(){const t=this.index;return t!==null&&this.parent.getChild(t+1)||null}get previousSibling(){const t=this.index;return t!==null&&this.parent.getChild(t-1)||null}get root(){let t=this;while(t.parent){t=t.parent}return t}isAttached(){return this.root.is("rootElement")}getPath(){const t=[];let e=this;while(e.parent){t.unshift(e.startOffset);e=e.parent}return t}getAncestors(t={includeSelf:false,parentFirst:false}){const e=[];let n=t.includeSelf?this:this.parent;while(n){e[t.parentFirst?"push":"unshift"](n);n=n.parent}return e}getCommonAncestor(t,e={}){const n=this.getAncestors(e);const o=t.getAncestors(e);let i=0;while(n[i]==o[i]&&n[i]){i++}return i===0?null:n[i-1]}isBefore(t){if(this==t){return false}if(this.root!==t.root){return false}const e=this.getPath();const n=t.getPath();const o=Ia(e,n);switch(o){case"prefix":return true;case"extension":return false;default:return e[o]<n[o]}}isAfter(t){if(this==t){return false}if(this.root!==t.root){return false}return!this.isBefore(t)}hasAttribute(t){return this._attrs.has(t)}getAttribute(t){return this._attrs.get(t)}getAttributes(){return this._attrs.entries()}getAttributeKeys(){return this._attrs.keys()}toJSON(){const t={};if(this._attrs.size){t.attributes=Array.from(this._attrs).reduce(((t,e)=>{t[e[0]]=e[1];return t}),{})}return t}is(t){return t==="node"||t==="model:node"}_clone(){return new Tf(this._attrs)}_remove(){this.parent._removeChildren(this.index)}_setAttribute(t,e){this._attrs.set(t,e)}_setAttributesTo(t){this._attrs=La(t)}_removeAttribute(t){return this._attrs.delete(t)}_clearAttributes(){this._attrs.clear()}}class Pf extends Tf{constructor(t,e){super(e);this._data=t||""}get offsetSize(){return this.data.length}get data(){return this._data}is(t){return t==="$text"||t==="model:$text"||t==="text"||t==="model:text"||t==="node"||t==="model:node"}toJSON(){const t=super.toJSON();t.data=this.data;return t}_clone(){return new Pf(this.data,this.getAttributes())}static fromJSON(t){return new Pf(t.data,t.attributes)}}class If{constructor(t,e,n){this.textNode=t;if(e<0||e>t.offsetSize){throw new u["a"]("model-textproxy-wrong-offsetintext",this)}if(n<0||e+n>t.offsetSize){throw new u["a"]("model-textproxy-wrong-length",this)}this.data=t.data.substring(e,e+n);this.offsetInText=e}get startOffset(){return this.textNode.startOffset!==null?this.textNode.startOffset+this.offsetInText:null}get offsetSize(){return this.data.length}get endOffset(){return this.startOffset!==null?this.startOffset+this.offsetSize:null}get isPartial(){return this.offsetSize!==this.textNode.offsetSize}get parent(){return this.textNode.parent}get root(){return this.textNode.root}is(t){return t==="$textProxy"||t==="model:$textProxy"||t==="textProxy"||t==="model:textProxy"}getPath(){const t=this.textNode.getPath();if(t.length>0){t[t.length-1]+=this.offsetInText}return t}getAncestors(t={includeSelf:false,parentFirst:false}){const e=[];let n=t.includeSelf?this:this.parent;while(n){e[t.parentFirst?"push":"unshift"](n);n=n.parent}return e}hasAttribute(t){return this.textNode.hasAttribute(t)}getAttribute(t){return this.textNode.getAttribute(t)}getAttributes(){return this.textNode.getAttributes()}getAttributeKeys(){return this.textNode.getAttributeKeys()}}class Rf{constructor(t){this._nodes=[];if(t){this._insertNodes(0,t)}}[Symbol.iterator](){return this._nodes[Symbol.iterator]()}get length(){return this._nodes.length}get maxOffset(){return this._nodes.reduce(((t,e)=>t+e.offsetSize),0)}getNode(t){return this._nodes[t]||null}getNodeIndex(t){const e=this._nodes.indexOf(t);return e==-1?null:e}getNodeStartOffset(t){const e=this.getNodeIndex(t);return e===null?null:this._nodes.slice(0,e).reduce(((t,e)=>t+e.offsetSize),0)}indexToOffset(t){if(t==this._nodes.length){return this.maxOffset}const e=this._nodes[t];if(!e){throw new u["a"]("model-nodelist-index-out-of-bounds",this)}return this.getNodeStartOffset(e)}offsetToIndex(t){let e=0;for(const n of this._nodes){if(t>=e&&t<e+n.offsetSize){return this.getNodeIndex(n)}e+=n.offsetSize}if(e!=t){throw new u["a"]("model-nodelist-offset-out-of-bounds",this,{offset:t,nodeList:this})}return this.length}_insertNodes(t,e){for(const t of e){if(!(t instanceof Tf)){throw new u["a"]("model-nodelist-insertnodes-not-node",this)}}this._nodes.splice(t,0,...e)}_removeNodes(t,e=1){return this._nodes.splice(t,e)}toJSON(){return this._nodes.map((t=>t.toJSON()))}}class Ff extends Tf{constructor(t,e,n){super(e);this.name=t;this._children=new Rf;if(n){this._insertChild(0,n)}}get childCount(){return this._children.length}get maxOffset(){return this._children.maxOffset}get isEmpty(){return this.childCount===0}is(t,e=null){if(!e){return t==="element"||t==="model:element"||t==="node"||t==="model:node"}return e===this.name&&(t==="element"||t==="model:element")}getChild(t){return this._children.getNode(t)}getChildren(){return this._children[Symbol.iterator]()}getChildIndex(t){return this._children.getNodeIndex(t)}getChildStartOffset(t){return this._children.getNodeStartOffset(t)}offsetToIndex(t){return this._children.offsetToIndex(t)}getNodeByPath(t){let e=this;for(const n of t){e=e.getChild(e.offsetToIndex(n))}return e}findAncestor(t,e={includeSelf:false}){let n=e.includeSelf?this:this.parent;while(n){if(n.name===t){return n}n=n.parent}return null}toJSON(){const t=super.toJSON();t.name=this.name;if(this._children.length>0){t.children=[];for(const e of this._children){t.children.push(e.toJSON())}}return t}_clone(t=false){const e=t?Array.from(this._children).map((t=>t._clone(true))):null;return new Ff(this.name,this.getAttributes(),e)}_appendChild(t){this._insertChild(this.childCount,t)}_insertChild(t,e){const n=zf(e);for(const t of n){if(t.parent!==null){t._remove()}t.parent=this}this._children._insertNodes(t,n)}_removeChildren(t,e=1){const n=this._children._removeNodes(t,e);for(const t of n){t.parent=null}return n}static fromJSON(t){let e=null;if(t.children){e=[];for(const n of t.children){if(n.name){e.push(Ff.fromJSON(n))}else{e.push(Pf.fromJSON(n))}}}return new Ff(t.name,t.attributes,e)}}function zf(t){if(typeof t=="string"){return[new Pf(t)]}if(!ba(t)){t=[t]}return Array.from(t).map((t=>{if(typeof t=="string"){return new Pf(t)}if(t instanceof If){return new Pf(t.data,t.getAttributes())}return t}))}class Of{constructor(t={}){if(!t.boundaries&&!t.startPosition){throw new u["a"]("model-tree-walker-no-start-position",null)}const e=t.direction||"forward";if(e!="forward"&&e!="backward"){throw new u["a"]("model-tree-walker-unknown-direction",t,{direction:e})}this.direction=e;this.boundaries=t.boundaries||null;if(t.startPosition){this.position=t.startPosition.clone()}else{this.position=Mf._createAt(this.boundaries[this.direction=="backward"?"end":"start"])}this.position.stickiness="toNone";this.singleCharacters=!!t.singleCharacters;this.shallow=!!t.shallow;this.ignoreElementEnd=!!t.ignoreElementEnd;this._boundaryStartParent=this.boundaries?this.boundaries.start.parent:null;this._boundaryEndParent=this.boundaries?this.boundaries.end.parent:null;this._visitedParent=this.position.parent}[Symbol.iterator](){return this}skip(t){let e,n,o,i;do{o=this.position;i=this._visitedParent;({done:e,value:n}=this.next())}while(!e&&t(n));if(!e){this.position=o;this._visitedParent=i}}next(){if(this.direction=="forward"){return this._next()}else{return this._previous()}}_next(){const t=this.position;const e=this.position.clone();const n=this._visitedParent;if(n.parent===null&&e.offset===n.maxOffset){return{done:true}}if(n===this._boundaryEndParent&&e.offset==this.boundaries.end.offset){return{done:true}}const o=e.parent;const i=Vf(e,o);const r=i?i:Lf(e,o,i);if(r instanceof Ff){if(!this.shallow){e.path.push(0);this._visitedParent=r}else{e.offset++}this.position=e;return Nf("elementStart",r,t,e,1)}else if(r instanceof Pf){let o;if(this.singleCharacters){o=1}else{let t=r.endOffset;if(this._boundaryEndParent==n&&this.boundaries.end.offset<t){t=this.boundaries.end.offset}o=t-e.offset}const i=e.offset-r.startOffset;const s=new If(r,i,o);e.offset+=o;this.position=e;return Nf("text",s,t,e,o)}else{e.path.pop();e.offset++;this.position=e;this._visitedParent=n.parent;if(this.ignoreElementEnd){return this._next()}else{return Nf("elementEnd",n,t,e)}}}_previous(){const t=this.position;const e=this.position.clone();const n=this._visitedParent;if(n.parent===null&&e.offset===0){return{done:true}}if(n==this._boundaryStartParent&&e.offset==this.boundaries.start.offset){return{done:true}}const o=e.parent;const i=Vf(e,o);const r=i?i:Hf(e,o,i);if(r instanceof Ff){e.offset--;if(!this.shallow){e.path.push(r.maxOffset);this.position=e;this._visitedParent=r;if(this.ignoreElementEnd){return this._previous()}else{return Nf("elementEnd",r,t,e)}}else{this.position=e;return Nf("elementStart",r,t,e,1)}}else if(r instanceof Pf){let o;if(this.singleCharacters){o=1}else{let t=r.startOffset;if(this._boundaryStartParent==n&&this.boundaries.start.offset>t){t=this.boundaries.start.offset}o=e.offset-t}const i=e.offset-r.startOffset;const s=new If(r,i-o,o);e.offset-=o;this.position=e;return Nf("text",s,t,e,o)}else{e.path.pop();this.position=e;this._visitedParent=n.parent;return Nf("elementStart",n,t,e,1)}}}function Nf(t,e,n,o,i){return{done:false,value:{type:t,item:e,previousPosition:n,nextPosition:o,length:i}}}class Mf{constructor(t,e,n="toNone"){if(!t.is("element")&&!t.is("documentFragment")){throw new u["a"]("model-position-root-invalid",t)}if(!(e instanceof Array)||e.length===0){throw new u["a"]("model-position-path-incorrect-format",t,{path:e})}if(t.is("rootElement")){e=e.slice()}else{e=[...t.getPath(),...e];t=t.root}this.root=t;this.path=e;this.stickiness=n}get offset(){return this.path[this.path.length-1]}set offset(t){this.path[this.path.length-1]=t}get parent(){let t=this.root;for(let e=0;e<this.path.length-1;e++){t=t.getChild(t.offsetToIndex(this.path[e]));if(!t){throw new u["a"]("model-position-path-incorrect",this,{position:this})}}if(t.is("$text")){throw new u["a"]("model-position-path-incorrect",this,{position:this})}return t}get index(){return this.parent.offsetToIndex(this.offset)}get textNode(){return Vf(this,this.parent)}get nodeAfter(){const t=this.parent;return Lf(this,t,Vf(this,t))}get nodeBefore(){const t=this.parent;return Hf(this,t,Vf(this,t))}get isAtStart(){return this.offset===0}get isAtEnd(){return this.offset==this.parent.maxOffset}compareWith(t){if(this.root!=t.root){return"different"}const e=Ia(this.path,t.path);switch(e){case"same":return"same";case"prefix":return"before";case"extension":return"after";default:return this.path[e]<t.path[e]?"before":"after"}}getLastMatchingPosition(t,e={}){e.startPosition=this;const n=new Of(e);n.skip(t);return n.position}getParentPath(){return this.path.slice(0,-1)}getAncestors(){const t=this.parent;if(t.is("documentFragment")){return[t]}else{return t.getAncestors({includeSelf:true})}}findAncestor(t){const e=this.parent;if(e.is("element")){return e.findAncestor(t,{includeSelf:true})}return null}getCommonPath(t){if(this.root!=t.root){return[]}const e=Ia(this.path,t.path);const n=typeof e=="string"?Math.min(this.path.length,t.path.length):e;return this.path.slice(0,n)}getCommonAncestor(t){const e=this.getAncestors();const n=t.getAncestors();let o=0;while(e[o]==n[o]&&e[o]){o++}return o===0?null:e[o-1]}getShiftedBy(t){const e=this.clone();const n=e.offset+t;e.offset=n<0?0:n;return e}isAfter(t){return this.compareWith(t)=="after"}isBefore(t){return this.compareWith(t)=="before"}isEqual(t){return this.compareWith(t)=="same"}isTouching(t){let e=null;let n=null;const o=this.compareWith(t);switch(o){case"same":return true;case"before":e=Mf._createAt(this);n=Mf._createAt(t);break;case"after":e=Mf._createAt(t);n=Mf._createAt(this);break;default:return false}let i=e.parent;while(e.path.length+n.path.length){if(e.isEqual(n)){return true}if(e.path.length>n.path.length){if(e.offset!==i.maxOffset){return false}e.path=e.path.slice(0,-1);i=i.parent;e.offset++}else{if(n.offset!==0){return false}n.path=n.path.slice(0,-1)}}}is(t){return t==="position"||t==="model:position"}hasSameParentAs(t){if(this.root!==t.root){return false}const e=this.getParentPath();const n=t.getParentPath();return Ia(e,n)=="same"}getTransformedByOperation(t){let e;switch(t.type){case"insert":e=this._getTransformedByInsertOperation(t);break;case"move":case"remove":case"reinsert":e=this._getTransformedByMoveOperation(t);break;case"split":e=this._getTransformedBySplitOperation(t);break;case"merge":e=this._getTransformedByMergeOperation(t);break;default:e=Mf._createAt(this);break}return e}_getTransformedByInsertOperation(t){return this._getTransformedByInsertion(t.position,t.howMany)}_getTransformedByMoveOperation(t){return this._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany)}_getTransformedBySplitOperation(t){const e=t.movedRange;const n=e.containsPosition(this)||e.start.isEqual(this)&&this.stickiness=="toNext";if(n){return this._getCombined(t.splitPosition,t.moveTargetPosition)}else{if(t.graveyardPosition){return this._getTransformedByMove(t.graveyardPosition,t.insertionPosition,1)}else{return this._getTransformedByInsertion(t.insertionPosition,1)}}}_getTransformedByMergeOperation(t){const e=t.movedRange;const n=e.containsPosition(this)||e.start.isEqual(this);let o;if(n){o=this._getCombined(t.sourcePosition,t.targetPosition);if(t.sourcePosition.isBefore(t.targetPosition)){o=o._getTransformedByDeletion(t.deletionPosition,1)}}else if(this.isEqual(t.deletionPosition)){o=Mf._createAt(t.deletionPosition)}else{o=this._getTransformedByMove(t.deletionPosition,t.graveyardPosition,1)}return o}_getTransformedByDeletion(t,e){const n=Mf._createAt(this);if(this.root!=t.root){return n}if(Ia(t.getParentPath(),this.getParentPath())=="same"){if(t.offset<this.offset){if(t.offset+e>this.offset){return null}else{n.offset-=e}}}else if(Ia(t.getParentPath(),this.getParentPath())=="prefix"){const o=t.path.length-1;if(t.offset<=this.path[o]){if(t.offset+e>this.path[o]){return null}else{n.path[o]-=e}}}return n}_getTransformedByInsertion(t,e){const n=Mf._createAt(this);if(this.root!=t.root){return n}if(Ia(t.getParentPath(),this.getParentPath())=="same"){if(t.offset<this.offset||t.offset==this.offset&&this.stickiness!="toPrevious"){n.offset+=e}}else if(Ia(t.getParentPath(),this.getParentPath())=="prefix"){const o=t.path.length-1;if(t.offset<=this.path[o]){n.path[o]+=e}}return n}_getTransformedByMove(t,e,n){e=e._getTransformedByDeletion(t,n);if(t.isEqual(e)){return Mf._createAt(this)}const o=this._getTransformedByDeletion(t,n);const i=o===null||t.isEqual(this)&&this.stickiness=="toNext"||t.getShiftedBy(n).isEqual(this)&&this.stickiness=="toPrevious";if(i){return this._getCombined(t,e)}else{return o._getTransformedByInsertion(e,n)}}_getCombined(t,e){const n=t.path.length-1;const o=Mf._createAt(e);o.stickiness=this.stickiness;o.offset=o.offset+this.path[n]-t.offset;o.path=[...o.path,...this.path.slice(n+1)];return o}toJSON(){return{root:this.root.toJSON(),path:Array.from(this.path),stickiness:this.stickiness}}clone(){return new this.constructor(this.root,this.path,this.stickiness)}static _createAt(t,e,n="toNone"){if(t instanceof Mf){return new Mf(t.root,t.path,t.stickiness)}else{const o=t;if(e=="end"){e=o.maxOffset}else if(e=="before"){return this._createBefore(o,n)}else if(e=="after"){return this._createAfter(o,n)}else if(e!==0&&!e){throw new u["a"]("model-createpositionat-offset-required",[this,t])}if(!o.is("element")&&!o.is("documentFragment")){throw new u["a"]("model-position-parent-incorrect",[this,t])}const i=o.getPath();i.push(e);return new this(o.root,i,n)}}static _createAfter(t,e){if(!t.parent){throw new u["a"]("model-position-after-root",[this,t],{root:t})}return this._createAt(t.parent,t.endOffset,e)}static _createBefore(t,e){if(!t.parent){throw new u["a"]("model-position-before-root",t,{root:t})}return this._createAt(t.parent,t.startOffset,e)}static fromJSON(t,e){if(t.root==="$graveyard"){const n=new Mf(e.graveyard,t.path);n.stickiness=t.stickiness;return n}if(!e.getRoot(t.root)){throw new u["a"]("model-position-fromjson-no-root",e,{rootName:t.root})}return new Mf(e.getRoot(t.root),t.path,t.stickiness)}}function Vf(t,e){const n=e.getChild(e.offsetToIndex(t.offset));if(n&&n.is("$text")&&n.startOffset<t.offset){return n}return null}function Lf(t,e,n){if(n!==null){return null}return e.getChild(e.offsetToIndex(t.offset))}function Hf(t,e,n){if(n!==null){return null}return e.getChild(e.offsetToIndex(t.offset)-1)}class Kf{constructor(t,e=null){this.start=Mf._createAt(t);this.end=e?Mf._createAt(e):Mf._createAt(t);this.start.stickiness=this.isCollapsed?"toNone":"toNext";this.end.stickiness=this.isCollapsed?"toNone":"toPrevious"}*[Symbol.iterator](){yield*new Of({boundaries:this,ignoreElementEnd:true})}get isCollapsed(){return this.start.isEqual(this.end)}get isFlat(){const t=this.start.getParentPath();const e=this.end.getParentPath();return Ia(t,e)=="same"}get root(){return this.start.root}containsPosition(t){return t.isAfter(this.start)&&t.isBefore(this.end)}containsRange(t,e=false){if(t.isCollapsed){e=false}const n=this.containsPosition(t.start)||e&&this.start.isEqual(t.start);const o=this.containsPosition(t.end)||e&&this.end.isEqual(t.end);return n&&o}containsItem(t){const e=Mf._createBefore(t);return this.containsPosition(e)||this.start.isEqual(e)}is(t){return t==="range"||t==="model:range"}isEqual(t){return this.start.isEqual(t.start)&&this.end.isEqual(t.end)}isIntersecting(t){return this.start.isBefore(t.end)&&this.end.isAfter(t.start)}getDifference(t){const e=[];if(this.isIntersecting(t)){if(this.containsPosition(t.start)){e.push(new Kf(this.start,t.start))}if(this.containsPosition(t.end)){e.push(new Kf(t.end,this.end))}}else{e.push(new Kf(this.start,this.end))}return e}getIntersection(t){if(this.isIntersecting(t)){let e=this.start;let n=this.end;if(this.containsPosition(t.start)){e=t.start}if(this.containsPosition(t.end)){n=t.end}return new Kf(e,n)}return null}getJoined(t,e=false){let n=this.isIntersecting(t);if(!n){if(this.start.isBefore(t.start)){n=e?this.end.isTouching(t.start):this.end.isEqual(t.start)}else{n=e?t.end.isTouching(this.start):t.end.isEqual(this.start)}}if(!n){return null}let o=this.start;let i=this.end;if(t.start.isBefore(o)){o=t.start}if(t.end.isAfter(i)){i=t.end}return new Kf(o,i)}getMinimalFlatRanges(){const t=[];const e=this.start.getCommonPath(this.end).length;const n=Mf._createAt(this.start);let o=n.parent;while(n.path.length>e+1){const e=o.maxOffset-n.offset;if(e!==0){t.push(new Kf(n,n.getShiftedBy(e)))}n.path=n.path.slice(0,-1);n.offset++;o=o.parent}while(n.path.length<=this.end.path.length){const e=this.end.path[n.path.length-1];const o=e-n.offset;if(o!==0){t.push(new Kf(n,n.getShiftedBy(o)))}n.offset=e;n.path.push(0)}return t}getWalker(t={}){t.boundaries=this;return new Of(t)}*getItems(t={}){t.boundaries=this;t.ignoreElementEnd=true;const e=new Of(t);for(const t of e){yield t.item}}*getPositions(t={}){t.boundaries=this;const e=new Of(t);yield e.position;for(const t of e){yield t.nextPosition}}getTransformedByOperation(t){switch(t.type){case"insert":return this._getTransformedByInsertOperation(t);case"move":case"remove":case"reinsert":return this._getTransformedByMoveOperation(t);case"split":return[this._getTransformedBySplitOperation(t)];case"merge":return[this._getTransformedByMergeOperation(t)]}return[new Kf(this.start,this.end)]}getTransformedByOperations(t){const e=[new Kf(this.start,this.end)];for(const n of t){for(let t=0;t<e.length;t++){const o=e[t].getTransformedByOperation(n);e.splice(t,1,...o);t+=o.length-1}}for(let t=0;t<e.length;t++){const n=e[t];for(let o=t+1;o<e.length;o++){const t=e[o];if(n.containsRange(t)||t.containsRange(n)||n.isEqual(t)){e.splice(o,1)}}}return e}getCommonAncestor(){return this.start.getCommonAncestor(this.end)}getContainedElement(){if(this.isCollapsed){return null}const t=this.start.nodeAfter;const e=this.end.nodeBefore;if(t&&t.is("element")&&t===e){return t}return null}toJSON(){return{start:this.start.toJSON(),end:this.end.toJSON()}}clone(){return new this.constructor(this.start,this.end)}_getTransformedByInsertOperation(t,e=false){return this._getTransformedByInsertion(t.position,t.howMany,e)}_getTransformedByMoveOperation(t,e=false){const n=t.sourcePosition;const o=t.howMany;const i=t.targetPosition;return this._getTransformedByMove(n,i,o,e)}_getTransformedBySplitOperation(t){const e=this.start._getTransformedBySplitOperation(t);let n=this.end._getTransformedBySplitOperation(t);if(this.end.isEqual(t.insertionPosition)){n=this.end.getShiftedBy(1)}if(e.root!=n.root){n=this.end.getShiftedBy(-1)}return new Kf(e,n)}_getTransformedByMergeOperation(t){if(this.start.isEqual(t.targetPosition)&&this.end.isEqual(t.deletionPosition)){return new Kf(this.start)}let e=this.start._getTransformedByMergeOperation(t);let n=this.end._getTransformedByMergeOperation(t);if(e.root!=n.root){n=this.end.getShiftedBy(-1)}if(e.isAfter(n)){if(t.sourcePosition.isBefore(t.targetPosition)){e=Mf._createAt(n);e.offset=0}else{if(!t.deletionPosition.isEqual(e)){n=t.deletionPosition}e=t.targetPosition}return new Kf(e,n)}return new Kf(e,n)}_getTransformedByInsertion(t,e,n=false){if(n&&this.containsPosition(t)){return[new Kf(this.start,t),new Kf(t.getShiftedBy(e),this.end._getTransformedByInsertion(t,e))]}else{const n=new Kf(this.start,this.end);n.start=n.start._getTransformedByInsertion(t,e);n.end=n.end._getTransformedByInsertion(t,e);return[n]}}_getTransformedByMove(t,e,n,o=false){if(this.isCollapsed){const o=this.start._getTransformedByMove(t,e,n);return[new Kf(o)]}const i=Kf._createFromPositionAndShift(t,n);const r=e._getTransformedByDeletion(t,n);if(this.containsPosition(e)&&!o){if(i.containsPosition(this.start)||i.containsPosition(this.end)){const o=this.start._getTransformedByMove(t,e,n);const i=this.end._getTransformedByMove(t,e,n);return[new Kf(o,i)]}}let s;const a=this.getDifference(i);let c=null;const l=this.getIntersection(i);if(a.length==1){c=new Kf(a[0].start._getTransformedByDeletion(t,n),a[0].end._getTransformedByDeletion(t,n))}else if(a.length==2){c=new Kf(this.start,this.end._getTransformedByDeletion(t,n))}if(c){s=c._getTransformedByInsertion(r,n,l!==null||o)}else{s=[]}if(l){const t=new Kf(l.start._getCombined(i.start,r),l.end._getCombined(i.start,r));if(s.length==2){s.splice(1,0,t)}else{s.push(t)}}return s}_getTransformedByDeletion(t,e){let n=this.start._getTransformedByDeletion(t,e);let o=this.end._getTransformedByDeletion(t,e);if(n==null&&o==null){return null}if(n==null){n=t}if(o==null){o=t}return new Kf(n,o)}static _createFromPositionAndShift(t,e){const n=t;const o=t.getShiftedBy(e);return e>0?new this(n,o):new this(o,n)}static _createIn(t){return new this(Mf._createAt(t,0),Mf._createAt(t,t.maxOffset))}static _createOn(t){return this._createFromPositionAndShift(Mf._createBefore(t),t.offsetSize)}static _createFromRanges(t){if(t.length===0){throw new u["a"]("range-create-from-ranges-empty-array",null)}else if(t.length==1){return t[0].clone()}const e=t[0];t.sort(((t,e)=>t.start.isAfter(e.start)?1:-1));const n=t.indexOf(e);const o=new this(e.start,e.end);if(n>0){for(let e=n-1;true;e++){if(t[e].end.isEqual(o.start)){o.start=Mf._createAt(t[e].start)}else{break}}}for(let e=n+1;e<t.length;e++){if(t[e].start.isEqual(o.end)){o.end=Mf._createAt(t[e].end)}else{break}}return o}static fromJSON(t,e){return new this(Mf.fromJSON(t.start,e),Mf.fromJSON(t.end,e))}}class qf{constructor(){this._modelToViewMapping=new WeakMap;this._viewToModelMapping=new WeakMap;this._viewToModelLengthCallbacks=new Map;this._markerNameToElements=new Map;this._elementToMarkerNames=new Map;this._unboundMarkerNames=new Set;this.on("modelToViewPosition",((t,e)=>{if(e.viewPosition){return}const n=this._modelToViewMapping.get(e.modelPosition.parent);e.viewPosition=this.findPositionIn(n,e.modelPosition.offset)}),{priority:"low"});this.on("viewToModelPosition",((t,e)=>{if(e.modelPosition){return}const n=this.findMappedViewAncestor(e.viewPosition);const o=this._viewToModelMapping.get(n);const i=this._toModelOffset(e.viewPosition.parent,e.viewPosition.offset,n);e.modelPosition=Mf._createAt(o,i)}),{priority:"low"})}bindElements(t,e){this._modelToViewMapping.set(t,e);this._viewToModelMapping.set(e,t)}unbindViewElement(t){const e=this.toModelElement(t);this._viewToModelMapping.delete(t);if(this._elementToMarkerNames.has(t)){for(const e of this._elementToMarkerNames.get(t)){this._unboundMarkerNames.add(e)}}if(this._modelToViewMapping.get(e)==t){this._modelToViewMapping.delete(e)}}unbindModelElement(t){const e=this.toViewElement(t);this._modelToViewMapping.delete(t);if(this._viewToModelMapping.get(e)==t){this._viewToModelMapping.delete(e)}}bindElementToMarker(t,e){const n=this._markerNameToElements.get(e)||new Set;n.add(t);const o=this._elementToMarkerNames.get(t)||new Set;o.add(e);this._markerNameToElements.set(e,n);this._elementToMarkerNames.set(t,o)}unbindElementFromMarkerName(t,e){const n=this._markerNameToElements.get(e);if(n){n.delete(t);if(n.size==0){this._markerNameToElements.delete(e)}}const o=this._elementToMarkerNames.get(t);if(o){o.delete(e);if(o.size==0){this._elementToMarkerNames.delete(t)}}}flushUnboundMarkerNames(){const t=Array.from(this._unboundMarkerNames);this._unboundMarkerNames.clear();return t}clearBindings(){this._modelToViewMapping=new WeakMap;this._viewToModelMapping=new WeakMap;this._markerNameToElements=new Map;this._elementToMarkerNames=new Map;this._unboundMarkerNames=new Set}toModelElement(t){return this._viewToModelMapping.get(t)}toViewElement(t){return this._modelToViewMapping.get(t)}toModelRange(t){return new Kf(this.toModelPosition(t.start),this.toModelPosition(t.end))}toViewRange(t){return new _l(this.toViewPosition(t.start),this.toViewPosition(t.end))}toModelPosition(t){const e={viewPosition:t,mapper:this};this.fire("viewToModelPosition",e);return e.modelPosition}toViewPosition(t,e={isPhantom:false}){const n={modelPosition:t,mapper:this,isPhantom:e.isPhantom};this.fire("modelToViewPosition",n);return n.viewPosition}markerNameToElements(t){const e=this._markerNameToElements.get(t);if(!e){return null}const n=new Set;for(const t of e){if(t.is("attributeElement")){for(const e of t.getElementsWithSameId()){n.add(e)}}else{n.add(t)}}return n}registerViewToModelLength(t,e){this._viewToModelLengthCallbacks.set(t,e)}findMappedViewAncestor(t){let e=t.parent;while(!this._viewToModelMapping.has(e)){e=e.parent}return e}_toModelOffset(t,e,n){if(n!=t){const o=this._toModelOffset(t.parent,t.index,n);const i=this._toModelOffset(t,e,t);return o+i}if(t.is("$text")){return e}let o=0;for(let n=0;n<e;n++){o+=this.getModelLength(t.getChild(n))}return o}getModelLength(t){if(this._viewToModelLengthCallbacks.get(t.name)){const e=this._viewToModelLengthCallbacks.get(t.name);return e(t)}else if(this._viewToModelMapping.has(t)){return 1}else if(t.is("$text")){return t.data.length}else if(t.is("uiElement")){return 0}else{let e=0;for(const n of t.getChildren()){e+=this.getModelLength(n)}return e}}findPositionIn(t,e){let n;let o=0;let i=0;let r=0;if(t.is("$text")){return new Al(t,e)}while(i<e){n=t.getChild(r);o=this.getModelLength(n);i+=o;r++}if(i==e){return this._moveViewPositionToTextNode(new Al(t,r))}else{return this.findPositionIn(n,e-(i-o))}}_moveViewPositionToTextNode(t){const e=t.nodeBefore;const n=t.nodeAfter;if(e instanceof Na){return new Al(e,e.data.length)}else if(n instanceof Na){return new Al(n,0)}return t}}Hn(qf,g);class jf{constructor(){this._consumable=new Map;this._textProxyRegistry=new Map}add(t,e){e=Wf(e);if(t instanceof If){t=this._getSymbolForTextProxy(t)}if(!this._consumable.has(t)){this._consumable.set(t,new Map)}this._consumable.get(t).set(e,true)}consume(t,e){e=Wf(e);if(t instanceof If){t=this._getSymbolForTextProxy(t)}if(this.test(t,e)){this._consumable.get(t).set(e,false);return true}else{return false}}test(t,e){e=Wf(e);if(t instanceof If){t=this._getSymbolForTextProxy(t)}const n=this._consumable.get(t);if(n===undefined){return null}const o=n.get(e);if(o===undefined){return null}return o}revert(t,e){e=Wf(e);if(t instanceof If){t=this._getSymbolForTextProxy(t)}const n=this.test(t,e);if(n===false){this._consumable.get(t).set(e,true);return true}else if(n===true){return false}return null}_getSymbolForTextProxy(t){let e=null;const n=this._textProxyRegistry.get(t.startOffset);if(n){const o=n.get(t.endOffset);if(o){e=o.get(t.parent)}}if(!e){e=this._addSymbolForTextProxy(t.startOffset,t.endOffset,t.parent)}return e}_addSymbolForTextProxy(t,e,n){const o=Symbol("textProxySymbol");let i,r;i=this._textProxyRegistry.get(t);if(!i){i=new Map;this._textProxyRegistry.set(t,i)}r=i.get(e);if(!r){r=new Map;i.set(e,r)}r.set(n,o);return o}}function Wf(t){const e=t.split(":");return e.length>1?e[0]+":"+e[1]:e[0]}class Gf{constructor(t){this.conversionApi=Object.assign({dispatcher:this},t);this._reconversionEventsMapping=new Map}convertChanges(t,e,n){for(const e of t.getMarkersToRemove()){this.convertMarkerRemove(e.name,e.range,n)}const o=this._mapChangesWithAutomaticReconversion(t);for(const t of o){if(t.type==="insert"){this.convertInsert(Kf._createFromPositionAndShift(t.position,t.length),n)}else if(t.type==="remove"){this.convertRemove(t.position,t.length,t.name,n)}else if(t.type==="reconvert"){this.reconvertElement(t.element,n)}else{this.convertAttribute(t.range,t.attributeKey,t.attributeOldValue,t.attributeNewValue,n)}}for(const t of this.conversionApi.mapper.flushUnboundMarkerNames()){const o=e.get(t).getRange();this.convertMarkerRemove(t,o,n);this.convertMarkerAdd(t,o,n)}for(const e of t.getMarkersToAdd()){this.convertMarkerAdd(e.name,e.range,n)}}convertInsert(t,e){this.conversionApi.writer=e;this.conversionApi.consumable=this._createInsertConsumable(t);for(const e of Array.from(t).map(Jf)){this._convertInsertWithAttributes(e)}this._clearConversionApi()}convertRemove(t,e,n,o){this.conversionApi.writer=o;this.fire("remove:"+n,{position:t,length:e},this.conversionApi);this._clearConversionApi()}convertAttribute(t,e,n,o,i){this.conversionApi.writer=i;this.conversionApi.consumable=this._createConsumableForRange(t,`attribute:${e}`);for(const i of t){const t=i.item;const r=Kf._createFromPositionAndShift(i.previousPosition,i.length);const s={item:t,range:r,attributeKey:e,attributeOldValue:n,attributeNewValue:o};this._testAndFire(`attribute:${e}`,s)}this._clearConversionApi()}reconvertElement(t,e){const n=Kf._createOn(t);this.conversionApi.writer=e;this.conversionApi.consumable=this._createInsertConsumable(n);const o=this.conversionApi.mapper;const i=o.toViewElement(t);e.remove(i);this._convertInsertWithAttributes({item:t,range:n});const r=o.toViewElement(t);for(const n of Kf._createIn(t)){const{item:t}=n;const i=Yf(t,o);if(i){if(i.root!==r.root){e.move(e.createRangeOn(i),o.toViewPosition(Mf._createBefore(t)))}}else{this._convertInsertWithAttributes(Jf(n))}}o.unbindViewElement(i);this._clearConversionApi()}convertSelection(t,e,n){const o=Array.from(e.getMarkersAtPosition(t.getFirstPosition()));this.conversionApi.writer=n;this.conversionApi.consumable=this._createSelectionConsumable(t,o);this.fire("selection",{selection:t},this.conversionApi);if(!t.isCollapsed){return}for(const e of o){const n=e.getRange();if(!Uf(t.getFirstPosition(),e,this.conversionApi.mapper)){continue}const o={item:t,markerName:e.name,markerRange:n};if(this.conversionApi.consumable.test(t,"addMarker:"+e.name)){this.fire("addMarker:"+e.name,o,this.conversionApi)}}for(const e of t.getAttributeKeys()){const n={item:t,range:t.getFirstRange(),attributeKey:e,attributeOldValue:null,attributeNewValue:t.getAttribute(e)};if(this.conversionApi.consumable.test(t,"attribute:"+n.attributeKey)){this.fire("attribute:"+n.attributeKey+":$text",n,this.conversionApi)}}this._clearConversionApi()}convertMarkerAdd(t,e,n){if(!e.root.document||e.root.rootName=="$graveyard"){return}this.conversionApi.writer=n;const o="addMarker:"+t;const i=new jf;i.add(e,o);this.conversionApi.consumable=i;this.fire(o,{markerName:t,markerRange:e},this.conversionApi);if(!i.test(e,o)){return}this.conversionApi.consumable=this._createConsumableForRange(e,o);for(const n of e.getItems()){if(!this.conversionApi.consumable.test(n,o)){continue}const i={item:n,range:Kf._createOn(n),markerName:t,markerRange:e};this.fire(o,i,this.conversionApi)}this._clearConversionApi()}convertMarkerRemove(t,e,n){if(!e.root.document||e.root.rootName=="$graveyard"){return}this.conversionApi.writer=n;this.fire("removeMarker:"+t,{markerName:t,markerRange:e},this.conversionApi);this._clearConversionApi()}_mapReconversionTriggerEvent(t,e){this._reconversionEventsMapping.set(e,t)}_createInsertConsumable(t){const e=new jf;for(const n of t){const t=n.item;e.add(t,"insert");for(const n of t.getAttributeKeys()){e.add(t,"attribute:"+n)}}return e}_createConsumableForRange(t,e){const n=new jf;for(const o of t.getItems()){n.add(o,e)}return n}_createSelectionConsumable(t,e){const n=new jf;n.add(t,"selection");for(const o of e){n.add(t,"addMarker:"+o.name)}for(const e of t.getAttributeKeys()){n.add(t,"attribute:"+e)}return n}_testAndFire(t,e){if(!this.conversionApi.consumable.test(e.item,t)){return}this.fire($f(t,e),e,this.conversionApi)}_clearConversionApi(){delete this.conversionApi.writer;delete this.conversionApi.consumable}_convertInsertWithAttributes(t){this._testAndFire("insert",t);for(const e of t.item.getAttributeKeys()){t.attributeKey=e;t.attributeOldValue=null;t.attributeNewValue=t.item.getAttribute(e);this._testAndFire(`attribute:${e}`,t)}}_mapChangesWithAutomaticReconversion(t){const e=new Set;const n=[];for(const o of t.getChanges()){const t=o.position||o.range.start;const i=t.parent;const r=Vf(t,i);if(r){n.push(o);continue}const s=o.type==="attribute"?Lf(t,i,null):i;if(s.is("$text")){n.push(o);continue}let a;if(o.type==="attribute"){a=`attribute:${o.attributeKey}:${s.name}`}else{a=`${o.type}:${o.name}`}if(this._isReconvertTriggerEvent(a,s.name)){if(e.has(s)){continue}e.add(s);n.push({type:"reconvert",element:s})}else{n.push(o)}}return n}_isReconvertTriggerEvent(t,e){return this._reconversionEventsMapping.get(t)===e}}Hn(Gf,g);function Uf(t,e,n){const o=e.getRange();const i=Array.from(t.getAncestors());i.shift();i.reverse();const r=i.some((t=>{if(o.containsItem(t)){const e=n.toViewElement(t);return!!e.getCustomProperty("addHighlight")}}));return!r}function $f(t,e){const n=e.item.name||"$text";return`${t}:${n}`}function Jf(t){const e=t.item;const n=Kf._createFromPositionAndShift(t.previousPosition,t.length);return{item:e,range:n}}function Yf(t,e){if(t.is("textProxy")){const n=e.toViewPosition(Mf._createBefore(t));const o=n.parent;return o.is("$text")?o:null}return e.toViewElement(t)}class Qf{constructor(t,e,n){this._lastRangeBackward=false;this._ranges=[];this._attrs=new Map;if(t){this.setTo(t,e,n)}}get anchor(){if(this._ranges.length>0){const t=this._ranges[this._ranges.length-1];return this._lastRangeBackward?t.end:t.start}return null}get focus(){if(this._ranges.length>0){const t=this._ranges[this._ranges.length-1];return this._lastRangeBackward?t.start:t.end}return null}get isCollapsed(){const t=this._ranges.length;if(t===1){return this._ranges[0].isCollapsed}else{return false}}get rangeCount(){return this._ranges.length}get isBackward(){return!this.isCollapsed&&this._lastRangeBackward}isEqual(t){if(this.rangeCount!=t.rangeCount){return false}else if(this.rangeCount===0){return true}if(!this.anchor.isEqual(t.anchor)||!this.focus.isEqual(t.focus)){return false}for(const e of this._ranges){let n=false;for(const o of t._ranges){if(e.isEqual(o)){n=true;break}}if(!n){return false}}return true}*getRanges(){for(const t of this._ranges){yield new Kf(t.start,t.end)}}getFirstRange(){let t=null;for(const e of this._ranges){if(!t||e.start.isBefore(t.start)){t=e}}return t?new Kf(t.start,t.end):null}getLastRange(){let t=null;for(const e of this._ranges){if(!t||e.end.isAfter(t.end)){t=e}}return t?new Kf(t.start,t.end):null}getFirstPosition(){const t=this.getFirstRange();return t?t.start.clone():null}getLastPosition(){const t=this.getLastRange();return t?t.end.clone():null}setTo(t,e,n){if(t===null){this._setRanges([])}else if(t instanceof Qf){this._setRanges(t.getRanges(),t.isBackward)}else if(t&&typeof t.getRanges=="function"){this._setRanges(t.getRanges(),t.isBackward)}else if(t instanceof Kf){this._setRanges([t],!!e&&!!e.backward)}else if(t instanceof Mf){this._setRanges([new Kf(t)])}else if(t instanceof Tf){const o=!!n&&!!n.backward;let i;if(e=="in"){i=Kf._createIn(t)}else if(e=="on"){i=Kf._createOn(t)}else if(e!==undefined){i=new Kf(Mf._createAt(t,e))}else{throw new u["a"]("model-selection-setto-required-second-parameter",[this,t])}this._setRanges([i],o)}else if(ba(t)){this._setRanges(t,e&&!!e.backward)}else{throw new u["a"]("model-selection-setto-not-selectable",[this,t])}}_setRanges(t,e=false){t=Array.from(t);const n=t.some((e=>{if(!(e instanceof Kf)){throw new u["a"]("model-selection-set-ranges-not-range",[this,t])}return this._ranges.every((t=>!t.isEqual(e)))}));if(t.length===this._ranges.length&&!n){return}this._removeAllRanges();for(const e of t){this._pushRange(e)}this._lastRangeBackward=!!e;this.fire("change:range",{directChange:true})}setFocus(t,e){if(this.anchor===null){throw new u["a"]("model-selection-setfocus-no-ranges",[this,t])}const n=Mf._createAt(t,e);if(n.compareWith(this.focus)=="same"){return}const o=this.anchor;if(this._ranges.length){this._popRange()}if(n.compareWith(o)=="before"){this._pushRange(new Kf(n,o));this._lastRangeBackward=true}else{this._pushRange(new Kf(o,n));this._lastRangeBackward=false}this.fire("change:range",{directChange:true})}getAttribute(t){return this._attrs.get(t)}getAttributes(){return this._attrs.entries()}getAttributeKeys(){return this._attrs.keys()}hasAttribute(t){return this._attrs.has(t)}removeAttribute(t){if(this.hasAttribute(t)){this._attrs.delete(t);this.fire("change:attribute",{attributeKeys:[t],directChange:true})}}setAttribute(t,e){if(this.getAttribute(t)!==e){this._attrs.set(t,e);this.fire("change:attribute",{attributeKeys:[t],directChange:true})}}getSelectedElement(){if(this.rangeCount!==1){return null}return this.getFirstRange().getContainedElement()}is(t){return t==="selection"||t==="model:selection"}*getSelectedBlocks(){const t=new WeakSet;for(const e of this.getRanges()){const n=tm(e.start,t);if(n&&em(n,e)){yield n}for(const n of e.getWalker()){const o=n.item;if(n.type=="elementEnd"&&Zf(o,t,e)){yield o}}const o=tm(e.end,t);if(o&&!e.end.isTouching(Mf._createAt(o,0))&&em(o,e)){yield o}}}containsEntireContent(t=this.anchor.root){const e=Mf._createAt(t,0);const n=Mf._createAt(t,"end");return e.isTouching(this.getFirstPosition())&&n.isTouching(this.getLastPosition())}_pushRange(t){this._checkRange(t);this._ranges.push(new Kf(t.start,t.end))}_checkRange(t){for(let e=0;e<this._ranges.length;e++){if(t.isIntersecting(this._ranges[e])){throw new u["a"]("model-selection-range-intersects",[this,t],{addedRange:t,intersectingRange:this._ranges[e]})}}}_removeAllRanges(){while(this._ranges.length>0){this._popRange()}}_popRange(){this._ranges.pop()}}Hn(Qf,g);function Xf(t,e){if(e.has(t)){return false}e.add(t);return t.root.document.model.schema.isBlock(t)&&t.parent}function Zf(t,e,n){return Xf(t,e)&&em(t,n)}function tm(t,e){const n=t.parent;const o=n.root.document.model.schema;const i=t.parent.getAncestors({parentFirst:true,includeSelf:true});let r=false;const s=i.find((t=>{if(r){return false}r=o.isLimit(t);return!r&&Xf(t,e)}));i.forEach((t=>e.add(t)));return s}function em(t,e){const n=nm(t);if(!n){return true}const o=e.containsRange(Kf._createOn(n),true);return!o}function nm(t){const e=t.root.document.model.schema;let n=t.parent;while(n){if(e.isBlock(n)){return n}n=n.parent}}class om extends Kf{constructor(t,e){super(t,e);im.call(this)}detach(){this.stopListening()}is(t){return t==="liveRange"||t==="model:liveRange"||t=="range"||t==="model:range"}toRange(){return new Kf(this.start,this.end)}static fromRange(t){return new om(t.start,t.end)}}function im(){this.listenTo(this.root.document.model,"applyOperation",((t,e)=>{const n=e[0];if(!n.isDocumentOperation){return}rm.call(this,n)}),{priority:"low"})}function rm(t){const e=this.getTransformedByOperation(t);const n=Kf._createFromRanges(e);const o=!n.isEqual(this);const i=sm(this,t);let r=null;if(o){if(n.root.rootName=="$graveyard"){if(t.type=="remove"){r=t.sourcePosition}else{r=t.deletionPosition}}const e=this.toRange();this.start=n.start;this.end=n.end;this.fire("change:range",e,{deletionPosition:r})}else if(i){this.fire("change:content",this.toRange(),{deletionPosition:r})}}function sm(t,e){switch(e.type){case"insert":return t.containsPosition(e.position);case"move":case"remove":case"reinsert":case"merge":return t.containsPosition(e.sourcePosition)||t.start.isEqual(e.sourcePosition)||t.containsPosition(e.targetPosition);case"split":return t.containsPosition(e.splitPosition)||t.containsPosition(e.insertionPosition)}return false}Hn(om,g);const am="selection:";class cm{constructor(t){this._selection=new lm(t);this._selection.delegate("change:range").to(this);this._selection.delegate("change:attribute").to(this);this._selection.delegate("change:marker").to(this)}get isCollapsed(){return this._selection.isCollapsed}get anchor(){return this._selection.anchor}get focus(){return this._selection.focus}get rangeCount(){return this._selection.rangeCount}get hasOwnRange(){return this._selection.hasOwnRange}get isBackward(){return this._selection.isBackward}get isGravityOverridden(){return this._selection.isGravityOverridden}get markers(){return this._selection.markers}get _ranges(){return this._selection._ranges}getRanges(){return this._selection.getRanges()}getFirstPosition(){return this._selection.getFirstPosition()}getLastPosition(){return this._selection.getLastPosition()}getFirstRange(){return this._selection.getFirstRange()}getLastRange(){return this._selection.getLastRange()}getSelectedBlocks(){return this._selection.getSelectedBlocks()}getSelectedElement(){return this._selection.getSelectedElement()}containsEntireContent(t){return this._selection.containsEntireContent(t)}destroy(){this._selection.destroy()}getAttributeKeys(){return this._selection.getAttributeKeys()}getAttributes(){return this._selection.getAttributes()}getAttribute(t){return this._selection.getAttribute(t)}hasAttribute(t){return this._selection.hasAttribute(t)}refresh(){this._selection._updateMarkers();this._selection._updateAttributes(false)}observeMarkers(t){this._selection.observeMarkers(t)}is(t){return t==="selection"||t=="model:selection"||t=="documentSelection"||t=="model:documentSelection"}_setFocus(t,e){this._selection.setFocus(t,e)}_setTo(t,e,n){this._selection.setTo(t,e,n)}_setAttribute(t,e){this._selection.setAttribute(t,e)}_removeAttribute(t){this._selection.removeAttribute(t)}_getStoredAttributes(){return this._selection._getStoredAttributes()}_overrideGravity(){return this._selection.overrideGravity()}_restoreGravity(t){this._selection.restoreGravity(t)}static _getStoreAttributeKey(t){return am+t}static _isStoreAttributeKey(t){return t.startsWith(am)}}Hn(cm,g);class lm extends Qf{constructor(t){super();this.markers=new ka({idProperty:"name"});this._model=t.model;this._document=t;this._attributePriority=new Map;this._selectionRestorePosition=null;this._hasChangedRange=false;this._overriddenGravityRegister=new Set;this._observedMarkers=new Set;this.listenTo(this._model,"applyOperation",((t,e)=>{const n=e[0];if(!n.isDocumentOperation||n.type=="marker"||n.type=="rename"||n.type=="noop"){return}if(this._ranges.length==0&&this._selectionRestorePosition){this._fixGraveyardSelection(this._selectionRestorePosition)}this._selectionRestorePosition=null;if(this._hasChangedRange){this._hasChangedRange=false;this.fire("change:range",{directChange:false})}}),{priority:"lowest"});this.on("change:range",(()=>{for(const t of this.getRanges()){if(!this._document._validateSelectionRange(t)){throw new u["a"]("document-selection-wrong-position",this,{range:t})}}}));this.listenTo(this._model.markers,"update",((t,e,n,o)=>{this._updateMarker(e,o)}));this.listenTo(this._document,"change",((t,e)=>{um(this._model,e)}))}get isCollapsed(){const t=this._ranges.length;return t===0?this._document._getDefaultRange().isCollapsed:super.isCollapsed}get anchor(){return super.anchor||this._document._getDefaultRange().start}get focus(){return super.focus||this._document._getDefaultRange().end}get rangeCount(){return this._ranges.length?this._ranges.length:1}get hasOwnRange(){return this._ranges.length>0}get isGravityOverridden(){return!!this._overriddenGravityRegister.size}destroy(){for(let t=0;t<this._ranges.length;t++){this._ranges[t].detach()}this.stopListening()}*getRanges(){if(this._ranges.length){yield*super.getRanges()}else{yield this._document._getDefaultRange()}}getFirstRange(){return super.getFirstRange()||this._document._getDefaultRange()}getLastRange(){return super.getLastRange()||this._document._getDefaultRange()}setTo(t,e,n){super.setTo(t,e,n);this._updateAttributes(true);this._updateMarkers()}setFocus(t,e){super.setFocus(t,e);this._updateAttributes(true);this._updateMarkers()}setAttribute(t,e){if(this._setAttribute(t,e)){const e=[t];this.fire("change:attribute",{attributeKeys:e,directChange:true})}}removeAttribute(t){if(this._removeAttribute(t)){const e=[t];this.fire("change:attribute",{attributeKeys:e,directChange:true})}}overrideGravity(){const t=a();this._overriddenGravityRegister.add(t);if(this._overriddenGravityRegister.size===1){this._updateAttributes(true)}return t}restoreGravity(t){if(!this._overriddenGravityRegister.has(t)){throw new u["a"]("document-selection-gravity-wrong-restore",this,{uid:t})}this._overriddenGravityRegister.delete(t);if(!this.isGravityOverridden){this._updateAttributes(true)}}observeMarkers(t){this._observedMarkers.add(t);this._updateMarkers()}_popRange(){this._ranges.pop().detach()}_pushRange(t){const e=this._prepareRange(t);if(e){this._ranges.push(e)}}_prepareRange(t){this._checkRange(t);if(t.root==this._document.graveyard){return}const e=om.fromRange(t);e.on("change:range",((t,n,o)=>{this._hasChangedRange=true;if(e.root==this._document.graveyard){this._selectionRestorePosition=o.deletionPosition;const t=this._ranges.indexOf(e);this._ranges.splice(t,1);e.detach()}}));return e}_updateMarkers(){if(!this._observedMarkers.size){return}const t=[];let e=false;for(const e of this._model.markers){const n=e.name.split(":",1)[0];if(!this._observedMarkers.has(n)){continue}const o=e.getRange();for(const n of this.getRanges()){if(o.containsRange(n,!n.isCollapsed)){t.push(e)}}}const n=Array.from(this.markers);for(const n of t){if(!this.markers.has(n)){this.markers.add(n);e=true}}for(const n of Array.from(this.markers)){if(!t.includes(n)){this.markers.remove(n);e=true}}if(e){this.fire("change:marker",{oldMarkers:n,directChange:false})}}_updateMarker(t,e){const n=t.name.split(":",1)[0];if(!this._observedMarkers.has(n)){return}let o=false;const i=Array.from(this.markers);const r=this.markers.has(t);if(!e){if(r){this.markers.remove(t);o=true}}else{let n=false;for(const t of this.getRanges()){if(e.containsRange(t,!t.isCollapsed)){n=true;break}}if(n&&!r){this.markers.add(t);o=true}else if(!n&&r){this.markers.remove(t);o=true}}if(o){this.fire("change:marker",{oldMarkers:i,directChange:false})}}_updateAttributes(t){const e=La(this._getSurroundingAttributes());const n=La(this.getAttributes());if(t){this._attributePriority=new Map;this._attrs=new Map}else{for(const[t,e]of this._attributePriority){if(e=="low"){this._attrs.delete(t);this._attributePriority.delete(t)}}}this._setAttributesTo(e);const o=[];for(const[t,e]of this.getAttributes()){if(!n.has(t)||n.get(t)!==e){o.push(t)}}for(const[t]of n){if(!this.hasAttribute(t)){o.push(t)}}if(o.length>0){this.fire("change:attribute",{attributeKeys:o,directChange:false})}}_setAttribute(t,e,n=true){const o=n?"normal":"low";if(o=="low"&&this._attributePriority.get(t)=="normal"){return false}const i=super.getAttribute(t);if(i===e){return false}this._attrs.set(t,e);this._attributePriority.set(t,o);return true}_removeAttribute(t,e=true){const n=e?"normal":"low";if(n=="low"&&this._attributePriority.get(t)=="normal"){return false}this._attributePriority.set(t,n);if(!super.hasAttribute(t)){return false}this._attrs.delete(t);return true}_setAttributesTo(t){const e=new Set;for(const[e,n]of this.getAttributes()){if(t.get(e)===n){continue}this._removeAttribute(e,false)}for(const[n,o]of t){const t=this._setAttribute(n,o,false);if(t){e.add(n)}}return e}*_getStoredAttributes(){const t=this.getFirstPosition().parent;if(this.isCollapsed&&t.isEmpty){for(const e of t.getAttributeKeys()){if(e.startsWith(am)){const n=e.substr(am.length);yield[n,t.getAttribute(e)]}}}}_getSurroundingAttributes(){const t=this.getFirstPosition();const e=this._model.schema;let n=null;if(!this.isCollapsed){const t=this.getFirstRange();for(const o of t){if(o.item.is("element")&&e.isObject(o.item)){break}if(o.type=="text"){n=o.item.getAttributes();break}}}else{const o=t.textNode?t.textNode:t.nodeBefore;const i=t.textNode?t.textNode:t.nodeAfter;if(!this.isGravityOverridden){n=dm(o)}if(!n){n=dm(i)}if(!this.isGravityOverridden&&!n){let t=o;while(t&&!e.isInline(t)&&!n){t=t.previousSibling;n=dm(t)}}if(!n){let t=i;while(t&&!e.isInline(t)&&!n){t=t.nextSibling;n=dm(t)}}if(!n){n=this._getStoredAttributes()}}return n}_fixGraveyardSelection(t){const e=this._model.schema.getNearestSelectionRange(t);if(e){this._pushRange(e)}}}function dm(t){if(t instanceof If||t instanceof Pf){return t.getAttributes()}return null}function um(t,e){const n=t.document.differ;for(const o of n.getChanges()){if(o.type!="insert"){continue}const n=o.position.parent;const i=o.length===n.maxOffset;if(i){t.enqueueChange(e,(t=>{const e=Array.from(n.getAttributeKeys()).filter((t=>t.startsWith(am)));for(const o of e){t.removeAttribute(o,n)}}))}}}class hm{constructor(t){this._dispatchers=t}add(t){for(const e of this._dispatchers){t(e)}return this}}var fm=1,mm=4;function gm(t){return aa(t,fm|mm)}var pm=gm;class bm extends hm{elementToElement(t){return this.add(Nm(t))}attributeToElement(t){return this.add(Mm(t))}attributeToAttribute(t){return this.add(Vm(t))}markerToElement(t){return this.add(Lm(t))}markerToHighlight(t){return this.add(Km(t))}markerToData(t){return this.add(Hm(t))}}function km(){return(t,e,n)=>{if(!n.consumable.consume(e.item,"insert")){return}const o=n.writer;const i=n.mapper.toViewPosition(e.range.start);const r=o.createText(e.item.data);o.insert(i,r)}}function wm(){return(t,e,n)=>{const o=n.mapper.toViewPosition(e.position);const i=e.position.getShiftedBy(e.length);const r=n.mapper.toViewPosition(i,{isPhantom:true});const s=n.writer.createRange(o,r);const a=n.writer.remove(s.getTrimmed());for(const t of n.writer.createRangeIn(a).getItems()){n.mapper.unbindViewElement(t)}}}function Cm(t,e){const n=t.createAttributeElement("span",e.attributes);if(e.classes){n._addClass(e.classes)}if(e.priority){n._priority=e.priority}n._id=e.id;return n}function Am(){return(t,e,n)=>{const o=e.selection;if(o.isCollapsed){return}if(!n.consumable.consume(o,"selection")){return}const i=[];for(const t of o.getRanges()){const e=n.mapper.toViewRange(t);i.push(e)}n.writer.setSelection(i,{backward:o.isBackward})}}function _m(){return(t,e,n)=>{const o=e.selection;if(!o.isCollapsed){return}if(!n.consumable.consume(o,"selection")){return}const i=n.writer;const r=o.getFirstPosition();const s=n.mapper.toViewPosition(r);const a=i.breakAttributes(s);i.setSelection(a)}}function vm(){return(t,e,n)=>{const o=n.writer;const i=o.document.selection;for(const t of i.getRanges()){if(t.isCollapsed){if(t.end.parent.isAttached()){n.writer.mergeAttributes(t.start)}}}o.setSelection(null)}}function ym(t){return(e,n,o)=>{const i=t(n.attributeOldValue,o);const r=t(n.attributeNewValue,o);if(!i&&!r){return}if(!o.consumable.consume(n.item,e.name)){return}const s=o.writer;const a=s.document.selection;if(n.item instanceof Qf||n.item instanceof cm){s.wrap(a.getFirstRange(),r)}else{let t=o.mapper.toViewRange(n.range);if(n.attributeOldValue!==null&&i){t=s.unwrap(t,i)}if(n.attributeNewValue!==null&&r){s.wrap(t,r)}}}}function xm(t){return(e,n,o)=>{const i=t(n.item,o);if(!i){return}if(!o.consumable.consume(n.item,"insert")){return}const r=o.mapper.toViewPosition(n.range.start);o.mapper.bindElements(n.item,i);o.writer.insert(r,i)}}function Em(t){return(e,n,o)=>{n.isOpening=true;const i=t(n,o);n.isOpening=false;const r=t(n,o);if(!i||!r){return}const s=n.markerRange;if(s.isCollapsed&&!o.consumable.consume(s,e.name)){return}for(const t of s){if(!o.consumable.consume(t.item,e.name)){return}}const a=o.mapper;const c=o.writer;c.insert(a.toViewPosition(s.start),i);o.mapper.bindElementToMarker(i,n.markerName);if(!s.isCollapsed){c.insert(a.toViewPosition(s.end),r);o.mapper.bindElementToMarker(r,n.markerName)}e.stop()}}function Dm(){return(t,e,n)=>{const o=n.mapper.markerNameToElements(e.markerName);if(!o){return}for(const t of o){n.mapper.unbindElementFromMarkerName(t,e.markerName);n.writer.clear(n.writer.createRangeOn(t),t)}n.writer.clearClonedElementsGroup(e.markerName);t.stop()}}function Sm(t){return(e,n,o)=>{const i=t(n.markerName,o);if(!i){return}const r=n.markerRange;if(!o.consumable.consume(r,e.name)){return}Bm(r,false,o,n,i);Bm(r,true,o,n,i);e.stop()}}function Bm(t,e,n,o,i){const r=e?t.start:t.end;const s=n.schema.checkChild(r,"$text");if(s){const t=n.mapper.toViewPosition(r);Pm(t,e,n,o,i)}else{let t;let s;if(e&&r.nodeAfter||!e&&!r.nodeBefore){t=r.nodeAfter;s=true}else{t=r.nodeBefore;s=false}const a=n.mapper.toViewElement(t);Tm(a,e,s,n,o,i)}}function Tm(t,e,n,o,i,r){const s=`data-${r.group}-${e?"start":"end"}-${n?"before":"after"}`;const a=t.hasAttribute(s)?t.getAttribute(s).split(","):[];a.unshift(r.name);o.writer.setAttribute(s,a.join(","),t);o.mapper.bindElementToMarker(t,i.markerName)}function Pm(t,e,n,o,i){const r=`${i.group}-${e?"start":"end"}`;const s=i.name?{name:i.name}:null;const a=n.writer.createUIElement(r,s);n.writer.insert(t,a);n.mapper.bindElementToMarker(a,o.markerName)}function Im(t){return(e,n,o)=>{const i=t(n.markerName,o);if(!i){return}const r=o.mapper.markerNameToElements(n.markerName);if(!r){return}for(const t of r){o.mapper.unbindElementFromMarkerName(t,n.markerName);if(t.is("containerElement")){s(`data-${i.group}-start-before`,t);s(`data-${i.group}-start-after`,t);s(`data-${i.group}-end-before`,t);s(`data-${i.group}-end-after`,t)}else{o.writer.clear(o.writer.createRangeOn(t),t)}}o.writer.clearClonedElementsGroup(n.markerName);e.stop();function s(t,e){if(e.hasAttribute(t)){const n=new Set(e.getAttribute(t).split(","));n.delete(i.name);if(n.size==0){o.writer.removeAttribute(t,e)}else{o.writer.setAttribute(t,Array.from(n).join(","),e)}}}}}function Rm(t){return(e,n,o)=>{const i=t(n.attributeOldValue,o);const r=t(n.attributeNewValue,o);if(!i&&!r){return}if(!o.consumable.consume(n.item,e.name)){return}const s=o.mapper.toViewElement(n.item);const a=o.writer;if(!s){throw new u["a"]("conversion-attribute-to-attribute-on-text",[n,o])}if(n.attributeOldValue!==null&&i){if(i.key=="class"){const t=Ca(i.value);for(const e of t){a.removeClass(e,s)}}else if(i.key=="style"){const t=Object.keys(i.value);for(const e of t){a.removeStyle(e,s)}}else{a.removeAttribute(i.key,s)}}if(n.attributeNewValue!==null&&r){if(r.key=="class"){const t=Ca(r.value);for(const e of t){a.addClass(e,s)}}else if(r.key=="style"){const t=Object.keys(r.value);for(const e of t){a.setStyle(e,r.value[e],s)}}else{a.setAttribute(r.key,r.value,s)}}}}function Fm(t){return(e,n,o)=>{if(!n.item){return}if(!(n.item instanceof Qf||n.item instanceof cm)&&!n.item.is("$textProxy")){return}const i=Um(t,n,o);if(!i){return}if(!o.consumable.consume(n.item,e.name)){return}const r=o.writer;const s=Cm(r,i);const a=r.document.selection;if(n.item instanceof Qf||n.item instanceof cm){r.wrap(a.getFirstRange(),s,a)}else{const t=o.mapper.toViewRange(n.range);const e=r.wrap(t,s);for(const t of e.getItems()){if(t.is("attributeElement")&&t.isSimilar(s)){o.mapper.bindElementToMarker(t,n.markerName);break}}}}}function zm(t){return(e,n,o)=>{if(!n.item){return}if(!(n.item instanceof Ff)){return}const i=Um(t,n,o);if(!i){return}if(!o.consumable.test(n.item,e.name)){return}const r=o.mapper.toViewElement(n.item);if(r&&r.getCustomProperty("addHighlight")){o.consumable.consume(n.item,e.name);for(const t of Kf._createIn(n.item)){o.consumable.consume(t.item,e.name)}r.getCustomProperty("addHighlight")(r,i,o.writer);o.mapper.bindElementToMarker(r,n.markerName)}}}function Om(t){return(e,n,o)=>{if(n.markerRange.isCollapsed){return}const i=Um(t,n,o);if(!i){return}const r=Cm(o.writer,i);const s=o.mapper.markerNameToElements(n.markerName);if(!s){return}for(const t of s){o.mapper.unbindElementFromMarkerName(t,n.markerName);if(t.is("attributeElement")){o.writer.unwrap(o.writer.createRangeOn(t),r)}else{t.getCustomProperty("removeHighlight")(t,i.id,o.writer)}}o.writer.clearClonedElementsGroup(n.markerName);e.stop()}}function Nm(t){t=pm(t);t.view=qm(t.view,"container");return e=>{e.on("insert:"+t.model,xm(t.view),{priority:t.converterPriority||"normal"});if(t.triggerBy){if(t.triggerBy.attributes){for(const n of t.triggerBy.attributes){e._mapReconversionTriggerEvent(t.model,`attribute:${n}:${t.model}`)}}if(t.triggerBy.children){for(const n of t.triggerBy.children){e._mapReconversionTriggerEvent(t.model,`insert:${n}`);e._mapReconversionTriggerEvent(t.model,`remove:${n}`)}}}}}function Mm(t){t=pm(t);const e=t.model.key?t.model.key:t.model;let n="attribute:"+e;if(t.model.name){n+=":"+t.model.name}if(t.model.values){for(const e of t.model.values){t.view[e]=qm(t.view[e],"attribute")}}else{t.view=qm(t.view,"attribute")}const o=Wm(t);return e=>{e.on(n,ym(o),{priority:t.converterPriority||"normal"})}}function Vm(t){t=pm(t);const e=t.model.key?t.model.key:t.model;let n="attribute:"+e;if(t.model.name){n+=":"+t.model.name}if(t.model.values){for(const e of t.model.values){t.view[e]=Gm(t.view[e])}}else{t.view=Gm(t.view)}const o=Wm(t);return e=>{e.on(n,Rm(o),{priority:t.converterPriority||"normal"})}}function Lm(t){t=pm(t);t.view=qm(t.view,"ui");return e=>{e.on("addMarker:"+t.model,Em(t.view),{priority:t.converterPriority||"normal"});e.on("removeMarker:"+t.model,Dm(t.view),{priority:t.converterPriority||"normal"})}}function Hm(t){t=pm(t);const e=t.model;if(!t.view){t.view=n=>({group:e,name:n.substr(t.model.length+1)})}return n=>{n.on("addMarker:"+e,Sm(t.view),{priority:t.converterPriority||"normal"});n.on("removeMarker:"+e,Im(t.view),{priority:t.converterPriority||"normal"})}}function Km(t){return e=>{e.on("addMarker:"+t.model,Fm(t.view),{priority:t.converterPriority||"normal"});e.on("addMarker:"+t.model,zm(t.view),{priority:t.converterPriority||"normal"});e.on("removeMarker:"+t.model,Om(t.view),{priority:t.converterPriority||"normal"})}}function qm(t,e){if(typeof t=="function"){return t}return(n,o)=>jm(t,o,e)}function jm(t,e,n){if(typeof t=="string"){t={name:t}}let o;const i=e.writer;const r=Object.assign({},t.attributes);if(n=="container"){o=i.createContainerElement(t.name,r)}else if(n=="attribute"){const e={priority:t.priority||Ml.DEFAULT_PRIORITY};o=i.createAttributeElement(t.name,r,e)}else{o=i.createUIElement(t.name,r)}if(t.styles){const e=Object.keys(t.styles);for(const n of e){i.setStyle(n,t.styles[n],o)}}if(t.classes){const e=t.classes;if(typeof e=="string"){i.addClass(e,o)}else{for(const t of e){i.addClass(t,o)}}}return o}function Wm(t){if(t.model.values){return(e,n)=>{const o=t.view[e];if(o){return o(e,n)}return null}}else{return t.view}}function Gm(t){if(typeof t=="string"){return e=>({key:t,value:e})}else if(typeof t=="object"){if(t.value){return()=>t}else{return e=>({key:t.key,value:e})}}else{return t}}function Um(t,e,n){const o=typeof t=="function"?t(e,n):t;if(!o){return null}if(!o.priority){o.priority=10}if(!o.id){o.id=e.markerName}return o}function $m(t){const{schema:e,document:n}=t.model;for(const o of n.getRootNames()){const i=n.getRoot(o);if(i.isEmpty&&!e.checkChild(i,"$text")){if(e.checkChild(i,"paragraph")){t.insertElement("paragraph",i);return true}}}return false}function Jm(t,e,n){const o=n.createContext(t);if(!n.checkChild(o,"paragraph")){return false}if(!n.checkChild(o.push("paragraph"),e)){return false}return true}function Ym(t,e){const n=e.createElement("paragraph");e.insert(n,t);return e.createPositionAt(n,0)}class Qm extends hm{elementToElement(t){return this.add(eg(t))}elementToAttribute(t){return this.add(ng(t))}attributeToAttribute(t){return this.add(og(t))}elementToMarker(t){Object(u["b"])("upcast-helpers-element-to-marker-deprecated");return this.add(ig(t))}dataToMarker(t){return this.add(rg(t))}}function Xm(){return(t,e,n)=>{if(!e.modelRange&&n.consumable.consume(e.viewItem,{name:true})){const{modelRange:t,modelCursor:o}=n.convertChildren(e.viewItem,e.modelCursor);e.modelRange=t;e.modelCursor=o}}}function Zm(){return(t,e,{schema:n,consumable:o,writer:i})=>{let r=e.modelCursor;if(!o.test(e.viewItem)){return}if(!n.checkChild(r,"$text")){if(!Jm(r,"$text",n)){return}r=Ym(r,i)}o.consume(e.viewItem);const s=i.createText(e.viewItem.data);i.insert(s,r);e.modelRange=i.createRange(r,r.getShiftedBy(s.offsetSize));e.modelCursor=e.modelRange.end}}function tg(t,e){return(n,o)=>{const i=o.newSelection;const r=[];for(const t of i.getRanges()){r.push(e.toModelRange(t))}const s=t.createSelection(r,{backward:i.isBackward});if(!s.isEqual(t.document.selection)){t.change((t=>{t.setSelection(s)}))}}}function eg(t){t=pm(t);const e=cg(t);const n=ag(t.view);const o=n?"element:"+n:"element";return n=>{n.on(o,e,{priority:t.converterPriority||"normal"})}}function ng(t){t=pm(t);ug(t);const e=hg(t,false);const n=ag(t.view);const o=n?"element:"+n:"element";return n=>{n.on(o,e,{priority:t.converterPriority||"low"})}}function og(t){t=pm(t);let e=null;if(typeof t.view=="string"||t.view.key){e=dg(t)}ug(t,e);const n=hg(t,true);return e=>{e.on("element",n,{priority:t.converterPriority||"low"})}}function ig(t){t=pm(t);gg(t);return eg(t)}function rg(t){t=pm(t);if(!t.model){t.model=e=>e?t.view+":"+e:t.view}const e=cg(pg(t,"start"));const n=cg(pg(t,"end"));return o=>{o.on("element:"+t.view+"-start",e,{priority:t.converterPriority||"normal"});o.on("element:"+t.view+"-end",n,{priority:t.converterPriority||"normal"});const i=l.get("low");const r=l.get("highest");const s=l.get(t.converterPriority)/r;o.on("element",sg(t),{priority:i+s})}}function sg(t){return(e,n,o)=>{const i=`data-${t.view}`;if(!n.modelRange){n=Object.assign(n,o.convertChildren(n.viewItem,n.modelCursor))}if(o.consumable.consume(n.viewItem,{attributes:i+"-end-after"})){r(n.modelRange.end,n.viewItem.getAttribute(i+"-end-after").split(","))}if(o.consumable.consume(n.viewItem,{attributes:i+"-start-after"})){r(n.modelRange.end,n.viewItem.getAttribute(i+"-start-after").split(","))}if(o.consumable.consume(n.viewItem,{attributes:i+"-end-before"})){r(n.modelRange.start,n.viewItem.getAttribute(i+"-end-before").split(","))}if(o.consumable.consume(n.viewItem,{attributes:i+"-start-before"})){r(n.modelRange.start,n.viewItem.getAttribute(i+"-start-before").split(","))}function r(e,i){for(const r of i){const i=t.model(r,o);const s=o.writer.createElement("$marker",{"data-name":i});o.writer.insert(s,e);if(n.modelCursor.isEqual(e)){n.modelCursor=n.modelCursor.getShiftedBy(1)}else{n.modelCursor=n.modelCursor._getTransformedByInsertion(e,1)}n.modelRange=n.modelRange._getTransformedByInsertion(e,1)[0]}}}}function ag(t){if(typeof t=="string"){return t}if(typeof t=="object"&&typeof t.name=="string"){return t.name}return null}function cg(t){const e=new Ha(t.view);return(n,o,i)=>{const r=e.match(o.viewItem);if(!r){return}const s=r.match;s.name=true;if(!i.consumable.test(o.viewItem,s)){return}const a=lg(t.model,o.viewItem,i);if(!a){return}if(!i.safeInsert(a,o.modelCursor)){return}i.consumable.consume(o.viewItem,s);i.convertChildren(o.viewItem,a);i.updateConversionResult(a,o)}}function lg(t,e,n){if(t instanceof Function){return t(e,n)}else{return n.writer.createElement(t)}}function dg(t){if(typeof t.view=="string"){t.view={key:t.view}}const e=t.view.key;let n;if(e=="class"||e=="style"){const o=e=="class"?"classes":"styles";n={[o]:t.view.value}}else{const o=typeof t.view.value=="undefined"?/[\s\S]*/:t.view.value;n={attributes:{[e]:o}}}if(t.view.name){n.name=t.view.name}t.view=n;return e}function ug(t,e=null){const n=e===null?true:t=>t.getAttribute(e);const o=typeof t.model!="object"?t.model:t.model.key;const i=typeof t.model!="object"||typeof t.model.value=="undefined"?n:t.model.value;t.model={key:o,value:i}}function hg(t,e){const n=new Ha(t.view);return(o,i,r)=>{const s=n.match(i.viewItem);if(!s){return}const a=t.model.key;const c=typeof t.model.value=="function"?t.model.value(i.viewItem,r):t.model.value;if(c===null){return}if(fg(t.view,i.viewItem)){s.match.name=true}else{delete s.match.name}if(!r.consumable.test(i.viewItem,s.match)){return}if(!i.modelRange){i=Object.assign(i,r.convertChildren(i.viewItem,i.modelCursor))}const l=mg(i.modelRange,{key:a,value:c},e,r);if(l){r.consumable.consume(i.viewItem,s.match)}}}function fg(t,e){const n=typeof t=="function"?t(e):t;if(typeof n=="object"&&!ag(n)){return false}return!n.classes&&!n.attributes&&!n.styles}function mg(t,e,n,o){let i=false;for(const r of Array.from(t.getItems({shallow:n}))){if(o.schema.checkAttribute(r,e.key)){o.writer.setAttribute(e.key,e.value,r);i=true}}return i}function gg(t){const e=t.model;t.model=(t,n)=>{const o=typeof e=="string"?e:e(t,n);return n.writer.createElement("$marker",{"data-name":o})}}function pg(t,e){const n={};n.view=t.view+"-"+e;n.model=(e,n)=>{const o=e.getAttribute("name");const i=t.model(o,n);return n.writer.createElement("$marker",{"data-name":i})};return n}class bg{constructor(t,e){this.model=t;this.view=new Bf(e);this.mapper=new qf;this.downcastDispatcher=new Gf({mapper:this.mapper,schema:t.schema});const n=this.model.document;const o=n.selection;const i=this.model.markers;this.listenTo(this.model,"_beforeChanges",(()=>{this.view._disableRendering(true)}),{priority:"highest"});this.listenTo(this.model,"_afterChanges",(()=>{this.view._disableRendering(false)}),{priority:"lowest"});this.listenTo(n,"change",(()=>{this.view.change((t=>{this.downcastDispatcher.convertChanges(n.differ,i,t);this.downcastDispatcher.convertSelection(o,i,t)}))}),{priority:"low"});this.listenTo(this.view.document,"selectionChange",tg(this.model,this.mapper));this.downcastDispatcher.on("insert:$text",km(),{priority:"lowest"});this.downcastDispatcher.on("remove",wm(),{priority:"low"});this.downcastDispatcher.on("selection",vm(),{priority:"low"});this.downcastDispatcher.on("selection",Am(),{priority:"low"});this.downcastDispatcher.on("selection",_m(),{priority:"low"});this.view.document.roots.bindTo(this.model.document.roots).using((t=>{if(t.rootName=="$graveyard"){return null}const e=new wl(this.view.document,t.name);e.rootName=t.rootName;this.mapper.bindElements(t,e);return e}))}destroy(){this.view.destroy();this.stopListening()}}Hn(bg,Tn);class kg{constructor(){this._commands=new Map}add(t,e){this._commands.set(t,e)}get(t){return this._commands.get(t)}execute(t,...e){const n=this.get(t);if(!n){throw new u["a"]("commandcollection-command-not-found",this,{commandName:t})}return n.execute(...e)}*names(){yield*this._commands.keys()}*commands(){yield*this._commands.values()}[Symbol.iterator](){return this._commands[Symbol.iterator]()}destroy(){for(const t of this.commands()){t.destroy()}}}class wg{constructor(){this._consumables=new Map}add(t,e){let n;if(t.is("$text")||t.is("documentFragment")){this._consumables.set(t,true);return}if(!this._consumables.has(t)){n=new Cg(t);this._consumables.set(t,n)}else{n=this._consumables.get(t)}n.add(e)}test(t,e){const n=this._consumables.get(t);if(n===undefined){return null}if(t.is("$text")||t.is("documentFragment")){return n}return n.test(e)}consume(t,e){if(this.test(t,e)){if(t.is("$text")||t.is("documentFragment")){this._consumables.set(t,false)}else{this._consumables.get(t).consume(e)}return true}return false}revert(t,e){const n=this._consumables.get(t);if(n!==undefined){if(t.is("$text")||t.is("documentFragment")){this._consumables.set(t,true)}else{n.revert(e)}}}static consumablesFromElement(t){const e={element:t,name:true,attributes:[],classes:[],styles:[]};const n=t.getAttributeKeys();for(const t of n){if(t=="style"||t=="class"){continue}e.attributes.push(t)}const o=t.getClassNames();for(const t of o){e.classes.push(t)}const i=t.getStyleNames();for(const t of i){e.styles.push(t)}return e}static createFrom(t,e){if(!e){e=new wg(t)}if(t.is("$text")){e.add(t);return e}if(t.is("element")){e.add(t,wg.consumablesFromElement(t))}if(t.is("documentFragment")){e.add(t)}for(const n of t.getChildren()){e=wg.createFrom(n,e)}return e}}class Cg{constructor(t){this.element=t;this._canConsumeName=null;this._consumables={attributes:new Map,styles:new Map,classes:new Map}}add(t){if(t.name){this._canConsumeName=true}for(const e in this._consumables){if(e in t){this._add(e,t[e])}}}test(t){if(t.name&&!this._canConsumeName){return this._canConsumeName}for(const e in this._consumables){if(e in t){const n=this._test(e,t[e]);if(n!==true){return n}}}return true}consume(t){if(t.name){this._canConsumeName=false}for(const e in this._consumables){if(e in t){this._consume(e,t[e])}}}revert(t){if(t.name){this._canConsumeName=true}for(const e in this._consumables){if(e in t){this._revert(e,t[e])}}}_add(t,e){const n=xe(e)?e:[e];const o=this._consumables[t];for(const e of n){if(t==="attributes"&&(e==="class"||e==="style")){throw new u["a"]("viewconsumable-invalid-attribute",this)}o.set(e,true);if(t==="styles"){for(const t of this.element.document.stylesProcessor.getRelatedStyles(e)){o.set(t,true)}}}}_test(t,e){const n=xe(e)?e:[e];const o=this._consumables[t];for(const e of n){if(t==="attributes"&&(e==="class"||e==="style")){const t=e=="class"?"classes":"styles";const n=this._test(t,[...this._consumables[t].keys()]);if(n!==true){return n}}else{const t=o.get(e);if(t===undefined){return null}if(!t){return false}}}return true}_consume(t,e){const n=xe(e)?e:[e];const o=this._consumables[t];for(const e of n){if(t==="attributes"&&(e==="class"||e==="style")){const t=e=="class"?"classes":"styles";this._consume(t,[...this._consumables[t].keys()])}else{o.set(e,false);if(t=="styles"){for(const t of this.element.document.stylesProcessor.getRelatedStyles(e)){o.set(t,false)}}}}}_revert(t,e){const n=xe(e)?e:[e];const o=this._consumables[t];for(const e of n){if(t==="attributes"&&(e==="class"||e==="style")){const t=e=="class"?"classes":"styles";this._revert(t,[...this._consumables[t].keys()])}else{const t=o.get(e);if(t===false){o.set(e,true)}}}}}class Ag{constructor(){this._sourceDefinitions={};this._attributeProperties={};this.decorate("checkChild");this.decorate("checkAttribute");this.on("checkAttribute",((t,e)=>{e[0]=new _g(e[0])}),{priority:"highest"});this.on("checkChild",((t,e)=>{e[0]=new _g(e[0]);e[1]=this.getDefinition(e[1])}),{priority:"highest"})}register(t,e){if(this._sourceDefinitions[t]){throw new u["a"]("schema-cannot-register-item-twice",this,{itemName:t})}this._sourceDefinitions[t]=[Object.assign({},e)];this._clearCache()}extend(t,e){if(!this._sourceDefinitions[t]){throw new u["a"]("schema-cannot-extend-missing-item",this,{itemName:t})}this._sourceDefinitions[t].push(Object.assign({},e));this._clearCache()}getDefinitions(){if(!this._compiledDefinitions){this._compile()}return this._compiledDefinitions}getDefinition(t){let e;if(typeof t=="string"){e=t}else if(t.is&&(t.is("$text")||t.is("$textProxy"))){e="$text"}else{e=t.name}return this.getDefinitions()[e]}isRegistered(t){return!!this.getDefinition(t)}isBlock(t){const e=this.getDefinition(t);return!!(e&&e.isBlock)}isLimit(t){const e=this.getDefinition(t);if(!e){return false}return!!(e.isLimit||e.isObject)}isObject(t){const e=this.getDefinition(t);if(!e){return false}return!!(e.isObject||e.isLimit&&e.isSelectable&&e.isContent)}isInline(t){const e=this.getDefinition(t);return!!(e&&e.isInline)}isSelectable(t){const e=this.getDefinition(t);if(!e){return false}return!!(e.isSelectable||e.isObject)}isContent(t){const e=this.getDefinition(t);if(!e){return false}return!!(e.isContent||e.isObject)}checkChild(t,e){if(!e){return false}return this._checkContextMatch(e,t)}checkAttribute(t,e){const n=this.getDefinition(t.last);if(!n){return false}return n.allowAttributes.includes(e)}checkMerge(t,e=null){if(t instanceof Mf){const e=t.nodeBefore;const n=t.nodeAfter;if(!(e instanceof Ff)){throw new u["a"]("schema-check-merge-no-element-before",this)}if(!(n instanceof Ff)){throw new u["a"]("schema-check-merge-no-element-after",this)}return this.checkMerge(e,n)}for(const n of e.getChildren()){if(!this.checkChild(t,n)){return false}}return true}addChildCheck(t){this.on("checkChild",((e,[n,o])=>{if(!o){return}const i=t(n,o);if(typeof i=="boolean"){e.stop();e.return=i}}),{priority:"high"})}addAttributeCheck(t){this.on("checkAttribute",((e,[n,o])=>{const i=t(n,o);if(typeof i=="boolean"){e.stop();e.return=i}}),{priority:"high"})}setAttributeProperties(t,e){this._attributeProperties[t]=Object.assign(this.getAttributeProperties(t),e)}getAttributeProperties(t){return this._attributeProperties[t]||{}}getLimitElement(t){let e;if(t instanceof Mf){e=t.parent}else{const n=t instanceof Kf?[t]:Array.from(t.getRanges());e=n.reduce(((t,e)=>{const n=e.getCommonAncestor();if(!t){return n}return t.getCommonAncestor(n,{includeSelf:true})}),null)}while(!this.isLimit(e)){if(e.parent){e=e.parent}else{break}}return e}checkAttributeInSelection(t,e){if(t.isCollapsed){const n=t.getFirstPosition();const o=[...n.getAncestors(),new Pf("",t.getAttributes())];return this.checkAttribute(o,e)}else{const n=t.getRanges();for(const t of n){for(const n of t){if(this.checkAttribute(n.item,e)){return true}}}}return false}*getValidRanges(t,e){t=Ng(t);for(const n of t){yield*this._getValidRangesForRange(n,e)}}getNearestSelectionRange(t,e="both"){if(this.checkChild(t,"$text")){return new Kf(t)}let n,o;const i=t.getAncestors().reverse().find((t=>this.isLimit(t)))||t.root;if(e=="both"||e=="backward"){n=new Of({boundaries:Kf._createIn(i),startPosition:t,direction:"backward"})}if(e=="both"||e=="forward"){o=new Of({boundaries:Kf._createIn(i),startPosition:t})}for(const t of Og(n,o)){const e=t.walker==n?"elementEnd":"elementStart";const o=t.value;if(o.type==e&&this.isObject(o.item)){return Kf._createOn(o.item)}if(this.checkChild(o.nextPosition,"$text")){return new Kf(o.nextPosition)}}return null}findAllowedParent(t,e){let n=t.parent;while(n){if(this.checkChild(n,e)){return n}if(this.isLimit(n)){return null}n=n.parent}return null}removeDisallowedAttributes(t,e){for(const n of t){if(n.is("$text")){Mg(this,n,e)}else{const t=Kf._createIn(n);const o=t.getPositions();for(const t of o){const n=t.nodeBefore||t.parent;Mg(this,n,e)}}}}createContext(t){return new _g(t)}_clearCache(){this._compiledDefinitions=null}_compile(){const t={};const e=this._sourceDefinitions;const n=Object.keys(e);for(const o of n){t[o]=vg(e[o],o)}for(const e of n){yg(t,e)}for(const e of n){xg(t,e)}for(const e of n){Eg(t,e);Dg(t,e)}for(const e of n){Sg(t,e);Bg(t,e)}this._compiledDefinitions=t}_checkContextMatch(t,e,n=e.length-1){const o=e.getItem(n);if(t.allowIn.includes(o.name)){if(n==0){return true}else{const t=this.getDefinition(o);return this._checkContextMatch(t,e,n-1)}}else{return false}}*_getValidRangesForRange(t,e){let n=t.start;let o=t.start;for(const i of t.getItems({shallow:true})){if(i.is("element")){yield*this._getValidRangesForRange(Kf._createIn(i),e)}if(!this.checkAttribute(i,e)){if(!n.isEqual(o)){yield new Kf(n,o)}n=Mf._createAfter(i)}o=Mf._createAfter(i)}if(!n.isEqual(o)){yield new Kf(n,o)}}}Hn(Ag,Tn);class _g{constructor(t){if(t instanceof _g){return t}if(typeof t=="string"){t=[t]}else if(!Array.isArray(t)){t=t.getAncestors({includeSelf:true})}if(t[0]&&typeof t[0]!="string"&&t[0].is("documentFragment")){t.shift()}this._items=t.map(zg)}get length(){return this._items.length}get last(){return this._items[this._items.length-1]}[Symbol.iterator](){return this._items[Symbol.iterator]()}push(t){const e=new _g([t]);e._items=[...this._items,...e._items];return e}getItem(t){return this._items[t]}*getNames(){yield*this._items.map((t=>t.name))}endsWith(t){return Array.from(this.getNames()).join(" ").endsWith(t)}startsWith(t){return Array.from(this.getNames()).join(" ").startsWith(t)}}function vg(t,e){const n={name:e,allowIn:[],allowContentOf:[],allowWhere:[],allowAttributes:[],allowAttributesOf:[],inheritTypesFrom:[]};Tg(t,n);Pg(t,n,"allowIn");Pg(t,n,"allowContentOf");Pg(t,n,"allowWhere");Pg(t,n,"allowAttributes");Pg(t,n,"allowAttributesOf");Pg(t,n,"inheritTypesFrom");Ig(t,n);return n}function yg(t,e){for(const n of t[e].allowContentOf){if(t[n]){const o=Rg(t,n);o.forEach((t=>{t.allowIn.push(e)}))}}delete t[e].allowContentOf}function xg(t,e){for(const n of t[e].allowWhere){const o=t[n];if(o){const n=o.allowIn;t[e].allowIn.push(...n)}}delete t[e].allowWhere}function Eg(t,e){for(const n of t[e].allowAttributesOf){const o=t[n];if(o){const n=o.allowAttributes;t[e].allowAttributes.push(...n)}}delete t[e].allowAttributesOf}function Dg(t,e){const n=t[e];for(const e of n.inheritTypesFrom){const o=t[e];if(o){const t=Object.keys(o).filter((t=>t.startsWith("is")));for(const e of t){if(!(e in n)){n[e]=o[e]}}}}delete n.inheritTypesFrom}function Sg(t,e){const n=t[e];const o=n.allowIn.filter((e=>t[e]));n.allowIn=Array.from(new Set(o))}function Bg(t,e){const n=t[e];n.allowAttributes=Array.from(new Set(n.allowAttributes))}function Tg(t,e){for(const n of t){const t=Object.keys(n).filter((t=>t.startsWith("is")));for(const o of t){e[o]=n[o]}}}function Pg(t,e,n){for(const o of t){if(typeof o[n]=="string"){e[n].push(o[n])}else if(Array.isArray(o[n])){e[n].push(...o[n])}}}function Ig(t,e){for(const n of t){const t=n.inheritAllFrom;if(t){e.allowContentOf.push(t);e.allowWhere.push(t);e.allowAttributesOf.push(t);e.inheritTypesFrom.push(t)}}}function Rg(t,e){const n=t[e];return Fg(t).filter((t=>t.allowIn.includes(n.name)))}function Fg(t){return Object.keys(t).map((e=>t[e]))}function zg(t){if(typeof t=="string"){return{name:t,*getAttributeKeys(){},getAttribute(){}}}else{return{name:t.is("element")?t.name:"$text",*getAttributeKeys(){yield*t.getAttributeKeys()},getAttribute(e){return t.getAttribute(e)}}}}function*Og(t,e){let n=false;while(!n){n=true;if(t){const e=t.next();if(!e.done){n=false;yield{walker:t,value:e.value}}}if(e){const t=e.next();if(!t.done){n=false;yield{walker:e,value:t.value}}}}}function*Ng(t){for(const e of t){yield*e.getMinimalFlatRanges()}}function Mg(t,e,n){for(const o of e.getAttributeKeys()){if(!t.checkAttribute(e,o)){n.removeAttribute(o,e)}}}class Vg{constructor(t={}){this._splitParts=new Map;this._cursorParents=new Map;this._modelCursor=null;this.conversionApi=Object.assign({},t);this.conversionApi.convertItem=this._convertItem.bind(this);this.conversionApi.convertChildren=this._convertChildren.bind(this);this.conversionApi.safeInsert=this._safeInsert.bind(this);this.conversionApi.updateConversionResult=this._updateConversionResult.bind(this);this.conversionApi.splitToAllowedParent=this._splitToAllowedParent.bind(this);this.conversionApi.getSplitParts=this._getSplitParts.bind(this)}convert(t,e,n=["$root"]){this.fire("viewCleanup",t);this._modelCursor=Hg(n,e);this.conversionApi.writer=e;this.conversionApi.consumable=wg.createFrom(t);this.conversionApi.store={};const{modelRange:o}=this._convertItem(t,this._modelCursor);const i=e.createDocumentFragment();if(o){this._removeEmptyElements();for(const t of Array.from(this._modelCursor.parent.getChildren())){e.append(t,i)}i.markers=Lg(i,e)}this._modelCursor=null;this._splitParts.clear();this._cursorParents.clear();this.conversionApi.writer=null;this.conversionApi.store=null;return i}_convertItem(t,e){const n=Object.assign({viewItem:t,modelCursor:e,modelRange:null});if(t.is("element")){this.fire("element:"+t.name,n,this.conversionApi)}else if(t.is("$text")){this.fire("text",n,this.conversionApi)}else{this.fire("documentFragment",n,this.conversionApi)}if(n.modelRange&&!(n.modelRange instanceof Kf)){throw new u["a"]("view-conversion-dispatcher-incorrect-result",this)}return{modelRange:n.modelRange,modelCursor:n.modelCursor}}_convertChildren(t,e){let n=e.is("position")?e:Mf._createAt(e,0);const o=new Kf(n);for(const e of Array.from(t.getChildren())){const t=this._convertItem(e,n);if(t.modelRange instanceof Kf){o.end=t.modelRange.end;n=t.modelCursor}}return{modelRange:o,modelCursor:n}}_safeInsert(t,e){const n=this._splitToAllowedParent(t,e);if(!n){return false}this.conversionApi.writer.insert(t,n.position);return true}_updateConversionResult(t,e){const n=this._getSplitParts(t);const o=this.conversionApi.writer;if(!e.modelRange){e.modelRange=o.createRange(o.createPositionBefore(t),o.createPositionAfter(n[n.length-1]))}const i=this._cursorParents.get(t);if(i){e.modelCursor=o.createPositionAt(i,0)}else{e.modelCursor=e.modelRange.end}}_splitToAllowedParent(t,e){const{schema:n,writer:o}=this.conversionApi;let i=n.findAllowedParent(e,t);if(i){if(i===e.parent){return{position:e}}if(this._modelCursor.parent.getAncestors().includes(i)){i=null}}if(!i){if(!Jm(e,t,n)){return null}return{position:Ym(e,o)}}const r=this.conversionApi.writer.split(e,i);const s=[];for(const t of r.range.getWalker()){if(t.type=="elementEnd"){s.push(t.item)}else{const e=s.pop();const n=t.item;this._registerSplitPair(e,n)}}const a=r.range.end.parent;this._cursorParents.set(t,a);return{position:r.position,cursorParent:a}}_registerSplitPair(t,e){if(!this._splitParts.has(t)){this._splitParts.set(t,[t])}const n=this._splitParts.get(t);this._splitParts.set(e,n);n.push(e)}_getSplitParts(t){let e;if(!this._splitParts.has(t)){e=[t]}else{e=this._splitParts.get(t)}return e}_removeEmptyElements(){let t=false;for(const e of this._splitParts.keys()){if(e.isEmpty){this.conversionApi.writer.remove(e);this._splitParts.delete(e);t=true}}if(t){this._removeEmptyElements()}}}Hn(Vg,g);function Lg(t,e){const n=new Set;const o=new Map;const i=Kf._createIn(t).getItems();for(const t of i){if(t.name=="$marker"){n.add(t)}}for(const t of n){const n=t.getAttribute("data-name");const i=e.createPositionBefore(t);if(!o.has(n)){o.set(n,new Kf(i.clone()))}else{o.get(n).end=i.clone()}e.remove(t)}return o}function Hg(t,e){let n;for(const o of new _g(t)){const t={};for(const e of o.getAttributeKeys()){t[e]=o.getAttribute(e)}const i=e.createElement(o.name,t);if(n){e.append(i,n)}n=Mf._createAt(i,0)}return n}class Kg{getHtml(t){const e=document.implementation.createHTMLDocument("");const n=e.createElement("div");n.appendChild(t);return n.innerHTML}}class qg{constructor(t){this._domParser=new DOMParser;this._domConverter=new du(t,{blockFillerMode:"nbsp"});this._htmlWriter=new Kg}toData(t){const e=this._domConverter.viewToDom(t,document);return this._htmlWriter.getHtml(e)}toView(t){const e=this._toDom(t);return this._domConverter.domToView(e)}registerRawContentMatcher(t){this._domConverter.registerRawContentMatcher(t)}_toDom(t){const e=this._domParser.parseFromString(t,"text/html");const n=e.createDocumentFragment();const o=e.body.childNodes;while(o.length>0){n.appendChild(o[0])}return n}}class jg{constructor(t,e){this.model=t;this.mapper=new qf;this.downcastDispatcher=new Gf({mapper:this.mapper,schema:t.schema});this.downcastDispatcher.on("insert:$text",km(),{priority:"lowest"});this.upcastDispatcher=new Vg({schema:t.schema});this.viewDocument=new Ol(e);this.stylesProcessor=e;this.htmlProcessor=new qg(this.viewDocument);this.processor=this.htmlProcessor;this._viewWriter=new wd(this.viewDocument);this.upcastDispatcher.on("text",Zm(),{priority:"lowest"});this.upcastDispatcher.on("element",Xm(),{priority:"lowest"});this.upcastDispatcher.on("documentFragment",Xm(),{priority:"lowest"});this.decorate("init");this.decorate("set");this.on("init",(()=>{this.fire("ready")}),{priority:"lowest"});this.on("ready",(()=>{this.model.enqueueChange("transparent",$m)}),{priority:"lowest"})}get(t={}){const{rootName:e="main",trim:n="empty"}=t;if(!this._checkIfRootsExists([e])){throw new u["a"]("datacontroller-get-non-existent-root",this)}const o=this.model.document.getRoot(e);if(n==="empty"&&!this.model.hasContent(o,{ignoreWhitespaces:true})){return""}return this.stringify(o,t)}stringify(t,e={}){const n=this.toView(t,e);return this.processor.toData(n)}toView(t,e={}){const n=this.viewDocument;const o=this._viewWriter;this.mapper.clearBindings();const i=Kf._createIn(t);const r=new bd(n);this.mapper.bindElements(t,r);this.downcastDispatcher.conversionApi.options=e;this.downcastDispatcher.convertInsert(i,o);if(!t.is("documentFragment")){const e=Wg(t);for(const[t,n]of e){this.downcastDispatcher.convertMarkerAdd(t,n,o)}}delete this.downcastDispatcher.conversionApi.options;return r}init(t){if(this.model.document.version){throw new u["a"]("datacontroller-init-document-not-empty",this)}let e={};if(typeof t==="string"){e.main=t}else{e=t}if(!this._checkIfRootsExists(Object.keys(e))){throw new u["a"]("datacontroller-init-non-existent-root",this)}this.model.enqueueChange("transparent",(t=>{for(const n of Object.keys(e)){const o=this.model.document.getRoot(n);t.insert(this.parse(e[n],o),o,0)}}));return Promise.resolve()}set(t){let e={};if(typeof t==="string"){e.main=t}else{e=t}if(!this._checkIfRootsExists(Object.keys(e))){throw new u["a"]("datacontroller-set-non-existent-root",this)}this.model.enqueueChange("transparent",(t=>{t.setSelection(null);t.removeSelectionAttribute(this.model.document.selection.getAttributeKeys());for(const n of Object.keys(e)){const o=this.model.document.getRoot(n);t.remove(t.createRangeIn(o));t.insert(this.parse(e[n],o),o,0)}}))}parse(t,e="$root"){const n=this.processor.toView(t);return this.toModel(n,e)}toModel(t,e="$root"){return this.model.change((n=>this.upcastDispatcher.convert(t,n,e)))}addStyleProcessorRules(t){t(this.stylesProcessor)}registerRawContentMatcher(t){if(this.processor&&this.processor!==this.htmlProcessor){this.processor.registerRawContentMatcher(t)}this.htmlProcessor.registerRawContentMatcher(t)}destroy(){this.stopListening()}_checkIfRootsExists(t){for(const e of t){if(!this.model.document.getRootNames().includes(e)){return false}}return true}}Hn(jg,Tn);function Wg(t){const e=[];const n=t.root.document;if(!n){return[]}const o=Kf._createIn(t);for(const t of n.model.markers){const n=o.getIntersection(t.getRange());if(n){e.push([t.name,n])}}return e}class Gg{constructor(t,e){this._helpers=new Map;this._downcast=Ca(t);this._createConversionHelpers({name:"downcast",dispatchers:this._downcast,isDowncast:true});this._upcast=Ca(e);this._createConversionHelpers({name:"upcast",dispatchers:this._upcast,isDowncast:false})}addAlias(t,e){const n=this._downcast.includes(e);const o=this._upcast.includes(e);if(!o&&!n){throw new u["a"]("conversion-add-alias-dispatcher-not-registered",this)}this._createConversionHelpers({name:t,dispatchers:[e],isDowncast:n})}for(t){if(!this._helpers.has(t)){throw new u["a"]("conversion-for-unknown-group",this)}return this._helpers.get(t)}elementToElement(t){this.for("downcast").elementToElement(t);for(const{model:e,view:n}of Ug(t)){this.for("upcast").elementToElement({model:e,view:n,converterPriority:t.converterPriority})}}attributeToElement(t){this.for("downcast").attributeToElement(t);for(const{model:e,view:n}of Ug(t)){this.for("upcast").elementToAttribute({view:n,model:e,converterPriority:t.converterPriority})}}attributeToAttribute(t){this.for("downcast").attributeToAttribute(t);for(const{model:e,view:n}of Ug(t)){this.for("upcast").attributeToAttribute({view:n,model:e})}}_createConversionHelpers({name:t,dispatchers:e,isDowncast:n}){if(this._helpers.has(t)){throw new u["a"]("conversion-group-exists",this)}const o=n?new bm(e):new Qm(e);this._helpers.set(t,o)}}function*Ug(t){if(t.model.values){for(const e of t.model.values){const n={key:t.model.key,value:e};const o=t.view[e];const i=t.upcastAlso?t.upcastAlso[e]:undefined;yield*$g(n,o,i)}}else{yield*$g(t.model,t.view,t.upcastAlso)}}function*$g(t,e,n){yield{model:t,view:e};if(n){for(const e of Ca(n)){yield{model:t,view:e}}}}class Jg{constructor(t="default"){this.operations=[];this.type=t}get baseVersion(){for(const t of this.operations){if(t.baseVersion!==null){return t.baseVersion}}return null}addOperation(t){t.batch=this;this.operations.push(t);return t}}class Yg{constructor(t){this.baseVersion=t;this.isDocumentOperation=this.baseVersion!==null;this.batch=null}_validate(){}toJSON(){const t=Object.assign({},this);t.__className=this.constructor.className;delete t.batch;delete t.isDocumentOperation;return t}static get className(){return"Operation"}static fromJSON(t){return new this(t.baseVersion)}}class Qg{constructor(t){this.markers=new Map;this._children=new Rf;if(t){this._insertChild(0,t)}}[Symbol.iterator](){return this.getChildren()}get childCount(){return this._children.length}get maxOffset(){return this._children.maxOffset}get isEmpty(){return this.childCount===0}get root(){return this}get parent(){return null}is(t){return t==="documentFragment"||t==="model:documentFragment"}getChild(t){return this._children.getNode(t)}getChildren(){return this._children[Symbol.iterator]()}getChildIndex(t){return this._children.getNodeIndex(t)}getChildStartOffset(t){return this._children.getNodeStartOffset(t)}getPath(){return[]}getNodeByPath(t){let e=this;for(const n of t){e=e.getChild(e.offsetToIndex(n))}return e}offsetToIndex(t){return this._children.offsetToIndex(t)}toJSON(){const t=[];for(const e of this._children){t.push(e.toJSON())}return t}static fromJSON(t){const e=[];for(const n of t){if(n.name){e.push(Ff.fromJSON(n))}else{e.push(Pf.fromJSON(n))}}return new Qg(e)}_appendChild(t){this._insertChild(this.childCount,t)}_insertChild(t,e){const n=Xg(e);for(const t of n){if(t.parent!==null){t._remove()}t.parent=this}this._children._insertNodes(t,n)}_removeChildren(t,e=1){const n=this._children._removeNodes(t,e);for(const t of n){t.parent=null}return n}}function Xg(t){if(typeof t=="string"){return[new Pf(t)]}if(!ba(t)){t=[t]}return Array.from(t).map((t=>{if(typeof t=="string"){return new Pf(t)}if(t instanceof If){return new Pf(t.data,t.getAttributes())}return t}))}function Zg(t,e){e=op(e);const n=e.reduce(((t,e)=>t+e.offsetSize),0);const o=t.parent;rp(t);const i=t.index;o._insertChild(i,e);ip(o,i+e.length);ip(o,i);return new Kf(t,t.getShiftedBy(n))}function tp(t){if(!t.isFlat){throw new u["a"]("operation-utils-remove-range-not-flat",this)}const e=t.start.parent;rp(t.start);rp(t.end);const n=e._removeChildren(t.start.index,t.end.index-t.start.index);ip(e,t.start.index);return n}function ep(t,e){if(!t.isFlat){throw new u["a"]("operation-utils-move-range-not-flat",this)}const n=tp(t);e=e._getTransformedByDeletion(t.start,t.end.offset-t.start.offset);return Zg(e,n)}function np(t,e,n){rp(t.start);rp(t.end);for(const o of t.getItems({shallow:true})){const t=o.is("$textProxy")?o.textNode:o;if(n!==null){t._setAttribute(e,n)}else{t._removeAttribute(e)}ip(t.parent,t.index)}ip(t.end.parent,t.end.index)}function op(t){const e=[];if(!(t instanceof Array)){t=[t]}for(let n=0;n<t.length;n++){if(typeof t[n]=="string"){e.push(new Pf(t[n]))}else if(t[n]instanceof If){e.push(new Pf(t[n].data,t[n].getAttributes()))}else if(t[n]instanceof Qg||t[n]instanceof Rf){for(const o of t[n]){e.push(o)}}else if(t[n]instanceof Tf){e.push(t[n])}}for(let t=1;t<e.length;t++){const n=e[t];const o=e[t-1];if(n instanceof Pf&&o instanceof Pf&&sp(n,o)){e.splice(t-1,2,new Pf(o.data+n.data,o.getAttributes()));t--}}return e}function ip(t,e){const n=t.getChild(e-1);const o=t.getChild(e);if(n&&o&&n.is("$text")&&o.is("$text")&&sp(n,o)){const i=new Pf(n.data+o.data,n.getAttributes());t._removeChildren(e-1,2);t._insertChild(e-1,i)}}function rp(t){const e=t.textNode;const n=t.parent;if(e){const o=t.offset-e.startOffset;const i=e.index;n._removeChildren(i,1);const r=new Pf(e.data.substr(0,o),e.getAttributes());const s=new Pf(e.data.substr(o),e.getAttributes());n._insertChild(i,[r,s])}}function sp(t,e){const n=t.getAttributes();const o=e.getAttributes();for(const t of n){if(t[1]!==e.getAttribute(t[0])){return false}o.next()}return o.next().done}function ap(t,e){return bh(t,e)}var cp=ap;class lp extends Yg{constructor(t,e,n,o,i){super(i);this.range=t.clone();this.key=e;this.oldValue=n===undefined?null:n;this.newValue=o===undefined?null:o}get type(){if(this.oldValue===null){return"addAttribute"}else if(this.newValue===null){return"removeAttribute"}else{return"changeAttribute"}}clone(){return new lp(this.range,this.key,this.oldValue,this.newValue,this.baseVersion)}getReversed(){return new lp(this.range,this.key,this.newValue,this.oldValue,this.baseVersion+1)}toJSON(){const t=super.toJSON();t.range=this.range.toJSON();return t}_validate(){if(!this.range.isFlat){throw new u["a"]("attribute-operation-range-not-flat",this)}for(const t of this.range.getItems({shallow:true})){if(this.oldValue!==null&&!cp(t.getAttribute(this.key),this.oldValue)){throw new u["a"]("attribute-operation-wrong-old-value",this,{item:t,key:this.key,value:this.oldValue})}if(this.oldValue===null&&this.newValue!==null&&t.hasAttribute(this.key)){throw new u["a"]("attribute-operation-attribute-exists",this,{node:t,key:this.key})}}}_execute(){if(!cp(this.oldValue,this.newValue)){np(this.range,this.key,this.newValue)}}static get className(){return"AttributeOperation"}static fromJSON(t,e){return new lp(Kf.fromJSON(t.range,e),t.key,t.oldValue,t.newValue,t.baseVersion)}}class dp extends Yg{constructor(t,e){super(null);this.sourcePosition=t.clone();this.howMany=e}get type(){return"detach"}toJSON(){const t=super.toJSON();t.sourcePosition=this.sourcePosition.toJSON();return t}_validate(){if(this.sourcePosition.root.document){throw new u["a"]("detach-operation-on-document-node",this)}}_execute(){tp(Kf._createFromPositionAndShift(this.sourcePosition,this.howMany))}static get className(){return"DetachOperation"}}class up extends Yg{constructor(t,e,n,o){super(o);this.sourcePosition=t.clone();this.sourcePosition.stickiness="toNext";this.howMany=e;this.targetPosition=n.clone();this.targetPosition.stickiness="toNone"}get type(){if(this.targetPosition.root.rootName=="$graveyard"){return"remove"}else if(this.sourcePosition.root.rootName=="$graveyard"){return"reinsert"}return"move"}clone(){return new this.constructor(this.sourcePosition,this.howMany,this.targetPosition,this.baseVersion)}getMovedRangeStart(){return this.targetPosition._getTransformedByDeletion(this.sourcePosition,this.howMany)}getReversed(){const t=this.sourcePosition._getTransformedByInsertion(this.targetPosition,this.howMany);return new this.constructor(this.getMovedRangeStart(),this.howMany,t,this.baseVersion+1)}_validate(){const t=this.sourcePosition.parent;const e=this.targetPosition.parent;const n=this.sourcePosition.offset;const o=this.targetPosition.offset;if(n+this.howMany>t.maxOffset){throw new u["a"]("move-operation-nodes-do-not-exist",this)}else if(t===e&&n<o&&o<n+this.howMany){throw new u["a"]("move-operation-range-into-itself",this)}else if(this.sourcePosition.root==this.targetPosition.root){if(Ia(this.sourcePosition.getParentPath(),this.targetPosition.getParentPath())=="prefix"){const t=this.sourcePosition.path.length-1;if(this.targetPosition.path[t]>=n&&this.targetPosition.path[t]<n+this.howMany){throw new u["a"]("move-operation-node-into-itself",this)}}}}_execute(){ep(Kf._createFromPositionAndShift(this.sourcePosition,this.howMany),this.targetPosition)}toJSON(){const t=super.toJSON();t.sourcePosition=this.sourcePosition.toJSON();t.targetPosition=this.targetPosition.toJSON();return t}static get className(){return"MoveOperation"}static fromJSON(t,e){const n=Mf.fromJSON(t.sourcePosition,e);const o=Mf.fromJSON(t.targetPosition,e);return new this(n,t.howMany,o,t.baseVersion)}}class hp extends Yg{constructor(t,e,n){super(n);this.position=t.clone();this.position.stickiness="toNone";this.nodes=new Rf(op(e));this.shouldReceiveAttributes=false}get type(){return"insert"}get howMany(){return this.nodes.maxOffset}clone(){const t=new Rf([...this.nodes].map((t=>t._clone(true))));const e=new hp(this.position,t,this.baseVersion);e.shouldReceiveAttributes=this.shouldReceiveAttributes;return e}getReversed(){const t=this.position.root.document.graveyard;const e=new Mf(t,[0]);return new up(this.position,this.nodes.maxOffset,e,this.baseVersion+1)}_validate(){const t=this.position.parent;if(!t||t.maxOffset<this.position.offset){throw new u["a"]("insert-operation-position-invalid",this)}}_execute(){const t=this.nodes;this.nodes=new Rf([...t].map((t=>t._clone(true))));Zg(this.position,t)}toJSON(){const t=super.toJSON();t.position=this.position.toJSON();t.nodes=this.nodes.toJSON();return t}static get className(){return"InsertOperation"}static fromJSON(t,e){const n=[];for(const e of t.nodes){if(e.name){n.push(Ff.fromJSON(e))}else{n.push(Pf.fromJSON(e))}}const o=new hp(Mf.fromJSON(t.position,e),n,t.baseVersion);o.shouldReceiveAttributes=t.shouldReceiveAttributes;return o}}class fp extends Yg{constructor(t,e,n,o,i,r){super(r);this.name=t;this.oldRange=e?e.clone():null;this.newRange=n?n.clone():null;this.affectsData=i;this._markers=o}get type(){return"marker"}clone(){return new fp(this.name,this.oldRange,this.newRange,this._markers,this.affectsData,this.baseVersion)}getReversed(){return new fp(this.name,this.newRange,this.oldRange,this._markers,this.affectsData,this.baseVersion+1)}_execute(){const t=this.newRange?"_set":"_remove";this._markers[t](this.name,this.newRange,true,this.affectsData)}toJSON(){const t=super.toJSON();if(this.oldRange){t.oldRange=this.oldRange.toJSON()}if(this.newRange){t.newRange=this.newRange.toJSON()}delete t._markers;return t}static get className(){return"MarkerOperation"}static fromJSON(t,e){return new fp(t.name,t.oldRange?Kf.fromJSON(t.oldRange,e):null,t.newRange?Kf.fromJSON(t.newRange,e):null,e.model.markers,t.affectsData,t.baseVersion)}}class mp extends Yg{constructor(t,e,n,o){super(o);this.position=t;this.position.stickiness="toNext";this.oldName=e;this.newName=n}get type(){return"rename"}clone(){return new mp(this.position.clone(),this.oldName,this.newName,this.baseVersion)}getReversed(){return new mp(this.position.clone(),this.newName,this.oldName,this.baseVersion+1)}_validate(){const t=this.position.nodeAfter;if(!(t instanceof Ff)){throw new u["a"]("rename-operation-wrong-position",this)}else if(t.name!==this.oldName){throw new u["a"]("rename-operation-wrong-name",this)}}_execute(){const t=this.position.nodeAfter;t.name=this.newName}toJSON(){const t=super.toJSON();t.position=this.position.toJSON();return t}static get className(){return"RenameOperation"}static fromJSON(t,e){return new mp(Mf.fromJSON(t.position,e),t.oldName,t.newName,t.baseVersion)}}class gp extends Yg{constructor(t,e,n,o,i){super(i);this.root=t;this.key=e;this.oldValue=n;this.newValue=o}get type(){if(this.oldValue===null){return"addRootAttribute"}else if(this.newValue===null){return"removeRootAttribute"}else{return"changeRootAttribute"}}clone(){return new gp(this.root,this.key,this.oldValue,this.newValue,this.baseVersion)}getReversed(){return new gp(this.root,this.key,this.newValue,this.oldValue,this.baseVersion+1)}_validate(){if(this.root!=this.root.root||this.root.is("documentFragment")){throw new u["a"]("rootattribute-operation-not-a-root",this,{root:this.root,key:this.key})}if(this.oldValue!==null&&this.root.getAttribute(this.key)!==this.oldValue){throw new u["a"]("rootattribute-operation-wrong-old-value",this,{root:this.root,key:this.key})}if(this.oldValue===null&&this.newValue!==null&&this.root.hasAttribute(this.key)){throw new u["a"]("rootattribute-operation-attribute-exists",this,{root:this.root,key:this.key})}}_execute(){if(this.newValue!==null){this.root._setAttribute(this.key,this.newValue)}else{this.root._removeAttribute(this.key)}}toJSON(){const t=super.toJSON();t.root=this.root.toJSON();return t}static get className(){return"RootAttributeOperation"}static fromJSON(t,e){if(!e.getRoot(t.root)){throw new u["a"]("rootattribute-operation-fromjson-no-root",this,{rootName:t.root})}return new gp(e.getRoot(t.root),t.key,t.oldValue,t.newValue,t.baseVersion)}}class pp extends Yg{constructor(t,e,n,o,i){super(i);this.sourcePosition=t.clone();this.sourcePosition.stickiness="toPrevious";this.howMany=e;this.targetPosition=n.clone();this.targetPosition.stickiness="toNext";this.graveyardPosition=o.clone()}get type(){return"merge"}get deletionPosition(){return new Mf(this.sourcePosition.root,this.sourcePosition.path.slice(0,-1))}get movedRange(){const t=this.sourcePosition.getShiftedBy(Number.POSITIVE_INFINITY);return new Kf(this.sourcePosition,t)}clone(){return new this.constructor(this.sourcePosition,this.howMany,this.targetPosition,this.graveyardPosition,this.baseVersion)}getReversed(){const t=this.targetPosition._getTransformedByMergeOperation(this);const e=this.sourcePosition.path.slice(0,-1);const n=new Mf(this.sourcePosition.root,e)._getTransformedByMergeOperation(this);return new bp(t,this.howMany,n,this.graveyardPosition,this.baseVersion+1)}_validate(){const t=this.sourcePosition.parent;const e=this.targetPosition.parent;if(!t.parent){throw new u["a"]("merge-operation-source-position-invalid",this)}else if(!e.parent){throw new u["a"]("merge-operation-target-position-invalid",this)}else if(this.howMany!=t.maxOffset){throw new u["a"]("merge-operation-how-many-invalid",this)}}_execute(){const t=this.sourcePosition.parent;const e=Kf._createIn(t);ep(e,this.targetPosition);ep(Kf._createOn(t),this.graveyardPosition)}toJSON(){const t=super.toJSON();t.sourcePosition=t.sourcePosition.toJSON();t.targetPosition=t.targetPosition.toJSON();t.graveyardPosition=t.graveyardPosition.toJSON();return t}static get className(){return"MergeOperation"}static fromJSON(t,e){const n=Mf.fromJSON(t.sourcePosition,e);const o=Mf.fromJSON(t.targetPosition,e);const i=Mf.fromJSON(t.graveyardPosition,e);return new this(n,t.howMany,o,i,t.baseVersion)}}class bp extends Yg{constructor(t,e,n,o,i){super(i);this.splitPosition=t.clone();this.splitPosition.stickiness="toNext";this.howMany=e;this.insertionPosition=n;this.graveyardPosition=o?o.clone():null;if(this.graveyardPosition){this.graveyardPosition.stickiness="toNext"}}get type(){return"split"}get moveTargetPosition(){const t=this.insertionPosition.path.slice();t.push(0);return new Mf(this.insertionPosition.root,t)}get movedRange(){const t=this.splitPosition.getShiftedBy(Number.POSITIVE_INFINITY);return new Kf(this.splitPosition,t)}clone(){return new this.constructor(this.splitPosition,this.howMany,this.insertionPosition,this.graveyardPosition,this.baseVersion)}getReversed(){const t=this.splitPosition.root.document.graveyard;const e=new Mf(t,[0]);return new pp(this.moveTargetPosition,this.howMany,this.splitPosition,e,this.baseVersion+1)}_validate(){const t=this.splitPosition.parent;const e=this.splitPosition.offset;if(!t||t.maxOffset<e){throw new u["a"]("split-operation-position-invalid",this)}else if(!t.parent){throw new u["a"]("split-operation-split-in-root",this)}else if(this.howMany!=t.maxOffset-this.splitPosition.offset){throw new u["a"]("split-operation-how-many-invalid",this)}else if(this.graveyardPosition&&!this.graveyardPosition.nodeAfter){throw new u["a"]("split-operation-graveyard-position-invalid",this)}}_execute(){const t=this.splitPosition.parent;if(this.graveyardPosition){ep(Kf._createFromPositionAndShift(this.graveyardPosition,1),this.insertionPosition)}else{const e=t._clone();Zg(this.insertionPosition,e)}const e=new Kf(Mf._createAt(t,this.splitPosition.offset),Mf._createAt(t,t.maxOffset));ep(e,this.moveTargetPosition)}toJSON(){const t=super.toJSON();t.splitPosition=this.splitPosition.toJSON();t.insertionPosition=this.insertionPosition.toJSON();if(this.graveyardPosition){t.graveyardPosition=this.graveyardPosition.toJSON()}return t}static get className(){return"SplitOperation"}static getInsertionPosition(t){const e=t.path.slice(0,-1);e[e.length-1]++;return new Mf(t.root,e,"toPrevious")}static fromJSON(t,e){const n=Mf.fromJSON(t.splitPosition,e);const o=Mf.fromJSON(t.insertionPosition,e);const i=t.graveyardPosition?Mf.fromJSON(t.graveyardPosition,e):null;return new this(n,t.howMany,o,i,t.baseVersion)}}class kp extends Ff{constructor(t,e,n="main"){super(e);this._document=t;this.rootName=n}get document(){return this._document}is(t,e){if(!e){return t==="rootElement"||t==="model:rootElement"||t==="element"||t==="model:element"||t==="node"||t==="model:node"}return e===this.name&&(t==="rootElement"||t==="model:rootElement"||t==="element"||t==="model:element")}toJSON(){return this.rootName}}class wp{constructor(t,e){this.model=t;this.batch=e}createText(t,e){return new Pf(t,e)}createElement(t,e){return new Ff(t,e)}createDocumentFragment(){return new Qg}cloneElement(t,e=true){return t._clone(e)}insert(t,e,n=0){this._assertWriterUsedCorrectly();if(t instanceof Pf&&t.data==""){return}const o=Mf._createAt(e,n);if(t.parent){if(yp(t.root,o.root)){this.move(Kf._createOn(t),o);return}else{if(t.root.document){throw new u["a"]("model-writer-insert-forbidden-move",this)}else{this.remove(t)}}}const i=o.root.document?o.root.document.version:null;const r=new hp(o,t,i);if(t instanceof Pf){r.shouldReceiveAttributes=true}this.batch.addOperation(r);this.model.applyOperation(r);if(t instanceof Qg){for(const[e,n]of t.markers){const t=Mf._createAt(n.root,0);const i=new Kf(n.start._getCombined(t,o),n.end._getCombined(t,o));const r={range:i,usingOperation:true,affectsData:true};if(this.model.markers.has(e)){this.updateMarker(e,r)}else{this.addMarker(e,r)}}}}insertText(t,e,n,o){if(e instanceof Qg||e instanceof Ff||e instanceof Mf){this.insert(this.createText(t),e,n)}else{this.insert(this.createText(t,e),n,o)}}insertElement(t,e,n,o){if(e instanceof Qg||e instanceof Ff||e instanceof Mf){this.insert(this.createElement(t),e,n)}else{this.insert(this.createElement(t,e),n,o)}}append(t,e){this.insert(t,e,"end")}appendText(t,e,n){if(e instanceof Qg||e instanceof Ff){this.insert(this.createText(t),e,"end")}else{this.insert(this.createText(t,e),n,"end")}}appendElement(t,e,n){if(e instanceof Qg||e instanceof Ff){this.insert(this.createElement(t),e,"end")}else{this.insert(this.createElement(t,e),n,"end")}}setAttribute(t,e,n){this._assertWriterUsedCorrectly();if(n instanceof Kf){const o=n.getMinimalFlatRanges();for(const n of o){Cp(this,t,e,n)}}else{Ap(this,t,e,n)}}setAttributes(t,e){for(const[n,o]of La(t)){this.setAttribute(n,o,e)}}removeAttribute(t,e){this._assertWriterUsedCorrectly();if(e instanceof Kf){const n=e.getMinimalFlatRanges();for(const e of n){Cp(this,t,null,e)}}else{Ap(this,t,null,e)}}clearAttributes(t){this._assertWriterUsedCorrectly();const e=t=>{for(const e of t.getAttributeKeys()){this.removeAttribute(e,t)}};if(!(t instanceof Kf)){e(t)}else{for(const n of t.getItems()){e(n)}}}move(t,e,n){this._assertWriterUsedCorrectly();if(!(t instanceof Kf)){throw new u["a"]("writer-move-invalid-range",this)}if(!t.isFlat){throw new u["a"]("writer-move-range-not-flat",this)}const o=Mf._createAt(e,n);if(o.isEqual(t.start)){return}this._addOperationForAffectedMarkers("move",t);if(!yp(t.root,o.root)){throw new u["a"]("writer-move-different-document",this)}const i=t.root.document?t.root.document.version:null;const r=new up(t.start,t.end.offset-t.start.offset,o,i);this.batch.addOperation(r);this.model.applyOperation(r)}remove(t){this._assertWriterUsedCorrectly();const e=t instanceof Kf?t:Kf._createOn(t);const n=e.getMinimalFlatRanges().reverse();for(const t of n){this._addOperationForAffectedMarkers("move",t);vp(t.start,t.end.offset-t.start.offset,this.batch,this.model)}}merge(t){this._assertWriterUsedCorrectly();const e=t.nodeBefore;const n=t.nodeAfter;this._addOperationForAffectedMarkers("merge",t);if(!(e instanceof Ff)){throw new u["a"]("writer-merge-no-element-before",this)}if(!(n instanceof Ff)){throw new u["a"]("writer-merge-no-element-after",this)}if(!t.root.document){this._mergeDetached(t)}else{this._merge(t)}}createPositionFromPath(t,e,n){return this.model.createPositionFromPath(t,e,n)}createPositionAt(t,e){return this.model.createPositionAt(t,e)}createPositionAfter(t){return this.model.createPositionAfter(t)}createPositionBefore(t){return this.model.createPositionBefore(t)}createRange(t,e){return this.model.createRange(t,e)}createRangeIn(t){return this.model.createRangeIn(t)}createRangeOn(t){return this.model.createRangeOn(t)}createSelection(t,e,n){return this.model.createSelection(t,e,n)}_mergeDetached(t){const e=t.nodeBefore;const n=t.nodeAfter;this.move(Kf._createIn(n),Mf._createAt(e,"end"));this.remove(n)}_merge(t){const e=Mf._createAt(t.nodeBefore,"end");const n=Mf._createAt(t.nodeAfter,0);const o=t.root.document.graveyard;const i=new Mf(o,[0]);const r=t.root.document.version;const s=new pp(n,t.nodeAfter.maxOffset,e,i,r);this.batch.addOperation(s);this.model.applyOperation(s)}rename(t,e){this._assertWriterUsedCorrectly();if(!(t instanceof Ff)){throw new u["a"]("writer-rename-not-element-instance",this)}const n=t.root.document?t.root.document.version:null;const o=new mp(Mf._createBefore(t),t.name,e,n);this.batch.addOperation(o);this.model.applyOperation(o)}split(t,e){this._assertWriterUsedCorrectly();let n=t.parent;if(!n.parent){throw new u["a"]("writer-split-element-no-parent",this)}if(!e){e=n.parent}if(!t.parent.getAncestors({includeSelf:true}).includes(e)){throw new u["a"]("writer-split-invalid-limit-element",this)}let o,i;do{const e=n.root.document?n.root.document.version:null;const r=n.maxOffset-t.offset;const s=bp.getInsertionPosition(t);const a=new bp(t,r,s,null,e);this.batch.addOperation(a);this.model.applyOperation(a);if(!o&&!i){o=n;i=t.parent.nextSibling}t=this.createPositionAfter(t.parent);n=t.parent}while(n!==e);return{position:t,range:new Kf(Mf._createAt(o,"end"),Mf._createAt(i,0))}}wrap(t,e){this._assertWriterUsedCorrectly();if(!t.isFlat){throw new u["a"]("writer-wrap-range-not-flat",this)}const n=e instanceof Ff?e:new Ff(e);if(n.childCount>0){throw new u["a"]("writer-wrap-element-not-empty",this)}if(n.parent!==null){throw new u["a"]("writer-wrap-element-attached",this)}this.insert(n,t.start);const o=new Kf(t.start.getShiftedBy(1),t.end.getShiftedBy(1));this.move(o,Mf._createAt(n,0))}unwrap(t){this._assertWriterUsedCorrectly();if(t.parent===null){throw new u["a"]("writer-unwrap-element-no-parent",this)}this.move(Kf._createIn(t),this.createPositionAfter(t));this.remove(t)}addMarker(t,e){this._assertWriterUsedCorrectly();if(!e||typeof e.usingOperation!="boolean"){throw new u["a"]("writer-addmarker-no-usingoperation",this)}const n=e.usingOperation;const o=e.range;const i=e.affectsData===undefined?false:e.affectsData;if(this.model.markers.has(t)){throw new u["a"]("writer-addmarker-marker-exists",this)}if(!o){throw new u["a"]("writer-addmarker-no-range",this)}if(!n){return this.model.markers._set(t,o,n,i)}_p(this,t,null,o,i);return this.model.markers.get(t)}updateMarker(t,e){this._assertWriterUsedCorrectly();const n=typeof t=="string"?t:t.name;const o=this.model.markers.get(n);if(!o){throw new u["a"]("writer-updatemarker-marker-not-exists",this)}if(!e){this.model.markers._refresh(o);return}const i=typeof e.usingOperation=="boolean";const r=typeof e.affectsData=="boolean";const s=r?e.affectsData:o.affectsData;if(!i&&!e.range&&!r){throw new u["a"]("writer-updatemarker-wrong-options",this)}const a=o.getRange();const c=e.range?e.range:a;if(i&&e.usingOperation!==o.managedUsingOperations){if(e.usingOperation){_p(this,n,null,c,s)}else{_p(this,n,a,null,s);this.model.markers._set(n,c,undefined,s)}return}if(o.managedUsingOperations){_p(this,n,a,c,s)}else{this.model.markers._set(n,c,undefined,s)}}removeMarker(t){this._assertWriterUsedCorrectly();const e=typeof t=="string"?t:t.name;if(!this.model.markers.has(e)){throw new u["a"]("writer-removemarker-no-marker",this)}const n=this.model.markers.get(e);if(!n.managedUsingOperations){this.model.markers._remove(e);return}const o=n.getRange();_p(this,e,o,null,n.affectsData)}setSelection(t,e,n){this._assertWriterUsedCorrectly();this.model.document.selection._setTo(t,e,n)}setSelectionFocus(t,e){this._assertWriterUsedCorrectly();this.model.document.selection._setFocus(t,e)}setSelectionAttribute(t,e){this._assertWriterUsedCorrectly();if(typeof t==="string"){this._setSelectionAttribute(t,e)}else{for(const[e,n]of La(t)){this._setSelectionAttribute(e,n)}}}removeSelectionAttribute(t){this._assertWriterUsedCorrectly();if(typeof t==="string"){this._removeSelectionAttribute(t)}else{for(const e of t){this._removeSelectionAttribute(e)}}}overrideSelectionGravity(){return this.model.document.selection._overrideGravity()}restoreSelectionGravity(t){this.model.document.selection._restoreGravity(t)}_setSelectionAttribute(t,e){const n=this.model.document.selection;if(n.isCollapsed&&n.anchor.parent.isEmpty){const o=cm._getStoreAttributeKey(t);this.setAttribute(o,e,n.anchor.parent)}n._setAttribute(t,e)}_removeSelectionAttribute(t){const e=this.model.document.selection;if(e.isCollapsed&&e.anchor.parent.isEmpty){const n=cm._getStoreAttributeKey(t);this.removeAttribute(n,e.anchor.parent)}e._removeAttribute(t)}_assertWriterUsedCorrectly(){if(this.model._currentWriter!==this){throw new u["a"]("writer-incorrect-use",this)}}_addOperationForAffectedMarkers(t,e){for(const n of this.model.markers){if(!n.managedUsingOperations){continue}const o=n.getRange();let i=false;if(t==="move"){i=e.containsPosition(o.start)||e.start.isEqual(o.start)||e.containsPosition(o.end)||e.end.isEqual(o.end)}else{const t=e.nodeBefore;const n=e.nodeAfter;const r=o.start.parent==t&&o.start.isAtEnd;const s=o.end.parent==n&&o.end.offset==0;const a=o.end.nodeAfter==n;const c=o.start.nodeAfter==n;i=r||s||a||c}if(i){this.updateMarker(n.name,{range:o})}}}}function Cp(t,e,n,o){const i=t.model;const r=i.document;let s=o.start;let a;let c;let l;for(const t of o.getWalker({shallow:true})){l=t.item.getAttribute(e);if(a&&c!=l){if(c!=n){d()}s=a}a=t.nextPosition;c=l}if(a instanceof Mf&&a!=s&&c!=n){d()}function d(){const o=new Kf(s,a);const l=o.root.document?r.version:null;const d=new lp(o,e,c,n,l);t.batch.addOperation(d);i.applyOperation(d)}}function Ap(t,e,n,o){const i=t.model;const r=i.document;const s=o.getAttribute(e);let a,c;if(s!=n){const l=o.root===o;if(l){const t=o.document?r.version:null;c=new gp(o,e,s,n,t)}else{a=new Kf(Mf._createBefore(o),t.createPositionAfter(o));const i=a.root.document?r.version:null;c=new lp(a,e,s,n,i)}t.batch.addOperation(c);i.applyOperation(c)}}function _p(t,e,n,o,i){const r=t.model;const s=r.document;const a=new fp(e,n,o,r.markers,i,s.version);t.batch.addOperation(a);r.applyOperation(a)}function vp(t,e,n,o){let i;if(t.root.document){const n=o.document;const r=new Mf(n.graveyard,[0]);i=new up(t,e,r,n.version)}else{i=new dp(t,e)}n.addOperation(i);o.applyOperation(i)}function yp(t,e){if(t===e){return true}if(t instanceof kp&&e instanceof kp){return true}return false}class xp{constructor(t){this._markerCollection=t;this._changesInElement=new Map;this._elementSnapshots=new Map;this._changedMarkers=new Map;this._changeCount=0;this._cachedChanges=null;this._cachedChangesWithGraveyard=null}get isEmpty(){return this._changesInElement.size==0&&this._changedMarkers.size==0}refreshItem(t){if(this._isInInsertedElement(t.parent)){return}this._markRemove(t.parent,t.startOffset,t.offsetSize);this._markInsert(t.parent,t.startOffset,t.offsetSize);const e=Kf._createOn(t);for(const t of this._markerCollection.getMarkersIntersectingRange(e)){const e=t.getRange();this.bufferMarkerChange(t.name,e,e,t.affectsData)}this._cachedChanges=null}bufferOperation(t){switch(t.type){case"insert":{if(this._isInInsertedElement(t.position.parent)){return}this._markInsert(t.position.parent,t.position.offset,t.nodes.maxOffset);break}case"addAttribute":case"removeAttribute":case"changeAttribute":{for(const e of t.range.getItems({shallow:true})){if(this._isInInsertedElement(e.parent)){continue}this._markAttribute(e)}break}case"remove":case"move":case"reinsert":{if(t.sourcePosition.isEqual(t.targetPosition)||t.sourcePosition.getShiftedBy(t.howMany).isEqual(t.targetPosition)){return}const e=this._isInInsertedElement(t.sourcePosition.parent);const n=this._isInInsertedElement(t.targetPosition.parent);if(!e){this._markRemove(t.sourcePosition.parent,t.sourcePosition.offset,t.howMany)}if(!n){this._markInsert(t.targetPosition.parent,t.getMovedRangeStart().offset,t.howMany)}break}case"rename":{if(this._isInInsertedElement(t.position.parent)){return}this._markRemove(t.position.parent,t.position.offset,1);this._markInsert(t.position.parent,t.position.offset,1);const e=Kf._createFromPositionAndShift(t.position,1);for(const t of this._markerCollection.getMarkersIntersectingRange(e)){const e=t.getRange();this.bufferMarkerChange(t.name,e,e,t.affectsData)}break}case"split":{const e=t.splitPosition.parent;if(!this._isInInsertedElement(e)){this._markRemove(e,t.splitPosition.offset,t.howMany)}if(!this._isInInsertedElement(t.insertionPosition.parent)){this._markInsert(t.insertionPosition.parent,t.insertionPosition.offset,1)}if(t.graveyardPosition){this._markRemove(t.graveyardPosition.parent,t.graveyardPosition.offset,1)}break}case"merge":{const e=t.sourcePosition.parent;if(!this._isInInsertedElement(e.parent)){this._markRemove(e.parent,e.startOffset,1)}const n=t.graveyardPosition.parent;this._markInsert(n,t.graveyardPosition.offset,1);const o=t.targetPosition.parent;if(!this._isInInsertedElement(o)){this._markInsert(o,t.targetPosition.offset,e.maxOffset)}break}}this._cachedChanges=null}bufferMarkerChange(t,e,n,o){const i=this._changedMarkers.get(t);if(!i){this._changedMarkers.set(t,{oldRange:e,newRange:n,affectsData:o})}else{i.newRange=n;i.affectsData=o;if(i.oldRange==null&&i.newRange==null){this._changedMarkers.delete(t)}}}getMarkersToRemove(){const t=[];for(const[e,n]of this._changedMarkers){if(n.oldRange!=null){t.push({name:e,range:n.oldRange})}}return t}getMarkersToAdd(){const t=[];for(const[e,n]of this._changedMarkers){if(n.newRange!=null){t.push({name:e,range:n.newRange})}}return t}getChangedMarkers(){return Array.from(this._changedMarkers).map((t=>({name:t[0],data:{oldRange:t[1].oldRange,newRange:t[1].newRange}})))}hasDataChanges(){for(const[,t]of this._changedMarkers){if(t.affectsData){return true}}return this._changesInElement.size>0}getChanges(t={includeChangesInGraveyard:false}){if(this._cachedChanges){if(t.includeChangesInGraveyard){return this._cachedChangesWithGraveyard.slice()}else{return this._cachedChanges.slice()}}let e=[];for(const t of this._changesInElement.keys()){const n=this._changesInElement.get(t).sort(((t,e)=>{if(t.offset===e.offset){if(t.type!=e.type){return t.type=="remove"?-1:1}return 0}return t.offset<e.offset?-1:1}));const o=this._elementSnapshots.get(t);const i=Ep(t.getChildren());const r=Dp(o.length,n);let s=0;let a=0;for(const n of r){if(n==="i"){e.push(this._getInsertDiff(t,s,i[s].name));s++}else if(n==="r"){e.push(this._getRemoveDiff(t,s,o[a].name));a++}else if(n==="a"){const n=i[s].attributes;const r=o[a].attributes;let c;if(i[s].name=="$text"){c=new Kf(Mf._createAt(t,s),Mf._createAt(t,s+1))}else{const e=t.offsetToIndex(s);c=new Kf(Mf._createAt(t,s),Mf._createAt(t.getChild(e),0))}e.push(...this._getAttributesDiff(c,r,n));s++;a++}else{s++;a++}}}e.sort(((t,e)=>{if(t.position.root!=e.position.root){return t.position.root.rootName<e.position.root.rootName?-1:1}if(t.position.isEqual(e.position)){return t.changeCount-e.changeCount}return t.position.isBefore(e.position)?-1:1}));for(let t=1,n=0;t<e.length;t++){const o=e[n];const i=e[t];const r=o.type=="remove"&&i.type=="remove"&&o.name=="$text"&&i.name=="$text"&&o.position.isEqual(i.position);const s=o.type=="insert"&&i.type=="insert"&&o.name=="$text"&&i.name=="$text"&&o.position.parent==i.position.parent&&o.position.offset+o.length==i.position.offset;const a=o.type=="attribute"&&i.type=="attribute"&&o.position.parent==i.position.parent&&o.range.isFlat&&i.range.isFlat&&o.position.offset+o.length==i.position.offset&&o.attributeKey==i.attributeKey&&o.attributeOldValue==i.attributeOldValue&&o.attributeNewValue==i.attributeNewValue;if(r||s||a){o.length++;if(a){o.range.end=o.range.end.getShiftedBy(1)}e[t]=null}else{n=t}}e=e.filter((t=>t));for(const t of e){delete t.changeCount;if(t.type=="attribute"){delete t.position;delete t.length}}this._changeCount=0;this._cachedChangesWithGraveyard=e.slice();this._cachedChanges=e.filter(Sp);if(t.includeChangesInGraveyard){return this._cachedChangesWithGraveyard}else{return this._cachedChanges}}reset(){this._changesInElement.clear();this._elementSnapshots.clear();this._changedMarkers.clear();this._cachedChanges=null}_markInsert(t,e,n){const o={type:"insert",offset:e,howMany:n,count:this._changeCount++};this._markChange(t,o)}_markRemove(t,e,n){const o={type:"remove",offset:e,howMany:n,count:this._changeCount++};this._markChange(t,o);this._removeAllNestedChanges(t,e,n)}_markAttribute(t){const e={type:"attribute",offset:t.startOffset,howMany:t.offsetSize,count:this._changeCount++};this._markChange(t.parent,e)}_markChange(t,e){this._makeSnapshot(t);const n=this._getChangesForElement(t);this._handleChange(e,n);n.push(e);for(let t=0;t<n.length;t++){if(n[t].howMany<1){n.splice(t,1);t--}}}_getChangesForElement(t){let e;if(this._changesInElement.has(t)){e=this._changesInElement.get(t)}else{e=[];this._changesInElement.set(t,e)}return e}_makeSnapshot(t){if(!this._elementSnapshots.has(t)){this._elementSnapshots.set(t,Ep(t.getChildren()))}}_handleChange(t,e){t.nodesToHandle=t.howMany;for(const n of e){const o=t.offset+t.howMany;const i=n.offset+n.howMany;if(t.type=="insert"){if(n.type=="insert"){if(t.offset<=n.offset){n.offset+=t.howMany}else if(t.offset<i){n.howMany+=t.nodesToHandle;t.nodesToHandle=0}}if(n.type=="remove"){if(t.offset<n.offset){n.offset+=t.howMany}}if(n.type=="attribute"){if(t.offset<=n.offset){n.offset+=t.howMany}else if(t.offset<i){const i=n.howMany;n.howMany=t.offset-n.offset;e.unshift({type:"attribute",offset:o,howMany:i-n.howMany,count:this._changeCount++})}}}if(t.type=="remove"){if(n.type=="insert"){if(o<=n.offset){n.offset-=t.howMany}else if(o<=i){if(t.offset<n.offset){const e=o-n.offset;n.offset=t.offset;n.howMany-=e;t.nodesToHandle-=e}else{n.howMany-=t.nodesToHandle;t.nodesToHandle=0}}else{if(t.offset<=n.offset){t.nodesToHandle-=n.howMany;n.howMany=0}else if(t.offset<i){const e=i-t.offset;n.howMany-=e;t.nodesToHandle-=e}}}if(n.type=="remove"){if(o<=n.offset){n.offset-=t.howMany}else if(t.offset<n.offset){t.nodesToHandle+=n.howMany;n.howMany=0}}if(n.type=="attribute"){if(o<=n.offset){n.offset-=t.howMany}else if(t.offset<n.offset){const e=o-n.offset;n.offset=t.offset;n.howMany-=e}else if(t.offset<i){if(o<=i){const o=n.howMany;n.howMany=t.offset-n.offset;const i=o-n.howMany-t.nodesToHandle;e.unshift({type:"attribute",offset:t.offset,howMany:i,count:this._changeCount++})}else{n.howMany-=i-t.offset}}}}if(t.type=="attribute"){if(n.type=="insert"){if(t.offset<n.offset&&o>n.offset){if(o>i){const t={type:"attribute",offset:i,howMany:o-i,count:this._changeCount++};this._handleChange(t,e);e.push(t)}t.nodesToHandle=n.offset-t.offset;t.howMany=t.nodesToHandle}else if(t.offset>=n.offset&&t.offset<i){if(o>i){t.nodesToHandle=o-i;t.offset=i}else{t.nodesToHandle=0}}}if(n.type=="remove"){if(t.offset<n.offset&&o>n.offset){const i={type:"attribute",offset:n.offset,howMany:o-n.offset,count:this._changeCount++};this._handleChange(i,e);e.push(i);t.nodesToHandle=n.offset-t.offset;t.howMany=t.nodesToHandle}}if(n.type=="attribute"){if(t.offset>=n.offset&&o<=i){t.nodesToHandle=0;t.howMany=0;t.offset=0}else if(t.offset<=n.offset&&o>=i){n.howMany=0}}}}t.howMany=t.nodesToHandle;delete t.nodesToHandle}_getInsertDiff(t,e,n){return{type:"insert",position:Mf._createAt(t,e),name:n,length:1,changeCount:this._changeCount++}}_getRemoveDiff(t,e,n){return{type:"remove",position:Mf._createAt(t,e),name:n,length:1,changeCount:this._changeCount++}}_getAttributesDiff(t,e,n){const o=[];n=new Map(n);for(const[i,r]of e){const e=n.has(i)?n.get(i):null;if(e!==r){o.push({type:"attribute",position:t.start,range:t.clone(),length:1,attributeKey:i,attributeOldValue:r,attributeNewValue:e,changeCount:this._changeCount++})}n.delete(i)}for(const[e,i]of n){o.push({type:"attribute",position:t.start,range:t.clone(),length:1,attributeKey:e,attributeOldValue:null,attributeNewValue:i,changeCount:this._changeCount++})}return o}_isInInsertedElement(t){const e=t.parent;if(!e){return false}const n=this._changesInElement.get(e);const o=t.startOffset;if(n){for(const t of n){if(t.type=="insert"&&o>=t.offset&&o<t.offset+t.howMany){return true}}}return this._isInInsertedElement(e)}_removeAllNestedChanges(t,e,n){const o=new Kf(Mf._createAt(t,e),Mf._createAt(t,e+n));for(const t of o.getItems({shallow:true})){if(t.is("element")){this._elementSnapshots.delete(t);this._changesInElement.delete(t);this._removeAllNestedChanges(t,0,t.maxOffset)}}}}function Ep(t){const e=[];for(const n of t){if(n.is("$text")){for(let t=0;t<n.data.length;t++){e.push({name:"$text",attributes:new Map(n.getAttributes())})}}else{e.push({name:n.name,attributes:new Map(n.getAttributes())})}}return e}function Dp(t,e){const n=[];let o=0;let i=0;for(const t of e){if(t.offset>o){for(let e=0;e<t.offset-o;e++){n.push("e")}i+=t.offset-o}if(t.type=="insert"){for(let e=0;e<t.howMany;e++){n.push("i")}o=t.offset+t.howMany}else if(t.type=="remove"){for(let e=0;e<t.howMany;e++){n.push("r")}o=t.offset;i+=t.howMany}else{n.push(..."a".repeat(t.howMany).split(""));o=t.offset+t.howMany;i+=t.howMany}}if(i<t){for(let e=0;e<t-i-o;e++){n.push("e")}}return n}function Sp(t){const e=t.position&&t.position.root.rootName=="$graveyard";const n=t.range&&t.range.root.rootName=="$graveyard";return!e&&!n}class Bp{constructor(){this._operations=[];this._undoPairs=new Map;this._undoneOperations=new Set}addOperation(t){if(this._operations.includes(t)){return}this._operations.push(t)}getOperations(t=Number.NEGATIVE_INFINITY,e=Number.POSITIVE_INFINITY){const n=[];for(const o of this._operations){if(o.baseVersion>=t&&o.baseVersion<e){n.push(o)}}return n}getOperation(t){for(const e of this._operations){if(e.baseVersion==t){return e}}}setOperationAsUndone(t,e){this._undoPairs.set(e,t);this._undoneOperations.add(t)}isUndoingOperation(t){return this._undoPairs.has(t)}isUndoneOperation(t){return this._undoneOperations.has(t)}getUndoneOperation(t){return this._undoPairs.get(t)}}function Tp(t){return!!t&&t.length==1&&/[\u0300-\u036f\u1ab0-\u1aff\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f]/.test(t)}function Pp(t){return!!t&&t.length==1&&/[\ud800-\udbff]/.test(t)}function Ip(t){return!!t&&t.length==1&&/[\udc00-\udfff]/.test(t)}function Rp(t,e){return Pp(t.charAt(e-1))&&Ip(t.charAt(e))}function Fp(t,e){return Tp(t.charAt(e))}const zp="$graveyard";class Op{constructor(t){this.model=t;this.version=0;this.history=new Bp(this);this.selection=new cm(this);this.roots=new ka({idProperty:"rootName"});this.differ=new xp(t.markers);this._postFixers=new Set;this._hasSelectionChangedFromTheLastChangeBlock=false;this.createRoot("$root",zp);this.listenTo(t,"applyOperation",((t,e)=>{const n=e[0];if(n.isDocumentOperation&&n.baseVersion!==this.version){throw new u["a"]("model-document-applyoperation-wrong-version",this,{operation:n})}}),{priority:"highest"});this.listenTo(t,"applyOperation",((t,e)=>{const n=e[0];if(n.isDocumentOperation){this.differ.bufferOperation(n)}}),{priority:"high"});this.listenTo(t,"applyOperation",((t,e)=>{const n=e[0];if(n.isDocumentOperation){this.version++;this.history.addOperation(n)}}),{priority:"low"});this.listenTo(this.selection,"change",(()=>{this._hasSelectionChangedFromTheLastChangeBlock=true}));this.listenTo(t.markers,"update",((t,e,n,o)=>{this.differ.bufferMarkerChange(e.name,n,o,e.affectsData);if(n===null){e.on("change",((t,n)=>{this.differ.bufferMarkerChange(e.name,n,e.getRange(),e.affectsData)}))}}))}get graveyard(){return this.getRoot(zp)}createRoot(t="$root",e="main"){if(this.roots.get(e)){throw new u["a"]("model-document-createroot-name-exists",this,{name:e})}const n=new kp(this,t,e);this.roots.add(n);return n}destroy(){this.selection.destroy();this.stopListening()}getRoot(t="main"){return this.roots.get(t)}getRootNames(){return Array.from(this.roots,(t=>t.rootName)).filter((t=>t!=zp))}registerPostFixer(t){this._postFixers.add(t)}toJSON(){const t=za(this);t.selection="[engine.model.DocumentSelection]";t.model="[engine.model.Model]";return t}_handleChangeBlock(t){if(this._hasDocumentChangedFromTheLastChangeBlock()){this._callPostFixers(t);this.selection.refresh();if(this.differ.hasDataChanges()){this.fire("change:data",t.batch)}else{this.fire("change",t.batch)}this.selection.refresh();this.differ.reset()}this._hasSelectionChangedFromTheLastChangeBlock=false}_hasDocumentChangedFromTheLastChangeBlock(){return!this.differ.isEmpty||this._hasSelectionChangedFromTheLastChangeBlock}_getDefaultRoot(){for(const t of this.roots){if(t!==this.graveyard){return t}}return this.graveyard}_getDefaultRange(){const t=this._getDefaultRoot();const e=this.model;const n=e.schema;const o=e.createPositionFromPath(t,[0]);const i=n.getNearestSelectionRange(o);return i||e.createRange(o)}_validateSelectionRange(t){return Np(t.start)&&Np(t.end)}_callPostFixers(t){let e=false;do{for(const n of this._postFixers){this.selection.refresh();e=n(t);if(e){break}}}while(e)}}Hn(Op,g);function Np(t){const e=t.textNode;if(e){const n=e.data;const o=t.offset-e.startOffset;return!Rp(n,o)&&!Fp(n,o)}return true}class Mp{constructor(){this._markers=new Map}[Symbol.iterator](){return this._markers.values()}has(t){return this._markers.has(t)}get(t){return this._markers.get(t)||null}_set(t,e,n=false,o=false){const i=t instanceof Vp?t.name:t;if(i.includes(",")){throw new u["a"]("markercollection-incorrect-marker-name",this)}const r=this._markers.get(i);if(r){const t=r.getRange();let s=false;if(!t.isEqual(e)){r._attachLiveRange(om.fromRange(e));s=true}if(n!=r.managedUsingOperations){r._managedUsingOperations=n;s=true}if(typeof o==="boolean"&&o!=r.affectsData){r._affectsData=o;s=true}if(s){this.fire("update:"+i,r,t,e)}return r}const s=om.fromRange(e);const a=new Vp(i,s,n,o);this._markers.set(i,a);this.fire("update:"+i,a,null,e);return a}_remove(t){const e=t instanceof Vp?t.name:t;const n=this._markers.get(e);if(n){this._markers.delete(e);this.fire("update:"+e,n,n.getRange(),null);this._destroyMarker(n);return true}return false}_refresh(t){const e=t instanceof Vp?t.name:t;const n=this._markers.get(e);if(!n){throw new u["a"]("markercollection-refresh-marker-not-exists",this)}const o=n.getRange();this.fire("update:"+e,n,o,o,n.managedUsingOperations,n.affectsData)}*getMarkersAtPosition(t){for(const e of this){if(e.getRange().containsPosition(t)){yield e}}}*getMarkersIntersectingRange(t){for(const e of this){if(e.getRange().getIntersection(t)!==null){yield e}}}destroy(){for(const t of this._markers.values()){this._destroyMarker(t)}this._markers=null;this.stopListening()}*getMarkersGroup(t){for(const e of this._markers.values()){if(e.name.startsWith(t+":")){yield e}}}_destroyMarker(t){t.stopListening();t._detachLiveRange()}}Hn(Mp,g);class Vp{constructor(t,e,n,o){this.name=t;this._liveRange=this._attachLiveRange(e);this._managedUsingOperations=n;this._affectsData=o}get managedUsingOperations(){if(!this._liveRange){throw new u["a"]("marker-destroyed",this)}return this._managedUsingOperations}get affectsData(){if(!this._liveRange){throw new u["a"]("marker-destroyed",this)}return this._affectsData}getStart(){if(!this._liveRange){throw new u["a"]("marker-destroyed",this)}return this._liveRange.start.clone()}getEnd(){if(!this._liveRange){throw new u["a"]("marker-destroyed",this)}return this._liveRange.end.clone()}getRange(){if(!this._liveRange){throw new u["a"]("marker-destroyed",this)}return this._liveRange.toRange()}is(t){return t==="marker"||t==="model:marker"}_attachLiveRange(t){if(this._liveRange){this._detachLiveRange()}t.delegate("change:range").to(this);t.delegate("change:content").to(this);this._liveRange=t;return t}_detachLiveRange(){this._liveRange.stopDelegating("change:range",this);this._liveRange.stopDelegating("change:content",this);this._liveRange.detach();this._liveRange=null}}Hn(Vp,g);class Lp extends Yg{get type(){return"noop"}clone(){return new Lp(this.baseVersion)}getReversed(){return new Lp(this.baseVersion+1)}_execute(){}static get className(){return"NoOperation"}}const Hp={};Hp[lp.className]=lp;Hp[hp.className]=hp;Hp[fp.className]=fp;Hp[up.className]=up;Hp[Lp.className]=Lp;Hp[Yg.className]=Yg;Hp[mp.className]=mp;Hp[gp.className]=gp;Hp[bp.className]=bp;Hp[pp.className]=pp;class Kp{static fromJSON(t,e){return Hp[t.__className].fromJSON(t,e)}}class qp extends Mf{constructor(t,e,n="toNone"){super(t,e,n);if(!this.root.is("rootElement")){throw new u["a"]("model-liveposition-root-not-rootelement",t)}jp.call(this)}detach(){this.stopListening()}is(t){return t==="livePosition"||t==="model:livePosition"||t=="position"||t==="model:position"}toPosition(){return new Mf(this.root,this.path.slice(),this.stickiness)}static fromPosition(t,e){return new this(t.root,t.path.slice(),e?e:t.stickiness)}}function jp(){this.listenTo(this.root.document.model,"applyOperation",((t,e)=>{const n=e[0];if(!n.isDocumentOperation){return}Wp.call(this,n)}),{priority:"low"})}function Wp(t){const e=this.getTransformedByOperation(t);if(!this.isEqual(e)){const t=this.toPosition();this.path=e.path;this.root=e.root;this.fire("change",t)}}Hn(qp,g);function Gp(t,e,n,o){return t.change((i=>{let r;if(!n){r=t.document.selection}else if(n instanceof Qf||n instanceof cm){r=n}else{r=i.createSelection(n,o)}if(!r.isCollapsed){t.deleteContent(r,{doNotAutoparagraph:true})}const s=new Up(t,i,r.anchor);let a;if(e.is("documentFragment")){a=e.getChildren()}else{a=[e]}s.handleNodes(a);const c=s.getSelectionRange();if(c){if(r instanceof cm){i.setSelection(c)}else{r.setTo(c)}}else{}const l=s.getAffectedRange()||t.createRange(r.anchor);s.destroy();return l}))}class Up{constructor(t,e,n){this.model=t;this.writer=e;this.position=n;this.canMergeWith=new Set([this.position.parent]);this.schema=t.schema;this._documentFragment=e.createDocumentFragment();this._documentFragmentPosition=e.createPositionAt(this._documentFragment,0);this._firstNode=null;this._lastNode=null;this._lastAutoParagraph=null;this._filterAttributesOf=[];this._affectedStart=null;this._affectedEnd=null}handleNodes(t){for(const e of Array.from(t)){this._handleNode(e)}this._insertPartialFragment();if(this._lastAutoParagraph){this._updateLastNodeFromAutoParagraph(this._lastAutoParagraph)}this._mergeOnRight();this.schema.removeDisallowedAttributes(this._filterAttributesOf,this.writer);this._filterAttributesOf=[]}_updateLastNodeFromAutoParagraph(t){const e=this.writer.createPositionAfter(this._lastNode);const n=this.writer.createPositionAfter(t);if(n.isAfter(e)){this._lastNode=t;if(this.position.parent!=t||!this.position.isAtEnd){throw new u["a"]("insertcontent-invalid-insertion-position",this)}this.position=n;this._setAffectedBoundaries(this.position)}}getSelectionRange(){if(this.nodeToSelect){return Kf._createOn(this.nodeToSelect)}return this.model.schema.getNearestSelectionRange(this.position)}getAffectedRange(){if(!this._affectedStart){return null}return new Kf(this._affectedStart,this._affectedEnd)}destroy(){if(this._affectedStart){this._affectedStart.detach()}if(this._affectedEnd){this._affectedEnd.detach()}}_handleNode(t){if(this.schema.isObject(t)){this._handleObject(t);return}let e=this._checkAndAutoParagraphToAllowedPosition(t);if(!e){e=this._checkAndSplitToAllowedPosition(t);if(!e){this._handleDisallowedNode(t);return}}this._appendToFragment(t);if(!this._firstNode){this._firstNode=t}this._lastNode=t}_insertPartialFragment(){if(this._documentFragment.isEmpty){return}const t=qp.fromPosition(this.position,"toNext");this._setAffectedBoundaries(this.position);if(this._documentFragment.getChild(0)==this._firstNode){this.writer.insert(this._firstNode,this.position);this._mergeOnLeft();this.position=t.toPosition()}if(!this._documentFragment.isEmpty){this.writer.insert(this._documentFragment,this.position)}this._documentFragmentPosition=this.writer.createPositionAt(this._documentFragment,0);this.position=t.toPosition();t.detach()}_handleObject(t){if(this._checkAndSplitToAllowedPosition(t)){this._appendToFragment(t)}else{this._tryAutoparagraphing(t)}}_handleDisallowedNode(t){if(t.is("element")){this.handleNodes(t.getChildren())}else{this._tryAutoparagraphing(t)}}_appendToFragment(t){if(!this.schema.checkChild(this.position,t)){throw new u["a"]("insertcontent-wrong-position",this,{node:t,position:this.position})}this.writer.insert(t,this._documentFragmentPosition);this._documentFragmentPosition=this._documentFragmentPosition.getShiftedBy(t.offsetSize);if(this.schema.isObject(t)&&!this.schema.checkChild(this.position,"$text")){this.nodeToSelect=t}else{this.nodeToSelect=null}this._filterAttributesOf.push(t)}_setAffectedBoundaries(t){if(!this._affectedStart){this._affectedStart=qp.fromPosition(t,"toPrevious")}if(!this._affectedEnd||this._affectedEnd.isBefore(t)){if(this._affectedEnd){this._affectedEnd.detach()}this._affectedEnd=qp.fromPosition(t,"toNext")}}_mergeOnLeft(){const t=this._firstNode;if(!(t instanceof Ff)){return}if(!this._canMergeLeft(t)){return}const e=qp._createBefore(t);e.stickiness="toNext";const n=qp.fromPosition(this.position,"toNext");if(this._affectedStart.isEqual(e)){this._affectedStart.detach();this._affectedStart=qp._createAt(e.nodeBefore,"end","toPrevious")}if(this._firstNode===this._lastNode){this._firstNode=e.nodeBefore;this._lastNode=e.nodeBefore}this.writer.merge(e);if(e.isEqual(this._affectedEnd)&&this._firstNode===this._lastNode){this._affectedEnd.detach();this._affectedEnd=qp._createAt(e.nodeBefore,"end","toNext")}this.position=n.toPosition();n.detach();this._filterAttributesOf.push(this.position.parent);e.detach()}_mergeOnRight(){const t=this._lastNode;if(!(t instanceof Ff)){return}if(!this._canMergeRight(t)){return}const e=qp._createAfter(t);e.stickiness="toNext";if(!this.position.isEqual(e)){throw new u["a"]("insertcontent-invalid-insertion-position",this)}this.position=Mf._createAt(e.nodeBefore,"end");const n=qp.fromPosition(this.position,"toPrevious");if(this._affectedEnd.isEqual(e)){this._affectedEnd.detach();this._affectedEnd=qp._createAt(e.nodeBefore,"end","toNext")}if(this._firstNode===this._lastNode){this._firstNode=e.nodeBefore;this._lastNode=e.nodeBefore}this.writer.merge(e);if(e.getShiftedBy(-1).isEqual(this._affectedStart)&&this._firstNode===this._lastNode){this._affectedStart.detach();this._affectedStart=qp._createAt(e.nodeBefore,0,"toPrevious")}this.position=n.toPosition();n.detach();this._filterAttributesOf.push(this.position.parent);e.detach()}_canMergeLeft(t){const e=t.previousSibling;return e instanceof Ff&&this.canMergeWith.has(e)&&this.model.schema.checkMerge(e,t)}_canMergeRight(t){const e=t.nextSibling;return e instanceof Ff&&this.canMergeWith.has(e)&&this.model.schema.checkMerge(t,e)}_tryAutoparagraphing(t){const e=this.writer.createElement("paragraph");if(this._getAllowedIn(e,this.position.parent)&&this.schema.checkChild(e,t)){e._appendChild(t);this._handleNode(e)}}_checkAndAutoParagraphToAllowedPosition(t){if(this.schema.checkChild(this.position.parent,t)){return true}if(!this.schema.checkChild(this.position.parent,"paragraph")||!this.schema.checkChild("paragraph",t)){return false}this._insertPartialFragment();const e=this.writer.createElement("paragraph");this.writer.insert(e,this.position);this._setAffectedBoundaries(this.position);this._lastAutoParagraph=e;this.position=this.writer.createPositionAt(e,0);return true}_checkAndSplitToAllowedPosition(t){const e=this._getAllowedIn(t,this.position.parent);if(!e){return false}if(e!=this.position.parent){this._insertPartialFragment()}while(e!=this.position.parent){if(this.schema.isLimit(this.position.parent)){return false}if(this.position.isAtStart){const t=this.position.parent;this.position=this.writer.createPositionBefore(t);if(t.isEmpty&&t.parent===e){this.writer.remove(t)}}else if(this.position.isAtEnd){this.position=this.writer.createPositionAfter(this.position.parent)}else{const t=this.writer.createPositionAfter(this.position.parent);this._setAffectedBoundaries(this.position);this.writer.split(this.position);this.position=t;this.canMergeWith.add(this.position.nodeAfter)}}return true}_getAllowedIn(t,e){if(this.schema.checkChild(e,t)){return e}if(e.parent){return this._getAllowedIn(t,e.parent)}return null}}function $p(t,e,n={}){if(e.isCollapsed){return}const o=e.getFirstRange();if(o.root.rootName=="$graveyard"){return}const i=t.schema;t.change((t=>{if(!n.doNotResetEntireContent&&ab(i,e)){sb(t,e,i);return}const[r,s]=Jp(o);if(!r.isTouching(s)){t.remove(t.createRange(r,s))}if(!n.leaveUnmerged){Qp(t,r,s);i.removeDisallowedAttributes(r.parent.getChildren(),t)}cb(t,e,r);if(!n.doNotAutoparagraph&&ob(i,r)){rb(t,r,e)}r.detach();s.detach()}))}function Jp(t){const e=t.root.document.model;const n=t.start;let o=t.end;if(e.hasContent(t,{ignoreMarkers:true})){const n=Yp(o);if(n&&o.isTouching(e.createPositionAt(n,0))){const n=e.createSelection(t);e.modifySelection(n,{direction:"backward"});o=n.getLastPosition()}}return[qp.fromPosition(n,"toPrevious"),qp.fromPosition(o,"toNext")]}function Yp(t){const e=t.parent;const n=e.root.document.model.schema;const o=e.getAncestors({parentFirst:true,includeSelf:true});for(const t of o){if(n.isLimit(t)){return null}if(n.isBlock(t)){return t}}}function Qp(t,e,n){const o=t.model;if(!eb(t.model.schema,e,n)){return}const[i,r]=nb(e,n);if(!i||!r){return}if(!o.hasContent(i,{ignoreMarkers:true})&&o.hasContent(r,{ignoreMarkers:true})){Zp(t,e,n,i.parent)}else{Xp(t,e,n,i.parent)}}function Xp(t,e,n,o){const i=e.parent;const r=n.parent;if(i==o||r==o){return}e=t.createPositionAfter(i);n=t.createPositionBefore(r);if(!n.isEqual(e)){t.insert(r,e)}t.merge(e);while(n.parent.isEmpty){const e=n.parent;n=t.createPositionBefore(e);t.remove(e)}if(!eb(t.model.schema,e,n)){return}Xp(t,e,n,o)}function Zp(t,e,n,o){const i=e.parent;const r=n.parent;if(i==o||r==o){return}e=t.createPositionAfter(i);n=t.createPositionBefore(r);if(!n.isEqual(e)){t.insert(i,n)}while(e.parent.isEmpty){const n=e.parent;e=t.createPositionBefore(n);t.remove(n)}n=t.createPositionBefore(r);tb(t,n);if(!eb(t.model.schema,e,n)){return}Zp(t,e,n,o)}function tb(t,e){const n=e.nodeBefore;const o=e.nodeAfter;if(n.name!=o.name){t.rename(n,o.name)}t.clearAttributes(n);t.setAttributes(Object.fromEntries(o.getAttributes()),n);t.merge(e)}function eb(t,e,n){const o=e.parent;const i=n.parent;if(o==i){return false}if(t.isLimit(o)||t.isLimit(i)){return false}return ib(e,n,t)}function nb(t,e){const n=t.getAncestors();const o=e.getAncestors();let i=0;while(n[i]&&n[i]==o[i]){i++}return[n[i],o[i]]}function ob(t,e){const n=t.checkChild(e,"$text");const o=t.checkChild(e,"paragraph");return!n&&o}function ib(t,e,n){const o=new Kf(t,e);for(const t of o.getWalker()){if(n.isLimit(t.item)){return false}}return true}function rb(t,e,n){const o=t.createElement("paragraph");t.insert(o,e);cb(t,n,t.createPositionAt(o,0))}function sb(t,e){const n=t.model.schema.getLimitElement(e);t.remove(t.createRangeIn(n));rb(t,t.createPositionAt(n,0),e)}function ab(t,e){const n=t.getLimitElement(e);if(!e.containsEntireContent(n)){return false}const o=e.getFirstRange();if(o.start.parent==o.end.parent){return false}return t.checkChild(n,"paragraph")}function cb(t,e,n){if(e instanceof cm){t.setSelection(n)}else{e.setTo(n)}}const lb=' ,.?!:;"-()';function db(t,e,n={}){const o=t.schema;const i=n.direction!="backward";const r=n.unit?n.unit:"character";const s=e.focus;const a=new Of({boundaries:mb(s,i),singleCharacters:true,direction:i?"forward":"backward"});const c={walker:a,schema:o,isForward:i,unit:r};let l;while(l=a.next()){if(l.done){return}const n=ub(c,l.value);if(n){if(e instanceof cm){t.change((t=>{t.setSelectionFocus(n)}))}else{e.setFocus(n)}return}}}function ub(t,e){const{isForward:n,walker:o,unit:i,schema:r}=t;const{type:s,item:a,nextPosition:c}=e;if(s=="text"){if(t.unit==="word"){return fb(o,n)}return hb(o,i,n)}if(s==(n?"elementStart":"elementEnd")){if(r.isSelectable(a)){return Mf._createAt(a,n?"after":"before")}if(r.checkChild(c,"$text")){return c}}else{if(r.isLimit(a)){o.skip((()=>true));return}if(r.checkChild(c,"$text")){return c}}}function hb(t,e){const n=t.position.textNode;if(n){const o=n.data;let i=t.position.offset-n.startOffset;while(Rp(o,i)||e=="character"&&Fp(o,i)){t.next();i=t.position.offset-n.startOffset}}return t.position}function fb(t,e){let n=t.position.textNode;if(n){let o=t.position.offset-n.startOffset;while(!gb(n.data,o,e)&&!pb(n,o,e)){t.next();const i=e?t.position.nodeAfter:t.position.nodeBefore;if(i&&i.is("$text")){const o=i.data.charAt(e?0:i.data.length-1);if(!lb.includes(o)){t.next();n=t.position.textNode}}o=t.position.offset-n.startOffset}}return t.position}function mb(t,e){const n=t.root;const o=Mf._createAt(n,e?"end":0);if(e){return new Kf(t,o)}else{return new Kf(o,t)}}function gb(t,e,n){const o=e+(n?0:-1);return lb.includes(t.charAt(o))}function pb(t,e,n){return e===(n?t.endOffset:0)}function bb(t,e){return t.change((t=>{const n=t.createDocumentFragment();const o=e.getFirstRange();if(!o||o.isCollapsed){return n}const i=o.start.root;const r=o.start.getCommonPath(o.end);const s=i.getNodeByPath(r);let a;if(o.start.parent==o.end.parent){a=o}else{a=t.createRange(t.createPositionAt(s,o.start.path[r.length]),t.createPositionAt(s,o.end.path[r.length]+1))}const c=a.end.offset-a.start.offset;for(const e of a.getItems({shallow:true})){if(e.is("$textProxy")){t.appendText(e.data,e.getAttributes(),n)}else{t.append(t.cloneElement(e,true),n)}}if(a!=o){const e=o._getTransformedByMove(a.start,t.createPositionAt(n,0),c)[0];const i=t.createRange(t.createPositionAt(n,0),e.start);const r=t.createRange(e.end,t.createPositionAt(n,"end"));kb(r,t);kb(i,t)}return n}))}function kb(t,e){const n=[];Array.from(t.getItems({direction:"backward"})).map((t=>e.createRangeOn(t))).filter((e=>{const n=(e.start.isAfter(t.start)||e.start.isEqual(t.start))&&(e.end.isBefore(t.end)||e.end.isEqual(t.end));return n})).forEach((t=>{n.push(t.start.parent);e.remove(t)}));n.forEach((t=>{let n=t;while(n.parent&&n.isEmpty){const t=e.createRangeOn(n);n=n.parent;e.remove(t)}}))}function wb(t){t.document.registerPostFixer((e=>Cb(e,t)))}function Cb(t,e){const n=e.document.selection;const o=e.schema;const i=[];let r=false;for(const t of n.getRanges()){const e=Ab(t,o);if(e&&!e.isEqual(t)){i.push(e);r=true}else{i.push(t)}}if(r){t.setSelection(Eb(i),{backward:n.isBackward})}}function Ab(t,e){if(t.isCollapsed){return _b(t,e)}return vb(t,e)}function _b(t,e){const n=t.start;const o=e.getNearestSelectionRange(n);if(!o){return null}if(!o.isCollapsed){return o}const i=o.start;if(n.isEqual(i)){return null}return new Kf(i)}function vb(t,e){const{start:n,end:o}=t;const i=e.checkChild(n,"$text");const r=e.checkChild(o,"$text");const s=e.getLimitElement(n);const a=e.getLimitElement(o);if(s===a){if(i&&r){return null}if(xb(n,o,e)){const t=n.nodeAfter&&e.isSelectable(n.nodeAfter);const i=t?null:e.getNearestSelectionRange(n,"forward");const r=o.nodeBefore&&e.isSelectable(o.nodeBefore);const s=r?null:e.getNearestSelectionRange(o,"backward");const a=i?i.start:n;const c=s?s.end:o;return new Kf(a,c)}}const c=s&&!s.is("rootElement");const l=a&&!a.is("rootElement");if(c||l){const t=n.nodeAfter&&o.nodeBefore&&n.nodeAfter.parent===o.nodeBefore.parent;const i=c&&(!t||!Db(n.nodeAfter,e));const r=l&&(!t||!Db(o.nodeBefore,e));let d=n;let u=o;if(i){d=Mf._createBefore(yb(s,e))}if(r){u=Mf._createAfter(yb(a,e))}return new Kf(d,u)}return null}function yb(t,e){let n=t;let o=n;while(e.isLimit(o)&&o.parent){n=o;o=o.parent}return n}function xb(t,e,n){const o=t.nodeAfter&&!n.isLimit(t.nodeAfter)||n.checkChild(t,"$text");const i=e.nodeBefore&&!n.isLimit(e.nodeBefore)||n.checkChild(e,"$text");return o||i}function Eb(t){const e=[];e.push(t.shift());for(const n of t){const t=e.pop();if(n.isEqual(t)){e.push(t)}else if(n.isIntersecting(t)){const o=t.start.isAfter(n.start)?n.start:t.start;const i=t.end.isAfter(n.end)?t.end:n.end;const r=new Kf(o,i);e.push(r)}else{e.push(t);e.push(n)}}return e}function Db(t,e){return t&&e.isSelectable(t)}class Sb{constructor(){this.markers=new Mp;this.document=new Op(this);this.schema=new Ag;this._pendingChanges=[];this._currentWriter=null;["insertContent","deleteContent","modifySelection","getSelectedContent","applyOperation"].forEach((t=>this.decorate(t)));this.on("applyOperation",((t,e)=>{const n=e[0];n._validate()}),{priority:"highest"});this.schema.register("$root",{isLimit:true});this.schema.register("$block",{allowIn:"$root",isBlock:true});this.schema.register("$text",{allowIn:"$block",isInline:true,isContent:true});this.schema.register("$clipboardHolder",{allowContentOf:"$root",isLimit:true});this.schema.extend("$text",{allowIn:"$clipboardHolder"});this.schema.register("$marker");this.schema.addChildCheck(((t,e)=>{if(e.name==="$marker"){return true}}));wb(this);this.document.registerPostFixer($m)}change(t){try{if(this._pendingChanges.length===0){this._pendingChanges.push({batch:new Jg,callback:t});return this._runPendingChanges()[0]}else{return t(this._currentWriter)}}catch(t){u["a"].rethrowUnexpectedError(t,this)}}enqueueChange(t,e){try{if(typeof t==="string"){t=new Jg(t)}else if(typeof t=="function"){e=t;t=new Jg}this._pendingChanges.push({batch:t,callback:e});if(this._pendingChanges.length==1){this._runPendingChanges()}}catch(t){u["a"].rethrowUnexpectedError(t,this)}}applyOperation(t){t._execute()}insertContent(t,e,n){return Gp(this,t,e,n)}deleteContent(t,e){$p(this,t,e)}modifySelection(t,e){db(this,t,e)}getSelectedContent(t){return bb(this,t)}hasContent(t,e={}){const n=t instanceof Ff?Kf._createIn(t):t;if(n.isCollapsed){return false}const{ignoreWhitespaces:o=false,ignoreMarkers:i=false}=e;if(!i){for(const t of this.markers.getMarkersIntersectingRange(n)){if(t.affectsData){return true}}}for(const t of n.getItems()){if(this.schema.isContent(t)){if(t.is("$textProxy")){if(!o){return true}else if(t.data.search(/\S/)!==-1){return true}}else{return true}}}return false}createPositionFromPath(t,e,n){return new Mf(t,e,n)}createPositionAt(t,e){return Mf._createAt(t,e)}createPositionAfter(t){return Mf._createAfter(t)}createPositionBefore(t){return Mf._createBefore(t)}createRange(t,e){return new Kf(t,e)}createRangeIn(t){return Kf._createIn(t)}createRangeOn(t){return Kf._createOn(t)}createSelection(t,e,n){return new Qf(t,e,n)}createBatch(t){return new Jg(t)}createOperationFromJSON(t){return Kp.fromJSON(t,this.document)}destroy(){this.document.destroy();this.stopListening()}_runPendingChanges(){const t=[];this.fire("_beforeChanges");while(this._pendingChanges.length){const e=this._pendingChanges[0].batch;this._currentWriter=new wp(this,e);const n=this._pendingChanges[0].callback(this._currentWriter);t.push(n);this.document._handleChangeBlock(this._currentWriter);this._pendingChanges.shift();this._currentWriter=null}this.fire("_afterChanges");return t}}Hn(Sb,Tn);class Bb extends gf{constructor(t){super();this.editor=t}set(t,e,n={}){if(typeof e=="string"){const t=e;e=(e,n)=>{this.editor.execute(t);n()}}super.set(t,e,n)}}class Tb{constructor(t={}){this._context=t.context||new Ta({language:t.language});this._context._addEditor(this,!t.context);const e=Array.from(this.constructor.builtinPlugins||[]);this.config=new ma(t,this.constructor.defaultConfig);this.config.define("plugins",e);this.config.define(this._context._getEditorConfig());this.plugins=new wa(this,e,this._context.plugins);this.locale=this._context.locale;this.t=this.locale.t;this.commands=new kg;this.set("state","initializing");this.once("ready",(()=>this.state="ready"),{priority:"high"});this.once("destroy",(()=>this.state="destroyed"),{priority:"high"});this.set("isReadOnly",false);this.model=new Sb;const n=new al;this.data=new jg(this.model,n);this.editing=new bg(this.model,n);this.editing.view.document.bind("isReadOnly").to(this);this.conversion=new Gg([this.editing.downcastDispatcher,this.data.downcastDispatcher],this.data.upcastDispatcher);this.conversion.addAlias("dataDowncast",this.data.downcastDispatcher);this.conversion.addAlias("editingDowncast",this.editing.downcastDispatcher);this.keystrokes=new Bb(this);this.keystrokes.listenTo(this.editing.view.document)}initPlugins(){const t=this.config;const e=t.get("plugins");const n=t.get("removePlugins")||[];const o=t.get("extraPlugins")||[];const i=t.get("substitutePlugins")||[];return this.plugins.init(e.concat(o),n,i)}destroy(){let t=Promise.resolve();if(this.state=="initializing"){t=new Promise((t=>this.once("ready",t)))}return t.then((()=>{this.fire("destroy");this.stopListening();this.commands.destroy()})).then((()=>this.plugins.destroy())).then((()=>{this.model.destroy();this.data.destroy();this.editing.destroy();this.keystrokes.destroy()})).then((()=>this._context._removeEditor(this)))}execute(...t){try{return this.commands.execute(...t)}catch(t){u["a"].rethrowUnexpectedError(t,this)}}focus(){this.editing.view.focus()}}Hn(Tb,Tn);class Pb{constructor(t){this.editor=t;this._components=new Map}*names(){for(const t of this._components.values()){yield t.originalName}}add(t,e){this._components.set(Ib(t),{callback:e,originalName:t})}create(t){if(!this.has(t)){throw new u["a"]("componentfactory-item-missing",this,{name:t})}return this._components.get(Ib(t)).callback(this.editor.locale)}has(t){return this._components.has(Ib(t))}}function Ib(t){return String(t).toLowerCase()}class Rb{constructor(t){this.editor=t;this.componentFactory=new Pb(t);this.focusTracker=new mf;this._editableElementsMap=new Map;this.listenTo(t.editing.view.document,"layoutChanged",(()=>this.update()))}get element(){return null}update(){this.fire("update")}destroy(){this.stopListening();this.focusTracker.destroy();for(const t of this._editableElementsMap.values()){t.ckeditorInstance=null}this._editableElementsMap=new Map}setEditableElement(t,e){this._editableElementsMap.set(t,e);if(!e.ckeditorInstance){e.ckeditorInstance=this.editor}}getEditableElement(t="main"){return this._editableElementsMap.get(t)}getEditableElementsNames(){return this._editableElementsMap.keys()}get _editableElements(){console.warn("editor-ui-deprecated-editable-elements: "+"The EditorUI#_editableElements property has been deprecated and will be removed in the near future.",{editorUI:this});return this._editableElementsMap}}Hn(Rb,g);function Fb(t){if(!X(t.updateSourceElement)){throw new u["a"]("attachtoform-missing-elementapi-interface",t)}const e=t.sourceElement;if(e&&e.tagName.toLowerCase()==="textarea"&&e.form){let n;const o=e.form;const i=()=>t.updateSourceElement();if(X(o.submit)){n=o.submit;o.submit=()=>{i();n.apply(o)}}o.addEventListener("submit",i);t.on("destroy",(()=>{o.removeEventListener("submit",i);if(n){o.submit=n}}))}}const zb={setData(t){this.data.set(t)},getData(t){return this.data.get(t)}};var Ob=zb;const Nb={updateSourceElement(){if(!this.sourceElement){throw new u["a"]("editor-missing-sourceelement",this)}uf(this.sourceElement,this.data.get())}};var Mb=Nb;function Vb(t){const e=t.sourceElement;if(!e){return}if(e.ckeditorInstance){throw new u["a"]("editor-source-element-already-used",t)}e.ckeditorInstance=t;t.once("destroy",(()=>{delete e.ckeditorInstance}))}class Lb extends Pa{static get pluginName(){return"PendingActions"}init(){this.set("hasAny",false);this._actions=new ka({idProperty:"_id"});this._actions.delegate("add","remove").to(this)}add(t){if(typeof t!=="string"){throw new u["a"]("pendingactions-add-invalid-message",this)}const e=Object.create(Tn);e.set("message",t);this._actions.add(e);this.hasAny=true;return e}remove(t){this._actions.remove(t);this.hasAny=!!this._actions.length}get first(){return this._actions.get(0)}[Symbol.iterator](){return this._actions[Symbol.iterator]()}}var Hb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.591 10.177 4.243 4.242a1 1 0 0 1-1.415 1.415l-4.242-4.243-4.243 4.243a1 1 0 0 1-1.414-1.415l4.243-4.242L4.52 5.934A1 1 0 0 1 5.934 4.52l4.243 4.243 4.242-4.243a1 1 0 1 1 1.415 1.414l-4.243 4.243z"/></svg>';var Kb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 16h9a1 1 0 0 1 0 2H2a1 1 0 0 1 0-2z"/><path d="M17 1a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h14zm0 1.5H3a.5.5 0 0 0-.492.41L2.5 3v9a.5.5 0 0 0 .41.492L3 12.5h14a.5.5 0 0 0 .492-.41L17.5 12V3a.5.5 0 0 0-.41-.492L17 2.5z" fill-opacity=".6"/></svg>';var qb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.972 16.615a.997.997 0 0 1-.744-.292l-4.596-4.596a1 1 0 1 1 1.414-1.414l3.926 3.926 9.937-9.937a1 1 0 0 1 1.414 1.415L7.717 16.323a.997.997 0 0 1-.745.292z"/></svg>';var jb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m8.636 9.531-2.758 3.94a.5.5 0 0 0 .122.696l3.224 2.284h1.314l2.636-3.736L8.636 9.53zm.288 8.451L5.14 15.396a2 2 0 0 1-.491-2.786l6.673-9.53a2 2 0 0 1 2.785-.49l3.742 2.62a2 2 0 0 1 .491 2.785l-7.269 10.053-2.147-.066z"/><path d="M4 18h5.523v-1H4zm-2 0h1v-1H2z"/></svg>';var Wb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M5.085 6.22 2.943 4.078a.75.75 0 1 1 1.06-1.06l2.592 2.59A11.094 11.094 0 0 1 10 5.068c4.738 0 8.578 3.101 8.578 5.083 0 1.197-1.401 2.803-3.555 3.887l1.714 1.713a.75.75 0 0 1-.09 1.138.488.488 0 0 1-.15.084.75.75 0 0 1-.821-.16L6.17 7.304c-.258.11-.51.233-.757.365l6.239 6.24-.006.005.78.78c-.388.094-.78.166-1.174.215l-1.11-1.11h.011L4.55 8.197a7.2 7.2 0 0 0-.665.514l-.112.098 4.897 4.897-.005.006 1.276 1.276a10.164 10.164 0 0 1-1.477-.117l-.479-.479-.009.009-4.863-4.863-.022.031a2.563 2.563 0 0 0-.124.2c-.043.077-.08.158-.108.241a.534.534 0 0 0-.028.133.29.29 0 0 0 .008.072.927.927 0 0 0 .082.226c.067.133.145.26.234.379l3.242 3.365.025.01.59.623c-3.265-.918-5.59-3.155-5.59-4.668 0-1.194 1.448-2.838 3.663-3.93zm7.07.531a4.632 4.632 0 0 1 1.108 5.992l.345.344.046-.018a9.313 9.313 0 0 0 2-1.112c.256-.187.5-.392.727-.613.137-.134.27-.277.392-.431.072-.091.141-.185.203-.286.057-.093.107-.19.148-.292a.72.72 0 0 0 .036-.12.29.29 0 0 0 .008-.072.492.492 0 0 0-.028-.133.999.999 0 0 0-.036-.096 2.165 2.165 0 0 0-.071-.145 2.917 2.917 0 0 0-.125-.2 3.592 3.592 0 0 0-.263-.335 5.444 5.444 0 0 0-.53-.523 7.955 7.955 0 0 0-1.054-.768 9.766 9.766 0 0 0-1.879-.891c-.337-.118-.68-.219-1.027-.301zm-2.85.21-.069.002a.508.508 0 0 0-.254.097.496.496 0 0 0-.104.679.498.498 0 0 0 .326.199l.045.005c.091.003.181.003.272.012a2.45 2.45 0 0 1 2.017 1.513c.024.061.043.125.069.185a.494.494 0 0 0 .45.287h.008a.496.496 0 0 0 .35-.158.482.482 0 0 0 .13-.335.638.638 0 0 0-.048-.219 3.379 3.379 0 0 0-.36-.723 3.438 3.438 0 0 0-2.791-1.543l-.028-.001h-.013z"/></svg>';var Gb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.91 10.54c.26-.23.64-.21.88.03l3.36 3.14 2.23-2.06a.64.64 0 0 1 .87 0l2.52 2.97V4.5H3.2v10.12l3.71-4.08zm10.27-7.51c.6 0 1.09.47 1.09 1.05v11.84c0 .59-.49 1.06-1.09 1.06H2.79c-.6 0-1.09-.47-1.09-1.06V4.08c0-.58.49-1.05 1.1-1.05h14.38zm-5.22 5.56a1.96 1.96 0 1 1 3.4-1.96 1.96 1.96 0 0 1-3.4 1.96z"/></svg>';var Ub='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m9.239 13.938-2.88-1.663a.75.75 0 0 1 .75-1.3L9 12.067V4.75a.75.75 0 1 1 1.5 0v7.318l1.89-1.093a.75.75 0 0 1 .75 1.3l-2.879 1.663a.752.752 0 0 1-.511.187.752.752 0 0 1-.511-.187zM4.25 17a.75.75 0 1 1 0-1.5h10.5a.75.75 0 0 1 0 1.5H4.25z"/></svg>';var $b='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M9.75 11.875a.752.752 0 0 1 .508.184l2.883 1.666a.75.75 0 0 1-.659 1.344l-.091-.044-1.892-1.093.001 4.318a.75.75 0 1 1-1.5 0v-4.317l-1.89 1.092a.75.75 0 0 1-.75-1.3l2.879-1.663a.752.752 0 0 1 .51-.187zM15.25 9a.75.75 0 1 1 0 1.5H4.75a.75.75 0 1 1 0-1.5h10.5zM9.75.375a.75.75 0 0 1 .75.75v4.318l1.89-1.093.092-.045a.75.75 0 0 1 .659 1.344l-2.883 1.667a.752.752 0 0 1-.508.184.752.752 0 0 1-.511-.187L6.359 5.65a.75.75 0 0 1 .75-1.299L9 5.442V1.125a.75.75 0 0 1 .75-.75z"/></svg>';var Jb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m10.261 7.062 2.88 1.663a.75.75 0 0 1-.75 1.3L10.5 8.933v7.317a.75.75 0 1 1-1.5 0V8.932l-1.89 1.093a.75.75 0 0 1-.75-1.3l2.879-1.663a.752.752 0 0 1 .511-.187.752.752 0 0 1 .511.187zM15.25 4a.75.75 0 1 1 0 1.5H4.75a.75.75 0 0 1 0-1.5h10.5z"/></svg>';var Yb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 4c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75z"/></svg>';var Qb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm2.286 4c0 .414.336.75.75.75h9.928a.75.75 0 1 0 0-1.5H5.036a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h9.928a.75.75 0 1 0 0-1.5H5.036a.75.75 0 0 0-.75.75z"/></svg>';var Xb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M18 3.75a.75.75 0 0 1-.75.75H2.75a.75.75 0 1 1 0-1.5h14.5a.75.75 0 0 1 .75.75zm0 8a.75.75 0 0 1-.75.75H2.75a.75.75 0 1 1 0-1.5h14.5a.75.75 0 0 1 .75.75zm0 4a.75.75 0 0 1-.75.75H7.321a.75.75 0 1 1 0-1.5h9.929a.75.75 0 0 1 .75.75zm0-8a.75.75 0 0 1-.75.75H7.321a.75.75 0 1 1 0-1.5h9.929a.75.75 0 0 1 .75.75z"/></svg>';var Zb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 4c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75z"/></svg>';var tk='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M18 4.5V3H2v1.5h16zm0 3V6h-5.674v1.5H18zm0 3V9h-5.674v1.5H18zm0 3V12h-5.674v1.5H18zm-8.5-6V12h-6V7.5h6zm.818-1.5H2.682C2.305 6 2 6.407 2 6.91v5.68c0 .503.305.91.682.91h7.636c.377 0 .682-.407.682-.91V6.91c0-.503-.305-.91-.682-.91zM18 16.5V15H2v1.5h16z"/></svg>';var ek='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 4.5V3h16v1.5zm4.5 3V12h7V7.5h-7zM5.758 6h8.484c.419 0 .758.407.758.91v5.681c0 .502-.34.909-.758.909H5.758c-.419 0-.758-.407-.758-.91V6.91c0-.503.34-.91.758-.91zM2 16.5V15h16v1.5z"/></svg>';var nk='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 4.5V3h16v1.5zm0 3V6h5.674v1.5zm0 3V9h5.674v1.5zm0 3V12h5.674v1.5zm8.5-6V12h6V7.5h-6zM9.682 6h7.636c.377 0 .682.407.682.91v5.68c0 .503-.305.91-.682.91H9.682c-.377 0-.682-.407-.682-.91V6.91c0-.503.305-.91.682-.91zM2 16.5V15h16v1.5z"/></svg>';var ok='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 4.5V3h16v1.5zm2.5 3V12h11V7.5h-11zM4.061 6H15.94c.586 0 1.061.407 1.061.91v5.68c0 .503-.475.91-1.061.91H4.06c-.585 0-1.06-.407-1.06-.91V6.91C3 6.406 3.475 6 4.061 6zM2 16.5V15h16v1.5z"/></svg>';var ik='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M2.5 17v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zM1 15.5v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm0-2v1h-1v-1h1zm-19 0v1H0v-1h1zM14.5 2v1h-1V2h1zm2 0v1h-1V2h1zm2 0v1h-1V2h1zm-8 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm8 0v1h-1V2h1zm-10 0v1h-1V2h1z"/><path d="M18.095 2H1.905C.853 2 0 2.895 0 4v12c0 1.105.853 2 1.905 2h16.19C19.147 18 20 17.105 20 16V4c0-1.105-.853-2-1.905-2zm0 1.5c.263 0 .476.224.476.5v12c0 .276-.213.5-.476.5H1.905a.489.489 0 0 1-.476-.5V4c0-.276.213-.5.476-.5h16.19z"/></svg>';var rk='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M2.5 17v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zM1 15.5v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm0-2v1h-1v-1h1zm-19 0v1H0v-1h1zM14.5 2v1h-1V2h1zm2 0v1h-1V2h1zm2 0v1h-1V2h1zm-8 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm8 0v1h-1V2h1zm-10 0v1h-1V2h1z"/><path d="M13 6H2a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2zm0 1.5a.5.5 0 0 1 .5.5v8a.5.5 0 0 1-.5.5H2a.5.5 0 0 1-.5-.5V8a.5.5 0 0 1 .5-.5h11z"/></svg>';var sk='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M2.5 17v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zM1 15.5v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm0-2v1h-1v-1h1zm-19 0v1H0v-1h1zM14.5 2v1h-1V2h1zm2 0v1h-1V2h1zm2 0v1h-1V2h1zm-8 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm8 0v1h-1V2h1zm-10 0v1h-1V2h1z"/><path d="M7 10H2a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h5a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2zm0 1.5a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5H2a.5.5 0 0 1-.5-.5v-4a.5.5 0 0 1 .5-.5h5z"/></svg>';var ak='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M2.5 17v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zM1 15.5v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm0-2v1h-1v-1h1zm-19 0v1H0v-1h1zM14.5 2v1h-1V2h1zm2 0v1h-1V2h1zm2 0v1h-1V2h1zm-8 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm8 0v1h-1V2h1zm-10 0v1h-1V2h1z"/><path d="M10 8H2a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2zm0 1.5a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-.5.5H2a.5.5 0 0 1-.5-.5v-6a.5.5 0 0 1 .5-.5h8z"/></svg>';var ck='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m7.3 17.37-.061.088a1.518 1.518 0 0 1-.934.535l-4.178.663-.806-4.153a1.495 1.495 0 0 1 .187-1.058l.056-.086L8.77 2.639c.958-1.351 2.803-1.076 4.296-.03 1.497 1.047 2.387 2.693 1.433 4.055L7.3 17.37zM9.14 4.728l-5.545 8.346 3.277 2.294 5.544-8.346L9.14 4.728zM6.07 16.512l-3.276-2.295.53 2.73 2.746-.435zM9.994 3.506 13.271 5.8c.316-.452-.16-1.333-1.065-1.966-.905-.634-1.895-.78-2.212-.328zM8 18.5 9.375 17H19v1.5H8z"/></svg>';var lk='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.999 2H15a1 1 0 0 1 0 2h-1.004v13a1 1 0 1 1-2 0V4H8.999v13a1 1 0 1 1-2 0v-7A4 4 0 0 1 3 6a4 4 0 0 1 3.999-4z"/></svg>';var dk='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 10.423a6.5 6.5 0 0 1 6.056-6.408l.038.67C6.448 5.423 5.354 7.663 5.22 10H9c.552 0 .5.432.5.986v4.511c0 .554-.448.503-1 .503h-5c-.552 0-.5-.449-.5-1.003v-4.574zm8 0a6.5 6.5 0 0 1 6.056-6.408l.038.67c-2.646.739-3.74 2.979-3.873 5.315H17c.552 0 .5.432.5.986v4.511c0 .554-.448.503-1 .503h-5c-.552 0-.5-.449-.5-1.003v-4.574z"/></svg>';var uk='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><circle cx="9.5" cy="4.5" r="1.5"/><circle cx="9.5" cy="10.5" r="1.5"/><circle cx="9.5" cy="16.5" r="1.5"/></svg>';const hk={cancel:Hb,caption:Kb,check:qb,eraser:jb,lowVision:Wb,image:Gb,alignBottom:Ub,alignMiddle:$b,alignTop:Jb,alignLeft:Yb,alignCenter:Qb,alignRight:Xb,alignJustify:Zb,objectLeft:tk,objectCenter:ek,objectRight:nk,objectFullWidth:ok,objectSizeFull:ik,objectSizeLarge:rk,objectSizeSmall:sk,objectSizeMedium:ak,pencil:ck,pilcrow:lk,quote:dk,threeVerticalDots:uk};function fk({emitter:t,activator:e,callback:n,contextElements:o}){t.listenTo(document,"mousedown",((t,i)=>{if(!e()){return}const r=typeof i.composedPath=="function"?i.composedPath():[];for(const t of o){if(t.contains(i.target)||r.includes(t)){return}}n()}))}function mk(t){t.set("_isCssTransitionsDisabled",false);t.disableCssTransitions=()=>{t._isCssTransitionsDisabled=true};t.enableCssTransitions=()=>{t._isCssTransitionsDisabled=false};t.extendTemplate({attributes:{class:[t.bindTemplate.if("_isCssTransitionsDisabled","ck-transitions-disabled")]}})}function gk({view:t}){t.listenTo(t.element,"submit",((e,n)=>{n.preventDefault();t.fire("submit")}),{useCapture:true})}class pk extends ka{constructor(t=[]){super(t,{idProperty:"viewUid"});this.on("add",((t,e,n)=>{this._renderViewIntoCollectionParent(e,n)}));this.on("remove",((t,e)=>{if(e.element&&this._parentElement){e.element.remove()}}));this._parentElement=null}destroy(){this.map((t=>t.destroy()))}setParent(t){this._parentElement=t;for(const t of this){this._renderViewIntoCollectionParent(t)}}delegate(...t){if(!t.length||!bk(t)){throw new u["a"]("ui-viewcollection-delegate-wrong-events",this)}return{to:e=>{for(const n of this){for(const o of t){n.delegate(o).to(e)}}this.on("add",((n,o)=>{for(const n of t){o.delegate(n).to(e)}}));this.on("remove",((n,o)=>{for(const n of t){o.stopDelegating(n,e)}}))}}}_renderViewIntoCollectionParent(t,e){if(!t.isRendered){t.render()}if(t.element&&this._parentElement){this._parentElement.insertBefore(t.element,this._parentElement.children[e])}}}function bk(t){return t.every((t=>typeof t=="string"))}var kk=n(1);var wk=n.n(kk);var Ck=n(12);var Ak={injectType:"singletonStyleTag",attributes:{"data-cke":true}};Ak.insert="head";Ak.singleton=true;var _k=wk()(Ck["a"],Ak);var vk=Ck["a"].locals||{};class yk{constructor(t){this.element=null;this.isRendered=false;this.locale=t;this.t=t&&t.t;this._viewCollections=new ka;this._unboundChildren=this.createCollection();this._viewCollections.on("add",((e,n)=>{n.locale=t}));this.decorate("render")}get bindTemplate(){if(this._bindTemplate){return this._bindTemplate}return this._bindTemplate=Ek.bind(this,this)}createCollection(t){const e=new pk(t);this._viewCollections.add(e);return e}registerChild(t){if(!ba(t)){t=[t]}for(const e of t){this._unboundChildren.add(e)}}deregisterChild(t){if(!ba(t)){t=[t]}for(const e of t){this._unboundChildren.remove(e)}}setTemplate(t){this.template=new Ek(t)}extendTemplate(t){Ek.extend(this.template,t)}render(){if(this.isRendered){throw new u["a"]("ui-view-render-already-rendered",this)}if(this.template){this.element=this.template.render();this.registerChild(this.template.getViews())}this.isRendered=true}destroy(){this.stopListening();this._viewCollections.map((t=>t.destroy()));if(this.template&&this.template._revertData){this.template.revert(this.element)}}}Hn(yk,bu);Hn(yk,Tn);const xk="http://www.w3.org/1999/xhtml";class Ek{constructor(t){Object.assign(this,Nk(Ok(t)));this._isRendered=false;this._revertData=null}render(){const t=this._renderNode({intoFragment:true});this._isRendered=true;return t}apply(t){this._revertData=Yk();this._renderNode({node:t,isApplying:true,revertData:this._revertData});return t}revert(t){if(!this._revertData){throw new u["a"]("ui-template-revert-not-applied",[this,t])}this._revertTemplateFromNode(t,this._revertData)}*getViews(){function*t(e){if(e.children){for(const n of e.children){if(Uk(n)){yield n}else if($k(n)){yield*t(n)}}}}yield*t(this)}static bind(t,e){return{to(n,o){return new Sk({eventNameOrFunction:n,attribute:n,observable:t,emitter:e,callback:o})},if(n,o,i){return new Bk({observable:t,emitter:e,attribute:n,valueIfTrue:o,callback:i})}}}static extend(t,e){if(t._isRendered){throw new u["a"]("template-extend-render",[this,t])}Wk(t,Nk(Ok(e)))}_renderNode(t){let e;if(t.node){e=this.tag&&this.text}else{e=this.tag?this.text:!this.text}if(e){throw new u["a"]("ui-template-wrong-syntax",this)}if(this.text){return this._renderText(t)}else{return this._renderElement(t)}}_renderElement(t){let e=t.node;if(!e){e=t.node=document.createElementNS(this.ns||xk,this.tag)}this._renderAttributes(t);this._renderElementChildren(t);this._setUpListeners(t);return e}_renderText(t){let e=t.node;if(e){t.revertData.text=e.textContent}else{e=t.node=document.createTextNode("")}if(Tk(this.text)){this._bindToObservable({schema:this.text,updater:Rk(e),data:t})}else{e.textContent=this.text.join("")}return e}_renderAttributes(t){let e,n,o,i;if(!this.attributes){return}const r=t.node;const s=t.revertData;for(e in this.attributes){o=r.getAttribute(e);n=this.attributes[e];if(s){s.attributes[e]=o}i=S(n[0])&&n[0].ns?n[0].ns:null;if(Tk(n)){const a=i?n[0].value:n;if(s&&Qk(e)){a.unshift(o)}this._bindToObservable({schema:a,updater:Fk(r,e,i),data:t})}else if(e=="style"&&typeof n[0]!=="string"){this._renderStyleAttribute(n[0],t)}else{if(s&&o&&Qk(e)){n.unshift(o)}n=n.map((t=>t?t.value||t:t)).reduce(((t,e)=>t.concat(e)),[]).reduce(qk,"");if(!Gk(n)){r.setAttributeNS(i,e,n)}}}}_renderStyleAttribute(t,e){const n=e.node;for(const o in t){const i=t[o];if(Tk(i)){this._bindToObservable({schema:[i],updater:zk(n,o),data:e})}else{n.style[o]=i}}}_renderElementChildren(t){const e=t.node;const n=t.intoFragment?document.createDocumentFragment():e;const o=t.isApplying;let i=0;for(const r of this.children){if(Jk(r)){if(!o){r.setParent(e);for(const t of r){n.appendChild(t.element)}}}else if(Uk(r)){if(!o){if(!r.isRendered){r.render()}n.appendChild(r.element)}}else if(Yd(r)){n.appendChild(r)}else{if(o){const e=t.revertData;const o=Yk();e.children.push(o);r._renderNode({node:n.childNodes[i++],isApplying:true,revertData:o})}else{n.appendChild(r.render())}}}if(t.intoFragment){e.appendChild(n)}}_setUpListeners(t){if(!this.eventListeners){return}for(const e in this.eventListeners){const n=this.eventListeners[e].map((n=>{const[o,i]=e.split("@");return n.activateDomEventListener(o,i,t)}));if(t.revertData){t.revertData.bindings.push(n)}}}_bindToObservable({schema:t,updater:e,data:n}){const o=n.revertData;Ik(t,e,n);const i=t.filter((t=>!Gk(t))).filter((t=>t.observable)).map((o=>o.activateAttributeListener(t,e,n)));if(o){o.bindings.push(i)}}_revertTemplateFromNode(t,e){for(const t of e.bindings){for(const e of t){e()}}if(e.text){t.textContent=e.text;return}for(const n in e.attributes){const o=e.attributes[n];if(o===null){t.removeAttribute(n)}else{t.setAttribute(n,o)}}for(let n=0;n<e.children.length;++n){this._revertTemplateFromNode(t.childNodes[n],e.children[n])}}}Hn(Ek,g);class Dk{constructor(t){Object.assign(this,t)}getValue(t){const e=this.observable[this.attribute];return this.callback?this.callback(e,t):e}activateAttributeListener(t,e,n){const o=()=>Ik(t,e,n);this.emitter.listenTo(this.observable,"change:"+this.attribute,o);return()=>{this.emitter.stopListening(this.observable,"change:"+this.attribute,o)}}}class Sk extends Dk{activateDomEventListener(t,e,n){const o=(t,n)=>{if(!e||n.target.matches(e)){if(typeof this.eventNameOrFunction=="function"){this.eventNameOrFunction(n)}else{this.observable.fire(this.eventNameOrFunction,n)}}};this.emitter.listenTo(n.node,t,o);return()=>{this.emitter.stopListening(n.node,t,o)}}}class Bk extends Dk{getValue(t){const e=super.getValue(t);return Gk(e)?false:this.valueIfTrue||true}}function Tk(t){if(!t){return false}if(t.value){t=t.value}if(Array.isArray(t)){return t.some(Tk)}else if(t instanceof Dk){return true}return false}function Pk(t,e){return t.map((t=>{if(t instanceof Dk){return t.getValue(e)}return t}))}function Ik(t,e,{node:n}){let o=Pk(t,n);if(t.length==1&&t[0]instanceof Bk){o=o[0]}else{o=o.reduce(qk,"")}if(Gk(o)){e.remove()}else{e.set(o)}}function Rk(t){return{set(e){t.textContent=e},remove(){t.textContent=""}}}function Fk(t,e,n){return{set(o){t.setAttributeNS(n,e,o)},remove(){t.removeAttributeNS(n,e)}}}function zk(t,e){return{set(n){t.style[e]=n},remove(){t.style[e]=null}}}function Ok(t){const e=ua(t,(t=>{if(t&&(t instanceof Dk||$k(t)||Uk(t)||Jk(t))){return t}}));return e}function Nk(t){if(typeof t=="string"){t=Lk(t)}else if(t.text){Hk(t)}if(t.on){t.eventListeners=Vk(t.on);delete t.on}if(!t.text){if(t.attributes){Mk(t.attributes)}const e=[];if(t.children){if(Jk(t.children)){e.push(t.children)}else{for(const n of t.children){if($k(n)||Uk(n)||Yd(n)){e.push(n)}else{e.push(new Ek(n))}}}}t.children=e}return t}function Mk(t){for(const e in t){if(t[e].value){t[e].value=Ca(t[e].value)}Kk(t,e)}}function Vk(t){for(const e in t){Kk(t,e)}return t}function Lk(t){return{text:[t]}}function Hk(t){t.text=Ca(t.text)}function Kk(t,e){t[e]=Ca(t[e])}function qk(t,e){if(Gk(e)){return t}else if(Gk(t)){return e}else{return`${t} ${e}`}}function jk(t,e){for(const n in e){if(t[n]){t[n].push(...e[n])}else{t[n]=e[n]}}}function Wk(t,e){if(e.attributes){if(!t.attributes){t.attributes={}}jk(t.attributes,e.attributes)}if(e.eventListeners){if(!t.eventListeners){t.eventListeners={}}jk(t.eventListeners,e.eventListeners)}if(e.text){t.text.push(...e.text)}if(e.children&&e.children.length){if(t.children.length!=e.children.length){throw new u["a"]("ui-template-extend-children-mismatch",t)}let n=0;for(const o of e.children){Wk(t.children[n++],o)}}}function Gk(t){return!t&&t!==0}function Uk(t){return t instanceof yk}function $k(t){return t instanceof Ek}function Jk(t){return t instanceof pk}function Yk(){return{children:[],bindings:[],attributes:{}}}function Qk(t){return t=="class"||t=="style"}class Xk extends pk{constructor(t,e=[]){super(e);this.locale=t}attachToDom(){this._bodyCollectionContainer=new Ek({tag:"div",attributes:{class:["ck","ck-reset_all","ck-body","ck-rounded-corners"],dir:this.locale.uiLanguageDirection},children:this}).render();let t=document.querySelector(".ck-body-wrapper");if(!t){t=Zh(document,"div",{class:"ck-body-wrapper"});document.body.appendChild(t)}t.appendChild(this._bodyCollectionContainer)}detachFromDom(){super.destroy();if(this._bodyCollectionContainer){this._bodyCollectionContainer.remove()}const t=document.querySelector(".ck-body-wrapper");if(t&&t.childElementCount==0){t.remove()}}}var Zk=n(13);var tw={injectType:"singletonStyleTag",attributes:{"data-cke":true}};tw.insert="head";tw.singleton=true;var ew=wk()(Zk["a"],tw);var nw=Zk["a"].locals||{};class ow extends yk{constructor(){super();const t=this.bindTemplate;this.set("content","");this.set("viewBox","0 0 20 20");this.set("fillColor","");this.setTemplate({tag:"svg",ns:"http://www.w3.org/2000/svg",attributes:{class:["ck","ck-icon"],viewBox:t.to("viewBox")}})}render(){super.render();this._updateXMLContent();this._colorFillPaths();this.on("change:content",(()=>{this._updateXMLContent();this._colorFillPaths()}));this.on("change:fillColor",(()=>{this._colorFillPaths()}))}_updateXMLContent(){if(this.content){const t=(new DOMParser).parseFromString(this.content.trim(),"image/svg+xml");const e=t.querySelector("svg");const n=e.getAttribute("viewBox");if(n){this.viewBox=n}this.element.innerHTML="";while(e.childNodes.length>0){this.element.appendChild(e.childNodes[0])}}}_colorFillPaths(){if(this.fillColor){this.element.querySelectorAll(".ck-icon__fill").forEach((t=>{t.style.fill=this.fillColor}))}}}var iw=n(14);var rw={injectType:"singletonStyleTag",attributes:{"data-cke":true}};rw.insert="head";rw.singleton=true;var sw=wk()(iw["a"],rw);var aw=iw["a"].locals||{};class cw extends yk{constructor(t){super(t);this.set("text","");this.set("position","s");const e=this.bindTemplate;this.setTemplate({tag:"span",attributes:{class:["ck","ck-tooltip",e.to("position",(t=>"ck-tooltip_"+t)),e.if("text","ck-hidden",(t=>!t.trim()))]},children:[{tag:"span",attributes:{class:["ck","ck-tooltip__text"]},children:[{text:e.to("text")}]}]})}}var lw=n(15);var dw={injectType:"singletonStyleTag",attributes:{"data-cke":true}};dw.insert="head";dw.singleton=true;var uw=wk()(lw["a"],dw);var hw=lw["a"].locals||{};class fw extends yk{constructor(t){super(t);const e=this.bindTemplate;const n=a();this.set("class");this.set("labelStyle");this.set("icon");this.set("isEnabled",true);this.set("isOn",false);this.set("isVisible",true);this.set("isToggleable",false);this.set("keystroke");this.set("label");this.set("tabindex",-1);this.set("tooltip");this.set("tooltipPosition","s");this.set("type","button");this.set("withText",false);this.set("withKeystroke",false);this.children=this.createCollection();this.tooltipView=this._createTooltipView();this.labelView=this._createLabelView(n);this.iconView=new ow;this.iconView.extendTemplate({attributes:{class:"ck-button__icon"}});this.keystrokeView=this._createKeystrokeView();this.bind("_tooltipString").to(this,"tooltip",this,"label",this,"keystroke",this._getTooltipString.bind(this));this.setTemplate({tag:"button",attributes:{class:["ck","ck-button",e.to("class"),e.if("isEnabled","ck-disabled",(t=>!t)),e.if("isVisible","ck-hidden",(t=>!t)),e.to("isOn",(t=>t?"ck-on":"ck-off")),e.if("withText","ck-button_with-text"),e.if("withKeystroke","ck-button_with-keystroke")],type:e.to("type",(t=>t?t:"button")),tabindex:e.to("tabindex"),"aria-labelledby":`ck-editor__aria-label_${n}`,"aria-disabled":e.if("isEnabled",true,(t=>!t)),"aria-pressed":e.to("isOn",(t=>this.isToggleable?String(t):false))},children:this.children,on:{mousedown:e.to((t=>{t.preventDefault()})),click:e.to((t=>{if(this.isEnabled){this.fire("execute")}else{t.preventDefault()}}))}})}render(){super.render();if(this.icon){this.iconView.bind("content").to(this,"icon");this.children.add(this.iconView)}this.children.add(this.tooltipView);this.children.add(this.labelView);if(this.withKeystroke){this.children.add(this.keystrokeView)}}focus(){this.element.focus()}_createTooltipView(){const t=new cw;t.bind("text").to(this,"_tooltipString");t.bind("position").to(this,"tooltipPosition");return t}_createLabelView(t){const e=new yk;const n=this.bindTemplate;e.setTemplate({tag:"span",attributes:{class:["ck","ck-button__label"],style:n.to("labelStyle"),id:`ck-editor__aria-label_${t}`},children:[{text:this.bindTemplate.to("label")}]});return e}_createKeystrokeView(){const t=new yk;t.setTemplate({tag:"span",attributes:{class:["ck","ck-button__keystroke"]},children:[{text:this.bindTemplate.to("keystroke",(t=>id(t)))}]});return t}_getTooltipString(t,e,n){if(t){if(typeof t=="string"){return t}else{if(n){n=id(n)}if(t instanceof Function){return t(e,n)}else{return`${e}${n?` (${n})`:""}`}}}return""}}var mw=n(16);var gw={injectType:"singletonStyleTag",attributes:{"data-cke":true}};gw.insert="head";gw.singleton=true;var pw=wk()(mw["a"],gw);var bw=mw["a"].locals||{};class kw extends fw{constructor(t){super(t);this.isToggleable=true;this.toggleSwitchView=this._createToggleView();this.extendTemplate({attributes:{class:"ck-switchbutton"}})}render(){super.render();this.children.add(this.toggleSwitchView)}_createToggleView(){const t=new yk;t.setTemplate({tag:"span",attributes:{class:["ck","ck-button__toggle"]},children:[{tag:"span",attributes:{class:["ck","ck-button__toggle__inner"]}}]});return t}}function ww(t,e){const n=t.t;const o={Black:n("Black"),"Dim grey":n("Dim grey"),Grey:n("Grey"),"Light grey":n("Light grey"),White:n("White"),Red:n("Red"),Orange:n("Orange"),Yellow:n("Yellow"),"Light green":n("Light green"),Green:n("Green"),Aquamarine:n("Aquamarine"),Turquoise:n("Turquoise"),"Light blue":n("Light blue"),Blue:n("Blue"),Purple:n("Purple")};return e.map((t=>{const e=o[t.label];if(e&&e!=t.label){t.label=e}return t}))}function Cw(t){return t.map(Aw).filter((t=>!!t))}function Aw(t){if(typeof t==="string"){return{model:t,label:t,hasBorder:false,view:{name:"span",styles:{color:t}}}}else{return{model:t.color,label:t.label||t.color,hasBorder:t.hasBorder===undefined?false:t.hasBorder,view:{name:"span",styles:{color:`${t.color}`}}}}}var _w='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path class="ck-icon__fill" d="M16.935 5.328a2 2 0 0 1 0 2.829l-7.778 7.778a2 2 0 0 1-2.829 0L3.5 13.107a1.999 1.999 0 1 1 2.828-2.829l.707.707a1 1 0 0 0 1.414 0l5.658-5.657a2 2 0 0 1 2.828 0z"/><path d="M14.814 6.035 8.448 12.4a1 1 0 0 1-1.414 0l-1.413-1.415A1 1 0 1 0 4.207 12.4l2.829 2.829a1 1 0 0 0 1.414 0l7.778-7.778a1 1 0 1 0-1.414-1.415z"/></svg>';class vw extends fw{constructor(t){super(t);const e=this.bindTemplate;this.set("color");this.set("hasBorder");this.icon=_w;this.extendTemplate({attributes:{style:{backgroundColor:e.to("color")},class:["ck","ck-color-grid__tile",e.if("hasBorder","ck-color-table__color-tile_bordered")]}})}render(){super.render();this.iconView.fillColor="hsl(0, 0%, 100%)"}}class yw{constructor(t){Object.assign(this,t);if(t.actions&&t.keystrokeHandler){for(const e in t.actions){let n=t.actions[e];if(typeof n=="string"){n=[n]}for(const o of n){t.keystrokeHandler.set(o,((t,n)=>{this[e]();n()}))}}}}get first(){return this.focusables.find(xw)||null}get last(){return this.focusables.filter(xw).slice(-1)[0]||null}get next(){return this._getFocusableItem(1)}get previous(){return this._getFocusableItem(-1)}get current(){let t=null;if(this.focusTracker.focusedElement===null){return null}this.focusables.find(((e,n)=>{const o=e.element===this.focusTracker.focusedElement;if(o){t=n}return o}));return t}focusFirst(){this._focus(this.first)}focusLast(){this._focus(this.last)}focusNext(){this._focus(this.next)}focusPrevious(){this._focus(this.previous)}_focus(t){if(t){t.focus()}}_getFocusableItem(t){const e=this.current;const n=this.focusables.length;if(!n){return null}if(e===null){return this[t===1?"first":"last"]}let o=(e+n+t)%n;do{const e=this.focusables.get(o);if(xw(e)){return e}o=(o+n+t)%n}while(o!==e);return null}}function xw(t){return!!(t.focus&&ru.window.getComputedStyle(t.element).display!="none")}var Ew=n(17);var Dw={injectType:"singletonStyleTag",attributes:{"data-cke":true}};Dw.insert="head";Dw.singleton=true;var Sw=wk()(Ew["a"],Dw);var Bw=Ew["a"].locals||{};class Tw extends yk{constructor(t,e){super(t);const n=e&&e.colorDefinitions||[];const o={};if(e&&e.columns){o.gridTemplateColumns=`repeat( ${e.columns}, 1fr)`}this.set("selectedColor");this.items=this.createCollection();this.focusTracker=new mf;this.keystrokes=new gf;this._focusCycler=new yw({focusables:this.items,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"arrowleft",focusNext:"arrowright"}});this.items.on("add",((t,e)=>{e.isOn=e.color===this.selectedColor}));n.forEach((t=>{const e=new vw;e.set({color:t.color,label:t.label,tooltip:true,hasBorder:t.options.hasBorder});e.on("execute",(()=>{this.fire("execute",{value:t.color,hasBorder:t.options.hasBorder,label:t.label})}));this.items.add(e)}));this.setTemplate({tag:"div",children:this.items,attributes:{class:["ck","ck-color-grid"],style:o}});this.on("change:selectedColor",((t,e,n)=>{for(const t of this.items){t.isOn=t.color===n}}))}focus(){if(this.items.length){this.items.first.focus()}}focusLast(){if(this.items.length){this.items.last.focus()}}render(){super.render();for(const t of this.items){this.focusTracker.add(t.element)}this.items.on("add",((t,e)=>{this.focusTracker.add(e.element)}));this.items.on("remove",((t,e)=>{this.focusTracker.remove(e.element)}));this.keystrokes.listenTo(this.element)}}var Pw='<svg viewBox="0 0 10 10" xmlns="http://www.w3.org/2000/svg"><path d="M.941 4.523a.75.75 0 1 1 1.06-1.06l3.006 3.005 3.005-3.005a.75.75 0 1 1 1.06 1.06l-3.549 3.55a.75.75 0 0 1-1.168-.136L.941 4.523z"/></svg>';class Iw extends fw{constructor(t){super(t);this.arrowView=this._createArrowView();this.extendTemplate({attributes:{"aria-haspopup":true}});this.delegate("execute").to(this,"open")}render(){super.render();this.children.add(this.arrowView)}_createArrowView(){const t=new ow;t.content=Pw;t.extendTemplate({attributes:{class:"ck-dropdown__arrow"}});return t}}var Rw=n(18);var Fw={injectType:"singletonStyleTag",attributes:{"data-cke":true}};Fw.insert="head";Fw.singleton=true;var zw=wk()(Rw["a"],Fw);var Ow=Rw["a"].locals||{};class Nw extends yk{constructor(t){super(t);const e=this.bindTemplate;this.set("icon");this.set("isEnabled",true);this.set("isOn",false);this.set("isToggleable",false);this.set("isVisible",true);this.set("keystroke");this.set("label");this.set("tabindex",-1);this.set("tooltip");this.set("tooltipPosition","s");this.set("type","button");this.set("withText",false);this.children=this.createCollection();this.actionView=this._createActionView();this.arrowView=this._createArrowView();this.keystrokes=new gf;this.focusTracker=new mf;this.setTemplate({tag:"div",attributes:{class:["ck","ck-splitbutton",e.if("isVisible","ck-hidden",(t=>!t)),this.arrowView.bindTemplate.if("isOn","ck-splitbutton_open")]},children:this.children})}render(){super.render();this.children.add(this.actionView);this.children.add(this.arrowView);this.focusTracker.add(this.actionView.element);this.focusTracker.add(this.arrowView.element);this.keystrokes.listenTo(this.element);this.keystrokes.set("arrowright",((t,e)=>{if(this.focusTracker.focusedElement===this.actionView.element){this.arrowView.focus();e()}}));this.keystrokes.set("arrowleft",((t,e)=>{if(this.focusTracker.focusedElement===this.arrowView.element){this.actionView.focus();e()}}))}focus(){this.actionView.focus()}_createActionView(){const t=new fw;t.bind("icon","isEnabled","isOn","isToggleable","keystroke","label","tabindex","tooltip","tooltipPosition","type","withText").to(this);t.extendTemplate({attributes:{class:"ck-splitbutton__action"}});t.delegate("execute").to(this);return t}_createArrowView(){const t=new fw;const e=t.bindTemplate;t.icon=Pw;t.extendTemplate({attributes:{class:"ck-splitbutton__arrow","aria-haspopup":true,"aria-expanded":e.to("isOn",(t=>String(t)))}});t.bind("isEnabled").to(this);t.delegate("execute").to(this,"open");return t}}class Mw extends yk{constructor(t){super(t);const e=this.bindTemplate;this.set("isVisible",false);this.set("position","se");this.children=this.createCollection();this.setTemplate({tag:"div",attributes:{class:["ck","ck-reset","ck-dropdown__panel",e.to("position",(t=>`ck-dropdown__panel_${t}`)),e.if("isVisible","ck-dropdown__panel-visible")]},children:this.children,on:{selectstart:e.to((t=>t.preventDefault()))}})}focus(){if(this.children.length){this.children.first.focus()}}focusLast(){if(this.children.length){const t=this.children.last;if(typeof t.focusLast==="function"){t.focusLast()}else{t.focus()}}}}var Vw=n(19);var Lw={injectType:"singletonStyleTag",attributes:{"data-cke":true}};Lw.insert="head";Lw.singleton=true;var Hw=wk()(Vw["a"],Lw);var Kw=Vw["a"].locals||{};function qw(t){if(!t||!t.parentNode){return null}if(t.offsetParent===ru.document.body){return null}return t.offsetParent}function jw({element:t,target:e,positions:n,limiter:o,fitInViewport:i}){if(X(e)){e=e()}if(X(o)){o=o()}const r=qw(t);const s=new rf(t);const a=new rf(e);let c;let l;if(!o&&!i){[l,c]=Ww(n[0],a,s)}else{const t=o&&new rf(o).getVisible();const e=i&&new rf(ru.window);const r=Gw(n,{targetRect:a,elementRect:s,limiterRect:t,viewportRect:e});[l,c]=r||Ww(n[0],a,s)}let d=Yw(c);if(r){d=Jw(d,r)}return{left:d.left,top:d.top,name:l}}function Ww(t,e,n){const o=t(e,n);if(!o){return null}const{left:i,top:r,name:s}=o;return[s,n.clone().moveTo(i,r)]}function Gw(t,e){const{elementRect:n,viewportRect:o}=e;const i=n.getArea();const r=Uw(t,e);if(o){const t=r.filter((({viewportIntersectArea:t})=>t===i));const e=$w(t,i);if(e){return e}}return $w(r,i)}function Uw(t,{targetRect:e,elementRect:n,limiterRect:o,viewportRect:i}){const r=[];const s=n.getArea();for(const a of t){const t=Ww(a,e,n);if(!t){continue}const[c,l]=t;let d=0;let u=0;if(o){if(i){const t=o.getIntersection(i);if(t){d=t.getIntersectionArea(l)}}else{d=o.getIntersectionArea(l)}}if(i){u=i.getIntersectionArea(l)}const h={positionName:c,positionRect:l,limiterIntersectArea:d,viewportIntersectArea:u};if(d===s){return[h]}r.push(h)}return r}function $w(t,e){let n=0;let o;let i;for(const{positionName:r,positionRect:s,limiterIntersectArea:a,viewportIntersectArea:c}of t){if(a===e){return[r,s]}const t=c**2+a**2;if(t>n){n=t;o=s;i=r}}return o?[i,o]:null}function Jw({left:t,top:e},n){const o=Yw(new rf(n));const i=nf(n);t-=o.left;e-=o.top;t+=n.scrollLeft;e+=n.scrollTop;t-=i.left;e-=i.top;return{left:t,top:e}}function Yw({left:t,top:e}){const{scrollX:n,scrollY:o}=ru.window;return{left:t+n,top:e+o}}class Qw extends yk{constructor(t,e,n){super(t);const o=this.bindTemplate;this.buttonView=e;this.panelView=n;this.set("isOpen",false);this.set("isEnabled",true);this.set("class");this.set("id");this.set("panelPosition","auto");this.keystrokes=new gf;this.setTemplate({tag:"div",attributes:{class:["ck","ck-dropdown",o.to("class"),o.if("isEnabled","ck-disabled",(t=>!t))],id:o.to("id"),"aria-describedby":o.to("ariaDescribedById")},children:[e,n]});e.extendTemplate({attributes:{class:["ck-dropdown__button"]}})}render(){super.render();this.listenTo(this.buttonView,"open",(()=>{this.isOpen=!this.isOpen}));this.panelView.bind("isVisible").to(this,"isOpen");this.on("change:isOpen",(()=>{if(!this.isOpen){return}if(this.panelPosition==="auto"){this.panelView.position=Qw._getOptimalPosition({element:this.panelView.element,target:this.buttonView.element,fitInViewport:true,positions:this._panelPositions}).name}else{this.panelView.position=this.panelPosition}}));this.keystrokes.listenTo(this.element);const t=(t,e)=>{if(this.isOpen){this.buttonView.focus();this.isOpen=false;e()}};this.keystrokes.set("arrowdown",((t,e)=>{if(this.buttonView.isEnabled&&!this.isOpen){this.isOpen=true;e()}}));this.keystrokes.set("arrowright",((t,e)=>{if(this.isOpen){e()}}));this.keystrokes.set("arrowleft",t);this.keystrokes.set("esc",t)}focus(){this.buttonView.focus()}get _panelPositions(){const{south:t,north:e,southEast:n,southWest:o,northEast:i,northWest:r,southMiddleEast:s,southMiddleWest:a,northMiddleEast:c,northMiddleWest:l}=Qw.defaultPanelPositions;if(this.locale.uiLanguageDirection!=="rtl"){return[n,o,s,a,t,i,r,c,l,e]}else{return[o,n,a,s,t,r,i,l,c,e]}}}Qw.defaultPanelPositions={south:(t,e)=>({top:t.bottom,left:t.left-(e.width-t.width)/2,name:"s"}),southEast:t=>({top:t.bottom,left:t.left,name:"se"}),southWest:(t,e)=>({top:t.bottom,left:t.left-e.width+t.width,name:"sw"}),southMiddleEast:(t,e)=>({top:t.bottom,left:t.left-(e.width-t.width)/4,name:"sme"}),southMiddleWest:(t,e)=>({top:t.bottom,left:t.left-(e.width-t.width)*3/4,name:"smw"}),north:(t,e)=>({top:t.top-e.height,left:t.left-(e.width-t.width)/2,name:"n"}),northEast:(t,e)=>({top:t.top-e.height,left:t.left,name:"ne"}),northWest:(t,e)=>({top:t.top-e.height,left:t.left-e.width+t.width,name:"nw"}),northMiddleEast:(t,e)=>({top:t.top-e.height,left:t.left-(e.width-t.width)/4,name:"nme"}),northMiddleWest:(t,e)=>({top:t.top-e.height,left:t.left-(e.width-t.width)*3/4,name:"nmw"})};Qw._getOptimalPosition=jw;class Xw extends yk{constructor(t){super(t);this.setTemplate({tag:"span",attributes:{class:["ck","ck-toolbar__separator"]}})}}class Zw extends yk{constructor(t){super(t);this.setTemplate({tag:"span",attributes:{class:["ck","ck-toolbar__line-break"]}})}}function tC(t){return t.bindTemplate.to((e=>{if(e.target===t.element){e.preventDefault()}}))}function eC(t){if(Array.isArray(t)){return{items:t,removeItems:[]}}if(!t){return{items:[],removeItems:[]}}return Object.assign({items:[],removeItems:[]},t)}var nC=n(20);var oC={injectType:"singletonStyleTag",attributes:{"data-cke":true}};oC.insert="head";oC.singleton=true;var iC=wk()(nC["a"],oC);var rC=nC["a"].locals||{};class sC extends yk{constructor(t,e){super(t);const n=this.bindTemplate;const o=this.t;this.options=e||{};this.set("ariaLabel",o("Editor toolbar"));this.set("maxWidth","auto");this.items=this.createCollection();this.focusTracker=new mf;this.keystrokes=new gf;this.set("class");this.set("isCompact",false);this.itemsView=new aC(t);this.children=this.createCollection();this.children.add(this.itemsView);this.focusables=this.createCollection();this._focusCycler=new yw({focusables:this.focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:["arrowleft","arrowup"],focusNext:["arrowright","arrowdown"]}});const i=["ck","ck-toolbar",n.to("class"),n.if("isCompact","ck-toolbar_compact")];if(this.options.shouldGroupWhenFull&&this.options.isFloating){i.push("ck-toolbar_floating")}this.setTemplate({tag:"div",attributes:{class:i,role:"toolbar","aria-label":n.to("ariaLabel"),style:{maxWidth:n.to("maxWidth")}},children:this.children,on:{mousedown:tC(this)}});this._behavior=this.options.shouldGroupWhenFull?new lC(this):new cC(this)}render(){super.render();for(const t of this.items){this.focusTracker.add(t.element)}this.items.on("add",((t,e)=>{this.focusTracker.add(e.element)}));this.items.on("remove",((t,e)=>{this.focusTracker.remove(e.element)}));this.keystrokes.listenTo(this.element);this._behavior.render(this)}destroy(){this._behavior.destroy();return super.destroy()}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}fillFromConfig(t,e){const n=eC(t);const o=n.items.filter(((t,o,i)=>{if(t==="|"){return true}if(n.removeItems.indexOf(t)!==-1){return false}if(t==="-"){if(this.options.shouldGroupWhenFull){Object(u["b"])("toolbarview-line-break-ignored-when-grouping-items",i);return false}return true}if(!e.has(t)){Object(u["b"])("toolbarview-item-unavailable",{name:t});return false}return true}));const i=this._cleanSeparators(o).map((t=>{if(t==="|"){return new Xw}else if(t==="-"){return new Zw}return e.create(t)}));this.items.addMany(i)}_cleanSeparators(t){const e=t=>t!=="-"&&t!=="|";const n=t.length;const o=t.findIndex(e);const i=n-t.slice().reverse().findIndex(e);return t.slice(o,i).filter(((t,n,o)=>{if(e(t)){return true}const i=n>0&&o[n-1]===t;return!i}))}}class aC extends yk{constructor(t){super(t);this.children=this.createCollection();this.setTemplate({tag:"div",attributes:{class:["ck","ck-toolbar__items"]},children:this.children})}}class cC{constructor(t){const e=t.bindTemplate;t.set("isVertical",false);t.itemsView.children.bindTo(t.items).using((t=>t));t.focusables.bindTo(t.items).using((t=>t));t.extendTemplate({attributes:{class:[e.if("isVertical","ck-toolbar_vertical")]}})}render(){}destroy(){}}class lC{constructor(t){this.view=t;this.viewChildren=t.children;this.viewFocusables=t.focusables;this.viewItemsView=t.itemsView;this.viewFocusTracker=t.focusTracker;this.viewLocale=t.locale;this.ungroupedItems=t.createCollection();this.groupedItems=t.createCollection();this.groupedItemsDropdown=this._createGroupedItemsDropdown();this.resizeObserver=null;this.cachedPadding=null;this.shouldUpdateGroupingOnNextResize=false;t.itemsView.children.bindTo(this.ungroupedItems).using((t=>t));this.ungroupedItems.on("add",this._updateFocusCycleableItems.bind(this));this.ungroupedItems.on("remove",this._updateFocusCycleableItems.bind(this));t.children.on("add",this._updateFocusCycleableItems.bind(this));t.children.on("remove",this._updateFocusCycleableItems.bind(this));t.items.on("change",((t,e)=>{const n=e.index;for(const t of e.removed){if(n>=this.ungroupedItems.length){this.groupedItems.remove(t)}else{this.ungroupedItems.remove(t)}}for(let t=n;t<n+e.added.length;t++){const o=e.added[t-n];if(t>this.ungroupedItems.length){this.groupedItems.add(o,t-this.ungroupedItems.length)}else{this.ungroupedItems.add(o,t)}}this._updateGrouping()}));t.extendTemplate({attributes:{class:["ck-toolbar_grouping"]}})}render(t){this.viewElement=t.element;this._enableGroupingOnResize();this._enableGroupingOnMaxWidthChange(t)}destroy(){this.groupedItemsDropdown.destroy();this.resizeObserver.destroy()}_updateGrouping(){if(!this.viewElement.ownerDocument.body.contains(this.viewElement)){return}if(!this.viewElement.offsetParent){this.shouldUpdateGroupingOnNextResize=true;return}const t=this.groupedItems.length;let e;while(this._areItemsOverflowing){this._groupLastItem();e=true}if(!e&&this.groupedItems.length){while(this.groupedItems.length&&!this._areItemsOverflowing){this._ungroupFirstItem()}if(this._areItemsOverflowing){this._groupLastItem()}}if(this.groupedItems.length!==t){this.view.fire("groupedItemsUpdate")}}get _areItemsOverflowing(){if(!this.ungroupedItems.length){return false}const t=this.viewElement;const e=this.viewLocale.uiLanguageDirection;const n=new rf(t.lastChild);const o=new rf(t);if(!this.cachedPadding){const n=ru.window.getComputedStyle(t);const o=e==="ltr"?"paddingRight":"paddingLeft";this.cachedPadding=Number.parseInt(n[o])}if(e==="ltr"){return n.right>o.right-this.cachedPadding}else{return n.left<o.left+this.cachedPadding}}_enableGroupingOnResize(){let t;this.resizeObserver=new lf(this.viewElement,(e=>{if(!t||t!==e.contentRect.width||this.shouldUpdateGroupingOnNextResize){this.shouldUpdateGroupingOnNextResize=false;this._updateGrouping();t=e.contentRect.width}}));this._updateGrouping()}_enableGroupingOnMaxWidthChange(t){t.on("change:maxWidth",(()=>{this._updateGrouping()}))}_groupLastItem(){if(!this.groupedItems.length){this.viewChildren.add(new Xw);this.viewChildren.add(this.groupedItemsDropdown);this.viewFocusTracker.add(this.groupedItemsDropdown.element)}this.groupedItems.add(this.ungroupedItems.remove(this.ungroupedItems.last),0)}_ungroupFirstItem(){this.ungroupedItems.add(this.groupedItems.remove(this.groupedItems.first));if(!this.groupedItems.length){this.viewChildren.remove(this.groupedItemsDropdown);this.viewChildren.remove(this.viewChildren.last);this.viewFocusTracker.remove(this.groupedItemsDropdown.element)}}_createGroupedItemsDropdown(){const t=this.viewLocale;const e=t.t;const n=xC(t);n.class="ck-toolbar__grouped-dropdown";n.panelPosition=t.uiLanguageDirection==="ltr"?"sw":"se";EC(n,[]);n.buttonView.set({label:e("Show more items"),tooltip:true,tooltipPosition:t.uiLanguageDirection==="rtl"?"se":"sw",icon:hk.threeVerticalDots});n.toolbarView.items.bindTo(this.groupedItems).using((t=>t));return n}_updateFocusCycleableItems(){this.viewFocusables.clear();this.ungroupedItems.map((t=>{this.viewFocusables.add(t)}));if(this.groupedItems.length){this.viewFocusables.add(this.groupedItemsDropdown)}}}var dC=n(21);var uC={injectType:"singletonStyleTag",attributes:{"data-cke":true}};uC.insert="head";uC.singleton=true;var hC=wk()(dC["a"],uC);var fC=dC["a"].locals||{};class mC extends yk{constructor(){super();this.items=this.createCollection();this.focusTracker=new mf;this.keystrokes=new gf;this._focusCycler=new yw({focusables:this.items,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"arrowup",focusNext:"arrowdown"}});this.setTemplate({tag:"ul",attributes:{class:["ck","ck-reset","ck-list"]},children:this.items})}render(){super.render();for(const t of this.items){this.focusTracker.add(t.element)}this.items.on("add",((t,e)=>{this.focusTracker.add(e.element)}));this.items.on("remove",((t,e)=>{this.focusTracker.remove(e.element)}));this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}}class gC extends yk{constructor(t){super(t);this.children=this.createCollection();this.setTemplate({tag:"li",attributes:{class:["ck","ck-list__item"]},children:this.children})}focus(){this.children.first.focus()}}class pC extends yk{constructor(t){super(t);this.setTemplate({tag:"li",attributes:{class:["ck","ck-list__separator"]}})}}var bC=n(22);var kC={injectType:"singletonStyleTag",attributes:{"data-cke":true}};kC.insert="head";kC.singleton=true;var wC=wk()(bC["a"],kC);var CC=bC["a"].locals||{};var AC=n(23);var _C={injectType:"singletonStyleTag",attributes:{"data-cke":true}};_C.insert="head";_C.singleton=true;var vC=wk()(AC["a"],_C);var yC=AC["a"].locals||{};function xC(t,e=Iw){const n=new e(t);const o=new Mw(t);const i=new Qw(t,n,o);n.bind("isEnabled").to(i);if(n instanceof Iw){n.bind("isOn").to(i,"isOpen")}else{n.arrowView.bind("isOn").to(i,"isOpen")}SC(i);return i}function EC(t,e){const n=t.locale;const o=n.t;const i=t.toolbarView=new sC(n);i.set("ariaLabel",o("Dropdown toolbar"));t.extendTemplate({attributes:{class:["ck-toolbar-dropdown"]}});e.map((t=>i.items.add(t)));t.panelView.children.add(i);i.items.delegate("execute").to(t)}function DC(t,e){const n=t.locale;const o=t.listView=new mC(n);o.items.bindTo(e).using((({type:t,model:e})=>{if(t==="separator"){return new pC(n)}else if(t==="button"||t==="switchbutton"){const o=new gC(n);let i;if(t==="button"){i=new fw(n)}else{i=new kw(n)}i.bind(...Object.keys(e)).to(e);i.delegate("execute").to(o);o.children.add(i);return o}}));t.panelView.children.add(o);o.items.delegate("execute").to(t)}function SC(t){BC(t);TC(t);PC(t)}function BC(t){t.on("render",(()=>{fk({emitter:t,activator:()=>t.isOpen,callback:()=>{t.isOpen=false},contextElements:[t.element]})}))}function TC(t){t.on("execute",(e=>{if(e.source instanceof kw){return}t.isOpen=false}))}function PC(t){t.keystrokes.set("arrowdown",((e,n)=>{if(t.isOpen){t.panelView.focus();n()}}));t.keystrokes.set("arrowup",((e,n)=>{if(t.isOpen){t.panelView.focusLast();n()}}))}var IC=n(24);var RC={injectType:"singletonStyleTag",attributes:{"data-cke":true}};RC.insert="head";RC.singleton=true;var FC=wk()(IC["a"],RC);var zC=IC["a"].locals||{};class OC extends yk{constructor(t){super(t);this.body=new Xk(t)}render(){super.render();this.body.attachToDom()}destroy(){this.body.detachFromDom();return super.destroy()}}var NC=n(25);var MC={injectType:"singletonStyleTag",attributes:{"data-cke":true}};MC.insert="head";MC.singleton=true;var VC=wk()(NC["a"],MC);var LC=NC["a"].locals||{};class HC extends yk{constructor(t){super(t);this.set("text");this.set("for");this.id=`ck-editor__label_${a()}`;const e=this.bindTemplate;this.setTemplate({tag:"label",attributes:{class:["ck","ck-label"],id:this.id,for:e.to("for")},children:[{text:e.to("text")}]})}}class KC extends OC{constructor(t){super(t);this.top=this.createCollection();this.main=this.createCollection();this._voiceLabelView=this._createVoiceLabel();this.setTemplate({tag:"div",attributes:{class:["ck","ck-reset","ck-editor","ck-rounded-corners"],role:"application",dir:t.uiLanguageDirection,lang:t.uiLanguage,"aria-labelledby":this._voiceLabelView.id},children:[this._voiceLabelView,{tag:"div",attributes:{class:["ck","ck-editor__top","ck-reset_all"],role:"presentation"},children:this.top},{tag:"div",attributes:{class:["ck","ck-editor__main"],role:"presentation"},children:this.main}]})}_createVoiceLabel(){const t=this.t;const e=new HC;e.text=t("Rich Text Editor");e.extendTemplate({attributes:{class:"ck-voice-label"}});return e}}class qC extends yk{constructor(t,e,n){super(t);this.setTemplate({tag:"div",attributes:{class:["ck","ck-content","ck-editor__editable","ck-rounded-corners"],lang:t.contentLanguage,dir:t.contentLanguageDirection}});this.name=null;this.set("isFocused",false);this._editableElement=n;this._hasExternalElement=!!this._editableElement;this._editingView=e}render(){super.render();if(this._hasExternalElement){this.template.apply(this.element=this._editableElement)}else{this._editableElement=this.element}this.on("change:isFocused",(()=>this._updateIsFocusedClasses()));this._updateIsFocusedClasses()}destroy(){if(this._hasExternalElement){this.template.revert(this._editableElement)}super.destroy()}_updateIsFocusedClasses(){const t=this._editingView;if(t.isRenderingInProgress){n(this)}else{e(this)}function e(e){t.change((n=>{const o=t.document.getRoot(e.name);n.addClass(e.isFocused?"ck-focused":"ck-blurred",o);n.removeClass(e.isFocused?"ck-blurred":"ck-focused",o)}))}function n(o){t.once("change:isRenderingInProgress",((t,i,r)=>{if(!r){e(o)}else{n(o)}}))}}}class jC extends qC{constructor(t,e,n){super(t,e,n);this.extendTemplate({attributes:{role:"textbox",class:"ck-editor__editable_inline"}})}render(){super.render();const t=this._editingView;const e=this.t;t.change((n=>{const o=t.document.getRoot(this.name);n.setAttribute("aria-label",e("Rich Text Editor, %0",this.name),o)}))}}var WC=n(26);var GC={injectType:"singletonStyleTag",attributes:{"data-cke":true}};GC.insert="head";GC.singleton=true;var UC=wk()(WC["a"],GC);var $C=WC["a"].locals||{};class JC extends yk{constructor(t,e={}){super(t);const n=this.bindTemplate;this.set("label",e.label||"");this.set("class",e.class||null);this.children=this.createCollection();this.setTemplate({tag:"div",attributes:{class:["ck","ck-form__header",n.to("class")]},children:this.children});const o=new yk(t);o.setTemplate({tag:"span",attributes:{class:["ck","ck-form__header__label"]},children:[{text:n.to("label")}]});this.children.add(o)}}var YC=n(27);var QC={injectType:"singletonStyleTag",attributes:{"data-cke":true}};QC.insert="head";QC.singleton=true;var XC=wk()(YC["a"],QC);var ZC=YC["a"].locals||{};class tA extends yk{constructor(t){super(t);this.set("value");this.set("id");this.set("placeholder");this.set("isReadOnly",false);this.set("hasError",false);this.set("ariaDescribedById");this.focusTracker=new mf;this.bind("isFocused").to(this.focusTracker);this.set("isEmpty",true);const e=this.bindTemplate;this.setTemplate({tag:"input",attributes:{type:"text",class:["ck","ck-input","ck-input-text",e.if("isFocused","ck-input_focused"),e.if("isEmpty","ck-input-text_empty"),e.if("hasError","ck-error")],id:e.to("id"),placeholder:e.to("placeholder"),readonly:e.to("isReadOnly"),"aria-invalid":e.if("hasError",true),"aria-describedby":e.to("ariaDescribedById")},on:{input:e.to("input"),change:e.to(this._updateIsEmpty.bind(this))}})}render(){super.render();this.focusTracker.add(this.element);this._setDomElementValue(this.value);this._updateIsEmpty();this.on("change:value",((t,e,n)=>{this._setDomElementValue(n);this._updateIsEmpty()}))}select(){this.element.select()}focus(){this.element.focus()}_updateIsEmpty(){this.isEmpty=eA(this.element)}_setDomElementValue(t){this.element.value=!t&&t!==0?"":t}}function eA(t){return!t.value}var nA=n(28);var oA={injectType:"singletonStyleTag",attributes:{"data-cke":true}};oA.insert="head";oA.singleton=true;var iA=wk()(nA["a"],oA);var rA=nA["a"].locals||{};class sA extends yk{constructor(t,e){super(t);const n=`ck-labeled-field-view-${a()}`;const o=`ck-labeled-field-view-status-${a()}`;this.fieldView=e(this,n,o);this.set("label");this.set("isEnabled",true);this.set("isEmpty",true);this.set("isFocused",false);this.set("errorText",null);this.set("infoText",null);this.set("class");this.set("placeholder");this.labelView=this._createLabelView(n);this.statusView=this._createStatusView(o);this.bind("_statusText").to(this,"errorText",this,"infoText",((t,e)=>t||e));const i=this.bindTemplate;this.setTemplate({tag:"div",attributes:{class:["ck","ck-labeled-field-view",i.to("class"),i.if("isEnabled","ck-disabled",(t=>!t)),i.if("isEmpty","ck-labeled-field-view_empty"),i.if("isFocused","ck-labeled-field-view_focused"),i.if("placeholder","ck-labeled-field-view_placeholder"),i.if("errorText","ck-error")]},children:[{tag:"div",attributes:{class:["ck","ck-labeled-field-view__input-wrapper"]},children:[this.fieldView,this.labelView]},this.statusView]})}_createLabelView(t){const e=new HC(this.locale);e.for=t;e.bind("text").to(this,"label");return e}_createStatusView(t){const e=new yk(this.locale);const n=this.bindTemplate;e.setTemplate({tag:"div",attributes:{class:["ck","ck-labeled-field-view__status",n.if("errorText","ck-labeled-field-view__status_error"),n.if("_statusText","ck-hidden",(t=>!t))],id:t,role:n.if("errorText","alert")},children:[{text:n.to("_statusText")}]});return e}focus(){this.fieldView.focus()}}function aA(t,e,n){const o=new tA(t.locale);o.set({id:e,ariaDescribedById:n});o.bind("isReadOnly").to(t,"isEnabled",(t=>!t));o.bind("hasError").to(t,"errorText",(t=>!!t));o.on("input",(()=>{t.errorText=null}));t.bind("isEmpty","isFocused","placeholder").to(o);return o}function cA(t,e,n){const o=xC(t.locale);o.set({id:e,ariaDescribedById:n});o.bind("isEnabled").to(t);return o}class lA extends Pa{static get pluginName(){return"Notification"}init(){this.on("show:warning",((t,e)=>{window.alert(e.message)}),{priority:"lowest"})}showSuccess(t,e={}){this._showNotification({message:t,type:"success",namespace:e.namespace,title:e.title})}showInfo(t,e={}){this._showNotification({message:t,type:"info",namespace:e.namespace,title:e.title})}showWarning(t,e={}){this._showNotification({message:t,type:"warning",namespace:e.namespace,title:e.title})}_showNotification(t){const e=`show:${t.type}`+(t.namespace?`:${t.namespace}`:"");this.fire(e,{message:t.message,type:t.type,title:t.title||""})}}class dA{constructor(t,e){if(e){vn(this,e)}if(t){this.set(t)}}}Hn(dA,Tn);var uA=n(29);var hA={injectType:"singletonStyleTag",attributes:{"data-cke":true}};hA.insert="head";hA.singleton=true;var fA=wk()(uA["a"],hA);var mA=uA["a"].locals||{};const gA=hf("px");const pA=ru.document.body;class bA extends yk{constructor(t){super(t);const e=this.bindTemplate;this.set("top",0);this.set("left",0);this.set("position","arrow_nw");this.set("isVisible",false);this.set("withArrow",true);this.set("class");this.content=this.createCollection();this.setTemplate({tag:"div",attributes:{class:["ck","ck-balloon-panel",e.to("position",(t=>`ck-balloon-panel_${t}`)),e.if("isVisible","ck-balloon-panel_visible"),e.if("withArrow","ck-balloon-panel_with-arrow"),e.to("class")],style:{top:e.to("top",gA),left:e.to("left",gA)}},children:this.content})}show(){this.isVisible=true}hide(){this.isVisible=false}attachTo(t){this.show();const e=bA.defaultPositions;const n=Object.assign({},{element:this.element,positions:[e.southArrowNorth,e.southArrowNorthMiddleWest,e.southArrowNorthMiddleEast,e.southArrowNorthWest,e.southArrowNorthEast,e.northArrowSouth,e.northArrowSouthMiddleWest,e.northArrowSouthMiddleEast,e.northArrowSouthWest,e.northArrowSouthEast],limiter:pA,fitInViewport:true},t);const o=bA._getOptimalPosition(n);const i=parseInt(o.left);const r=parseInt(o.top);const s=o.name;Object.assign(this,{top:r,left:i,position:s})}pin(t){this.unpin();this._pinWhenIsVisibleCallback=()=>{if(this.isVisible){this._startPinning(t)}else{this._stopPinning()}};this._startPinning(t);this.listenTo(this,"change:isVisible",this._pinWhenIsVisibleCallback)}unpin(){if(this._pinWhenIsVisibleCallback){this._stopPinning();this.stopListening(this,"change:isVisible",this._pinWhenIsVisibleCallback);this._pinWhenIsVisibleCallback=null;this.hide()}}_startPinning(t){this.attachTo(t);const e=kA(t.target);const n=t.limiter?kA(t.limiter):pA;this.listenTo(ru.document,"scroll",((o,i)=>{const r=i.target;const s=e&&r.contains(e);const a=n&&r.contains(n);if(s||a||!e||!n){this.attachTo(t)}}),{useCapture:true});this.listenTo(ru.window,"resize",(()=>{this.attachTo(t)}))}_stopPinning(){this.stopListening(ru.document,"scroll");this.stopListening(ru.window,"resize")}}function kA(t){if(fa(t)){return t}if(ef(t)){return t.commonAncestorContainer}if(typeof t=="function"){return kA(t())}return null}bA.arrowHorizontalOffset=25;bA.arrowVerticalOffset=10;bA._getOptimalPosition=jw;bA.defaultPositions={northWestArrowSouthWest:(t,e)=>({top:wA(t,e),left:t.left-bA.arrowHorizontalOffset,name:"arrow_sw"}),northWestArrowSouthMiddleWest:(t,e)=>({top:wA(t,e),left:t.left-e.width*.25-bA.arrowHorizontalOffset,name:"arrow_smw"}),northWestArrowSouth:(t,e)=>({top:wA(t,e),left:t.left-e.width/2,name:"arrow_s"}),northWestArrowSouthMiddleEast:(t,e)=>({top:wA(t,e),left:t.left-e.width*.75+bA.arrowHorizontalOffset,name:"arrow_sme"}),northWestArrowSouthEast:(t,e)=>({top:wA(t,e),left:t.left-e.width+bA.arrowHorizontalOffset,name:"arrow_se"}),northArrowSouthWest:(t,e)=>({top:wA(t,e),left:t.left+t.width/2-bA.arrowHorizontalOffset,name:"arrow_sw"}),northArrowSouthMiddleWest:(t,e)=>({top:wA(t,e),left:t.left+t.width/2-e.width*.25-bA.arrowHorizontalOffset,name:"arrow_smw"}),northArrowSouth:(t,e)=>({top:wA(t,e),left:t.left+t.width/2-e.width/2,name:"arrow_s"}),northArrowSouthMiddleEast:(t,e)=>({top:wA(t,e),left:t.left+t.width/2-e.width*.75+bA.arrowHorizontalOffset,name:"arrow_sme"}),northArrowSouthEast:(t,e)=>({top:wA(t,e),left:t.left+t.width/2-e.width+bA.arrowHorizontalOffset,name:"arrow_se"}),northEastArrowSouthWest:(t,e)=>({top:wA(t,e),left:t.right-bA.arrowHorizontalOffset,name:"arrow_sw"}),northEastArrowSouthMiddleWest:(t,e)=>({top:wA(t,e),left:t.right-e.width*.25-bA.arrowHorizontalOffset,name:"arrow_smw"}),northEastArrowSouth:(t,e)=>({top:wA(t,e),left:t.right-e.width/2,name:"arrow_s"}),northEastArrowSouthMiddleEast:(t,e)=>({top:wA(t,e),left:t.right-e.width*.75+bA.arrowHorizontalOffset,name:"arrow_sme"}),northEastArrowSouthEast:(t,e)=>({top:wA(t,e),left:t.right-e.width+bA.arrowHorizontalOffset,name:"arrow_se"}),southWestArrowNorthWest:(t,e)=>({top:CA(t,e),left:t.left-bA.arrowHorizontalOffset,name:"arrow_nw"}),southWestArrowNorthMiddleWest:(t,e)=>({top:CA(t,e),left:t.left-e.width*.25-bA.arrowHorizontalOffset,name:"arrow_nmw"}),southWestArrowNorth:(t,e)=>({top:CA(t,e),left:t.left-e.width/2,name:"arrow_n"}),southWestArrowNorthMiddleEast:(t,e)=>({top:CA(t,e),left:t.left-e.width*.75+bA.arrowHorizontalOffset,name:"arrow_nme"}),southWestArrowNorthEast:(t,e)=>({top:CA(t,e),left:t.left-e.width+bA.arrowHorizontalOffset,name:"arrow_ne"}),southArrowNorthWest:(t,e)=>({top:CA(t,e),left:t.left+t.width/2-bA.arrowHorizontalOffset,name:"arrow_nw"}),southArrowNorthMiddleWest:(t,e)=>({top:CA(t,e),left:t.left+t.width/2-e.width*.25-bA.arrowHorizontalOffset,name:"arrow_nmw"}),southArrowNorth:(t,e)=>({top:CA(t,e),left:t.left+t.width/2-e.width/2,name:"arrow_n"}),southArrowNorthMiddleEast:(t,e)=>({top:CA(t,e),left:t.left+t.width/2-e.width*.75+bA.arrowHorizontalOffset,name:"arrow_nme"}),southArrowNorthEast:(t,e)=>({top:CA(t,e),left:t.left+t.width/2-e.width+bA.arrowHorizontalOffset,name:"arrow_ne"}),southEastArrowNorthWest:(t,e)=>({top:CA(t,e),left:t.right-bA.arrowHorizontalOffset,name:"arrow_nw"}),southEastArrowNorthMiddleWest:(t,e)=>({top:CA(t,e),left:t.right-e.width*.25-bA.arrowHorizontalOffset,name:"arrow_nmw"}),southEastArrowNorth:(t,e)=>({top:CA(t,e),left:t.right-e.width/2,name:"arrow_n"}),southEastArrowNorthMiddleEast:(t,e)=>({top:CA(t,e),left:t.right-e.width*.75+bA.arrowHorizontalOffset,name:"arrow_nme"}),southEastArrowNorthEast:(t,e)=>({top:CA(t,e),left:t.right-e.width+bA.arrowHorizontalOffset,name:"arrow_ne"})};function wA(t,e){return t.top-e.height-bA.arrowVerticalOffset}function CA(t){return t.bottom+bA.arrowVerticalOffset}var AA='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M11.463 5.187a.888.888 0 1 1 1.254 1.255L9.16 10l3.557 3.557a.888.888 0 1 1-1.254 1.255L7.26 10.61a.888.888 0 0 1 .16-1.382l4.043-4.042z"/></svg>';var _A='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M8.537 14.813a.888.888 0 1 1-1.254-1.255L10.84 10 7.283 6.442a.888.888 0 1 1 1.254-1.255L12.74 9.39a.888.888 0 0 1-.16 1.382l-4.043 4.042z"/></svg>';var vA=n(30);var yA={injectType:"singletonStyleTag",attributes:{"data-cke":true}};yA.insert="head";yA.singleton=true;var xA=wk()(vA["a"],yA);var EA=vA["a"].locals||{};var DA=n(31);var SA={injectType:"singletonStyleTag",attributes:{"data-cke":true}};SA.insert="head";SA.singleton=true;var BA=wk()(DA["a"],SA);var TA=DA["a"].locals||{};const PA=hf("px");class IA extends Kn{static get pluginName(){return"ContextualBalloon"}constructor(t){super(t);this.positionLimiter=()=>{const t=this.editor.editing.view;const e=t.document;const n=e.selection.editableElement;if(n){return t.domConverter.mapViewToDom(n.root)}return null};this.set("visibleView",null);this.view=new bA(t.locale);t.ui.view.body.add(this.view);t.ui.focusTracker.add(this.view.element);this._viewToStack=new Map;this._idToStack=new Map;this.set("_numberOfStacks",0);this.set("_singleViewMode",false);this._rotatorView=this._createRotatorView();this._fakePanelsView=this._createFakePanelsView()}hasView(t){return Array.from(this._viewToStack.keys()).includes(t)}add(t){if(this.hasView(t.view)){throw new u["a"]("contextualballoon-add-view-exist",[this,t])}const e=t.stackId||"main";if(!this._idToStack.has(e)){this._idToStack.set(e,new Map([[t.view,t]]));this._viewToStack.set(t.view,this._idToStack.get(e));this._numberOfStacks=this._idToStack.size;if(!this._visibleStack||t.singleViewMode){this.showStack(e)}return}const n=this._idToStack.get(e);if(t.singleViewMode){this.showStack(e)}n.set(t.view,t);this._viewToStack.set(t.view,n);if(n===this._visibleStack){this._showView(t)}}remove(t){if(!this.hasView(t)){throw new u["a"]("contextualballoon-remove-view-not-exist",[this,t])}const e=this._viewToStack.get(t);if(this._singleViewMode&&this.visibleView===t){this._singleViewMode=false}if(this.visibleView===t){if(e.size===1){if(this._idToStack.size>1){this._showNextStack()}else{this.view.hide();this.visibleView=null;this._rotatorView.hideView()}}else{this._showView(Array.from(e.values())[e.size-2])}}if(e.size===1){this._idToStack.delete(this._getStackId(e));this._numberOfStacks=this._idToStack.size}else{e.delete(t)}this._viewToStack.delete(t)}updatePosition(t){if(t){this._visibleStack.get(this.visibleView).position=t}this.view.pin(this._getBalloonPosition());this._fakePanelsView.updatePosition()}showStack(t){this.visibleStack=t;const e=this._idToStack.get(t);if(!e){throw new u["a"]("contextualballoon-showstack-stack-not-exist",this)}if(this._visibleStack===e){return}this._showView(Array.from(e.values()).pop())}get _visibleStack(){return this._viewToStack.get(this.visibleView)}_getStackId(t){const e=Array.from(this._idToStack.entries()).find((e=>e[1]===t));return e[0]}_showNextStack(){const t=Array.from(this._idToStack.values());let e=t.indexOf(this._visibleStack)+1;if(!t[e]){e=0}this.showStack(this._getStackId(t[e]))}_showPrevStack(){const t=Array.from(this._idToStack.values());let e=t.indexOf(this._visibleStack)-1;if(!t[e]){e=t.length-1}this.showStack(this._getStackId(t[e]))}_createRotatorView(){const t=new RA(this.editor.locale);const e=this.editor.locale.t;this.view.content.add(t);t.bind("isNavigationVisible").to(this,"_numberOfStacks",this,"_singleViewMode",((t,e)=>!e&&t>1));t.on("change:isNavigationVisible",(()=>this.updatePosition()),{priority:"low"});t.bind("counter").to(this,"visibleView",this,"_numberOfStacks",((t,n)=>{if(n<2){return""}const o=Array.from(this._idToStack.values()).indexOf(this._visibleStack)+1;return e("%0 of %1",[o,n])}));t.buttonNextView.on("execute",(()=>{if(t.focusTracker.isFocused){this.editor.editing.view.focus()}this._showNextStack()}));t.buttonPrevView.on("execute",(()=>{if(t.focusTracker.isFocused){this.editor.editing.view.focus()}this._showPrevStack()}));return t}_createFakePanelsView(){const t=new FA(this.editor.locale,this.view);t.bind("numberOfPanels").to(this,"_numberOfStacks",this,"_singleViewMode",((t,e)=>{const n=!e&&t>=2;return n?Math.min(t-1,2):0}));t.listenTo(this.view,"change:top",(()=>t.updatePosition()));t.listenTo(this.view,"change:left",(()=>t.updatePosition()));this.editor.ui.view.body.add(t);return t}_showView({view:t,balloonClassName:e="",withArrow:n=true,singleViewMode:o=false}){this.view.class=e;this.view.withArrow=n;this._rotatorView.showView(t);this.visibleView=t;this.view.pin(this._getBalloonPosition());this._fakePanelsView.updatePosition();if(o){this._singleViewMode=true}}_getBalloonPosition(){let t=Array.from(this._visibleStack.values()).pop().position;if(t&&!t.limiter){t=Object.assign({},t,{limiter:this.positionLimiter})}return t}}class RA extends yk{constructor(t){super(t);const e=t.t;const n=this.bindTemplate;this.set("isNavigationVisible",true);this.focusTracker=new mf;this.buttonPrevView=this._createButtonView(e("Previous"),AA);this.buttonNextView=this._createButtonView(e("Next"),_A);this.content=this.createCollection();this.setTemplate({tag:"div",attributes:{class:["ck","ck-balloon-rotator"],"z-index":"-1"},children:[{tag:"div",attributes:{class:["ck-balloon-rotator__navigation",n.to("isNavigationVisible",(t=>t?"":"ck-hidden"))]},children:[this.buttonPrevView,{tag:"span",attributes:{class:["ck-balloon-rotator__counter"]},children:[{text:n.to("counter")}]},this.buttonNextView]},{tag:"div",attributes:{class:"ck-balloon-rotator__content"},children:this.content}]})}render(){super.render();this.focusTracker.add(this.element)}showView(t){this.hideView();this.content.add(t)}hideView(){this.content.clear()}_createButtonView(t,e){const n=new fw(this.locale);n.set({label:t,icon:e,tooltip:true});return n}}class FA extends yk{constructor(t,e){super(t);const n=this.bindTemplate;this.set("top",0);this.set("left",0);this.set("height",0);this.set("width",0);this.set("numberOfPanels",0);this.content=this.createCollection();this._balloonPanelView=e;this.setTemplate({tag:"div",attributes:{class:["ck-fake-panel",n.to("numberOfPanels",(t=>t?"":"ck-hidden"))],style:{top:n.to("top",PA),left:n.to("left",PA),width:n.to("width",PA),height:n.to("height",PA)}},children:this.content});this.on("change:numberOfPanels",((t,e,n,o)=>{if(n>o){this._addPanels(n-o)}else{this._removePanels(o-n)}this.updatePosition()}))}_addPanels(t){while(t--){const t=new yk;t.setTemplate({tag:"div"});this.content.add(t);this.registerChild(t)}}_removePanels(t){while(t--){const t=this.content.last;this.content.remove(t);this.deregisterChild(t);t.destroy()}}updatePosition(){if(this.numberOfPanels){const{top:t,left:e}=this._balloonPanelView;const{width:n,height:o}=new rf(this._balloonPanelView.element);Object.assign(this,{top:t,left:e,width:n,height:o})}}}var zA=n(32);var OA={injectType:"singletonStyleTag",attributes:{"data-cke":true}};OA.insert="head";OA.singleton=true;var NA=wk()(zA["a"],OA);var MA=zA["a"].locals||{};const VA=hf("px");class LA extends yk{constructor(t){super(t);const e=this.bindTemplate;this.set("isActive",false);this.set("isSticky",false);this.set("limiterElement",null);this.set("limiterBottomOffset",50);this.set("viewportTopOffset",0);this.set("_marginLeft",null);this.set("_isStickyToTheLimiter",false);this.set("_hasViewportTopOffset",false);this.content=this.createCollection();this._contentPanelPlaceholder=new Ek({tag:"div",attributes:{class:["ck","ck-sticky-panel__placeholder"],style:{display:e.to("isSticky",(t=>t?"block":"none")),height:e.to("isSticky",(t=>t?VA(this._panelRect.height):null))}}}).render();this._contentPanel=new Ek({tag:"div",attributes:{class:["ck","ck-sticky-panel__content",e.if("isSticky","ck-sticky-panel__content_sticky"),e.if("_isStickyToTheLimiter","ck-sticky-panel__content_sticky_bottom-limit")],style:{width:e.to("isSticky",(t=>t?VA(this._contentPanelPlaceholder.getBoundingClientRect().width):null)),top:e.to("_hasViewportTopOffset",(t=>t?VA(this.viewportTopOffset):null)),bottom:e.to("_isStickyToTheLimiter",(t=>t?VA(this.limiterBottomOffset):null)),marginLeft:e.to("_marginLeft")}},children:this.content}).render();this.setTemplate({tag:"div",attributes:{class:["ck","ck-sticky-panel"]},children:[this._contentPanelPlaceholder,this._contentPanel]})}render(){super.render();this._checkIfShouldBeSticky();this.listenTo(ru.window,"scroll",(()=>{this._checkIfShouldBeSticky()}));this.listenTo(this,"change:isActive",(()=>{this._checkIfShouldBeSticky()}))}_checkIfShouldBeSticky(){const t=this._panelRect=this._contentPanel.getBoundingClientRect();let e;if(!this.limiterElement){this.isSticky=false}else{e=this._limiterRect=this.limiterElement.getBoundingClientRect();this.isSticky=this.isActive&&e.top<this.viewportTopOffset&&this._panelRect.height+this.limiterBottomOffset<e.height}if(this.isSticky){this._isStickyToTheLimiter=e.bottom<t.height+this.limiterBottomOffset+this.viewportTopOffset;this._hasViewportTopOffset=!this._isStickyToTheLimiter&&!!this.viewportTopOffset;this._marginLeft=this._isStickyToTheLimiter?null:VA(-ru.window.scrollX)}else{this._isStickyToTheLimiter=false;this._hasViewportTopOffset=false;this._marginLeft=null}}}function HA({origin:t,originKeystrokeHandler:e,originFocusTracker:n,toolbar:o,beforeFocus:i,afterBlur:r}){n.add(o.element);e.set("Alt+F10",((t,e)=>{if(n.isFocused&&!o.focusTracker.isFocused){if(i){i()}o.focus();e()}}));o.keystrokes.set("Esc",((e,n)=>{if(o.focusTracker.isFocused){t.focus();if(r){r()}n()}}))}const KA=hf("px");class qA extends Kn{static get pluginName(){return"BalloonToolbar"}static get requires(){return[IA]}constructor(t){super(t);this._balloonConfig=eC(t.config.get("balloonToolbar"));this.toolbarView=this._createToolbarView();this.focusTracker=new mf;t.ui.once("ready",(()=>{this.focusTracker.add(t.ui.getEditableElement());this.focusTracker.add(this.toolbarView.element)}));this._resizeObserver=null;this._balloon=t.plugins.get(IA);this._fireSelectionChangeDebounced=qh((()=>this.fire("_selectionChangeDebounced")),200);this.decorate("show")}init(){const t=this.editor;const e=t.model.document.selection;this.listenTo(this.focusTracker,"change:isFocused",((t,e,n)=>{const o=this._balloon.visibleView===this.toolbarView;if(!n&&o){this.hide()}else if(n){this.show()}}));this.listenTo(e,"change:range",((t,n)=>{if(n.directChange||e.isCollapsed){this.hide()}this._fireSelectionChangeDebounced()}));this.listenTo(this,"_selectionChangeDebounced",(()=>{if(this.editor.editing.view.document.isFocused){this.show()}}));if(!this._balloonConfig.shouldNotGroupWhenFull){this.listenTo(t,"ready",(()=>{const e=t.ui.view.editable.element;this._resizeObserver=new lf(e,(()=>{this.toolbarView.maxWidth=KA(new rf(e).width*.9)}))}))}this.listenTo(this.toolbarView,"groupedItemsUpdate",(()=>{this._updatePosition()}))}afterInit(){const t=this.editor.ui.componentFactory;this.toolbarView.fillFromConfig(this._balloonConfig,t)}_createToolbarView(){const t=!this._balloonConfig.shouldNotGroupWhenFull;const e=new sC(this.editor.locale,{shouldGroupWhenFull:t,isFloating:true});e.render();return e}show(){const t=this.editor;const e=t.model.document.selection;const n=t.model.schema;if(this._balloon.hasView(this.toolbarView)){return}if(e.isCollapsed){return}if(WA(e,n)){return}if(Array.from(this.toolbarView.items).every((t=>t.isEnabled!==undefined&&!t.isEnabled))){return}this.listenTo(this.editor.ui,"update",(()=>{this._updatePosition()}));this._balloon.add({view:this.toolbarView,position:this._getBalloonPositionData(),balloonClassName:"ck-toolbar-container"})}hide(){if(this._balloon.hasView(this.toolbarView)){this.stopListening(this.editor.ui,"update");this._balloon.remove(this.toolbarView)}}_getBalloonPositionData(){const t=this.editor;const e=t.editing.view;const n=e.document;const o=n.selection;const i=n.selection.isBackward;return{target:()=>{const t=i?o.getFirstRange():o.getLastRange();const n=rf.getDomRangeRects(e.domConverter.viewRangeToDom(t));if(i){return n[0]}else{if(n.length>1&&n[n.length-1].width===0){n.pop()}return n[n.length-1]}},positions:jA(i)}}_updatePosition(){this._balloon.updatePosition(this._getBalloonPositionData())}destroy(){super.destroy();this.stopListening();this._fireSelectionChangeDebounced.cancel();this.toolbarView.destroy();this.focusTracker.destroy();if(this._resizeObserver){this._resizeObserver.destroy()}}}function jA(t){const e=bA.defaultPositions;return t?[e.northWestArrowSouth,e.northWestArrowSouthWest,e.northWestArrowSouthEast,e.northWestArrowSouthMiddleEast,e.northWestArrowSouthMiddleWest,e.southWestArrowNorth,e.southWestArrowNorthWest,e.southWestArrowNorthEast,e.southWestArrowNorthMiddleWest,e.southWestArrowNorthMiddleEast]:[e.southEastArrowNorth,e.southEastArrowNorthEast,e.southEastArrowNorthWest,e.southEastArrowNorthMiddleEast,e.southEastArrowNorthMiddleWest,e.northEastArrowSouth,e.northEastArrowSouthEast,e.northEastArrowSouthWest,e.northEastArrowSouthMiddleEast,e.northEastArrowSouthMiddleWest]}function WA(t,e){if(t.rangeCount===1){return false}return[...t.getRanges()].every((t=>{const n=t.getContainedElement();return n&&e.isSelectable(n)}))}var GA=n(33);var UA={injectType:"singletonStyleTag",attributes:{"data-cke":true}};UA.insert="head";UA.singleton=true;var $A=wk()(GA["a"],UA);var JA=GA["a"].locals||{};const YA=hf("px");class QA extends fw{constructor(t){super(t);const e=this.bindTemplate;this.isVisible=false;this.isToggleable=true;this.set("top",0);this.set("left",0);this.extendTemplate({attributes:{class:"ck-block-toolbar-button",style:{top:e.to("top",(t=>YA(t))),left:e.to("left",(t=>YA(t)))}}})}}const XA=hf("px");class ZA extends Kn{static get pluginName(){return"BlockToolbar"}constructor(t){super(t);this._blockToolbarConfig=eC(this.editor.config.get("blockToolbar"));this.toolbarView=this._createToolbarView();this.panelView=this._createPanelView();this.buttonView=this._createButtonView();this._resizeObserver=null;fk({emitter:this.panelView,contextElements:[this.panelView.element,this.buttonView.element],activator:()=>this.panelView.isVisible,callback:()=>this._hidePanel()})}init(){const t=this.editor;this.listenTo(t.model.document.selection,"change:range",((t,e)=>{if(e.directChange){this._hidePanel()}}));this.listenTo(t.ui,"update",(()=>this._updateButton()));this.listenTo(t,"change:isReadOnly",(()=>this._updateButton()),{priority:"low"});this.listenTo(t.ui.focusTracker,"change:isFocused",(()=>this._updateButton()));this.listenTo(this.buttonView,"change:isVisible",((t,e,n)=>{if(n){this.buttonView.listenTo(window,"resize",(()=>this._updateButton()))}else{this.buttonView.stopListening(window,"resize");this._hidePanel()}}))}afterInit(){const t=this.editor.ui.componentFactory;const e=this._blockToolbarConfig;this.toolbarView.fillFromConfig(e,t);for(const t of this.toolbarView.items){t.on("execute",(()=>this._hidePanel(true)),{priority:"high"})}if(!e.shouldNotGroupWhenFull){this.listenTo(this.editor,"ready",(()=>{const t=this.editor.ui.view.editable.element;this._resizeObserver=new lf(t,(()=>{this.toolbarView.maxWidth=this._getToolbarMaxWidth()}))}))}}destroy(){super.destroy();this.panelView.destroy();this.buttonView.destroy();this.toolbarView.destroy();if(this._resizeObserver){this._resizeObserver.destroy()}}_createToolbarView(){const t=!this._blockToolbarConfig.shouldNotGroupWhenFull;const e=new sC(this.editor.locale,{shouldGroupWhenFull:t,isFloating:true});e.focusTracker.on("change:isFocused",((t,e,n)=>{if(!n){this._hidePanel()}}));return e}_createPanelView(){const t=this.editor;const e=new bA(t.locale);e.content.add(this.toolbarView);e.class="ck-toolbar-container";t.ui.view.body.add(e);t.ui.focusTracker.add(e.element);this.toolbarView.keystrokes.set("Esc",((t,e)=>{this._hidePanel(true);e()}));return e}_createButtonView(){const t=this.editor;const e=t.t;const n=new QA(t.locale);n.set({label:e("Edit block"),icon:hk.pilcrow,withText:false});n.bind("isOn").to(this.panelView,"isVisible");n.bind("tooltip").to(this.panelView,"isVisible",(t=>!t));this.listenTo(n,"execute",(()=>{if(!this.panelView.isVisible){this._showPanel()}else{this._hidePanel(true)}}));t.ui.view.body.add(n);t.ui.focusTracker.add(n.element);return n}_updateButton(){const t=this.editor;const e=t.model;const n=t.editing.view;if(!t.ui.focusTracker.isFocused){this._hideButton();return}if(t.isReadOnly){this._hideButton();return}const o=Array.from(e.document.selection.getSelectedBlocks())[0];if(!o||Array.from(this.toolbarView.items).every((t=>!t.isEnabled))){this._hideButton();return}const i=n.domConverter.mapViewToDom(t.editing.mapper.toViewElement(o));this.buttonView.isVisible=true;this._attachButtonToElement(i);if(this.panelView.isVisible){this._showPanel()}}_hideButton(){this.buttonView.isVisible=false}_showPanel(){const t=this.panelView.isVisible;this.panelView.show();this.toolbarView.maxWidth=this._getToolbarMaxWidth();this.panelView.pin({target:this.buttonView.element,limiter:this.editor.ui.getEditableElement()});if(!t){this.toolbarView.items.get(0).focus()}}_hidePanel(t){this.panelView.isVisible=false;if(t){this.editor.editing.view.focus()}}_attachButtonToElement(t){const e=window.getComputedStyle(t);const n=new rf(this.editor.ui.getEditableElement());const o=parseInt(e.paddingTop,10);const i=parseInt(e.lineHeight,10)||parseInt(e.fontSize,10)*1.2;const r=jw({element:this.buttonView.element,target:t,positions:[(t,e)=>{let r;if(this.editor.locale.uiLanguageDirection==="ltr"){r=n.left-e.width}else{r=n.right}return{top:t.top+o+(i-e.height)/2,left:r}}]});this.buttonView.top=r.top;this.buttonView.left=r.left}_getToolbarMaxWidth(){const t=this.editor.ui.view.editable.element;const e=new rf(t);const n=new rf(this.buttonView.element);const o=this.editor.locale.uiLanguageDirection==="rtl";const i=o?n.left-e.right+n.width:e.left-n.left;return XA(e.width+i)}}var t_=n(34);var e_={injectType:"singletonStyleTag",attributes:{"data-cke":true}};e_.insert="head";e_.singleton=true;var n_=wk()(t_["a"],e_);var o_=t_["a"].locals||{};const i_=new WeakMap;function r_(t){const{view:e,element:n,text:o,isDirectHost:i=true,keepOnFocus:r=false}=t;const s=e.document;if(!i_.has(s)){i_.set(s,new Map);s.registerPostFixer((t=>d_(s,t)))}i_.get(s).set(n,{text:o,isDirectHost:i,keepOnFocus:r,hostElement:i?n:null});e.change((t=>d_(s,t)))}function s_(t,e){const n=e.document;t.change((t=>{if(!i_.has(n)){return}const o=i_.get(n);const i=o.get(e);t.removeAttribute("data-placeholder",i.hostElement);c_(t,i.hostElement);o.delete(e)}))}function a_(t,e){if(!e.hasClass("ck-placeholder")){t.addClass("ck-placeholder",e);return true}return false}function c_(t,e){if(e.hasClass("ck-placeholder")){t.removeClass("ck-placeholder",e);return true}return false}function l_(t,e){if(!t.isAttached()){return false}const n=Array.from(t.getChildren()).some((t=>!t.is("uiElement")));if(n){return false}if(e){return true}const o=t.document;if(!o.isFocused){return true}const i=o.selection;const r=i.anchor;return r&&r.parent!==t}function d_(t,e){const n=i_.get(t);const o=[];let i=false;for(const[t,r]of n){if(r.isDirectHost){o.push(t);if(u_(e,t,r)){i=true}}}for(const[t,r]of n){if(r.isDirectHost){continue}const n=h_(t);if(!n){continue}if(o.includes(n)){continue}r.hostElement=n;if(u_(e,t,r)){i=true}}return i}function u_(t,e,n){const{text:o,isDirectHost:i,hostElement:r}=n;let s=false;if(r.getAttribute("data-placeholder")!==o){t.setAttribute("data-placeholder",o,r);s=true}const a=i||e.childCount==1;if(a&&l_(r,n.keepOnFocus)){if(a_(t,r)){s=true}}else if(c_(t,r)){s=true}return s}function h_(t){if(t.childCount){const e=t.getChild(0);if(e.is("element")&&!e.is("uiElement")){return e}}return null}const f_=new Map;function m_(t,e,n){let o=f_.get(t);if(!o){o=new Map;f_.set(t,o)}o.set(e,n)}function g_(t,e){const n=f_.get(t);if(n&&n.has(e)){return n.get(e)}return p_}function p_(t){return[t]}function b_(t,e,n={}){const o=g_(t.constructor,e.constructor);try{t=t.clone();return o(t,e,n)}catch(t){throw t}}function k_(t,e,n){t=t.slice();e=e.slice();const o=new w_(n.document,n.useRelations,n.forceWeakRemove);o.setOriginalOperations(t);o.setOriginalOperations(e);const i=o.originalOperations;if(t.length==0||e.length==0){return{operationsA:t,operationsB:e,originalOperations:i}}const r=new WeakMap;for(const e of t){r.set(e,0)}const s={nextBaseVersionA:t[t.length-1].baseVersion+1,nextBaseVersionB:e[e.length-1].baseVersion+1,originalOperationsACount:t.length,originalOperationsBCount:e.length};let a=0;while(a<t.length){const n=t[a];const i=r.get(n);if(i==e.length){a++;continue}const s=e[i];const c=b_(n,s,o.getContext(n,s,true));const l=b_(s,n,o.getContext(s,n,false));o.updateRelation(n,s);o.setOriginalOperations(c,n);o.setOriginalOperations(l,s);for(const t of c){r.set(t,i+l.length)}t.splice(a,1,...c);e.splice(i,1,...l)}if(n.padWithNoOps){const n=t.length-s.originalOperationsACount;const o=e.length-s.originalOperationsBCount;A_(t,o-n);A_(e,n-o)}C_(t,s.nextBaseVersionB);C_(e,s.nextBaseVersionA);return{operationsA:t,operationsB:e,originalOperations:i}}class w_{constructor(t,e,n=false){this.originalOperations=new Map;this._history=t.history;this._useRelations=e;this._forceWeakRemove=!!n;this._relations=new Map}setOriginalOperations(t,e=null){const n=e?this.originalOperations.get(e):null;for(const e of t){this.originalOperations.set(e,n||e)}}updateRelation(t,e){switch(t.constructor){case up:{switch(e.constructor){case pp:{if(t.targetPosition.isEqual(e.sourcePosition)||e.movedRange.containsPosition(t.targetPosition)){this._setRelation(t,e,"insertAtSource")}else if(t.targetPosition.isEqual(e.deletionPosition)){this._setRelation(t,e,"insertBetween")}else if(t.targetPosition.isAfter(e.sourcePosition)){this._setRelation(t,e,"moveTargetAfter")}break}case up:{if(t.targetPosition.isEqual(e.sourcePosition)||t.targetPosition.isBefore(e.sourcePosition)){this._setRelation(t,e,"insertBefore")}else{this._setRelation(t,e,"insertAfter")}break}}break}case bp:{switch(e.constructor){case pp:{if(t.splitPosition.isBefore(e.sourcePosition)){this._setRelation(t,e,"splitBefore")}break}case up:{if(t.splitPosition.isEqual(e.sourcePosition)||t.splitPosition.isBefore(e.sourcePosition)){this._setRelation(t,e,"splitBefore")}else{const n=Kf._createFromPositionAndShift(e.sourcePosition,e.howMany);if(t.splitPosition.hasSameParentAs(e.sourcePosition)&&n.containsPosition(t.splitPosition)){const o=n.end.offset-t.splitPosition.offset;const i=t.splitPosition.offset-n.start.offset;this._setRelation(t,e,{howMany:o,offset:i})}}}}break}case pp:{switch(e.constructor){case pp:{if(!t.targetPosition.isEqual(e.sourcePosition)){this._setRelation(t,e,"mergeTargetNotMoved")}if(t.sourcePosition.isEqual(e.targetPosition)){this._setRelation(t,e,"mergeSourceNotMoved")}if(t.sourcePosition.isEqual(e.sourcePosition)){this._setRelation(t,e,"mergeSameElement")}break}case bp:{if(t.sourcePosition.isEqual(e.splitPosition)){this._setRelation(t,e,"splitAtSource")}}}break}case fp:{const n=t.newRange;if(!n){return}switch(e.constructor){case up:{const o=Kf._createFromPositionAndShift(e.sourcePosition,e.howMany);const i=o.containsPosition(n.start)||o.start.isEqual(n.start);const r=o.containsPosition(n.end)||o.end.isEqual(n.end);if((i||r)&&!o.containsRange(n)){this._setRelation(t,e,{side:i?"left":"right",path:i?n.start.path.slice():n.end.path.slice()})}break}case pp:{const o=n.start.isEqual(e.targetPosition);const i=n.start.isEqual(e.deletionPosition);const r=n.end.isEqual(e.deletionPosition);const s=n.end.isEqual(e.sourcePosition);if(o||i||r||s){this._setRelation(t,e,{wasInLeftElement:o,wasStartBeforeMergedElement:i,wasEndBeforeMergedElement:r,wasInRightElement:s})}break}}break}}}getContext(t,e,n){return{aIsStrong:n,aWasUndone:this._wasUndone(t),bWasUndone:this._wasUndone(e),abRelation:this._useRelations?this._getRelation(t,e):null,baRelation:this._useRelations?this._getRelation(e,t):null,forceWeakRemove:this._forceWeakRemove}}_wasUndone(t){const e=this.originalOperations.get(t);return e.wasUndone||this._history.isUndoneOperation(e)}_getRelation(t,e){const n=this.originalOperations.get(e);const o=this._history.getUndoneOperation(n);if(!o){return null}const i=this.originalOperations.get(t);const r=this._relations.get(i);if(r){return r.get(o)||null}return null}_setRelation(t,e,n){const o=this.originalOperations.get(t);const i=this.originalOperations.get(e);let r=this._relations.get(o);if(!r){r=new Map;this._relations.set(o,r)}r.set(i,n)}}function C_(t,e){for(const n of t){n.baseVersion=e++}}function A_(t,e){for(let n=0;n<e;n++){t.push(new Lp(0))}}m_(lp,lp,((t,e,n)=>{if(t.key===e.key&&t.range.start.hasSameParentAs(e.range.start)){const o=t.range.getDifference(e.range).map((e=>new lp(e,t.key,t.oldValue,t.newValue,0)));const i=t.range.getIntersection(e.range);if(i){if(n.aIsStrong){o.push(new lp(i,e.key,e.newValue,t.newValue,0))}}if(o.length==0){return[new Lp(0)]}return o}else{return[t]}}));m_(lp,hp,((t,e)=>{if(t.range.start.hasSameParentAs(e.position)&&t.range.containsPosition(e.position)){const n=t.range._getTransformedByInsertion(e.position,e.howMany,!e.shouldReceiveAttributes);const o=n.map((e=>new lp(e,t.key,t.oldValue,t.newValue,t.baseVersion)));if(e.shouldReceiveAttributes){const n=__(e,t.key,t.oldValue);if(n){o.unshift(n)}}return o}t.range=t.range._getTransformedByInsertion(e.position,e.howMany,false)[0];return[t]}));function __(t,e,n){const o=t.nodes;const i=o.getNode(0).getAttribute(e);if(i==n){return null}const r=new Kf(t.position,t.position.getShiftedBy(t.howMany));return new lp(r,e,i,n,0)}m_(lp,pp,((t,e)=>{const n=[];if(t.range.start.hasSameParentAs(e.deletionPosition)){if(t.range.containsPosition(e.deletionPosition)||t.range.start.isEqual(e.deletionPosition)){n.push(Kf._createFromPositionAndShift(e.graveyardPosition,1))}}const o=t.range._getTransformedByMergeOperation(e);if(!o.isCollapsed){n.push(o)}return n.map((e=>new lp(e,t.key,t.oldValue,t.newValue,t.baseVersion)))}));m_(lp,up,((t,e)=>{const n=v_(t.range,e);return n.map((e=>new lp(e,t.key,t.oldValue,t.newValue,t.baseVersion)))}));function v_(t,e){const n=Kf._createFromPositionAndShift(e.sourcePosition,e.howMany);let o=null;let i=[];if(n.containsRange(t,true)){o=t}else if(t.start.hasSameParentAs(n.start)){i=t.getDifference(n);o=t.getIntersection(n)}else{i=[t]}const r=[];for(let t of i){t=t._getTransformedByDeletion(e.sourcePosition,e.howMany);const n=e.getMovedRangeStart();const o=t.start.hasSameParentAs(n);t=t._getTransformedByInsertion(n,e.howMany,o);r.push(...t)}if(o){r.push(o._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany,false)[0])}return r}m_(lp,bp,((t,e)=>{if(t.range.end.isEqual(e.insertionPosition)){if(!e.graveyardPosition){t.range.end.offset++}return[t]}if(t.range.start.hasSameParentAs(e.splitPosition)&&t.range.containsPosition(e.splitPosition)){const n=t.clone();n.range=new Kf(e.moveTargetPosition.clone(),t.range.end._getCombined(e.splitPosition,e.moveTargetPosition));t.range.end=e.splitPosition.clone();t.range.end.stickiness="toPrevious";return[t,n]}t.range=t.range._getTransformedBySplitOperation(e);return[t]}));m_(hp,lp,((t,e)=>{const n=[t];if(t.shouldReceiveAttributes&&t.position.hasSameParentAs(e.range.start)&&e.range.containsPosition(t.position)){const o=__(t,e.key,e.newValue);if(o){n.push(o)}}return n}));m_(hp,hp,((t,e,n)=>{if(t.position.isEqual(e.position)&&n.aIsStrong){return[t]}t.position=t.position._getTransformedByInsertOperation(e);return[t]}));m_(hp,up,((t,e)=>{t.position=t.position._getTransformedByMoveOperation(e);return[t]}));m_(hp,bp,((t,e)=>{t.position=t.position._getTransformedBySplitOperation(e);return[t]}));m_(hp,pp,((t,e)=>{t.position=t.position._getTransformedByMergeOperation(e);return[t]}));m_(fp,hp,((t,e)=>{if(t.oldRange){t.oldRange=t.oldRange._getTransformedByInsertOperation(e)[0]}if(t.newRange){t.newRange=t.newRange._getTransformedByInsertOperation(e)[0]}return[t]}));m_(fp,fp,((t,e,n)=>{if(t.name==e.name){if(n.aIsStrong){t.oldRange=e.newRange?e.newRange.clone():null}else{return[new Lp(0)]}}return[t]}));m_(fp,pp,((t,e)=>{if(t.oldRange){t.oldRange=t.oldRange._getTransformedByMergeOperation(e)}if(t.newRange){t.newRange=t.newRange._getTransformedByMergeOperation(e)}return[t]}));m_(fp,up,((t,e,n)=>{if(t.oldRange){t.oldRange=Kf._createFromRanges(t.oldRange._getTransformedByMoveOperation(e))}if(t.newRange){if(n.abRelation){const o=Kf._createFromRanges(t.newRange._getTransformedByMoveOperation(e));if(n.abRelation.side=="left"&&e.targetPosition.isEqual(t.newRange.start)){t.newRange.start.path=n.abRelation.path;t.newRange.end=o.end;return[t]}else if(n.abRelation.side=="right"&&e.targetPosition.isEqual(t.newRange.end)){t.newRange.start=o.start;t.newRange.end.path=n.abRelation.path;return[t]}}t.newRange=Kf._createFromRanges(t.newRange._getTransformedByMoveOperation(e))}return[t]}));m_(fp,bp,((t,e,n)=>{if(t.oldRange){t.oldRange=t.oldRange._getTransformedBySplitOperation(e)}if(t.newRange){if(n.abRelation){const o=t.newRange._getTransformedBySplitOperation(e);if(t.newRange.start.isEqual(e.splitPosition)&&n.abRelation.wasStartBeforeMergedElement){t.newRange.start=Mf._createAt(e.insertionPosition)}else if(t.newRange.start.isEqual(e.splitPosition)&&!n.abRelation.wasInLeftElement){t.newRange.start=Mf._createAt(e.moveTargetPosition)}if(t.newRange.end.isEqual(e.splitPosition)&&n.abRelation.wasInRightElement){t.newRange.end=Mf._createAt(e.moveTargetPosition)}else if(t.newRange.end.isEqual(e.splitPosition)&&n.abRelation.wasEndBeforeMergedElement){t.newRange.end=Mf._createAt(e.insertionPosition)}else{t.newRange.end=o.end}return[t]}t.newRange=t.newRange._getTransformedBySplitOperation(e)}return[t]}));m_(pp,hp,((t,e)=>{if(t.sourcePosition.hasSameParentAs(e.position)){t.howMany+=e.howMany}t.sourcePosition=t.sourcePosition._getTransformedByInsertOperation(e);t.targetPosition=t.targetPosition._getTransformedByInsertOperation(e);return[t]}));m_(pp,pp,((t,e,n)=>{if(t.sourcePosition.isEqual(e.sourcePosition)&&t.targetPosition.isEqual(e.targetPosition)){if(!n.bWasUndone){return[new Lp(0)]}else{const n=e.graveyardPosition.path.slice();n.push(0);t.sourcePosition=new Mf(e.graveyardPosition.root,n);t.howMany=0;return[t]}}if(t.sourcePosition.isEqual(e.sourcePosition)&&!t.targetPosition.isEqual(e.targetPosition)&&!n.bWasUndone&&n.abRelation!="splitAtSource"){const o=t.targetPosition.root.rootName=="$graveyard";const i=e.targetPosition.root.rootName=="$graveyard";const r=o&&!i;const s=i&&!o;const a=s||!r&&n.aIsStrong;if(a){const n=e.targetPosition._getTransformedByMergeOperation(e);const o=t.targetPosition._getTransformedByMergeOperation(e);return[new up(n,t.howMany,o,0)]}else{return[new Lp(0)]}}if(t.sourcePosition.hasSameParentAs(e.targetPosition)){t.howMany+=e.howMany}t.sourcePosition=t.sourcePosition._getTransformedByMergeOperation(e);t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e);if(!t.graveyardPosition.isEqual(e.graveyardPosition)||!n.aIsStrong){t.graveyardPosition=t.graveyardPosition._getTransformedByMergeOperation(e)}return[t]}));m_(pp,up,((t,e,n)=>{const o=Kf._createFromPositionAndShift(e.sourcePosition,e.howMany);if(e.type=="remove"&&!n.bWasUndone&&!n.forceWeakRemove){if(t.deletionPosition.hasSameParentAs(e.sourcePosition)&&o.containsPosition(t.sourcePosition)){return[new Lp(0)]}}if(t.sourcePosition.hasSameParentAs(e.targetPosition)){t.howMany+=e.howMany}if(t.sourcePosition.hasSameParentAs(e.sourcePosition)){t.howMany-=e.howMany}t.sourcePosition=t.sourcePosition._getTransformedByMoveOperation(e);t.targetPosition=t.targetPosition._getTransformedByMoveOperation(e);if(!t.graveyardPosition.isEqual(e.targetPosition)){t.graveyardPosition=t.graveyardPosition._getTransformedByMoveOperation(e)}return[t]}));m_(pp,bp,((t,e,n)=>{if(e.graveyardPosition){t.graveyardPosition=t.graveyardPosition._getTransformedByDeletion(e.graveyardPosition,1);if(t.deletionPosition.isEqual(e.graveyardPosition)){t.howMany=e.howMany}}if(t.targetPosition.isEqual(e.splitPosition)){const o=e.howMany!=0;const i=e.graveyardPosition&&t.deletionPosition.isEqual(e.graveyardPosition);if(o||i||n.abRelation=="mergeTargetNotMoved"){t.sourcePosition=t.sourcePosition._getTransformedBySplitOperation(e);return[t]}}if(t.sourcePosition.isEqual(e.splitPosition)){if(n.abRelation=="mergeSourceNotMoved"){t.howMany=0;t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e);return[t]}if(n.abRelation=="mergeSameElement"||t.sourcePosition.offset>0){t.sourcePosition=e.moveTargetPosition.clone();t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e);return[t]}}if(t.sourcePosition.hasSameParentAs(e.splitPosition)){t.howMany=e.splitPosition.offset}t.sourcePosition=t.sourcePosition._getTransformedBySplitOperation(e);t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e);return[t]}));m_(up,hp,((t,e)=>{const n=Kf._createFromPositionAndShift(t.sourcePosition,t.howMany);const o=n._getTransformedByInsertOperation(e,false)[0];t.sourcePosition=o.start;t.howMany=o.end.offset-o.start.offset;if(!t.targetPosition.isEqual(e.position)){t.targetPosition=t.targetPosition._getTransformedByInsertOperation(e)}return[t]}));m_(up,up,((t,e,n)=>{const o=Kf._createFromPositionAndShift(t.sourcePosition,t.howMany);const i=Kf._createFromPositionAndShift(e.sourcePosition,e.howMany);let r=n.aIsStrong;let s=!n.aIsStrong;if(n.abRelation=="insertBefore"||n.baRelation=="insertAfter"){s=true}else if(n.abRelation=="insertAfter"||n.baRelation=="insertBefore"){s=false}let a;if(t.targetPosition.isEqual(e.targetPosition)&&s){a=t.targetPosition._getTransformedByDeletion(e.sourcePosition,e.howMany)}else{a=t.targetPosition._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany)}if(y_(t,e)&&y_(e,t)){return[e.getReversed()]}const c=o.containsPosition(e.targetPosition);if(c&&o.containsRange(i,true)){o.start=o.start._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany);o.end=o.end._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany);return x_([o],a)}const l=i.containsPosition(t.targetPosition);if(l&&i.containsRange(o,true)){o.start=o.start._getCombined(e.sourcePosition,e.getMovedRangeStart());o.end=o.end._getCombined(e.sourcePosition,e.getMovedRangeStart());return x_([o],a)}const d=Ia(t.sourcePosition.getParentPath(),e.sourcePosition.getParentPath());if(d=="prefix"||d=="extension"){o.start=o.start._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany);o.end=o.end._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany);return x_([o],a)}if(t.type=="remove"&&e.type!="remove"&&!n.aWasUndone&&!n.forceWeakRemove){r=true}else if(t.type!="remove"&&e.type=="remove"&&!n.bWasUndone&&!n.forceWeakRemove){r=false}const u=[];const h=o.getDifference(i);for(const t of h){t.start=t.start._getTransformedByDeletion(e.sourcePosition,e.howMany);t.end=t.end._getTransformedByDeletion(e.sourcePosition,e.howMany);const n=Ia(t.start.getParentPath(),e.getMovedRangeStart().getParentPath())=="same";const o=t._getTransformedByInsertion(e.getMovedRangeStart(),e.howMany,n);u.push(...o)}const f=o.getIntersection(i);if(f!==null&&r){f.start=f.start._getCombined(e.sourcePosition,e.getMovedRangeStart());f.end=f.end._getCombined(e.sourcePosition,e.getMovedRangeStart());if(u.length===0){u.push(f)}else if(u.length==1){if(i.start.isBefore(o.start)||i.start.isEqual(o.start)){u.unshift(f)}else{u.push(f)}}else{u.splice(1,0,f)}}if(u.length===0){return[new Lp(t.baseVersion)]}return x_(u,a)}));m_(up,bp,((t,e,n)=>{let o=t.targetPosition.clone();if(!t.targetPosition.isEqual(e.insertionPosition)||!e.graveyardPosition||n.abRelation=="moveTargetAfter"){o=t.targetPosition._getTransformedBySplitOperation(e)}const i=Kf._createFromPositionAndShift(t.sourcePosition,t.howMany);if(i.end.isEqual(e.insertionPosition)){if(!e.graveyardPosition){t.howMany++}t.targetPosition=o;return[t]}if(i.start.hasSameParentAs(e.splitPosition)&&i.containsPosition(e.splitPosition)){let t=new Kf(e.splitPosition,i.end);t=t._getTransformedBySplitOperation(e);const n=[new Kf(i.start,e.splitPosition),t];return x_(n,o)}if(t.targetPosition.isEqual(e.splitPosition)&&n.abRelation=="insertAtSource"){o=e.moveTargetPosition}if(t.targetPosition.isEqual(e.insertionPosition)&&n.abRelation=="insertBetween"){o=t.targetPosition}const r=i._getTransformedBySplitOperation(e);const s=[r];if(e.graveyardPosition){const o=i.start.isEqual(e.graveyardPosition)||i.containsPosition(e.graveyardPosition);if(t.howMany>1&&o&&!n.aWasUndone){s.push(Kf._createFromPositionAndShift(e.insertionPosition,1))}}return x_(s,o)}));m_(up,pp,((t,e,n)=>{const o=Kf._createFromPositionAndShift(t.sourcePosition,t.howMany);if(e.deletionPosition.hasSameParentAs(t.sourcePosition)&&o.containsPosition(e.sourcePosition)){if(t.type=="remove"&&!n.forceWeakRemove){if(!n.aWasUndone){const n=[];let o=e.graveyardPosition.clone();let i=e.targetPosition._getTransformedByMergeOperation(e);if(t.howMany>1){n.push(new up(t.sourcePosition,t.howMany-1,t.targetPosition,0));o=o._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany-1);i=i._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany-1)}const r=e.deletionPosition._getCombined(t.sourcePosition,t.targetPosition);const s=new up(o,1,r,0);const a=s.getMovedRangeStart().path.slice();a.push(0);const c=new Mf(s.targetPosition.root,a);i=i._getTransformedByMove(o,r,1);const l=new up(i,e.howMany,c,0);n.push(s);n.push(l);return n}}else{if(t.howMany==1){if(!n.bWasUndone){return[new Lp(0)]}else{t.sourcePosition=e.graveyardPosition.clone();t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e);return[t]}}}}const i=Kf._createFromPositionAndShift(t.sourcePosition,t.howMany);const r=i._getTransformedByMergeOperation(e);t.sourcePosition=r.start;t.howMany=r.end.offset-r.start.offset;t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e);return[t]}));m_(mp,hp,((t,e)=>{t.position=t.position._getTransformedByInsertOperation(e);return[t]}));m_(mp,pp,((t,e)=>{if(t.position.isEqual(e.deletionPosition)){t.position=e.graveyardPosition.clone();t.position.stickiness="toNext";return[t]}t.position=t.position._getTransformedByMergeOperation(e);return[t]}));m_(mp,up,((t,e)=>{t.position=t.position._getTransformedByMoveOperation(e);return[t]}));m_(mp,mp,((t,e,n)=>{if(t.position.isEqual(e.position)){if(n.aIsStrong){t.oldName=e.newName}else{return[new Lp(0)]}}return[t]}));m_(mp,bp,((t,e)=>{const n=t.position.path;const o=e.splitPosition.getParentPath();if(Ia(n,o)=="same"&&!e.graveyardPosition){const e=new mp(t.position.getShiftedBy(1),t.oldName,t.newName,0);return[t,e]}t.position=t.position._getTransformedBySplitOperation(e);return[t]}));m_(gp,gp,((t,e,n)=>{if(t.root===e.root&&t.key===e.key){if(!n.aIsStrong||t.newValue===e.newValue){return[new Lp(0)]}else{t.oldValue=e.newValue}}return[t]}));m_(bp,hp,((t,e)=>{if(t.splitPosition.hasSameParentAs(e.position)&&t.splitPosition.offset<e.position.offset){t.howMany+=e.howMany}t.splitPosition=t.splitPosition._getTransformedByInsertOperation(e);t.insertionPosition=t.insertionPosition._getTransformedByInsertOperation(e);return[t]}));m_(bp,pp,((t,e,n)=>{if(!t.graveyardPosition&&!n.bWasUndone&&t.splitPosition.hasSameParentAs(e.sourcePosition)){const n=e.graveyardPosition.path.slice();n.push(0);const o=new Mf(e.graveyardPosition.root,n);const i=bp.getInsertionPosition(new Mf(e.graveyardPosition.root,n));const r=new bp(o,0,i,null,0);t.splitPosition=t.splitPosition._getTransformedByMergeOperation(e);t.insertionPosition=bp.getInsertionPosition(t.splitPosition);t.graveyardPosition=r.insertionPosition.clone();t.graveyardPosition.stickiness="toNext";return[r,t]}if(t.splitPosition.hasSameParentAs(e.deletionPosition)&&!t.splitPosition.isAfter(e.deletionPosition)){t.howMany--}if(t.splitPosition.hasSameParentAs(e.targetPosition)){t.howMany+=e.howMany}t.splitPosition=t.splitPosition._getTransformedByMergeOperation(e);t.insertionPosition=bp.getInsertionPosition(t.splitPosition);if(t.graveyardPosition){t.graveyardPosition=t.graveyardPosition._getTransformedByMergeOperation(e)}return[t]}));m_(bp,up,((t,e,n)=>{const o=Kf._createFromPositionAndShift(e.sourcePosition,e.howMany);if(t.graveyardPosition){const i=o.start.isEqual(t.graveyardPosition)||o.containsPosition(t.graveyardPosition);if(!n.bWasUndone&&i){const n=t.splitPosition._getTransformedByMoveOperation(e);const o=t.graveyardPosition._getTransformedByMoveOperation(e);const i=o.path.slice();i.push(0);const r=new Mf(o.root,i);const s=new up(n,t.howMany,r,0);return[s]}t.graveyardPosition=t.graveyardPosition._getTransformedByMoveOperation(e)}const i=t.splitPosition.isEqual(e.targetPosition);if(i&&(n.baRelation=="insertAtSource"||n.abRelation=="splitBefore")){t.howMany+=e.howMany;t.splitPosition=t.splitPosition._getTransformedByDeletion(e.sourcePosition,e.howMany);t.insertionPosition=bp.getInsertionPosition(t.splitPosition);return[t]}if(i&&n.abRelation&&n.abRelation.howMany){const{howMany:e,offset:o}=n.abRelation;t.howMany+=e;t.splitPosition=t.splitPosition.getShiftedBy(o);return[t]}if(t.splitPosition.hasSameParentAs(e.sourcePosition)&&o.containsPosition(t.splitPosition)){const n=e.howMany-(t.splitPosition.offset-e.sourcePosition.offset);t.howMany-=n;if(t.splitPosition.hasSameParentAs(e.targetPosition)&&t.splitPosition.offset<e.targetPosition.offset){t.howMany+=e.howMany}t.splitPosition=e.sourcePosition.clone();t.insertionPosition=bp.getInsertionPosition(t.splitPosition);return[t]}if(!e.sourcePosition.isEqual(e.targetPosition)){if(t.splitPosition.hasSameParentAs(e.sourcePosition)&&t.splitPosition.offset<=e.sourcePosition.offset){t.howMany-=e.howMany}if(t.splitPosition.hasSameParentAs(e.targetPosition)&&t.splitPosition.offset<e.targetPosition.offset){t.howMany+=e.howMany}}t.splitPosition.stickiness="toNone";t.splitPosition=t.splitPosition._getTransformedByMoveOperation(e);t.splitPosition.stickiness="toNext";if(t.graveyardPosition){t.insertionPosition=t.insertionPosition._getTransformedByMoveOperation(e)}else{t.insertionPosition=bp.getInsertionPosition(t.splitPosition)}return[t]}));m_(bp,bp,((t,e,n)=>{if(t.splitPosition.isEqual(e.splitPosition)){if(!t.graveyardPosition&&!e.graveyardPosition){return[new Lp(0)]}if(t.graveyardPosition&&e.graveyardPosition&&t.graveyardPosition.isEqual(e.graveyardPosition)){return[new Lp(0)]}if(n.abRelation=="splitBefore"){t.howMany=0;t.graveyardPosition=t.graveyardPosition._getTransformedBySplitOperation(e);return[t]}}if(t.graveyardPosition&&e.graveyardPosition&&t.graveyardPosition.isEqual(e.graveyardPosition)){const o=t.splitPosition.root.rootName=="$graveyard";const i=e.splitPosition.root.rootName=="$graveyard";const r=o&&!i;const s=i&&!o;const a=s||!r&&n.aIsStrong;if(a){const n=[];if(e.howMany){n.push(new up(e.moveTargetPosition,e.howMany,e.splitPosition,0))}if(t.howMany){n.push(new up(t.splitPosition,t.howMany,t.moveTargetPosition,0))}return n}else{return[new Lp(0)]}}if(t.graveyardPosition){t.graveyardPosition=t.graveyardPosition._getTransformedBySplitOperation(e)}if(t.splitPosition.isEqual(e.insertionPosition)&&n.abRelation=="splitBefore"){t.howMany++;return[t]}if(e.splitPosition.isEqual(t.insertionPosition)&&n.baRelation=="splitBefore"){const n=e.insertionPosition.path.slice();n.push(0);const o=new Mf(e.insertionPosition.root,n);const i=new up(t.insertionPosition,1,o,0);return[t,i]}if(t.splitPosition.hasSameParentAs(e.splitPosition)&&t.splitPosition.offset<e.splitPosition.offset){t.howMany-=e.howMany}t.splitPosition=t.splitPosition._getTransformedBySplitOperation(e);t.insertionPosition=bp.getInsertionPosition(t.splitPosition);return[t]}));function y_(t,e){return t.targetPosition._getTransformedByDeletion(e.sourcePosition,e.howMany)===null}function x_(t,e){const n=[];for(let o=0;o<t.length;o++){const i=t[o];const r=new up(i.start,i.end.offset-i.start.offset,e,0);n.push(r);for(let e=o+1;e<t.length;e++){t[e]=t[e]._getTransformedByMove(r.sourcePosition,r.targetPosition,r.howMany)[0]}e=e._getTransformedByMove(r.sourcePosition,r.targetPosition,r.howMany)}return n}class E_ extends _h{constructor(t){super(t);this.domEventType="click"}onDomEvent(t){this.fire(t.type,t)}}class D_ extends _h{constructor(t){super(t);this.domEventType=["mousedown","mouseup"]}onDomEvent(t){this.fire(t.type,t)}}class S_{constructor(t){this.document=t}createDocumentFragment(t){return new bd(this.document,t)}createElement(t,e,n){return new ul(this.document,t,e,n)}createText(t){return new Na(this.document,t)}clone(t,e=false){return t._clone(e)}appendChild(t,e){return e._appendChild(t)}insertChild(t,e,n){return n._insertChild(t,e)}removeChildren(t,e,n){return n._removeChildren(t,e)}remove(t){const e=t.parent;if(e){return this.removeChildren(e.getChildIndex(t),1,e)}return[]}replace(t,e){const n=t.parent;if(n){const o=n.getChildIndex(t);this.removeChildren(o,1,n);this.insertChild(o,e,n);return true}return false}unwrapElement(t){const e=t.parent;if(e){const n=e.getChildIndex(t);this.remove(t);this.insertChild(n,t.getChildren(),e)}}rename(t,e){const n=new ul(this.document,t,e.getAttributes(),e.getChildren());return this.replace(e,n)?n:null}setAttribute(t,e,n){n._setAttribute(t,e)}removeAttribute(t,e){e._removeAttribute(t)}addClass(t,e){e._addClass(t)}removeClass(t,e){e._removeClass(t)}setStyle(t,e,n){if(io(t)&&n===undefined){n=e}n._setStyle(t,e)}removeStyle(t,e){e._removeStyle(t)}setCustomProperty(t,e,n){n._setCustomProperty(t,e)}removeCustomProperty(t,e){return e._removeCustomProperty(t)}createPositionAt(t,e){return Al._createAt(t,e)}createPositionAfter(t){return Al._createAfter(t)}createPositionBefore(t){return Al._createBefore(t)}createRange(t,e){return new _l(t,e)}createRangeOn(t){return _l._createOn(t)}createRangeIn(t){return _l._createIn(t)}createSelection(t,e,n){return new xl(t,e,n)}}const B_=/^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;const T_=/^rgb\([ ]?([0-9]{1,3}[ %]?,[ ]?){2,3}[0-9]{1,3}[ %]?\)$/i;const P_=/^rgba\([ ]?([0-9]{1,3}[ %]?,[ ]?){3}(1|[0-9]+%|[0]?\.?[0-9]+)\)$/i;const I_=/^hsl\([ ]?([0-9]{1,3}[ %]?[,]?[ ]*){3}(1|[0-9]+%|[0]?\.?[0-9]+)?\)$/i;const R_=/^hsla\([ ]?([0-9]{1,3}[ %]?,[ ]?){2,3}(1|[0-9]+%|[0]?\.?[0-9]+)\)$/i;const F_=new Set(["black","silver","gray","white","maroon","red","purple","fuchsia","green","lime","olive","yellow","navy","blue","teal","aqua","orange","aliceblue","antiquewhite","aquamarine","azure","beige","bisque","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","gainsboro","ghostwhite","gold","goldenrod","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","limegreen","linen","magenta","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","oldlace","olivedrab","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","thistle","tomato","turquoise","violet","wheat","whitesmoke","yellowgreen","rebeccapurple","currentcolor","transparent"]);function z_(t){if(t.startsWith("#")){return B_.test(t)}if(t.startsWith("rgb")){return T_.test(t)||P_.test(t)}if(t.startsWith("hsl")){return I_.test(t)||R_.test(t)}return F_.has(t.toLowerCase())}const O_=["none","hidden","dotted","dashed","solid","double","groove","ridge","inset","outset"];function N_(t){return O_.includes(t)}const M_=/^([+-]?[0-9]*([.][0-9]+)?(px|cm|mm|in|pc|pt|ch|em|ex|rem|vh|vw|vmin|vmax)|0)$/;function V_(t){return M_.test(t)}const L_=/^[+-]?[0-9]*([.][0-9]+)?%$/;function H_(t){return L_.test(t)}const K_=["repeat-x","repeat-y","repeat","space","round","no-repeat"];function q_(t){return K_.includes(t)}const j_=["center","top","bottom","left","right"];function W_(t){return j_.includes(t)}const G_=["fixed","scroll","local"];function U_(t){return G_.includes(t)}const $_=/^url\(/;function J_(t){return $_.test(t)}function Y_(t=""){if(t===""){return{top:undefined,right:undefined,bottom:undefined,left:undefined}}const e=tv(t);const n=e[0];const o=e[2]||n;const i=e[1]||n;const r=e[3]||i;return{top:n,bottom:o,right:i,left:r}}function Q_(t){return e=>{const{top:n,right:o,bottom:i,left:r}=e;const s=[];if(![n,o,r,i].every((t=>!!t))){if(n){s.push([t+"-top",n])}if(o){s.push([t+"-right",o])}if(i){s.push([t+"-bottom",i])}if(r){s.push([t+"-left",r])}}else{s.push([t,X_(e)])}return s}}function X_({top:t,right:e,bottom:n,left:o}){const i=[];if(o!==e){i.push(t,e,n,o)}else if(n!==t){i.push(t,e,n)}else if(e!==t){i.push(t,e)}else{i.push(t)}return i.join(" ")}function Z_(t){return e=>({path:t,value:Y_(e)})}function tv(t){return t.replace(/, /g,",").split(" ").map((t=>t.replace(/,/g,", ")))}function ev(t){t.setNormalizer("background",nv);t.setNormalizer("background-color",(t=>({path:"background.color",value:t})));t.setReducer("background",(t=>{const e=[];e.push(["background-color",t.color]);return e}))}function nv(t){const e={};const n=tv(t);for(const t of n){if(q_(t)){e.repeat=e.repeat||[];e.repeat.push(t)}else if(W_(t)){e.position=e.position||[];e.position.push(t)}else if(U_(t)){e.attachment=t}else if(z_(t)){e.color=t}else if(J_(t)){e.image=t}}return{path:"background",value:e}}function ov(t){t.setNormalizer("border",iv);t.setNormalizer("border-top",rv("top"));t.setNormalizer("border-right",rv("right"));t.setNormalizer("border-bottom",rv("bottom"));t.setNormalizer("border-left",rv("left"));t.setNormalizer("border-color",sv("color"));t.setNormalizer("border-width",sv("width"));t.setNormalizer("border-style",sv("style"));t.setNormalizer("border-top-color",cv("color","top"));t.setNormalizer("border-top-style",cv("style","top"));t.setNormalizer("border-top-width",cv("width","top"));t.setNormalizer("border-right-color",cv("color","right"));t.setNormalizer("border-right-style",cv("style","right"));t.setNormalizer("border-right-width",cv("width","right"));t.setNormalizer("border-bottom-color",cv("color","bottom"));t.setNormalizer("border-bottom-style",cv("style","bottom"));t.setNormalizer("border-bottom-width",cv("width","bottom"));t.setNormalizer("border-left-color",cv("color","left"));t.setNormalizer("border-left-style",cv("style","left"));t.setNormalizer("border-left-width",cv("width","left"));t.setExtractor("border-top",lv("top"));t.setExtractor("border-right",lv("right"));t.setExtractor("border-bottom",lv("bottom"));t.setExtractor("border-left",lv("left"));t.setExtractor("border-top-color","border.color.top");t.setExtractor("border-right-color","border.color.right");t.setExtractor("border-bottom-color","border.color.bottom");t.setExtractor("border-left-color","border.color.left");t.setExtractor("border-top-width","border.width.top");t.setExtractor("border-right-width","border.width.right");t.setExtractor("border-bottom-width","border.width.bottom");t.setExtractor("border-left-width","border.width.left");t.setExtractor("border-top-style","border.style.top");t.setExtractor("border-right-style","border.style.right");t.setExtractor("border-bottom-style","border.style.bottom");t.setExtractor("border-left-style","border.style.left");t.setReducer("border-color",Q_("border-color"));t.setReducer("border-style",Q_("border-style"));t.setReducer("border-width",Q_("border-width"));t.setReducer("border-top",fv("top"));t.setReducer("border-right",fv("right"));t.setReducer("border-bottom",fv("bottom"));t.setReducer("border-left",fv("left"));t.setReducer("border",hv);t.setStyleRelation("border",["border-color","border-style","border-width","border-top","border-right","border-bottom","border-left","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-style","border-right-style","border-bottom-style","border-left-style","border-top-width","border-right-width","border-bottom-width","border-left-width"]);t.setStyleRelation("border-color",["border-top-color","border-right-color","border-bottom-color","border-left-color"]);t.setStyleRelation("border-style",["border-top-style","border-right-style","border-bottom-style","border-left-style"]);t.setStyleRelation("border-width",["border-top-width","border-right-width","border-bottom-width","border-left-width"]);t.setStyleRelation("border-top",["border-top-color","border-top-style","border-top-width"]);t.setStyleRelation("border-right",["border-right-color","border-right-style","border-right-width"]);t.setStyleRelation("border-bottom",["border-bottom-color","border-bottom-style","border-bottom-width"]);t.setStyleRelation("border-left",["border-left-color","border-left-style","border-left-width"])}function iv(t){const{color:e,style:n,width:o}=uv(t);return{path:"border",value:{color:Y_(e),style:Y_(n),width:Y_(o)}}}function rv(t){return e=>{const{color:n,style:o,width:i}=uv(e);const r={};if(n!==undefined){r.color={[t]:n}}if(o!==undefined){r.style={[t]:o}}if(i!==undefined){r.width={[t]:i}}return{path:"border",value:r}}}function sv(t){return e=>({path:"border",value:av(e,t)})}function av(t,e){return{[e]:Y_(t)}}function cv(t,e){return n=>({path:"border",value:{[t]:{[e]:n}}})}function lv(t){return(e,n)=>{if(n.border){return dv(n.border,t)}}}function dv(t,e){const n={};if(t.width&&t.width[e]){n.width=t.width[e]}if(t.style&&t.style[e]){n.style=t.style[e]}if(t.color&&t.color[e]){n.color=t.color[e]}return n}function uv(t){const e={};const n=tv(t);for(const t of n){if(V_(t)||/thin|medium|thick/.test(t)){e.width=t}else if(N_(t)){e.style=t}else{e.color=t}}return e}function hv(t){const e=[];e.push(...mv(dv(t,"top"),"top"));e.push(...mv(dv(t,"right"),"right"));e.push(...mv(dv(t,"bottom"),"bottom"));e.push(...mv(dv(t,"left"),"left"));return e}function fv(t){return e=>mv(e,t)}function mv(t,e){const n=[];if(t&&t.width!==undefined){n.push(t.width)}if(t&&t.style!==undefined){n.push(t.style)}if(t&&t.color!==undefined){n.push(t.color)}if(n.length){return[[`border-${e}`,n.join(" ")]]}return[]}function gv(t){t.setNormalizer("margin",Z_("margin"));t.setNormalizer("margin-top",(t=>({path:"margin.top",value:t})));t.setNormalizer("margin-right",(t=>({path:"margin.right",value:t})));t.setNormalizer("margin-bottom",(t=>({path:"margin.bottom",value:t})));t.setNormalizer("margin-left",(t=>({path:"margin.left",value:t})));t.setReducer("margin",Q_("margin"));t.setStyleRelation("margin",["margin-top","margin-right","margin-bottom","margin-left"])}function pv(t){t.setNormalizer("padding",Z_("padding"));t.setNormalizer("padding-top",(t=>({path:"padding.top",value:t})));t.setNormalizer("padding-right",(t=>({path:"padding.right",value:t})));t.setNormalizer("padding-bottom",(t=>({path:"padding.bottom",value:t})));t.setNormalizer("padding-left",(t=>({path:"padding.left",value:t})));t.setReducer("padding",Q_("padding"));t.setStyleRelation("padding",["padding-top","padding-right","padding-bottom","padding-left"])}class bv extends Rb{constructor(t,e){super(t);this.view=e;this._toolbarConfig=eC(t.config.get("toolbar"));this._elementReplacer=new Jh}get element(){return this.view.element}init(t){const e=this.editor;const n=this.view;const o=e.editing.view;const i=n.editable;const r=o.document.getRoot();i.name=r.rootName;n.render();const s=i.element;this.setEditableElement(i.name,s);this.focusTracker.add(s);n.editable.bind("isFocused").to(this.focusTracker);o.attachDomRoot(s);if(t){this._elementReplacer.replace(t,this.element)}this._initPlaceholder();this._initToolbar();this.fire("ready")}destroy(){const t=this.view;const e=this.editor.editing.view;this._elementReplacer.restore();e.detachDomRoot(t.editable.name);t.destroy();super.destroy()}_initToolbar(){const t=this.editor;const e=this.view;const n=t.editing.view;e.stickyPanel.bind("isActive").to(this.focusTracker,"isFocused");e.stickyPanel.limiterElement=e.element;if(this._toolbarConfig.viewportTopOffset){e.stickyPanel.viewportTopOffset=this._toolbarConfig.viewportTopOffset}e.toolbar.fillFromConfig(this._toolbarConfig,this.componentFactory);HA({origin:n,originFocusTracker:this.focusTracker,originKeystrokeHandler:t.keystrokes,toolbar:e.toolbar})}_initPlaceholder(){const t=this.editor;const e=t.editing.view;const n=e.document.getRoot();const o=t.sourceElement;const i=t.config.get("placeholder")||o&&o.tagName.toLowerCase()==="textarea"&&o.getAttribute("placeholder");if(i){r_({view:e,element:n,text:i,isDirectHost:false,keepOnFocus:true})}}}var kv=n(35);var wv={injectType:"singletonStyleTag",attributes:{"data-cke":true}};wv.insert="head";wv.singleton=true;var Cv=wk()(kv["a"],wv);var Av=kv["a"].locals||{};class _v extends KC{constructor(t,e,n={}){super(t);this.stickyPanel=new LA(t);this.toolbar=new sC(t,{shouldGroupWhenFull:n.shouldToolbarGroupWhenFull});this.editable=new jC(t,e)}render(){super.render();this.stickyPanel.content.add(this.toolbar);this.top.add(this.stickyPanel);this.main.add(this.editable)}}class vv extends Tb{constructor(t,e){super(e);if(fa(t)){this.sourceElement=t}this.model.document.createRoot();const n=!this.config.get("toolbar.shouldNotGroupWhenFull");const o=new _v(this.locale,this.editing.view,{shouldToolbarGroupWhenFull:n});this.ui=new bv(this,o);Fb(this)}destroy(){if(this.sourceElement){this.updateSourceElement()}this.ui.destroy();return super.destroy()}static create(t,e={}){return new Promise((n=>{const o=new this(t,e);n(o.initPlugins().then((()=>o.ui.init(fa(t)?t:null))).then((()=>{if(!fa(t)&&e.initialData){throw new u["a"]("editor-create-initial-data",null)}const n=e.initialData||yv(t);return o.data.init(n)})).then((()=>o.fire("ready"))).then((()=>o)))}))}}Hn(vv,Ob);Hn(vv,Mb);function yv(t){return fa(t)?tf(t):t}const xv=["left","right","center","justify"];function Ev(t){return xv.includes(t)}function Dv(t,e){if(e.contentLanguageDirection=="rtl"){return t==="right"}else{return t==="left"}}function Sv(t){const e=t.map((t=>{let e;if(typeof t=="string"){e={name:t}}else{e=t}return e})).filter((t=>{const e=!!xv.includes(t.name);if(!e){Object(u["b"])("alignment-config-name-not-recognized",{option:t})}return e}));const n=e.filter((t=>!!t.className)).length;if(n&&n<e.length){throw new u["a"]("alignment-config-classnames-are-missing",{configuredOptions:t})}e.forEach(((e,n,o)=>{const i=o.slice(n+1);const r=i.some((t=>t.name==e.name));if(r){throw new u["a"]("alignment-config-name-already-defined",{option:e,configuredOptions:t})}if(e.className){const n=i.some((t=>t.className==e.className));if(n){throw new u["a"]("alignment-config-classname-already-defined",{option:e,configuredOptions:t})}}}));return e}const Bv="alignment";class Tv extends jn{refresh(){const t=this.editor;const e=t.locale;const n=ff(this.editor.model.document.selection.getSelectedBlocks());this.isEnabled=!!n&&this._canBeAligned(n);if(this.isEnabled&&n.hasAttribute("alignment")){this.value=n.getAttribute("alignment")}else{this.value=e.contentLanguageDirection==="rtl"?"right":"left"}}execute(t={}){const e=this.editor;const n=e.locale;const o=e.model;const i=o.document;const r=t.value;o.change((t=>{const e=Array.from(i.selection.getSelectedBlocks()).filter((t=>this._canBeAligned(t)));const o=e[0].getAttribute("alignment");const s=Dv(r,n)||o===r||!r;if(s){Pv(e,t)}else{Iv(e,t,r)}}))}_canBeAligned(t){return this.editor.model.schema.checkAttribute(t,Bv)}}function Pv(t,e){for(const n of t){e.removeAttribute(Bv,n)}}function Iv(t,e,n){for(const o of t){e.setAttribute(Bv,n,o)}}class Rv extends Kn{static get pluginName(){return"AlignmentEditing"}constructor(t){super(t);t.config.define("alignment",{options:[...xv.map((t=>({name:t})))]})}init(){const t=this.editor;const e=t.locale;const n=t.model.schema;const o=Sv(t.config.get("alignment.options"));const i=o.filter((t=>Ev(t.name)&&!Dv(t.name,e)));const r=i.some((t=>!!t.className));n.extend("$block",{allowAttributes:"alignment"});t.model.schema.setAttributeProperties("alignment",{isFormatting:true});if(r){t.conversion.attributeToAttribute(Ov(i))}else{t.conversion.for("downcast").attributeToAttribute(Fv(i))}const s=zv(i);for(const e of s){t.conversion.for("upcast").attributeToAttribute(e)}t.commands.add("alignment",new Tv(t))}}function Fv(t){const e={model:{key:"alignment",values:t.map((t=>t.name))},view:{}};for(const{name:n}of t){e.view[n]={key:"style",value:{"text-align":n}}}return e}function zv(t){const e=[];for(const{name:n}of t){e.push({view:{key:"style",value:{"text-align":n}},model:{key:"alignment",value:n}})}return e}function Ov(t){const e={model:{key:"alignment",values:t.map((t=>t.name))},view:{}};for(const n of t){e.view[n.name]={key:"class",value:n.className}}return e}const Nv=new Map([["left",hk.alignLeft],["right",hk.alignRight],["center",hk.alignCenter],["justify",hk.alignJustify]]);class Mv extends Kn{get localizedOptionTitles(){const t=this.editor.t;return{left:t("Align left"),right:t("Align right"),center:t("Align center"),justify:t("Justify")}}static get pluginName(){return"AlignmentUI"}init(){const t=this.editor;const e=t.ui.componentFactory;const n=t.t;const o=Sv(t.config.get("alignment.options"));o.map((t=>t.name)).filter(Ev).forEach((t=>this._addButton(t)));e.add("alignment",(t=>{const i=xC(t);const r=o.map((t=>e.create(`alignment:${t.name}`)));EC(i,r);i.buttonView.set({label:n("Text alignment"),tooltip:true});i.toolbarView.isVertical=true;i.toolbarView.ariaLabel=n("Text alignment toolbar");i.extendTemplate({attributes:{class:"ck-alignment-dropdown"}});const s=t.contentLanguageDirection==="rtl"?Nv.get("right"):Nv.get("left");i.buttonView.bind("icon").toMany(r,"isOn",((...t)=>{const e=t.findIndex((t=>t));if(e<0){return s}return r[e].icon}));i.bind("isEnabled").toMany(r,"isEnabled",((...t)=>t.some((t=>t))));return i}))}_addButton(t){const e=this.editor;e.ui.componentFactory.add(`alignment:${t}`,(n=>{const o=e.commands.get("alignment");const i=new fw(n);i.set({label:this.localizedOptionTitles[t],icon:Nv.get(t),tooltip:true,isToggleable:true});i.bind("isEnabled").to(o);i.bind("isOn").to(o,"value",(e=>e===t));this.listenTo(i,"execute",(()=>{e.execute("alignment",{value:t});e.editing.view.focus()}));return i}))}}class Vv extends Kn{static get requires(){return[Rv,Mv]}static get pluginName(){return"Alignment"}}class Lv{constructor(t){this.files=Hv(t);this._native=t}get types(){return this._native.types}getData(t){return this._native.getData(t)}setData(t,e){this._native.setData(t,e)}set effectAllowed(t){this._native.effectAllowed=t}get effectAllowed(){return this._native.effectAllowed}set dropEffect(t){this._native.dropEffect=t}get dropEffect(){return this._native.dropEffect}get isCanceled(){return this._native.dropEffect=="none"||!!this._native.mozUserCancelled}}function Hv(t){const e=t.files?Array.from(t.files):[];const n=t.items?Array.from(t.items):[];if(e.length){return e}return n.filter((t=>t.kind==="file")).map((t=>t.getAsFile()))}class Kv extends _h{constructor(t){super(t);const e=this.document;this.domEventType=["paste","copy","cut","drop","dragover","dragstart","dragend","dragenter","dragleave"];this.listenTo(e,"paste",n("clipboardInput"),{priority:"low"});this.listenTo(e,"drop",n("clipboardInput"),{priority:"low"});this.listenTo(e,"dragover",n("dragging"),{priority:"low"});function n(t){return(n,o)=>{o.preventDefault();const i=o.dropRange?[o.dropRange]:null;const s=new r(e,t);e.fire(s,{dataTransfer:o.dataTransfer,method:n.name,targetRanges:i,target:o.target});if(s.stop.called){o.stopPropagation()}}}}onDomEvent(t){const e={dataTransfer:new Lv(t.clipboardData?t.clipboardData:t.dataTransfer)};if(t.type=="drop"||t.type=="dragover"){e.dropRange=qv(this.view,t)}this.fire(t.type,t,e)}}function qv(t,e){const n=e.target.ownerDocument;const o=e.clientX;const i=e.clientY;let r;if(n.caretRangeFromPoint&&n.caretRangeFromPoint(o,i)){r=n.caretRangeFromPoint(o,i)}else if(e.rangeParent){r=n.createRange();r.setStart(e.rangeParent,e.rangeOffset);r.collapse(true)}if(r){return t.domConverter.domRangeToView(r)}return null}function jv(t){t=t.replace(/</g,"<").replace(/>/g,">").replace(/\r?\n\r?\n/g,"</p><p>").replace(/\r?\n/g,"<br>").replace(/^\s/," ").replace(/\s$/," ").replace(/\s\s/g," ");if(t.includes("</p><p>")||t.includes("<br>")){t=`<p>${t}</p>`}return t}function Wv(t){return t.replace(/<span(?: class="Apple-converted-space"|)>(\s+)<\/span>/g,((t,e)=>{if(e.length==1){return" "}return e}))}const Gv=["figcaption","li"];function Uv(t){let e="";if(t.is("$text")||t.is("$textProxy")){e=t.data}else if(t.is("element","img")&&t.hasAttribute("alt")){e=t.getAttribute("alt")}else if(t.is("element","br")){e="\n"}else{let n=null;for(const o of t.getChildren()){const t=Uv(o);if(n&&(n.is("containerElement")||o.is("containerElement"))){if(Gv.includes(n.name)||Gv.includes(o.name)){e+="\n"}else{e+="\n\n"}}e+=t;n=o}}return e}class $v extends Kn{static get pluginName(){return"ClipboardPipeline"}init(){const t=this.editor;const e=t.editing.view;e.addObserver(Kv);this._setupPasteDrop();this._setupCopyCut()}_setupPasteDrop(){const t=this.editor;const e=t.model;const n=t.editing.view;const o=n.document;this.listenTo(o,"clipboardInput",(e=>{if(t.isReadOnly){e.stop()}}),{priority:"highest"});this.listenTo(o,"clipboardInput",((t,e)=>{const o=e.dataTransfer;let i=e.content||"";if(!i){if(o.getData("text/html")){i=Wv(o.getData("text/html"))}else if(o.getData("text/plain")){i=jv(o.getData("text/plain"))}i=this.editor.data.htmlProcessor.toView(i)}const s=new r(this,"inputTransformation");this.fire(s,{content:i,dataTransfer:o,targetRanges:e.targetRanges,method:e.method});if(s.stop.called){t.stop()}n.scrollToTheSelection()}),{priority:"low"});this.listenTo(this,"inputTransformation",((t,n)=>{if(n.content.isEmpty){return}const o=this.editor.data;const i=o.toModel(n.content,"$clipboardHolder");if(i.childCount==0){return}t.stop();e.change((()=>{this.fire("contentInsertion",{content:i,method:n.method,dataTransfer:n.dataTransfer,targetRanges:n.targetRanges})}))}),{priority:"low"});this.listenTo(this,"contentInsertion",((t,n)=>{n.resultRange=e.insertContent(n.content)}),{priority:"low"})}_setupCopyCut(){const t=this.editor;const e=t.model.document;const n=t.editing.view;const o=n.document;function i(n,i){const r=i.dataTransfer;i.preventDefault();const s=t.data.toView(t.model.getSelectedContent(e.selection));o.fire("clipboardOutput",{dataTransfer:r,content:s,method:n.name})}this.listenTo(o,"copy",i,{priority:"low"});this.listenTo(o,"cut",((e,n)=>{if(t.isReadOnly){n.preventDefault()}else{i(e,n)}}),{priority:"low"});this.listenTo(o,"clipboardOutput",((n,o)=>{if(!o.content.isEmpty){o.dataTransfer.setData("text/html",this.editor.data.htmlProcessor.toData(o.content));o.dataTransfer.setData("text/plain",Uv(o.content))}if(o.method=="cut"){t.model.deleteContent(e.selection)}}),{priority:"low"})}}function*Jv(t,e){for(const n of e){if(n&&t.getAttributeProperties(n[0]).copyOnEnter){yield n}}}class Yv extends jn{execute(){const t=this.editor.model;const e=t.document;t.change((n=>{Qv(this.editor.model,n,e.selection,t.schema);this.fire("afterExecute",{writer:n})}))}}function Qv(t,e,n,o){const i=n.isCollapsed;const r=n.getFirstRange();const s=r.start.parent;const a=r.end.parent;if(o.isLimit(s)||o.isLimit(a)){if(!i&&s==a){t.deleteContent(n)}return}if(i){const t=Jv(e.model.schema,n.getAttributes());Xv(e,r.start);e.setSelectionAttribute(t)}else{const o=!(r.start.isAtStart&&r.end.isAtEnd);const i=s==a;t.deleteContent(n,{leaveUnmerged:o});if(o){if(i){Xv(e,n.focus)}else{e.setSelection(a,0)}}}}function Xv(t,e){t.split(e);t.setSelection(e.parent.nextSibling,0)}class Zv extends Cu{constructor(t){super(t);const e=this.document;e.on("keydown",((t,n)=>{if(this.isEnabled&&n.keyCode==td.enter){const o=new Dl(e,"enter",e.selection.getFirstRange());e.fire(o,new Ah(e,n.domEvent,{isSoft:n.shiftKey}));if(o.stop.called){t.stop()}}}))}observe(){}}class ty extends Kn{static get pluginName(){return"Enter"}init(){const t=this.editor;const e=t.editing.view;const n=e.document;e.addObserver(Zv);t.commands.add("enter",new Yv(t));this.listenTo(n,"enter",((n,o)=>{o.preventDefault();if(o.isSoft){return}t.execute("enter");e.scrollToTheSelection()}),{priority:"low"})}}class ey{constructor(t,e=20){this.model=t;this.size=0;this.limit=e;this.isLocked=false;this._changeCallback=(t,e)=>{if(e.type!="transparent"&&e!==this._batch){this._reset(true)}};this._selectionChangeCallback=()=>{this._reset()};this.model.document.on("change",this._changeCallback);this.model.document.selection.on("change:range",this._selectionChangeCallback);this.model.document.selection.on("change:attribute",this._selectionChangeCallback)}get batch(){if(!this._batch){this._batch=this.model.createBatch()}return this._batch}input(t){this.size+=t;if(this.size>=this.limit){this._reset(true)}}lock(){this.isLocked=true}unlock(){this.isLocked=false}destroy(){this.model.document.off("change",this._changeCallback);this.model.document.selection.off("change:range",this._selectionChangeCallback);this.model.document.selection.off("change:attribute",this._selectionChangeCallback)}_reset(t){if(!this.isLocked||t){this._batch=null;this.size=0}}}class ny extends jn{constructor(t,e){super(t);this.direction=e;this._buffer=new ey(t.model,t.config.get("typing.undoStep"))}get buffer(){return this._buffer}execute(t={}){const e=this.editor.model;const n=e.document;e.enqueueChange(this._buffer.batch,(o=>{this._buffer.lock();const i=o.createSelection(t.selection||n.selection);const r=t.sequence||1;const s=i.isCollapsed;if(i.isCollapsed){e.modifySelection(i,{direction:this.direction,unit:t.unit})}if(this._shouldEntireContentBeReplacedWithParagraph(r)){this._replaceEntireContentWithParagraph(o);return}if(this._shouldReplaceFirstBlockWithParagraph(i,r)){this.editor.execute("paragraph",{selection:i});return}if(i.isCollapsed){return}let a=0;i.getFirstRange().getMinimalFlatRanges().forEach((t=>{a+=yl(t.getWalker({singleCharacters:true,ignoreElementEnd:true,shallow:true}))}));e.deleteContent(i,{doNotResetEntireContent:s,direction:this.direction});this._buffer.input(a);o.setSelection(i);this._buffer.unlock()}))}_shouldEntireContentBeReplacedWithParagraph(t){if(t>1){return false}const e=this.editor.model;const n=e.document;const o=n.selection;const i=e.schema.getLimitElement(o);const r=o.isCollapsed&&o.containsEntireContent(i);if(!r){return false}if(!e.schema.checkChild(i,"paragraph")){return false}const s=i.getChild(0);if(s&&s.name==="paragraph"){return false}return true}_replaceEntireContentWithParagraph(t){const e=this.editor.model;const n=e.document;const o=n.selection;const i=e.schema.getLimitElement(o);const r=t.createElement("paragraph");t.remove(t.createRangeIn(i));t.insert(r,i);t.setSelection(r,0)}_shouldReplaceFirstBlockWithParagraph(t,e){const n=this.editor.model;if(e>1||this.direction!="backward"){return false}if(!t.isCollapsed){return false}const o=t.getFirstPosition();const i=n.schema.getLimitElement(o);const r=i.getChild(0);if(o.parent!=r){return false}if(!t.containsEntireContent(r)){return false}if(!n.schema.checkChild(i,"paragraph")){return false}if(r.name=="paragraph"){return false}return true}}class oy extends Cu{constructor(t){super(t);const e=t.document;let n=0;e.on("keyup",((t,e)=>{if(e.keyCode==td.delete||e.keyCode==td.backspace){n=0}}));e.on("keydown",((t,e)=>{const i={};if(e.keyCode==td.delete){i.direction="forward";i.unit="character"}else if(e.keyCode==td.backspace){i.direction="backward";i.unit="codePoint"}else{return}const r=Wl.isMac?e.altKey:e.ctrlKey;i.unit=r?"word":i.unit;i.sequence=++n;o(t,e.domEvent,i)}));if(Wl.isAndroid){e.on("beforeinput",((e,n)=>{if(n.domEvent.inputType!="deleteContentBackward"){return}const i={unit:"codepoint",direction:"backward",sequence:1};const r=n.domTarget.ownerDocument.defaultView.getSelection();if(r.anchorNode==r.focusNode&&r.anchorOffset+1!=r.focusOffset){i.selectionToRemove=t.domConverter.domSelectionToView(r)}o(e,n.domEvent,i)}))}function o(t,n,o){const i=new Dl(e,"delete",e.selection.getFirstRange());e.fire(i,new Ah(e,n,o));if(i.stop.called){t.stop()}}}observe(){}}class iy extends Kn{static get pluginName(){return"Delete"}init(){const t=this.editor;const e=t.editing.view;const n=e.document;e.addObserver(oy);const o=new ny(t,"forward");t.commands.add("deleteForward",o);t.commands.add("forwardDelete",o);t.commands.add("delete",new ny(t,"backward"));this.listenTo(n,"delete",((n,o)=>{const i={unit:o.unit,sequence:o.sequence};if(o.selectionToRemove){const e=t.model.createSelection();const n=[];for(const e of o.selectionToRemove.getRanges()){n.push(t.editing.mapper.toModelRange(e))}e.setTo(n);i.selection=e}t.execute(o.direction=="forward"?"deleteForward":"delete",i);o.preventDefault();e.scrollToTheSelection()}),{priority:"low"});if(Wl.isAndroid){let t=null;this.listenTo(n,"delete",((e,n)=>{const o=n.domTarget.ownerDocument.defaultView.getSelection();t={anchorNode:o.anchorNode,anchorOffset:o.anchorOffset,focusNode:o.focusNode,focusOffset:o.focusOffset}}),{priority:"lowest"});this.listenTo(n,"keyup",((e,n)=>{if(t){const e=n.domTarget.ownerDocument.defaultView.getSelection();e.collapse(t.anchorNode,t.anchorOffset);e.extend(t.focusNode,t.focusOffset);t=null}}))}}}class ry{constructor(){this._stack=[]}add(t,e){const n=this._stack;const o=n[0];this._insertDescriptor(t);const i=n[0];if(o!==i&&!sy(o,i)){this.fire("change:top",{oldDescriptor:o,newDescriptor:i,writer:e})}}remove(t,e){const n=this._stack;const o=n[0];this._removeDescriptor(t);const i=n[0];if(o!==i&&!sy(o,i)){this.fire("change:top",{oldDescriptor:o,newDescriptor:i,writer:e})}}_insertDescriptor(t){const e=this._stack;const n=e.findIndex((e=>e.id===t.id));if(sy(t,e[n])){return}if(n>-1){e.splice(n,1)}let o=0;while(e[o]&&ay(e[o],t)){o++}e.splice(o,0,t)}_removeDescriptor(t){const e=this._stack;const n=e.findIndex((e=>e.id===t));if(n>-1){e.splice(n,1)}}}Hn(ry,g);function sy(t,e){return t&&e&&t.priority==e.priority&&cy(t.classes)==cy(e.classes)}function ay(t,e){if(t.priority>e.priority){return true}else if(t.priority<e.priority){return false}return cy(t.classes)>cy(e.classes)}function cy(t){return Array.isArray(t)?t.sort().join(","):t}var ly='<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M4 0v1H1v3H0V.5A.5.5 0 0 1 .5 0H4zm8 0h3.5a.5.5 0 0 1 .5.5V4h-1V1h-3V0zM4 16H.5a.5.5 0 0 1-.5-.5V12h1v3h3v1zm8 0v-1h3v-3h1v3.5a.5.5 0 0 1-.5.5H12z"/><path fill-opacity=".256" d="M1 1h14v14H1z"/><g class="ck-icon__selected-indicator"><path d="M7 0h2v1H7V0zM0 7h1v2H0V7zm15 0h1v2h-1V7zm-8 8h2v1H7v-1z"/><path fill-opacity=".254" d="M1 1h14v14H1z"/></g></svg>';const dy="ck-widget";const uy="ck-widget_selected";function hy(t){if(!t.is("element")){return false}return!!t.getCustomProperty("widget")}function fy(t,e,n={}){if(!t.is("containerElement")){throw new u["a"]("widget-to-widget-wrong-element-type",null,{element:t})}e.setAttribute("contenteditable","false",t);e.addClass(dy,t);e.setCustomProperty("widget",true,t);t.getFillerOffset=yy;if(n.label){by(t,n.label,e)}if(n.hasSelectionHandle){xy(t,e)}py(t,e,my,gy);return t}function my(t,e,n){if(e.classes){n.addClass(Ca(e.classes),t)}if(e.attributes){for(const o in e.attributes){n.setAttribute(o,e.attributes[o],t)}}}function gy(t,e,n){if(e.classes){n.removeClass(Ca(e.classes),t)}if(e.attributes){for(const o in e.attributes){n.removeAttribute(o,t)}}}function py(t,e,n,o){const i=new ry;i.on("change:top",((e,i)=>{if(i.oldDescriptor){o(t,i.oldDescriptor,i.writer)}if(i.newDescriptor){n(t,i.newDescriptor,i.writer)}}));e.setCustomProperty("addHighlight",((t,e,n)=>i.add(e,n)),t);e.setCustomProperty("removeHighlight",((t,e,n)=>i.remove(e,n)),t)}function by(t,e,n){n.setCustomProperty("widgetLabel",e,t)}function ky(t){const e=t.getCustomProperty("widgetLabel");if(!e){return""}return typeof e=="function"?e():e}function wy(t,e){e.addClass(["ck-editor__editable","ck-editor__nested-editable"],t);e.setAttribute("contenteditable",t.isReadOnly?"false":"true",t);t.on("change:isReadOnly",((n,o,i)=>{e.setAttribute("contenteditable",i?"false":"true",t)}));t.on("change:isFocused",((n,o,i)=>{if(i){e.addClass("ck-editor__nested-editable_focused",t)}else{e.removeClass("ck-editor__nested-editable_focused",t)}}));return t}function Cy(t,e){const n=t.getSelectedElement();if(n){const o=Py(t);if(o){return e.createPositionAt(n,o)}if(e.schema.isBlock(n)){return e.createPositionAfter(n)}}const o=t.getSelectedBlocks().next().value;if(o){if(o.isEmpty){return e.createPositionAt(o,0)}const n=e.createPositionAfter(o);if(t.focus.isTouching(n)){return n}return e.createPositionBefore(o)}return t.focus}function Ay(t,e){const n=t.getSelectedElement();return!!n&&e.isObject(n)}function _y(t,e){return(n,o)=>{const{mapper:i,viewPosition:r}=o;const s=i.findMappedViewAncestor(r);if(!e(s)){return}const a=i.toModelElement(s);o.modelPosition=t.createPositionAt(a,r.isAtStart?"before":"after")}}function vy(t,e){const n=new rf(ru.window);const o=n.getIntersection(t);const i=e.height+bA.arrowVerticalOffset;if(t.top-i>n.top||t.bottom+i<n.bottom){return null}const r=o||t;const s=r.left+r.width/2-e.width/2;return{top:Math.max(t.top,0)+bA.arrowVerticalOffset,left:s,name:"arrow_n"}}function yy(){return null}function xy(t,e){const n=e.createUIElement("div",{class:"ck ck-widget__selection-handle"},(function(t){const e=this.toDomElement(t);const n=new ow;n.set("content",ly);n.render();e.appendChild(n.element);return e}));e.insert(e.createPositionAt(t,0),n);e.addClass(["ck-widget_with-selection-handle"],t)}const Ey="widget-type-around";function Dy(t,e,n){return t&&hy(t)&&!n.isInline(e)}function Sy(t){return t.closest(".ck-widget__type-around__button")}function By(t){return t.classList.contains("ck-widget__type-around__button_before")?"before":"after"}function Ty(t,e){const n=t.closest(".ck-widget");return e.mapDomToView(n)}function Py(t){return t.getAttribute(Ey)}function Iy(t){let e=null;const n=t.model;const o=t.editing.view;const i=t.commands.get("input");if(Wl.isAndroid){o.document.on("beforeinput",((t,e)=>r(e)),{priority:"lowest"})}else{o.document.on("keydown",((t,e)=>r(e)),{priority:"lowest"})}o.document.on("compositionstart",s,{priority:"lowest"});o.document.on("compositionend",(()=>{e=n.createSelection(n.document.selection)}),{priority:"lowest"});function r(t){const r=n.document;const s=o.document.isComposing;const c=e&&e.isEqual(r.selection);e=null;if(!i.isEnabled){return}if(Fy(t)||r.selection.isCollapsed){return}if(s&&t.keyCode===229){return}if(!s&&t.keyCode===229&&c){return}a()}function s(){const t=n.document;const e=t.selection.rangeCount===1?t.selection.getFirstRange().isFlat:true;if(t.selection.isCollapsed||e){return}a()}function a(){const t=i.buffer;t.lock();const e=t.batch;i._batches.add(e);n.enqueueChange(e,(()=>{n.deleteContent(n.document.selection)}));t.unlock()}}const Ry=[nd("arrowUp"),nd("arrowRight"),nd("arrowDown"),nd("arrowLeft"),9,16,17,18,19,20,27,33,34,35,36,45,91,93,144,145,173,174,175,176,177,178,179,255];for(let t=112;t<=135;t++){Ry.push(t)}function Fy(t){if(t.ctrlKey||t.metaKey){return true}return Ry.includes(t.keyCode)}var zy='<svg viewBox="0 0 10 8" xmlns="http://www.w3.org/2000/svg"><path d="M9.055.263v3.972h-6.77M1 4.216l2-2.038m-2 2 2 2.038"/></svg>';var Oy=n(36);var Ny={injectType:"singletonStyleTag",attributes:{"data-cke":true}};Ny.insert="head";Ny.singleton=true;var My=wk()(Oy["a"],Ny);var Vy=Oy["a"].locals||{};const Ly=["before","after"];const Hy=(new DOMParser).parseFromString(zy,"image/svg+xml").firstChild;const Ky="ck-widget__type-around_disabled";class qy extends Kn{static get pluginName(){return"WidgetTypeAround"}static get requires(){return[ty,iy]}constructor(t){super(t);this._currentFakeCaretModelElement=null}init(){const t=this.editor;const e=t.editing.view;this.on("change:isEnabled",((n,o,i)=>{e.change((t=>{for(const n of e.document.roots){if(i){t.removeClass(Ky,n)}else{t.addClass(Ky,n)}}}));if(!i){t.model.change((t=>{t.removeSelectionAttribute(Ey)}))}}));this._enableTypeAroundUIInjection();this._enableInsertingParagraphsOnButtonClick();this._enableInsertingParagraphsOnEnterKeypress();this._enableInsertingParagraphsOnTypingKeystroke();this._enableTypeAroundFakeCaretActivationUsingKeyboardArrows();this._enableDeleteIntegration();this._enableInsertContentIntegration()}destroy(){this._currentFakeCaretModelElement=null}_insertParagraph(t,e){const n=this.editor;const o=n.editing.view;n.execute("insertParagraph",{position:n.model.createPositionAt(t,e)});o.focus();o.scrollToTheSelection()}_listenToIfEnabled(t,e,n,o){this.listenTo(t,e,((...t)=>{if(this.isEnabled){n(...t)}}),o)}_insertParagraphAccordingToFakeCaretPosition(){const t=this.editor;const e=t.model;const n=e.document.selection;const o=Py(n);if(!o){return false}const i=n.getSelectedElement();this._insertParagraph(i,o);return true}_enableTypeAroundUIInjection(){const t=this.editor;const e=t.model.schema;const n=t.locale.t;const o={before:n("Insert paragraph before block"),after:n("Insert paragraph after block")};t.editing.downcastDispatcher.on("insert",((t,n,i)=>{const r=i.mapper.toViewElement(n.item);if(Dy(r,n.item,e)){jy(i.writer,o,r)}}),{priority:"low"})}_enableTypeAroundFakeCaretActivationUsingKeyboardArrows(){const t=this.editor;const e=t.model;const n=e.document.selection;const o=e.schema;const i=t.editing.view;this._listenToIfEnabled(i.document,"arrowKey",((t,e)=>{this._handleArrowKeyPress(t,e)}),{context:[hy,"$text"],priority:"high"});this._listenToIfEnabled(n,"change:range",((e,n)=>{if(!n.directChange){return}t.model.change((t=>{t.removeSelectionAttribute(Ey)}))}));this._listenToIfEnabled(e.document,"change:data",(()=>{const e=n.getSelectedElement();if(e){const n=t.editing.mapper.toViewElement(e);if(Dy(n,e,o)){return}}t.model.change((t=>{t.removeSelectionAttribute(Ey)}))}));this._listenToIfEnabled(t.editing.downcastDispatcher,"selection",((t,e,n)=>{const i=n.writer;if(this._currentFakeCaretModelElement){const t=n.mapper.toViewElement(this._currentFakeCaretModelElement);if(t){i.removeClass(Ly.map(r),t);this._currentFakeCaretModelElement=null}}const s=e.selection.getSelectedElement();if(!s){return}const a=n.mapper.toViewElement(s);if(!Dy(a,s,o)){return}const c=Py(e.selection);if(!c){return}i.addClass(r(c),a);this._currentFakeCaretModelElement=s}));this._listenToIfEnabled(t.ui.focusTracker,"change:isFocused",((e,n,o)=>{if(!o){t.model.change((t=>{t.removeSelectionAttribute(Ey)}))}}));function r(t){return`ck-widget_type-around_show-fake-caret_${t}`}}_handleArrowKeyPress(t,e){const n=this.editor;const o=n.model;const i=o.document.selection;const r=o.schema;const s=n.editing.view;const a=e.keyCode;const c=cd(a,n.locale.contentLanguageDirection);const l=s.document.selection.getSelectedElement();const d=n.editing.mapper.toModelElement(l);let u;if(Dy(l,d,r)){u=this._handleArrowKeyPressOnSelectedWidget(c)}else if(i.isCollapsed){u=this._handleArrowKeyPressWhenSelectionNextToAWidget(c)}if(u){e.preventDefault();t.stop()}}_handleArrowKeyPressOnSelectedWidget(t){const e=this.editor;const n=e.model;const o=n.document.selection;const i=Py(o);return n.change((e=>{if(i){const n=i===(t?"after":"before");if(!n){e.removeSelectionAttribute(Ey);return true}}else{e.setSelectionAttribute(Ey,t?"after":"before");return true}return false}))}_handleArrowKeyPressWhenSelectionNextToAWidget(t){const e=this.editor;const n=e.model;const o=n.schema;const i=e.plugins.get("Widget");const r=i._getObjectElementNextToSelection(t);const s=e.editing.mapper.toViewElement(r);if(Dy(s,r,o)){n.change((e=>{i._setSelectionOverElement(r);e.setSelectionAttribute(Ey,t?"before":"after")}));return true}return false}_enableInsertingParagraphsOnButtonClick(){const t=this.editor;const e=t.editing.view;this._listenToIfEnabled(e.document,"mousedown",((n,o)=>{const i=Sy(o.domTarget);if(!i){return}const r=By(i);const s=Ty(i,e.domConverter);const a=t.editing.mapper.toModelElement(s);this._insertParagraph(a,r);o.preventDefault();n.stop()}))}_enableInsertingParagraphsOnEnterKeypress(){const t=this.editor;const e=t.model.document.selection;const n=t.editing.view;this._listenToIfEnabled(n.document,"enter",((n,o)=>{if(n.eventPhase!="atTarget"){return}const i=e.getSelectedElement();const r=t.editing.mapper.toViewElement(i);const s=t.model.schema;let a;if(this._insertParagraphAccordingToFakeCaretPosition()){a=true}else if(Dy(r,i,s)){this._insertParagraph(i,o.isSoft?"before":"after");a=true}if(a){o.preventDefault();n.stop()}}),{context:hy})}_enableInsertingParagraphsOnTypingKeystroke(){const t=this.editor;const e=t.editing.view;const n=[td.enter,td.delete,td.backspace];this._listenToIfEnabled(e.document,"keydown",((t,e)=>{if(!n.includes(e.keyCode)&&!Fy(e)){this._insertParagraphAccordingToFakeCaretPosition()}}),{priority:"high"})}_enableDeleteIntegration(){const t=this.editor;const e=t.editing.view;const n=t.model;const o=n.schema;this._listenToIfEnabled(e.document,"delete",((e,i)=>{if(e.eventPhase!="atTarget"){return}const r=Py(n.document.selection);if(!r){return}const s=i.direction;const a=n.document.selection.getSelectedElement();const c=r==="before";const l=s=="forward";const d=c===l;if(d){t.execute("delete",{selection:n.createSelection(a,"on")})}else{const e=o.getNearestSelectionRange(n.createPositionAt(a,r),s);if(e){if(!e.isCollapsed){n.change((n=>{n.setSelection(e);t.execute(l?"deleteForward":"delete")}))}else{const i=n.createSelection(e.start);n.modifySelection(i,{direction:s});if(!i.focus.isEqual(e.start)){n.change((n=>{n.setSelection(e);t.execute(l?"deleteForward":"delete")}))}else{const t=Uy(o,e.start.parent);n.deleteContent(n.createSelection(t,"on"),{doNotAutoparagraph:true})}}}}i.preventDefault();e.stop()}),{context:hy})}_enableInsertContentIntegration(){const t=this.editor;const e=this.editor.model;const n=e.document.selection;this._listenToIfEnabled(t.model,"insertContent",((t,[o,i])=>{if(i&&!i.is("documentSelection")){return}const r=Py(n);if(!r){return}t.stop();return e.change((t=>{const i=n.getSelectedElement();const s=e.createPositionAt(i,r);const a=t.createSelection(s);const c=e.insertContent(o,a);t.setSelection(a);return c}))}),{priority:"high"})}}function jy(t,e,n){const o=t.createUIElement("div",{class:"ck ck-reset_all ck-widget__type-around"},(function(t){const n=this.toDomElement(t);Wy(n,e);Gy(n);return n}));t.insert(t.createPositionAt(n,"end"),o)}function Wy(t,e){for(const n of Ly){const o=new Ek({tag:"div",attributes:{class:["ck","ck-widget__type-around__button",`ck-widget__type-around__button_${n}`],title:e[n]},children:[t.ownerDocument.importNode(Hy,true)]});t.appendChild(o.render())}}function Gy(t){const e=new Ek({tag:"div",attributes:{class:["ck","ck-widget__type-around__fake-caret"]}});t.appendChild(e.render())}function Uy(t,e){let n=e;for(const o of e.getAncestors({parentFirst:true})){if(o.childCount>1||t.isLimit(o)){break}n=o}return n}var $y=n(37);var Jy={injectType:"singletonStyleTag",attributes:{"data-cke":true}};Jy.insert="head";Jy.singleton=true;var Yy=wk()($y["a"],Jy);var Qy=$y["a"].locals||{};function Xy(t){const e=t.model;return(n,o)=>{const i=o.keyCode==td.arrowup;const r=o.keyCode==td.arrowdown;const s=o.shiftKey;const a=e.document.selection;if(!i&&!r){return}const c=r;if(s&&ox(a,c)){return}const l=Zy(t,a,c);if(!l||l.isCollapsed){return}if(nx(t,l,c)){e.change((t=>{const n=c?l.end:l.start;if(s){const o=e.createSelection(a.anchor);o.setFocus(n);t.setSelection(o)}else{t.setSelection(n)}}));n.stop();o.preventDefault();o.stopPropagation()}}}function Zy(t,e,n){const o=t.model;if(n){const t=e.isCollapsed?e.focus:e.getLastPosition();const n=tx(o,t,"forward");if(!n){return null}const i=o.createRange(t,n);const r=ex(o.schema,i,"backward");if(r&&t.isBefore(r)){return o.createRange(t,r)}return null}else{const t=e.isCollapsed?e.focus:e.getFirstPosition();const n=tx(o,t,"backward");if(!n){return null}const i=o.createRange(n,t);const r=ex(o.schema,i,"forward");if(r&&t.isAfter(r)){return o.createRange(r,t)}return null}}function tx(t,e,n){const o=t.schema;const i=t.createRangeIn(e.root);const r=n=="forward"?"elementStart":"elementEnd";for(const{previousPosition:t,item:s,type:a}of i.getWalker({startPosition:e,direction:n})){if(o.isLimit(s)&&!o.isInline(s)){return t}if(a==r&&o.isBlock(s)){return null}}return null}function ex(t,e,n){const o=n=="backward"?e.end:e.start;if(t.checkChild(o,"$text")){return o}for(const{nextPosition:o}of e.getWalker({direction:n})){if(t.checkChild(o,"$text")){return o}}}function nx(t,e,n){const o=t.model;const i=t.view.domConverter;if(n){const t=o.createSelection(e.start);o.modifySelection(t);if(!t.focus.isAtEnd&&!e.start.isEqual(t.focus)){e=o.createRange(t.focus,e.end)}}const r=t.mapper.toViewRange(e);const s=i.viewRangeToDom(r);const a=rf.getDomRangeRects(s);let c;for(const t of a){if(c===undefined){c=Math.round(t.bottom);continue}if(Math.round(t.top)>=c){return false}c=Math.max(c,Math.round(t.bottom))}return true}function ox(t,e){return!t.isCollapsed&&t.isBackward==e}class ix extends Kn{static get pluginName(){return"Widget"}static get requires(){return[qy,iy]}init(){const t=this.editor.editing.view;const e=t.document;this._previouslySelected=new Set;this.editor.editing.downcastDispatcher.on("selection",((t,e,n)=>{this._clearPreviouslySelectedWidgets(n.writer);const o=n.writer;const i=o.document.selection;const r=i.getSelectedElement();let s=null;for(const t of i.getRanges()){for(const e of t){const t=e.item;if(hy(t)&&!sx(t,s)){o.addClass(uy,t);this._previouslySelected.add(t);s=t;if(t==r){o.setSelection(i.getRanges(),{fake:true,label:ky(r)})}}}}}),{priority:"low"});t.addObserver(D_);this.listenTo(e,"mousedown",((...t)=>this._onMousedown(...t)));this.listenTo(e,"arrowKey",((...t)=>{this._handleSelectionChangeOnArrowKeyPress(...t)}),{context:[hy,"$text"]});this.listenTo(e,"arrowKey",((...t)=>{this._preventDefaultOnArrowKeyPress(...t)}),{context:"$root"});this.listenTo(e,"arrowKey",Xy(this.editor.editing),{context:"$text"});this.listenTo(e,"delete",((t,e)=>{if(this._handleDelete(e.direction=="forward")){e.preventDefault();t.stop()}}),{context:"$root"})}_onMousedown(t,e){const n=this.editor;const o=n.editing.view;const i=o.document;let r=e.target;if(rx(r)){if((Wl.isSafari||Wl.isGecko)&&e.domEvent.detail>=3){const t=n.editing.mapper;const o=r.is("attributeElement")?r.findAncestor((t=>!t.is("attributeElement"))):r;const i=t.toModelElement(o);e.preventDefault();this.editor.model.change((t=>{t.setSelection(i,"in")}))}return}if(!hy(r)){r=r.findAncestor(hy);if(!r){return}}if(Wl.isAndroid){e.preventDefault()}if(!i.isFocused){o.focus()}const s=n.editing.mapper.toModelElement(r);this._setSelectionOverElement(s)}_handleSelectionChangeOnArrowKeyPress(t,e){const n=e.keyCode;const o=this.editor.model;const i=o.schema;const r=o.document.selection;const s=r.getSelectedElement();const a=cd(n,this.editor.locale.contentLanguageDirection);if(s&&i.isObject(s)){const n=a?r.getLastPosition():r.getFirstPosition();const s=i.getNearestSelectionRange(n,a?"forward":"backward");if(s){o.change((t=>{t.setSelection(s)}));e.preventDefault();t.stop()}return}if(!r.isCollapsed){return}const c=this._getObjectElementNextToSelection(a);if(c&&i.isObject(c)){this._setSelectionOverElement(c);e.preventDefault();t.stop()}}_preventDefaultOnArrowKeyPress(t,e){const n=this.editor.model;const o=n.schema;const i=n.document.selection.getSelectedElement();if(i&&o.isObject(i)){e.preventDefault();t.stop()}}_handleDelete(t){if(this.editor.isReadOnly){return}const e=this.editor.model.document;const n=e.selection;if(!n.isCollapsed){return}const o=this._getObjectElementNextToSelection(t);if(o){this.editor.model.change((t=>{let e=n.anchor.parent;while(e.isEmpty){const n=e;e=n.parent;t.remove(n)}this._setSelectionOverElement(o)}));return true}}_setSelectionOverElement(t){this.editor.model.change((e=>{e.setSelection(e.createRangeOn(t))}))}_getObjectElementNextToSelection(t){const e=this.editor.model;const n=e.schema;const o=e.document.selection;const i=e.createSelection(o);e.modifySelection(i,{direction:t?"forward":"backward"});const r=t?i.focus.nodeBefore:i.focus.nodeAfter;if(!!r&&n.isObject(r)){return r}return null}_clearPreviouslySelectedWidgets(t){for(const e of this._previouslySelected){t.removeClass(uy,e)}this._previouslySelected.clear()}}function rx(t){while(t){if(t.is("editableElement")&&!t.is("rootElement")){return true}if(hy(t)){return false}t=t.parent}return false}function sx(t,e){if(!e){return false}return Array.from(t.getAncestors()).includes(e)}var ax="Expected a function";function cx(t,e,n){var o=true,i=true;if(typeof t!="function"){throw new TypeError(ax)}if(S(n)){o="leading"in n?!!n.leading:o;i="trailing"in n?!!n.trailing:i}return qh(t,e,{leading:o,maxWait:e,trailing:i})}var lx=cx;var dx=n(38);var ux={injectType:"singletonStyleTag",attributes:{"data-cke":true}};ux.insert="head";ux.singleton=true;var hx=wk()(dx["a"],ux);var fx=dx["a"].locals||{};class mx extends Kn{static get pluginName(){return"DragDrop"}static get requires(){return[$v,ix]}init(){const t=this.editor;const e=t.editing.view;this._draggedRange=null;this._draggingUid="";this._draggableElement=null;this._updateDropMarkerThrottled=lx((t=>this._updateDropMarker(t)),40);this._removeDropMarkerDelayed=_x((()=>this._removeDropMarker()),40);this._clearDraggableAttributesDelayed=_x((()=>this._clearDraggableAttributes()),40);e.addObserver(Kv);e.addObserver(D_);this._setupDragging();this._setupContentInsertionIntegration();this._setupClipboardInputIntegration();this._setupDropMarker();this._setupDraggableAttributeHandling();this.listenTo(t,"change:isReadOnly",((t,e,n)=>{if(n){this.forceDisabled("readOnlyMode")}else{this.clearForceDisabled("readOnlyMode")}}));this.on("change:isEnabled",((t,e,n)=>{if(!n){this._finalizeDragging(false)}}));if(Wl.isAndroid){this.forceDisabled("noAndroidSupport")}}destroy(){if(this._draggedRange){this._draggedRange.detach();this._draggedRange=null}this._updateDropMarkerThrottled.cancel();this._removeDropMarkerDelayed.cancel();this._clearDraggableAttributesDelayed.cancel();return super.destroy()}_setupDragging(){const t=this.editor;const e=t.model;const n=e.document;const o=t.editing.view;const i=o.document;this.listenTo(i,"dragstart",((o,r)=>{const s=n.selection;if(r.target&&r.target.is("rootElement")){r.preventDefault();return}const c=r.target?vx(r.target):null;if(c){const n=t.editing.mapper.toModelElement(c);this._draggedRange=om.fromRange(e.createRangeOn(n))}else if(!i.selection.isCollapsed){const t=i.selection.getSelectedElement();if(!t||!hy(t)){this._draggedRange=om.fromRange(s.getFirstRange())}}if(!this._draggedRange){r.preventDefault();return}this._draggingUid=a();r.dataTransfer.effectAllowed=this.isEnabled?"copyMove":"copy";r.dataTransfer.setData("application/ckeditor5-dragging-uid",this._draggingUid);const l=e.createSelection(this._draggedRange.toRange());const d=t.data.toView(e.getSelectedContent(l));i.fire("clipboardOutput",{dataTransfer:r.dataTransfer,content:d,method:o.name});if(!this.isEnabled){this._draggedRange.detach();this._draggedRange=null;this._draggingUid=""}}),{priority:"low"});this.listenTo(i,"dragend",((t,e)=>{this._finalizeDragging(!e.dataTransfer.isCanceled&&e.dataTransfer.dropEffect=="move")}),{priority:"low"});this.listenTo(i,"dragenter",(()=>{if(!this.isEnabled){return}o.focus()}));this.listenTo(i,"dragleave",(()=>{this._removeDropMarkerDelayed()}));this.listenTo(i,"dragging",((e,n)=>{if(!this.isEnabled){n.dataTransfer.dropEffect="none";return}this._removeDropMarkerDelayed.cancel();const o=gx(t,n.targetRanges,n.target);if(!this._draggedRange){n.dataTransfer.dropEffect="copy"}if(!Wl.isGecko){if(n.dataTransfer.effectAllowed=="copy"){n.dataTransfer.dropEffect="copy"}else if(["all","copyMove"].includes(n.dataTransfer.effectAllowed)){n.dataTransfer.dropEffect="move"}}if(o){this._updateDropMarkerThrottled(o)}}),{priority:"low"})}_setupClipboardInputIntegration(){const t=this.editor;const e=t.editing.view;const n=e.document;this.listenTo(n,"clipboardInput",((e,n)=>{if(n.method!="drop"){return}const o=gx(t,n.targetRanges,n.target);this._removeDropMarker();if(!o){this._finalizeDragging(false);e.stop();return}if(this._draggedRange&&this._draggingUid!=n.dataTransfer.getData("application/ckeditor5-dragging-uid")){this._draggedRange.detach();this._draggedRange=null;this._draggingUid=""}const i=Ax(n.dataTransfer)=="move";if(i&&this._draggedRange&&this._draggedRange.containsRange(o,true)){this._finalizeDragging(false);e.stop();return}n.targetRanges=[t.editing.mapper.toViewRange(o)]}),{priority:"high"})}_setupContentInsertionIntegration(){const t=this.editor.plugins.get($v);t.on("contentInsertion",((t,e)=>{if(!this.isEnabled||e.method!=="drop"){return}const n=e.targetRanges.map((t=>this.editor.editing.mapper.toModelRange(t)));this.editor.model.change((t=>t.setSelection(n)))}),{priority:"high"});t.on("contentInsertion",((t,e)=>{if(!this.isEnabled||e.method!=="drop"){return}const n=Ax(e.dataTransfer)=="move";const o=!e.resultRange||!e.resultRange.isCollapsed;this._finalizeDragging(o&&n)}),{priority:"lowest"})}_setupDraggableAttributeHandling(){const t=this.editor;const e=t.editing.view;const n=e.document;this.listenTo(n,"mousedown",((o,i)=>{if(Wl.isAndroid||!i){return}this._clearDraggableAttributesDelayed.cancel();let r=vx(i.target);if(Wl.isBlink&&!r&&!n.selection.isCollapsed){const t=n.selection.getSelectedElement();if(!t||!hy(t)){r=n.selection.editableElement}}if(r){e.change((t=>{t.setAttribute("draggable","true",r)}));this._draggableElement=t.editing.mapper.toModelElement(r)}}));this.listenTo(n,"mouseup",(()=>{if(!Wl.isAndroid){this._clearDraggableAttributesDelayed()}}))}_clearDraggableAttributes(){const t=this.editor.editing;t.view.change((e=>{if(this._draggableElement&&this._draggableElement.root.rootName!="$graveyard"){e.removeAttribute("draggable",t.mapper.toViewElement(this._draggableElement))}this._draggableElement=null}))}_setupDropMarker(){const t=this.editor;t.conversion.for("editingDowncast").markerToHighlight({model:"drop-target",view:{classes:["ck-clipboard-drop-target-range"]}});t.conversion.for("editingDowncast").markerToElement({model:"drop-target",view:(e,{writer:n})=>{const o=t.model.schema.checkChild(e.markerRange.start,"$text");if(!o){return}return n.createUIElement("span",{class:"ck ck-clipboard-drop-target-position"},(function(t){const e=this.toDomElement(t);e.innerHTML="⁠<span></span>⁠";return e}))}})}_updateDropMarker(t){const e=this.editor;const n=e.model.markers;e.model.change((e=>{if(n.has("drop-target")){if(!n.get("drop-target").getRange().isEqual(t)){e.updateMarker("drop-target",{range:t})}}else{e.addMarker("drop-target",{range:t,usingOperation:false,affectsData:false})}}))}_removeDropMarker(){const t=this.editor.model;this._removeDropMarkerDelayed.cancel();this._updateDropMarkerThrottled.cancel();if(t.markers.has("drop-target")){t.change((t=>{t.removeMarker("drop-target")}))}}_finalizeDragging(t){const e=this.editor;const n=e.model;this._removeDropMarker();this._clearDraggableAttributes();this._draggingUid="";if(!this._draggedRange){return}if(t&&this.isEnabled){n.deleteContent(n.createSelection(this._draggedRange),{doNotAutoparagraph:true})}this._draggedRange.detach();this._draggedRange=null}}function gx(t,e,n){const o=t.model;const i=t.editing.mapper;let r=null;const s=e?e[0].start:null;if(n.is("uiElement")){n=n.parent}r=px(t,n);if(r){return r}const a=Cx(t,n);const c=s?i.toModelPosition(s):null;if(!c){return bx(t,a)}r=kx(t,c,a);if(r){return r}r=o.schema.getNearestSelectionRange(c,Wl.isGecko?"forward":"backward");if(r){return r}return wx(t,c.parent)}function px(t,e){const n=t.model;const o=t.editing.mapper;if(hy(e)){return n.createRangeOn(o.toModelElement(e))}if(!e.is("editableElement")){const t=e.findAncestor((t=>hy(t)||t.is("editableElement")));if(hy(t)){return n.createRangeOn(o.toModelElement(t))}}return null}function bx(t,e){const n=t.model;const o=n.schema;const i=n.createPositionAt(e,0);return o.getNearestSelectionRange(i,"forward")}function kx(t,e,n){const o=t.model;if(!o.schema.checkChild(n,"$block")){return null}const i=o.createPositionAt(n,0);const r=e.path.slice(0,i.path.length);const s=o.createPositionFromPath(e.root,r);const a=s.nodeAfter;if(a&&o.schema.isObject(a)){return o.createRangeOn(a)}return null}function wx(t,e){const n=t.model;while(e){if(n.schema.isObject(e)){return n.createRangeOn(e)}e=e.parent}}function Cx(t,e){const n=t.editing.mapper;const o=t.editing.view;const i=n.toModelElement(e);if(i){return i}const r=o.createPositionBefore(e);const s=n.findMappedViewAncestor(r);return n.toModelElement(s)}function Ax(t){if(Wl.isGecko){return t.dropEffect}return["all","copyMove"].includes(t.effectAllowed)?"move":"copy"}function _x(t,e){let n;function o(...i){o.cancel();n=setTimeout((()=>t(...i)),e)}o.cancel=()=>{clearTimeout(n)};return o}function vx(t){if(t.is("editableElement")){return null}if(t.hasClass("ck-widget__selection-handle")){return t.findAncestor(hy)}if(hy(t)){return t}const e=t.findAncestor((t=>hy(t)||t.is("editableElement")));if(hy(e)){return e}return null}class yx extends Kn{static get pluginName(){return"PastePlainText"}static get requires(){return[$v]}init(){const t=this.editor;const e=t.model;const n=t.editing.view;const o=n.document;const i=e.document.selection;let r=false;n.addObserver(Kv);this.listenTo(o,"keydown",((t,e)=>{r=e.shiftKey}));t.plugins.get($v).on("contentInsertion",((t,n)=>{if(!r&&!xx(n.content,e.schema)){return}e.change((t=>{const o=Array.from(i.getAttributes()).filter((([t])=>e.schema.getAttributeProperties(t).isFormatting));if(!i.isCollapsed){e.deleteContent(i,{doNotAutoparagraph:true})}o.push(...i.getAttributes());const r=t.createRangeIn(n.content);for(const e of r.getItems()){if(e.is("$textProxy")){t.setAttributes(o,e)}}}))}))}}function xx(t,e){if(t.childCount>1){return false}const n=t.getChild(0);if(e.isObject(n)){return false}return[...n.getAttributeKeys()].length==0}class Ex extends Kn{static get pluginName(){return"Clipboard"}static get requires(){return[$v,mx,yx]}}class Dx extends jn{constructor(t){super(t);this._stack=[];this._createdBatches=new WeakSet;this.refresh();this.listenTo(t.data,"set",(()=>this.clearStack()))}refresh(){this.isEnabled=this._stack.length>0}addBatch(t){const e=this.editor.model.document.selection;const n={ranges:e.hasOwnRange?Array.from(e.getRanges()):[],isBackward:e.isBackward};this._stack.push({batch:t,selection:n});this.refresh()}clearStack(){this._stack=[];this.refresh()}_restoreSelection(t,e,n){const o=this.editor.model;const i=o.document;const r=[];const s=t.map((t=>t.getTransformedByOperations(n)));const a=s.flat();for(const t of s){const e=t.filter((t=>t.root!=i.graveyard)).filter((t=>!Bx(t,a)));if(!e.length){continue}Sx(e);r.push(e[0])}if(r.length){o.change((t=>{t.setSelection(r,{backward:e})}))}}_undo(t,e){const n=this.editor.model;const o=n.document;this._createdBatches.add(e);const i=t.operations.slice().filter((t=>t.isDocumentOperation));i.reverse();for(const t of i){const i=t.baseVersion+1;const r=Array.from(o.history.getOperations(i));const s=k_([t.getReversed()],r,{useRelations:true,document:this.editor.model.document,padWithNoOps:false,forceWeakRemove:true});const a=s.operationsA;for(const i of a){e.addOperation(i);n.applyOperation(i);o.history.setOperationAsUndone(t,i)}}}}function Sx(t){t.sort(((t,e)=>t.start.isBefore(e.start)?-1:1));for(let e=1;e<t.length;e++){const n=t[e-1];const o=n.getJoined(t[e],true);if(o){e--;t.splice(e,2,o)}}}function Bx(t,e){return e.some((e=>e!==t&&e.containsRange(t,true)))}class Tx extends Dx{execute(t=null){const e=t?this._stack.findIndex((e=>e.batch==t)):this._stack.length-1;const n=this._stack.splice(e,1)[0];const o=this.editor.model.createBatch("transparent");this.editor.model.enqueueChange(o,(()=>{this._undo(n.batch,o);const t=this.editor.model.document.history.getOperations(n.batch.baseVersion);this._restoreSelection(n.selection.ranges,n.selection.isBackward,t);this.fire("revert",n.batch,o)}));this.refresh()}}class Px extends Dx{execute(){const t=this._stack.pop();const e=this.editor.model.createBatch("transparent");this.editor.model.enqueueChange(e,(()=>{const n=t.batch.operations[t.batch.operations.length-1];const o=n.baseVersion+1;const i=this.editor.model.document.history.getOperations(o);this._restoreSelection(t.selection.ranges,t.selection.isBackward,i);this._undo(t.batch,e)}));this.refresh()}}class Ix extends Kn{static get pluginName(){return"UndoEditing"}constructor(t){super(t);this._batchRegistry=new WeakSet}init(){const t=this.editor;this._undoCommand=new Tx(t);this._redoCommand=new Px(t);t.commands.add("undo",this._undoCommand);t.commands.add("redo",this._redoCommand);this.listenTo(t.model,"applyOperation",((t,e)=>{const n=e[0];if(!n.isDocumentOperation){return}const o=n.batch;const i=this._redoCommand._createdBatches.has(o);const r=this._undoCommand._createdBatches.has(o);const s=this._batchRegistry.has(o);if(s||o.type=="transparent"&&!i&&!r){return}else{if(i){this._undoCommand.addBatch(o)}else if(!r){this._undoCommand.addBatch(o);this._redoCommand.clearStack()}}this._batchRegistry.add(o)}),{priority:"highest"});this.listenTo(this._undoCommand,"revert",((t,e,n)=>{this._redoCommand.addBatch(n)}));t.keystrokes.set("CTRL+Z","undo");t.keystrokes.set("CTRL+Y","redo");t.keystrokes.set("CTRL+SHIFT+Z","redo")}}var Rx='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m5.042 9.367 2.189 1.837a.75.75 0 0 1-.965 1.149l-3.788-3.18a.747.747 0 0 1-.21-.284.75.75 0 0 1 .17-.945L6.23 4.762a.75.75 0 1 1 .964 1.15L4.863 7.866h8.917A.75.75 0 0 1 14 7.9a4 4 0 1 1-1.477 7.718l.344-1.489a2.5 2.5 0 1 0 1.094-4.73l.008-.032H5.042z"/></svg>';var Fx='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m14.958 9.367-2.189 1.837a.75.75 0 0 0 .965 1.149l3.788-3.18a.747.747 0 0 0 .21-.284.75.75 0 0 0-.17-.945L13.77 4.762a.75.75 0 1 0-.964 1.15l2.331 1.955H6.22A.75.75 0 0 0 6 7.9a4 4 0 1 0 1.477 7.718l-.344-1.489A2.5 2.5 0 1 1 6.039 9.4l-.008-.032h8.927z"/></svg>';class zx extends Kn{static get pluginName(){return"UndoUI"}init(){const t=this.editor;const e=t.locale;const n=t.t;const o=e.uiLanguageDirection=="ltr"?Rx:Fx;const i=e.uiLanguageDirection=="ltr"?Fx:Rx;this._addButton("undo",n("Undo"),"CTRL+Z",o);this._addButton("redo",n("Redo"),"CTRL+Y",i)}_addButton(t,e,n,o){const i=this.editor;i.ui.componentFactory.add(t,(r=>{const s=i.commands.get(t);const a=new fw(r);a.set({label:e,icon:o,keystroke:n,tooltip:true});a.bind("isEnabled").to(s,"isEnabled");this.listenTo(a,"execute",(()=>{i.execute(t);i.editing.view.focus()}));return a}))}}class Ox extends Kn{static get requires(){return[Ix,zx]}static get pluginName(){return"Undo"}}class Nx extends Kn{static get requires(){return[IA]}static get pluginName(){return"WidgetToolbarRepository"}init(){const t=this.editor;if(t.plugins.has("BalloonToolbar")){const e=t.plugins.get("BalloonToolbar");this.listenTo(e,"show",(e=>{if(Lx(t.editing.view.document.selection)){e.stop()}}),{priority:"high"})}this._toolbarDefinitions=new Map;this._balloon=this.editor.plugins.get("ContextualBalloon");this.on("change:isEnabled",(()=>{this._updateToolbarsVisibility()}));this.listenTo(t.ui,"update",(()=>{this._updateToolbarsVisibility()}));this.listenTo(t.ui.focusTracker,"change:isFocused",(()=>{this._updateToolbarsVisibility()}),{priority:"low"})}destroy(){super.destroy();for(const t of this._toolbarDefinitions.values()){t.view.destroy()}}register(t,{ariaLabel:e,items:n,getRelatedElement:o,balloonClassName:i="ck-toolbar-container"}){if(!n.length){Object(u["b"])("widget-toolbar-no-items",{toolbarId:t});return}const r=this.editor;const s=r.t;const a=new sC(r.locale);a.ariaLabel=e||s("Widget toolbar");if(this._toolbarDefinitions.has(t)){throw new u["a"]("widget-toolbar-duplicated",this,{toolbarId:t})}a.fillFromConfig(n,r.ui.componentFactory);this._toolbarDefinitions.set(t,{view:a,getRelatedElement:o,balloonClassName:i})}_updateToolbarsVisibility(){let t=0;let e=null;let n=null;for(const o of this._toolbarDefinitions.values()){const i=o.getRelatedElement(this.editor.editing.view.document.selection);if(!this.isEnabled||!i){if(this._isToolbarInBalloon(o)){this._hideToolbar(o)}}else if(!this.editor.ui.focusTracker.isFocused){if(this._isToolbarVisible(o)){this._hideToolbar(o)}}else{const r=i.getAncestors().length;if(r>t){t=r;e=i;n=o}}}if(n){this._showToolbar(n,e)}}_hideToolbar(t){this._balloon.remove(t.view);this.stopListening(this._balloon,"change:visibleView")}_showToolbar(t,e){if(this._isToolbarVisible(t)){Mx(this.editor,e)}else if(!this._isToolbarInBalloon(t)){this._balloon.add({view:t.view,position:Vx(this.editor,e),balloonClassName:t.balloonClassName});this.listenTo(this._balloon,"change:visibleView",(()=>{for(const t of this._toolbarDefinitions.values()){if(this._isToolbarVisible(t)){const e=t.getRelatedElement(this.editor.editing.view.document.selection);Mx(this.editor,e)}}}))}}_isToolbarVisible(t){return this._balloon.visibleView===t.view}_isToolbarInBalloon(t){return this._balloon.hasView(t.view)}}function Mx(t,e){const n=t.plugins.get("ContextualBalloon");const o=Vx(t,e);n.updatePosition(o)}function Vx(t,e){const n=t.editing.view;const o=bA.defaultPositions;return{target:n.domConverter.mapViewToDom(e),positions:[o.northArrowSouth,o.northArrowSouthWest,o.northArrowSouthEast,o.southArrowNorth,o.southArrowNorthWest,o.southArrowNorthEast,vy]}}function Lx(t){const e=t.getSelectedElement();return!!(e&&hy(e))}class Hx{constructor(t){this.set("activeHandlePosition",null);this.set("proposedWidthPercents",null);this.set("proposedWidth",null);this.set("proposedHeight",null);this.set("proposedHandleHostWidth",null);this.set("proposedHandleHostHeight",null);this._options=t;this._referenceCoordinates=null}begin(t,e,n){const o=new rf(e);this.activeHandlePosition=Wx(t);this._referenceCoordinates=qx(e,Gx(this.activeHandlePosition));this.originalWidth=o.width;this.originalHeight=o.height;this.aspectRatio=o.width/o.height;const i=n.style.width;if(i&&i.match(/^\d+(\.\d*)?%$/)){this.originalWidthPercents=parseFloat(i)}else{this.originalWidthPercents=Kx(n,o)}}update(t){this.proposedWidth=t.width;this.proposedHeight=t.height;this.proposedWidthPercents=t.widthPercents;this.proposedHandleHostWidth=t.handleHostWidth;this.proposedHandleHostHeight=t.handleHostHeight}}Hn(Hx,Tn);function Kx(t,e){const n=t.parentElement;const o=parseFloat(n.ownerDocument.defaultView.getComputedStyle(n).width);return e.width/o*100}function qx(t,e){const n=new rf(t);const o=e.split("-");const i={x:o[1]=="right"?n.right:n.left,y:o[0]=="bottom"?n.bottom:n.top};i.x+=t.ownerDocument.defaultView.scrollX;i.y+=t.ownerDocument.defaultView.scrollY;return i}function jx(t){return`ck-widget__resizer__handle-${t}`}function Wx(t){const e=["top-left","top-right","bottom-right","bottom-left"];for(const n of e){if(t.classList.contains(jx(n))){return n}}}function Gx(t){const e=t.split("-");const n={top:"bottom",bottom:"top",left:"right",right:"left"};return`${n[e[0]]}-${n[e[1]]}`}class Ux{constructor(t){this._options=t;this._domResizerWrapper=null;this._viewResizerWrapper=null;this.set("isEnabled",true);this.decorate("begin");this.decorate("cancel");this.decorate("commit");this.decorate("updateSize");this.on("commit",(t=>{if(!this.state.proposedWidth&&!this.state.proposedWidthPercents){this._cleanup();t.stop()}}),{priority:"high"});this.on("change:isEnabled",(()=>{if(this.isEnabled){this.redraw()}}))}attach(){const t=this;const e=this._options.viewElement;const n=this._options.editor.editing.view;n.change((n=>{const o=n.createUIElement("div",{class:"ck ck-reset_all ck-widget__resizer"},(function(e){const n=this.toDomElement(e);t._appendHandles(n);t._appendSizeUI(n);t._domResizerWrapper=n;t.on("change:isEnabled",((t,e,o)=>{n.style.display=o?"":"none"}));n.style.display=t.isEnabled?"":"none";return n}));n.insert(n.createPositionAt(e,"end"),o);n.addClass("ck-widget_with-resizer",e);this._viewResizerWrapper=o}))}begin(t){this.state=new Hx(this._options);this._sizeUI.bindToState(this._options,this.state);this._initialViewWidth=this._options.viewElement.getStyle("width");this.state.begin(t,this._getHandleHost(),this._getResizeHost())}updateSize(t){const e=this._proposeNewSize(t);const n=this._options.editor.editing.view;n.change((t=>{const n=this._options.unit||"%";const o=(n==="%"?e.widthPercents:e.width)+n;t.setStyle("width",o,this._options.viewElement)}));const o=this._getHandleHost();const i=new rf(o);e.handleHostWidth=Math.round(i.width);e.handleHostHeight=Math.round(i.height);const r=new rf(o);e.width=Math.round(r.width);e.height=Math.round(r.height);this.redraw(i);this.state.update(e)}commit(){const t=this._options.unit||"%";const e=(t==="%"?this.state.proposedWidthPercents:this.state.proposedWidth)+t;this._options.editor.editing.view.change((()=>{this._cleanup();this._options.onCommit(e)}))}cancel(){this._cleanup()}destroy(){this.cancel()}redraw(t){const e=this._domResizerWrapper;if(!Qx(e)){return}const n=e.parentElement;const o=this._getHandleHost();const i=this._viewResizerWrapper;const r=[i.getStyle("width"),i.getStyle("height"),i.getStyle("left"),i.getStyle("top")];let s;if(n.isSameNode(o)){const e=t||new rf(o);s=[e.width+"px",e.height+"px",undefined,undefined]}else{s=[o.offsetWidth+"px",o.offsetHeight+"px",o.offsetLeft+"px",o.offsetTop+"px"]}if(Ia(r,s)!=="same"){this._options.editor.editing.view.change((t=>{t.setStyle({width:s[0],height:s[1],left:s[2],top:s[3]},i)}))}}containsHandle(t){return this._domResizerWrapper.contains(t)}static isResizeHandle(t){return t.classList.contains("ck-widget__resizer__handle")}_cleanup(){this._sizeUI.dismiss();this._sizeUI.isVisible=false;const t=this._options.editor.editing.view;t.change((t=>{t.setStyle("width",this._initialViewWidth,this._options.viewElement)}))}_proposeNewSize(t){const e=this.state;const n=Yx(t);const o=this._options.isCentered?this._options.isCentered(this):true;const i={x:e._referenceCoordinates.x-(n.x+e.originalWidth),y:n.y-e.originalHeight-e._referenceCoordinates.y};if(o&&e.activeHandlePosition.endsWith("-right")){i.x=n.x-(e._referenceCoordinates.x+e.originalWidth)}if(o){i.x*=2}const r={width:Math.abs(e.originalWidth+i.x),height:Math.abs(e.originalHeight+i.y)};r.dominant=r.width/e.aspectRatio>r.height?"width":"height";r.max=r[r.dominant];const s={width:r.width,height:r.height};if(r.dominant=="width"){s.height=s.width/e.aspectRatio}else{s.width=s.height*e.aspectRatio}return{width:Math.round(s.width),height:Math.round(s.height),widthPercents:Math.min(Math.round(e.originalWidthPercents/e.originalWidth*s.width*100)/100,100)}}_getResizeHost(){const t=this._domResizerWrapper.parentElement;return this._options.getResizeHost(t)}_getHandleHost(){const t=this._domResizerWrapper.parentElement;return this._options.getHandleHost(t)}_appendHandles(t){const e=["top-left","top-right","bottom-right","bottom-left"];for(const n of e){t.appendChild(new Ek({tag:"div",attributes:{class:`ck-widget__resizer__handle ${Jx(n)}`}}).render())}}_appendSizeUI(t){const e=new $x;e.render();this._sizeUI=e;t.appendChild(e.element)}}Hn(Ux,Tn);class $x extends yk{constructor(){super();const t=this.bindTemplate;this.setTemplate({tag:"div",attributes:{class:["ck","ck-size-view",t.to("activeHandlePosition",(t=>t?`ck-orientation-${t}`:""))],style:{display:t.if("isVisible","none",(t=>!t))}},children:[{text:t.to("label")}]})}bindToState(t,e){this.bind("isVisible").to(e,"proposedWidth",e,"proposedHeight",((t,e)=>t!==null&&e!==null));this.bind("label").to(e,"proposedHandleHostWidth",e,"proposedHandleHostHeight",e,"proposedWidthPercents",((e,n,o)=>{if(t.unit==="px"){return`${e}×${n}`}else{return`${o}%`}}));this.bind("activeHandlePosition").to(e)}dismiss(){this.unbind();this.isVisible=false}}function Jx(t){return`ck-widget__resizer__handle-${t}`}function Yx(t){return{x:t.pageX,y:t.pageY}}function Qx(t){return t&&t.ownerDocument&&t.ownerDocument.contains(t)}var Xx=n(39);var Zx={injectType:"singletonStyleTag",attributes:{"data-cke":true}};Zx.insert="head";Zx.singleton=true;var tE=wk()(Xx["a"],Zx);var eE=Xx["a"].locals||{};class nE extends Kn{static get pluginName(){return"WidgetResize"}init(){this.set("visibleResizer",null);this.set("_activeResizer",null);this._resizers=new Map;const t=ru.window.document;this.editor.model.schema.setAttributeProperties("width",{isFormatting:true});this.editor.editing.view.addObserver(D_);this._observer=Object.create(bu);this.listenTo(this.editor.editing.view.document,"mousedown",this._mouseDownListener.bind(this),{priority:"high"});this._observer.listenTo(t,"mousemove",this._mouseMoveListener.bind(this));this._observer.listenTo(t,"mouseup",this._mouseUpListener.bind(this));const e=()=>{if(this.visibleResizer){this.visibleResizer.redraw()}};const n=lx(e,200);this.on("change:visibleResizer",e);this.editor.ui.on("update",n);this._observer.listenTo(ru.window,"resize",n);const o=this.editor.editing.view.document.selection;o.on("change",(()=>{const t=o.getSelectedElement();this.visibleResizer=this.getResizerByViewElement(t)||null}))}destroy(){this._observer.stopListening();for(const t of this._resizers.values()){t.destroy()}}attachTo(t){const e=new Ux(t);const n=this.editor.plugins;e.attach();if(n.has("WidgetToolbarRepository")){const t=n.get("WidgetToolbarRepository");e.on("begin",(()=>{t.forceDisabled("resize")}),{priority:"lowest"});e.on("cancel",(()=>{t.clearForceDisabled("resize")}),{priority:"highest"});e.on("commit",(()=>{t.clearForceDisabled("resize")}),{priority:"highest"})}this._resizers.set(t.viewElement,e);const o=this.editor.editing.view.document.selection;const i=o.getSelectedElement();if(this.getResizerByViewElement(i)==e){this.visibleResizer=e}return e}getResizerByViewElement(t){return this._resizers.get(t)}_getResizerByHandle(t){for(const e of this._resizers.values()){if(e.containsHandle(t)){return e}}}_mouseDownListener(t,e){const n=e.domTarget;if(!Ux.isResizeHandle(n)){return}this._activeResizer=this._getResizerByHandle(n);if(this._activeResizer){this._activeResizer.begin(n);t.stop();e.preventDefault()}}_mouseMoveListener(t,e){if(this._activeResizer){this._activeResizer.updateSize(e)}}_mouseUpListener(){if(this._activeResizer){this._activeResizer.commit();this._activeResizer=null}}}Hn(nE,Tn);function oE(t,e,n){e.setCustomProperty("image",true,t);return fy(t,e,{label:o});function o(){const e=lE(t);const o=e.getAttribute("alt");return o?`${o} ${n}`:n}}function iE(t){return!!t.getCustomProperty("image")&&hy(t)}function rE(t){const e=t.getSelectedElement();if(e&&iE(e)){return e}return null}function sE(t){return!!t&&t.is("element","image")}function aE(t,e={},n=null){t.change((o=>{const i=o.createElement("image",e);const r=n||Cy(t.document.selection,t);t.insertContent(i,r);if(i.parent){o.setSelection(i,"on")}}))}function cE(t){const e=t.schema;const n=t.document.selection;return dE(n,e,t)&&!Ay(n,e)&&uE(n)}function lE(t){const e=[];for(const n of t.getChildren()){e.push(n);if(n.is("element")){e.push(...n.getChildren())}}return e.find((t=>t.is("element","img")))}function dE(t,e,n){const o=hE(t,n);return e.checkChild(o,"image")}function uE(t){return[...t.focus.getAncestors()].every((t=>!t.is("element","image")))}function hE(t,e){const n=Cy(t,e);const o=n.parent;if(o.isEmpty&&!o.is("element","$root")){return o.parent}return o}const fE=new RegExp(String(/^(http(s)?:\/\/)?[\w-]+\.[\w.~:/[\]@!$&'()*+,;=%-]+/.source+/\.(jpg|jpeg|png|gif|ico|webp|JPG|JPEG|PNG|GIF|ICO|WEBP)/.source+/(\?[\w.~:/[\]@!$&'()*+,;=%-]*)?/.source+/(#[\w.~:/[\]@!$&'()*+,;=%-]*)?$/.source));class mE extends Kn{static get requires(){return[Ex,Ox]}static get pluginName(){return"AutoImage"}constructor(t){super(t);this._timeoutId=null;this._positionToInsert=null}init(){const t=this.editor;const e=t.model.document;this.listenTo(t.plugins.get("ClipboardPipeline"),"inputTransformation",(()=>{const t=e.selection.getFirstRange();const n=qp.fromPosition(t.start);n.stickiness="toPrevious";const o=qp.fromPosition(t.end);o.stickiness="toNext";e.once("change:data",(()=>{this._embedImageBetweenPositions(n,o);n.detach();o.detach()}),{priority:"high"})}));t.commands.get("undo").on("execute",(()=>{if(this._timeoutId){ru.window.clearTimeout(this._timeoutId);this._positionToInsert.detach();this._timeoutId=null;this._positionToInsert=null}}),{priority:"high"})}_embedImageBetweenPositions(t,e){const n=this.editor;const o=new om(t,e);const i=o.getWalker({ignoreElementEnd:true});let r="";for(const t of i){if(t.item.is("$textProxy")){r+=t.item.data}}r=r.trim();if(!r.match(fE)){o.detach();return}this._positionToInsert=qp.fromPosition(t);this._timeoutId=ru.window.setTimeout((()=>{const t=n.commands.get("insertImage");if(!t.isEnabled){o.detach();return}n.model.change((t=>{this._timeoutId=null;t.remove(o);o.detach();let e;if(this._positionToInsert.root.rootName!=="$graveyard"){e=this._positionToInsert.toPosition()}aE(n.model,{src:r},e);this._positionToInsert.detach();this._positionToInsert=null}))}),100)}}class gE extends jn{constructor(t,e){super(t);this._buffer=new ey(t.model,e);this._batches=new WeakSet}get buffer(){return this._buffer}destroy(){super.destroy();this._buffer.destroy()}execute(t={}){const e=this.editor.model;const n=e.document;const o=t.text||"";const i=o.length;const r=t.range?e.createSelection(t.range):n.selection;const s=t.resultRange;e.enqueueChange(this._buffer.batch,(t=>{this._buffer.lock();this._batches.add(this._buffer.batch);e.deleteContent(r);if(o){e.insertContent(t.createText(o,n.selection.getAttributes()),r)}if(s){t.setSelection(s)}else if(!r.is("documentSelection")){t.setSelection(r)}this._buffer.unlock();this._buffer.input(i)}))}}function pE(t,e){const n=[];let o=0;let i;t.forEach((t=>{if(t=="equal"){r();o++}else if(t=="insert"){if(s("insert")){i.values.push(e[o])}else{r();i={type:"insert",index:o,values:[e[o]]}}o++}else{if(s("delete")){i.howMany++}else{r();i={type:"delete",index:o,howMany:1}}}}));r();return n;function r(){if(i){n.push(i);i=null}}function s(t){return i&&i.type==t}}function bE(t){if(t.length==0){return false}for(const e of t){if(e.type==="children"&&!kE(e)){return true}}return false}function kE(t){if(t.newChildren.length-t.oldChildren.length!=1){return}const e=Ud(t.oldChildren,t.newChildren,wE);const n=pE(e,t.newChildren);if(n.length>1){return}const o=n[0];if(!(!!o.values[0]&&o.values[0].is("$text"))){return}return o}function wE(t,e){if(!!t&&t.is("$text")&&!!e&&e.is("$text")){return t.data===e.data}else{return t===e}}function CE(t){t.editing.view.document.on("mutations",((e,n,o)=>{new AE(t).handle(n,o)}))}class AE{constructor(t){this.editor=t;this.editing=this.editor.editing}handle(t,e){if(bE(t)){this._handleContainerChildrenMutations(t,e)}else{for(const n of t){this._handleTextMutation(n,e);this._handleTextNodeInsertion(n)}}}_handleContainerChildrenMutations(t,e){const n=_E(t);if(!n){return}const o=this.editor.editing.view.domConverter;const i=o.mapViewToDom(n);const r=new du(this.editor.editing.view.document);const s=this.editor.data.toModel(r.domToView(i)).getChild(0);const a=this.editor.editing.mapper.toModelElement(n);if(!a){return}const c=Array.from(s.getChildren());const l=Array.from(a.getChildren());const d=c[c.length-1];const u=l[l.length-1];const h=d&&d.is("element","softBreak");const f=u&&!u.is("element","softBreak");if(h&&f){c.pop()}const m=this.editor.model.schema;if(!vE(c,m)||!vE(l,m)){return}const g=c.map((t=>t.is("$text")?t.data:"@")).join("").replace(/\u00A0/g," ");const p=l.map((t=>t.is("$text")?t.data:"@")).join("").replace(/\u00A0/g," ");if(p===g){return}const b=Ud(p,g);const{firstChangeAt:k,insertions:w,deletions:C}=yE(b);let A=null;if(e){A=this.editing.mapper.toModelRange(e.getFirstRange())}const _=g.substr(k,w);const v=this.editor.model.createRange(this.editor.model.createPositionAt(a,k),this.editor.model.createPositionAt(a,k+C));this.editor.execute("input",{text:_,range:v,resultRange:A})}_handleTextMutation(t,e){if(t.type!="text"){return}const n=t.newText.replace(/\u00A0/g," ");const o=t.oldText.replace(/\u00A0/g," ");if(o===n){return}const i=Ud(o,n);const{firstChangeAt:r,insertions:s,deletions:a}=yE(i);let c=null;if(e){c=this.editing.mapper.toModelRange(e.getFirstRange())}const l=this.editing.view.createPositionAt(t.node,r);const d=this.editing.mapper.toModelPosition(l);const u=this.editor.model.createRange(d,d.getShiftedBy(a));const h=n.substr(r,s);this.editor.execute("input",{text:h,range:u,resultRange:c})}_handleTextNodeInsertion(t){if(t.type!="children"){return}const e=kE(t);const n=this.editing.view.createPositionAt(t.node,e.index);const o=this.editing.mapper.toModelPosition(n);const i=e.values[0].data;this.editor.execute("input",{text:i.replace(/\u00A0/g," "),range:this.editor.model.createRange(o)})}}function _E(t){const e=t.map((t=>t.node)).reduce(((t,e)=>t.getCommonAncestor(e,{includeSelf:true})));if(!e){return}return e.getAncestors({includeSelf:true,parentFirst:true}).find((t=>t.is("containerElement")||t.is("rootElement")))}function vE(t,e){return t.every((t=>e.isInline(t)))}function yE(t){let e=null;let n=null;for(let o=0;o<t.length;o++){const i=t[o];if(i!="equal"){e=e===null?o:e;n=o}}let o=0;let i=0;for(let r=e;r<=n;r++){if(t[r]!="insert"){o++}if(t[r]!="delete"){i++}}return{insertions:i,deletions:o,firstChangeAt:e}}class xE extends Kn{static get pluginName(){return"Input"}init(){const t=this.editor;const e=new gE(t,t.config.get("typing.undoStep")||20);t.commands.add("input",e);Iy(t);CE(t)}isInput(t){const e=this.editor.commands.get("input");return e._batches.has(t)}}class EE extends Kn{static get requires(){return[xE,iy]}static get pluginName(){return"Typing"}}function DE(t,e){let n=t.start;const o=Array.from(t.getItems()).reduce(((t,o)=>{if(!(o.is("$text")||o.is("$textProxy"))){n=e.createPositionAfter(o);return""}return t+o.data}),"");return{text:o,range:e.createRange(n,t.end)}}class SE{constructor(t,e){this.model=t;this.testCallback=e;this.hasMatch=false;this.set("isEnabled",true);this.on("change:isEnabled",(()=>{if(this.isEnabled){this._startListening()}else{this.stopListening(t.document.selection);this.stopListening(t.document)}}));this._startListening()}_startListening(){const t=this.model;const e=t.document;this.listenTo(e.selection,"change:range",((t,{directChange:n})=>{if(!n){return}if(!e.selection.isCollapsed){if(this.hasMatch){this.fire("unmatched");this.hasMatch=false}return}this._evaluateTextBeforeSelection("selection")}));this.listenTo(e,"change:data",((t,e)=>{if(e.type=="transparent"){return}this._evaluateTextBeforeSelection("data",{batch:e})}))}_evaluateTextBeforeSelection(t,e={}){const n=this.model;const o=n.document;const i=o.selection;const r=n.createRange(n.createPositionAt(i.focus.parent,0),i.focus);const{text:s,range:a}=DE(r,n);const c=this.testCallback(s);if(!c&&this.hasMatch){this.fire("unmatched")}this.hasMatch=!!c;if(c){const n=Object.assign(e,{text:s,range:a});if(typeof c=="object"){Object.assign(n,c)}this.fire(`matched:${t}`,n)}}}Hn(SE,Tn);class BE extends Kn{static get pluginName(){return"TwoStepCaretMovement"}constructor(t){super(t);this.attributes=new Set;this._overrideUid=null}init(){const t=this.editor;const e=t.model;const n=t.editing.view;const o=t.locale;const i=e.document.selection;this.listenTo(n.document,"arrowKey",((t,e)=>{if(!i.isCollapsed){return}if(e.shiftKey||e.altKey||e.ctrlKey){return}const n=e.keyCode==td.arrowright;const r=e.keyCode==td.arrowleft;if(!n&&!r){return}const s=o.contentLanguageDirection;let a=false;if(s==="ltr"&&n||s==="rtl"&&r){a=this._handleForwardMovement(e)}else{a=this._handleBackwardMovement(e)}if(a===true){t.stop()}}),{context:"$text",priority:"highest"});this._isNextGravityRestorationSkipped=false;this.listenTo(i,"change:range",((t,e)=>{if(this._isNextGravityRestorationSkipped){this._isNextGravityRestorationSkipped=false;return}if(!this._isGravityOverridden){return}if(!e.directChange&&FE(i.getFirstPosition(),this.attributes)){return}this._restoreGravity()}))}registerAttribute(t){this.attributes.add(t)}_handleForwardMovement(t){const e=this.attributes;const n=this.editor.model;const o=n.document.selection;const i=o.getFirstPosition();if(this._isGravityOverridden){return false}if(i.isAtStart&&TE(o,e)){return false}if(FE(i,e)){IE(t);this._overrideGravity();return true}}_handleBackwardMovement(t){const e=this.attributes;const n=this.editor.model;const o=n.document.selection;const i=o.getFirstPosition();if(this._isGravityOverridden){IE(t);this._restoreGravity();PE(n,e,i);return true}else{if(i.isAtStart){if(TE(o,e)){IE(t);PE(n,e,i);return true}return false}if(RE(i,e)){if(i.isAtEnd&&!TE(o,e)&&FE(i,e)){IE(t);PE(n,e,i);return true}this._isNextGravityRestorationSkipped=true;this._overrideGravity();return false}}}get _isGravityOverridden(){return!!this._overrideUid}_overrideGravity(){this._overrideUid=this.editor.model.change((t=>t.overrideSelectionGravity()))}_restoreGravity(){this.editor.model.change((t=>{t.restoreSelectionGravity(this._overrideUid);this._overrideUid=null}))}}function TE(t,e){for(const n of e){if(t.hasAttribute(n)){return true}}return false}function PE(t,e,n){const o=n.nodeBefore;t.change((t=>{if(o){t.setSelectionAttribute(o.getAttributes())}else{t.removeSelectionAttribute(e)}}))}function IE(t){t.preventDefault()}function RE(t,e){const n=t.getShiftedBy(-1);return FE(n,e)}function FE(t,e){const{nodeBefore:n,nodeAfter:o}=t;for(const t of e){const e=n?n.getAttribute(t):undefined;const i=o?o.getAttribute(t):undefined;if(i!==e){return true}}return false}var zE=/[\\^$.*+?()[\]{}|]/g,OE=RegExp(zE.source);function NE(t){t=kc(t);return t&&OE.test(t)?t.replace(zE,"\\$&"):t}var ME=NE;const VE={copyright:{from:"(c)",to:"©"},registeredTrademark:{from:"(r)",to:"®"},trademark:{from:"(tm)",to:"™"},oneHalf:{from:"1/2",to:"½"},oneThird:{from:"1/3",to:"⅓"},twoThirds:{from:"2/3",to:"⅔"},oneForth:{from:"1/4",to:"¼"},threeQuarters:{from:"3/4",to:"¾"},lessThanOrEqual:{from:"<=",to:"≤"},greaterThanOrEqual:{from:">=",to:"≥"},notEqual:{from:"!=",to:"≠"},arrowLeft:{from:"<-",to:"←"},arrowRight:{from:"->",to:"→"},horizontalEllipsis:{from:"...",to:"…"},enDash:{from:/(^| )(--)( )$/,to:[null,"–",null]},emDash:{from:/(^| )(---)( )$/,to:[null,"—",null]},quotesPrimary:{from:GE('"'),to:[null,"“",null,"”"]},quotesSecondary:{from:GE("'"),to:[null,"‘",null,"’"]},quotesPrimaryEnGb:{from:GE("'"),to:[null,"‘",null,"’"]},quotesSecondaryEnGb:{from:GE('"'),to:[null,"“",null,"”"]},quotesPrimaryPl:{from:GE('"'),to:[null,"„",null,"”"]},quotesSecondaryPl:{from:GE("'"),to:[null,"‚",null,"’"]}};const LE={symbols:["copyright","registeredTrademark","trademark"],mathematical:["oneHalf","oneThird","twoThirds","oneForth","threeQuarters","lessThanOrEqual","greaterThanOrEqual","notEqual","arrowLeft","arrowRight"],typography:["horizontalEllipsis","enDash","emDash"],quotes:["quotesPrimary","quotesSecondary"]};const HE=["symbols","mathematical","typography","quotes"];class KE extends Kn{static get pluginName(){return"TextTransformation"}constructor(t){super(t);t.config.define("typing",{transformations:{include:HE}})}init(){const t=this.editor.model;const e=t.document.selection;e.on("change:range",(()=>{this.isEnabled=!e.anchor.parent.is("element","codeBlock")}));this._enableTransformationWatchers()}_enableTransformationWatchers(){const t=this.editor;const e=t.model;const n=t.plugins.get("Input");const o=UE(t.config.get("typing.transformations"));const i=t=>{for(const e of o){const n=e.from;const o=n.test(t);if(o){return{normalizedTransformation:e}}}};const r=(t,o)=>{if(!n.isInput(o.batch)){return}const{from:i,to:r}=o.normalizedTransformation;const s=i.exec(o.text);const a=r(s.slice(1));const c=o.range;let l=s.index;e.enqueueChange((t=>{for(let n=1;n<s.length;n++){const o=s[n];const i=a[n-1];if(i==null){l+=o.length;continue}const r=c.start.getShiftedBy(l);const d=e.createRange(r,r.getShiftedBy(o.length));const u=WE(r);e.insertContent(t.createText(i,u),d);l+=i.length}}))};const s=new SE(t.model,i);s.on("matched:data",r);s.bind("isEnabled").to(this)}}function qE(t){if(typeof t=="string"){return new RegExp(`(${ME(t)})$`)}return t}function jE(t){if(typeof t=="string"){return()=>[t]}else if(t instanceof Array){return()=>t}return t}function WE(t){const e=t.textNode?t.textNode:t.nodeAfter;return e.getAttributes()}function GE(t){return new RegExp(`(^|\\s)(${t})([^${t}]*)(${t})$`)}function UE(t){const e=t.extra||[];const n=t.remove||[];const o=t=>!n.includes(t);const i=t.include.concat(e).filter(o);return $E(i).filter(o).map((t=>VE[t]||t)).map((t=>({from:qE(t.from),to:jE(t.to)})))}function $E(t){const e=new Set;for(const n of t){if(LE[n]){for(const t of LE[n]){e.add(t)}}else{e.add(n)}}return Array.from(e)}function JE(t,e,n,o){return o.createRange(YE(t,e,n,true,o),YE(t,e,n,false,o))}function YE(t,e,n,o,i){let r=t.textNode||(o?t.nodeBefore:t.nodeAfter);let s=null;while(r&&r.getAttribute(e)==n){s=r;r=o?r.previousSibling:r.nextSibling}return s?i.createPositionAt(s,o?"before":"after"):t}function QE(t,e,n,o){const i=t.editing.view;const r=new Set;i.document.registerPostFixer((i=>{const s=t.model.document.selection;let a=false;if(s.hasAttribute(e)){const c=JE(s.getFirstPosition(),e,s.getAttribute(e),t.model);const l=t.editing.mapper.toViewRange(c);for(const t of l.getItems()){if(t.is("element",n)&&!t.hasClass(o)){i.addClass(o,t);r.add(t);a=true}}}return a}));t.conversion.for("editingDowncast").add((t=>{t.on("insert",e,{priority:"highest"});t.on("remove",e,{priority:"highest"});t.on("attribute",e,{priority:"highest"});t.on("selection",e,{priority:"highest"});function e(){i.change((t=>{for(const e of r.values()){t.removeClass(o,e);r.delete(e)}}))}}))}function XE(t,e,n){var o=t.length;n=n===undefined?o:n;return!e&&n>=o?t:Bc(t,e,n)}var ZE=XE;var tD="\\ud800-\\udfff",eD="\\u0300-\\u036f",nD="\\ufe20-\\ufe2f",oD="\\u20d0-\\u20ff",iD=eD+nD+oD,rD="\\ufe0e\\ufe0f";var sD="\\u200d";var aD=RegExp("["+sD+tD+iD+rD+"]");function cD(t){return aD.test(t)}var lD=cD;function dD(t){return t.split("")}var uD=dD;var hD="\\ud800-\\udfff",fD="\\u0300-\\u036f",mD="\\ufe20-\\ufe2f",gD="\\u20d0-\\u20ff",pD=fD+mD+gD,bD="\\ufe0e\\ufe0f";var kD="["+hD+"]",wD="["+pD+"]",CD="\\ud83c[\\udffb-\\udfff]",AD="(?:"+wD+"|"+CD+")",_D="[^"+hD+"]",vD="(?:\\ud83c[\\udde6-\\uddff]){2}",yD="[\\ud800-\\udbff][\\udc00-\\udfff]",xD="\\u200d";var ED=AD+"?",DD="["+bD+"]?",SD="(?:"+xD+"(?:"+[_D,vD,yD].join("|")+")"+DD+ED+")*",BD=DD+ED+SD,TD="(?:"+[_D+wD+"?",wD,vD,yD,kD].join("|")+")";var PD=RegExp(CD+"(?="+CD+")|"+TD+BD,"g");function ID(t){return t.match(PD)||[]}var RD=ID;function FD(t){return lD(t)?RD(t):uD(t)}var zD=FD;function OD(t){return function(e){e=kc(e);var n=lD(e)?zD(e):undefined;var o=n?n[0]:e.charAt(0);var i=n?ZE(n,1).join(""):e.slice(1);return o[t]()+i}}var ND=OD;var MD=ND("toUpperCase");var VD=MD;const LD=/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g;const HD=/^(?:(?:https?|ftps?|mailto):|[^a-z]|[a-z+.-]+(?:[^a-z+.:-]|$))/i;const KD=/^[\S]+@((?![-_])(?:[-\w\u00a1-\uffff]{0,63}[^-_]\.))+(?:[a-z\u00a1-\uffff]{2,})$/i;const qD=/^((\w+:(\/{2,})?)|(\W))/i;const jD="Ctrl+K";function WD(t){return t.is("attributeElement")&&!!t.getCustomProperty("link")}function GD(t,{writer:e}){const n=e.createAttributeElement("a",{href:t},{priority:5});e.setCustomProperty("link",true,n);return n}function UD(t){t=String(t);return $D(t)?t:"#"}function $D(t){const e=t.replace(LD,"");return e.match(HD)}function JD(t,e){const n={"Open in a new tab":t("Open in a new tab"),Downloadable:t("Downloadable")};e.forEach((t=>{if(t.label&&n[t.label]){t.label=n[t.label]}return t}));return e}function YD(t){const e=[];if(t){for(const[n,o]of Object.entries(t)){const t=Object.assign({},o,{id:`link${VD(n)}`});e.push(t)}}return e}function QD(t,e){if(!t){return false}return t.is("element","image")&&e.checkAttribute("image","linkHref")}function XD(t){return KD.test(t)}function ZD(t,e){const n=XD(t)?"mailto:":e;const o=!!n&&!qD.test(t);return t&&o?n+t:t}const tS=4;const eS=new RegExp("(^|\\s)"+"("+"("+"(?:(?:(?:https?|ftp):)?\\/\\/)"+"(?:\\S+(?::\\S*)?@)?"+"(?:"+"(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])"+"(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}"+"(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))"+"|"+"("+"((?!www\\.)|(www\\.))"+"(?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.)+"+"(?:[a-z\\u00a1-\\uffff]{2,63})"+")"+")"+"(?::\\d{2,5})?"+"(?:[/?#]\\S*)?"+")"+"|"+"("+"(www.|(\\S+@))"+"((?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.))+"+"(?:[a-z\\u00a1-\\uffff]{2,63})"+")"+")$","i");const nS=2;class oS extends Kn{static get pluginName(){return"AutoLink"}init(){const t=this.editor;const e=t.model.document.selection;e.on("change:range",(()=>{this.isEnabled=!e.anchor.parent.is("element","codeBlock")}));this._enableTypingHandling()}afterInit(){this._enableEnterHandling();this._enableShiftEnterHandling()}_enableTypingHandling(){const t=this.editor;const e=new SE(t.model,(t=>{if(!iS(t)){return}const e=rS(t.substr(0,t.length-1));if(e){return{url:e}}}));const n=t.plugins.get("Input");e.on("matched:data",((e,o)=>{const{batch:i,range:r,url:s}=o;if(!n.isInput(i)){return}const a=r.end.getShiftedBy(-1);const c=a.getShiftedBy(-s.length);const l=t.model.createRange(c,a);this._applyAutoLink(s,l)}));e.bind("isEnabled").to(this)}_enableEnterHandling(){const t=this.editor;const e=t.model;const n=t.commands.get("enter");if(!n){return}n.on("execute",(()=>{const t=e.document.selection.getFirstPosition();if(!t.parent.previousSibling){return}const n=e.createRangeIn(t.parent.previousSibling);this._checkAndApplyAutoLinkOnRange(n)}))}_enableShiftEnterHandling(){const t=this.editor;const e=t.model;const n=t.commands.get("shiftEnter");if(!n){return}n.on("execute",(()=>{const t=e.document.selection.getFirstPosition();const n=e.createRange(e.createPositionAt(t.parent,0),t.getShiftedBy(-1));this._checkAndApplyAutoLinkOnRange(n)}))}_checkAndApplyAutoLinkOnRange(t){const e=this.editor.model;const{text:n,range:o}=DE(t,e);const i=rS(n);if(i){const t=e.createRange(o.end.getShiftedBy(-i.length),o.end);this._applyAutoLink(i,t)}}_applyAutoLink(t,e){const n=this.editor.model;if(!this.isEnabled||!sS(e,n)){return}n.enqueueChange((n=>{const o=this.editor.config.get("link.defaultProtocol");const i=ZD(t,o);n.setAttribute("linkHref",i,e)}))}}function iS(t){return t.length>tS&&t[t.length-1]===" "&&t[t.length-2]!==" "}function rS(t){const e=eS.exec(t);return e?e[nS]:null}function sS(t,e){return e.schema.checkAttributeInSelection(e.createSelection(t),"linkHref")}class aS extends Kn{static get pluginName(){return"Autosave"}static get requires(){return[Lb]}constructor(t){super(t);const e=t.config.get("autosave")||{};const n=e.waitingTime||1e3;this.set("state","synchronized");this._debouncedSave=qh(this._save.bind(this),n);this._lastDocumentVersion=t.model.document.version;this._domEmitter=Object.create(bu);this._config=e}init(){const t=this.editor;const e=t.model.document;const n=t.t;this._pendingActions=t.plugins.get(Lb);this.listenTo(e,"change:data",(()=>{if(!this._saveCallbacks.length){return}if(this.state=="synchronized"){this._action=this._pendingActions.add(n("Saving changes"));this.state="waiting";this._debouncedSave()}else if(this.state=="waiting"){this._debouncedSave()}}));this.listenTo(t,"destroy",(()=>this._flush()),{priority:"highest"});this._domEmitter.listenTo(window,"beforeunload",((t,e)=>{if(this._pendingActions.hasAny){e.returnValue=this._pendingActions.first.message}}))}destroy(){this._domEmitter.stopListening();super.destroy()}_flush(){this._debouncedSave.flush()}_save(){const t=this.editor.model.document.version;if(t<this._lastDocumentVersion||this.editor.state==="initializing"){this._debouncedSave.cancel();return}this._lastDocumentVersion=t;this.state="saving";Promise.resolve().then((()=>Promise.all(this._saveCallbacks.map((t=>t(this.editor)))))).catch((t=>{this.state="error";this.state="saving";this._debouncedSave();throw t})).then((()=>{if(this.editor.model.document.version>this._lastDocumentVersion){this.state="waiting";this._debouncedSave()}else{this.state="synchronized";this._pendingActions.remove(this._action);this._action=null}}))}get _saveCallbacks(){const t=[];if(this.adapter&&this.adapter.save){t.push(this.adapter.save)}if(this._config.save){t.push(this._config.save)}return t}}Hn(aS,Tn);class cS extends jn{execute(){const t=this.editor.model;const e=t.document;t.change((n=>{dS(t,n,e.selection);this.fire("afterExecute",{writer:n})}))}refresh(){const t=this.editor.model;const e=t.document;this.isEnabled=lS(t.schema,e.selection)}}function lS(t,e){if(e.rangeCount>1){return false}const n=e.anchor;if(!n||!t.checkChild(n,"softBreak")){return false}const o=e.getFirstRange();const i=o.start.parent;const r=o.end.parent;if((hS(i,t)||hS(r,t))&&i!==r){return false}return true}function dS(t,e,n){const o=n.isCollapsed;const i=n.getFirstRange();const r=i.start.parent;const s=i.end.parent;const a=r==s;if(o){const o=Jv(t.schema,n.getAttributes());uS(t,e,i.end);e.removeSelectionAttribute(n.getAttributeKeys());e.setSelectionAttribute(o)}else{const o=!(i.start.isAtStart&&i.end.isAtEnd);t.deleteContent(n,{leaveUnmerged:o});if(a){uS(t,e,n.focus)}else{if(o){e.setSelection(s,0)}}}}function uS(t,e,n){const o=e.createElement("softBreak");t.insertContent(o,n);e.setSelection(o,"after")}function hS(t,e){if(t.is("rootElement")){return false}return e.isLimit(t)||hS(t.parent,e)}class fS extends Kn{static get pluginName(){return"ShiftEnter"}init(){const t=this.editor;const e=t.model.schema;const n=t.conversion;const o=t.editing.view;const i=o.document;e.register("softBreak",{allowWhere:"$text",isInline:true});n.for("upcast").elementToElement({model:"softBreak",view:"br"});n.for("downcast").elementToElement({model:"softBreak",view:(t,{writer:e})=>e.createEmptyElement("br")});o.addObserver(Zv);t.commands.add("shiftEnter",new cS(t));this.listenTo(i,"enter",((e,n)=>{n.preventDefault();if(!n.isSoft){return}t.execute("shiftEnter");o.scrollToTheSelection()}),{priority:"low"})}}class mS extends jn{refresh(){this.value=this._getValue();this.isEnabled=this._checkEnabled()}execute(t={}){const e=this.editor.model;const n=e.schema;const o=e.document.selection;const i=Array.from(o.getSelectedBlocks());const r=t.forceValue===undefined?!this.value:t.forceValue;e.change((t=>{if(!r){this._removeQuote(t,i.filter(gS))}else{const e=i.filter((t=>gS(t)||bS(n,t)));this._applyQuote(t,e)}}))}_getValue(){const t=this.editor.model.document.selection;const e=ff(t.getSelectedBlocks());return!!(e&&gS(e))}_checkEnabled(){if(this.value){return true}const t=this.editor.model.document.selection;const e=this.editor.model.schema;const n=ff(t.getSelectedBlocks());if(!n){return false}return bS(e,n)}_removeQuote(t,e){pS(t,e).reverse().forEach((e=>{if(e.start.isAtStart&&e.end.isAtEnd){t.unwrap(e.start.parent);return}if(e.start.isAtStart){const n=t.createPositionBefore(e.start.parent);t.move(e,n);return}if(!e.end.isAtEnd){t.split(e.end)}const n=t.createPositionAfter(e.end.parent);t.move(e,n)}))}_applyQuote(t,e){const n=[];pS(t,e).reverse().forEach((e=>{let o=gS(e.start);if(!o){o=t.createElement("blockQuote");t.wrap(e,o)}n.push(o)}));n.reverse().reduce(((e,n)=>{if(e.nextSibling==n){t.merge(t.createPositionAfter(e));return e}return n}))}}function gS(t){return t.parent.name=="blockQuote"?t.parent:null}function pS(t,e){let n;let o=0;const i=[];while(o<e.length){const r=e[o];const s=e[o+1];if(!n){n=t.createPositionBefore(r)}if(!s||r.nextSibling!=s){i.push(t.createRange(n,t.createPositionAfter(r)));n=null}o++}return i}function bS(t,e){const n=t.checkChild(e.parent,"blockQuote");const o=t.checkChild(["$root","blockQuote"],e);return n&&o}class kS extends Kn{static get pluginName(){return"BlockQuoteEditing"}static get requires(){return[ty,iy]}init(){const t=this.editor;const e=t.model.schema;t.commands.add("blockQuote",new mS(t));e.register("blockQuote",{allowWhere:"$block",allowContentOf:"$root"});e.addChildCheck(((t,e)=>{if(t.endsWith("blockQuote")&&e.name=="blockQuote"){return false}}));t.conversion.elementToElement({model:"blockQuote",view:"blockquote"});t.model.document.registerPostFixer((n=>{const o=t.model.document.differ.getChanges();for(const t of o){if(t.type=="insert"){const o=t.position.nodeAfter;if(!o){continue}if(o.is("element","blockQuote")&&o.isEmpty){n.remove(o);return true}else if(o.is("element","blockQuote")&&!e.checkChild(t.position,o)){n.unwrap(o);return true}else if(o.is("element")){const t=n.createRangeIn(o);for(const o of t.getItems()){if(o.is("element","blockQuote")&&!e.checkChild(n.createPositionBefore(o),o)){n.unwrap(o);return true}}}}else if(t.type=="remove"){const e=t.position.parent;if(e.is("element","blockQuote")&&e.isEmpty){n.remove(e);return true}}}return false}));const n=this.editor.editing.view.document;const o=t.model.document.selection;const i=t.commands.get("blockQuote");this.listenTo(n,"enter",((e,n)=>{if(!o.isCollapsed||!i.value){return}const r=o.getLastPosition().parent;if(r.isEmpty){t.execute("blockQuote");t.editing.view.scrollToTheSelection();n.preventDefault();e.stop()}}),{context:"blockquote"});this.listenTo(n,"delete",((e,n)=>{if(n.direction!="backward"||!o.isCollapsed||!i.value){return}const r=o.getLastPosition().parent;if(r.isEmpty&&!r.previousSibling){t.execute("blockQuote");t.editing.view.scrollToTheSelection();n.preventDefault();e.stop()}}),{context:"blockquote"})}}var wS=n(40);var CS={injectType:"singletonStyleTag",attributes:{"data-cke":true}};CS.insert="head";CS.singleton=true;var AS=wk()(wS["a"],CS);var _S=wS["a"].locals||{};class vS extends Kn{static get pluginName(){return"BlockQuoteUI"}init(){const t=this.editor;const e=t.t;t.ui.componentFactory.add("blockQuote",(n=>{const o=t.commands.get("blockQuote");const i=new fw(n);i.set({label:e("Block quote"),icon:hk.quote,tooltip:true,isToggleable:true});i.bind("isOn","isEnabled").to(o,"value","isEnabled");this.listenTo(i,"execute",(()=>{t.execute("blockQuote");t.editing.view.focus()}));return i}))}}class yS extends Kn{static get requires(){return[kS,vS]}static get pluginName(){return"BlockQuote"}}class xS extends jn{constructor(t,e){super(t);this.attributeKey=e}refresh(){const t=this.editor.model;const e=t.document;this.value=this._getValueFromFirstAllowedNode();this.isEnabled=t.schema.checkAttributeInSelection(e.selection,this.attributeKey)}execute(t={}){const e=this.editor.model;const n=e.document;const o=n.selection;const i=t.forceValue===undefined?!this.value:t.forceValue;e.change((t=>{if(o.isCollapsed){if(i){t.setSelectionAttribute(this.attributeKey,true)}else{t.removeSelectionAttribute(this.attributeKey)}}else{const n=e.schema.getValidRanges(o.getRanges(),this.attributeKey);for(const e of n){if(i){t.setAttribute(this.attributeKey,i,e)}else{t.removeAttribute(this.attributeKey,e)}}}}))}_getValueFromFirstAllowedNode(){const t=this.editor.model;const e=t.schema;const n=t.document.selection;if(n.isCollapsed){return n.hasAttribute(this.attributeKey)}for(const t of n.getRanges()){for(const n of t.getItems()){if(e.checkAttribute(n,this.attributeKey)){return n.hasAttribute(this.attributeKey)}}}return false}}const ES="bold";class DS extends Kn{static get pluginName(){return"BoldEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:ES});t.model.schema.setAttributeProperties(ES,{isFormatting:true,copyOnEnter:true});t.conversion.attributeToElement({model:ES,view:"strong",upcastAlso:["b",t=>{const e=t.getStyle("font-weight");if(!e){return null}if(e=="bold"||Number(e)>=600){return{name:true,styles:["font-weight"]}}}]});t.commands.add(ES,new xS(t,ES));t.keystrokes.set("CTRL+B",ES)}}var SS='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10.187 17H5.773c-.637 0-1.092-.138-1.364-.415-.273-.277-.409-.718-.409-1.323V4.738c0-.617.14-1.062.419-1.332.279-.27.73-.406 1.354-.406h4.68c.69 0 1.288.041 1.793.124.506.083.96.242 1.36.478.341.197.644.447.906.75a3.262 3.262 0 0 1 .808 2.162c0 1.401-.722 2.426-2.167 3.075C15.05 10.175 16 11.315 16 13.01a3.756 3.756 0 0 1-2.296 3.504 6.1 6.1 0 0 1-1.517.377c-.571.073-1.238.11-2 .11zm-.217-6.217H7v4.087h3.069c1.977 0 2.965-.69 2.965-2.072 0-.707-.256-1.22-.768-1.537-.512-.319-1.277-.478-2.296-.478zM7 5.13v3.619h2.606c.729 0 1.292-.067 1.69-.2a1.6 1.6 0 0 0 .91-.765c.165-.267.247-.566.247-.897 0-.707-.26-1.176-.778-1.409-.519-.232-1.31-.348-2.375-.348H7z"/></svg>';const BS="bold";class TS extends Kn{static get pluginName(){return"BoldUI"}init(){const t=this.editor;const e=t.t;t.ui.componentFactory.add(BS,(n=>{const o=t.commands.get(BS);const i=new fw(n);i.set({label:e("Bold"),icon:SS,keystroke:"CTRL+B",tooltip:true,isToggleable:true});i.bind("isOn","isEnabled").to(o,"value","isEnabled");this.listenTo(i,"execute",(()=>{t.execute(BS);t.editing.view.focus()}));return i}))}}class PS extends Kn{static get requires(){return[DS,TS]}static get pluginName(){return"Bold"}}class IS extends jn{execute(){const t=this.editor.model;const e=t.document.selection;let n=t.schema.getLimitElement(e);if(e.containsEntireContent(n)||!RS(t.schema,n)){do{n=n.parent;if(!n){return}}while(!RS(t.schema,n))}t.change((t=>{t.setSelection(n,"in")}))}}function RS(t,e){return t.isLimit(e)&&(t.checkChild(e,"$text")||t.checkChild(e,"paragraph"))}const FS=od("Ctrl+A");class zS extends Kn{static get pluginName(){return"SelectAllEditing"}init(){const t=this.editor;const e=t.editing.view;const n=e.document;t.commands.add("selectAll",new IS(t));this.listenTo(n,"keydown",((e,n)=>{if(nd(n)===FS){t.execute("selectAll");n.preventDefault()}}))}}var OS='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M.75 15.5a.75.75 0 0 1 .75.75V18l.008.09A.5.5 0 0 0 2 18.5h1.75a.75.75 0 1 1 0 1.5H1.5l-.144-.007a1.5 1.5 0 0 1-1.35-1.349L0 18.5v-2.25a.75.75 0 0 1 .75-.75zm18.5 0a.75.75 0 0 1 .75.75v2.25l-.007.144a1.5 1.5 0 0 1-1.349 1.35L18.5 20h-2.25a.75.75 0 1 1 0-1.5H18a.5.5 0 0 0 .492-.41L18.5 18v-1.75a.75.75 0 0 1 .75-.75zm-10.45 3c.11 0 .2.09.2.2v1.1a.2.2 0 0 1-.2.2H7.2a.2.2 0 0 1-.2-.2v-1.1c0-.11.09-.2.2-.2h1.6zm4 0c.11 0 .2.09.2.2v1.1a.2.2 0 0 1-.2.2h-1.6a.2.2 0 0 1-.2-.2v-1.1c0-.11.09-.2.2-.2h1.6zm.45-5.5a.75.75 0 1 1 0 1.5h-8.5a.75.75 0 1 1 0-1.5h8.5zM1.3 11c.11 0 .2.09.2.2v1.6a.2.2 0 0 1-.2.2H.2a.2.2 0 0 1-.2-.2v-1.6c0-.11.09-.2.2-.2h1.1zm18.5 0c.11 0 .2.09.2.2v1.6a.2.2 0 0 1-.2.2h-1.1a.2.2 0 0 1-.2-.2v-1.6c0-.11.09-.2.2-.2h1.1zm-4.55-2a.75.75 0 1 1 0 1.5H4.75a.75.75 0 1 1 0-1.5h10.5zM1.3 7c.11 0 .2.09.2.2v1.6a.2.2 0 0 1-.2.2H.2a.2.2 0 0 1-.2-.2V7.2c0-.11.09-.2.2-.2h1.1zm18.5 0c.11 0 .2.09.2.2v1.6a.2.2 0 0 1-.2.2h-1.1a.2.2 0 0 1-.2-.2V7.2c0-.11.09-.2.2-.2h1.1zm-4.55-2a.75.75 0 1 1 0 1.5h-2.5a.75.75 0 1 1 0-1.5h2.5zm-5 0a.75.75 0 1 1 0 1.5h-5.5a.75.75 0 0 1 0-1.5h5.5zm-6.5-5a.75.75 0 0 1 0 1.5H2a.5.5 0 0 0-.492.41L1.5 2v1.75a.75.75 0 0 1-1.5 0V1.5l.007-.144A1.5 1.5 0 0 1 1.356.006L1.5 0h2.25zM18.5 0l.144.007a1.5 1.5 0 0 1 1.35 1.349L20 1.5v2.25a.75.75 0 1 1-1.5 0V2l-.008-.09A.5.5 0 0 0 18 1.5h-1.75a.75.75 0 1 1 0-1.5h2.25zM8.8 0c.11 0 .2.09.2.2v1.1a.2.2 0 0 1-.2.2H7.2a.2.2 0 0 1-.2-.2V.2c0-.11.09-.2.2-.2h1.6zm4 0c.11 0 .2.09.2.2v1.1a.2.2 0 0 1-.2.2h-1.6a.2.2 0 0 1-.2-.2V.2c0-.11.09-.2.2-.2h1.6z"/></svg>';class NS extends Kn{static get pluginName(){return"SelectAllUI"}init(){const t=this.editor;t.ui.componentFactory.add("selectAll",(e=>{const n=t.commands.get("selectAll");const o=new fw(e);const i=e.t;o.set({label:i("Select all"),icon:OS,keystroke:"Ctrl+A",tooltip:true});o.bind("isOn","isEnabled").to(n,"value","isEnabled");this.listenTo(o,"execute",(()=>{t.execute("selectAll");t.editing.view.focus()}));return o}))}}class MS extends Kn{static get requires(){return[zS,NS]}static get pluginName(){return"SelectAll"}}class VS extends Kn{static get requires(){return[Ex,ty,MS,fS,EE,Ox]}static get pluginName(){return"Essentials"}}class LS extends jn{constructor(t,e){super(t);this.attributeKey=e}refresh(){const t=this.editor.model;const e=t.document;this.value=e.selection.getAttribute(this.attributeKey);this.isEnabled=t.schema.checkAttributeInSelection(e.selection,this.attributeKey)}execute(t={}){const e=this.editor.model;const n=e.document;const o=n.selection;const i=t.value;e.change((t=>{if(o.isCollapsed){if(i){t.setSelectionAttribute(this.attributeKey,i)}else{t.removeSelectionAttribute(this.attributeKey)}}else{const n=e.schema.getValidRanges(o.getRanges(),this.attributeKey);for(const e of n){if(i){t.setAttribute(this.attributeKey,i,e)}else{t.removeAttribute(this.attributeKey,e)}}}}))}}class HS extends ka{constructor(t){super(t);this.set("isEmpty",true);this.on("change",(()=>{this.set("isEmpty",this.length===0)}))}add(t,e){if(this.find((e=>e.color===t.color))){return}super.add(t,e)}hasColor(t){return!!this.find((e=>e.color===t))}}Hn(HS,Tn);var KS=n(41);var qS={injectType:"singletonStyleTag",attributes:{"data-cke":true}};qS.insert="head";qS.singleton=true;var jS=wk()(KS["a"],qS);var WS=KS["a"].locals||{};class GS extends yk{constructor(t,{colors:e,columns:n,removeButtonLabel:o,documentColorsLabel:i,documentColorsCount:r}){super(t);this.items=this.createCollection();this.colorDefinitions=e;this.focusTracker=new mf;this.keystrokes=new gf;this.set("selectedColor");this.removeButtonLabel=o;this.columns=n;this.documentColors=new HS;this.documentColorsCount=r;this._focusCycler=new yw({focusables:this.items,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"arrowup",focusNext:"arrowdown"}});this._documentColorsLabel=i;this.setTemplate({tag:"div",attributes:{class:["ck","ck-color-table"]},children:this.items});this.items.add(this._removeColorButton())}updateDocumentColors(t,e){const n=t.document;const o=this.documentColorsCount;this.documentColors.clear();for(const i of n.getRootNames()){const r=n.getRoot(i);const s=t.createRangeIn(r);for(const t of s.getItems()){if(t.is("$textProxy")&&t.hasAttribute(e)){this._addColorToDocumentColors(t.getAttribute(e));if(this.documentColors.length>=o){return}}}}}updateSelectedColors(){const t=this.documentColorsGrid;const e=this.staticColorsGrid;const n=this.selectedColor;e.selectedColor=n;if(t){t.selectedColor=n}}render(){super.render();for(const t of this.items){this.focusTracker.add(t.element)}this.keystrokes.listenTo(this.element)}appendGrids(){if(this.staticColorsGrid){return}this.staticColorsGrid=this._createStaticColorsGrid();this.items.add(this.staticColorsGrid);if(this.documentColorsCount){const t=Ek.bind(this.documentColors,this.documentColors);const e=new HC(this.locale);e.text=this._documentColorsLabel;e.extendTemplate({attributes:{class:["ck","ck-color-grid__label",t.if("isEmpty","ck-hidden")]}});this.items.add(e);this.documentColorsGrid=this._createDocumentColorsGrid();this.items.add(this.documentColorsGrid)}}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}_removeColorButton(){const t=new fw;t.set({withText:true,icon:hk.eraser,tooltip:true,label:this.removeButtonLabel});t.class="ck-color-table__remove-color";t.on("execute",(()=>{this.fire("execute",{value:null})}));return t}_createStaticColorsGrid(){const t=new Tw(this.locale,{colorDefinitions:this.colorDefinitions,columns:this.columns});t.delegate("execute").to(this);return t}_createDocumentColorsGrid(){const t=Ek.bind(this.documentColors,this.documentColors);const e=new Tw(this.locale,{columns:this.columns});e.delegate("execute").to(this);e.extendTemplate({attributes:{class:t.if("isEmpty","ck-hidden")}});e.items.bindTo(this.documentColors).using((t=>{const e=new vw;e.set({color:t.color,hasBorder:t.options&&t.options.hasBorder});if(t.label){e.set({label:t.label,tooltip:true})}e.on("execute",(()=>{this.fire("execute",{value:t.color})}));return e}));this.documentColors.on("change:isEmpty",((t,n,o)=>{if(o){e.selectedColor=null}}));return e}_addColorToDocumentColors(t){const e=this.colorDefinitions.find((e=>e.color===t));if(!e){this.documentColors.add({color:t,label:t,options:{hasBorder:false}})}else{this.documentColors.add(Object.assign({},e))}}}const US="fontSize";const $S="fontFamily";const JS="fontColor";const YS="fontBackgroundColor";function QS(t,e){const n={model:{key:t,values:[]},view:{},upcastAlso:{}};for(const t of e){n.model.values.push(t.model);n.view[t.model]=t.view;if(t.upcastAlso){n.upcastAlso[t.model]=t.upcastAlso}}return n}function XS(t){return e=>eB(e.getStyle(t))}function ZS(t){return(e,{writer:n})=>n.createAttributeElement("span",{style:`${t}:${e}`},{priority:7})}function tB({dropdownView:t,colors:e,columns:n,removeButtonLabel:o,documentColorsLabel:i,documentColorsCount:r}){const s=t.locale;const a=new GS(s,{colors:e,columns:n,removeButtonLabel:o,documentColorsLabel:i,documentColorsCount:r});t.colorTableView=a;t.panelView.children.add(a);a.delegate("execute").to(t,"execute");return a}function eB(t){return t.replace(/\s/g,"")}class nB extends LS{constructor(t){super(t,JS)}}class oB extends Kn{static get pluginName(){return"FontColorEditing"}constructor(t){super(t);t.config.define(JS,{colors:[{color:"hsl(0, 0%, 0%)",label:"Black"},{color:"hsl(0, 0%, 30%)",label:"Dim grey"},{color:"hsl(0, 0%, 60%)",label:"Grey"},{color:"hsl(0, 0%, 90%)",label:"Light grey"},{color:"hsl(0, 0%, 100%)",label:"White",hasBorder:true},{color:"hsl(0, 75%, 60%)",label:"Red"},{color:"hsl(30, 75%, 60%)",label:"Orange"},{color:"hsl(60, 75%, 60%)",label:"Yellow"},{color:"hsl(90, 75%, 60%)",label:"Light green"},{color:"hsl(120, 75%, 60%)",label:"Green"},{color:"hsl(150, 75%, 60%)",label:"Aquamarine"},{color:"hsl(180, 75%, 60%)",label:"Turquoise"},{color:"hsl(210, 75%, 60%)",label:"Light blue"},{color:"hsl(240, 75%, 60%)",label:"Blue"},{color:"hsl(270, 75%, 60%)",label:"Purple"}],columns:5});t.conversion.for("upcast").elementToAttribute({view:{name:"span",styles:{color:/[\s\S]+/}},model:{key:JS,value:XS("color")}});t.conversion.for("upcast").elementToAttribute({view:{name:"font",attributes:{color:/^#?\w+$/}},model:{key:JS,value:t=>t.getAttribute("color")}});t.conversion.for("downcast").attributeToElement({model:JS,view:ZS("color")});t.commands.add(JS,new nB(t));t.model.schema.extend("$text",{allowAttributes:JS});t.model.schema.setAttributeProperties(JS,{isFormatting:true,copyOnEnter:true})}}class iB extends Kn{constructor(t,{commandName:e,icon:n,componentName:o,dropdownLabel:i}){super(t);this.commandName=e;this.componentName=o;this.icon=n;this.dropdownLabel=i;this.columns=t.config.get(`${this.componentName}.columns`);this.colorTableView=undefined}init(){const t=this.editor;const e=t.locale;const n=e.t;const o=t.commands.get(this.commandName);const i=Cw(t.config.get(this.componentName).colors);const r=ww(e,i);const s=t.config.get(`${this.componentName}.documentColors`);t.ui.componentFactory.add(this.componentName,(e=>{const i=xC(e);this.colorTableView=tB({dropdownView:i,colors:r.map((t=>({label:t.label,color:t.model,options:{hasBorder:t.hasBorder}}))),columns:this.columns,removeButtonLabel:n("Remove color"),documentColorsLabel:s!==0?n("Document colors"):undefined,documentColorsCount:s===undefined?this.columns:s});this.colorTableView.bind("selectedColor").to(o,"value");i.buttonView.set({label:this.dropdownLabel,icon:this.icon,tooltip:true});i.extendTemplate({attributes:{class:"ck-color-ui-dropdown"}});i.bind("isEnabled").to(o);i.on("execute",((e,n)=>{t.execute(this.commandName,n);t.editing.view.focus()}));i.on("change:isOpen",((e,n,o)=>{i.colorTableView.appendGrids();if(o){if(s!==0){this.colorTableView.updateDocumentColors(t.model,this.componentName)}this.colorTableView.updateSelectedColors()}}));return i}))}}var rB='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M12.4 10.3 10 4.5l-2.4 5.8h4.8zm.5 1.2H7.1L5.7 15H4.2l5-12h1.6l5 12h-1.5L13 11.5zm3.1 7H4a1 1 0 0 1 0-2h12a1 1 0 0 1 0 2z"/></svg>';class sB extends iB{constructor(t){const e=t.locale.t;super(t,{commandName:JS,componentName:JS,icon:rB,dropdownLabel:e("Font Color")})}static get pluginName(){return"FontColorUI"}}class aB extends Kn{static get requires(){return[oB,sB]}static get pluginName(){return"FontColor"}}class cB extends LS{constructor(t){super(t,$S)}}function lB(t){return t.map(dB).filter((t=>!!t))}function dB(t){if(typeof t==="object"){return t}if(t==="default"){return{title:"Default",model:undefined}}if(typeof t!=="string"){return}return uB(t)}function uB(t){const e=t.replace(/"|'/g,"").split(",");const n=e[0];const o=e.map(hB).join(", ");return{title:n,model:o,view:{name:"span",styles:{"font-family":o},priority:7}}}function hB(t){t=t.trim();if(t.indexOf(" ")>0){t=`'${t}'`}return t}class fB extends Kn{static get pluginName(){return"FontFamilyEditing"}constructor(t){super(t);t.config.define($S,{options:["default","Arial, Helvetica, sans-serif","Courier New, Courier, monospace","Georgia, serif","Lucida Sans Unicode, Lucida Grande, sans-serif","Tahoma, Geneva, sans-serif","Times New Roman, Times, serif","Trebuchet MS, Helvetica, sans-serif","Verdana, Geneva, sans-serif"],supportAllValues:false})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:$S});t.model.schema.setAttributeProperties($S,{isFormatting:true,copyOnEnter:true});const e=lB(t.config.get("fontFamily.options")).filter((t=>t.model));const n=QS($S,e);if(t.config.get("fontFamily.supportAllValues")){this._prepareAnyValueConverters();this._prepareCompatibilityConverter()}else{t.conversion.attributeToElement(n)}t.commands.add($S,new cB(t))}_prepareAnyValueConverters(){const t=this.editor;t.conversion.for("downcast").attributeToElement({model:$S,view:(t,{writer:e})=>e.createAttributeElement("span",{style:"font-family:"+t},{priority:7})});t.conversion.for("upcast").elementToAttribute({model:{key:$S,value:t=>t.getStyle("font-family")},view:{name:"span",styles:{"font-family":/.*/}}})}_prepareCompatibilityConverter(){const t=this.editor;t.conversion.for("upcast").elementToAttribute({view:{name:"font",attributes:{face:/.*/}},model:{key:$S,value:t=>t.getAttribute("face")}})}}var mB='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M11.03 3h6.149a.75.75 0 1 1 0 1.5h-5.514L11.03 3zm1.27 3h4.879a.75.75 0 1 1 0 1.5h-4.244L12.3 6zm1.27 3h3.609a.75.75 0 1 1 0 1.5h-2.973L13.57 9zm-2.754 2.5L8.038 4.785 5.261 11.5h5.555zm.62 1.5H4.641l-1.666 4.028H1.312l5.789-14h1.875l5.789 14h-1.663L11.436 13z"/></svg>';class gB extends Kn{static get pluginName(){return"FontFamilyUI"}init(){const t=this.editor;const e=t.t;const n=this._getLocalizedOptions();const o=t.commands.get($S);t.ui.componentFactory.add($S,(i=>{const r=xC(i);DC(r,pB(n,o));r.buttonView.set({label:e("Font Family"),icon:mB,tooltip:true});r.extendTemplate({attributes:{class:"ck-font-family-dropdown"}});r.bind("isEnabled").to(o);this.listenTo(r,"execute",(e=>{t.execute(e.source.commandName,{value:e.source.commandParam});t.editing.view.focus()}));return r}))}_getLocalizedOptions(){const t=this.editor;const e=t.t;const n=lB(t.config.get($S).options);return n.map((t=>{if(t.title==="Default"){t.title=e("Default")}return t}))}}function pB(t,e){const n=new ka;for(const o of t){const t={type:"button",model:new dA({commandName:$S,commandParam:o.model,label:o.title,withText:true})};t.model.bind("isOn").to(e,"value",(t=>{if(t===o.model){return true}if(!t||!o.model){return false}return t.split(",")[0].replace(/'/g,"").toLowerCase()===o.model.toLowerCase()}));if(o.view&&o.view.styles){t.model.set("labelStyle",`font-family: ${o.view.styles["font-family"]}`)}n.add(t)}return n}class bB extends Kn{static get requires(){return[fB,gB]}static get pluginName(){return"FontFamily"}}class kB extends LS{constructor(t){super(t,US)}}function wB(t){return t.map((t=>AB(t))).filter((t=>!!t))}const CB={get tiny(){return{title:"Tiny",model:"tiny",view:{name:"span",classes:"text-tiny",priority:7}}},get small(){return{title:"Small",model:"small",view:{name:"span",classes:"text-small",priority:7}}},get big(){return{title:"Big",model:"big",view:{name:"span",classes:"text-big",priority:7}}},get huge(){return{title:"Huge",model:"huge",view:{name:"span",classes:"text-huge",priority:7}}}};function AB(t){if(xB(t)){return vB(t)}const e=yB(t);if(e){return vB(e)}if(t==="default"){return{model:undefined,title:"Default"}}if(EB(t)){return}return _B(t)}function _B(t){if(typeof t==="number"||typeof t==="string"){t={title:String(t),model:`${parseFloat(t)}px`}}t.view={name:"span",styles:{"font-size":t.model}};return vB(t)}function vB(t){if(!t.view.priority){t.view.priority=7}return t}function yB(t){return CB[t]||CB[t.model]}function xB(t){return typeof t==="object"&&t.title&&t.model&&t.view}function EB(t){let e;if(typeof t==="object"){if(!t.model){throw new u["a"]("font-size-invalid-definition",null,t)}else{e=parseFloat(t.model)}}else{e=parseFloat(t)}return isNaN(e)}const DB=["x-small","x-small","small","medium","large","x-large","xx-large","xxx-large"];class SB extends Kn{static get pluginName(){return"FontSizeEditing"}constructor(t){super(t);t.config.define(US,{options:["tiny","small","default","big","huge"],supportAllValues:false})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:US});t.model.schema.setAttributeProperties(US,{isFormatting:true,copyOnEnter:true});const e=t.config.get("fontSize.supportAllValues");const n=wB(this.editor.config.get("fontSize.options")).filter((t=>t.model));const o=QS(US,n);if(e){this._prepareAnyValueConverters(o);this._prepareCompatibilityConverter()}else{t.conversion.attributeToElement(o)}t.commands.add(US,new kB(t))}_prepareAnyValueConverters(t){const e=this.editor;const n=t.model.values.filter((t=>!V_(String(t))&&!H_(String(t))));if(n.length){throw new u["a"]("font-size-invalid-use-of-named-presets",null,{presets:n})}e.conversion.for("downcast").attributeToElement({model:US,view:(t,{writer:e})=>{if(!t){return}return e.createAttributeElement("span",{style:"font-size:"+t},{priority:7})}});e.conversion.for("upcast").elementToAttribute({model:{key:US,value:t=>t.getStyle("font-size")},view:{name:"span",styles:{"font-size":/.*/}}})}_prepareCompatibilityConverter(){const t=this.editor;t.conversion.for("upcast").elementToAttribute({view:{name:"font",attributes:{size:/^[+-]?\d{1,3}$/}},model:{key:US,value:t=>{const e=t.getAttribute("size");const n=e[0]==="-"||e[0]==="+";let o=parseInt(e,10);if(n){o=3+o}const i=DB.length-1;const r=Math.min(Math.max(o,0),i);return DB[r]}}})}}var BB='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M9.816 11.5 7.038 4.785 4.261 11.5h5.555zm.62 1.5H3.641l-1.666 4.028H.312l5.789-14h1.875l5.789 14h-1.663L10.436 13zm7.55 2.279.779-.779.707.707-2.265 2.265-2.193-2.265.707-.707.765.765V4.825c0-.042 0-.083.002-.123l-.77.77-.707-.707L17.207 2.5l2.265 2.265-.707.707-.782-.782c.002.043.003.089.003.135v10.454z"/></svg>';var TB=n(42);var PB={injectType:"singletonStyleTag",attributes:{"data-cke":true}};PB.insert="head";PB.singleton=true;var IB=wk()(TB["a"],PB);var RB=TB["a"].locals||{};class FB extends Kn{static get pluginName(){return"FontSizeUI"}init(){const t=this.editor;const e=t.t;const n=this._getLocalizedOptions();const o=t.commands.get(US);t.ui.componentFactory.add(US,(i=>{const r=xC(i);DC(r,zB(n,o));r.buttonView.set({label:e("Font Size"),icon:BB,tooltip:true});r.extendTemplate({attributes:{class:["ck-font-size-dropdown"]}});r.bind("isEnabled").to(o);this.listenTo(r,"execute",(e=>{t.execute(e.source.commandName,{value:e.source.commandParam});t.editing.view.focus()}));return r}))}_getLocalizedOptions(){const t=this.editor;const e=t.t;const n={Default:e("Default"),Tiny:e("Tiny"),Small:e("Small"),Big:e("Big"),Huge:e("Huge")};const o=wB(t.config.get(US).options);return o.map((t=>{const e=n[t.title];if(e&&e!=t.title){t=Object.assign({},t,{title:e})}return t}))}}function zB(t,e){const n=new ka;for(const o of t){const t={type:"button",model:new dA({commandName:US,commandParam:o.model,label:o.title,class:"ck-fontsize-option",withText:true})};if(o.view&&o.view.styles){t.model.set("labelStyle",`font-size:${o.view.styles["font-size"]}`)}if(o.view&&o.view.classes){t.model.set("class",`${t.model.class} ${o.view.classes}`)}t.model.bind("isOn").to(e,"value",(t=>t===o.model));n.add(t)}return n}class OB extends Kn{static get requires(){return[SB,FB]}static get pluginName(){return"FontSize"}}class NB extends jn{refresh(){const t=this.editor.model;const e=t.document;const n=ff(e.selection.getSelectedBlocks());this.value=!!n&&n.is("element","paragraph");this.isEnabled=!!n&&MB(n,t.schema)}execute(t={}){const e=this.editor.model;const n=e.document;e.change((o=>{const i=(t.selection||n.selection).getSelectedBlocks();for(const t of i){if(!t.is("element","paragraph")&&MB(t,e.schema)){o.rename(t,"paragraph")}}}))}}function MB(t,e){return e.checkChild(t.parent,"paragraph")&&!e.isObject(t)}class VB extends jn{execute(t){const e=this.editor.model;let n=t.position;e.change((t=>{const o=t.createElement("paragraph");if(!e.schema.checkChild(n.parent,o)){const i=e.schema.findAllowedParent(n,o);if(!i){return}n=t.split(n,i).position}e.insertContent(o,n);t.setSelection(o,"in")}))}}class LB extends Kn{static get pluginName(){return"Paragraph"}init(){const t=this.editor;const e=t.model;t.commands.add("paragraph",new NB(t));t.commands.add("insertParagraph",new VB(t));e.schema.register("paragraph",{inheritAllFrom:"$block"});t.conversion.elementToElement({model:"paragraph",view:"p"});t.conversion.for("upcast").elementToElement({model:(t,{writer:e})=>{if(!LB.paragraphLikeElements.has(t.name)){return null}if(t.isEmpty){return null}return e.createElement("paragraph")},view:/.+/,converterPriority:"low"})}}LB.paragraphLikeElements=new Set(["blockquote","dd","div","dt","h1","h2","h3","h4","h5","h6","li","p","td","th"]);var HB='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10.5 5.5H7v5h3.5a2.5 2.5 0 1 0 0-5zM5 3h6.5v.025a5 5 0 0 1 0 9.95V13H7v4a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z"/></svg>';class KB extends Kn{init(){const t=this.editor;const e=t.t;t.ui.componentFactory.add("paragraph",(n=>{const o=new fw(n);const i=t.commands.get("paragraph");o.label=e("Paragraph");o.icon=HB;o.tooltip=true;o.isToggleable=true;o.bind("isEnabled").to(i);o.bind("isOn").to(i,"value");o.on("execute",(()=>{t.execute("paragraph")}));return o}))}}class qB extends jn{constructor(t,e){super(t);this.modelElements=e}refresh(){const t=ff(this.editor.model.document.selection.getSelectedBlocks());this.value=!!t&&this.modelElements.includes(t.name)&&t.name;this.isEnabled=!!t&&this.modelElements.some((e=>jB(t,e,this.editor.model.schema)))}execute(t){const e=this.editor.model;const n=e.document;const o=t.value;e.change((t=>{const i=Array.from(n.selection.getSelectedBlocks()).filter((t=>jB(t,o,e.schema)));for(const e of i){if(!e.is("element",o)){t.rename(e,o)}}}))}}function jB(t,e,n){return n.checkChild(t.parent,e)&&!n.isObject(t)}const WB="paragraph";class GB extends Kn{static get pluginName(){return"HeadingEditing"}constructor(t){super(t);t.config.define("heading",{options:[{model:"paragraph",title:"Paragraph",class:"ck-heading_paragraph"},{model:"heading1",view:"h2",title:"Heading 1",class:"ck-heading_heading1"},{model:"heading2",view:"h3",title:"Heading 2",class:"ck-heading_heading2"},{model:"heading3",view:"h4",title:"Heading 3",class:"ck-heading_heading3"}]})}static get requires(){return[LB]}init(){const t=this.editor;const e=t.config.get("heading.options");const n=[];for(const o of e){if(o.model!==WB){t.model.schema.register(o.model,{inheritAllFrom:"$block"});t.conversion.elementToElement(o);n.push(o.model)}}this._addDefaultH1Conversion(t);t.commands.add("heading",new qB(t,n))}afterInit(){const t=this.editor;const e=t.commands.get("enter");const n=t.config.get("heading.options");if(e){this.listenTo(e,"afterExecute",((e,o)=>{const i=t.model.document.selection.getFirstPosition().parent;const r=n.some((t=>i.is("element",t.model)));if(r&&!i.is("element",WB)&&i.childCount===0){o.writer.rename(i,WB)}}))}}_addDefaultH1Conversion(t){t.conversion.for("upcast").elementToElement({model:"heading1",view:"h1",converterPriority:l.get("low")+1})}}function UB(t){const e=t.t;const n={Paragraph:e("Paragraph"),"Heading 1":e("Heading 1"),"Heading 2":e("Heading 2"),"Heading 3":e("Heading 3"),"Heading 4":e("Heading 4"),"Heading 5":e("Heading 5"),"Heading 6":e("Heading 6")};return t.config.get("heading.options").map((t=>{const e=n[t.title];if(e&&e!=t.title){t.title=e}return t}))}var $B=n(43);var JB={injectType:"singletonStyleTag",attributes:{"data-cke":true}};JB.insert="head";JB.singleton=true;var YB=wk()($B["a"],JB);var QB=$B["a"].locals||{};class XB extends Kn{static get pluginName(){return"HeadingUI"}init(){const t=this.editor;const e=t.t;const n=UB(t);const o=e("Choose heading");const i=e("Heading");t.ui.componentFactory.add("heading",(e=>{const r={};const s=new ka;const a=t.commands.get("heading");const c=t.commands.get("paragraph");const l=[a];for(const t of n){const e={type:"button",model:new dA({label:t.title,class:t.class,withText:true})};if(t.model==="paragraph"){e.model.bind("isOn").to(c,"value");e.model.set("commandName","paragraph");l.push(c)}else{e.model.bind("isOn").to(a,"value",(e=>e===t.model));e.model.set({commandName:"heading",commandValue:t.model})}s.add(e);r[t.model]=t.title}const d=xC(e);DC(d,s);d.buttonView.set({isOn:false,withText:true,tooltip:i});d.extendTemplate({attributes:{class:["ck-heading-dropdown"]}});d.bind("isEnabled").toMany(l,"isEnabled",((...t)=>t.some((t=>t))));d.buttonView.bind("label").to(a,"value",c,"value",((t,e)=>{const n=t||e&&"paragraph";return r[n]?r[n]:o}));this.listenTo(d,"execute",(e=>{t.execute(e.source.commandName,e.source.commandValue?{value:e.source.commandValue}:undefined);t.editing.view.focus()}));return d}))}}class ZB extends Kn{static get requires(){return[GB,XB]}static get pluginName(){return"Heading"}}class tT extends jn{refresh(){const t=this.editor.model;const e=t.document;this.value=e.selection.getAttribute("highlight");this.isEnabled=t.schema.checkAttributeInSelection(e.selection,"highlight")}execute(t={}){const e=this.editor.model;const n=e.document;const o=n.selection;const i=t.value;e.change((t=>{const n=e.schema.getValidRanges(o.getRanges(),"highlight");if(o.isCollapsed){const e=o.getFirstPosition();if(o.hasAttribute("highlight")){const n=t=>t.item.hasAttribute("highlight")&&t.item.getAttribute("highlight")===this.value;const o=e.getLastMatchingPosition(n,{direction:"backward"});const r=e.getLastMatchingPosition(n);const s=t.createRange(o,r);if(!i||this.value===i){t.removeAttribute("highlight",s);t.removeSelectionAttribute("highlight")}else{t.setAttribute("highlight",i,s);t.setSelectionAttribute("highlight",i)}}else if(i){t.setSelectionAttribute("highlight",i)}}else{for(const e of n){if(i){t.setAttribute("highlight",i,e)}else{t.removeAttribute("highlight",e)}}}}))}}class eT extends Kn{static get pluginName(){return"HighlightEditing"}constructor(t){super(t);t.config.define("highlight",{options:[{model:"yellowMarker",class:"marker-yellow",title:"Yellow marker",color:"var(--ck-highlight-marker-yellow)",type:"marker"},{model:"greenMarker",class:"marker-green",title:"Green marker",color:"var(--ck-highlight-marker-green)",type:"marker"},{model:"pinkMarker",class:"marker-pink",title:"Pink marker",color:"var(--ck-highlight-marker-pink)",type:"marker"},{model:"blueMarker",class:"marker-blue",title:"Blue marker",color:"var(--ck-highlight-marker-blue)",type:"marker"},{model:"redPen",class:"pen-red",title:"Red pen",color:"var(--ck-highlight-pen-red)",type:"pen"},{model:"greenPen",class:"pen-green",title:"Green pen",color:"var(--ck-highlight-pen-green)",type:"pen"}]})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"highlight"});const e=t.config.get("highlight.options");t.conversion.attributeToElement(nT(e));t.commands.add("highlight",new tT(t))}}function nT(t){const e={model:{key:"highlight",values:[]},view:{}};for(const n of t){e.model.values.push(n.model);e.view[n.model]={name:"mark",classes:n.class}}return e}var oT='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path class="ck-icon__fill" d="M10.798 1.59 3.002 12.875l1.895 1.852 2.521 1.402 6.997-12.194z"/><path d="m2.556 16.727.234-.348c-.297-.151-.462-.293-.498-.426-.036-.137.002-.416.115-.837.094-.25.15-.449.169-.595a4.495 4.495 0 0 0 0-.725c-.209-.621-.303-1.041-.284-1.26.02-.218.178-.506.475-.862l6.77-9.414c.539-.91 1.605-.85 3.199.18 1.594 1.032 2.188 1.928 1.784 2.686l-5.877 10.36c-.158.412-.333.673-.526.782-.193.108-.604.179-1.232.21-.362.131-.608.237-.738.318-.13.081-.305.238-.526.47-.293.265-.504.397-.632.397-.096 0-.27-.075-.524-.226l-.31.41-1.6-1.12zm-.279.415 1.575 1.103-.392.515H1.19l1.087-1.618zm8.1-13.656-4.953 6.9L8.75 12.57l4.247-7.574c.175-.25-.188-.647-1.092-1.192-.903-.546-1.412-.652-1.528-.32zM8.244 18.5 9.59 17h9.406v1.5H8.245z"/></svg>';var iT='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path class="ck-icon__fill" d="M10.126 2.268 2.002 13.874l1.895 1.852 2.521 1.402L14.47 5.481l-1.543-2.568-2.801-.645z"/><path d="m4.5 18.088-2.645-1.852-.04-2.95-.006-.005.006-.008v-.025l.011.008L8.73 2.97c.165-.233.356-.417.567-.557l-1.212.308L4.604 7.9l-.83-.558 3.694-5.495 2.708-.69 1.65 1.145.046.018.85-1.216 2.16 1.512-.856 1.222c.828.967 1.144 2.141.432 3.158L7.55 17.286l.006.005-3.055.797H4.5zm-.634.166-1.976.516-.026-1.918 2.002 1.402zM9.968 3.817l-.006-.004-6.123 9.184 3.277 2.294 6.108-9.162.005.003c.317-.452-.16-1.332-1.064-1.966-.891-.624-1.865-.776-2.197-.349zM8.245 18.5 9.59 17h9.406v1.5H8.245z"/></svg>';var rT=n(44);var sT={injectType:"singletonStyleTag",attributes:{"data-cke":true}};sT.insert="head";sT.singleton=true;var aT=wk()(rT["a"],sT);var cT=rT["a"].locals||{};class lT extends Kn{get localizedOptionTitles(){const t=this.editor.t;return{"Yellow marker":t("Yellow marker"),"Green marker":t("Green marker"),"Pink marker":t("Pink marker"),"Blue marker":t("Blue marker"),"Red pen":t("Red pen"),"Green pen":t("Green pen")}}static get pluginName(){return"HighlightUI"}init(){const t=this.editor.config.get("highlight.options");for(const e of t){this._addHighlighterButton(e)}this._addRemoveHighlightButton();this._addDropdown(t)}_addRemoveHighlightButton(){const t=this.editor.t;const e=this.editor.commands.get("highlight");this._addButton("removeHighlight",t("Remove highlight"),hk.eraser,null,(t=>{t.bind("isEnabled").to(e,"isEnabled")}))}_addHighlighterButton(t){const e=this.editor.commands.get("highlight");this._addButton("highlight:"+t.model,t.title,uT(t.type),t.model,n);function n(n){n.bind("isEnabled").to(e,"isEnabled");n.bind("isOn").to(e,"value",(e=>e===t.model));n.iconView.fillColor=t.color;n.isToggleable=true}}_addButton(t,e,n,o,i){const r=this.editor;r.ui.componentFactory.add(t,(t=>{const s=new fw(t);const a=this.localizedOptionTitles[e]?this.localizedOptionTitles[e]:e;s.set({label:a,icon:n,tooltip:true});s.on("execute",(()=>{r.execute("highlight",{value:o});r.editing.view.focus()}));i(s);return s}))}_addDropdown(t){const e=this.editor;const n=e.t;const o=e.ui.componentFactory;const i=t[0];const r=t.reduce(((t,e)=>{t[e.model]=e;return t}),{});o.add("highlight",(s=>{const a=e.commands.get("highlight");const c=xC(s,Nw);const l=c.buttonView;l.set({tooltip:n("Highlight"),lastExecuted:i.model,commandValue:i.model,isToggleable:true});l.bind("icon").to(a,"value",(t=>uT(u(t,"type"))));l.bind("color").to(a,"value",(t=>u(t,"color")));l.bind("commandValue").to(a,"value",(t=>u(t,"model")));l.bind("isOn").to(a,"value",(t=>!!t));l.delegate("execute").to(c);const d=t.map((t=>{const e=o.create("highlight:"+t.model);this.listenTo(e,"execute",(()=>c.buttonView.set({lastExecuted:t.model})));return e}));c.bind("isEnabled").toMany(d,"isEnabled",((...t)=>t.some((t=>t))));d.push(new Xw);d.push(o.create("removeHighlight"));EC(c,d);dT(c);c.toolbarView.ariaLabel=n("Text highlight toolbar");l.on("execute",(()=>{e.execute("highlight",{value:l.commandValue});e.editing.view.focus()}));function u(t,e){const n=!t||t===l.lastExecuted?l.lastExecuted:t;return r[n][e]}return c}))}}function dT(t){const e=t.buttonView.actionView;e.iconView.bind("fillColor").to(t.buttonView,"color")}function uT(t){return t==="marker"?oT:iT}class hT extends Kn{static get requires(){return[eT,lT]}static get pluginName(){return"Highlight"}}class fT extends jn{refresh(){this.isEnabled=mT(this.editor.model)}execute(){const t=this.editor.model;t.change((e=>{const n=e.createElement("horizontalLine");t.insertContent(n);let o=n.nextSibling;const i=o&&t.schema.checkChild(o,"$text");if(!i&&t.schema.checkChild(n.parent,"paragraph")){o=e.createElement("paragraph");t.insertContent(o,e.createPositionAfter(n))}if(o){e.setSelection(o,0)}}))}}function mT(t){const e=t.schema;const n=t.document.selection;return gT(n,e,t)&&!Ay(n,e)}function gT(t,e,n){const o=pT(t,n);return e.checkChild(o,"horizontalLine")}function pT(t,e){const n=Cy(t,e);const o=n.parent;if(o.isEmpty&&!o.is("element","$root")){return o.parent}return o}var bT=n(45);var kT={injectType:"singletonStyleTag",attributes:{"data-cke":true}};kT.insert="head";kT.singleton=true;var wT=wk()(bT["a"],kT);var CT=bT["a"].locals||{};class AT extends Kn{static get pluginName(){return"HorizontalLineEditing"}init(){const t=this.editor;const e=t.model.schema;const n=t.t;const o=t.conversion;e.register("horizontalLine",{isObject:true,allowWhere:"$block"});o.for("dataDowncast").elementToElement({model:"horizontalLine",view:(t,{writer:e})=>e.createEmptyElement("hr")});o.for("editingDowncast").elementToElement({model:"horizontalLine",view:(t,{writer:e})=>{const o=n("Horizontal line");const i=e.createContainerElement("div");const r=e.createEmptyElement("hr");e.addClass("ck-horizontal-line",i);e.setCustomProperty("hr",true,i);e.insert(e.createPositionAt(i,0),r);return _T(i,e,o)}});o.for("upcast").elementToElement({view:"hr",model:"horizontalLine"});t.commands.add("horizontalLine",new fT(t))}}function _T(t,e,n){e.setCustomProperty("horizontalLine",true,t);return fy(t,e,{label:n})}var vT='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 9h16v2H2z"/></svg>';class yT extends Kn{static get pluginName(){return"HorizontalLineUI"}init(){const t=this.editor;const e=t.t;t.ui.componentFactory.add("horizontalLine",(n=>{const o=t.commands.get("horizontalLine");const i=new fw(n);i.set({label:e("Horizontal line"),icon:vT,tooltip:true});i.bind("isEnabled").to(o,"isEnabled");this.listenTo(i,"execute",(()=>{t.execute("horizontalLine");t.editing.view.focus()}));return i}))}}class xT extends Kn{static get requires(){return[AT,yT,ix]}static get pluginName(){return"HorizontalLine"}}class ET extends jn{refresh(){this.isEnabled=DT(this.editor.model)}execute(){const t=this.editor.model;t.change((e=>{const n=e.createElement("rawHtml");t.insertContent(n);e.setSelection(n,"on")}))}}function DT(t){const e=t.schema;const n=t.document.selection;return ST(n,e,t)&&!Ay(n,e)}function ST(t,e,n){const o=BT(t,n);return e.checkChild(o,"rawHtml")}function BT(t,e){const n=Cy(t,e);const o=n.parent;if(o.isEmpty&&!o.is("element","$root")){return o.parent}return o}class TT extends jn{refresh(){const t=this.editor.model;const e=t.document.selection;const n=PT(e);this.isEnabled=!!n}execute(t){const e=this.editor.model;const n=e.document.selection;const o=PT(n);e.change((e=>{e.setAttribute("value",t,o)}))}}function PT(t){const e=t.getSelectedElement();if(e&&e.is("element","rawHtml")){return e}return null}var IT=n(46);var RT={injectType:"singletonStyleTag",attributes:{"data-cke":true}};RT.insert="head";RT.singleton=true;var FT=wk()(IT["a"],RT);var zT=IT["a"].locals||{};class OT extends Kn{static get pluginName(){return"HtmlEmbedEditing"}constructor(t){super(t);t.config.define("htmlEmbed",{showPreviews:false,sanitizeHtml:t=>{Object(u["b"])("html-embed-provide-sanitize-function");return{html:t,hasChanged:false}}})}init(){const t=this.editor;const e=t.model.schema;e.register("rawHtml",{isObject:true,allowWhere:"$block",allowAttributes:["value"]});t.commands.add("updateHtmlEmbed",new TT(t));t.commands.add("insertHtmlEmbed",new ET(t));this._setupConversion()}_setupConversion(){const t=this.editor;const e=t.t;const n=t.editing.view;const o=t.config.get("htmlEmbed");t.data.registerRawContentMatcher({name:"div",classes:"raw-html-embed"});t.conversion.for("upcast").elementToElement({view:{name:"div",classes:"raw-html-embed"},model:(t,{writer:e})=>e.createElement("rawHtml",{value:t.getCustomProperty("$rawContent")})});t.conversion.for("dataDowncast").elementToElement({model:"rawHtml",view:(t,{writer:e})=>e.createRawElement("div",{class:"raw-html-embed"},(function(e){e.innerHTML=t.getAttribute("value")||""}))});t.conversion.for("editingDowncast").elementToElement({triggerBy:{attributes:["value"]},model:"rawHtml",view:(r,{writer:s})=>{let a,c,l;const d=s.createContainerElement("div",{class:"raw-html-embed","data-html-embed-label":e("HTML snippet"),dir:t.locale.uiLanguageDirection});const u=s.createRawElement("div",{class:"raw-html-embed__content-wrapper"},(function(e){a=e;i({domElement:e,editor:t,state:c,props:l});a.addEventListener("mousedown",(()=>{if(c.isEditable){const e=t.model;const n=e.document.selection.getSelectedElement();if(n!==r){e.change((t=>t.setSelection(r,"on")))}}}),true)}));const h={makeEditable(){c=Object.assign({},c,{isEditable:true});i({domElement:a,editor:t,state:c,props:l});n.change((t=>{t.setAttribute("data-cke-ignore-events","true",u)}));a.querySelector("textarea").focus()},save(e){if(e!==c.getRawHtmlValue()){t.execute("updateHtmlEmbed",e);t.editing.view.focus()}else{this.cancel()}},cancel(){c=Object.assign({},c,{isEditable:false});i({domElement:a,editor:t,state:c,props:l});t.editing.view.focus();n.change((t=>{t.removeAttribute("data-cke-ignore-events",u)}))}};c={showPreviews:o.showPreviews,isEditable:false,getRawHtmlValue:()=>r.getAttribute("value")||""};l={sanitizeHtml:o.sanitizeHtml,textareaPlaceholder:e("Paste raw HTML here..."),onEditClick(){h.makeEditable()},onSaveClick(t){h.save(t)},onCancelClick(){h.cancel()}};s.insert(s.createPositionAt(d,0),u);s.setCustomProperty("rawHtmlApi",h,d);s.setCustomProperty("rawHtml",true,d);return fy(d,s,{widgetLabel:e("HTML snippet"),hasSelectionHandle:true})}});function i({domElement:t,editor:e,state:n,props:o}){t.textContent="";const i=t.ownerDocument;let c;if(n.isEditable){const e={isDisabled:false,placeholder:o.textareaPlaceholder};c=s({domDocument:i,state:n,props:e});t.append(c)}else if(n.showPreviews){const r={sanitizeHtml:o.sanitizeHtml};t.append(a({domDocument:i,state:n,props:r,editor:e}))}else{const e={isDisabled:true,placeholder:o.textareaPlaceholder};t.append(s({domDocument:i,state:n,props:e}))}const l={onEditClick:o.onEditClick,onSaveClick:()=>{o.onSaveClick(c.value)},onCancelClick:o.onCancelClick};t.prepend(r({editor:e,domDocument:i,state:n,props:l}))}function r({editor:t,domDocument:e,state:n,props:o}){const i=Zh(e,"div",{class:"raw-html-embed__buttons-wrapper"});const r=NT(t,"edit");const s=NT(t,"save");const a=NT(t,"cancel");if(n.isEditable){const t=s.cloneNode(true);const e=a.cloneNode(true);t.addEventListener("click",(t=>{t.preventDefault();o.onSaveClick()}));e.addEventListener("click",(t=>{t.preventDefault();o.onCancelClick()}));i.appendChild(t);i.appendChild(e)}else{const t=r.cloneNode(true);t.addEventListener("click",(t=>{t.preventDefault();o.onEditClick()}));i.appendChild(t)}return i}function s({domDocument:t,state:e,props:n}){const o=Zh(t,"textarea",{placeholder:n.placeholder,class:"ck ck-reset ck-input ck-input-text raw-html-embed__source"});o.disabled=n.isDisabled;o.value=e.getRawHtmlValue();return o}function a({domDocument:t,state:n,props:o,editor:i}){const r=o.sanitizeHtml(n.getRawHtmlValue());const s=n.getRawHtmlValue().length>0?e("No preview available"):e("Empty snippet content");const a=Zh(t,"div",{class:"ck ck-reset_all raw-html-embed__preview-placeholder"},s);const c=Zh(t,"div",{class:"raw-html-embed__preview-content",dir:i.locale.contentLanguageDirection});c.innerHTML=r.html;const l=Zh(t,"div",{class:"raw-html-embed__preview"},[a,c]);return l}}}function NT(t,e){const n=t.locale.t;const o=new fw(t.locale);const i=t.commands.get("updateHtmlEmbed");o.set({tooltipPosition:t.locale.uiLanguageDirection==="rtl"?"e":"w",icon:hk.pencil,tooltip:true});o.render();if(e==="edit"){o.set({icon:hk.pencil,label:n("Edit source"),class:"raw-html-embed__edit-button"})}else if(e==="save"){o.set({icon:hk.check,label:n("Save changes"),class:"raw-html-embed__save-button"});o.bind("isEnabled").to(i,"isEnabled")}else{o.set({icon:hk.cancel,label:n("Cancel"),class:"raw-html-embed__cancel-button"})}o.destroy();return o.element.cloneNode(true)}var MT='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M17 0a2 2 0 0 1 2 2v7a1 1 0 0 1 1 1v5a1 1 0 0 1-.883.993l-.118.006L19 17a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2l-.001-1.001-.116-.006A1 1 0 0 1 0 15v-5a1 1 0 0 1 .999-1L1 2a2 2 0 0 1 2-2h14zm.499 15.999h-15L2.5 17a.5.5 0 0 0 .5.5h14a.5.5 0 0 0 .5-.5l-.001-1.001zm-3.478-6.013-.014.014H14v.007l-1.525 1.525-1.46-1.46-.015.013V10h-1v5h1v-3.53l1.428 1.43.048.043.131-.129L14 11.421V15h1v-5h-.965l-.014-.014zM2 10H1v5h1v-2h2v2h1v-5H4v2H2v-2zm7 0H6v1h1v4h1v-4h1v-1zm8 0h-1v5h3v-1h-2v-4zm0-8.5H3a.5.5 0 0 0-.5.5l-.001 6.999h15L17.5 2a.5.5 0 0 0-.5-.5zM10 7v1H4V7h6zm3-2v1H4V5h9zm-3-2v1H4V3h6z"/></svg>';class VT extends Kn{static get pluginName(){return"HtmlEmbedUI"}init(){const t=this.editor;const e=t.t;t.ui.componentFactory.add("htmlEmbed",(n=>{const o=t.commands.get("insertHtmlEmbed");const i=new fw(n);i.set({label:e("Insert HTML"),icon:MT,tooltip:true});i.bind("isEnabled").to(o,"isEnabled");this.listenTo(i,"execute",(()=>{t.execute("insertHtmlEmbed");t.editing.view.focus();const e=t.editing.view.document.selection.getSelectedElement();e.getCustomProperty("rawHtmlApi").makeEditable()}));return i}))}}class LT extends Kn{static get requires(){return[OT,VT,ix]}static get pluginName(){return"HtmlEmbed"}}class HT extends Cu{observe(t){this.listenTo(t,"load",((t,e)=>{const n=e.target;if(this.checkShouldIgnoreEventFromTarget(n)){return}if(n.tagName=="IMG"){this._fireEvents(e)}}),{useCapture:true})}_fireEvents(t){if(this.isEnabled){this.document.fire("layoutChanged");this.document.fire("imageLoaded",t)}}}function KT(){return e=>{e.on("element:figure",t)};function t(t,e,n){if(!n.consumable.test(e.viewItem,{name:true,classes:"image"})){return}const o=lE(e.viewItem);if(!o||!o.hasAttribute("src")||!n.consumable.test(o,{name:true})){return}const i=n.convertItem(o,e.modelCursor);const r=ff(i.modelRange.getItems());if(!r){return}n.convertChildren(e.viewItem,r);n.updateConversionResult(r,e)}}function qT(){return e=>{e.on("attribute:srcset:image",t)};function t(t,e,n){if(!n.consumable.consume(e.item,t.name)){return}const o=n.writer;const i=n.mapper.toViewElement(e.item);const r=lE(i);if(e.attributeNewValue===null){const t=e.attributeOldValue;if(t.data){o.removeAttribute("srcset",r);o.removeAttribute("sizes",r);if(t.width){o.removeAttribute("width",r)}}}else{const t=e.attributeNewValue;if(t.data){o.setAttribute("srcset",t.data,r);o.setAttribute("sizes","100vw",r);if(t.width){o.setAttribute("width",t.width,r)}}}}}function jT(t){return n=>{n.on(`attribute:${t}:image`,e)};function e(t,e,n){if(!n.consumable.consume(e.item,t.name)){return}const o=n.writer;const i=n.mapper.toViewElement(e.item);const r=lE(i);o.setAttribute(e.attributeKey,e.attributeNewValue||"",r)}}class WT extends jn{refresh(){this.isEnabled=cE(this.editor.model)}execute(t){const e=this.editor.model;for(const n of Ca(t.source)){aE(e,{src:n})}}}class GT extends Kn{static get pluginName(){return"ImageEditing"}init(){const t=this.editor;const e=t.model.schema;const n=t.t;const o=t.conversion;t.editing.view.addObserver(HT);e.register("image",{isObject:true,isBlock:true,allowWhere:"$block",allowAttributes:["alt","src","srcset"]});o.for("dataDowncast").elementToElement({model:"image",view:(t,{writer:e})=>UT(e)});o.for("editingDowncast").elementToElement({model:"image",view:(t,{writer:e})=>oE(UT(e),e,n("image widget"))});o.for("downcast").add(jT("src")).add(jT("alt")).add(qT());o.for("upcast").elementToElement({view:{name:"img",attributes:{src:true}},model:(t,{writer:e})=>e.createElement("image",{src:t.getAttribute("src")})}).attributeToAttribute({view:{name:"img",key:"alt"},model:"alt"}).attributeToAttribute({view:{name:"img",key:"srcset"},model:{key:"srcset",value:t=>{const e={data:t.getAttribute("srcset")};if(t.hasAttribute("width")){e.width=t.getAttribute("width")}return e}}}).add(KT());const i=new WT(t);t.commands.add("insertImage",i);t.commands.add("imageInsert",i)}}function UT(t){const e=t.createEmptyElement("img");const n=t.createContainerElement("figure",{class:"image"});t.insert(t.createPositionAt(n,0),e);return n}class $T extends jn{refresh(){const t=this.editor.model.document.selection.getSelectedElement();this.isEnabled=sE(t);if(sE(t)&&t.hasAttribute("alt")){this.value=t.getAttribute("alt")}else{this.value=false}}execute(t){const e=this.editor.model;const n=e.document.selection.getSelectedElement();e.change((e=>{e.setAttribute("alt",t.newValue,n)}))}}class JT extends Kn{static get pluginName(){return"ImageTextAlternativeEditing"}init(){this.editor.commands.add("imageTextAlternative",new $T(this.editor))}}var YT=n(47);var QT={injectType:"singletonStyleTag",attributes:{"data-cke":true}};QT.insert="head";QT.singleton=true;var XT=wk()(YT["a"],QT);var ZT=YT["a"].locals||{};var tP=n(48);var eP={injectType:"singletonStyleTag",attributes:{"data-cke":true}};eP.insert="head";eP.singleton=true;var nP=wk()(tP["a"],eP);var oP=tP["a"].locals||{};class iP extends yk{constructor(t){super(t);const e=this.locale.t;this.focusTracker=new mf;this.keystrokes=new gf;this.labeledInput=this._createLabeledInputView();this.saveButtonView=this._createButton(e("Save"),hk.check,"ck-button-save");this.saveButtonView.type="submit";this.cancelButtonView=this._createButton(e("Cancel"),hk.cancel,"ck-button-cancel","cancel");this._focusables=new pk;this._focusCycler=new yw({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});this.setTemplate({tag:"form",attributes:{class:["ck","ck-text-alternative-form","ck-responsive-form"],tabindex:"-1"},children:[this.labeledInput,this.saveButtonView,this.cancelButtonView]});mk(this)}render(){super.render();this.keystrokes.listenTo(this.element);gk({view:this});[this.labeledInput,this.saveButtonView,this.cancelButtonView].forEach((t=>{this._focusables.add(t);this.focusTracker.add(t.element)}))}_createButton(t,e,n,o){const i=new fw(this.locale);i.set({label:t,icon:e,tooltip:true});i.extendTemplate({attributes:{class:n}});if(o){i.delegate("execute").to(this,o)}return i}_createLabeledInputView(){const t=this.locale.t;const e=new sA(this.locale,aA);e.label=t("Text alternative");return e}}function rP(t){const e=t.plugins.get("ContextualBalloon");if(rE(t.editing.view.document.selection)){const n=sP(t);e.updatePosition(n)}}function sP(t){const e=t.editing.view;const n=bA.defaultPositions;return{target:e.domConverter.viewToDom(e.document.selection.getSelectedElement()),positions:[n.northArrowSouth,n.northArrowSouthWest,n.northArrowSouthEast,n.southArrowNorth,n.southArrowNorthWest,n.southArrowNorthEast]}}class aP extends Kn{static get requires(){return[IA]}static get pluginName(){return"ImageTextAlternativeUI"}init(){this._createButton();this._createForm()}destroy(){super.destroy();this._form.destroy()}_createButton(){const t=this.editor;const e=t.t;t.ui.componentFactory.add("imageTextAlternative",(n=>{const o=t.commands.get("imageTextAlternative");const i=new fw(n);i.set({label:e("Change image text alternative"),icon:hk.lowVision,tooltip:true});i.bind("isEnabled").to(o,"isEnabled");this.listenTo(i,"execute",(()=>{this._showForm()}));return i}))}_createForm(){const t=this.editor;const e=t.editing.view;const n=e.document;this._balloon=this.editor.plugins.get("ContextualBalloon");this._form=new iP(t.locale);this._form.render();this.listenTo(this._form,"submit",(()=>{t.execute("imageTextAlternative",{newValue:this._form.labeledInput.fieldView.element.value});this._hideForm(true)}));this.listenTo(this._form,"cancel",(()=>{this._hideForm(true)}));this._form.keystrokes.set("Esc",((t,e)=>{this._hideForm(true);e()}));this.listenTo(t.ui,"update",(()=>{if(!rE(n.selection)){this._hideForm(true)}else if(this._isVisible){rP(t)}}));fk({emitter:this._form,activator:()=>this._isVisible,contextElements:[this._balloon.view.element],callback:()=>this._hideForm()})}_showForm(){if(this._isVisible){return}const t=this.editor;const e=t.commands.get("imageTextAlternative");const n=this._form.labeledInput;this._form.disableCssTransitions();if(!this._isInBalloon){this._balloon.add({view:this._form,position:sP(t)})}n.fieldView.value=n.fieldView.element.value=e.value||"";this._form.labeledInput.fieldView.select();this._form.enableCssTransitions()}_hideForm(t){if(!this._isInBalloon){return}if(this._form.focusTracker.isFocused){this._form.saveButtonView.focus()}this._balloon.remove(this._form);if(t){this.editor.editing.view.focus()}}get _isVisible(){return this._balloon.visibleView===this._form}get _isInBalloon(){return this._balloon.hasView(this._form)}}class cP extends Kn{static get requires(){return[JT,aP]}static get pluginName(){return"ImageTextAlternative"}}var lP=n(49);var dP={injectType:"singletonStyleTag",attributes:{"data-cke":true}};dP.insert="head";dP.singleton=true;var uP=wk()(lP["a"],dP);var hP=lP["a"].locals||{};class fP extends Kn{static get requires(){return[GT,ix,cP]}static get pluginName(){return"Image"}isImageWidget(t){return iE(t)}}function mP(t,e){return n=>{const o=n.createEditableElement("figcaption");n.setCustomProperty("imageCaption",true,o);r_({view:t,element:o,text:e});return wy(o,n)}}function gP(t){return!!t.getCustomProperty("imageCaption")}function pP(t){for(const e of t.getChildren()){if(!!e&&e.is("element","caption")){return e}}return null}function bP(t){const e=t.parent;if(t.name=="figcaption"&&e&&e.name=="figure"&&e.hasClass("image")){return{name:true}}return null}class kP extends Kn{static get pluginName(){return"ImageCaptionEditing"}init(){const t=this.editor;const e=t.editing.view;const n=t.model.schema;const o=t.data;const i=t.editing;const r=t.t;n.register("caption",{allowIn:"image",allowContentOf:"$block",isLimit:true});t.model.document.registerPostFixer((t=>this._insertMissingModelCaptionElement(t)));t.conversion.for("upcast").elementToElement({view:bP,model:"caption"});const s=t=>t.createContainerElement("figcaption");o.downcastDispatcher.on("insert:caption",wP(s,false));const a=mP(e,r("Enter image caption"));i.downcastDispatcher.on("insert:caption",wP(a));i.downcastDispatcher.on("insert",this._fixCaptionVisibility((t=>t.item)),{priority:"high"});i.downcastDispatcher.on("remove",this._fixCaptionVisibility((t=>t.position.parent)),{priority:"high"});e.document.registerPostFixer((t=>this._updateCaptionVisibility(t)))}_updateCaptionVisibility(t){const e=this.editor.editing.mapper;const n=this._lastSelectedCaption;let o;const i=this.editor.model.document.selection;const r=i.getSelectedElement();if(r&&r.is("element","image")){const t=pP(r);o=e.toViewElement(t)}const s=i.getFirstPosition();const a=AP(s.parent);if(a){o=e.toViewElement(a)}if(o&&!this.editor.isReadOnly){if(n){if(n===o){return vP(o,t)}else{_P(n,t);this._lastSelectedCaption=o;return vP(o,t)}}else{this._lastSelectedCaption=o;return vP(o,t)}}else{if(n){const e=_P(n,t);this._lastSelectedCaption=null;return e}else{return false}}}_fixCaptionVisibility(t){return(e,n,o)=>{const i=t(n);const r=AP(i);const s=this.editor.editing.mapper;const a=o.writer;if(r){const t=s.toViewElement(r);if(t){if(r.childCount){a.removeClass("ck-hidden",t)}else{a.addClass("ck-hidden",t)}}}}}_insertMissingModelCaptionElement(t){const e=this.editor.model;const n=e.document.differ.getChanges();const o=[];for(const t of n){if(t.type=="insert"&&t.name!="$text"){const n=t.position.nodeAfter;if(n.is("element","image")&&!pP(n)){o.push(n)}if(!n.is("element","image")&&n.childCount){for(const t of e.createRangeIn(n).getItems()){if(t.is("element","image")&&!pP(t)){o.push(t)}}}}}for(const e of o){t.appendElement("caption",e)}return!!o.length}}function wP(t,e=true){return(n,o,i)=>{const r=o.item;if(!r.childCount&&!e){return}if(sE(r.parent)){if(!i.consumable.consume(o.item,"insert")){return}const e=i.mapper.toViewElement(o.range.start.parent);const n=t(i.writer);const s=i.writer;if(!r.childCount){s.addClass("ck-hidden",n)}CP(n,o.item,e,i)}}}function CP(t,e,n,o){const i=o.writer.createPositionAt(n,"end");o.writer.insert(i,t);o.mapper.bindElements(e,t)}function AP(t){const e=t.getAncestors({includeSelf:true});const n=e.find((t=>t.name=="caption"));if(n&&n.parent&&n.parent.name=="image"){return n}return null}function _P(t,e){if(!t.childCount&&!t.hasClass("ck-hidden")){e.addClass("ck-hidden",t);return true}return false}function vP(t,e){if(t.hasClass("ck-hidden")){e.removeClass("ck-hidden",t);return true}return false}var yP=n(50);var xP={injectType:"singletonStyleTag",attributes:{"data-cke":true}};xP.insert="head";xP.singleton=true;var EP=wk()(yP["a"],xP);var DP=yP["a"].locals||{};class SP extends Kn{static get requires(){return[kP]}static get pluginName(){return"ImageCaption"}}class BP{constructor(){const t=new window.FileReader;this._reader=t;this._data=undefined;this.set("loaded",0);t.onprogress=t=>{this.loaded=t.loaded}}get error(){return this._reader.error}get data(){return this._data}read(t){const e=this._reader;this.total=t.size;return new Promise(((n,o)=>{e.onload=()=>{const t=e.result;this._data=t;n(t)};e.onerror=()=>{o("error")};e.onabort=()=>{o("aborted")};this._reader.readAsDataURL(t)}))}abort(){this._reader.abort()}}Hn(BP,Tn);class TP extends Kn{static get pluginName(){return"FileRepository"}static get requires(){return[Lb]}init(){this.loaders=new ka;this.loaders.on("add",(()=>this._updatePendingAction()));this.loaders.on("remove",(()=>this._updatePendingAction()));this._loadersMap=new Map;this._pendingAction=null;this.set("uploaded",0);this.set("uploadTotal",null);this.bind("uploadedPercent").to(this,"uploaded",this,"uploadTotal",((t,e)=>e?t/e*100:0))}getLoader(t){return this._loadersMap.get(t)||null}createLoader(t){if(!this.createUploadAdapter){Object(u["b"])("filerepository-no-upload-adapter");return null}const e=new PP(Promise.resolve(t),this.createUploadAdapter);this.loaders.add(e);this._loadersMap.set(t,e);if(t instanceof Promise){e.file.then((t=>{this._loadersMap.set(t,e)})).catch((()=>{}))}e.on("change:uploaded",(()=>{let t=0;for(const e of this.loaders){t+=e.uploaded}this.uploaded=t}));e.on("change:uploadTotal",(()=>{let t=0;for(const e of this.loaders){if(e.uploadTotal){t+=e.uploadTotal}}this.uploadTotal=t}));return e}destroyLoader(t){const e=t instanceof PP?t:this.getLoader(t);e._destroy();this.loaders.remove(e);this._loadersMap.forEach(((t,n)=>{if(t===e){this._loadersMap.delete(n)}}))}_updatePendingAction(){const t=this.editor.plugins.get(Lb);if(this.loaders.length){if(!this._pendingAction){const e=this.editor.t;const n=t=>`${e("Upload in progress")} ${parseInt(t)}%.`;this._pendingAction=t.add(n(this.uploadedPercent));this._pendingAction.bind("message").to(this,"uploadedPercent",n)}}else{t.remove(this._pendingAction);this._pendingAction=null}}}Hn(TP,Tn);class PP{constructor(t,e){this.id=a();this._filePromiseWrapper=this._createFilePromiseWrapper(t);this._adapter=e(this);this._reader=new BP;this.set("status","idle");this.set("uploaded",0);this.set("uploadTotal",null);this.bind("uploadedPercent").to(this,"uploaded",this,"uploadTotal",((t,e)=>e?t/e*100:0));this.set("uploadResponse",null)}get file(){if(!this._filePromiseWrapper){return Promise.resolve(null)}else{return this._filePromiseWrapper.promise.then((t=>this._filePromiseWrapper?t:null))}}get data(){return this._reader.data}read(){if(this.status!="idle"){throw new u["a"]("filerepository-read-wrong-status",this)}this.status="reading";return this.file.then((t=>this._reader.read(t))).then((t=>{if(this.status!=="reading"){throw this.status}this.status="idle";return t})).catch((t=>{if(t==="aborted"){this.status="aborted";throw"aborted"}this.status="error";throw this._reader.error?this._reader.error:t}))}upload(){if(this.status!="idle"){throw new u["a"]("filerepository-upload-wrong-status",this)}this.status="uploading";return this.file.then((()=>this._adapter.upload())).then((t=>{this.uploadResponse=t;this.status="idle";return t})).catch((t=>{if(this.status==="aborted"){throw"aborted"}this.status="error";throw t}))}abort(){const t=this.status;this.status="aborted";if(!this._filePromiseWrapper.isFulfilled){this._filePromiseWrapper.promise.catch((()=>{}));this._filePromiseWrapper.rejecter("aborted")}else if(t=="reading"){this._reader.abort()}else if(t=="uploading"&&this._adapter.abort){this._adapter.abort()}this._destroy()}_destroy(){this._filePromiseWrapper=undefined;this._reader=undefined;this._adapter=undefined;this.uploadResponse=undefined}_createFilePromiseWrapper(t){const e={};e.promise=new Promise(((n,o)=>{e.rejecter=o;e.isFulfilled=false;t.then((t=>{e.isFulfilled=true;n(t)})).catch((t=>{e.isFulfilled=true;o(t)}))}));return e}}Hn(PP,Tn);class IP extends yk{constructor(t){super(t);this.buttonView=new fw(t);this._fileInputView=new RP(t);this._fileInputView.bind("acceptedType").to(this);this._fileInputView.bind("allowMultipleFiles").to(this);this._fileInputView.delegate("done").to(this);this.setTemplate({tag:"span",attributes:{class:"ck-file-dialog-button"},children:[this.buttonView,this._fileInputView]});this.buttonView.on("execute",(()=>{this._fileInputView.open()}))}focus(){this.buttonView.focus()}}class RP extends yk{constructor(t){super(t);this.set("acceptedType");this.set("allowMultipleFiles",false);const e=this.bindTemplate;this.setTemplate({tag:"input",attributes:{class:["ck-hidden"],type:"file",tabindex:"-1",accept:e.to("acceptedType"),multiple:e.to("allowMultipleFiles")},on:{change:e.to((()=>{if(this.element&&this.element.files&&this.element.files.length){this.fire("done",this.element.files)}this.element.value=""}))}})}open(){this.element.click()}}class FP extends Kn{static get requires(){return[TP]}static get pluginName(){return"Base64UploadAdapter"}init(){this.editor.plugins.get(TP).createUploadAdapter=t=>new zP(t)}}class zP{constructor(t){this.loader=t}upload(){return new Promise(((t,e)=>{const n=this.reader=new window.FileReader;n.addEventListener("load",(()=>{t({default:n.result})}));n.addEventListener("error",(t=>{e(t)}));n.addEventListener("abort",(()=>{e()}));this.loader.file.then((t=>{n.readAsDataURL(t)}))}))}abort(){this.reader.abort()}}class OP extends Kn{static get requires(){return[TP]}static get pluginName(){return"SimpleUploadAdapter"}init(){const t=this.editor.config.get("simpleUpload");if(!t){return}if(!t.uploadUrl){Object(u["b"])("simple-upload-adapter-missing-uploadurl");return}this.editor.plugins.get(TP).createUploadAdapter=e=>new NP(e,t)}}class NP{constructor(t,e){this.loader=t;this.options=e}upload(){return this.loader.file.then((t=>new Promise(((e,n)=>{this._initRequest();this._initListeners(e,n,t);this._sendRequest(t)}))))}abort(){if(this.xhr){this.xhr.abort()}}_initRequest(){const t=this.xhr=new XMLHttpRequest;t.open("POST",this.options.uploadUrl,true);t.responseType="json"}_initListeners(t,e,n){const o=this.xhr;const i=this.loader;const r=`Couldn't upload file: ${n.name}.`;o.addEventListener("error",(()=>e(r)));o.addEventListener("abort",(()=>e()));o.addEventListener("load",(()=>{const n=o.response;if(!n||n.error){return e(n&&n.error&&n.error.message?n.error.message:r)}t(n.url?{default:n.url}:n.urls)}));if(o.upload){o.upload.addEventListener("progress",(t=>{if(t.lengthComputable){i.uploadTotal=t.total;i.uploaded=t.loaded}}))}}_sendRequest(t){const e=this.options.headers||{};const n=this.options.withCredentials||false;for(const t of Object.keys(e)){this.xhr.setRequestHeader(t,e[t])}this.xhr.withCredentials=n;const o=new FormData;o.append("upload",t);this.xhr.send(o)}}function MP(t){const e=t.map((t=>t.replace("+","\\+")));return new RegExp(`^image\\/(${e.join("|")})$`)}function VP(t){return new Promise(((e,n)=>{const o=t.getAttribute("src");fetch(o).then((t=>t.blob())).then((t=>{const n=HP(t,o);const i=n.replace("image/","");const r=`image.${i}`;const s=new File([t],r,{type:n});e(s)})).catch((t=>t&&t.name==="TypeError"?KP(o).then(e).catch(n):n(t)))}))}function LP(t){if(!t.is("element","img")||!t.getAttribute("src")){return false}return t.getAttribute("src").match(/^data:image\/\w+;base64,/g)||t.getAttribute("src").match(/^blob:/g)}function HP(t,e){if(t.type){return t.type}else if(e.match(/data:(image\/\w+);base64/)){return e.match(/data:(image\/\w+);base64/)[1].toLowerCase()}else{return"image/jpeg"}}function KP(t){return qP(t).then((e=>{const n=HP(e,t);const o=n.replace("image/","");const i=`image.${o}`;return new File([e],i,{type:n})}))}function qP(t){return new Promise(((e,n)=>{const o=ru.document.createElement("img");o.addEventListener("load",(()=>{const t=ru.document.createElement("canvas");t.width=o.width;t.height=o.height;const i=t.getContext("2d");i.drawImage(o,0,0);t.toBlob((t=>t?e(t):n()))}));o.addEventListener("error",(()=>n()));o.src=t}))}class jP extends Kn{static get pluginName(){return"ImageUploadUI"}init(){const t=this.editor;const e=t.t;const n=n=>{const o=new IP(n);const i=t.commands.get("uploadImage");const r=t.config.get("image.upload.types");const s=MP(r);o.set({acceptedType:r.map((t=>`image/${t}`)).join(","),allowMultipleFiles:true});o.buttonView.set({label:e("Insert image"),icon:hk.image,tooltip:true});o.buttonView.bind("isEnabled").to(i);o.on("done",((e,n)=>{const o=Array.from(n).filter((t=>s.test(t.type)));if(o.length){t.execute("uploadImage",{file:o})}}));return o};t.ui.componentFactory.add("uploadImage",n);t.ui.componentFactory.add("imageUpload",n)}}var WP='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 250"><rect rx="4"/></svg>';var GP=n(51);var UP={injectType:"singletonStyleTag",attributes:{"data-cke":true}};UP.insert="head";UP.singleton=true;var $P=wk()(GP["a"],UP);var JP=GP["a"].locals||{};var YP=n(52);var QP={injectType:"singletonStyleTag",attributes:{"data-cke":true}};QP.insert="head";QP.singleton=true;var XP=wk()(YP["a"],QP);var ZP=YP["a"].locals||{};var tI=n(53);var eI={injectType:"singletonStyleTag",attributes:{"data-cke":true}};eI.insert="head";eI.singleton=true;var nI=wk()(tI["a"],eI);var oI=tI["a"].locals||{};class iI extends Kn{static get pluginName(){return"ImageUploadProgress"}constructor(t){super(t);this.placeholder="data:image/svg+xml;utf8,"+encodeURIComponent(WP)}init(){const t=this.editor;t.editing.downcastDispatcher.on("attribute:uploadStatus:image",((...t)=>this.uploadStatusChange(...t)))}uploadStatusChange(t,e,n){const o=this.editor;const i=e.item;const r=i.getAttribute("uploadId");if(!n.consumable.consume(e.item,t.name)){return}const s=o.plugins.get(TP);const a=r?e.attributeNewValue:null;const c=this.placeholder;const l=o.editing.mapper.toViewElement(i);const d=n.writer;if(a=="reading"){rI(l,d);aI(c,l,d);return}if(a=="uploading"){const t=s.loaders.get(r);rI(l,d);if(!t){aI(c,l,d)}else{cI(l,d);lI(l,d,t,o.editing.view);pI(l,d,t)}return}if(a=="complete"&&s.loaders.get(r)){uI(l,d,o.editing.view)}dI(l,d);cI(l,d);sI(l,d)}}function rI(t,e){if(!t.hasClass("ck-appear")){e.addClass("ck-appear",t)}}function sI(t,e){e.removeClass("ck-appear",t)}function aI(t,e,n){if(!e.hasClass("ck-image-upload-placeholder")){n.addClass("ck-image-upload-placeholder",e)}const o=lE(e);if(o.getAttribute("src")!==t){n.setAttribute("src",t,o)}if(!mI(e,"placeholder")){n.insert(n.createPositionAfter(o),fI(n))}}function cI(t,e){if(t.hasClass("ck-image-upload-placeholder")){e.removeClass("ck-image-upload-placeholder",t)}gI(t,e,"placeholder")}function lI(t,e,n,o){const i=hI(e);e.insert(e.createPositionAt(t,"end"),i);n.on("change:uploadedPercent",((t,e,n)=>{o.change((t=>{t.setStyle("width",n+"%",i)}))}))}function dI(t,e){gI(t,e,"progressBar")}function uI(t,e,n){const o=e.createUIElement("div",{class:"ck-image-upload-complete-icon"});e.insert(e.createPositionAt(t,"end"),o);setTimeout((()=>{n.change((t=>t.remove(t.createRangeOn(o))))}),3e3)}function hI(t){const e=t.createUIElement("div",{class:"ck-progress-bar"});t.setCustomProperty("progressBar",true,e);return e}function fI(t){const e=t.createUIElement("div",{class:"ck-upload-placeholder-loader"});t.setCustomProperty("placeholder",true,e);return e}function mI(t,e){for(const n of t.getChildren()){if(n.getCustomProperty(e)){return n}}}function gI(t,e,n){const o=mI(t,n);if(o){e.remove(e.createRangeOn(o))}}function pI(t,e,n){if(n.data){const o=lE(t);e.setAttribute("src",n.data,o)}}class bI extends jn{refresh(){const t=this.editor.model.document.selection.getSelectedElement();const e=t&&t.name==="image"||false;this.isEnabled=cE(this.editor.model)||e}execute(t){const e=this.editor;const n=e.model;const o=e.plugins.get(TP);for(const e of Ca(t.file)){kI(n,o,e)}}}function kI(t,e,n){const o=e.createLoader(n);if(!o){return}aE(t,{uploadId:o.id})}class wI extends Kn{static get requires(){return[TP,lA,$v]}static get pluginName(){return"ImageUploadEditing"}constructor(t){super(t);t.config.define("image",{upload:{types:["jpeg","png","gif","bmp","webp","tiff"]}})}init(){const t=this.editor;const e=t.model.document;const n=t.model.schema;const o=t.conversion;const i=t.plugins.get(TP);const r=MP(t.config.get("image.upload.types"));n.extend("image",{allowAttributes:["uploadId","uploadStatus"]});const s=new bI(t);t.commands.add("uploadImage",s);t.commands.add("imageUpload",s);o.for("upcast").attributeToAttribute({view:{name:"img",key:"uploadId"},model:"uploadId"});this.listenTo(t.editing.view.document,"clipboardInput",((e,n)=>{if(CI(n.dataTransfer)){return}const o=Array.from(n.dataTransfer.files).filter((t=>{if(!t){return false}return r.test(t.type)}));if(!o.length){return}e.stop();t.model.change((e=>{if(n.targetRanges){e.setSelection(n.targetRanges.map((e=>t.editing.mapper.toModelRange(e))))}t.model.enqueueChange("default",(()=>{t.execute("uploadImage",{file:o})}))}))}));this.listenTo(t.plugins.get("ClipboardPipeline"),"inputTransformation",((e,n)=>{const o=Array.from(t.editing.view.createRangeIn(n.content)).filter((t=>LP(t.item)&&!t.item.getAttribute("uploadProcessed"))).map((t=>({promise:VP(t.item),imageElement:t.item})));if(!o.length){return}const r=new S_(t.editing.view.document);for(const t of o){r.setAttribute("uploadProcessed",true,t.imageElement);const e=i.createLoader(t.promise);if(e){r.setAttribute("src","",t.imageElement);r.setAttribute("uploadId",e.id,t.imageElement)}}}));t.editing.view.document.on("dragover",((t,e)=>{e.preventDefault()}));e.on("change",(()=>{const n=e.differ.getChanges({includeChangesInGraveyard:true});for(const e of n){if(e.type=="insert"&&e.name!="$text"){const n=e.position.nodeAfter;const o=e.position.root.rootName=="$graveyard";for(const e of AI(t,n)){const t=e.getAttribute("uploadId");if(!t){continue}const n=i.loaders.get(t);if(!n){continue}if(o){n.abort()}else if(n.status=="idle"){this._readAndUpload(n,e)}}}}}))}_readAndUpload(t,e){const n=this.editor;const o=n.model;const i=n.locale.t;const r=n.plugins.get(TP);const s=n.plugins.get(lA);o.enqueueChange("transparent",(t=>{t.setAttribute("uploadStatus","reading",e)}));return t.read().then((()=>{const i=t.upload();if(Wl.isSafari){const t=n.editing.mapper.toViewElement(e);const o=lE(t);n.editing.view.once("render",(()=>{if(!o.parent){return}const t=n.editing.view.domConverter.mapViewToDom(o.parent);if(!t){return}const e=t.style.display;t.style.display="none";t._ckHack=t.offsetHeight;t.style.display=e}))}o.enqueueChange("transparent",(t=>{t.setAttribute("uploadStatus","uploading",e)}));return i})).then((t=>{o.enqueueChange("transparent",(n=>{n.setAttributes({uploadStatus:"complete",src:t.default},e);this._parseAndSetSrcsetAttributeOnImage(t,e,n)}));a()})).catch((n=>{if(t.status!=="error"&&t.status!=="aborted"){throw n}if(t.status=="error"&&n){s.showWarning(n,{title:i("Upload failed"),namespace:"upload"})}a();o.enqueueChange("transparent",(t=>{t.remove(e)}))}));function a(){o.enqueueChange("transparent",(t=>{t.removeAttribute("uploadId",e);t.removeAttribute("uploadStatus",e)}));r.destroyLoader(t)}}_parseAndSetSrcsetAttributeOnImage(t,e,n){let o=0;const i=Object.keys(t).filter((t=>{const e=parseInt(t,10);if(!isNaN(e)){o=Math.max(o,e);return true}})).map((e=>`${t[e]} ${e}w`)).join(", ");if(i!=""){n.setAttribute("srcset",{data:i,width:o},e)}}}function CI(t){return Array.from(t.types).includes("text/html")&&t.getData("text/html")!==""}function AI(t,e){return Array.from(t.model.createRangeOn(e)).filter((t=>t.item.is("element","image"))).map((t=>t.item))}class _I extends Kn{static get pluginName(){return"ImageUpload"}static get requires(){return[wI,jP,iI]}}var vI=n(54);var yI={injectType:"singletonStyleTag",attributes:{"data-cke":true}};yI.insert="head";yI.singleton=true;var xI=wk()(vI["a"],yI);var EI=vI["a"].locals||{};class DI extends yk{constructor(t,e={}){super(t);const n=this.bindTemplate;this.set("class",e.class||null);this.children=this.createCollection();if(e.children){e.children.forEach((t=>this.children.add(t)))}this.set("_role",null);this.set("_ariaLabelledBy",null);if(e.labelView){this.set({_role:"group",_ariaLabelledBy:e.labelView.id})}this.setTemplate({tag:"div",attributes:{class:["ck","ck-form__row",n.to("class")],role:n.to("_role"),"aria-labelledby":n.to("_ariaLabelledBy")},children:this.children})}}var SI=n(55);var BI={injectType:"singletonStyleTag",attributes:{"data-cke":true}};BI.insert="head";BI.singleton=true;var TI=wk()(SI["a"],BI);var PI=SI["a"].locals||{};class II extends yk{constructor(t,e){super(t);const{insertButtonView:n,cancelButtonView:o}=this._createActionButtons(t);this.insertButtonView=n;this.cancelButtonView=o;this.dropdownView=this._createDropdownView(t);this.set("imageURLInputValue","");this.focusTracker=new mf;this.keystrokes=new gf;this._focusables=new pk;this._focusCycler=new yw({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});this.set("_integrations",new ka);if(e){for(const[t,n]of Object.entries(e)){if(t==="insertImageViaUrl"){n.fieldView.bind("value").to(this,"imageURLInputValue",(t=>t||""));n.fieldView.on("input",(()=>{this.imageURLInputValue=n.fieldView.element.value.trim()}))}n.name=t;this._integrations.add(n)}}this.setTemplate({tag:"form",attributes:{class:["ck","ck-image-insert-form"],tabindex:"-1"},children:[...this._integrations,new DI(t,{children:[this.insertButtonView,this.cancelButtonView],class:"ck-image-insert-form__action-row"})]})}render(){super.render();gk({view:this});const t=[...this._integrations,this.insertButtonView,this.cancelButtonView];t.forEach((t=>{this._focusables.add(t);this.focusTracker.add(t.element)}));this.keystrokes.listenTo(this.element);const e=t=>t.stopPropagation();this.keystrokes.set("arrowright",e);this.keystrokes.set("arrowleft",e);this.keystrokes.set("arrowup",e);this.keystrokes.set("arrowdown",e);this.listenTo(t[0].element,"selectstart",((t,e)=>{e.stopPropagation()}),{priority:"high"})}getIntegration(t){return this._integrations.find((e=>e.name===t))}_createDropdownView(t){const e=t.t;const n=xC(t,Nw);const o=n.buttonView;const i=n.panelView;o.set({label:e("Insert image"),icon:hk.image,tooltip:true});i.extendTemplate({attributes:{class:"ck-image-insert__panel"}});return n}_createActionButtons(t){const e=t.t;const n=new fw(t);const o=new fw(t);n.set({label:e("Insert"),icon:hk.check,class:"ck-button-save",type:"submit",withText:true,isEnabled:this.imageURLInputValue});o.set({label:e("Cancel"),icon:hk.cancel,class:"ck-button-cancel",withText:true});n.bind("isEnabled").to(this,"imageURLInputValue",(t=>!!t));n.delegate("execute").to(this,"submit");o.delegate("execute").to(this,"cancel");return{insertButtonView:n,cancelButtonView:o}}focus(){this._focusCycler.focusFirst()}}function RI(t){const e=t.config.get("image.insert.integrations");const n=t.plugins.get("ImageInsertUI");const o={insertImageViaUrl:FI(t.locale)};if(!e){return o}if(e.find((t=>t==="openCKFinder"))&&t.ui.componentFactory.has("ckfinder")){const e=t.ui.componentFactory.create("ckfinder");e.set({withText:true,class:"ck-image-insert__ck-finder-button"});e.delegate("execute").to(n,"cancel");o.openCKFinder=e}return e.reduce(((e,n)=>{if(o[n]){e[n]=o[n]}else if(t.ui.componentFactory.has(n)){e[n]=t.ui.componentFactory.create(n)}return e}),{})}function FI(t){const e=t.t;const n=new sA(t,aA);n.set({label:e("Insert image via URL")});n.fieldView.placeholder="https://example.com/image.png";return n}class zI extends Kn{static get pluginName(){return"ImageInsertUI"}init(){const t=this.editor;const e=t=>this._createDropdownView(t);t.ui.componentFactory.add("insertImage",e);t.ui.componentFactory.add("imageInsert",e)}_createDropdownView(t){const e=this.editor;const n=new II(t,RI(e));const o=e.commands.get("uploadImage");const i=n.dropdownView;const r=i.buttonView;r.actionView=e.ui.componentFactory.create("uploadImage");r.actionView.extendTemplate({attributes:{class:"ck ck-button ck-splitbutton__action"}});return this._setUpDropdown(i,n,o)}_setUpDropdown(t,e,n){const o=this.editor;const i=o.t;const r=e.insertButtonView;const s=e.getIntegration("insertImageViaUrl");const a=t.panelView;t.bind("isEnabled").to(n);t.buttonView.once("open",(()=>{a.children.add(e)}));t.on("change:isOpen",(()=>{const n=o.model.document.selection.getSelectedElement();if(t.isOpen){e.focus();if(sE(n)){e.imageURLInputValue=n.getAttribute("src");r.label=i("Update");s.label=i("Update image URL")}else{e.imageURLInputValue="";r.label=i("Insert");s.label=i("Insert image via URL")}}}),{priority:"low"});e.delegate("submit","cancel").to(t);this.delegate("cancel").to(t);t.on("submit",(()=>{l();c()}));t.on("cancel",(()=>{l()}));function c(){const t=o.model.document.selection.getSelectedElement();if(sE(t)){o.model.change((n=>{n.setAttribute("src",e.imageURLInputValue,t);n.removeAttribute("srcset",t);n.removeAttribute("sizes",t)}))}else{o.execute("insertImage",{source:e.imageURLInputValue})}}function l(){o.editing.view.focus();t.isOpen=false}return t}}class OI extends Kn{static get pluginName(){return"ImageInsert"}static get requires(){return[_I,zI]}}class NI extends jn{constructor(t,e){super(t);this.defaultStyle=false;this.styles=e.reduce(((t,e)=>{t[e.name]=e;if(e.isDefault){this.defaultStyle=e.name}return t}),{})}refresh(){const t=this.editor.model.document.selection.getSelectedElement();this.isEnabled=sE(t);if(!t){this.value=false}else if(t.hasAttribute("imageStyle")){const e=t.getAttribute("imageStyle");this.value=this.styles[e]?e:false}else{this.value=this.defaultStyle}}execute(t){const e=t.value;const n=this.editor.model;const o=n.document.selection.getSelectedElement();n.change((t=>{if(this.styles[e].isDefault){t.removeAttribute("imageStyle",o)}else{t.setAttribute("imageStyle",e,o)}}))}}function MI(t){return(e,n,o)=>{if(!o.consumable.consume(n.item,e.name)){return}const i=LI(n.attributeNewValue,t);const r=LI(n.attributeOldValue,t);const s=o.mapper.toViewElement(n.item);const a=o.writer;if(r){a.removeClass(r.className,s)}if(i){a.addClass(i.className,s)}}}function VI(t){const e=t.filter((t=>!t.isDefault));return(t,n,o)=>{if(!n.modelRange){return}const i=n.viewItem;const r=ff(n.modelRange.getItems());if(r&&!o.schema.checkAttribute(r,"imageStyle")){return}for(const t of e){if(o.consumable.consume(i,{classes:t.className})){o.writer.setAttribute("imageStyle",t.name,r)}}}}function LI(t,e){for(const n of e){if(n.name===t){return n}}}const HI={full:{name:"full",title:"Full size image",icon:hk.objectFullWidth,isDefault:true},side:{name:"side",title:"Side image",icon:hk.objectRight,className:"image-style-side"},alignLeft:{name:"alignLeft",title:"Left aligned image",icon:hk.objectLeft,className:"image-style-align-left"},alignCenter:{name:"alignCenter",title:"Centered image",icon:hk.objectCenter,className:"image-style-align-center"},alignRight:{name:"alignRight",title:"Right aligned image",icon:hk.objectRight,className:"image-style-align-right"}};const KI={full:hk.objectFullWidth,left:hk.objectLeft,right:hk.objectRight,center:hk.objectCenter};function qI(t=[]){return t.map(jI)}function jI(t){if(typeof t=="string"){const e=t;if(HI[e]){t=Object.assign({},HI[e])}else{Object(u["b"])("image-style-not-found",{name:e});t={name:e}}}else if(HI[t.name]){const e=HI[t.name];const n=Object.assign({},t);for(const o in e){if(!Object.prototype.hasOwnProperty.call(t,o)){n[o]=e[o]}}t=n}if(typeof t.icon=="string"&&KI[t.icon]){t.icon=KI[t.icon]}return t}class WI extends Kn{static get pluginName(){return"ImageStyleEditing"}init(){const t=this.editor;const e=t.model.schema;const n=t.data;const o=t.editing;t.config.define("image.styles",["full","side"]);const i=qI(t.config.get("image.styles"));e.extend("image",{allowAttributes:"imageStyle"});const r=MI(i);o.downcastDispatcher.on("attribute:imageStyle:image",r);n.downcastDispatcher.on("attribute:imageStyle:image",r);n.upcastDispatcher.on("element:figure",VI(i),{priority:"low"});t.commands.add("imageStyle",new NI(t,i))}}var GI=n(56);var UI={injectType:"singletonStyleTag",attributes:{"data-cke":true}};UI.insert="head";UI.singleton=true;var $I=wk()(GI["a"],UI);var JI=GI["a"].locals||{};class YI extends Kn{static get pluginName(){return"ImageStyleUI"}get localizedDefaultStylesTitles(){const t=this.editor.t;return{"Full size image":t("Full size image"),"Side image":t("Side image"),"Left aligned image":t("Left aligned image"),"Centered image":t("Centered image"),"Right aligned image":t("Right aligned image")}}init(){const t=this.editor;const e=t.config.get("image.styles");const n=QI(qI(e),this.localizedDefaultStylesTitles);for(const t of n){this._createButton(t)}}_createButton(t){const e=this.editor;const n=`imageStyle:${t.name}`;e.ui.componentFactory.add(n,(n=>{const o=e.commands.get("imageStyle");const i=new fw(n);i.set({label:t.title,icon:t.icon,tooltip:true,isToggleable:true});i.bind("isEnabled").to(o,"isEnabled");i.bind("isOn").to(o,"value",(e=>e===t.name));this.listenTo(i,"execute",(()=>{e.execute("imageStyle",{value:t.name});e.editing.view.focus()}));return i}))}}function QI(t,e){for(const n of t){if(e[n.title]){n.title=e[n.title]}}return t}class XI extends Kn{static get requires(){return[WI,YI]}static get pluginName(){return"ImageStyle"}}class ZI extends Kn{static get requires(){return[Nx]}static get pluginName(){return"ImageToolbar"}afterInit(){const t=this.editor;const e=t.t;const n=t.plugins.get(Nx);n.register("image",{ariaLabel:e("Image toolbar"),items:t.config.get("image.toolbar")||[],getRelatedElement:rE})}}const tR="italic";class eR extends Kn{static get pluginName(){return"ItalicEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:tR});t.model.schema.setAttributeProperties(tR,{isFormatting:true,copyOnEnter:true});t.conversion.attributeToElement({model:tR,view:"i",upcastAlso:["em",{styles:{"font-style":"italic"}}]});t.commands.add(tR,new xS(t,tR));t.keystrokes.set("CTRL+I",tR)}}var nR='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m9.586 14.633.021.004c-.036.335.095.655.393.962.082.083.173.15.274.201h1.474a.6.6 0 1 1 0 1.2H5.304a.6.6 0 0 1 0-1.2h1.15c.474-.07.809-.182 1.005-.334.157-.122.291-.32.404-.597l2.416-9.55a1.053 1.053 0 0 0-.281-.823 1.12 1.12 0 0 0-.442-.296H8.15a.6.6 0 0 1 0-1.2h6.443a.6.6 0 1 1 0 1.2h-1.195c-.376.056-.65.155-.823.296-.215.175-.423.439-.623.79l-2.366 9.347z"/></svg>';const oR="italic";class iR extends Kn{static get pluginName(){return"ItalicUI"}init(){const t=this.editor;const e=t.t;t.ui.componentFactory.add(oR,(n=>{const o=t.commands.get(oR);const i=new fw(n);i.set({label:e("Italic"),icon:nR,keystroke:"CTRL+I",tooltip:true,isToggleable:true});i.bind("isOn","isEnabled").to(o,"value","isEnabled");this.listenTo(i,"execute",(()=>{t.execute(oR);t.editing.view.focus()}));return i}))}}class rR extends Kn{static get requires(){return[eR,iR]}static get pluginName(){return"Italic"}}class sR{constructor(){this._definitions=new Set}get length(){return this._definitions.size}add(t){if(Array.isArray(t)){t.forEach((t=>this._definitions.add(t)))}else{this._definitions.add(t)}}getDispatcher(){return t=>{t.on("attribute:linkHref",((t,e,n)=>{if(!n.consumable.test(e.item,"attribute:linkHref")){return}const o=n.writer;const i=o.document.selection;for(const t of this._definitions){const r=o.createAttributeElement("a",t.attributes,{priority:5});o.setCustomProperty("link",true,r);if(t.callback(e.attributeNewValue)){if(e.item.is("selection")){o.wrap(i.getFirstRange(),r)}else{o.wrap(n.mapper.toViewRange(e.range),r)}}else{o.unwrap(n.mapper.toViewRange(e.range),r)}}}),{priority:"high"})}}getDispatcherForLinkedImage(){return t=>{t.on("attribute:linkHref:image",((t,e,n)=>{const o=n.mapper.toViewElement(e.item);const i=Array.from(o.getChildren()).find((t=>t.name==="a"));for(const t of this._definitions){const o=La(t.attributes);if(t.callback(e.attributeNewValue)){for(const[t,e]of o){if(t==="class"){n.writer.addClass(e,i)}else{n.writer.setAttribute(t,e,i)}}}else{for(const[t,e]of o){if(t==="class"){n.writer.removeClass(e,i)}else{n.writer.removeAttribute(t,i)}}}}}))}}}class aR extends jn{constructor(t){super(t);this.manualDecorators=new ka;this.automaticDecorators=new sR}restoreManualDecoratorStates(){for(const t of this.manualDecorators){t.value=this._getDecoratorStateFromModel(t.id)}}refresh(){const t=this.editor.model;const e=t.document;const n=ff(e.selection.getSelectedBlocks());if(QD(n,t.schema)){this.value=n.getAttribute("linkHref");this.isEnabled=t.schema.checkAttribute(n,"linkHref")}else{this.value=e.selection.getAttribute("linkHref");this.isEnabled=t.schema.checkAttributeInSelection(e.selection,"linkHref")}for(const t of this.manualDecorators){t.value=this._getDecoratorStateFromModel(t.id)}}execute(t,e={}){const n=this.editor.model;const o=n.document.selection;const i=[];const r=[];for(const t in e){if(e[t]){i.push(t)}else{r.push(t)}}n.change((e=>{if(o.isCollapsed){const s=o.getFirstPosition();if(o.hasAttribute("linkHref")){const a=JE(s,"linkHref",o.getAttribute("linkHref"),n);e.setAttribute("linkHref",t,a);i.forEach((t=>{e.setAttribute(t,true,a)}));r.forEach((t=>{e.removeAttribute(t,a)}));e.setSelection(e.createPositionAfter(a.end.nodeBefore))}else if(t!==""){const r=La(o.getAttributes());r.set("linkHref",t);i.forEach((t=>{r.set(t,true)}));const{end:a}=n.insertContent(e.createText(t,r),s);e.setSelection(a)}["linkHref",...i,...r].forEach((t=>{e.removeSelectionAttribute(t)}))}else{const s=n.schema.getValidRanges(o.getRanges(),"linkHref");const a=[];for(const t of o.getSelectedBlocks()){if(n.schema.checkAttribute(t,"linkHref")){a.push(e.createRangeOn(t))}}const c=a.slice();for(const t of s){if(this._isRangeToUpdate(t,a)){c.push(t)}}for(const n of c){e.setAttribute("linkHref",t,n);i.forEach((t=>{e.setAttribute(t,true,n)}));r.forEach((t=>{e.removeAttribute(t,n)}))}}}))}_getDecoratorStateFromModel(t){const e=this.editor.model;const n=e.document;const o=ff(n.selection.getSelectedBlocks());if(QD(o,e.schema)){return o.getAttribute(t)}return n.selection.getAttribute(t)}_isRangeToUpdate(t,e){for(const n of e){if(n.containsRange(t)){return false}}return true}}class cR extends jn{refresh(){const t=this.editor.model;const e=t.document;const n=ff(e.selection.getSelectedBlocks());if(QD(n,t.schema)){this.isEnabled=t.schema.checkAttribute(n,"linkHref")}else{this.isEnabled=t.schema.checkAttributeInSelection(e.selection,"linkHref")}}execute(){const t=this.editor;const e=this.editor.model;const n=e.document.selection;const o=t.commands.get("link");e.change((t=>{const i=n.isCollapsed?[JE(n.getFirstPosition(),"linkHref",n.getAttribute("linkHref"),e)]:e.schema.getValidRanges(n.getRanges(),"linkHref");for(const e of i){t.removeAttribute("linkHref",e);if(o){for(const n of o.manualDecorators){t.removeAttribute(n.id,e)}}}}))}}class lR{constructor({id:t,label:e,attributes:n,defaultValue:o}){this.id=t;this.set("value");this.defaultValue=o;this.label=e;this.attributes=n}}Hn(lR,Tn);var dR=n(57);var uR={injectType:"singletonStyleTag",attributes:{"data-cke":true}};uR.insert="head";uR.singleton=true;var hR=wk()(dR["a"],uR);var fR=dR["a"].locals||{};const mR="ck-link_selected";const gR="automatic";const pR="manual";const bR=/^(https?:)?\/\//;class kR extends Kn{static get pluginName(){return"LinkEditing"}static get requires(){return[BE,xE,$v]}constructor(t){super(t);t.config.define("link",{addTargetToExternalLinks:false})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"linkHref"});t.conversion.for("dataDowncast").attributeToElement({model:"linkHref",view:GD});t.conversion.for("editingDowncast").attributeToElement({model:"linkHref",view:(t,e)=>GD(UD(t),e)});t.conversion.for("upcast").elementToAttribute({view:{name:"a",attributes:{href:true}},model:{key:"linkHref",value:t=>t.getAttribute("href")}});t.commands.add("link",new aR(t));t.commands.add("unlink",new cR(t));const e=JD(t.t,YD(t.config.get("link.decorators")));this._enableAutomaticDecorators(e.filter((t=>t.mode===gR)));this._enableManualDecorators(e.filter((t=>t.mode===pR)));const n=t.plugins.get(BE);n.registerAttribute("linkHref");QE(t,"linkHref","a",mR);this._enableInsertContentSelectionAttributesFixer();this._enableClickingAfterLink();this._enableTypingOverLink();this._handleDeleteContentAfterLink()}_enableAutomaticDecorators(t){const e=this.editor;const n=e.commands.get("link");const o=n.automaticDecorators;if(e.config.get("link.addTargetToExternalLinks")){o.add({id:"linkIsExternal",mode:gR,callback:t=>bR.test(t),attributes:{target:"_blank",rel:"noopener noreferrer"}})}o.add(t);if(o.length){e.conversion.for("downcast").add(o.getDispatcher())}}_enableManualDecorators(t){if(!t.length){return}const e=this.editor;const n=e.commands.get("link");const o=n.manualDecorators;t.forEach((t=>{e.model.schema.extend("$text",{allowAttributes:t.id});o.add(new lR(t));e.conversion.for("downcast").attributeToElement({model:t.id,view:(e,{writer:n})=>{if(e){const e=o.get(t.id).attributes;const i=n.createAttributeElement("a",e,{priority:5});n.setCustomProperty("link",true,i);return i}}});e.conversion.for("upcast").elementToAttribute({view:{name:"a",attributes:o.get(t.id).attributes},model:{key:t.id}})}))}_enableInsertContentSelectionAttributesFixer(){const t=this.editor;const e=t.model;const n=e.document.selection;const o=t.commands.get("link");this.listenTo(e,"insertContent",(()=>{const t=n.anchor.nodeBefore;const i=n.anchor.nodeAfter;if(!n.hasAttribute("linkHref")){return}if(!t){return}if(!t.hasAttribute("linkHref")){return}if(i&&i.hasAttribute("linkHref")){return}e.change((t=>{wR(t,o.manualDecorators)}))}),{priority:"low"})}_enableClickingAfterLink(){const t=this.editor;const e=t.commands.get("link");t.editing.view.addObserver(D_);let n=false;this.listenTo(t.editing.view.document,"mousedown",(()=>{n=true}));this.listenTo(t.editing.view.document,"selectionChange",(()=>{if(!n){return}n=false;const o=t.model.document.selection;if(!o.isCollapsed){return}if(!o.hasAttribute("linkHref")){return}const i=o.getFirstPosition();const r=JE(i,"linkHref",o.getAttribute("linkHref"),t.model);if(i.isTouching(r.start)||i.isTouching(r.end)){t.model.change((t=>{wR(t,e.manualDecorators)}))}}))}_enableTypingOverLink(){const t=this.editor;const e=t.editing.view;let n;let o;this.listenTo(e.document,"delete",(()=>{o=true}),{priority:"high"});this.listenTo(t.model,"deleteContent",(()=>{const e=t.model.document.selection;if(e.isCollapsed){return}if(o){o=false;return}if(!AR(t)){return}if(CR(t.model)){n=e.getAttributes()}}),{priority:"high"});this.listenTo(t.model,"insertContent",((e,[i])=>{o=false;if(!AR(t)){return}if(!n){return}t.model.change((t=>{for(const[e,o]of n){t.setAttribute(e,o,i)}}));n=null}),{priority:"high"})}_handleDeleteContentAfterLink(){const t=this.editor;const e=t.model;const n=e.document.selection;const o=t.editing.view;const i=t.commands.get("link");let r=false;let s=false;this.listenTo(o.document,"delete",((t,e)=>{s=e.domEvent.keyCode===td.backspace}),{priority:"high"});this.listenTo(e,"deleteContent",(()=>{r=false;const t=n.getFirstPosition();const o=n.getAttribute("linkHref");if(!o){return}const i=JE(t,"linkHref",o,e);r=i.containsPosition(t)||i.end.isEqual(t)}),{priority:"high"});this.listenTo(e,"deleteContent",(()=>{if(!s){return}s=false;if(r){return}t.model.enqueueChange((t=>{wR(t,i.manualDecorators)}))}),{priority:"low"})}}function wR(t,e){t.removeSelectionAttribute("linkHref");for(const n of e){t.removeSelectionAttribute(n.id)}}function CR(t){const e=t.document.selection;const n=e.getFirstPosition();const o=e.getLastPosition();const i=n.nodeAfter;if(!i){return false}if(!i.is("$text")){return false}if(!i.hasAttribute("linkHref")){return false}const r=o.textNode||o.nodeBefore;if(i===r){return true}const s=JE(n,"linkHref",i.getAttribute("linkHref"),t);return s.containsRange(t.createRange(n,o),true)}function AR(t){const e=t.plugins.get("Input");return e.isInput(t.model.change((t=>t.batch)))}var _R=n(58);var vR={injectType:"singletonStyleTag",attributes:{"data-cke":true}};vR.insert="head";vR.singleton=true;var yR=wk()(_R["a"],vR);var xR=_R["a"].locals||{};class ER extends yk{constructor(t,e){super(t);const n=t.t;this.focusTracker=new mf;this.keystrokes=new gf;this.urlInputView=this._createUrlInput();this.saveButtonView=this._createButton(n("Save"),hk.check,"ck-button-save");this.saveButtonView.type="submit";this.cancelButtonView=this._createButton(n("Cancel"),hk.cancel,"ck-button-cancel","cancel");this._manualDecoratorSwitches=this._createManualDecoratorSwitches(e);this.children=this._createFormChildren(e.manualDecorators);this._focusables=new pk;this._focusCycler=new yw({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});const o=["ck","ck-link-form","ck-responsive-form"];if(e.manualDecorators.length){o.push("ck-link-form_layout-vertical","ck-vertical-form")}this.setTemplate({tag:"form",attributes:{class:o,tabindex:"-1"},children:this.children});mk(this)}getDecoratorSwitchesState(){return Array.from(this._manualDecoratorSwitches).reduce(((t,e)=>{t[e.name]=e.isOn;return t}),{})}render(){super.render();gk({view:this});const t=[this.urlInputView,...this._manualDecoratorSwitches,this.saveButtonView,this.cancelButtonView];t.forEach((t=>{this._focusables.add(t);this.focusTracker.add(t.element)}));this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}_createUrlInput(){const t=this.locale.t;const e=new sA(this.locale,aA);e.label=t("Link URL");return e}_createButton(t,e,n,o){const i=new fw(this.locale);i.set({label:t,icon:e,tooltip:true});i.extendTemplate({attributes:{class:n}});if(o){i.delegate("execute").to(this,o)}return i}_createManualDecoratorSwitches(t){const e=this.createCollection();for(const n of t.manualDecorators){const o=new kw(this.locale);o.set({name:n.id,label:n.label,withText:true});o.bind("isOn").toMany([n,t],"value",((t,e)=>e===undefined&&t===undefined?n.defaultValue:t));o.on("execute",(()=>{n.set("value",!o.isOn)}));e.add(o)}return e}_createFormChildren(t){const e=this.createCollection();e.add(this.urlInputView);if(t.length){const t=new yk;t.setTemplate({tag:"ul",children:this._manualDecoratorSwitches.map((t=>({tag:"li",children:[t],attributes:{class:["ck","ck-list__item"]}}))),attributes:{class:["ck","ck-reset","ck-list"]}});e.add(t)}e.add(this.saveButtonView);e.add(this.cancelButtonView);return e}}var DR=n(59);var SR={injectType:"singletonStyleTag",attributes:{"data-cke":true}};SR.insert="head";SR.singleton=true;var BR=wk()(DR["a"],SR);var TR=DR["a"].locals||{};var PR='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.077 15 .991-1.416a.75.75 0 1 1 1.229.86l-1.148 1.64a.748.748 0 0 1-.217.206 5.251 5.251 0 0 1-8.503-5.955.741.741 0 0 1 .12-.274l1.147-1.639a.75.75 0 1 1 1.228.86L4.933 10.7l.006.003a3.75 3.75 0 0 0 6.132 4.294l.006.004zm5.494-5.335a.748.748 0 0 1-.12.274l-1.147 1.639a.75.75 0 1 1-1.228-.86l.86-1.23a3.75 3.75 0 0 0-6.144-4.301l-.86 1.229a.75.75 0 0 1-1.229-.86l1.148-1.64a.748.748 0 0 1 .217-.206 5.251 5.251 0 0 1 8.503 5.955zm-4.563-2.532a.75.75 0 0 1 .184 1.045l-3.155 4.505a.75.75 0 1 1-1.229-.86l3.155-4.506a.75.75 0 0 1 1.045-.184zm4.919 10.562-1.414 1.414a.75.75 0 1 1-1.06-1.06l1.414-1.415-1.415-1.414a.75.75 0 0 1 1.061-1.06l1.414 1.414 1.414-1.415a.75.75 0 0 1 1.061 1.061l-1.414 1.414 1.414 1.415a.75.75 0 0 1-1.06 1.06l-1.415-1.414z"/></svg>';class IR extends yk{constructor(t){super(t);const e=t.t;this.focusTracker=new mf;this.keystrokes=new gf;this.previewButtonView=this._createPreviewButton();this.unlinkButtonView=this._createButton(e("Unlink"),PR,"unlink");this.editButtonView=this._createButton(e("Edit link"),hk.pencil,"edit");this.set("href");this._focusables=new pk;this._focusCycler=new yw({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});this.setTemplate({tag:"div",attributes:{class:["ck","ck-link-actions","ck-responsive-form"],tabindex:"-1"},children:[this.previewButtonView,this.editButtonView,this.unlinkButtonView]})}render(){super.render();const t=[this.previewButtonView,this.editButtonView,this.unlinkButtonView];t.forEach((t=>{this._focusables.add(t);this.focusTracker.add(t.element)}));this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}_createButton(t,e,n){const o=new fw(this.locale);o.set({label:t,icon:e,tooltip:true});o.delegate("execute").to(this,n);return o}_createPreviewButton(){const t=new fw(this.locale);const e=this.bindTemplate;const n=this.t;t.set({withText:true,tooltip:n("Open link in new tab")});t.extendTemplate({attributes:{class:["ck","ck-link-actions__preview"],href:e.to("href",(t=>t&&UD(t))),target:"_blank",rel:"noopener noreferrer"}});t.bind("label").to(this,"href",(t=>t||n("This link has no URL")));t.bind("isEnabled").to(this,"href",(t=>!!t));t.template.tag="a";t.template.eventListeners={};return t}}var RR='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.077 15 .991-1.416a.75.75 0 1 1 1.229.86l-1.148 1.64a.748.748 0 0 1-.217.206 5.251 5.251 0 0 1-8.503-5.955.741.741 0 0 1 .12-.274l1.147-1.639a.75.75 0 1 1 1.228.86L4.933 10.7l.006.003a3.75 3.75 0 0 0 6.132 4.294l.006.004zm5.494-5.335a.748.748 0 0 1-.12.274l-1.147 1.639a.75.75 0 1 1-1.228-.86l.86-1.23a3.75 3.75 0 0 0-6.144-4.301l-.86 1.229a.75.75 0 0 1-1.229-.86l1.148-1.64a.748.748 0 0 1 .217-.206 5.251 5.251 0 0 1 8.503 5.955zm-4.563-2.532a.75.75 0 0 1 .184 1.045l-3.155 4.505a.75.75 0 1 1-1.229-.86l3.155-4.506a.75.75 0 0 1 1.045-.184z"/></svg>';const FR="link-ui";class zR extends Kn{static get requires(){return[IA]}static get pluginName(){return"LinkUI"}init(){const t=this.editor;t.editing.view.addObserver(E_);this.actionsView=this._createActionsView();this.formView=this._createFormView();this._balloon=t.plugins.get(IA);this._createToolbarLinkButton();this._enableUserBalloonInteractions();t.conversion.for("editingDowncast").markerToHighlight({model:FR,view:{classes:["ck-fake-link-selection"]}});t.conversion.for("editingDowncast").markerToElement({model:FR,view:{name:"span",classes:["ck-fake-link-selection","ck-fake-link-selection_collapsed"]}})}destroy(){super.destroy();this.formView.destroy()}_createActionsView(){const t=this.editor;const e=new IR(t.locale);const n=t.commands.get("link");const o=t.commands.get("unlink");e.bind("href").to(n,"value");e.editButtonView.bind("isEnabled").to(n);e.unlinkButtonView.bind("isEnabled").to(o);this.listenTo(e,"edit",(()=>{this._addFormView()}));this.listenTo(e,"unlink",(()=>{t.execute("unlink");this._hideUI()}));e.keystrokes.set("Esc",((t,e)=>{this._hideUI();e()}));e.keystrokes.set(jD,((t,e)=>{this._addFormView();e()}));return e}_createFormView(){const t=this.editor;const e=t.commands.get("link");const n=t.config.get("link.defaultProtocol");const o=new ER(t.locale,e);o.urlInputView.fieldView.bind("value").to(e,"value");o.urlInputView.bind("isReadOnly").to(e,"isEnabled",(t=>!t));o.saveButtonView.bind("isEnabled").to(e);this.listenTo(o,"submit",(()=>{const{value:e}=o.urlInputView.fieldView.element;const i=ZD(e,n);t.execute("link",i,o.getDecoratorSwitchesState());this._closeFormView()}));this.listenTo(o,"cancel",(()=>{this._closeFormView()}));o.keystrokes.set("Esc",((t,e)=>{this._closeFormView();e()}));return o}_createToolbarLinkButton(){const t=this.editor;const e=t.commands.get("link");const n=t.t;t.keystrokes.set(jD,((t,n)=>{n();if(e.isEnabled){this._showUI(true)}}));t.ui.componentFactory.add("link",(t=>{const o=new fw(t);o.isEnabled=true;o.label=n("Link");o.icon=RR;o.keystroke=jD;o.tooltip=true;o.isToggleable=true;o.bind("isEnabled").to(e,"isEnabled");o.bind("isOn").to(e,"value",(t=>!!t));this.listenTo(o,"execute",(()=>this._showUI(true)));return o}))}_enableUserBalloonInteractions(){const t=this.editor.editing.view.document;this.listenTo(t,"click",(()=>{const t=this._getSelectedLinkElement();if(t){this._showUI()}}));this.editor.keystrokes.set("Tab",((t,e)=>{if(this._areActionsVisible&&!this.actionsView.focusTracker.isFocused){this.actionsView.focus();e()}}),{priority:"high"});this.editor.keystrokes.set("Esc",((t,e)=>{if(this._isUIVisible){this._hideUI();e()}}));fk({emitter:this.formView,activator:()=>this._isUIInPanel,contextElements:[this._balloon.view.element],callback:()=>this._hideUI()})}_addActionsView(){if(this._areActionsInPanel){return}this._balloon.add({view:this.actionsView,position:this._getBalloonPositionData()})}_addFormView(){if(this._isFormInPanel){return}const t=this.editor;const e=t.commands.get("link");this.formView.disableCssTransitions();this._balloon.add({view:this.formView,position:this._getBalloonPositionData()});if(this._balloon.visibleView===this.formView){this.formView.urlInputView.fieldView.select()}this.formView.enableCssTransitions();this.formView.urlInputView.fieldView.element.value=e.value||""}_closeFormView(){const t=this.editor.commands.get("link");t.restoreManualDecoratorStates();if(t.value!==undefined){this._removeFormView()}else{this._hideUI()}}_removeFormView(){if(this._isFormInPanel){this.formView.saveButtonView.focus();this._balloon.remove(this.formView);this.editor.editing.view.focus();this._hideFakeVisualSelection()}}_showUI(t=false){if(!this._getSelectedLinkElement()){this._showFakeVisualSelection();this._addActionsView();if(t){this._balloon.showStack("main")}this._addFormView()}else{if(this._areActionsVisible){this._addFormView()}else{this._addActionsView()}if(t){this._balloon.showStack("main")}}this._startUpdatingUI()}_hideUI(){if(!this._isUIInPanel){return}const t=this.editor;this.stopListening(t.ui,"update");this.stopListening(this._balloon,"change:visibleView");t.editing.view.focus();this._removeFormView();this._balloon.remove(this.actionsView);this._hideFakeVisualSelection()}_startUpdatingUI(){const t=this.editor;const e=t.editing.view.document;let n=this._getSelectedLinkElement();let o=r();const i=()=>{const t=this._getSelectedLinkElement();const e=r();if(n&&!t||!n&&e!==o){this._hideUI()}else if(this._isUIVisible){this._balloon.updatePosition(this._getBalloonPositionData())}n=t;o=e};function r(){return e.selection.focus.getAncestors().reverse().find((t=>t.is("element")))}this.listenTo(t.ui,"update",i);this.listenTo(this._balloon,"change:visibleView",i)}get _isFormInPanel(){return this._balloon.hasView(this.formView)}get _areActionsInPanel(){return this._balloon.hasView(this.actionsView)}get _areActionsVisible(){return this._balloon.visibleView===this.actionsView}get _isUIInPanel(){return this._isFormInPanel||this._areActionsInPanel}get _isUIVisible(){const t=this._balloon.visibleView;return t==this.formView||this._areActionsVisible}_getBalloonPositionData(){const t=this.editor.editing.view;const e=this.editor.model;const n=t.document;let o=null;if(e.markers.has(FR)){const e=Array.from(this.editor.editing.mapper.markerNameToElements(FR));const n=t.createRange(t.createPositionBefore(e[0]),t.createPositionAfter(e[e.length-1]));o=t.domConverter.viewRangeToDom(n)}else{const e=this._getSelectedLinkElement();const i=n.selection.getFirstRange();o=e?t.domConverter.mapViewToDom(e):t.domConverter.viewRangeToDom(i)}return{target:o}}_getSelectedLinkElement(){const t=this.editor.editing.view;const e=t.document.selection;if(e.isCollapsed){return OR(e.getFirstPosition())}else{const n=e.getFirstRange().getTrimmed();const o=OR(n.start);const i=OR(n.end);if(!o||o!=i){return null}if(t.createRangeIn(o).getTrimmed().isEqual(n)){return o}else{return null}}}_showFakeVisualSelection(){const t=this.editor.model;t.change((e=>{const n=t.document.selection.getFirstRange();if(t.markers.has(FR)){e.updateMarker(FR,{range:n})}else{if(n.start.isAtEnd){const o=n.start.getLastMatchingPosition((({item:e})=>!t.schema.isContent(e)),{boundaries:n});e.addMarker(FR,{usingOperation:false,affectsData:false,range:e.createRange(o,n.end)})}else{e.addMarker(FR,{usingOperation:false,affectsData:false,range:n})}}}))}_hideFakeVisualSelection(){const t=this.editor.model;if(t.markers.has(FR)){t.change((t=>{t.removeMarker(FR)}))}}}function OR(t){return t.getAncestors().find((t=>WD(t)))}class NR extends Kn{static get requires(){return[kR,zR,oS]}static get pluginName(){return"Link"}}class MR extends Kn{static get requires(){return["ImageEditing",kR]}static get pluginName(){return"LinkImageEditing"}init(){const t=this.editor;t.model.schema.extend("image",{allowAttributes:["linkHref"]});t.conversion.for("upcast").add(VR());t.conversion.for("editingDowncast").add(LR({attachIconIndicator:true}));t.conversion.for("dataDowncast").add(LR({attachIconIndicator:false}));this._enableAutomaticDecorators();this._enableManualDecorators()}_enableAutomaticDecorators(){const t=this.editor;const e=t.commands.get("link");const n=e.automaticDecorators;if(n.length){t.conversion.for("downcast").add(n.getDispatcherForLinkedImage())}}_enableManualDecorators(){const t=this.editor;const e=t.commands.get("link");const n=e.manualDecorators;for(const o of e.manualDecorators){t.model.schema.extend("image",{allowAttributes:o.id});t.conversion.for("downcast").add(HR(n,o));t.conversion.for("upcast").add(KR(n,o))}}}function VR(){return t=>{t.on("element:a",((t,e,n)=>{const o=e.viewItem;const i=qR(o);if(!i){return}const r={attributes:["href"]};if(!n.consumable.consume(o,r)){return}const s=o.getAttribute("href");if(!s){return}let a=e.modelCursor.parent;if(!a.is("element","image")){const t=n.convertItem(i,e.modelCursor);e.modelRange=t.modelRange;e.modelCursor=t.modelCursor;a=e.modelCursor.nodeBefore}if(a&&a.is("element","image")){n.writer.setAttribute("linkHref",s,a)}}),{priority:"high"})}}function LR(t){return e=>{e.on("attribute:linkHref:image",((e,n,o)=>{const i=o.mapper.toViewElement(n.item);const r=o.writer;const s=Array.from(i.getChildren()).find((t=>t.name==="a"));let a;if(t.attachIconIndicator){a=r.createUIElement("span",{class:"ck ck-link-image_icon"},(function(t){const e=this.toDomElement(t);e.innerHTML=RR;return e}))}if(s){if(n.attributeNewValue){r.setAttribute("href",n.attributeNewValue,s)}else{const t=Array.from(s.getChildren()).find((t=>t.name==="img"));r.move(r.createRangeOn(t),r.createPositionAt(i,0));r.remove(s)}}else{const t=r.createContainerElement("a",{href:n.attributeNewValue});r.insert(r.createPositionAt(i,0),t);r.move(r.createRangeOn(i.getChild(1)),r.createPositionAt(t,0));if(a){r.insert(r.createPositionAt(t,"end"),a)}}}))}}function HR(t,e){return n=>{n.on(`attribute:${e.id}:image`,((n,o,i)=>{const r=t.get(e.id).attributes;const s=i.mapper.toViewElement(o.item);const a=Array.from(s.getChildren()).find((t=>t.name==="a"));if(!a){return}for(const[t,e]of La(r)){i.writer.setAttribute(t,e,a)}}))}}function KR(t,e){return n=>{n.on("element:a",((n,o,i)=>{const r=o.viewItem;const s=qR(r);if(!s){return}const a={attributes:t.get(e.id).attributes};const c=new Ha(a);const l=c.match(r);if(!l){return}if(!i.consumable.consume(r,l.match)){return}const d=o.modelCursor.nodeBefore||o.modelCursor.parent;i.writer.setAttribute(e.id,true,d)}),{priority:"high"})}}function qR(t){return Array.from(t.getChildren()).find((t=>t.name==="img"))}class jR extends Kn{static get requires(){return[kR,zR,"Image"]}static get pluginName(){return"LinkImageUI"}init(){const t=this.editor;const e=t.editing.view.document;this.listenTo(e,"click",((n,o)=>{const i=WR(e.selection.getSelectedElement(),t.plugins.get("Image"));if(i){o.preventDefault()}}));this._createToolbarLinkImageButton()}_createToolbarLinkImageButton(){const t=this.editor;const e=t.t;t.ui.componentFactory.add("linkImage",(n=>{const o=new fw(n);const i=t.plugins.get("LinkUI");const r=t.commands.get("link");o.set({isEnabled:true,label:e("Link image"),icon:RR,keystroke:jD,tooltip:true,isToggleable:true});o.bind("isEnabled").to(r,"isEnabled");o.bind("isOn").to(r,"value",(t=>!!t));this.listenTo(o,"execute",(()=>{const e=WR(t.editing.view.document.selection.getSelectedElement(),t.plugins.get("Image"));if(e){i._addActionsView()}else{i._showUI(true)}}));return o}))}}function WR(t,e){const n=t&&e.isImageWidget(t);if(!n){return false}return t.getChild(0).is("element","a")}var GR=n(60);var UR={injectType:"singletonStyleTag",attributes:{"data-cke":true}};UR.insert="head";UR.singleton=true;var $R=wk()(GR["a"],UR);var JR=GR["a"].locals||{};class YR extends Kn{static get requires(){return[MR,jR]}static get pluginName(){return"LinkImage"}}class QR extends jn{constructor(t,e){super(t);this.type=e}refresh(){this.value=this._getValue();this.isEnabled=this._checkEnabled()}execute(){const t=this.editor.model;const e=t.document;const n=Array.from(e.selection.getSelectedBlocks()).filter((e=>ZR(e,t.schema)));const o=this.value===true;t.change((t=>{if(o){let e=n[n.length-1].nextSibling;let o=Number.POSITIVE_INFINITY;let i=[];while(e&&e.name=="listItem"&&e.getAttribute("listIndent")!==0){const t=e.getAttribute("listIndent");if(t<o){o=t}const n=t-o;i.push({element:e,listIndent:n});e=e.nextSibling}i=i.reverse();for(const e of i){t.setAttribute("listIndent",e.listIndent,e.element)}}if(!o){let t=Number.POSITIVE_INFINITY;for(const e of n){if(e.is("element","listItem")&&e.getAttribute("listIndent")<t){t=e.getAttribute("listIndent")}}t=t===0?1:t;XR(n,true,t);XR(n,false,t)}for(const e of n.reverse()){if(o&&e.name=="listItem"){t.rename(e,"paragraph")}else if(!o&&e.name!="listItem"){t.setAttributes({listType:this.type,listIndent:0},e);t.rename(e,"listItem")}else if(!o&&e.name=="listItem"&&e.getAttribute("listType")!=this.type){t.setAttribute("listType",this.type,e)}}this.fire("_executeCleanup",n)}))}_getValue(){const t=ff(this.editor.model.document.selection.getSelectedBlocks());return!!t&&t.is("element","listItem")&&t.getAttribute("listType")==this.type}_checkEnabled(){if(this.value){return true}const t=this.editor.model.document.selection;const e=this.editor.model.schema;const n=ff(t.getSelectedBlocks());if(!n){return false}return ZR(n,e)}}function XR(t,e,n){const o=e?t[0]:t[t.length-1];if(o.is("element","listItem")){let i=o[e?"previousSibling":"nextSibling"];let r=o.getAttribute("listIndent");while(i&&i.is("element","listItem")&&i.getAttribute("listIndent")>=n){if(r>i.getAttribute("listIndent")){r=i.getAttribute("listIndent")}if(i.getAttribute("listIndent")==r){t[e?"unshift":"push"](i)}i=i[e?"previousSibling":"nextSibling"]}}}function ZR(t,e){return e.checkChild(t.parent,"listItem")&&!e.isObject(t)}class tF extends jn{constructor(t,e){super(t);this._indentBy=e=="forward"?1:-1}refresh(){this.isEnabled=this._checkEnabled()}execute(){const t=this.editor.model;const e=t.document;let n=Array.from(e.selection.getSelectedBlocks());t.change((t=>{const e=n[n.length-1];let o=e.nextSibling;while(o&&o.name=="listItem"&&o.getAttribute("listIndent")>e.getAttribute("listIndent")){n.push(o);o=o.nextSibling}if(this._indentBy<0){n=n.reverse()}for(const e of n){const n=e.getAttribute("listIndent")+this._indentBy;if(n<0){t.rename(e,"paragraph")}else{t.setAttribute("listIndent",n,e)}}this.fire("_executeCleanup",n)}))}_checkEnabled(){const t=ff(this.editor.model.document.selection.getSelectedBlocks());if(!t||!t.is("element","listItem")){return false}if(this._indentBy>0){const e=t.getAttribute("listIndent");const n=t.getAttribute("listType");let o=t.previousSibling;while(o&&o.is("element","listItem")&&o.getAttribute("listIndent")>=e){if(o.getAttribute("listIndent")==e){return o.getAttribute("listType")==n}o=o.previousSibling}return false}return true}}function eF(t){const e=t.createContainerElement("li");e.getFillerOffset=dF;return e}function nF(t,e){const n=e.mapper;const o=e.writer;const i=t.getAttribute("listType")=="numbered"?"ol":"ul";const r=eF(o);const s=o.createContainerElement(i,null);o.insert(o.createPositionAt(s,0),r);n.bindElements(t,r);return r}function oF(t,e,n,o){const i=e.parent;const r=n.mapper;const s=n.writer;let a=r.toViewPosition(o.createPositionBefore(t));const c=sF(t.previousSibling,{sameIndent:true,smallerIndent:true,listIndent:t.getAttribute("listIndent")});const l=t.previousSibling;if(c&&c.getAttribute("listIndent")==t.getAttribute("listIndent")){const t=r.toViewElement(c);a=s.breakContainer(s.createPositionAfter(t))}else{if(l&&l.name=="listItem"){a=r.toViewPosition(o.createPositionAt(l,"end"));const t=r.findMappedViewAncestor(a);const e=cF(t);if(e){a=s.createPositionBefore(e)}else{a=s.createPositionAt(t,"end")}}else{a=r.toViewPosition(o.createPositionBefore(t))}}a=rF(a);s.insert(a,i);if(l&&l.name=="listItem"){const t=r.toViewElement(l);const n=s.createRange(s.createPositionAt(t,0),a);const o=n.getWalker({ignoreElementEnd:true});for(const t of o){if(t.item.is("element","li")){const n=s.breakContainer(s.createPositionBefore(t.item));const i=t.item.parent;const r=s.createPositionAt(e,"end");iF(s,r.nodeBefore,r.nodeAfter);s.move(s.createRangeOn(i),r);o.position=n}}}else{const n=i.nextSibling;if(n&&(n.is("element","ul")||n.is("element","ol"))){let o=null;for(const e of n.getChildren()){const n=r.toModelElement(e);if(n&&n.getAttribute("listIndent")>t.getAttribute("listIndent")){o=e}else{break}}if(o){s.breakContainer(s.createPositionAfter(o));s.move(s.createRangeOn(o.parent),s.createPositionAt(e,"end"))}}}iF(s,i,i.nextSibling);iF(s,i.previousSibling,i)}function iF(t,e,n){if(!e||!n||e.name!="ul"&&e.name!="ol"){return null}if(e.name!=n.name||e.getAttribute("class")!==n.getAttribute("class")){return null}return t.mergeContainers(t.createPositionAfter(e))}function rF(t){return t.getLastMatchingPosition((t=>t.item.is("uiElement")))}function sF(t,e){const n=!!e.sameIndent;const o=!!e.smallerIndent;const i=e.listIndent;let r=t;while(r&&r.name=="listItem"){const t=r.getAttribute("listIndent");if(n&&i==t||o&&i>t){return r}if(e.direction==="forward"){r=r.nextSibling}else{r=r.previousSibling}}return null}function aF(t,e,n,o){t.ui.componentFactory.add(e,(i=>{const r=t.commands.get(e);const s=new fw(i);s.set({label:n,icon:o,tooltip:true,isToggleable:true});s.bind("isOn","isEnabled").to(r,"value","isEnabled");s.on("execute",(()=>{t.execute(e);t.editing.view.focus()}));return s}))}function cF(t){for(const e of t.getChildren()){if(e.name=="ul"||e.name=="ol"){return e}}return null}function lF(t,e){const n=[];const o=t.parent;const i={ignoreElementEnd:true,startPosition:t,shallow:true,direction:e};const r=o.getAttribute("listIndent");const s=[...new Of(i)].filter((t=>t.item.is("element"))).map((t=>t.item));for(const t of s){if(!t.is("element","listItem")){break}if(t.getAttribute("listIndent")<r){break}if(t.getAttribute("listIndent")>r){continue}if(t.getAttribute("listType")!==o.getAttribute("listType")){break}if(t.getAttribute("listStyle")!==o.getAttribute("listStyle")){break}if(e==="backward"){n.unshift(t)}else{n.push(t)}}return n}function dF(){const t=!this.isEmpty&&(this.getChild(0).name=="ul"||this.getChild(0).name=="ol");if(this.isEmpty||t){return 0}return pl.call(this)}function uF(t){return(e,n,o)=>{const i=o.consumable;if(!i.test(n.item,"insert")||!i.test(n.item,"attribute:listType")||!i.test(n.item,"attribute:listIndent")){return}i.consume(n.item,"insert");i.consume(n.item,"attribute:listType");i.consume(n.item,"attribute:listIndent");const r=n.item;const s=nF(r,o);oF(r,s,o,t)}}function hF(t){return(e,n,o)=>{const i=o.mapper.toViewPosition(n.position);const r=i.getLastMatchingPosition((t=>!t.item.is("element","li")));const s=r.nodeAfter;const a=o.writer;a.breakContainer(a.createPositionBefore(s));a.breakContainer(a.createPositionAfter(s));const c=s.parent;const l=c.previousSibling;const d=a.createRangeOn(c);const u=a.remove(d);if(l&&l.nextSibling){iF(a,l,l.nextSibling)}const h=o.mapper.toModelElement(s);DF(h.getAttribute("listIndent")+1,n.position,d.start,s,o,t);for(const t of a.createRangeIn(u).getItems()){o.mapper.unbindViewElement(t)}e.stop()}}function fF(t,e,n){if(!n.consumable.consume(e.item,"attribute:listType")){return}const o=n.mapper.toViewElement(e.item);const i=n.writer;i.breakContainer(i.createPositionBefore(o));i.breakContainer(i.createPositionAfter(o));const r=o.parent;const s=e.attributeNewValue=="numbered"?"ol":"ul";i.rename(s,r)}function mF(t,e,n){const o=n.mapper.toViewElement(e.item);const i=o.parent;const r=n.writer;iF(r,i,i.nextSibling);iF(r,i.previousSibling,i);for(const t of e.item.getChildren()){n.consumable.consume(t,"insert")}}function gF(t){return(e,n,o)=>{if(!o.consumable.consume(n.item,"attribute:listIndent")){return}const i=o.mapper.toViewElement(n.item);const r=o.writer;r.breakContainer(r.createPositionBefore(i));r.breakContainer(r.createPositionAfter(i));const s=i.parent;const a=s.previousSibling;const c=r.createRangeOn(s);r.remove(c);if(a&&a.nextSibling){iF(r,a,a.nextSibling)}DF(n.attributeOldValue+1,n.range.start,c.start,i,o,t);oF(n.item,i,o,t);for(const t of n.item.getChildren()){o.consumable.consume(t,"insert")}}}function pF(t,e,n){if(e.item.name!="listItem"){let t=n.mapper.toViewPosition(e.range.start);const o=n.writer;const i=[];while(t.parent.name=="ul"||t.parent.name=="ol"){t=o.breakContainer(t);if(t.parent.name!="li"){break}const e=t;const n=o.createPositionAt(t.parent,"end");if(!e.isEqual(n)){const t=o.remove(o.createRange(e,n));i.push(t)}t=o.createPositionAfter(t.parent)}if(i.length>0){for(let e=0;e<i.length;e++){const n=t.nodeBefore;const r=o.insert(t,i[e]);t=r.end;if(e>0){const e=iF(o,n,n.nextSibling);if(e&&e.parent==n){t.offset--}}}iF(o,t.nodeBefore,t.nodeAfter)}}}function bF(t,e,n){const o=n.mapper.toViewPosition(e.position);const i=o.nodeBefore;const r=o.nodeAfter;iF(n.writer,i,r)}function kF(t,e,n){if(n.consumable.consume(e.viewItem,{name:true})){const t=n.writer;const o=t.createElement("listItem");const i=BF(e.viewItem);t.setAttribute("listIndent",i,o);const r=e.viewItem.parent&&e.viewItem.parent.name=="ol"?"numbered":"bulleted";t.setAttribute("listType",r,o);if(!n.safeInsert(o,e.modelCursor)){return}const s=xF(o,e.viewItem.getChildren(),n);e.modelRange=t.createRange(e.modelCursor,s);n.updateConversionResult(o,e)}}function wF(t,e,n){if(n.consumable.test(e.viewItem,{name:true})){const t=Array.from(e.viewItem.getChildren());for(const e of t){const t=!(e.is("element","li")||SF(e));if(t){e._remove()}}}}function CF(t,e,n){if(n.consumable.test(e.viewItem,{name:true})){if(e.viewItem.childCount===0){return}const t=[...e.viewItem.getChildren()];let n=false;let o=true;for(const e of t){if(n&&!SF(e)){e._remove()}if(e.is("$text")){if(o){e._data=e.data.trimStart()}if(!e.nextSibling||SF(e.nextSibling)){e._data=e.data.trimEnd()}}else if(SF(e)){n=true}o=false}}}function AF(t){return(e,n)=>{if(n.isPhantom){return}const o=n.modelPosition.nodeBefore;if(o&&o.is("element","listItem")){const e=n.mapper.toViewElement(o);const i=e.getAncestors().find(SF);const r=t.createPositionAt(e,0).getWalker();for(const t of r){if(t.type=="elementStart"&&t.item.is("element","li")){n.viewPosition=t.previousPosition;break}else if(t.type=="elementEnd"&&t.item==i){n.viewPosition=t.nextPosition;break}}}}}function _F(t){return(e,n)=>{const o=n.viewPosition;const i=o.parent;const r=n.mapper;if(i.name=="ul"||i.name=="ol"){if(!o.isAtEnd){const e=r.toModelElement(o.nodeAfter);n.modelPosition=t.createPositionBefore(e)}else{const e=r.toModelElement(o.nodeBefore);const i=r.getModelLength(o.nodeBefore);n.modelPosition=t.createPositionBefore(e).getShiftedBy(i)}e.stop()}else if(i.name=="li"&&o.nodeBefore&&(o.nodeBefore.name=="ul"||o.nodeBefore.name=="ol")){const s=r.toModelElement(i);let a=1;let c=o.nodeBefore;while(c&&SF(c)){a+=r.getModelLength(c);c=c.previousSibling}n.modelPosition=t.createPositionBefore(s).getShiftedBy(a);e.stop()}}}function vF(t,e){const n=t.document.differ.getChanges();const o=new Map;let i=false;for(const o of n){if(o.type=="insert"&&o.name=="listItem"){r(o.position)}else if(o.type=="insert"&&o.name!="listItem"){if(o.name!="$text"){const n=o.position.nodeAfter;if(n.hasAttribute("listIndent")){e.removeAttribute("listIndent",n);i=true}if(n.hasAttribute("listType")){e.removeAttribute("listType",n);i=true}if(n.hasAttribute("listStyle")){e.removeAttribute("listStyle",n);i=true}for(const e of Array.from(t.createRangeIn(n)).filter((t=>t.item.is("element","listItem")))){r(e.previousPosition)}}const n=o.position.getShiftedBy(o.length);r(n)}else if(o.type=="remove"&&o.name=="listItem"){r(o.position)}else if(o.type=="attribute"&&o.attributeKey=="listIndent"){r(o.range.start)}else if(o.type=="attribute"&&o.attributeKey=="listType"){r(o.range.start)}}for(const t of o.values()){s(t);a(t)}return i;function r(t){const e=t.nodeBefore;if(!e||!e.is("element","listItem")){const e=t.nodeAfter;if(e&&e.is("element","listItem")){o.set(e,e)}}else{let t=e;if(o.has(t)){return}for(let e=t.previousSibling;e&&e.is("element","listItem");e=t.previousSibling){t=e;if(o.has(t)){return}}o.set(e,t)}}function s(t){let n=0;let o=null;while(t&&t.is("element","listItem")){const r=t.getAttribute("listIndent");if(r>n){let s;if(o===null){o=r-n;s=n}else{if(o>r){o=r}s=r-o}e.setAttribute("listIndent",s,t);i=true}else{o=null;n=t.getAttribute("listIndent")+1}t=t.nextSibling}}function a(t){let n=[];let o=null;while(t&&t.is("element","listItem")){const r=t.getAttribute("listIndent");if(o&&o.getAttribute("listIndent")>r){n=n.slice(0,r+1)}if(r!=0){if(n[r]){const o=n[r];if(t.getAttribute("listType")!=o){e.setAttribute("listType",o,t);i=true}}else{n[r]=t.getAttribute("listType")}}o=t;t=t.nextSibling}}}function yF(t,[e,n]){let o=e.is("documentFragment")?e.getChild(0):e;let i;if(!n){i=this.document.selection}else{i=this.createSelection(n)}if(o&&o.is("element","listItem")){const t=i.getFirstPosition();let e=null;if(t.parent.is("element","listItem")){e=t.parent}else if(t.nodeBefore&&t.nodeBefore.is("element","listItem")){e=t.nodeBefore}if(e){const t=e.getAttribute("listIndent");if(t>0){while(o&&o.is("element","listItem")){o._setAttribute("listIndent",o.getAttribute("listIndent")+t);o=o.nextSibling}}}}}function xF(t,e,n){const{writer:o,schema:i}=n;let r=o.createPositionAfter(t);for(const s of e){if(s.name=="ul"||s.name=="ol"){r=n.convertItem(s,r).modelCursor}else{const e=n.convertItem(s,o.createPositionAt(t,"end"));const a=e.modelRange.start.nodeAfter;const c=a&&a.is("element")&&!i.checkChild(t,a.name);if(c){if(e.modelCursor.parent.is("element","listItem")){t=e.modelCursor.parent}else{t=EF(e.modelCursor)}r=o.createPositionAfter(t)}}}return r}function EF(t){const e=new Of({startPosition:t});let n;do{n=e.next()}while(!n.value.item.is("element","listItem"));return n.value.item}function DF(t,e,n,o,i,r){const s=sF(e.nodeBefore,{sameIndent:true,smallerIndent:true,listIndent:t,foo:"b"});const a=i.mapper;const c=i.writer;const l=s?s.getAttribute("listIndent"):null;let d;if(!s){d=n}else if(l==t){const t=a.toViewElement(s).parent;d=c.createPositionAfter(t)}else{const t=r.createPositionAt(s,"end");d=a.toViewPosition(t)}d=rF(d);for(const t of[...o.getChildren()]){if(SF(t)){d=c.move(c.createRangeOn(t),d).end;iF(c,t,t.nextSibling);iF(c,t.previousSibling,t)}}}function SF(t){return t.is("element","ol")||t.is("element","ul")}function BF(t){let e=0;let n=t.parent;while(n){if(n.is("element","li")){e++}else{const t=n.previousSibling;if(t&&t.is("element","li")){e++}}n=n.parent}return e}class TF extends Kn{static get pluginName(){return"ListEditing"}static get requires(){return[ty,iy]}init(){const t=this.editor;t.model.schema.register("listItem",{inheritAllFrom:"$block",allowAttributes:["listType","listIndent"]});const e=t.data;const n=t.editing;t.model.document.registerPostFixer((e=>vF(t.model,e)));n.mapper.registerViewToModelLength("li",PF);e.mapper.registerViewToModelLength("li",PF);n.mapper.on("modelToViewPosition",AF(n.view));n.mapper.on("viewToModelPosition",_F(t.model));e.mapper.on("modelToViewPosition",AF(n.view));t.conversion.for("editingDowncast").add((e=>{e.on("insert",pF,{priority:"high"});e.on("insert:listItem",uF(t.model));e.on("attribute:listType:listItem",fF,{priority:"high"});e.on("attribute:listType:listItem",mF,{priority:"low"});e.on("attribute:listIndent:listItem",gF(t.model));e.on("remove:listItem",hF(t.model));e.on("remove",bF,{priority:"low"})}));t.conversion.for("dataDowncast").add((e=>{e.on("insert",pF,{priority:"high"});e.on("insert:listItem",uF(t.model))}));t.conversion.for("upcast").add((t=>{t.on("element:ul",wF,{priority:"high"});t.on("element:ol",wF,{priority:"high"});t.on("element:li",CF,{priority:"high"});t.on("element:li",kF)}));t.model.on("insertContent",yF,{priority:"high"});t.commands.add("numberedList",new QR(t,"numbered"));t.commands.add("bulletedList",new QR(t,"bulleted"));t.commands.add("indentList",new tF(t,"forward"));t.commands.add("outdentList",new tF(t,"backward"));const o=n.view.document;this.listenTo(o,"enter",((t,e)=>{const n=this.editor.model.document;const o=n.selection.getLastPosition().parent;if(n.selection.isCollapsed&&o.name=="listItem"&&o.isEmpty){this.editor.execute("outdentList");e.preventDefault();t.stop()}}),{context:"li"});this.listenTo(o,"delete",((t,e)=>{if(e.direction!=="backward"){return}const n=this.editor.model.document.selection;if(!n.isCollapsed){return}const o=n.getFirstPosition();if(!o.isAtStart){return}const i=o.parent;if(i.name!=="listItem"){return}const r=i.previousSibling&&i.previousSibling.name==="listItem";if(r){return}this.editor.execute("outdentList");e.preventDefault();t.stop()}),{context:"li"});const i=t=>(e,n)=>{const o=this.editor.commands.get(t);if(o.isEnabled){this.editor.execute(t);n()}};t.keystrokes.set("Tab",i("indentList"));t.keystrokes.set("Shift+Tab",i("outdentList"))}afterInit(){const t=this.editor.commands;const e=t.get("indent");const n=t.get("outdent");if(e){e.registerChildCommand(t.get("indentList"))}if(n){n.registerChildCommand(t.get("outdentList"))}}}function PF(t){let e=1;for(const n of t.getChildren()){if(n.name=="ul"||n.name=="ol"){for(const t of n.getChildren()){e+=PF(t)}}}return e}var IF='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M7 5.75c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zM3.5 3v5H2V3.7H1v-1h2.5V3zM.343 17.857l2.59-3.257H2.92a.6.6 0 1 0-1.04 0H.302a2 2 0 1 1 3.995 0h-.001c-.048.405-.16.734-.333.988-.175.254-.59.692-1.244 1.312H4.3v1h-4l.043-.043zM7 14.75a.75.75 0 0 1 .75-.75h9.5a.75.75 0 1 1 0 1.5h-9.5a.75.75 0 0 1-.75-.75z"/></svg>';var RF='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M7 5.75c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zm-6 0C1 4.784 1.777 4 2.75 4c.966 0 1.75.777 1.75 1.75 0 .966-.777 1.75-1.75 1.75C1.784 7.5 1 6.723 1 5.75zm6 9c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zm-6 0c0-.966.777-1.75 1.75-1.75.966 0 1.75.777 1.75 1.75 0 .966-.777 1.75-1.75 1.75-.966 0-1.75-.777-1.75-1.75z"/></svg>';class FF extends Kn{static get pluginName(){return"ListUI"}init(){const t=this.editor.t;aF(this.editor,"numberedList",t("Numbered List"),IF);aF(this.editor,"bulletedList",t("Bulleted List"),RF)}}class zF extends Kn{static get requires(){return[TF,FF]}static get pluginName(){return"List"}}function OF(t,e){for(const n of t.getChildren()){if(n.is("element","b")&&n.getStyle("font-weight")==="normal"){const o=t.getChildIndex(n);e.remove(n);e.insertChild(o,n.getChildren(),t)}}}function NF(t,e){if(!t.childCount){return}const n=new S_(t.document);const o=VF(t,n);if(!o.length){return}let i=null;let r=1;o.forEach(((t,s)=>{const a=$F(o[s-1],t);const c=a?null:o[s-1];const l=YF(c,t);if(a){i=null;r=1}if(!i||l!==0){const o=LF(t,e);if(!i){i=jF(o,t.element,n)}else if(t.indent>r){const t=i.getChild(i.childCount-1);const e=t.getChild(t.childCount-1);i=jF(o,e,n);r+=1}else if(t.indent<r){const e=r-t.indent;i=QF(i,e);r=parseInt(t.indent)}if(t.indent<=r){if(!i.is("element",o.type)){i=n.rename(o.type,i)}}}const d=WF(t.element,n);n.appendChild(d,i)}))}function MF(t,e){for(const n of e.createRangeIn(t)){const t=n.item;if(t.is("element","li")){const n=t.getChild(0);if(n&&n.is("element","p")){e.unwrapElement(n)}}}}function VF(t,e){const n=e.createRangeIn(t);const o=new Ha({name:/^p|h\d+$/,styles:{"mso-list":/.*/}});const i=[];for(const t of n){if(t.type==="elementStart"&&o.match(t.item)){const e=GF(t.item);i.push({element:t.item,id:e.id,order:e.order,indent:e.indent})}}return i}function LF(t,e){const n=new RegExp(`@list l${t.id}:level${t.indent}\\s*({[^}]*)`,"gi");const o=/mso-level-number-format:([^;]{0,100});/gi;const i=n.exec(e);let r="decimal";let s="ol";if(i&&i[1]){const e=o.exec(i[1]);if(e&&e[1]){r=e[1].trim();s=r!=="bullet"&&r!=="image"?"ol":"ul"}if(r==="bullet"){const e=HF(t.element);if(e){r=e}}}return{type:s,style:qF(r)}}function HF(t){const e=KF(t);if(!e){return null}const n=e._data;if(n==="o"){return"circle"}else if(n==="·"){return"disc"}else if(n==="§"){return"square"}return null}function KF(t){if(t.getChild(0).is("$text")){return null}const e=t.getChild(0).getChild(0);if(e.is("$text")){return e}return e.getChild(0)}function qF(t){switch(t){case"arabic-leading-zero":return"decimal-leading-zero";case"alpha-upper":return"upper-alpha";case"alpha-lower":return"lower-alpha";case"roman-upper":return"upper-roman";case"roman-lower":return"lower-roman";case"circle":case"disc":case"square":return t;default:return null}}function jF(t,e,n){const o=e.parent;const i=n.createElement(t.type);const r=o.getChildIndex(e)+1;n.insertChild(r,i,o);if(t.style){n.setStyle("list-style-type",t.style,i)}return i}function WF(t,e){UF(t,e);return e.rename("li",t)}function GF(t){const e={};const n=t.getStyle("mso-list");if(n){const t=n.match(/(^|\s{1,100})l(\d+)/i);const o=n.match(/\s{0,100}lfo(\d+)/i);const i=n.match(/\s{0,100}level(\d+)/i);if(t&&o&&i){e.id=t[2];e.order=o[1];e.indent=i[1]}}return e}function UF(t,e){const n=new Ha({name:"span",styles:{"mso-list":"Ignore"}});const o=e.createRangeIn(t);for(const t of o){if(t.type==="elementStart"&&n.match(t.item)){e.remove(t.item)}}}function $F(t,e){if(!t){return true}if(t.id!==e.id){if(e.indent-t.indent===1){return false}return true}const n=e.element.previousSibling;if(!n){return true}return!JF(n)}function JF(t){return t.is("element","ol")||t.is("element","ul")}function YF(t,e){return t?e.indent-t.indent:e.indent-1}function QF(t,e){const n=t.getAncestors({parentFirst:true});let o=null;let i=0;for(const t of n){if(t.name==="ul"||t.name==="ol"){i++}if(i===e){o=t;break}}return o}const XF=/id=("|')docs-internal-guid-[-0-9a-f]+("|')/i;class ZF{constructor(t){this.document=t}isActive(t){return XF.test(t)}execute(t){const e=new S_(this.document);OF(t.content,e);MF(t.content,e)}}function tz(t){return nz(nz(t)).replace(/(<span\s+style=['"]mso-spacerun:yes['"]>[^\S\r\n]*?)[\r\n]+([^\S\r\n]*<\/span>)/g,"$1$2").replace(/<span\s+style=['"]mso-spacerun:yes['"]><\/span>/g,"").replace(/ <\//g," </").replace(/ <o:p><\/o:p>/g," <o:p></o:p>").replace(/<o:p>( |\u00A0)<\/o:p>/g,"").replace(/>([^\S\r\n]*[\r\n]\s*)</g,"><")}function ez(t){t.querySelectorAll("span[style*=spacerun]").forEach((t=>{const e=t.innerText.length||0;t.innerHTML=Array(e+1).join(" ").substr(0,e)}))}function nz(t){return t.replace(/<span(?: class="Apple-converted-space"|)>(\s+)<\/span>/g,((t,e)=>e.length===1?" ":Array(e.length+1).join(" ").substr(0,e.length)))}function oz(t,e){const n=new DOMParser;t=t.replace(/<!--\[if gte vml 1]>/g,"");const o=tz(sz(t));const i=n.parseFromString(o,"text/html");ez(i);const r=i.body.innerHTML;const s=iz(i,e);const a=rz(i);return{body:s,bodyString:r,styles:a.styles,stylesString:a.stylesString}}function iz(t,e){const n=new Ol(e);const o=new du(n,{blockFillerMode:"nbsp"});const i=t.createDocumentFragment();const r=t.body.childNodes;while(r.length>0){i.appendChild(r[0])}return o.domToView(i)}function rz(t){const e=[];const n=[];const o=Array.from(t.getElementsByTagName("style"));for(const t of o){if(t.sheet&&t.sheet.cssRules&&t.sheet.cssRules.length){e.push(t.sheet);n.push(t.innerHTML)}}return{styles:e,stylesString:n.join(" ")}}function sz(t){const e="</body>";const n="</html>";const o=t.indexOf(e);if(o<0){return t}const i=t.indexOf(n,o+e.length);return t.substring(0,o+e.length)+(i>=0?t.substring(i):"")}function az(t,e){if(!t.childCount){return}const n=new S_;const o=lz(t,n);dz(o,t,n);uz(t,n);const i=hz(t,n);if(i.length){mz(i,fz(e),n)}}function cz(t){return btoa(t.match(/\w{2}/g).map((t=>String.fromCharCode(parseInt(t,16)))).join(""))}function lz(t,e){const n=e.createRangeIn(t);const o=new Ha({name:/v:(.+)/});const i=[];for(const t of n){const e=t.item;const n=e.previousSibling&&e.previousSibling.name||null;if(o.match(e)&&e.getAttribute("o:gfxdata")&&n!=="v:shapetype"){i.push(t.item.getAttribute("id"))}}return i}function dz(t,e,n){const o=n.createRangeIn(e);const i=new Ha({name:"img"});const r=[];for(const e of o){if(i.match(e.item)){const n=e.item;const o=n.getAttribute("v:shapes")?n.getAttribute("v:shapes").split(" "):[];if(o.length&&o.every((e=>t.indexOf(e)>-1))){r.push(n)}else if(!n.getAttribute("src")){r.push(n)}}}for(const t of r){n.remove(t)}}function uz(t,e){const n=e.createRangeIn(t);const o=new Ha({name:/v:(.+)/});const i=[];for(const t of n){if(o.match(t.item)){i.push(t.item)}}for(const t of i){e.remove(t)}}function hz(t,e){const n=e.createRangeIn(t);const o=new Ha({name:"img"});const i=[];for(const t of n){if(o.match(t.item)){if(t.item.getAttribute("src").startsWith("file://")){i.push(t.item)}}}return i}function fz(t){if(!t){return[]}const e=/{\\pict[\s\S]+?\\bliptag-?\d+(\\blipupi-?\d+)?({\\\*\\blipuid\s?[\da-fA-F]+)?[\s}]*?/;const n=new RegExp("(?:("+e.source+"))([\\da-fA-F\\s]+)\\}","g");const o=t.match(n);const i=[];if(o){for(const t of o){let n=false;if(t.includes("\\pngblip")){n="image/png"}else if(t.includes("\\jpegblip")){n="image/jpeg"}if(n){i.push({hex:t.replace(e,"").replace(/[^\da-fA-F]/g,""),type:n})}}}return i}function mz(t,e,n){if(t.length===e.length){for(let o=0;o<t.length;o++){const i=`data:${e[o].type};base64,${cz(e[o].hex)}`;n.setAttribute("src",i,t[o])}}}const gz=/<meta\s*name="?generator"?\s*content="?microsoft\s*word\s*\d+"?\/?>/i;const pz=/xmlns:o="urn:schemas-microsoft-com/i;class bz{constructor(t){this.document=t}isActive(t){return gz.test(t)||pz.test(t)}execute(t){const{body:e,stylesString:n}=oz(t.dataTransfer.getData("text/html"),this.document.stylesProcessor);NF(e,n);az(e,t.dataTransfer.getData("text/rtf"));t.content=e}}class kz extends Kn{static get pluginName(){return"PasteFromOffice"}static get requires(){return[$v]}init(){const t=this.editor;const e=t.editing.view.document;const n=[];n.push(new bz(e));n.push(new ZF(e));t.plugins.get("ClipboardPipeline").on("inputTransformation",((t,e)=>{if(e.isTransformedWithPasteFromOffice){return}const o=e.dataTransfer.getData("text/html");const i=n.find((t=>t.isActive(o)));if(i){i.execute(e);e.isTransformedWithPasteFromOffice=true}}),{priority:"high"})}}function wz(t,e,n,o,i=1){if(e>i){o.setAttribute(t,e,n)}else{o.removeAttribute(t,n)}}function Cz(t,e,n={}){const o=t.createElement("tableCell",n);t.insertElement("paragraph",o);t.insert(o,e);return o}function Az(t,e){const n=e.parent.parent;const o=parseInt(n.getAttribute("headingColumns")||0);const{column:i}=t.getCellLocation(e);return!!o&&i<o}function _z(){return t=>{t.on("element:table",((t,e,n)=>{const o=e.viewItem;if(!n.consumable.test(o,{name:true})){return}const{rows:i,headingRows:r,headingColumns:s}=xz(o);const a={};if(s){a.headingColumns=s}if(r){a.headingRows=r}const c=n.writer.createElement("table",a);if(!n.safeInsert(c,e.modelCursor)){return}n.consumable.consume(o,{name:true});i.forEach((t=>n.convertItem(t,n.writer.createPositionAt(c,"end"))));if(c.isEmpty){const t=n.writer.createElement("tableRow");n.writer.insert(t,n.writer.createPositionAt(c,"end"));Cz(n.writer,n.writer.createPositionAt(t,"end"))}n.updateConversionResult(c,e)}))}}function vz(){return t=>{t.on("element:tr",((t,e)=>{if(e.viewItem.isEmpty&&e.modelCursor.index==0){t.stop()}}),{priority:"high"})}}function yz(t){return e=>{e.on(`element:${t}`,((t,e,n)=>{if(!e.modelRange){return}if(e.viewItem.isEmpty){const t=e.modelRange.start.nodeAfter;const o=n.writer.createPositionAt(t,0);n.writer.insertElement("paragraph",o)}}),{priority:"low"})}}function xz(t){const e={headingRows:0,headingColumns:0};const n=[];const o=[];let i;for(const r of Array.from(t.getChildren())){if(r.name==="tbody"||r.name==="thead"||r.name==="tfoot"){if(r.name==="thead"&&!i){i=r}const t=Array.from(r.getChildren()).filter((t=>t.is("element","tr")));for(const r of t){if(r.parent.name==="thead"&&r.parent===i){e.headingRows++;n.push(r)}else{o.push(r);const t=Ez(r,e,i);if(t>e.headingColumns){e.headingColumns=t}}}}}e.rows=[...n,...o];return e}function Ez(t){let e=0;let n=0;const o=Array.from(t.getChildren()).filter((t=>t.name==="th"||t.name==="td"));while(n<o.length&&o[n].name==="th"){const t=o[n];const i=parseInt(t.getAttribute("colspan")||1);e=e+i;n++}return e}class Dz{constructor(t,e={}){this._table=t;this._startRow=e.row!==undefined?e.row:e.startRow||0;this._endRow=e.row!==undefined?e.row:e.endRow;this._startColumn=e.column!==undefined?e.column:e.startColumn||0;this._endColumn=e.column!==undefined?e.column:e.endColumn;this._includeAllSlots=!!e.includeAllSlots;this._skipRows=new Set;this._row=0;this._column=0;this._cellIndex=0;this._spannedCells=new Map;this._nextCellAtColumn=-1}[Symbol.iterator](){return this}next(){const t=this._table.getChild(this._row);if(!t||this._isOverEndRow()){return{done:true}}if(this._isOverEndColumn()){return this._advanceToNextRow()}let e=null;const n=this._getSpanned();if(n){if(this._includeAllSlots&&!this._shouldSkipSlot()){e=this._formatOutValue(n.cell,n.row,n.column)}}else{const n=t.getChild(this._cellIndex);if(!n){return this._advanceToNextRow()}const o=parseInt(n.getAttribute("colspan")||1);const i=parseInt(n.getAttribute("rowspan")||1);if(o>1||i>1){this._recordSpans(n,i,o)}if(!this._shouldSkipSlot()){e=this._formatOutValue(n)}this._nextCellAtColumn=this._column+o}this._column++;if(this._column==this._nextCellAtColumn){this._cellIndex++}return e||this.next()}skipRow(t){this._skipRows.add(t)}_advanceToNextRow(){this._row++;this._column=0;this._cellIndex=0;this._nextCellAtColumn=-1;return this.next()}_isOverEndRow(){return this._endRow!==undefined&&this._row>this._endRow}_isOverEndColumn(){return this._endColumn!==undefined&&this._column>this._endColumn}_formatOutValue(t,e=this._row,n=this._column){return{done:false,value:new Sz(this,t,e,n)}}_shouldSkipSlot(){const t=this._skipRows.has(this._row);const e=this._row<this._startRow;const n=this._column<this._startColumn;const o=this._endColumn!==undefined&&this._column>this._endColumn;return t||e||n||o}_getSpanned(){const t=this._spannedCells.get(this._row);if(!t){return null}return t.get(this._column)||null}_recordSpans(t,e,n){const o={cell:t,row:this._row,column:this._column};for(let t=this._row;t<this._row+e;t++){for(let e=this._column;e<this._column+n;e++){if(t!=this._row||e!=this._column){this._markSpannedCell(t,e,o)}}}}_markSpannedCell(t,e,n){if(!this._spannedCells.has(t)){this._spannedCells.set(t,new Map)}const o=this._spannedCells.get(t);o.set(e,n)}}class Sz{constructor(t,e,n,o){this.cell=e;this.row=t._row;this.column=t._column;this.cellAnchorRow=n;this.cellAnchorColumn=o;this._cellIndex=t._cellIndex;this._table=t._table}get isAnchor(){return this.row===this.cellAnchorRow&&this.column===this.cellAnchorColumn}get cellWidth(){return parseInt(this.cell.getAttribute("colspan")||1)}get cellHeight(){return parseInt(this.cell.getAttribute("rowspan")||1)}getPositionBefore(){const t=this._table.root.document.model;return t.createPositionAt(this._table.getChild(this.row),this._cellIndex)}}function Bz(t={}){return e=>e.on("insert:table",((e,n,o)=>{const i=n.item;if(!o.consumable.consume(i,"insert")){return}o.consumable.consume(i,"attribute:headingRows:table");o.consumable.consume(i,"attribute:headingColumns:table");const r=t&&t.asWidget;const s=o.writer.createContainerElement("figure",{class:"table"});const a=o.writer.createContainerElement("table");o.writer.insert(o.writer.createPositionAt(s,0),a);let c;if(r){c=Oz(s,o.writer)}const l=new Dz(i);const d={headingRows:i.getAttribute("headingRows")||0,headingColumns:i.getAttribute("headingColumns")||0};const u=new Map;for(const e of l){const{row:n,cell:r}=e;const s=i.getChild(n);const c=u.get(n)||Lz(a,s,n,d,o);u.set(n,c);o.consumable.consume(r,"insert");const l=o.writer.createPositionAt(c,"end");Vz(e,d,l,o,t)}for(const t of i.getChildren()){const e=t.index;if(!u.has(e)){u.set(e,Lz(a,t,e,d,o))}}const h=o.mapper.toViewPosition(n.range.start);o.mapper.bindElements(i,r?c:s);o.writer.insert(h,r?c:s)}))}function Tz(){return t=>t.on("insert:tableRow",((t,e,n)=>{const o=e.item;if(!n.consumable.consume(o,"insert")){return}const i=o.parent;const r=n.mapper.toViewElement(i);const s=Uz(r);const a=i.getChildIndex(o);const c=new Dz(i,{row:a});const l={headingRows:i.getAttribute("headingRows")||0,headingColumns:i.getAttribute("headingColumns")||0};const d=new Map;for(const t of c){const e=d.get(a)||Lz(s,o,a,l,n);d.set(a,e);n.consumable.consume(t.cell,"insert");const i=n.writer.createPositionAt(e,"end");Vz(t,l,i,n,{asWidget:true})}}))}function Pz(){return t=>t.on("insert:tableCell",((t,e,n)=>{const o=e.item;if(!n.consumable.consume(o,"insert")){return}const i=o.parent;const r=i.parent;const s=r.getChildIndex(i);const a=new Dz(r,{row:s});const c={headingRows:r.getAttribute("headingRows")||0,headingColumns:r.getAttribute("headingColumns")||0};for(const t of a){if(t.cell===o){const e=n.mapper.toViewElement(i);const r=n.writer.createPositionAt(e,i.getChildIndex(o));Vz(t,c,r,n,{asWidget:true});return}}}))}function Iz(){return t=>t.on("attribute:headingColumns:table",((t,e,n)=>{const o=e.item;if(!n.consumable.consume(e.item,t.name)){return}const i={headingRows:o.getAttribute("headingRows")||0,headingColumns:o.getAttribute("headingColumns")||0};const r=e.attributeOldValue;const s=e.attributeNewValue;const a=(r>s?r:s)-1;for(const t of new Dz(o,{endColumn:a})){Mz(t,i,n)}}))}function Rz(){return t=>t.on("remove:tableRow",((t,e,n)=>{t.stop();const o=n.writer;const i=n.mapper;const r=i.toViewPosition(e.position).getLastMatchingPosition((t=>!t.item.is("element","tr")));const s=r.nodeAfter;const a=s.parent;const c=a.parent;const l=o.createRangeOn(s);const d=o.remove(l);for(const t of o.createRangeIn(d).getItems()){i.unbindViewElement(t)}Gz("thead",c,n);Gz("tbody",c,n)}),{priority:"higher"})}function Fz(t,e){const{writer:n}=e;if(!t.parent.is("element","tableCell")){return}if(zz(t)){return n.createContainerElement("span",{style:"display:inline-block"})}else{return n.createContainerElement("p")}}function zz(t){const e=t.parent;const n=e.childCount===1;return n&&!$z(t)}function Oz(t,e){e.setCustomProperty("table",true,t);return fy(t,e,{hasSelectionHandle:true})}function Nz(t,e,n){const o=n.writer;const i=n.mapper.toViewElement(t);const r=o.createEditableElement(e,i.getAttributes());const s=wy(r,o);py(s,o,((t,e,n)=>n.addClass(Ca(e.classes),t)),((t,e,n)=>n.removeClass(Ca(e.classes),t)));o.insert(o.createPositionAfter(i),s);o.move(o.createRangeIn(i),o.createPositionAt(s,0));o.remove(o.createRangeOn(i));n.mapper.unbindViewElement(i);n.mapper.bindElements(t,s)}function Mz(t,e,n){const{cell:o}=t;const i=Hz(t,e);const r=n.mapper.toViewElement(o);if(r&&r.name!==i){Nz(o,i,n)}}function Vz(t,e,n,o,i){const r=i&&i.asWidget;const s=Hz(t,e);const a=r?wy(o.writer.createEditableElement(s),o.writer):o.writer.createContainerElement(s);if(r){py(a,o.writer,((t,e,n)=>n.addClass(Ca(e.classes),t)),((t,e,n)=>n.removeClass(Ca(e.classes),t)))}const c=t.cell;const l=c.getChild(0);const d=c.childCount===1&&l.name==="paragraph";o.writer.insert(n,a);o.mapper.bindElements(c,a);if(!r&&d&&!$z(l)){const t=c.getChild(0);o.consumable.consume(t,"insert");o.mapper.bindElements(t,a)}}function Lz(t,e,n,o,i){i.consumable.consume(e,"insert");const r=e.isEmpty?i.writer.createEmptyElement("tr"):i.writer.createContainerElement("tr");i.mapper.bindElements(e,r);const s=o.headingRows;const a=qz(Kz(n,o),t,i);const c=s>0&&n>=s?n-s:n;const l=i.writer.createPositionAt(a,c);i.writer.insert(l,r);return r}function Hz(t,e){const{row:n,column:o}=t;const{headingColumns:i,headingRows:r}=e;const s=r&&r>n;if(s){return"th"}const a=i&&i>o;return a?"th":"td"}function Kz(t,e){return t<e.headingRows?"thead":"tbody"}function qz(t,e,n){const o=jz(t,e);return o?o:Wz(t,e,n)}function jz(t,e){for(const n of e.getChildren()){if(n.name==t){return n}}}function Wz(t,e,n){const o=n.writer.createContainerElement(t);const i=n.writer.createPositionAt(e,t=="tbody"?"end":0);n.writer.insert(i,o);return o}function Gz(t,e,n){const o=jz(t,e);if(o&&o.childCount===0){n.writer.remove(n.writer.createRangeOn(o))}}function Uz(t){for(const e of t.getChildren()){if(e.name==="table"){return e}}}function $z(t){return!![...t.getAttributeKeys()].length}class Jz extends jn{refresh(){const t=this.editor.model;const e=t.document.selection;const n=t.schema;this.isEnabled=Yz(e,n)&&!Ay(e,n)}execute(t={}){const e=this.editor.model;const n=e.document.selection;const o=this.editor.plugins.get("TableUtils");const i=Cy(n,e);e.change((n=>{const r=o.createTable(n,t);e.insertContent(r,i);n.setSelection(n.createPositionAt(r.getNodeByPath([0,0,0]),0))}))}}function Yz(t,e){const n=t.getFirstPosition().parent;const o=n===n.root?n:n.parent;return e.checkChild(o,"table")}function Qz(t){const e=[];for(const n of oO(t.getRanges())){const t=n.getContainedElement();if(t&&t.is("element","tableCell")){e.push(t)}}return e}function Xz(t){const e=[];for(const n of t.getRanges()){const t=n.start.findAncestor("tableCell");if(t){e.push(t)}}return e}function Zz(t){const e=Qz(t);if(e.length){return e}return Xz(t)}function tO(t){const e=t.map((t=>t.parent.index));return iO(e)}function eO(t){const e=t[0].findAncestor("table");const n=[...new Dz(e)];const o=n.filter((e=>t.includes(e.cell))).map((t=>t.column));return iO(o)}function nO(t,e){if(t.length<2||!aO(t)){return false}const n=new Set;const o=new Set;let i=0;for(const r of t){const{row:t,column:s}=e.getCellLocation(r);const a=parseInt(r.getAttribute("rowspan")||1);const c=parseInt(r.getAttribute("colspan")||1);n.add(t);o.add(s);if(a>1){n.add(t+a-1)}if(c>1){o.add(s+c-1)}i+=a*c}const r=sO(n,o);return r==i}function oO(t){return Array.from(t).sort(rO)}function iO(t){const e=t.sort(((t,e)=>t-e));const n=e[0];const o=e[e.length-1];return{first:n,last:o}}function rO(t,e){const n=t.start;const o=e.start;return n.isBefore(o)?-1:1}function sO(t,e){const n=Array.from(t.values());const o=Array.from(e.values());const i=Math.max(...n);const r=Math.min(...n);const s=Math.max(...o);const a=Math.min(...o);return(i-r+1)*(s-a+1)}function aO(t){const e=t[0].findAncestor("table");const n=tO(t);const o=parseInt(e.getAttribute("headingRows")||0);if(!cO(n,o)){return false}const i=parseInt(e.getAttribute("headingColumns")||0);const r=eO(t);return cO(r,i)}function cO({first:t,last:e},n){const o=t<n;const i=e<n;return o===i}class lO extends jn{constructor(t,e={}){super(t);this.order=e.order||"below"}refresh(){const t=this.editor.model.document.selection;const e=t.getFirstPosition().findAncestor("table");this.isEnabled=!!e}execute(){const t=this.editor;const e=t.model.document.selection;const n=t.plugins.get("TableUtils");const o=this.order==="above";const i=Zz(e);const r=tO(i);const s=o?r.first:r.last;const a=i[0].findAncestor("table");n.insertRows(a,{at:o?s:s+1,copyStructureFromAbove:!o})}}class dO extends jn{constructor(t,e={}){super(t);this.order=e.order||"right"}refresh(){const t=this.editor.model.document.selection;const e=t.getFirstPosition().findAncestor("table");this.isEnabled=!!e}execute(){const t=this.editor;const e=t.model.document.selection;const n=t.plugins.get("TableUtils");const o=this.order==="left";const i=Zz(e);const r=eO(i);const s=o?r.first:r.last;const a=i[0].findAncestor("table");n.insertColumns(a,{columns:1,at:o?s:s+1})}}class uO extends jn{constructor(t,e={}){super(t);this.direction=e.direction||"horizontally"}refresh(){const t=Zz(this.editor.model.document.selection);this.isEnabled=t.length===1}execute(){const t=Zz(this.editor.model.document.selection)[0];const e=this.direction==="horizontally";const n=this.editor.plugins.get("TableUtils");if(e){n.splitCellHorizontally(t,2)}else{n.splitCellVertically(t,2)}}}function hO(t,e,n){const{startRow:o,startColumn:i,endRow:r,endColumn:s}=e;const a=n.createElement("table");const c=r-o+1;for(let t=0;t<c;t++){n.insertElement("tableRow",a,"end")}const l=[...new Dz(t,{startRow:o,endRow:r,startColumn:i,endColumn:s,includeAllSlots:true})];for(const{row:t,column:e,cell:c,isAnchor:d,cellAnchorRow:u,cellAnchorColumn:h}of l){const l=t-o;const f=a.getChild(l);if(!d){if(u<o||h<i){Cz(n,n.createPositionAt(f,"end"))}}else{const o=n.cloneElement(c);n.append(o,f);bO(o,t,e,r,s,n)}}kO(a,t,o,i,n);return a}function fO(t,e,n=0){const o=[];const i=new Dz(t,{startRow:n,endRow:e-1});for(const t of i){const{row:n,cellHeight:i}=t;const r=n+i-1;if(n<e&&e<=r){o.push(t)}}return o}function mO(t,e,n){const o=t.parent;const i=o.parent;const r=o.index;const s=parseInt(t.getAttribute("rowspan"));const a=e-r;const c={};const l=s-a;if(l>1){c.rowspan=l}const d=parseInt(t.getAttribute("colspan")||1);if(d>1){c.colspan=d}const u=r;const h=u+a;const f=[...new Dz(i,{startRow:u,endRow:h,includeAllSlots:true})];let m=null;let g;for(const e of f){const{row:o,column:i,cell:r}=e;if(r===t&&g===undefined){g=i}if(g!==undefined&&g===i&&o===h){m=Cz(n,e.getPositionBefore(),c)}}wz("rowspan",a,t,n);return m}function gO(t,e){const n=[];const o=new Dz(t);for(const t of o){const{column:o,cellWidth:i}=t;const r=o+i-1;if(o<e&&e<=r){n.push(t)}}return n}function pO(t,e,n,o){const i=parseInt(t.getAttribute("colspan"));const r=n-e;const s={};const a=i-r;if(a>1){s.colspan=a}const c=parseInt(t.getAttribute("rowspan")||1);if(c>1){s.rowspan=c}const l=Cz(o,o.createPositionAfter(t),s);wz("colspan",r,t,o);return l}function bO(t,e,n,o,i,r){const s=parseInt(t.getAttribute("colspan")||1);const a=parseInt(t.getAttribute("rowspan")||1);const c=n+s-1;if(c>i){const e=i-n+1;wz("colspan",e,t,r,1)}const l=e+a-1;if(l>o){const n=o-e+1;wz("rowspan",n,t,r,1)}}function kO(t,e,n,o,i){const r=parseInt(e.getAttribute("headingRows")||0);if(r>0){const e=r-n;wz("headingRows",e,t,i,0)}const s=parseInt(e.getAttribute("headingColumns")||0);if(s>0){const e=s-o;wz("headingColumns",e,t,i,0)}}function wO(t,e){const n=e.getColumns(t);const o=new Array(n).fill(0);for(const{column:e}of new Dz(t)){o[e]++}const i=o.reduce(((t,e,n)=>e?t:[...t,n]),[]);if(i.length>0){const n=i[i.length-1];e.removeColumns(t,{at:n});return true}return false}function CO(t,e){const n=[];for(let e=0;e<t.childCount;e++){const o=t.getChild(e);if(o.isEmpty){n.push(e)}}if(n.length>0){const o=n[n.length-1];e.removeRows(t,{at:o});return true}return false}function AO(t,e){const n=wO(t,e);if(!n){CO(t,e)}}function _O(t,e){const n=Array.from(new Dz(t,{startColumn:e.firstColumn,endColumn:e.lastColumn,row:e.lastRow}));const o=n.every((({cellHeight:t})=>t===1));if(o){return e.lastRow}const i=n[0].cellHeight-1;return e.lastRow+i}function vO(t,e){const n=Array.from(new Dz(t,{startRow:e.firstRow,endRow:e.lastRow,column:e.lastColumn}));const o=n.every((({cellWidth:t})=>t===1));if(o){return e.lastColumn}const i=n[0].cellWidth-1;return e.lastColumn+i}class yO extends jn{constructor(t,e){super(t);this.direction=e.direction;this.isHorizontal=this.direction=="right"||this.direction=="left"}refresh(){const t=this._getMergeableCell();this.value=t;this.isEnabled=!!t}execute(){const t=this.editor.model;const e=t.document;const n=Xz(e.selection)[0];const o=this.value;const i=this.direction;t.change((t=>{const e=i=="right"||i=="down";const r=e?n:o;const s=e?o:n;const a=s.parent;DO(s,r,t);const c=this.isHorizontal?"colspan":"rowspan";const l=parseInt(n.getAttribute(c)||1);const d=parseInt(o.getAttribute(c)||1);t.setAttribute(c,l+d,r);t.setSelection(t.createRangeIn(r));const u=this.editor.plugins.get("TableUtils");const h=a.findAncestor("table");AO(h,u)}))}_getMergeableCell(){const t=this.editor.model;const e=t.document;const n=Xz(e.selection)[0];if(!n){return}const o=this.editor.plugins.get("TableUtils");const i=this.isHorizontal?xO(n,this.direction,o):EO(n,this.direction);if(!i){return}const r=this.isHorizontal?"rowspan":"colspan";const s=parseInt(n.getAttribute(r)||1);const a=parseInt(i.getAttribute(r)||1);if(a===s){return i}}}function xO(t,e,n){const o=t.parent;const i=o.parent;const r=e=="right"?t.nextSibling:t.previousSibling;const s=(i.getAttribute("headingColumns")||0)>0;if(!r){return}const a=e=="right"?t:r;const c=e=="right"?r:t;const{column:l}=n.getCellLocation(a);const{column:d}=n.getCellLocation(c);const u=parseInt(a.getAttribute("colspan")||1);const h=Az(n,a,i);const f=Az(n,c,i);if(s&&h!=f){return}const m=l+u===d;return m?r:undefined}function EO(t,e){const n=t.parent;const o=n.parent;const i=o.getChildIndex(n);if(e=="down"&&i===o.childCount-1||e=="up"&&i===0){return}const r=parseInt(t.getAttribute("rowspan")||1);const s=o.getAttribute("headingRows")||0;const a=e=="down"&&i+r===s;const c=e=="up"&&i===s;if(s&&(a||c)){return}const l=parseInt(t.getAttribute("rowspan")||1);const d=e=="down"?i+l:i;const u=[...new Dz(o,{endRow:d})];const h=u.find((e=>e.cell===t));const f=h.column;const m=u.find((({row:t,cellHeight:n,column:o})=>{if(o!==f){return false}if(e=="down"){return t===d}else{return d===t+n}}));return m&&m.cell}function DO(t,e,n){if(!SO(t)){if(SO(e)){n.remove(n.createRangeIn(e))}n.move(n.createRangeIn(t),n.createPositionAt(e,"end"))}n.remove(t)}function SO(t){return t.childCount==1&&t.getChild(0).is("element","paragraph")&&t.getChild(0).isEmpty}class BO extends jn{refresh(){const t=Zz(this.editor.model.document.selection);const e=t[0];if(e){const n=e.findAncestor("table");const o=this.editor.plugins.get("TableUtils").getRows(n);const i=o-1;const r=tO(t);const s=r.first===0&&r.last===i;this.isEnabled=!s}else{this.isEnabled=false}}execute(){const t=this.editor.model;const e=Zz(t.document.selection);const n=tO(e);const o=e[0];const i=o.findAncestor("table");const r=this.editor.plugins.get("TableUtils").getCellLocation(o).column;t.change((t=>{const e=n.last-n.first+1;this.editor.plugins.get("TableUtils").removeRows(i,{at:n.first,rows:e});const o=TO(i,n.first,r);t.setSelection(t.createPositionAt(o,0))}))}}function TO(t,e,n){const o=t.getChild(e)||t.getChild(t.childCount-1);let i=o.getChild(0);let r=0;for(const t of o.getChildren()){if(r>n){return i}i=t;r+=parseInt(t.getAttribute("colspan")||1)}return i}class PO extends jn{refresh(){const t=Zz(this.editor.model.document.selection);const e=t[0];if(e){const n=e.findAncestor("table");const o=this.editor.plugins.get("TableUtils").getColumns(n);const{first:i,last:r}=eO(t);this.isEnabled=r-i<o-1}else{this.isEnabled=false}}execute(){const[t,e]=RO(this.editor.model.document.selection);const n=t.parent.parent;const o=[...new Dz(n)];const i={first:o.find((e=>e.cell===t)).column,last:o.find((t=>t.cell===e)).column};const r=IO(o,t,e,i);this.editor.model.change((t=>{const e=i.last-i.first+1;this.editor.plugins.get("TableUtils").removeColumns(n,{at:i.first,columns:e});t.setSelection(t.createPositionAt(r,0))}))}}function IO(t,e,n,o){const i=parseInt(n.getAttribute("colspan")||1);if(i>1){return n}else if(e.previousSibling||n.nextSibling){return n.nextSibling||e.previousSibling}else{if(o.first){return t.reverse().find((({column:t})=>t<o.first)).cell}else{return t.reverse().find((({column:t})=>t>o.last)).cell}}}function RO(t){const e=Zz(t);const n=e[0];const o=e.pop();const i=[n,o];return n.isBefore(o)?i:i.reverse()}class FO extends jn{refresh(){const t=this.editor.model;const e=Zz(t.document.selection);const n=e.length>0;this.isEnabled=n;this.value=n&&e.every((t=>this._isInHeading(t,t.parent.parent)))}execute(t={}){if(t.forceValue===this.value){return}const e=this.editor.model;const n=Zz(e.document.selection);const o=n[0].findAncestor("table");const{first:i,last:r}=tO(n);const s=this.value?i:r+1;const a=o.getAttribute("headingRows")||0;e.change((t=>{if(s){const e=s>a?a:0;const n=fO(o,s,e);for(const{cell:e}of n){mO(e,s,t)}}wz("headingRows",s,o,t,0)}))}_isInHeading(t,e){const n=parseInt(e.getAttribute("headingRows")||0);return!!n&&t.parent.index<n}}class zO extends jn{refresh(){const t=this.editor.model;const e=Zz(t.document.selection);const n=this.editor.plugins.get("TableUtils");const o=e.length>0;this.isEnabled=o;this.value=o&&e.every((t=>Az(n,t)))}execute(t={}){if(t.forceValue===this.value){return}const e=this.editor.model;const n=Zz(e.document.selection);const o=n[0].findAncestor("table");const{first:i,last:r}=eO(n);const s=this.value?i:r+1;e.change((t=>{if(s){const e=gO(o,s);for(const{cell:n,column:o}of e){pO(n,o,s,t)}}wz("headingColumns",s,o,t,0)}))}}class OO extends Kn{static get pluginName(){return"TableUtils"}init(){this.decorate("insertColumns");this.decorate("insertRows")}getCellLocation(t){const e=t.parent;const n=e.parent;const o=n.getChildIndex(e);const i=new Dz(n,{row:o});for(const{cell:e,row:n,column:o}of i){if(e===t){return{row:n,column:o}}}}createTable(t,e){const n=t.createElement("table");const o=parseInt(e.rows)||2;const i=parseInt(e.columns)||2;NO(t,n,0,o,i);if(e.headingRows){wz("headingRows",e.headingRows,n,t,0)}if(e.headingColumns){wz("headingColumns",e.headingColumns,n,t,0)}return n}insertRows(t,e={}){const n=this.editor.model;const o=e.at||0;const i=e.rows||1;const r=e.copyStructureFromAbove!==undefined;const s=e.copyStructureFromAbove?o-1:o;const a=this.getRows(t);const c=this.getColumns(t);n.change((e=>{const n=t.getAttribute("headingRows")||0;if(n>o){wz("headingRows",n+i,t,e,0)}if(!r&&(o===0||o===a)){NO(e,t,o,i,c);return}const l=r?Math.max(o,s):o;const d=new Dz(t,{endRow:l});const u=new Array(c).fill(1);for(const{row:t,column:n,cellHeight:a,cellWidth:c,cell:l}of d){const d=t+a-1;const h=t<o&&o<=d;const f=t<=s&&s<=d;if(h){e.setAttribute("rowspan",a+i,l);u[n]=-c}else if(r&&f){u[n]=c}}for(let n=0;n<i;n++){const n=e.createElement("tableRow");e.insert(n,t,o);for(let t=0;t<u.length;t++){const o=u[t];const i=e.createPositionAt(n,"end");if(o>0){Cz(e,i,o>1?{colspan:o}:null)}t+=Math.abs(o)-1}}}))}insertColumns(t,e={}){const n=this.editor.model;const o=e.at||0;const i=e.columns||1;n.change((e=>{const n=t.getAttribute("headingColumns");if(o<n){e.setAttribute("headingColumns",n+i,t)}const r=this.getColumns(t);if(o===0||r===o){for(const n of t.getChildren()){MO(i,e,e.createPositionAt(n,o?"end":0))}return}const s=new Dz(t,{column:o,includeAllSlots:true});for(const t of s){const{row:n,cell:r,cellAnchorColumn:a,cellAnchorRow:c,cellWidth:l,cellHeight:d}=t;if(a<o){e.setAttribute("colspan",l+i,r);const t=c+d-1;for(let e=n;e<=t;e++){s.skipRow(e)}}else{MO(i,e,t.getPositionBefore())}}}))}removeRows(t,e){const n=this.editor.model;const o=e.rows||1;const i=e.at;const r=i+o-1;n.change((e=>{const{cellsToMove:n,cellsToTrim:o}=KO(t,i,r);if(n.size){const o=r+1;qO(t,o,n,e)}for(let n=r;n>=i;n--){e.remove(t.getChild(n))}for(const{rowspan:t,cell:n}of o){wz("rowspan",t,n,e)}HO(t,i,r,e);if(!wO(t,this)){CO(t,this)}}))}removeColumns(t,e){const n=this.editor.model;const o=e.at;const i=e.columns||1;const r=e.at+i-1;n.change((e=>{LO(t,{first:o,last:r},e);for(let n=r;n>=o;n--){for(const{cell:o,column:i,cellWidth:r}of[...new Dz(t)]){if(i<=n&&r>1&&i+r>n){wz("colspan",r-1,o,e)}else if(i===n){e.remove(o)}}}if(!CO(t,this)){wO(t,this)}}))}splitCellVertically(t,e=2){const n=this.editor.model;const o=t.parent;const i=o.parent;const r=parseInt(t.getAttribute("rowspan")||1);const s=parseInt(t.getAttribute("colspan")||1);n.change((n=>{if(s>1){const{newCellsSpan:o,updatedSpan:i}=VO(s,e);wz("colspan",i,t,n);const a={};if(o>1){a.colspan=o}if(r>1){a.rowspan=r}const c=s>e?e-1:s-1;MO(c,n,n.createPositionAfter(t),a)}if(s<e){const o=e-s;const a=[...new Dz(i)];const{column:c}=a.find((({cell:e})=>e===t));const l=a.filter((({cell:e,cellWidth:n,column:o})=>{const i=e!==t&&o===c;const r=o<c&&o+n>c;return i||r}));for(const{cell:t,cellWidth:e}of l){n.setAttribute("colspan",e+o,t)}const d={};if(r>1){d.rowspan=r}MO(o,n,n.createPositionAfter(t),d);const u=i.getAttribute("headingColumns")||0;if(u>c){wz("headingColumns",u+o,i,n)}}}))}splitCellHorizontally(t,e=2){const n=this.editor.model;const o=t.parent;const i=o.parent;const r=i.getChildIndex(o);const s=parseInt(t.getAttribute("rowspan")||1);const a=parseInt(t.getAttribute("colspan")||1);n.change((n=>{if(s>1){const o=[...new Dz(i,{startRow:r,endRow:r+s-1,includeAllSlots:true})];const{newCellsSpan:c,updatedSpan:l}=VO(s,e);wz("rowspan",l,t,n);const{column:d}=o.find((({cell:e})=>e===t));const u={};if(c>1){u.rowspan=c}if(a>1){u.colspan=a}for(const t of o){const{column:e,row:o}=t;const i=o>=r+l;const s=e===d;const a=(o+r+l)%c===0;if(i&&s&&a){MO(1,n,t.getPositionBefore(),u)}}}if(s<e){const o=e-s;const c=[...new Dz(i,{startRow:0,endRow:r})];for(const{cell:e,cellHeight:i,row:s}of c){if(e!==t&&s+i>r){const t=i+o;n.setAttribute("rowspan",t,e)}}const l={};if(a>1){l.colspan=a}NO(n,i,r+1,o,1,l);const d=i.getAttribute("headingRows")||0;if(d>r){wz("headingRows",d+o,i,n)}}}))}getColumns(t){const e=t.getChild(0);return[...e.getChildren()].reduce(((t,e)=>{const n=parseInt(e.getAttribute("colspan")||1);return t+n}),0)}getRows(t){return t.childCount}}function NO(t,e,n,o,i,r={}){for(let s=0;s<o;s++){const o=t.createElement("tableRow");t.insert(o,e,n);MO(i,t,t.createPositionAt(o,"end"),r)}}function MO(t,e,n,o={}){for(let i=0;i<t;i++){Cz(e,n,o)}}function VO(t,e){if(t<e){return{newCellsSpan:1,updatedSpan:1}}const n=Math.floor(t/e);const o=t-n*e+n;return{newCellsSpan:n,updatedSpan:o}}function LO(t,e,n){const o=t.getAttribute("headingColumns")||0;if(o&&e.first<o){const i=Math.min(o-1,e.last)-e.first+1;n.setAttribute("headingColumns",o-i,t)}}function HO(t,e,n,o){const i=t.getAttribute("headingRows")||0;if(e<i){const r=n<i?i-(n-e+1):e;wz("headingRows",r,t,o,0)}}function KO(t,e,n){const o=new Map;const i=[];for(const{row:r,column:s,cellHeight:a,cell:c}of new Dz(t,{endRow:n})){const t=r+a-1;const l=r>=e&&r<=n&&t>n;if(l){const t=n-r+1;const e=a-t;o.set(s,{cell:c,rowspan:e})}const d=r<e&&t>=e;if(d){let o;if(t>=n){o=n-e+1}else{o=t-e+1}i.push({cell:c,rowspan:a-o})}}return{cellsToMove:o,cellsToTrim:i}}function qO(t,e,n,o){const i=new Dz(t,{includeAllSlots:true,row:e});const r=[...i];const s=t.getChild(e);let a;for(const{column:t,cell:e,isAnchor:i}of r){if(n.has(t)){const{cell:e,rowspan:i}=n.get(t);const r=a?o.createPositionAfter(a):o.createPositionAt(s,0);o.move(o.createRangeOn(e),r);wz("rowspan",i,e,o);a=e}else if(i){a=e}}}class jO extends jn{refresh(){const t=Qz(this.editor.model.document.selection);this.isEnabled=nO(t,this.editor.plugins.get(OO))}execute(){const t=this.editor.model;const e=this.editor.plugins.get(OO);t.change((n=>{const o=Qz(t.document.selection);const i=o.shift();const{mergeWidth:r,mergeHeight:s}=UO(i,o,e);wz("colspan",r,i,n);wz("rowspan",s,i,n);for(const t of o){WO(t,i,n)}const a=i.findAncestor("table");AO(a,e);n.setSelection(i,"in")}))}}function WO(t,e,n){if(!GO(t)){if(GO(e)){n.remove(n.createRangeIn(e))}n.move(n.createRangeIn(t),n.createPositionAt(e,"end"))}n.remove(t)}function GO(t){return t.childCount==1&&t.getChild(0).is("element","paragraph")&&t.getChild(0).isEmpty}function UO(t,e,n){let o=0;let i=0;for(const t of e){const{row:e,column:r}=n.getCellLocation(t);o=$O(t,r,o,"colspan");i=$O(t,e,i,"rowspan")}const{row:r,column:s}=n.getCellLocation(t);const a=o-s;const c=i-r;return{mergeWidth:a,mergeHeight:c}}function $O(t,e,n,o){const i=parseInt(t.getAttribute(o)||1);return Math.max(n,e+i)}class JO extends jn{refresh(){const t=Zz(this.editor.model.document.selection);this.isEnabled=t.length>0}execute(){const t=this.editor.model;const e=Zz(t.document.selection);const n=tO(e);const o=e[0].findAncestor("table");const i=[];for(let e=n.first;e<=n.last;e++){for(const n of o.getChild(e).getChildren()){i.push(t.createRangeOn(n))}}t.change((t=>{t.setSelection(i)}))}}class YO extends jn{refresh(){const t=Zz(this.editor.model.document.selection);this.isEnabled=t.length>0}execute(){const t=this.editor.model;const e=Zz(t.document.selection);const n=e[0];const o=e.pop();const i=n.findAncestor("table");const r=this.editor.plugins.get("TableUtils");const s=r.getCellLocation(n);const a=r.getCellLocation(o);const c=Math.min(s.column,a.column);const l=Math.max(s.column,a.column);const d=[];for(const e of new Dz(i,{startColumn:c,endColumn:l})){d.push(t.createRangeOn(e.cell))}t.change((t=>{t.setSelection(d)}))}}function QO(t){t.document.registerPostFixer((e=>XO(e,t)))}function XO(t,e){const n=e.document.differ.getChanges();let o=false;const i=new Set;for(const e of n){let n;if(e.name=="table"&&e.type=="insert"){n=e.position.nodeAfter}if(e.name=="tableRow"||e.name=="tableCell"){n=e.position.findAncestor("table")}if(oN(e)){n=e.range.start.findAncestor("table")}if(n&&!i.has(n)){o=ZO(n,t)||o;o=tN(n,t)||o;i.add(n)}}return o}function ZO(t,e){let n=false;const o=eN(t);if(o.length){n=true;for(const t of o){wz("rowspan",t.rowspan,t.cell,e,1)}}return n}function tN(t,e){let n=false;const o=nN(t);const i=[];for(const[t,e]of o.entries()){if(!e){i.push(t)}}if(i.length){n=true;for(const n of i.reverse()){e.remove(t.getChild(n));o.splice(n,1)}}const r=o[0];const s=o.every((t=>t===r));if(!s){const i=o.reduce(((t,e)=>e>t?e:t),0);for(const[r,s]of o.entries()){const o=i-s;if(o){for(let n=0;n<o;n++){Cz(e,e.createPositionAt(t.getChild(r),"end"))}n=true}}}return n}function eN(t){const e=parseInt(t.getAttribute("headingRows")||0);const n=t.childCount;const o=[];for(const{row:i,cell:r,cellHeight:s}of new Dz(t)){if(s<2){continue}const t=i<e;const a=t?e:n;if(i+s>a){const t=a-i;o.push({cell:r,rowspan:t})}}return o}function nN(t){const e=new Array(t.childCount).fill(0);for(const{row:n}of new Dz(t,{includeAllSlots:true})){e[n]++}return e}function oN(t){const e=t.type==="attribute";const n=t.attributeKey;return e&&(n==="headingRows"||n==="colspan"||n==="rowspan")}function iN(t){t.document.registerPostFixer((e=>rN(e,t)))}function rN(t,e){const n=e.document.differ.getChanges();let o=false;for(const e of n){if(e.type=="insert"&&e.name=="table"){o=sN(e.position.nodeAfter,t)||o}if(e.type=="insert"&&e.name=="tableRow"){o=aN(e.position.nodeAfter,t)||o}if(e.type=="insert"&&e.name=="tableCell"){o=cN(e.position.nodeAfter,t)||o}if(lN(e)){o=cN(e.position.parent,t)||o}}return o}function sN(t,e){let n=false;for(const o of t.getChildren()){n=aN(o,e)||n}return n}function aN(t,e){let n=false;for(const o of t.getChildren()){n=cN(o,e)||n}return n}function cN(t,e){if(t.childCount==0){e.insertElement("paragraph",t);return true}const n=Array.from(t.getChildren()).filter((t=>t.is("$text")));for(const t of n){e.wrap(e.createRangeOn(t),"paragraph")}return!!n.length}function lN(t){if(!t.position||!t.position.parent.is("element","tableCell")){return false}return t.type=="insert"&&t.name=="$text"||t.type=="remove"}function dN(t,e){t.document.registerPostFixer((()=>uN(t.document.differ,e)))}function uN(t,e){const n=new Set;for(const e of t.getChanges()){const t=e.type=="attribute"?e.range.start.parent:e.position.parent;if(t.is("element","tableCell")){n.add(t)}}for(const o of n.values()){for(const n of[...o.getChildren()].filter((t=>hN(t,e)))){t.refreshItem(n)}}return false}function hN(t,e){if(!t.is("element","paragraph")){return false}const n=e.toViewElement(t);if(!n){return false}return zz(t)!==n.is("element","span")}function fN(t){t.document.registerPostFixer((()=>mN(t)))}function mN(t){const e=t.document.differ;const n=new Set;for(const t of e.getChanges()){if(t.type!="attribute"){continue}const e=t.range.start.nodeAfter;if(e&&e.is("element","table")&&t.attributeKey=="headingRows"){n.add(e)}}if(n.size){for(const t of n.values()){e.refreshItem(t)}return true}return false}var gN=n(61);var pN={injectType:"singletonStyleTag",attributes:{"data-cke":true}};pN.insert="head";pN.singleton=true;var bN=wk()(gN["a"],pN);var kN=gN["a"].locals||{};class wN extends Kn{static get pluginName(){return"TableEditing"}init(){const t=this.editor;const e=t.model;const n=e.schema;const o=t.conversion;n.register("table",{allowWhere:"$block",allowAttributes:["headingRows","headingColumns"],isObject:true,isBlock:true});n.register("tableRow",{allowIn:"table",isLimit:true});n.register("tableCell",{allowIn:"tableRow",allowAttributes:["colspan","rowspan"],isLimit:true,isSelectable:true});n.extend("$block",{allowIn:"tableCell"});n.addChildCheck(((t,e)=>{if(e.name=="table"&&Array.from(t.getNames()).includes("table")){return false}}));o.for("upcast").add(_z());o.for("editingDowncast").add(Bz({asWidget:true}));o.for("dataDowncast").add(Bz());o.for("upcast").elementToElement({model:"tableRow",view:"tr"});o.for("upcast").add(vz());o.for("editingDowncast").add(Tz());o.for("editingDowncast").add(Rz());o.for("upcast").elementToElement({model:"tableCell",view:"td"});o.for("upcast").elementToElement({model:"tableCell",view:"th"});o.for("upcast").add(yz("td"));o.for("upcast").add(yz("th"));o.for("editingDowncast").add(Pz());t.conversion.for("editingDowncast").elementToElement({model:"paragraph",view:Fz,converterPriority:"high"});o.attributeToAttribute({model:"colspan",view:"colspan"});o.attributeToAttribute({model:"rowspan",view:"rowspan"});o.for("editingDowncast").add(Iz());t.commands.add("insertTable",new Jz(t));t.commands.add("insertTableRowAbove",new lO(t,{order:"above"}));t.commands.add("insertTableRowBelow",new lO(t,{order:"below"}));t.commands.add("insertTableColumnLeft",new dO(t,{order:"left"}));t.commands.add("insertTableColumnRight",new dO(t,{order:"right"}));t.commands.add("removeTableRow",new BO(t));t.commands.add("removeTableColumn",new PO(t));t.commands.add("splitTableCellVertically",new uO(t,{direction:"vertically"}));t.commands.add("splitTableCellHorizontally",new uO(t,{direction:"horizontally"}));t.commands.add("mergeTableCells",new jO(t));t.commands.add("mergeTableCellRight",new yO(t,{direction:"right"}));t.commands.add("mergeTableCellLeft",new yO(t,{direction:"left"}));t.commands.add("mergeTableCellDown",new yO(t,{direction:"down"}));t.commands.add("mergeTableCellUp",new yO(t,{direction:"up"}));t.commands.add("setTableColumnHeader",new zO(t));t.commands.add("setTableRowHeader",new FO(t));t.commands.add("selectTableRow",new JO(t));t.commands.add("selectTableColumn",new YO(t));fN(e);QO(e);dN(e,t.editing.mapper);iN(e)}static get requires(){return[OO]}}var CN=n(62);var AN={injectType:"singletonStyleTag",attributes:{"data-cke":true}};AN.insert="head";AN.singleton=true;var _N=wk()(CN["a"],AN);var vN=CN["a"].locals||{};class yN extends yk{constructor(t){super(t);const e=this.bindTemplate;this.items=this._createGridCollection();this.set("rows",0);this.set("columns",0);this.bind("label").to(this,"columns",this,"rows",((t,e)=>`${e} × ${t}`));this.setTemplate({tag:"div",attributes:{class:["ck"]},children:[{tag:"div",attributes:{class:["ck-insert-table-dropdown__grid"]},on:{"mouseover@.ck-insert-table-dropdown-grid-box":e.to("boxover")},children:this.items},{tag:"div",attributes:{class:["ck-insert-table-dropdown__label"]},children:[{text:e.to("label")}]}],on:{mousedown:e.to((t=>{t.preventDefault()})),click:e.to((()=>{this.fire("execute")}))}});this.on("boxover",((t,e)=>{const{row:n,column:o}=e.target.dataset;this.set({rows:parseInt(n),columns:parseInt(o)})}));this.on("change:columns",(()=>{this._highlightGridBoxes()}));this.on("change:rows",(()=>{this._highlightGridBoxes()}))}focus(){}focusLast(){}_highlightGridBoxes(){const t=this.rows;const e=this.columns;this.items.map(((n,o)=>{const i=Math.floor(o/10);const r=o%10;const s=i<t&&r<e;n.set("isOn",s)}))}_createGridCollection(){const t=[];for(let e=0;e<100;e++){const n=Math.floor(e/10);const o=e%10;t.push(new xN(this.locale,n+1,o+1))}return this.createCollection(t)}}class xN extends yk{constructor(t,e,n){super(t);const o=this.bindTemplate;this.set("isOn",false);this.setTemplate({tag:"div",attributes:{class:["ck-insert-table-dropdown-grid-box",o.if("isOn","ck-on")],"data-row":e,"data-column":n}})}}var EN='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 6v3h4V6H3zm0 4v3h4v-3H3zm0 4v3h4v-3H3zm5 3h4v-3H8v3zm5 0h4v-3h-4v3zm4-4v-3h-4v3h4zm0-4V6h-4v3h4zm1.5 8a1.5 1.5 0 0 1-1.5 1.5H3A1.5 1.5 0 0 1 1.5 17V4c.222-.863 1.068-1.5 2-1.5h13c.932 0 1.778.637 2 1.5v13zM12 13v-3H8v3h4zm0-4V6H8v3h4z"/></svg>';var DN='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1zM2 2v16h16V2H2z" opacity=".6"/><path d="M18 7v1H2V7h16zm0 5v1H2v-1h16z" opacity=".6"/><path d="M14 1v18a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V1a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1zm-2 1H8v4h4V2zm0 6H8v4h4V8zm0 6H8v4h4v-4z"/></svg>';var SN='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1zM2 2v16h16V2H2z" opacity=".6"/><path d="M7 2h1v16H7V2zm5 0h1v16h-1V2z" opacity=".6"/><path d="M1 6h18a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1zm1 2v4h4V8H2zm6 0v4h4V8H8zm6 0v4h4V8h-4z"/></svg>';var BN='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1zM2 2v16h16V2H2z" opacity=".6"/><path d="M7 2h1v16H7V2zm5 0h1v7h-1V2zm6 5v1H2V7h16zM8 12v1H2v-1h6z" opacity=".6"/><path d="M7 7h12a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1zm1 2v9h10V9H8z"/></svg>';class TN extends Kn{static get pluginName(){return"TableUI"}init(){const t=this.editor;const e=this.editor.t;const n=t.locale.contentLanguageDirection;const o=n==="ltr";t.ui.componentFactory.add("insertTable",(n=>{const o=t.commands.get("insertTable");const i=xC(n);i.bind("isEnabled").to(o);i.buttonView.set({icon:EN,label:e("Insert table"),tooltip:true});let r;i.on("change:isOpen",(()=>{if(r){return}r=new yN(n);i.panelView.children.add(r);r.delegate("execute").to(i);i.buttonView.on("open",(()=>{r.rows=0;r.columns=0}));i.on("execute",(()=>{t.execute("insertTable",{rows:r.rows,columns:r.columns});t.editing.view.focus()}))}));return i}));t.ui.componentFactory.add("tableColumn",(t=>{const n=[{type:"switchbutton",model:{commandName:"setTableColumnHeader",label:e("Header column"),bindIsOn:true}},{type:"separator"},{type:"button",model:{commandName:o?"insertTableColumnLeft":"insertTableColumnRight",label:e("Insert column left")}},{type:"button",model:{commandName:o?"insertTableColumnRight":"insertTableColumnLeft",label:e("Insert column right")}},{type:"button",model:{commandName:"removeTableColumn",label:e("Delete column")}},{type:"button",model:{commandName:"selectTableColumn",label:e("Select column")}}];return this._prepareDropdown(e("Column"),DN,n,t)}));t.ui.componentFactory.add("tableRow",(t=>{const n=[{type:"switchbutton",model:{commandName:"setTableRowHeader",label:e("Header row"),bindIsOn:true}},{type:"separator"},{type:"button",model:{commandName:"insertTableRowAbove",label:e("Insert row above")}},{type:"button",model:{commandName:"insertTableRowBelow",label:e("Insert row below")}},{type:"button",model:{commandName:"removeTableRow",label:e("Delete row")}},{type:"button",model:{commandName:"selectTableRow",label:e("Select row")}}];return this._prepareDropdown(e("Row"),SN,n,t)}));t.ui.componentFactory.add("mergeTableCells",(t=>{const n=[{type:"button",model:{commandName:"mergeTableCellUp",label:e("Merge cell up")}},{type:"button",model:{commandName:o?"mergeTableCellRight":"mergeTableCellLeft",label:e("Merge cell right")}},{type:"button",model:{commandName:"mergeTableCellDown",label:e("Merge cell down")}},{type:"button",model:{commandName:o?"mergeTableCellLeft":"mergeTableCellRight",label:e("Merge cell left")}},{type:"separator"},{type:"button",model:{commandName:"splitTableCellVertically",label:e("Split cell vertically")}},{type:"button",model:{commandName:"splitTableCellHorizontally",label:e("Split cell horizontally")}}];return this._prepareMergeSplitButtonDropdown(e("Merge cells"),BN,n,t)}))}_prepareDropdown(t,e,n,o){const i=this.editor;const r=xC(o);const s=this._fillDropdownWithListOptions(r,n);r.buttonView.set({label:t,icon:e,tooltip:true});r.bind("isEnabled").toMany(s,"isEnabled",((...t)=>t.some((t=>t))));this.listenTo(r,"execute",(t=>{i.execute(t.source.commandName);i.editing.view.focus()}));return r}_prepareMergeSplitButtonDropdown(t,e,n,o){const i=this.editor;const r=xC(o,Nw);const s="mergeTableCells";this._fillDropdownWithListOptions(r,n);r.buttonView.set({label:t,icon:e,tooltip:true,isEnabled:true});this.listenTo(r.buttonView,"execute",(()=>{i.execute(s);i.editing.view.focus()}));this.listenTo(r,"execute",(t=>{i.execute(t.source.commandName);i.editing.view.focus()}));return r}_fillDropdownWithListOptions(t,e){const n=this.editor;const o=[];const i=new ka;for(const t of e){PN(t,n,o,i)}DC(t,i,n.ui.componentFactory);return o}}function PN(t,e,n,o){const i=t.model=new dA(t.model);const{commandName:r,bindIsOn:s}=t.model;if(t.type==="button"||t.type==="switchbutton"){const t=e.commands.get(r);n.push(t);i.set({commandName:r});i.bind("isEnabled").to(t);if(s){i.bind("isOn").to(t,"value")}}i.set({withText:true});o.add(t)}var IN=n(63);var RN={injectType:"singletonStyleTag",attributes:{"data-cke":true}};RN.insert="head";RN.singleton=true;var FN=wk()(IN["a"],RN);var zN=IN["a"].locals||{};class ON extends Kn{static get pluginName(){return"TableSelection"}static get requires(){return[OO]}init(){const t=this.editor;const e=t.model;this.listenTo(e,"deleteContent",((t,e)=>this._handleDeleteContent(t,e)),{priority:"high"});this._defineSelectionConverter();this._enablePluginDisabling()}getSelectedTableCells(){const t=this.editor.model.document.selection;const e=Qz(t);if(e.length==0){return null}return e}getSelectionAsFragment(){const t=this.getSelectedTableCells();if(!t){return null}return this.editor.model.change((e=>{const n=e.createDocumentFragment();const o=this.editor.plugins.get("TableUtils");const{first:i,last:r}=eO(t);const{first:s,last:a}=tO(t);const c=t[0].findAncestor("table");let l=a;let d=r;if(nO(t,o)){const t={firstColumn:i,lastColumn:r,firstRow:s,lastRow:a};l=_O(c,t);d=vO(c,t)}const u={startRow:s,startColumn:i,endRow:l,endColumn:d};const h=hO(c,u,e);e.insert(h,n,0);return n}))}setCellSelection(t,e){const n=this._getCellsToSelect(t,e);this.editor.model.change((t=>{t.setSelection(n.cells.map((e=>t.createRangeOn(e))),{backward:n.backward})}))}getFocusCell(){const t=this.editor.model.document.selection;const e=[...t.getRanges()].pop();const n=e.getContainedElement();if(n&&n.is("element","tableCell")){return n}return null}getAnchorCell(){const t=this.editor.model.document.selection;const e=ff(t.getRanges());const n=e.getContainedElement();if(n&&n.is("element","tableCell")){return n}return null}_defineSelectionConverter(){const t=this.editor;const e=new Set;t.conversion.for("editingDowncast").add((t=>t.on("selection",((t,o,i)=>{const r=i.writer;n(r);const s=this.getSelectedTableCells();if(!s){return}for(const t of s){const n=i.mapper.toViewElement(t);r.addClass("ck-editor__editable_selected",n);e.add(n)}const a=i.mapper.toViewElement(s[s.length-1]);r.setSelection(a,0)}),{priority:"lowest"})));function n(t){for(const n of e){t.removeClass("ck-editor__editable_selected",n)}e.clear()}}_enablePluginDisabling(){const t=this.editor;this.on("change:isEnabled",(()=>{if(!this.isEnabled){const e=this.getSelectedTableCells();if(!e){return}t.model.change((n=>{const o=n.createPositionAt(e[0],0);const i=t.model.schema.getNearestSelectionRange(o);n.setSelection(i)}))}}))}_handleDeleteContent(t,e){const[n,o]=e;const i=this.editor.model;const r=!o||o.direction=="backward";const s=Qz(n);if(!s.length){return}t.stop();i.change((t=>{const e=s[r?s.length-1:0];i.change((t=>{for(const e of s){i.deleteContent(t.createSelection(e,"in"))}}));const o=i.schema.getNearestSelectionRange(t.createPositionAt(e,0));if(n.is("documentSelection")){t.setSelection(o)}else{n.setTo(o)}}))}_getCellsToSelect(t,e){const n=this.editor.plugins.get("TableUtils");const o=n.getCellLocation(t);const i=n.getCellLocation(e);const r=Math.min(o.row,i.row);const s=Math.max(o.row,i.row);const a=Math.min(o.column,i.column);const c=Math.max(o.column,i.column);const l=new Array(s-r+1).fill(null).map((()=>[]));const d={startRow:r,endRow:s,startColumn:a,endColumn:c};for(const{row:e,cell:n}of new Dz(t.findAncestor("table"),d)){l[e-r].push(n)}const u=i.row<o.row;const h=i.column<o.column;if(u){l.reverse()}if(h){l.forEach((t=>t.reverse()))}return{cells:l.flat(),backward:u||h}}}class NN extends Kn{static get pluginName(){return"TableClipboard"}static get requires(){return[ON,OO]}init(){const t=this.editor;const e=t.editing.view.document;this.listenTo(e,"copy",((t,e)=>this._onCopyCut(t,e)));this.listenTo(e,"cut",((t,e)=>this._onCopyCut(t,e)));this.listenTo(t.model,"insertContent",((t,e)=>this._onInsertContent(t,...e)),{priority:"high"});this.decorate("_replaceTableSlotCell")}_onCopyCut(t,e){const n=this.editor.plugins.get(ON);if(!n.getSelectedTableCells()){return}if(t.name=="cut"&&this.editor.isReadOnly){return}e.preventDefault();t.stop();const o=this.editor.data;const i=this.editor.editing.view.document;const r=o.toView(n.getSelectionAsFragment());i.fire("clipboardOutput",{dataTransfer:e.dataTransfer,content:r,method:t.name})}_onInsertContent(t,e,n){if(n&&!n.is("documentSelection")){return}const o=this.editor.model;const i=this.editor.plugins.get(OO);let r=MN(e,o);if(!r){return}const s=Zz(o.document.selection);if(!s.length){AO(r,i);return}t.stop();o.change((t=>{const e={width:i.getColumns(r),height:i.getRows(r)};const n=VN(s,e,t,i);const o=n.lastRow-n.firstRow+1;const a=n.lastColumn-n.firstColumn+1;const c={startRow:0,startColumn:0,endRow:Math.min(o,e.height)-1,endColumn:Math.min(a,e.width)-1};r=hO(r,c,t);const l=s[0].findAncestor("table");const d=this._replaceSelectedCellsWithPasted(r,e,l,n,t);if(this.editor.plugins.get("TableSelection").isEnabled){const e=oO(d.map((e=>t.createRangeOn(e))));t.setSelection(e)}else{t.setSelection(d[0],0)}}))}_replaceSelectedCellsWithPasted(t,e,n,o,i){const{width:r,height:s}=e;const a=HN(t,r,s);const c=[...new Dz(n,{startRow:o.firstRow,endRow:o.lastRow,startColumn:o.firstColumn,endColumn:o.lastColumn,includeAllSlots:true})];const l=[];let d;for(const t of c){const{row:e,column:n}=t;if(n===o.firstColumn){d=t.getPositionBefore()}const c=e-o.firstRow;const u=n-o.firstColumn;const h=a[c%s][u%r];const f=h?i.cloneElement(h):null;const m=this._replaceTableSlotCell(t,f,d,i);if(!m){continue}bO(m,e,n,o.lastRow,o.lastColumn,i);l.push(m);d=i.createPositionAfter(m)}const u=parseInt(n.getAttribute("headingRows")||0);const h=parseInt(n.getAttribute("headingColumns")||0);const f=o.firstRow<u&&u<=o.lastRow;const m=o.firstColumn<h&&h<=o.lastColumn;if(f){const t={first:o.firstColumn,last:o.lastColumn};const e=qN(n,u,t,i,o.firstRow);l.push(...e)}if(m){const t={first:o.firstRow,last:o.lastRow};const e=jN(n,h,t,i);l.push(...e)}return l}_replaceTableSlotCell(t,e,n,o){const{cell:i,isAnchor:r}=t;if(r){o.remove(i)}if(!e){return null}o.insert(e,n);return e}}function MN(t,e){if(!t.is("documentFragment")&&!t.is("element")){return null}if(t.is("element","table")){return t}if(t.childCount==1&&t.getChild(0).is("element","table")){return t.getChild(0)}const n=e.createRangeIn(t);for(const t of n.getItems()){if(t.is("element","table")){const o=e.createRange(n.start,e.createPositionBefore(t));if(e.hasContent(o,{ignoreWhitespaces:true})){return null}const i=e.createRange(e.createPositionAfter(t),n.end);if(e.hasContent(i,{ignoreWhitespaces:true})){return null}return t}}return null}function VN(t,e,n,o){const i=t[0].findAncestor("table");const r=eO(t);const s=tO(t);const a={firstColumn:r.first,lastColumn:r.last,firstRow:s.first,lastRow:s.last};const c=t.length===1;if(c){a.lastRow+=e.height-1;a.lastColumn+=e.width-1;LN(i,a.lastRow+1,a.lastColumn+1,o)}if(c||!nO(t,o)){KN(i,a,n)}else{a.lastRow=_O(i,a);a.lastColumn=vO(i,a)}return a}function LN(t,e,n,o){const i=o.getColumns(t);const r=o.getRows(t);if(n>i){o.insertColumns(t,{at:i,columns:n-i})}if(e>r){o.insertRows(t,{at:r,rows:e-r})}}function HN(t,e,n){const o=new Array(n).fill(null).map((()=>new Array(e).fill(null)));for(const{column:e,row:n,cell:i}of new Dz(t)){o[n][e]=i}return o}function KN(t,e,n){const{firstRow:o,lastRow:i,firstColumn:r,lastColumn:s}=e;const a={first:o,last:i};const c={first:r,last:s};jN(t,r,a,n);jN(t,s+1,a,n);qN(t,o,c,n);qN(t,i+1,c,n,o)}function qN(t,e,n,o,i=0){if(e<1){return}const r=fO(t,e,i);const s=r.filter((({column:t,cellWidth:e})=>WN(t,e,n)));return s.map((({cell:t})=>mO(t,e,o)))}function jN(t,e,n,o){if(e<1){return}const i=gO(t,e);const r=i.filter((({row:t,cellHeight:e})=>WN(t,e,n)));return r.map((({cell:t,column:n})=>pO(t,n,e,o)))}function WN(t,e,n){const o=t+e-1;const{first:i,last:r}=n;const s=t>=i&&t<=r;const a=t<i&&o>=i;return s||a}class GN extends Kn{static get pluginName(){return"TableKeyboard"}static get requires(){return[ON]}init(){const t=this.editor.editing.view;const e=t.document;this.editor.keystrokes.set("Tab",((...t)=>this._handleTabOnSelectedTable(...t)),{priority:"low"});this.editor.keystrokes.set("Tab",this._getTabHandler(true),{priority:"low"});this.editor.keystrokes.set("Shift+Tab",this._getTabHandler(false),{priority:"low"});this.listenTo(e,"arrowKey",((...t)=>this._onArrowKey(...t)),{context:"table"})}_handleTabOnSelectedTable(t,e){const n=this.editor;const o=n.model.document.selection;const i=o.getSelectedElement();if(!i||!i.is("element","table")){return}e();n.model.change((t=>{t.setSelection(t.createRangeIn(i.getChild(0).getChild(0)))}))}_getTabHandler(t){const e=this.editor;return(n,o)=>{const i=e.model.document.selection;let r=Xz(i)[0];if(!r){r=this.editor.plugins.get("TableSelection").getFocusCell()}if(!r){return}o();const s=r.parent;const a=s.parent;const c=a.getChildIndex(s);const l=s.getChildIndex(r);const d=l===0;if(!t&&d&&c===0){e.model.change((t=>{t.setSelection(t.createRangeOn(a))}));return}const u=l===s.childCount-1;const h=c===a.childCount-1;if(t&&h&&u){e.execute("insertTableRowBelow");if(c===a.childCount-1){e.model.change((t=>{t.setSelection(t.createRangeOn(a))}));return}}let f;if(t&&u){const t=a.getChild(c+1);f=t.getChild(0)}else if(!t&&d){const t=a.getChild(c-1);f=t.getChild(t.childCount-1)}else{f=s.getChild(l+(t?1:-1))}e.model.change((t=>{t.setSelection(t.createRangeIn(f))}))}}_onArrowKey(t,e){const n=this.editor;const o=e.keyCode;const i=sd(o,n.locale.contentLanguageDirection);const r=this._handleArrowKeys(i,e.shiftKey);if(r){e.preventDefault();e.stopPropagation();t.stop()}}_handleArrowKeys(t,e){const n=this.editor.model;const o=n.document.selection;const i=["right","down"].includes(t);const r=Qz(o);if(r.length){let n;if(e){n=this.editor.plugins.get("TableSelection").getFocusCell()}else{n=i?r[r.length-1]:r[0]}this._navigateFromCellInDirection(n,t,e);return true}const s=o.focus.findAncestor("tableCell");if(!s){return false}if(e&&!o.isCollapsed&&o.isBackward==i){return false}if(this._isSelectionAtCellEdge(o,s,i)){this._navigateFromCellInDirection(s,t,e);return true}return false}_isSelectionAtCellEdge(t,e,n){const o=this.editor.model;const i=this.editor.model.schema;const r=n?t.getLastPosition():t.getFirstPosition();if(!i.getLimitElement(r).is("element","tableCell")){const t=o.createPositionAt(e,n?"end":0);return t.isTouching(r)}const s=o.createSelection(r);o.modifySelection(s,{direction:n?"forward":"backward"});return r.isEqual(s.focus)}_navigateFromCellInDirection(t,e,n=false){const o=this.editor.model;const i=t.findAncestor("table");const r=[...new Dz(i,{includeAllSlots:true})];const{row:s,column:a}=r[r.length-1];const c=r.find((({cell:e})=>e==t));let{row:l,column:d}=c;switch(e){case"left":d--;break;case"up":l--;break;case"right":d+=c.cellWidth;break;case"down":l+=c.cellHeight;break}const u=l<0||l>s;const h=d<0&&l<=0;const f=d>a&&l>=s;if(u||h||f){o.change((t=>{t.setSelection(t.createRangeOn(i))}));return}if(d<0){d=n?0:a;l--}else if(d>a){d=n?a:0;l++}const m=r.find((t=>t.row==l&&t.column==d)).cell;const g=["right","down"].includes(e);const p=this.editor.plugins.get("TableSelection");if(n&&p.isEnabled){const e=p.getAnchorCell()||t;p.setCellSelection(e,m)}else{const t=o.createPositionAt(m,g?0:"end");o.change((e=>{e.setSelection(t)}))}}}class UN extends _h{constructor(t){super(t);this.domEventType=["mousemove","mouseleave"]}onDomEvent(t){this.fire(t.type,t)}}class $N extends Kn{static get pluginName(){return"TableMouse"}static get requires(){return[ON]}init(){const t=this.editor;t.editing.view.addObserver(UN);this._enableShiftClickSelection();this._enableMouseDragSelection()}_enableShiftClickSelection(){const t=this.editor;let e=false;const n=t.plugins.get(ON);this.listenTo(t.editing.view.document,"mousedown",((o,i)=>{if(!this.isEnabled||!n.isEnabled){return}if(!i.domEvent.shiftKey){return}const r=n.getAnchorCell()||Xz(t.model.document.selection)[0];if(!r){return}const s=this._getModelTableCellFromDomEvent(i);if(s&&JN(r,s)){e=true;n.setCellSelection(r,s);i.preventDefault()}}));this.listenTo(t.editing.view.document,"mouseup",(()=>{e=false}));this.listenTo(t.editing.view.document,"selectionChange",(t=>{if(e){t.stop()}}),{priority:"highest"})}_enableMouseDragSelection(){const t=this.editor;let e,n;let o=false;let i=false;const r=t.plugins.get(ON);this.listenTo(t.editing.view.document,"mousedown",((t,n)=>{if(!this.isEnabled||!r.isEnabled){return}if(n.domEvent.shiftKey||n.domEvent.ctrlKey||n.domEvent.altKey){return}e=this._getModelTableCellFromDomEvent(n)}));this.listenTo(t.editing.view.document,"mousemove",((t,s)=>{if(!s.domEvent.buttons){return}if(!e){return}const a=this._getModelTableCellFromDomEvent(s);if(a&&JN(e,a)){n=a;if(!o&&n!=e){o=true}}if(!o){return}i=true;r.setCellSelection(e,n);s.preventDefault()}));this.listenTo(t.editing.view.document,"mouseup",(()=>{o=false;i=false;e=null;n=null}));this.listenTo(t.editing.view.document,"selectionChange",(t=>{if(i){t.stop()}}),{priority:"highest"})}_getModelTableCellFromDomEvent(t){const e=t.target;const n=this.editor.editing.view.createPositionAt(e,0);const o=this.editor.editing.mapper.toModelPosition(n);const i=o.parent;return i.findAncestor("tableCell",{includeSelf:true})}}function JN(t,e){return t.parent.parent==e.parent.parent}var YN=n(64);var QN={injectType:"singletonStyleTag",attributes:{"data-cke":true}};QN.insert="head";QN.singleton=true;var XN=wk()(YN["a"],QN);var ZN=YN["a"].locals||{};class tM extends Kn{static get requires(){return[wN,TN,ON,$N,GN,NN,ix]}static get pluginName(){return"Table"}}function eM(t,e,n,o){t.for("upcast").attributeToAttribute({view:{styles:{[o]:/[\s\S]+/}},model:{name:e,key:n,value:t=>t.getNormalizedStyle(o)}})}function nM(t,e){t.for("upcast").add((t=>t.on("element:"+e,((t,e,n)=>{if(!e.modelRange){return}const o=["border-top","border-right","border-bottom","border-left"].filter((t=>e.viewItem.hasStyle(t)));if(!o.length){return}const i={styles:o};if(!n.consumable.test(e.viewItem,i)){return}const r=[...e.modelRange.getItems({shallow:true})].pop();n.consumable.consume(e.viewItem,i);n.writer.setAttribute("borderStyle",e.viewItem.getNormalizedStyle("border-style"),r);n.writer.setAttribute("borderColor",e.viewItem.getNormalizedStyle("border-color"),r);n.writer.setAttribute("borderWidth",e.viewItem.getNormalizedStyle("border-width"),r)}))))}function oM(t,e,n,o){t.for("downcast").attributeToAttribute({model:{name:e,key:n},view:t=>({key:"style",value:{[o]:t}})})}function iM(t,e,n){t.for("downcast").add((t=>t.on(`attribute:${e}:table`,((t,e,o)=>{const{item:i,attributeNewValue:r}=e;const{mapper:s,writer:a}=o;if(!o.consumable.consume(e.item,t.name)){return}const c=[...s.toViewElement(i).getChildren()].find((t=>t.is("element","table")));if(r){a.setStyle(n,r,c)}else{a.removeStyle(n,c)}}))))}class rM extends jn{constructor(t,e){super(t);this.attributeName=e}refresh(){const t=this.editor;const e=t.model.document.selection;const n=e.getFirstPosition().findAncestor("table");this.isEnabled=!!n;this.value=this._getValue(n)}execute(t={}){const e=this.editor.model;const n=e.document.selection;const{value:o,batch:i}=t;const r=n.getFirstPosition().findAncestor("table");const s=this._getValueToSet(o);e.enqueueChange(i||"default",(t=>{if(s){t.setAttribute(this.attributeName,s,r)}else{t.removeAttribute(this.attributeName,r)}}))}_getValue(t){if(!t){return}return t.getAttribute(this.attributeName)}_getValueToSet(t){return t}}class sM extends rM{constructor(t){super(t,"backgroundColor")}}function aM(t){if(!t||!S(t)){return t}const{top:e,right:n,bottom:o,left:i}=t;if(e==n&&n==o&&o==i){return e}}function cM(t,e){const n=parseFloat(t);if(Number.isNaN(n)){return t}if(String(n)!==String(t)){return t}return`${n}${e}`}class lM extends rM{constructor(t){super(t,"borderColor")}_getValue(t){if(!t){return}return aM(t.getAttribute(this.attributeName))}}class dM extends rM{constructor(t){super(t,"borderStyle")}_getValue(t){if(!t){return}return aM(t.getAttribute(this.attributeName))}}class uM extends rM{constructor(t){super(t,"borderWidth")}_getValue(t){if(!t){return}return aM(t.getAttribute(this.attributeName))}_getValueToSet(t){return cM(t,"px")}}class hM extends rM{constructor(t){super(t,"width")}_getValueToSet(t){return cM(t,"px")}}class fM extends rM{constructor(t){super(t,"height")}_getValueToSet(t){return cM(t,"px")}}class mM extends rM{constructor(t){super(t,"alignment")}}const gM=/^(left|right)$/;class pM extends Kn{static get pluginName(){return"TablePropertiesEditing"}static get requires(){return[wN]}init(){const t=this.editor;const e=t.model.schema;const n=t.conversion;t.data.addStyleProcessorRules(ov);bM(e,n);t.commands.add("tableBorderColor",new lM(t));t.commands.add("tableBorderStyle",new dM(t));t.commands.add("tableBorderWidth",new uM(t));kM(e,n);t.commands.add("tableAlignment",new mM(t));CM(e,n,"width","width");t.commands.add("tableWidth",new hM(t));CM(e,n,"height","height");t.commands.add("tableHeight",new fM(t));t.data.addStyleProcessorRules(ev);wM(e,n,"backgroundColor","background-color");t.commands.add("tableBackgroundColor",new sM(t))}}function bM(t,e){t.extend("table",{allowAttributes:["borderWidth","borderColor","borderStyle"]});nM(e,"table");iM(e,"borderColor","border-color");iM(e,"borderStyle","border-style");iM(e,"borderWidth","border-width")}function kM(t,e){t.extend("table",{allowAttributes:["alignment"]});e.attributeToAttribute({model:{name:"table",key:"alignment",values:["left","right"]},view:{left:{key:"style",value:{float:"left"}},right:{key:"style",value:{float:"right"}}},converterPriority:"high"});e.for("upcast").attributeToAttribute({view:{attributes:{align:gM}},model:{name:"table",key:"alignment",value:t=>t.getAttribute("align")}})}function wM(t,e,n,o){t.extend("table",{allowAttributes:[n]});eM(e,"table",n,o);iM(e,n,o)}function CM(t,e,n,o){t.extend("table",{allowAttributes:[n]});eM(e,"table",n,o);oM(e,"table",n,o)}var AM=n(65);var _M={injectType:"singletonStyleTag",attributes:{"data-cke":true}};_M.insert="head";_M.singleton=true;var vM=wk()(AM["a"],_M);var yM=AM["a"].locals||{};class xM extends yk{constructor(t,e){super(t);const n=this.bindTemplate;this.set("value","");this.set("id");this.set("isReadOnly",false);this.set("hasError",false);this.set("isFocused",false);this.set("isEmpty",true);this.set("ariaDescribedById");this.options=e;this._dropdownView=this._createDropdownView(t);this._inputView=this._createInputTextView(t);this._stillTyping=false;this.setTemplate({tag:"div",attributes:{class:["ck","ck-input-color",n.if("hasError","ck-error")],id:n.to("id"),"aria-invalid":n.if("hasError",true),"aria-describedby":n.to("ariaDescribedById")},children:[this._dropdownView,this._inputView]});this.on("change:value",((t,e,n)=>this._setInputValue(n)))}focus(){this._inputView.focus()}_createDropdownView(){const t=this.locale;const e=t.t;const n=this.bindTemplate;const o=this._createColorGrid(t);const i=xC(t);const r=new yk;const s=this._createRemoveColorButton(t);r.setTemplate({tag:"span",attributes:{class:["ck","ck-input-color__button__preview"],style:{backgroundColor:n.to("value")}},children:[{tag:"span",attributes:{class:["ck","ck-input-color__button__preview__no-color-indicator",n.if("value","ck-hidden",(t=>t!=""))]}}]});i.buttonView.extendTemplate({attributes:{class:"ck-input-color__button"}});i.buttonView.children.add(r);i.buttonView.tooltip=e("Color picker");i.panelPosition=t.uiLanguageDirection==="rtl"?"se":"sw";i.panelView.children.add(s);i.panelView.children.add(o);i.bind("isEnabled").to(this,"isReadOnly",(t=>!t));return i}_createInputTextView(){const t=this.locale;const e=new tA(t);e.extendTemplate({on:{blur:e.bindTemplate.to("blur")}});e.value=this.value;e.bind("isReadOnly","hasError").to(this);this.bind("isFocused","isEmpty").to(e);e.on("input",(()=>{const t=e.element.value;const n=this.options.colorDefinitions.find((e=>t===e.label));this._stillTyping=true;this.value=n&&n.color||t}));e.on("blur",(()=>{this._stillTyping=false;this._setInputValue(e.element.value)}));e.delegate("input").to(this);return e}_createRemoveColorButton(){const t=this.locale;const e=t.t;const n=new fw(t);n.class="ck-input-color__remove-color";n.withText=true;n.icon=hk.eraser;n.label=e("Remove color");n.on("execute",(()=>{this.value="";this._dropdownView.isOpen=false;this.fire("input")}));return n}_createColorGrid(t){const e=new Tw(t,{colorDefinitions:this.options.colorDefinitions,columns:this.options.columns});e.on("execute",((t,e)=>{this.value=e.value;this._dropdownView.isOpen=false;this.fire("input")}));e.bind("selectedColor").to(this,"value");return e}_setInputValue(t){if(!this._stillTyping){const e=EM(t);const n=this.options.colorDefinitions.find((t=>e===EM(t.color)));if(n){this._inputView.value=n.label}else{this._inputView.value=t||""}}}}function EM(t){return t.replace(/([(,])\s+/g,"$1").replace(/^\s+|\s+(?=[),\s]|$)/g,"").replace(/,|\s/g," ")}const DM=t=>t==="";function SM(t){return{none:t("None"),solid:t("Solid"),dotted:t("Dotted"),dashed:t("Dashed"),double:t("Double"),groove:t("Groove"),ridge:t("Ridge"),inset:t("Inset"),outset:t("Outset")}}function BM(t){return t('The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".')}function TM(t){return t('The value is invalid. Try "10px" or "2em" or simply "2".')}function PM(t){t=t.trim();return DM(t)||z_(t)}function IM(t){t=t.trim();return DM(t)||MM(t)||V_(t)||H_(t)}function RM(t){t=t.trim();return DM(t)||MM(t)||V_(t)}function FM(t){const e=new ka;const n=SM(t.t);for(const o in n){const i={type:"button",model:new dA({_borderStyleValue:o==="none"?"":o,label:n[o],withText:true})};if(o==="none"){i.model.bind("isOn").to(t,"borderStyle",(t=>!t))}else{i.model.bind("isOn").to(t,"borderStyle",(t=>t===o))}e.add(i)}return e}function zM({view:t,icons:e,toolbar:n,labels:o,propertyName:i,nameToValue:r}){for(const s in o){const a=new fw(t.locale);a.set({label:o[s],icon:e[s],tooltip:o[s]});a.bind("isOn").to(t,i,(t=>t===r(s)));a.on("execute",(()=>{t[i]=r(s)}));n.items.add(a)}}const OM=[{color:"hsl(0, 0%, 0%)",label:"Black"},{color:"hsl(0, 0%, 30%)",label:"Dim grey"},{color:"hsl(0, 0%, 60%)",label:"Grey"},{color:"hsl(0, 0%, 90%)",label:"Light grey"},{color:"hsl(0, 0%, 100%)",label:"White",hasBorder:true},{color:"hsl(0, 75%, 60%)",label:"Red"},{color:"hsl(30, 75%, 60%)",label:"Orange"},{color:"hsl(60, 75%, 60%)",label:"Yellow"},{color:"hsl(90, 75%, 60%)",label:"Light green"},{color:"hsl(120, 75%, 60%)",label:"Green"},{color:"hsl(150, 75%, 60%)",label:"Aquamarine"},{color:"hsl(180, 75%, 60%)",label:"Turquoise"},{color:"hsl(210, 75%, 60%)",label:"Light blue"},{color:"hsl(240, 75%, 60%)",label:"Blue"},{color:"hsl(270, 75%, 60%)",label:"Purple"}];function NM(t){return(e,n,o)=>{const i=new xM(e.locale,{colorDefinitions:VM(t.colorConfig),columns:t.columns});i.set({id:n,ariaDescribedById:o});i.bind("isReadOnly").to(e,"isEnabled",(t=>!t));i.bind("hasError").to(e,"errorText",(t=>!!t));i.on("input",(()=>{e.errorText=null}));e.bind("isEmpty","isFocused").to(i);return i}}function MM(t){const e=parseFloat(t);return!Number.isNaN(e)&&t===String(e)}function VM(t){return t.map((t=>({color:t.model,label:t.label,options:{hasBorder:t.hasBorder}})))}var LM=n(66);var HM={injectType:"singletonStyleTag",attributes:{"data-cke":true}};HM.insert="head";HM.singleton=true;var KM=wk()(LM["a"],HM);var qM=LM["a"].locals||{};class jM extends yk{constructor(t,e={}){super(t);const n=this.bindTemplate;this.set("class",e.class||null);this.children=this.createCollection();if(e.children){e.children.forEach((t=>this.children.add(t)))}this.set("_role",null);this.set("_ariaLabelledBy",null);if(e.labelView){this.set({_role:"group",_ariaLabelledBy:e.labelView.id})}this.setTemplate({tag:"div",attributes:{class:["ck","ck-form__row",n.to("class")],role:n.to("_role"),"aria-labelledby":n.to("_ariaLabelledBy")},children:this.children})}}var WM=n(67);var GM={injectType:"singletonStyleTag",attributes:{"data-cke":true}};GM.insert="head";GM.singleton=true;var UM=wk()(WM["a"],GM);var $M=WM["a"].locals||{};var JM=n(68);var YM={injectType:"singletonStyleTag",attributes:{"data-cke":true}};YM.insert="head";YM.singleton=true;var QM=wk()(JM["a"],YM);var XM=JM["a"].locals||{};var ZM=n(69);var tV={injectType:"singletonStyleTag",attributes:{"data-cke":true}};tV.insert="head";tV.singleton=true;var eV=wk()(ZM["a"],tV);var nV=ZM["a"].locals||{};const oV={left:hk.objectLeft,center:hk.objectCenter,right:hk.objectRight};class iV extends yk{constructor(t,e){super(t);this.set({borderStyle:"",borderWidth:"",borderColor:"",backgroundColor:"",width:"",height:"",alignment:""});this.options=e;const{borderStyleDropdown:n,borderWidthInput:o,borderColorInput:i,borderRowLabel:r}=this._createBorderFields();const{backgroundRowLabel:s,backgroundInput:a}=this._createBackgroundFields();const{widthInput:c,operatorLabel:l,heightInput:d,dimensionsLabel:u}=this._createDimensionFields();const{alignmentToolbar:h,alignmentLabel:f}=this._createAlignmentFields();this.focusTracker=new mf;this.keystrokes=new gf;this.children=this.createCollection();this.borderStyleDropdown=n;this.borderWidthInput=o;this.borderColorInput=i;this.backgroundInput=a;this.widthInput=c;this.heightInput=d;this.alignmentToolbar=h;const{saveButtonView:m,cancelButtonView:g}=this._createActionButtons();this.saveButtonView=m;this.cancelButtonView=g;this._focusables=new pk;this._focusCycler=new yw({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});this.children.add(new JC(t,{label:this.t("Table properties")}));this.children.add(new jM(t,{labelView:r,children:[r,n,i,o],class:"ck-table-form__border-row"}));this.children.add(new jM(t,{labelView:s,children:[s,a],class:"ck-table-form__background-row"}));this.children.add(new jM(t,{children:[new jM(t,{labelView:u,children:[u,c,l,d],class:"ck-table-form__dimensions-row"}),new jM(t,{labelView:f,children:[f,h],class:"ck-table-properties-form__alignment-row"})]}));this.children.add(new jM(t,{children:[this.saveButtonView,this.cancelButtonView],class:"ck-table-form__action-row"}));this.setTemplate({tag:"form",attributes:{class:["ck","ck-form","ck-table-form","ck-table-properties-form"],tabindex:"-1"},children:this.children})}render(){super.render();gk({view:this});[this.borderStyleDropdown,this.borderColorInput,this.borderWidthInput,this.backgroundInput,this.widthInput,this.heightInput,this.alignmentToolbar,this.saveButtonView,this.cancelButtonView].forEach((t=>{this._focusables.add(t);this.focusTracker.add(t.element)}));this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}_createBorderFields(){const t=NM({colorConfig:this.options.borderColors,columns:5});const e=this.locale;const n=this.t;const o=new HC(e);o.text=n("Border");const i=SM(this.t);const r=new sA(e,cA);r.set({label:n("Style"),class:"ck-table-form__border-style"});r.fieldView.buttonView.set({isOn:false,withText:true,tooltip:n("Style")});r.fieldView.buttonView.bind("label").to(this,"borderStyle",(t=>i[t?t:"none"]));r.fieldView.on("execute",(t=>{this.borderStyle=t.source._borderStyleValue}));r.bind("isEmpty").to(this,"borderStyle",(t=>!t));DC(r.fieldView,FM(this));const s=new sA(e,aA);s.set({label:n("Width"),class:"ck-table-form__border-width"});s.fieldView.bind("value").to(this,"borderWidth");s.bind("isEnabled").to(this,"borderStyle",rV);s.fieldView.on("input",(()=>{this.borderWidth=s.fieldView.element.value}));const a=new sA(e,t);a.set({label:n("Color"),class:"ck-table-form__border-color"});a.fieldView.bind("value").to(this,"borderColor");a.bind("isEnabled").to(this,"borderStyle",rV);a.fieldView.on("input",(()=>{this.borderColor=a.fieldView.value}));this.on("change:borderStyle",((t,e,n)=>{if(!rV(n)){this.borderColor="";this.borderWidth=""}}));return{borderRowLabel:o,borderStyleDropdown:r,borderColorInput:a,borderWidthInput:s}}_createBackgroundFields(){const t=this.locale;const e=this.t;const n=new HC(t);n.text=e("Background");const o=NM({colorConfig:this.options.backgroundColors,columns:5});const i=new sA(t,o);i.set({label:e("Color"),class:"ck-table-properties-form__background"});i.fieldView.bind("value").to(this,"backgroundColor");i.fieldView.on("input",(()=>{this.backgroundColor=i.fieldView.value}));return{backgroundRowLabel:n,backgroundInput:i}}_createDimensionFields(){const t=this.locale;const e=this.t;const n=new HC(t);n.text=e("Dimensions");const o=new sA(t,aA);o.set({label:e("Width"),class:"ck-table-form__dimensions-row__width"});o.fieldView.bind("value").to(this,"width");o.fieldView.on("input",(()=>{this.width=o.fieldView.element.value}));const i=new yk(t);i.setTemplate({tag:"span",attributes:{class:["ck-table-form__dimension-operator"]},children:[{text:"×"}]});const r=new sA(t,aA);r.set({label:e("Height"),class:"ck-table-form__dimensions-row__height"});r.fieldView.bind("value").to(this,"height");r.fieldView.on("input",(()=>{this.height=r.fieldView.element.value}));return{dimensionsLabel:n,widthInput:o,operatorLabel:i,heightInput:r}}_createAlignmentFields(){const t=this.locale;const e=this.t;const n=new HC(t);n.text=e("Alignment");const o=new sC(t);o.set({isCompact:true,ariaLabel:e("Table alignment toolbar")});zM({view:this,icons:oV,toolbar:o,labels:this._alignmentLabels,propertyName:"alignment",nameToValue:t=>t==="center"?"":t});return{alignmentLabel:n,alignmentToolbar:o}}_createActionButtons(){const t=this.locale;const e=this.t;const n=new fw(t);const o=new fw(t);const i=[this.borderWidthInput,this.borderColorInput,this.backgroundInput,this.widthInput,this.heightInput];n.set({label:e("Save"),icon:hk.check,class:"ck-button-save",type:"submit",withText:true});n.bind("isEnabled").toMany(i,"errorText",((...t)=>t.every((t=>!t))));o.set({label:e("Cancel"),icon:hk.cancel,class:"ck-button-cancel",type:"cancel",withText:true});o.delegate("execute").to(this,"cancel");return{saveButtonView:n,cancelButtonView:o}}get _alignmentLabels(){const t=this.locale;const e=this.t;const n=e("Align table to the left");const o=e("Center table");const i=e("Align table to the right");if(t.uiLanguageDirection==="rtl"){return{right:i,center:o,left:n}}else{return{left:n,center:o,right:i}}}}function rV(t){return!!t}var sV='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M8 2v5h4V2h1v5h5v1h-5v4h.021l-.172.351-1.916.28-.151.027c-.287.063-.54.182-.755.341L8 13v5H7v-5H2v-1h5V8H2V7h5V2h1zm4 6H8v4h4V8z" opacity=".6"/><path d="m15.5 11.5 1.323 2.68 2.957.43-2.14 2.085.505 2.946L15.5 18.25l-2.645 1.39.505-2.945-2.14-2.086 2.957-.43L15.5 11.5zM17 1a2 2 0 0 1 2 2v9.475l-.85-.124-.857-1.736a2.048 2.048 0 0 0-.292-.44L17 3H3v14h7.808l.402.392L10.935 19H3a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h14z"/></svg>';function aV(t){const e=t.getSelectedElement();if(e&&lV(e)){return e}return null}function cV(t){const e=dV("table",t.getFirstPosition());if(e&&lV(e.parent)){return e.parent}return null}function lV(t){return!!t.getCustomProperty("table")&&hy(t)}function dV(t,e){let n=e.parent;while(n){if(n.name===t){return n}n=n.parent}}const uV=bA.defaultPositions;const hV=[uV.northArrowSouth,uV.northArrowSouthWest,uV.northArrowSouthEast,uV.southArrowNorth,uV.southArrowNorthWest,uV.southArrowNorthEast];const fV=[...hV,vy];function mV(t,e){const n=t.plugins.get("ContextualBalloon");if(cV(t.editing.view.document.selection)){let o;if(e==="cell"){o=pV(t)}else{o=gV(t)}n.updatePosition(o)}}function gV(t){const e=t.model.document.selection.getFirstPosition();const n=e.findAncestor("table");const o=t.editing.mapper.toViewElement(n);return{target:t.editing.view.domConverter.viewToDom(o),positions:fV}}function pV(t){const e=t.editing.mapper;const n=t.editing.view.domConverter;const o=t.model.document.selection;if(o.rangeCount>1){return{target:()=>kV(o.getRanges(),t),positions:hV}}const i=bV(o.getFirstPosition());const r=e.toViewElement(i);return{target:n.viewToDom(r),positions:hV}}function bV(t){const e=t.nodeAfter&&t.nodeAfter.is("element","tableCell");return e?t.nodeAfter:t.findAncestor("tableCell")}function kV(t,e){const n=e.editing.mapper;const o=e.editing.view.domConverter;const i=Array.from(t).map((t=>{const e=bV(t.start);const i=n.toViewElement(e);return new rf(o.viewToDom(i))}));return rf.getBoundingRect(i)}const wV=500;const CV={borderStyle:"tableBorderStyle",borderColor:"tableBorderColor",borderWidth:"tableBorderWidth",backgroundColor:"tableBackgroundColor",width:"tableWidth",height:"tableHeight",alignment:"tableAlignment"};class AV extends Kn{static get requires(){return[IA]}static get pluginName(){return"TablePropertiesUI"}constructor(t){super(t);t.config.define("table.tableProperties",{borderColors:OM,backgroundColors:OM})}init(){const t=this.editor;const e=t.t;this._balloon=t.plugins.get(IA);this.view=this._createPropertiesView();this._undoStepBatch=null;t.ui.componentFactory.add("tableProperties",(n=>{const o=new fw(n);o.set({label:e("Table properties"),icon:sV,tooltip:true});this.listenTo(o,"execute",(()=>this._showView()));const i=Object.values(CV).map((e=>t.commands.get(e)));o.bind("isEnabled").toMany(i,"isEnabled",((...t)=>t.some((t=>t))));return o}))}destroy(){super.destroy();this.view.destroy()}_createPropertiesView(){const t=this.editor;const e=t.config.get("table.tableProperties");const n=Cw(e.borderColors);const o=ww(t.locale,n);const i=Cw(e.backgroundColors);const r=ww(t.locale,i);const s=new iV(t.locale,{borderColors:o,backgroundColors:r});const a=t.t;s.render();this.listenTo(s,"submit",(()=>{this._hideView()}));this.listenTo(s,"cancel",(()=>{if(this._undoStepBatch.operations.length){t.execute("undo",this._undoStepBatch)}this._hideView()}));s.keystrokes.set("Esc",((t,e)=>{this._hideView();e()}));fk({emitter:s,activator:()=>this._isViewInBalloon,contextElements:[this._balloon.view.element],callback:()=>this._hideView()});const c=BM(a);const l=TM(a);s.on("change:borderStyle",this._getPropertyChangeCallback("tableBorderStyle"));s.on("change:borderColor",this._getValidatedPropertyChangeCallback({viewField:s.borderColorInput,commandName:"tableBorderColor",errorText:c,validator:PM}));s.on("change:borderWidth",this._getValidatedPropertyChangeCallback({viewField:s.borderWidthInput,commandName:"tableBorderWidth",errorText:l,validator:RM}));s.on("change:backgroundColor",this._getValidatedPropertyChangeCallback({viewField:s.backgroundInput,commandName:"tableBackgroundColor",errorText:c,validator:PM}));s.on("change:width",this._getValidatedPropertyChangeCallback({viewField:s.widthInput,commandName:"tableWidth",errorText:l,validator:IM}));s.on("change:height",this._getValidatedPropertyChangeCallback({viewField:s.heightInput,commandName:"tableHeight",errorText:l,validator:IM}));s.on("change:alignment",this._getPropertyChangeCallback("tableAlignment"));return s}_fillViewFormFromCommandValues(){const t=this.editor.commands;Object.entries(CV).map((([e,n])=>[e,t.get(n).value||""])).forEach((([t,e])=>this.view.set(t,e)))}_showView(){const t=this.editor;this.listenTo(t.ui,"update",(()=>{this._updateView()}));this._fillViewFormFromCommandValues();this._balloon.add({view:this.view,position:gV(t)});this._undoStepBatch=t.model.createBatch();this.view.focus()}_hideView(){const t=this.editor;this.stopListening(t.ui,"update");this.view.saveButtonView.focus();this._balloon.remove(this.view);this.editor.editing.view.focus()}_updateView(){const t=this.editor;const e=t.editing.view.document;if(!cV(e.selection)){this._hideView()}else if(this._isViewVisible){mV(t,"table")}}get _isViewVisible(){return this._balloon.visibleView===this.view}get _isViewInBalloon(){return this._balloon.hasView(this.view)}_getPropertyChangeCallback(t){return(e,n,o)=>{this.editor.execute(t,{value:o,batch:this._undoStepBatch})}}_getValidatedPropertyChangeCallback({commandName:t,viewField:e,validator:n,errorText:o}){const i=qh((()=>{e.errorText=o}),wV);return(o,r,s)=>{i.cancel();if(n(s)){this.editor.execute(t,{value:s,batch:this._undoStepBatch});e.errorText=null}else{i()}}}}class _V extends Kn{static get pluginName(){return"TableProperties"}static get requires(){return[pM,AV]}}class vV extends Kn{static get requires(){return[Nx]}static get pluginName(){return"TableToolbar"}afterInit(){const t=this.editor;const e=t.t;const n=t.plugins.get(Nx);const o=t.config.get("table.contentToolbar");const i=t.config.get("table.tableToolbar");if(o){n.register("tableContent",{ariaLabel:e("Table toolbar"),items:o,getRelatedElement:cV})}if(i){n.register("table",{ariaLabel:e("Table toolbar"),items:i,getRelatedElement:aV})}}}function yV(t,e){e=e||Da(t);return`${t}:${e}`}function xV(t){const[e,n]=t.split(":");return{languageCode:e,textDirection:n}}class EV extends jn{refresh(){const t=this.editor.model;const e=t.document;this.value=this._getValueFromFirstAllowedNode();this.isEnabled=t.schema.checkAttributeInSelection(e.selection,"language")}execute({languageCode:t,textDirection:e}={}){const n=this.editor.model;const o=n.document;const i=o.selection;const r=t?yV(t,e):false;n.change((t=>{if(i.isCollapsed){if(r){t.setSelectionAttribute("language",r)}else{t.removeSelectionAttribute("language")}}else{const e=n.schema.getValidRanges(i.getRanges(),"language");for(const n of e){if(r){t.setAttribute("language",r,n)}else{t.removeAttribute("language",n)}}}}))}_getValueFromFirstAllowedNode(){const t=this.editor.model;const e=t.schema;const n=t.document.selection;if(n.isCollapsed){return n.getAttribute("language")||false}for(const t of n.getRanges()){for(const n of t.getItems()){if(e.checkAttribute(n,"language")){return n.getAttribute("language")||false}}}return false}}class DV extends Kn{static get pluginName(){return"TextPartLanguageEditing"}constructor(t){super(t);t.config.define("language",{textPartLanguage:[{title:"Arabic",languageCode:"ar"},{title:"French",languageCode:"fr"},{title:"Spanish",languageCode:"es"}]})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"language"});t.model.schema.setAttributeProperties("language",{copyOnEnter:true});this._defineConverters();t.commands.add("textPartLanguage",new EV(t))}_defineConverters(){const t=this.editor.conversion;t.for("upcast").elementToAttribute({model:{key:"language",value:t=>{const e=t.getAttribute("lang");const n=t.getAttribute("dir");return yV(e,n)}},view:{name:"span",attributes:{lang:/[\s\S]+/}}});t.for("downcast").attributeToElement({model:"language",view:(t,{writer:e})=>{if(!t){return}const{languageCode:n,textDirection:o}=xV(t);return e.createAttributeElement("span",{lang:n,dir:o})}})}}var SV=n(70);var BV={injectType:"singletonStyleTag",attributes:{"data-cke":true}};BV.insert="head";BV.singleton=true;var TV=wk()(SV["a"],BV);var PV=SV["a"].locals||{};class IV extends Kn{static get pluginName(){return"TextPartLanguageUI"}init(){const t=this.editor;const e=t.t;const n=t.config.get("language.textPartLanguage");const o=e("Choose language");const i=e("Remove language");const r=e("Language");t.ui.componentFactory.add("textPartLanguage",(e=>{const s=new ka;const a={};const c=t.commands.get("textPartLanguage");for(const t of n){const e={type:"button",model:new dA({label:t.title,languageCode:t.languageCode,textDirection:t.textDirection,withText:true})};const n=yV(t.languageCode,t.textDirection);e.model.bind("isOn").to(c,"value",(t=>t===n));s.add(e);a[n]=t.title}s.add({type:"separator"});s.add({type:"button",model:new dA({label:i,languageCode:false,withText:true})});const l=xC(e);DC(l,s);l.buttonView.set({isOn:false,withText:true,tooltip:r});l.extendTemplate({attributes:{class:["ck-text-fragment-language-dropdown"]}});l.bind("isEnabled").to(c,"isEnabled");l.buttonView.bind("label").to(c,"value",(t=>a[t]||o));this.listenTo(l,"execute",(e=>{c.execute({languageCode:e.source.languageCode,textDirection:e.source.textDirection});t.editing.view.focus()}));return l}))}}class RV extends Kn{static get requires(){return[DV,IV]}static get pluginName(){return"TextPartLanguage"}}const FV="todoListChecked";class zV extends jn{constructor(t){super(t);this._selectedElements=[];this.on("execute",(()=>{this.refresh()}),{priority:"highest"})}refresh(){this._selectedElements=this._getSelectedItems();this.value=this._selectedElements.every((t=>!!t.getAttribute("todoListChecked")));this.isEnabled=!!this._selectedElements.length}_getSelectedItems(){const t=this.editor.model;const e=t.schema;const n=t.document.selection.getFirstRange();const o=n.start.parent;const i=[];if(e.checkAttribute(o,FV)){i.push(o)}for(const t of n.getItems()){if(e.checkAttribute(t,FV)&&!i.includes(t)){i.push(t)}}return i}execute(t={}){this.editor.model.change((e=>{for(const n of this._selectedElements){const o=t.forceValue===undefined?!this.value:t.forceValue;if(o){e.setAttribute(FV,true,n)}else{e.removeAttribute(FV,n)}}}))}}function OV(t,e){return(n,o,i)=>{const r=i.consumable;if(!r.test(o.item,"insert")||!r.test(o.item,"attribute:listType")||!r.test(o.item,"attribute:listIndent")){return}if(o.item.getAttribute("listType")!="todo"){return}const s=o.item;r.consume(s,"insert");r.consume(s,"attribute:listType");r.consume(s,"attribute:listIndent");r.consume(s,"attribute:todoListChecked");const a=i.writer;const c=nF(s,i);const l=!!s.getAttribute("todoListChecked");const d=KV(s,a,l,e);const u=a.createContainerElement("span",{class:"todo-list__label__description"});a.addClass("todo-list",c.parent);a.insert(a.createPositionAt(c,0),d);a.insert(a.createPositionAfter(d),u);oF(s,c,i,t)}}function NV(t){return(e,n,o)=>{const i=o.consumable;if(!i.test(n.item,"insert")||!i.test(n.item,"attribute:listType")||!i.test(n.item,"attribute:listIndent")){return}if(n.item.getAttribute("listType")!="todo"){return}const r=n.item;i.consume(r,"insert");i.consume(r,"attribute:listType");i.consume(r,"attribute:listIndent");i.consume(r,"attribute:todoListChecked");const s=o.writer;const a=nF(r,o);s.addClass("todo-list",a.parent);const c=s.createContainerElement("label",{class:"todo-list__label"});const l=s.createEmptyElement("input",{type:"checkbox",disabled:"disabled"});const d=s.createContainerElement("span",{class:"todo-list__label__description"});if(r.getAttribute("todoListChecked")){s.setAttribute("checked","checked",l)}s.insert(s.createPositionAt(a,0),c);s.insert(s.createPositionAt(c,0),l);s.insert(s.createPositionAfter(l),d);oF(r,a,o,t)}}function MV(t,e,n){const o=e.modelCursor;const i=o.parent;const r=e.viewItem;if(r.getAttribute("type")!="checkbox"||i.name!="listItem"||!o.isAtStart){return}if(!n.consumable.consume(r,{name:true})){return}const s=n.writer;s.setAttribute("listType","todo",i);if(e.viewItem.hasAttribute("checked")){s.setAttribute("todoListChecked",true,i)}e.modelRange=s.createRange(o)}function VV(t,e){return(n,o,i)=>{const r=i.mapper.toViewElement(o.item);const s=i.writer;const a=qV(r,e);if(o.attributeNewValue=="todo"){const e=!!o.item.getAttribute("todoListChecked");const n=KV(o.item,s,e,t);const i=s.createContainerElement("span",{class:"todo-list__label__description"});const a=s.createRangeIn(r);const c=cF(r);const l=rF(a.start);const d=c?s.createPositionBefore(c):a.end;const u=s.createRange(l,d);s.addClass("todo-list",r.parent);s.move(u,s.createPositionAt(i,0));s.insert(s.createPositionAt(r,0),n);s.insert(s.createPositionAfter(n),i)}else if(o.attributeOldValue=="todo"){const t=jV(r,e);s.removeClass("todo-list",r.parent);s.remove(a);s.move(s.createRangeIn(t),s.createPositionBefore(t));s.remove(t)}}}function LV(t){return(e,n,o)=>{if(n.item.getAttribute("listType")!="todo"){return}if(!o.consumable.consume(n.item,"attribute:todoListChecked")){return}const{mapper:i,writer:r}=o;const s=!!n.item.getAttribute("todoListChecked");const a=i.toViewElement(n.item);const c=a.getChild(0);const l=KV(n.item,r,s,t);r.insert(r.createPositionAfter(c),l);r.remove(c)}}function HV(t){return(e,n)=>{const o=n.modelPosition;const i=o.parent;if(!i.is("element","listItem")||i.getAttribute("listType")!="todo"){return}const r=n.mapper.toViewElement(i);const s=jV(r,t);if(s){n.viewPosition=n.mapper.findPositionIn(s,o.offset)}}}function KV(t,e,n,o){const i=e.createUIElement("label",{class:"todo-list__label",contenteditable:false},(function(e){const i=Zh(document,"input",{type:"checkbox"});if(n){i.setAttribute("checked","checked")}i.addEventListener("change",(()=>o(t)));const r=this.toDomElement(e);r.appendChild(i);return r}));return i}function qV(t,e){const n=e.createRangeIn(t);for(const t of n){if(t.item.is("uiElement","label")){return t.item}}}function jV(t,e){const n=e.createRangeIn(t);for(const t of n){if(t.item.is("containerElement","span")&&t.item.hasClass("todo-list__label__description")){return t.item}}}const WV=od("Ctrl+Enter");class GV extends Kn{static get pluginName(){return"TodoListEditing"}static get requires(){return[TF]}init(){const t=this.editor;const{editing:e,data:n,model:o}=t;o.schema.extend("listItem",{allowAttributes:["todoListChecked"]});o.schema.addAttributeCheck(((t,e)=>{const n=t.last;if(e=="todoListChecked"&&n.name=="listItem"&&n.getAttribute("listType")!="todo"){return false}}));t.commands.add("todoList",new QR(t,"todo"));const i=new zV(t);t.commands.add("checkTodoList",i);t.commands.add("todoListCheck",i);n.downcastDispatcher.on("insert:listItem",NV(o),{priority:"high"});n.upcastDispatcher.on("element:input",MV,{priority:"high"});e.downcastDispatcher.on("insert:listItem",OV(o,(t=>this._handleCheckmarkChange(t))),{priority:"high"});e.downcastDispatcher.on("attribute:listType:listItem",VV((t=>this._handleCheckmarkChange(t)),e.view));e.downcastDispatcher.on("attribute:todoListChecked:listItem",LV((t=>this._handleCheckmarkChange(t))));e.mapper.on("modelToViewPosition",HV(e.view));n.mapper.on("modelToViewPosition",HV(e.view));this.listenTo(e.view.document,"arrowKey",UV(o,t.locale),{context:"li"});this.listenTo(e.view.document,"keydown",((e,n)=>{if(nd(n)===WV){t.execute("checkTodoList");e.stop()}}),{priority:"high"});const r=new Set;this.listenTo(o,"applyOperation",((t,e)=>{const n=e[0];if(n.type=="rename"&&n.oldName=="listItem"){const t=n.position.nodeAfter;if(t.hasAttribute("todoListChecked")){r.add(t)}}else if(n.type=="changeAttribute"&&n.key=="listType"&&n.oldValue==="todo"){for(const t of n.range.getItems()){if(t.hasAttribute("todoListChecked")&&t.getAttribute("listType")!=="todo"){r.add(t)}}}}));o.document.registerPostFixer((t=>{let e=false;for(const n of r){t.removeAttribute("todoListChecked",n);e=true}r.clear();return e}))}_handleCheckmarkChange(t){const e=this.editor;const n=e.model;const o=Array.from(n.document.selection.getRanges());n.change((n=>{n.setSelection(t,"end");e.execute("checkTodoList");n.setSelection(o)}))}}function UV(t,e){return(n,o)=>{const i=sd(o.keyCode,e.contentLanguageDirection);if(i!="left"){return}const r=t.schema;const s=t.document.selection;if(!s.isCollapsed){return}const a=s.getFirstPosition();const c=a.parent;if(c.name==="listItem"&&c.getAttribute("listType")=="todo"&&a.isAtStart){const e=r.getNearestSelectionRange(t.createPositionBefore(c),"backward");if(e){t.change((t=>t.setSelection(e)))}o.preventDefault();o.stopPropagation();n.stop()}}}var $V='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m2.315 14.705 2.224-2.24a.689.689 0 0 1 .963 0 .664.664 0 0 1 0 .949L2.865 16.07a.682.682 0 0 1-.112.089.647.647 0 0 1-.852-.051L.688 14.886a.635.635 0 0 1 0-.903.647.647 0 0 1 .91 0l.717.722zm5.185.045a.75.75 0 0 1 .75-.75h9.5a.75.75 0 1 1 0 1.5h-9.5a.75.75 0 0 1-.75-.75zM2.329 5.745l2.21-2.226a.689.689 0 0 1 .963 0 .664.664 0 0 1 0 .95L2.865 7.125a.685.685 0 0 1-.496.196.644.644 0 0 1-.468-.187L.688 5.912a.635.635 0 0 1 0-.903.647.647 0 0 1 .91 0l.73.736zM7.5 5.75A.75.75 0 0 1 8.25 5h9.5a.75.75 0 1 1 0 1.5h-9.5a.75.75 0 0 1-.75-.75z"/></svg>';class JV extends Kn{static get pluginName(){return"TodoListUI"}init(){const t=this.editor.t;aF(this.editor,"todoList",t("To-do List"),$V)}}var YV=n(71);var QV={injectType:"singletonStyleTag",attributes:{"data-cke":true}};QV.insert="head";QV.singleton=true;var XV=wk()(YV["a"],QV);var ZV=YV["a"].locals||{};class tL extends Kn{static get requires(){return[GV,JV]}static get pluginName(){return"TodoList"}}const eL="underline";class nL extends Kn{static get pluginName(){return"UnderlineEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:eL});t.model.schema.setAttributeProperties(eL,{isFormatting:true,copyOnEnter:true});t.conversion.attributeToElement({model:eL,view:"u",upcastAlso:{styles:{"text-decoration":"underline"}}});t.commands.add(eL,new xS(t,eL));t.keystrokes.set("CTRL+U","underline")}}var oL='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 18v-1.5h14V18zm2.2-8V3.6c0-.4.4-.6.8-.6.3 0 .7.2.7.6v6.2c0 2 1.3 2.8 3.2 2.8 1.9 0 3.4-.9 3.4-2.9V3.6c0-.3.4-.5.8-.5.3 0 .7.2.7.5V10c0 2.7-2.2 4-4.9 4-2.6 0-4.7-1.2-4.7-4z"/></svg>';const iL="underline";class rL extends Kn{static get pluginName(){return"UnderlineUI"}init(){const t=this.editor;const e=t.t;t.ui.componentFactory.add(iL,(n=>{const o=t.commands.get(iL);const i=new fw(n);i.set({label:e("Underline"),icon:oL,keystroke:"CTRL+U",tooltip:true,isToggleable:true});i.bind("isOn","isEnabled").to(o,"value","isEnabled");this.listenTo(i,"execute",(()=>{t.execute(iL);t.editing.view.focus()}));return i}))}}class sL extends Kn{static get requires(){return[nL,rL]}static get pluginName(){return"Underline"}}class aL extends vv{}aL.builtinPlugins=[Vv,mE,oS,aS,yS,PS,VS,aB,bB,OB,ZB,hT,xT,LT,fP,SP,OI,XI,ZI,_I,rR,NR,YR,zF,LB,kz,OP,tM,_V,vV,RV,tL,sL];var cL=e["default"]=aL}])["default"]})); | 5 | (function(t){const e=t["fr"]=t["fr"]||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 sur %1","Align center":"Centrer","Align left":"Aligner à gauche","Align right":"Aligner à droite","Align table to the left":"Aligner le tableau à gauche","Align table to the right":"Aligner le tableau à droite",Alignment:"Alignement",Aquamarine:"Bleu vert",Background:"Fond",Big:"Grand",Black:"Noir","Block quote":"Citation",Blue:"Bleu","Blue marker":"Marqueur bleu",Bold:"Gras",Border:"Bordure","Bulleted List":"Liste à puces",Cancel:"Annuler","Center table":"Centrer le tableau ","Centered image":"Image centrée","Change image text alternative":"Changer le texte alternatif à l’image","Choose heading":"Choisir l'en-tête",Color:"Couleur","Color picker":"Pipette à couleurs",Column:"Colonne",Dashed:"Tirets",Default:"Par défaut","Delete column":"Supprimer la colonne","Delete row":"Supprimer la ligne","Dim grey":"Gris pâle",Dimensions:"Dimensions","Document colors":"Couleurs du document",Dotted:"Pointillés",Double:"Double",Downloadable:"Fichier téléchargeable","Dropdown toolbar":"Barre d'outils dans un menu déroulant","Edit block":"Modifier le bloc","Edit link":"Modifier le lien","Edit source":"Modifier la source","Editor toolbar":"Barre d'outils de l'éditeur","Empty snippet content":"Aucun contenu pour ce fragment de code","Enter image caption":"Saisir la légende de l’image","Font Color":"Couleur de police","Font Family":"Police","Font Size":"Taille de police","Full size image":"Image taille réelle",Green:"Vert","Green marker":"Marqueur vert","Green pen":"Crayon vert",Grey:"Gris",Groove:"Rainuré","Header column":"Colonne d'entête","Header row":"Ligne d'entête",Heading:"En-tête","Heading 1":"Titre 1","Heading 2":"Titre 2","Heading 3":"Titre 3","Heading 4":"Titre 4","Heading 5":"Titre 5","Heading 6":"Titre 6",Height:"Hauteur",Highlight:"Surlignage","Horizontal line":"Ligne horizontale","HTML snippet":"Code HTML",Huge:"Enorme","Image toolbar":"Barre d'outils des images","image widget":"Objet image",Insert:"Insérer","Insert column left":"Insérer une colonne à gauche","Insert column right":"Insérer une colonne à droite","Insert HTML":"Insérer du code HTML","Insert image":"Insérer une image","Insert image via URL":"Insérer une image à partir d'une URL","Insert paragraph after block":"Insérer du texte après ce bloc","Insert paragraph before block":"Insérer du texte avant ce bloc","Insert row above":"Insérer une ligne au-dessus","Insert row below":"Insérer une ligne en-dessous","Insert table":"Insérer un tableau",Inset:"Relief intérieur",Italic:"Italique",Justify:"Justifier","Left aligned image":"Image alignée à gauche","Light blue":"Bleu clair","Light green":"Vert clair","Light grey":"Gris clair",Link:"Lien","Link image":"Lien d'image","Link URL":"URL du lien","Merge cell down":"Fusionner la cellule en-dessous","Merge cell left":"Fusionner la cellule à gauche","Merge cell right":"Fusionner la cellule à droite","Merge cell up":"Fusionner la cellule au-dessus","Merge cells":"Fusionner les cellules",Next:"Suivant","No preview available":"Aucun aperçu disponible",None:"Aucun","Numbered List":"Liste numérotée","Open in a new tab":"Ouvrir dans un nouvel onglet","Open link in new tab":"Ouvrir le lien dans un nouvel onglet",Orange:"Orange",Outset:"Relief extérieur",Paragraph:"Paragraphe","Paste raw HTML here...":"Collez le code HTML brut ici...","Pink marker":"Marqueur rose",Previous:"Précedent",Purple:"Violet",Red:"Rouge","Red pen":"Crayon rouge",Redo:"Restaurer","Remove color":"Enlever la couleur","Remove highlight":"Enlever le surlignage","Rich Text Editor":"Éditeur de texte enrichi","Rich Text Editor, %0":"Éditeur de texte enrichi, %0",Ridge:"Relief","Right aligned image":"Image alignée à droite",Row:"Ligne",Save:"Enregistrer","Save changes":"Enregistrer les changements","Saving changes":"Enregistrement des modifications","Select all":"Sélectionner tout","Select column":"Sélectionner la colonne","Select row":"Sélectionner la ligne","Show more items":"Montrer plus d'éléments","Side image":"Image latérale",Small:"Petit",Solid:"Continu","Split cell horizontally":"Scinder la cellule horizontalement","Split cell vertically":"Scinder la cellule verticalement",Style:"Style","Table alignment toolbar":"Barre d'outils pour modifier l'alignement du tableau","Table properties":"Propriétés du tableau","Table toolbar":"Barre d'outils des tableaux","Text alignment":"Alignement du texte","Text alignment toolbar":"Barre d'outils d'alignement du texte","Text alternative":"Texte alternatif","Text highlight toolbar":"Barre d'outils du surlignage",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'La couleur est invalide. Essayez "#FF0000" ou "rgb(255,0,0)" ou "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'La valeur est invalide. Essayez "10px" ou "2em" ou simplement "2".',"This link has no URL":"Ce lien n'a pas d'URL",Tiny:"Minuscule","To-do List":"Liste de tâches",Turquoise:"Turquoise",Underline:"Souligné",Undo:"Annuler",Unlink:"Supprimer le lien",Update:"Modifier","Update image URL":"Modifier l'URL de l'image","Upload failed":"Échec de l'envoi","Upload in progress":"Téléchargement en cours",White:"Blanc","Widget toolbar":"Barre d'outils du widget",Width:"Largeur",Yellow:"Jaune","Yellow marker":"Marqueur jaune"});e.getPluralForm=function(t){return t>1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));(function t(e,n){if(typeof exports==="object"&&typeof module==="object")module.exports=n();else if(typeof define==="function"&&define.amd)define([],n);else if(typeof exports==="object")exports["ClassicEditor"]=n();else e["ClassicEditor"]=n()})(window,(function(){return function(t){var e={};function n(o){if(e[o]){return e[o].exports}var i=e[o]={i:o,l:false,exports:{}};t[o].call(i.exports,i,i.exports,n);i.l=true;return i.exports}n.m=t;n.c=e;n.d=function(t,e,o){if(!n.o(t,e)){Object.defineProperty(t,e,{enumerable:true,get:o})}};n.r=function(t){if(typeof Symbol!=="undefined"&&Symbol.toStringTag){Object.defineProperty(t,Symbol.toStringTag,{value:"Module"})}Object.defineProperty(t,"__esModule",{value:true})};n.t=function(t,e){if(e&1)t=n(t);if(e&8)return t;if(e&4&&typeof t==="object"&&t&&t.__esModule)return t;var o=Object.create(null);n.r(o);Object.defineProperty(o,"default",{enumerable:true,value:t});if(e&2&&typeof t!="string")for(var i in t)n.d(o,i,function(e){return t[e]}.bind(null,i));return o};n.n=function(t){var e=t&&t.__esModule?function e(){return t["default"]}:function e(){return t};n.d(e,"a",e);return e};n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)};n.p="";return n(n.s=74)}([function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));n.d(e,"b",(function(){return r}));const o="https://ckeditor.com/docs/ckeditor5/latest/framework/guides/support/error-codes.html";class i extends Error{constructor(t,e,n){const o=`${t}${n?` ${JSON.stringify(n)}`:""}${a(t)}`;super(o);this.name="CKEditorError";this.context=e;this.data=n}is(t){return t==="CKEditorError"}static rethrowUnexpectedError(t,e){if(t.is&&t.is("CKEditorError")){throw t}const n=new i(t.message,e);n.stack=t.stack;throw n}}function r(t,e){console.warn(...c(t,e))}function s(t,e){console.error(...c(t,e))}function a(t){return`\nRead more: ${o}#error-${t}`}function c(t,e){const n=a(t);return e?[t,e,n]:[t,n]}},function(t,e,n){"use strict";var o=function t(){var e;return function t(){if(typeof e==="undefined"){e=Boolean(window&&document&&document.all&&!window.atob)}return e}}();var i=function t(){var e={};return function t(n){if(typeof e[n]==="undefined"){var o=document.querySelector(n);if(window.HTMLIFrameElement&&o instanceof window.HTMLIFrameElement){try{o=o.contentDocument.head}catch(t){o=null}}e[n]=o}return e[n]}}();var r=[];function s(t){var e=-1;for(var n=0;n<r.length;n++){if(r[n].identifier===t){e=n;break}}return e}function a(t,e){var n={};var o=[];for(var i=0;i<t.length;i++){var a=t[i];var c=e.base?a[0]+e.base:a[0];var l=n[c]||0;var d="".concat(c," ").concat(l);n[c]=l+1;var u=s(d);var h={css:a[1],media:a[2],sourceMap:a[3]};if(u!==-1){r[u].references++;r[u].updater(h)}else{r.push({identifier:d,updater:g(h,e),references:1})}o.push(d)}return o}function c(t){var e=document.createElement("style");var o=t.attributes||{};if(typeof o.nonce==="undefined"){var r=true?n.nc:undefined;if(r){o.nonce=r}}Object.keys(o).forEach((function(t){e.setAttribute(t,o[t])}));if(typeof t.insert==="function"){t.insert(e)}else{var s=i(t.insert||"head");if(!s){throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.")}s.appendChild(e)}return e}function l(t){if(t.parentNode===null){return false}t.parentNode.removeChild(t)}var d=function t(){var e=[];return function t(n,o){e[n]=o;return e.filter(Boolean).join("\n")}}();function u(t,e,n,o){var i=n?"":o.media?"@media ".concat(o.media," {").concat(o.css,"}"):o.css;if(t.styleSheet){t.styleSheet.cssText=d(e,i)}else{var r=document.createTextNode(i);var s=t.childNodes;if(s[e]){t.removeChild(s[e])}if(s.length){t.insertBefore(r,s[e])}else{t.appendChild(r)}}}function h(t,e,n){var o=n.css;var i=n.media;var r=n.sourceMap;if(i){t.setAttribute("media",i)}else{t.removeAttribute("media")}if(r&&typeof btoa!=="undefined"){o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")}if(t.styleSheet){t.styleSheet.cssText=o}else{while(t.firstChild){t.removeChild(t.firstChild)}t.appendChild(document.createTextNode(o))}}var f=null;var m=0;function g(t,e){var n;var o;var i;if(e.singleton){var r=m++;n=f||(f=c(e));o=u.bind(null,n,r,false);i=u.bind(null,n,r,true)}else{n=c(e);o=h.bind(null,n,e);i=function t(){l(n)}}o(t);return function e(n){if(n){if(n.css===t.css&&n.media===t.media&&n.sourceMap===t.sourceMap){return}o(t=n)}else{i()}}}t.exports=function(t,e){e=e||{};if(!e.singleton&&typeof e.singleton!=="boolean"){e.singleton=o()}t=t||[];var n=a(t,e);return function t(o){o=o||[];if(Object.prototype.toString.call(o)!=="[object Array]"){return}for(var i=0;i<n.length;i++){var c=n[i];var l=s(c);r[l].references--}var d=a(o,e);for(var u=0;u<n.length;u++){var h=n[u];var f=s(h);if(r[f].references===0){r[f].updater();r.splice(f,1)}}n=d}}},function(t,e,n){"use strict";function o(t,e){return c(t)||a(t,e)||r(t,e)||i()}function i(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function r(t,e){if(!t)return;if(typeof t==="string")return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);if(n==="Object"&&t.constructor)n=t.constructor.name;if(n==="Map"||n==="Set")return Array.from(t);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return s(t,e)}function s(t,e){if(e==null||e>t.length)e=t.length;for(var n=0,o=new Array(e);n<e;n++){o[n]=t[n]}return o}function a(t,e){if(typeof Symbol==="undefined"||!(Symbol.iterator in Object(t)))return;var n=[];var o=true;var i=false;var r=undefined;try{for(var s=t[Symbol.iterator](),a;!(o=(a=s.next()).done);o=true){n.push(a.value);if(e&&n.length===e)break}}catch(t){i=true;r=t}finally{try{if(!o&&s["return"]!=null)s["return"]()}finally{if(i)throw r}}return n}function c(t){if(Array.isArray(t))return t}t.exports=function t(e){var n=o(e,4),i=n[1],r=n[3];if(typeof btoa==="function"){var s=btoa(unescape(encodeURIComponent(JSON.stringify(r))));var a="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(s);var c="/*# ".concat(a," */");var l=r.sources.map((function(t){return"/*# sourceURL=".concat(r.sourceRoot||"").concat(t," */")}));return[i].concat(l).concat([c]).join("\n")}return[i].join("\n")}},function(t,e,n){"use strict";t.exports=function(t){var e=[];e.toString=function e(){return this.map((function(e){var n=t(e);if(e[2]){return"@media ".concat(e[2]," {").concat(n,"}")}return n})).join("")};e.i=function(t,n,o){if(typeof t==="string"){t=[[null,t,""]]}var i={};if(o){for(var r=0;r<this.length;r++){var s=this[r][0];if(s!=null){i[s]=true}}}for(var a=0;a<t.length;a++){var c=[].concat(t[a]);if(o&&i[c[0]]){continue}if(n){if(!c[2]){c[2]=n}else{c[2]="".concat(n," and ").concat(c[2])}}e.push(c)}};return e}},,function(t,e,n){"use strict";var o=n(9);var i=typeof self=="object"&&self&&self.Object===Object&&self;var r=o["a"]||i||Function("return this")();e["a"]=r},function(t,e,n){"use strict";(function(t){var o=n(5);var i=n(73);var r=typeof exports=="object"&&exports&&!exports.nodeType&&exports;var s=r&&typeof t=="object"&&t&&!t.nodeType&&t;var a=s&&s.exports===r;var c=a?o["a"].Buffer:undefined;var l=c?c.isBuffer:undefined;var d=l||i["a"];e["a"]=d}).call(this,n(11)(t))},function(t,e,n){"use strict";(function(t){var o=n(9);var i=typeof exports=="object"&&exports&&!exports.nodeType&&exports;var r=i&&typeof t=="object"&&t&&!t.nodeType&&t;var s=r&&r.exports===i;var a=s&&o["a"].process;var c=function(){try{var t=r&&r.require&&r.require("util").types;if(t){return t}return a&&a.binding&&a.binding("util")}catch(t){}}();e["a"]=c}).call(this,n(11)(t))},function(t,e,n){"use strict";(function(t){var e=n(0);const o="27.0.0";var i=o;const r=typeof window==="object"?window:t;if(r.CKEDITOR_VERSION){throw new e["a"]("ckeditor-duplicated-modules",null)}else{r.CKEDITOR_VERSION=o}}).call(this,n(72))},function(t,e,n){"use strict";(function(t){var n=typeof t=="object"&&t&&t.Object===Object&&t;e["a"]=n}).call(this,n(72))},function(t,e,n){"use strict";(function(t){var o=n(5);var i=typeof exports=="object"&&exports&&!exports.nodeType&&exports;var r=i&&typeof t=="object"&&t&&!t.nodeType&&t;var s=r&&r.exports===i;var a=s?o["a"].Buffer:undefined,c=a?a.allocUnsafe:undefined;function l(t,e){if(e){return t.slice()}var n=t.length,o=c?c(n):new t.constructor(n);t.copy(o);return o}e["a"]=l}).call(this,n(11)(t))},function(t,e){t.exports=function(t){if(!t.webpackPolyfill){var e=Object.create(t);if(!e.children)e.children=[];Object.defineProperty(e,"loaded",{enumerable:true,get:function(){return e.l}});Object.defineProperty(e,"id",{enumerable:true,get:function(){return e.i}});Object.defineProperty(e,"exports",{enumerable:true});e.webpackPolyfill=1}return e}},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck-hidden{display:none!important}.ck.ck-reset,.ck.ck-reset_all,.ck.ck-reset_all *{box-sizing:border-box;width:auto;height:auto;position:static}:root{--ck-z-default:1;--ck-z-modal:calc(var(--ck-z-default) + 999)}.ck-transitions-disabled,.ck-transitions-disabled *{transition:none!important}:root{--ck-color-base-foreground:#fafafa;--ck-color-base-background:#fff;--ck-color-base-border:#c4c4c4;--ck-color-base-action:#61b045;--ck-color-base-focus:#6cb5f9;--ck-color-base-text:#333;--ck-color-base-active:#198cf0;--ck-color-base-active-focus:#0e7fe1;--ck-color-base-error:#db3700;--ck-color-focus-border-coordinates:208,79%,51%;--ck-color-focus-border:hsl(var(--ck-color-focus-border-coordinates));--ck-color-focus-outer-shadow:#bcdefb;--ck-color-focus-disabled-shadow:rgba(119,186,248,0.3);--ck-color-focus-error-shadow:rgba(255,64,31,0.3);--ck-color-text:var(--ck-color-base-text);--ck-color-shadow-drop:rgba(0,0,0,0.15);--ck-color-shadow-drop-active:rgba(0,0,0,0.2);--ck-color-shadow-inner:rgba(0,0,0,0.1);--ck-color-button-default-background:transparent;--ck-color-button-default-hover-background:#e6e6e6;--ck-color-button-default-active-background:#d9d9d9;--ck-color-button-default-active-shadow:#bfbfbf;--ck-color-button-default-disabled-background:transparent;--ck-color-button-on-background:#dedede;--ck-color-button-on-hover-background:#c4c4c4;--ck-color-button-on-active-background:#bababa;--ck-color-button-on-active-shadow:#a1a1a1;--ck-color-button-on-disabled-background:#dedede;--ck-color-button-action-background:var(--ck-color-base-action);--ck-color-button-action-hover-background:#579e3d;--ck-color-button-action-active-background:#53973b;--ck-color-button-action-active-shadow:#498433;--ck-color-button-action-disabled-background:#7ec365;--ck-color-button-action-text:var(--ck-color-base-background);--ck-color-button-save:#008a00;--ck-color-button-cancel:#db3700;--ck-color-switch-button-off-background:#b0b0b0;--ck-color-switch-button-off-hover-background:#a3a3a3;--ck-color-switch-button-on-background:var(--ck-color-button-action-background);--ck-color-switch-button-on-hover-background:#579e3d;--ck-color-switch-button-inner-background:var(--ck-color-base-background);--ck-color-switch-button-inner-shadow:rgba(0,0,0,0.1);--ck-color-dropdown-panel-background:var(--ck-color-base-background);--ck-color-dropdown-panel-border:var(--ck-color-base-border);--ck-color-input-background:var(--ck-color-base-background);--ck-color-input-border:#c7c7c7;--ck-color-input-error-border:var(--ck-color-base-error);--ck-color-input-text:var(--ck-color-base-text);--ck-color-input-disabled-background:#f2f2f2;--ck-color-input-disabled-border:#c7c7c7;--ck-color-input-disabled-text:#757575;--ck-color-list-background:var(--ck-color-base-background);--ck-color-list-button-hover-background:var(--ck-color-button-default-hover-background);--ck-color-list-button-on-background:var(--ck-color-base-active);--ck-color-list-button-on-background-focus:var(--ck-color-base-active-focus);--ck-color-list-button-on-text:var(--ck-color-base-background);--ck-color-panel-background:var(--ck-color-base-background);--ck-color-panel-border:var(--ck-color-base-border);--ck-color-toolbar-background:var(--ck-color-base-foreground);--ck-color-toolbar-border:var(--ck-color-base-border);--ck-color-tooltip-background:var(--ck-color-base-text);--ck-color-tooltip-text:var(--ck-color-base-background);--ck-color-engine-placeholder-text:#707070;--ck-color-upload-bar-background:#6cb5f9;--ck-color-link-default:#0000f0;--ck-color-link-selected-background:rgba(31,177,255,0.1);--ck-color-link-fake-selection:rgba(31,177,255,0.3);--ck-disabled-opacity:.5;--ck-focus-outer-shadow-geometry:0 0 0 3px;--ck-focus-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-outer-shadow);--ck-focus-disabled-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-disabled-shadow);--ck-focus-error-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-error-shadow);--ck-focus-ring:1px solid var(--ck-color-focus-border);--ck-font-size-base:13px;--ck-line-height-base:1.84615;--ck-font-face:Helvetica,Arial,Tahoma,Verdana,Sans-Serif;--ck-font-size-tiny:0.7em;--ck-font-size-small:0.75em;--ck-font-size-normal:1em;--ck-font-size-big:1.4em;--ck-font-size-large:1.8em;--ck-ui-component-min-height:2.3em}.ck.ck-reset,.ck.ck-reset_all,.ck.ck-reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;vertical-align:middle;transition:none;word-wrap:break-word}.ck.ck-reset_all,.ck.ck-reset_all *{border-collapse:collapse;font:normal normal normal var(--ck-font-size-base)/var(--ck-line-height-base) var(--ck-font-face);color:var(--ck-color-text);text-align:left;white-space:nowrap;cursor:auto;float:none}.ck.ck-reset_all .ck-rtl *{text-align:right}.ck.ck-reset_all iframe{vertical-align:inherit}.ck.ck-reset_all textarea{white-space:pre-wrap}.ck.ck-reset_all input[type=password],.ck.ck-reset_all input[type=text],.ck.ck-reset_all textarea{cursor:text}.ck.ck-reset_all input[type=password][disabled],.ck.ck-reset_all input[type=text][disabled],.ck.ck-reset_all textarea[disabled]{cursor:default}.ck.ck-reset_all fieldset{padding:10px;border:2px groove #dfdee3}.ck.ck-reset_all button::-moz-focus-inner{padding:0;border:0}.ck[dir=rtl],.ck[dir=rtl] .ck{text-align:right}:root{--ck-border-radius:2px;--ck-inner-shadow:2px 2px 3px var(--ck-color-shadow-inner) inset;--ck-drop-shadow:0 1px 2px 1px var(--ck-color-shadow-drop);--ck-drop-shadow-active:0 3px 6px 1px var(--ck-color-shadow-drop-active);--ck-spacing-unit:0.6em;--ck-spacing-large:calc(var(--ck-spacing-unit)*1.5);--ck-spacing-standard:var(--ck-spacing-unit);--ck-spacing-medium:calc(var(--ck-spacing-unit)*0.8);--ck-spacing-small:calc(var(--ck-spacing-unit)*0.5);--ck-spacing-tiny:calc(var(--ck-spacing-unit)*0.3);--ck-spacing-extra-tiny:calc(var(--ck-spacing-unit)*0.16)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/globals/_hidden.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/globals/_reset.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/globals/_zindex.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/globals/_transition.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_colors.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_disabled.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_focus.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_fonts.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_reset.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_shadow.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_spacing.css"],names:[],mappings:"AAQA,WAGC,sBACD,CCPA,iDAGC,qBAAsB,CACtB,UAAW,CACX,WAAY,CACZ,eACD,CCPA,MACC,gBAAiB,CACjB,4CACD,CCAA,oDAEC,yBACD,CCNA,MACC,kCAAmD,CACnD,+BAAoD,CACpD,8BAAgD,CAChD,8BAAmD,CACnD,6BAAmD,CACnD,yBAA+C,CAC/C,8BAAmD,CACnD,oCAAuD,CACvD,6BAAkD,CAIlD,+CAAwD,CACxD,qEAA+E,CAC/E,qCAAwD,CACxD,sDAA8D,CAC9D,iDAAyD,CACzD,yCAAqD,CACrD,uCAAsD,CACtD,6CAA0D,CAC1D,uCAAsD,CAItD,gDAAuD,CACvD,kDAA+D,CAC/D,mDAAgE,CAChE,+CAA6D,CAC7D,yDAA8D,CAE9D,uCAAuD,CACvD,6CAA4D,CAC5D,8CAA4D,CAC5D,0CAAyD,CACzD,gDAA8D,CAE9D,+DAAsE,CACtE,iDAAkE,CAClE,kDAAkE,CAClE,8CAA+D,CAC/D,oDAAoE,CACpE,6DAAsE,CAEtE,8BAAoD,CACpD,gCAAqD,CAErD,+CAA4D,CAC5D,qDAAiE,CACjE,+EAAqF,CACrF,oDAAmE,CACnE,yEAA8E,CAC9E,qDAAgE,CAIhE,oEAA2E,CAC3E,4DAAoE,CAIpE,2DAAoE,CACpE,+BAAiD,CACjD,wDAAgE,CAChE,+CAA0D,CAC1D,4CAA2D,CAC3D,wCAAwD,CACxD,sCAAsD,CAItD,0DAAmE,CACnE,uFAA6F,CAC7F,gEAAuE,CACvE,4EAAiF,CACjF,8DAAsE,CAItE,2DAAoE,CACpE,mDAA6D,CAI7D,6DAAsE,CACtE,qDAA+D,CAI/D,uDAAgE,CAChE,uDAAiE,CAIjE,0CAAyD,CAIzD,wCAA2D,CAI3D,+BAAoD,CACpD,wDAAmE,CACnE,mDAAgE,CCpGhE,wBAAyB,CCAzB,0CAA2C,CAK3C,gGAAiG,CAKjG,4GAA6G,CAK7G,sGAAuG,CAKvG,sDAAuD,CCvBvD,wBAAyB,CACzB,6BAA8B,CAC9B,wDAA6D,CAE7D,yBAA0B,CAC1B,2BAA4B,CAC5B,yBAA0B,CAC1B,wBAAyB,CACzB,0BAA2B,CCJ3B,kCJoGD,CI9FA,iDAIC,QAAS,CACT,SAAU,CACV,QAAS,CACT,sBAAuB,CACvB,oBAAqB,CACrB,qBAAsB,CACtB,eAAgB,CAGhB,oBACD,CAKA,oCAGC,wBAAyB,CACzB,iGAAkG,CAClG,0BAA2B,CAC3B,eAAgB,CAChB,kBAAmB,CACnB,WAAY,CACZ,UACD,CAGC,2BACC,gBACD,CAEA,wBAEC,sBACD,CAEA,0BACC,oBACD,CAEA,kGAGC,WACD,CAEA,gIAGC,cACD,CAEA,0BACC,YAAa,CACb,yBACD,CAEA,0CAEC,SAAU,CACV,QACD,CAMD,8BAEC,gBACD,CCnFA,MACC,sBAAuB,CCAvB,gEAAiE,CAKjE,0DAA2D,CAK3D,wEAAyE,CCbzE,uBAA8B,CAC9B,mDAA2D,CAC3D,4CAAkD,CAClD,oDAA4D,CAC5D,mDAA2D,CAC3D,kDAA2D,CAC3D,yDFFD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which hides an element in DOM.\n */\n.ck-hidden {\n\t/* Override selector specificity. Otherwise, all elements with some display\n\tstyle defined will override this one, which is not a desired result. */\n\tdisplay: none !important;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-reset,\n.ck.ck-reset_all,\n.ck.ck-reset_all * {\n\tbox-sizing: border-box;\n\twidth: auto;\n\theight: auto;\n\tposition: static;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-z-default: 1;\n\t--ck-z-modal: calc( var(--ck-z-default) + 999 );\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class that disables all transitions of the element and its children.\n */\n.ck-transitions-disabled,\n.ck-transitions-disabled * {\n\ttransition: none !important;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-base-foreground: \t\t\t\t\t\t\t\thsl(0, 0%, 98%);\n\t--ck-color-base-background: \t\t\t\t\t\t\t\thsl(0, 0%, 100%);\n\t--ck-color-base-border: \t\t\t\t\t\t\t\t\thsl(0, 0%, 77%);\n\t--ck-color-base-action: \t\t\t\t\t\t\t\t\thsl(104, 44%, 48%);\n\t--ck-color-base-focus: \t\t\t\t\t\t\t\t\t\thsl(209, 92%, 70%);\n\t--ck-color-base-text: \t\t\t\t\t\t\t\t\t\thsl(0, 0%, 20%);\n\t--ck-color-base-active: \t\t\t\t\t\t\t\t\thsl(208, 88%, 52%);\n\t--ck-color-base-active-focus:\t\t\t\t\t\t\t\thsl(208, 88%, 47%);\n\t--ck-color-base-error:\t\t\t\t\t\t\t\t\t\thsl(15, 100%, 43%);\n\n\t/* -- Generic colors ------------------------------------------------------------------------ */\n\n\t--ck-color-focus-border-coordinates: \t\t\t\t\t\t208, 79%, 51%;\n\t--ck-color-focus-border: \t\t\t\t\t\t\t\t\thsl(var(--ck-color-focus-border-coordinates));\n\t--ck-color-focus-outer-shadow:\t\t\t\t\t\t\t\thsl(207, 89%, 86%);\n\t--ck-color-focus-disabled-shadow:\t\t\t\t\t\t\thsla(209, 90%, 72%,.3);\n\t--ck-color-focus-error-shadow:\t\t\t\t\t\t\t\thsla(9,100%,56%,.3);\n\t--ck-color-text: \t\t\t\t\t\t\t\t\t\t\tvar(--ck-color-base-text);\n\t--ck-color-shadow-drop: \t\t\t\t\t\t\t\t\thsla(0, 0%, 0%, 0.15);\n\t--ck-color-shadow-drop-active:\t\t\t\t\t\t\t\thsla(0, 0%, 0%, 0.2);\n\t--ck-color-shadow-inner: \t\t\t\t\t\t\t\t\thsla(0, 0%, 0%, 0.1);\n\n\t/* -- Buttons ------------------------------------------------------------------------------- */\n\n\t--ck-color-button-default-background: \t\t\t\t\t\ttransparent;\n\t--ck-color-button-default-hover-background: \t\t\t\thsl(0, 0%, 90%);\n\t--ck-color-button-default-active-background: \t\t\t\thsl(0, 0%, 85%);\n\t--ck-color-button-default-active-shadow: \t\t\t\t\thsl(0, 0%, 75%);\n\t--ck-color-button-default-disabled-background: \t\t\t\ttransparent;\n\n\t--ck-color-button-on-background: \t\t\t\t\t\t\thsl(0, 0%, 87%);\n\t--ck-color-button-on-hover-background: \t\t\t\t\t\thsl(0, 0%, 77%);\n\t--ck-color-button-on-active-background: \t\t\t\t\thsl(0, 0%, 73%);\n\t--ck-color-button-on-active-shadow: \t\t\t\t\t\thsl(0, 0%, 63%);\n\t--ck-color-button-on-disabled-background: \t\t\t\t\thsl(0, 0%, 87%);\n\n\t--ck-color-button-action-background: \t\t\t\t\t\tvar(--ck-color-base-action);\n\t--ck-color-button-action-hover-background: \t\t\t\t\thsl(104, 44%, 43%);\n\t--ck-color-button-action-active-background: \t\t\t\thsl(104, 44%, 41%);\n\t--ck-color-button-action-active-shadow: \t\t\t\t\thsl(104, 44%, 36%);\n\t--ck-color-button-action-disabled-background: \t\t\t\thsl(104, 44%, 58%);\n\t--ck-color-button-action-text: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\n\t--ck-color-button-save: \t\t\t\t\t\t\t\t\thsl(120, 100%, 27%);\n\t--ck-color-button-cancel: \t\t\t\t\t\t\t\t\thsl(15, 100%, 43%);\n\n\t--ck-color-switch-button-off-background:\t\t\t\t\thsl(0, 0%, 69%);\n\t--ck-color-switch-button-off-hover-background:\t\t\t\thsl(0, 0%, 64%);\n\t--ck-color-switch-button-on-background:\t\t\t\t\t\tvar(--ck-color-button-action-background);\n\t--ck-color-switch-button-on-hover-background:\t\t\t\thsl(104, 44%, 43%);\n\t--ck-color-switch-button-inner-background:\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-switch-button-inner-shadow:\t\t\t\t\t\thsla(0, 0%, 0%, 0.1);\n\n\t/* -- Dropdown ------------------------------------------------------------------------------ */\n\n\t--ck-color-dropdown-panel-background: \t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-dropdown-panel-border: \t\t\t\t\t\t\tvar(--ck-color-base-border);\n\n\t/* -- Input --------------------------------------------------------------------------------- */\n\n\t--ck-color-input-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-input-border: \t\t\t\t\t\t\t\t\thsl(0, 0%, 78%);\n\t--ck-color-input-error-border:\t\t\t\t\t\t\t\tvar(--ck-color-base-error);\n\t--ck-color-input-text: \t\t\t\t\t\t\t\t\t\tvar(--ck-color-base-text);\n\t--ck-color-input-disabled-background: \t\t\t\t\t\thsl(0, 0%, 95%);\n\t--ck-color-input-disabled-border: \t\t\t\t\t\t\thsl(0, 0%, 78%);\n\t--ck-color-input-disabled-text: \t\t\t\t\t\t\thsl(0, 0%, 46%);\n\n\t/* -- List ---------------------------------------------------------------------------------- */\n\n\t--ck-color-list-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-list-button-hover-background: \t\t\t\t\tvar(--ck-color-button-default-hover-background);\n\t--ck-color-list-button-on-background: \t\t\t\t\t\tvar(--ck-color-base-active);\n\t--ck-color-list-button-on-background-focus: \t\t\t\tvar(--ck-color-base-active-focus);\n\t--ck-color-list-button-on-text:\t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\n\t/* -- Panel --------------------------------------------------------------------------------- */\n\n\t--ck-color-panel-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-panel-border: \t\t\t\t\t\t\t\t\tvar(--ck-color-base-border);\n\n\t/* -- Toolbar ------------------------------------------------------------------------------- */\n\n\t--ck-color-toolbar-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-foreground);\n\t--ck-color-toolbar-border: \t\t\t\t\t\t\t\t\tvar(--ck-color-base-border);\n\n\t/* -- Tooltip ------------------------------------------------------------------------------- */\n\n\t--ck-color-tooltip-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-text);\n\t--ck-color-tooltip-text: \t\t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\n\t/* -- Engine -------------------------------------------------------------------------------- */\n\n\t--ck-color-engine-placeholder-text: \t\t\t\t\t\thsl(0, 0%, 44%);\n\n\t/* -- Upload -------------------------------------------------------------------------------- */\n\n\t--ck-color-upload-bar-background:\t\t \t\t\t\t\thsl(209, 92%, 70%);\n\n\t/* -- Link -------------------------------------------------------------------------------- */\n\n\t--ck-color-link-default:\t\t\t\t\t\t\t\t\thsl(240, 100%, 47%);\n\t--ck-color-link-selected-background:\t\t\t\t\t\thsla(201, 100%, 56%, 0.1);\n\t--ck-color-link-fake-selection:\t\t\t\t\t\t\t\thsla(201, 100%, 56%, 0.3);\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/**\n\t * An opacity value of disabled UI item.\n\t */\n\t--ck-disabled-opacity: .5;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/**\n\t * The geometry of the of focused element's outer shadow.\n\t */\n\t--ck-focus-outer-shadow-geometry: 0 0 0 3px;\n\n\t/**\n\t * A visual style of focused element's outer shadow.\n\t */\n\t--ck-focus-outer-shadow: var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-outer-shadow);\n\n\t/**\n\t * A visual style of focused element's outer shadow (when disabled).\n\t */\n\t--ck-focus-disabled-outer-shadow: var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-disabled-shadow);\n\n\t/**\n\t * A visual style of focused element's outer shadow (when has errors).\n\t */\n\t--ck-focus-error-outer-shadow: var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-error-shadow);\n\n\t/**\n\t * A visual style of focused element's border or outline.\n\t */\n\t--ck-focus-ring: 1px solid var(--ck-color-focus-border);\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-font-size-base: 13px;\n\t--ck-line-height-base: 1.84615;\n\t--ck-font-face: Helvetica, Arial, Tahoma, Verdana, Sans-Serif;\n\n\t--ck-font-size-tiny: 0.7em;\n\t--ck-font-size-small: 0.75em;\n\t--ck-font-size-normal: 1em;\n\t--ck-font-size-big: 1.4em;\n\t--ck-font-size-large: 1.8em;\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/* This is super-important. This is **manually** adjusted so a button without an icon\n\tis never smaller than a button with icon, additionally making sure that text-less buttons\n\tare perfect squares. The value is also shared by other components which should stay "in-line"\n\twith buttons. */\n\t--ck-ui-component-min-height: 2.3em;\n}\n\n/**\n * Resets an element, ignoring its children.\n */\n.ck.ck-reset,\n.ck.ck-reset_all,\n.ck.ck-reset_all * {\n\t/* Do not include inheritable rules here. */\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: transparent;\n\ttext-decoration: none;\n\tvertical-align: middle;\n\ttransition: none;\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/105 */\n\tword-wrap: break-word;\n}\n\n/**\n * Resets an element AND its children.\n */\n.ck.ck-reset_all,\n.ck.ck-reset_all * {\n\t/* These are rule inherited by all children elements. */\n\tborder-collapse: collapse;\n\tfont: normal normal normal var(--ck-font-size-base)/var(--ck-line-height-base) var(--ck-font-face);\n\tcolor: var(--ck-color-text);\n\ttext-align: left;\n\twhite-space: nowrap;\n\tcursor: auto;\n\tfloat: none;\n}\n\n.ck.ck-reset_all {\n\t& .ck-rtl * {\n\t\ttext-align: right;\n\t}\n\n\t& iframe {\n\t\t/* For IE */\n\t\tvertical-align: inherit;\n\t}\n\n\t& textarea {\n\t\twhite-space: pre-wrap;\n\t}\n\n\t& textarea,\n\t& input[type="text"],\n\t& input[type="password"] {\n\t\tcursor: text;\n\t}\n\n\t& textarea[disabled],\n\t& input[type="text"][disabled],\n\t& input[type="password"][disabled] {\n\t\tcursor: default;\n\t}\n\n\t& fieldset {\n\t\tpadding: 10px;\n\t\tborder: 2px groove hsl(255, 7%, 88%);\n\t}\n\n\t& button::-moz-focus-inner {\n\t\t/* See http://stackoverflow.com/questions/5517744/remove-extra-button-spacing-padding-in-firefox */\n\t\tpadding: 0;\n\t\tborder: 0\n\t}\n}\n\n/**\n * Default UI rules for RTL languages.\n */\n.ck[dir="rtl"],\n.ck[dir="rtl"] .ck {\n\ttext-align: right;\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Default border-radius value.\n */\n:root{\n\t--ck-border-radius: 2px;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/**\n\t * A visual style of element's inner shadow (i.e. input).\n\t */\n\t--ck-inner-shadow: 2px 2px 3px var(--ck-color-shadow-inner) inset;\n\n\t/**\n\t * A visual style of element's drop shadow (i.e. panel).\n\t */\n\t--ck-drop-shadow: 0 1px 2px 1px var(--ck-color-shadow-drop);\n\n\t/**\n\t * A visual style of element's active shadow (i.e. comment or suggestion).\n\t */\n\t--ck-drop-shadow-active: 0 3px 6px 1px var(--ck-color-shadow-drop-active);\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-spacing-unit: \t\t\t\t\t\t0.6em;\n\t--ck-spacing-large: \t\t\t\t\tcalc(var(--ck-spacing-unit) * 1.5);\n\t--ck-spacing-standard: \t\t\t\t\tvar(--ck-spacing-unit);\n\t--ck-spacing-medium: \t\t\t\t\tcalc(var(--ck-spacing-unit) * 0.8);\n\t--ck-spacing-small: \t\t\t\t\tcalc(var(--ck-spacing-unit) * 0.5);\n\t--ck-spacing-tiny: \t\t\t\t\t\tcalc(var(--ck-spacing-unit) * 0.3);\n\t--ck-spacing-extra-tiny: \t\t\t\tcalc(var(--ck-spacing-unit) * 0.16);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-icon{vertical-align:middle}:root{--ck-icon-size:calc(var(--ck-line-height-base)*var(--ck-font-size-normal))}.ck.ck-icon{width:var(--ck-icon-size);height:var(--ck-icon-size);font-size:.8333350694em;will-change:transform}.ck.ck-icon,.ck.ck-icon *{color:inherit;cursor:inherit}.ck.ck-icon :not([fill]){fill:currentColor}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/icon/icon.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/icon/icon.css"],names:[],mappings:"AAKA,YACC,qBACD,CCFA,MACC,0EACD,CAEA,YACC,yBAA0B,CAC1B,0BAA2B,CAG3B,uBAAwB,CAQxB,qBAcD,CAZC,0BARA,aAAc,CAGd,cAgBA,CAJC,yBAEC,iBACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-icon {\n\tvertical-align: middle;\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-icon-size: calc(var(--ck-line-height-base) * var(--ck-font-size-normal));\n}\n\n.ck.ck-icon {\n\twidth: var(--ck-icon-size);\n\theight: var(--ck-icon-size);\n\n\t/* Multiplied by the height of the line in "px" should give SVG "viewport" dimensions */\n\tfont-size: .8333350694em;\n\n\tcolor: inherit;\n\n\t/* Inherit cursor style (#5). */\n\tcursor: inherit;\n\n\t/* This will prevent blurry icons on Firefox. See #340. */\n\twill-change: transform;\n\n\t& * {\n\t\t/* Inherit cursor style (#5). */\n\t\tcursor: inherit;\n\n\t\t/* Allows dynamic coloring of the icons. */\n\t\tcolor: inherit;\n\n\t\t&:not([fill]) {\n\t\t\t/* Needed by FF. */\n\t\t\tfill: currentColor;\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,'.ck.ck-tooltip,.ck.ck-tooltip .ck-tooltip__text:after{position:absolute;pointer-events:none;-webkit-backface-visibility:hidden}.ck.ck-tooltip{visibility:hidden;opacity:0;display:none;z-index:var(--ck-z-modal)}.ck.ck-tooltip .ck-tooltip__text{display:inline-block}.ck.ck-tooltip .ck-tooltip__text:after{content:"";width:0;height:0}:root{--ck-tooltip-arrow-size:5px}.ck.ck-tooltip{left:50%;top:0;transition:opacity .2s ease-in-out .2s}.ck.ck-tooltip .ck-tooltip__text{border-radius:0}.ck-rounded-corners .ck.ck-tooltip .ck-tooltip__text,.ck.ck-tooltip .ck-tooltip__text.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-tooltip .ck-tooltip__text{font-size:.9em;line-height:1.5;color:var(--ck-color-tooltip-text);padding:var(--ck-spacing-small) var(--ck-spacing-medium);background:var(--ck-color-tooltip-background);position:relative;left:-50%}.ck.ck-tooltip .ck-tooltip__text:after{transition:opacity .2s ease-in-out .2s;border-style:solid;left:50%}.ck.ck-tooltip.ck-tooltip_s,.ck.ck-tooltip.ck-tooltip_se,.ck.ck-tooltip.ck-tooltip_sw{bottom:calc(var(--ck-tooltip-arrow-size)*-1);transform:translateY(100%)}.ck.ck-tooltip.ck-tooltip_s .ck-tooltip__text:after,.ck.ck-tooltip.ck-tooltip_se .ck-tooltip__text:after,.ck.ck-tooltip.ck-tooltip_sw .ck-tooltip__text:after{top:calc(var(--ck-tooltip-arrow-size)*-1 + 1px);transform:translateX(-50%);border-left-color:transparent;border-bottom-color:var(--ck-color-tooltip-background);border-right-color:transparent;border-top-color:transparent;border-left-width:var(--ck-tooltip-arrow-size);border-bottom-width:var(--ck-tooltip-arrow-size);border-right-width:var(--ck-tooltip-arrow-size);border-top-width:0}.ck.ck-tooltip.ck-tooltip_sw{right:50%;left:auto}.ck.ck-tooltip.ck-tooltip_sw .ck-tooltip__text{left:auto;right:calc(var(--ck-tooltip-arrow-size)*-2)}.ck.ck-tooltip.ck-tooltip_sw .ck-tooltip__text:after{left:auto;right:0}.ck.ck-tooltip.ck-tooltip_se{left:50%;right:auto}.ck.ck-tooltip.ck-tooltip_se .ck-tooltip__text{right:auto;left:calc(var(--ck-tooltip-arrow-size)*-2)}.ck.ck-tooltip.ck-tooltip_se .ck-tooltip__text:after{right:auto;left:0;transform:translateX(50%)}.ck.ck-tooltip.ck-tooltip_n{top:calc(var(--ck-tooltip-arrow-size)*-1);transform:translateY(-100%)}.ck.ck-tooltip.ck-tooltip_n .ck-tooltip__text:after{bottom:calc(var(--ck-tooltip-arrow-size)*-1);transform:translateX(-50%);border-left-color:transparent;border-bottom-color:transparent;border-right-color:transparent;border-top-color:var(--ck-color-tooltip-background);border-left-width:var(--ck-tooltip-arrow-size);border-bottom-width:0;border-right-width:var(--ck-tooltip-arrow-size);border-top-width:var(--ck-tooltip-arrow-size)}.ck.ck-tooltip.ck-tooltip_e{left:calc(100% + var(--ck-tooltip-arrow-size));top:50%}.ck.ck-tooltip.ck-tooltip_e .ck-tooltip__text{left:0;transform:translateY(-50%)}.ck.ck-tooltip.ck-tooltip_e .ck-tooltip__text:after{left:calc(var(--ck-tooltip-arrow-size)*-1);top:calc(50% - var(--ck-tooltip-arrow-size)*1);border-left-color:transparent;border-bottom-color:transparent;border-right-color:var(--ck-color-tooltip-background);border-top-color:transparent;border-left-width:0;border-bottom-width:var(--ck-tooltip-arrow-size);border-right-width:var(--ck-tooltip-arrow-size);border-top-width:var(--ck-tooltip-arrow-size)}.ck.ck-tooltip.ck-tooltip_w{right:calc(100% + var(--ck-tooltip-arrow-size));left:auto;top:50%}.ck.ck-tooltip.ck-tooltip_w .ck-tooltip__text{left:0;transform:translateY(-50%)}.ck.ck-tooltip.ck-tooltip_w .ck-tooltip__text:after{left:100%;top:calc(50% - var(--ck-tooltip-arrow-size)*1);border-left-color:var(--ck-color-tooltip-background);border-bottom-color:transparent;border-right-color:transparent;border-top-color:transparent;border-left-width:var(--ck-tooltip-arrow-size);border-bottom-width:var(--ck-tooltip-arrow-size);border-right-width:0;border-top-width:var(--ck-tooltip-arrow-size)}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/tooltip.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/tooltip/tooltip.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAKA,sDAEC,iBAAkB,CAGlB,mBAAoB,CAIpB,kCACD,CAEA,eAEC,iBAAkB,CAClB,SAAU,CACV,YAAa,CACb,yBAWD,CATC,iCACC,oBAOD,CALC,uCACC,UAAW,CACX,OAAQ,CACR,QACD,CCxBF,MACC,2BACD,CAEA,eACC,QAAS,CAMT,KAAM,CAON,sCAwKD,CAtKC,iCChBA,eDqCA,CArBA,yGCZC,qCDiCD,CArBA,iCAGC,cAAe,CACf,eAAgB,CAChB,kCAAmC,CACnC,wDAAyD,CACzD,6CAA8C,CAC9C,iBAAkB,CAClB,SAYD,CAVC,uCAMC,sCAAuC,CACvC,kBAAmB,CACnB,QACD,CAYD,sFAGC,4CAA+C,CAC/C,0BASD,CAPC,8JAEC,+CAAkD,CAClD,0BAA6B,CAC7B,6BAAoF,CAApF,sDAAoF,CAApF,8BAAoF,CAApF,4BAAoF,CACpF,8CAAsG,CAAtG,gDAAsG,CAAtG,+CAAsG,CAAtG,kBACD,CAaD,6BACC,SAAU,CACV,SAWD,CATC,+CACC,SAAU,CACV,2CACD,CAEA,qDACC,SAAU,CACV,OACD,CAYD,6BACC,QAAS,CACT,UAYD,CAVC,+CACC,UAAW,CACX,0CACD,CAEA,qDACC,UAAW,CACX,MAAO,CACP,yBACD,CAYD,4BACC,yCAA4C,CAC5C,2BAQD,CANC,oDACC,4CAA+C,CAC/C,0BAA6B,CAC7B,6BAAoF,CAApF,+BAAoF,CAApF,8BAAoF,CAApF,mDAAoF,CACpF,8CAAsG,CAAtG,qBAAsG,CAAtG,+CAAsG,CAAtG,6CACD,CAUD,4BACC,8CAA+C,CAC/C,OAaD,CAXC,8CACC,MAAO,CACP,0BAQD,CANC,oDACC,0CAA6C,CAC7C,8CAAiD,CACjD,6BAAoF,CAApF,+BAAoF,CAApF,qDAAoF,CAApF,4BAAoF,CACpF,mBAAsG,CAAtG,gDAAsG,CAAtG,+CAAsG,CAAtG,6CACD,CAWF,4BACC,+CAAgD,CAChD,SAAU,CACV,OAaD,CAXC,8CACC,MAAO,CACP,0BAQD,CANC,oDACC,SAAU,CACV,8CAAiD,CACjD,oDAAoF,CAApF,+BAAoF,CAApF,8BAAoF,CAApF,4BAAoF,CACpF,8CAAsG,CAAtG,gDAAsG,CAAtG,oBAAsG,CAAtG,6CACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-tooltip,\n.ck.ck-tooltip .ck-tooltip__text::after {\n\tposition: absolute;\n\n\t/* Without this, hovering the tooltip could keep it visible. */\n\tpointer-events: none;\n\n\t/* This is to get rid of flickering when transitioning opacity in Chrome.\n\tIt\'s weird but it works. */\n\t-webkit-backface-visibility: hidden;\n}\n\n.ck.ck-tooltip {\n\t/* Tooltip is hidden by default. */\n\tvisibility: hidden;\n\topacity: 0;\n\tdisplay: none;\n\tz-index: var(--ck-z-modal);\n\n\t& .ck-tooltip__text {\n\t\tdisplay: inline-block;\n\n\t\t&::after {\n\t\t\tcontent: "";\n\t\t\twidth: 0;\n\t\t\theight: 0;\n\t\t}\n\t}\n}\n','/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n:root {\n\t--ck-tooltip-arrow-size: 5px;\n}\n\n.ck.ck-tooltip {\n\tleft: 50%;\n\n\t/*\n\t * Prevent blurry tooltips in LoDPI environments.\n\t * See https://github.com/ckeditor/ckeditor5/issues/1802.\n\t */\n\ttop: 0;\n\n\t/*\n\t * For the transition to work, the tooltip must be controlled\n\t * using visibility+opacity. A delay prevents a "tooltip avalanche"\n\t * i.e. when scanning the toolbar with mouse cursor.\n\t */\n\ttransition: opacity .2s ease-in-out .2s;\n\n\t& .ck-tooltip__text {\n\t\t@mixin ck-rounded-corners;\n\n\t\tfont-size: .9em;\n\t\tline-height: 1.5;\n\t\tcolor: var(--ck-color-tooltip-text);\n\t\tpadding: var(--ck-spacing-small) var(--ck-spacing-medium);\n\t\tbackground: var(--ck-color-tooltip-background);\n\t\tposition: relative;\n\t\tleft: -50%;\n\n\t\t&::after {\n\t\t\t/*\n\t\t\t * For the transition to work, the tooltip must be controlled\n\t\t\t * using visibility+opacity. A delay prevents a "tooltip avalanche"\n\t\t\t * i.e. when scanning the toolbar with mouse cursor.\n\t\t\t */\n\t\t\ttransition: opacity .2s ease-in-out .2s;\n\t\t\tborder-style: solid;\n\t\t\tleft: 50%;\n\t\t}\n\t}\n\n\t/**\n\t * A class that displays the tooltip south of the element.\n\t *\n\t * [element]\n\t * ^\n\t * +-----------+\n\t * | Tooltip |\n\t * +-----------+\n\t */\n\t&.ck-tooltip_s,\n\t&.ck-tooltip_sw,\n\t&.ck-tooltip_se {\n\t\tbottom: calc(-1 * var(--ck-tooltip-arrow-size));\n\t\ttransform: translateY( 100% );\n\n\t\t& .ck-tooltip__text::after {\n\t\t\t/* 1px addresses gliches in rendering causing gap between the triangle and the text */\n\t\t\ttop: calc(-1 * var(--ck-tooltip-arrow-size) + 1px);\n\t\t\ttransform: translateX( -50% );\n\t\t\tborder-color: transparent transparent var(--ck-color-tooltip-background) transparent;\n\t\t\tborder-width: 0 var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size);\n\t\t}\n\t}\n\n\t/**\n\t * A class that displays the tooltip south-west of the element.\n\t *\n\t * [element]\n\t * ^\n\t * +-----------+\n\t * | Tooltip |\n\t * +-----------+\n\t */\n\n\t&.ck-tooltip_sw {\n\t\tright: 50%;\n\t\tleft: auto;\n\n\t\t& .ck-tooltip__text {\n\t\t\tleft: auto;\n\t\t\tright: calc( -2 * var(--ck-tooltip-arrow-size));\n\t\t}\n\n\t\t& .ck-tooltip__text::after {\n\t\t\tleft: auto;\n\t\t\tright: 0;\n\t\t}\n\t}\n\n\t/**\n\t * A class that displays the tooltip south-east of the element.\n\t *\n\t * [element]\n\t * ^\n\t * +-----------+\n\t * | Tooltip |\n\t * +-----------+\n\t */\n\t&.ck-tooltip_se {\n\t\tleft: 50%;\n\t\tright: auto;\n\n\t\t& .ck-tooltip__text {\n\t\t\tright: auto;\n\t\t\tleft: calc( -2 * var(--ck-tooltip-arrow-size));\n\t\t}\n\n\t\t& .ck-tooltip__text::after {\n\t\t\tright: auto;\n\t\t\tleft: 0;\n\t\t\ttransform: translateX( 50% );\n\t\t}\n\t}\n\n\t/**\n\t * A class that displays the tooltip north of the element.\n\t *\n\t * +-----------+\n\t * | Tooltip |\n\t * +-----------+\n\t * V\n\t * [element]\n\t */\n\t&.ck-tooltip_n {\n\t\ttop: calc(-1 * var(--ck-tooltip-arrow-size));\n\t\ttransform: translateY( -100% );\n\n\t\t& .ck-tooltip__text::after {\n\t\t\tbottom: calc(-1 * var(--ck-tooltip-arrow-size));\n\t\t\ttransform: translateX( -50% );\n\t\t\tborder-color: var(--ck-color-tooltip-background) transparent transparent transparent;\n\t\t\tborder-width: var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size) 0 var(--ck-tooltip-arrow-size);\n\t\t}\n\t}\n\n\t/**\n\t * A class that displays the tooltip east of the element.\n\t *\n\t * +----------+\n\t * [element] < | east |\n\t * +----------+\n\t */\n\t&.ck-tooltip_e {\n\t\tleft: calc(100% + var(--ck-tooltip-arrow-size));\n\t\ttop: 50%;\n\n\t\t& .ck-tooltip__text {\n\t\t\tleft: 0;\n\t\t\ttransform: translateY( -50% );\n\n\t\t\t&::after {\n\t\t\t\tleft: calc(-1 * var(--ck-tooltip-arrow-size));\n\t\t\t\ttop: calc(50% - 1 * var(--ck-tooltip-arrow-size));\n\t\t\t\tborder-color: transparent var(--ck-color-tooltip-background) transparent transparent;\n\t\t\t\tborder-width: var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size) 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * A class that displays the tooltip west of the element.\n\t *\n\t * +----------+\n\t * | west | > [element]\n\t * +----------+\n\t */\n\t&.ck-tooltip_w {\n\t\tright: calc(100% + var(--ck-tooltip-arrow-size));\n\t\tleft: auto;\n\t\ttop: 50%;\n\n\t\t& .ck-tooltip__text {\n\t\t\tleft: 0;\n\t\t\ttransform: translateY( -50% );\n\n\t\t\t&::after {\n\t\t\t\tleft: 100%;\n\t\t\t\ttop: calc(50% - 1 * var(--ck-tooltip-arrow-size));\n\t\t\t\tborder-color: transparent transparent transparent var(--ck-color-tooltip-background);\n\t\t\t\tborder-width: var(--ck-tooltip-arrow-size) 0 var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size);\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-button,a.ck.ck-button{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.ck.ck-button .ck-tooltip,a.ck.ck-button .ck-tooltip{display:block}@media (hover:none){.ck.ck-button .ck-tooltip,a.ck.ck-button .ck-tooltip{display:none}}.ck.ck-button,a.ck.ck-button{position:relative;display:inline-flex;align-items:center;justify-content:left}.ck.ck-button .ck-button__label,a.ck.ck-button .ck-button__label{display:none}.ck.ck-button.ck-button_with-text .ck-button__label,a.ck.ck-button.ck-button_with-text .ck-button__label{display:inline-block}.ck.ck-button:not(.ck-button_with-text),a.ck.ck-button:not(.ck-button_with-text){justify-content:center}.ck.ck-button:hover .ck-tooltip,a.ck.ck-button:hover .ck-tooltip{visibility:visible;opacity:1}.ck.ck-button:focus:not(:hover) .ck-tooltip,a.ck.ck-button:focus:not(:hover) .ck-tooltip{display:none}.ck.ck-button,a.ck.ck-button{background:var(--ck-color-button-default-background)}.ck.ck-button:not(.ck-disabled):hover,a.ck.ck-button:not(.ck-disabled):hover{background:var(--ck-color-button-default-hover-background)}.ck.ck-button:not(.ck-disabled):active,a.ck.ck-button:not(.ck-disabled):active{background:var(--ck-color-button-default-active-background);box-shadow:inset 0 2px 2px var(--ck-color-button-default-active-shadow)}.ck.ck-button.ck-disabled,a.ck.ck-button.ck-disabled{background:var(--ck-color-button-default-disabled-background)}.ck.ck-button,a.ck.ck-button{border-radius:0}.ck-rounded-corners .ck.ck-button,.ck-rounded-corners a.ck.ck-button,.ck.ck-button.ck-rounded-corners,a.ck.ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-button,a.ck.ck-button{white-space:nowrap;cursor:default;vertical-align:middle;padding:var(--ck-spacing-tiny);text-align:center;min-width:var(--ck-ui-component-min-height);min-height:var(--ck-ui-component-min-height);line-height:1;font-size:inherit;border:1px solid transparent;transition:box-shadow .2s ease-in-out,border .2s ease-in-out;-webkit-appearance:none}.ck.ck-button:active,.ck.ck-button:focus,a.ck.ck-button:active,a.ck.ck-button:focus{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-focus-outer-shadow),0 0}.ck.ck-button .ck-button__icon use,.ck.ck-button .ck-button__icon use *,a.ck.ck-button .ck-button__icon use,a.ck.ck-button .ck-button__icon use *{color:inherit}.ck.ck-button .ck-button__label,a.ck.ck-button .ck-button__label{font-size:inherit;font-weight:inherit;color:inherit;cursor:inherit;vertical-align:middle}[dir=ltr] .ck.ck-button .ck-button__label,[dir=ltr] a.ck.ck-button .ck-button__label{text-align:left}[dir=rtl] .ck.ck-button .ck-button__label,[dir=rtl] a.ck.ck-button .ck-button__label{text-align:right}.ck.ck-button .ck-button__keystroke,a.ck.ck-button .ck-button__keystroke{color:inherit}[dir=ltr] .ck.ck-button .ck-button__keystroke,[dir=ltr] a.ck.ck-button .ck-button__keystroke{margin-left:var(--ck-spacing-large)}[dir=rtl] .ck.ck-button .ck-button__keystroke,[dir=rtl] a.ck.ck-button .ck-button__keystroke{margin-right:var(--ck-spacing-large)}.ck.ck-button .ck-button__keystroke,a.ck.ck-button .ck-button__keystroke{font-weight:700;opacity:.7}.ck.ck-button.ck-disabled:active,.ck.ck-button.ck-disabled:focus,a.ck.ck-button.ck-disabled:active,a.ck.ck-button.ck-disabled:focus{box-shadow:var(--ck-focus-disabled-outer-shadow),0 0}.ck.ck-button.ck-disabled .ck-button__icon,a.ck.ck-button.ck-disabled .ck-button__icon{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-disabled .ck-button__label,a.ck.ck-button.ck-disabled .ck-button__label{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-disabled .ck-button__keystroke,a.ck.ck-button.ck-disabled .ck-button__keystroke{opacity:.3}.ck.ck-button.ck-button_with-text,a.ck.ck-button.ck-button_with-text{padding:var(--ck-spacing-tiny) var(--ck-spacing-standard)}[dir=ltr] .ck.ck-button.ck-button_with-text .ck-button__icon,[dir=ltr] a.ck.ck-button.ck-button_with-text .ck-button__icon{margin-left:calc(var(--ck-spacing-small)*-1);margin-right:var(--ck-spacing-small)}[dir=rtl] .ck.ck-button.ck-button_with-text .ck-button__icon,[dir=rtl] a.ck.ck-button.ck-button_with-text .ck-button__icon{margin-right:calc(var(--ck-spacing-small)*-1);margin-left:var(--ck-spacing-small)}.ck.ck-button.ck-button_with-keystroke .ck-button__label,a.ck.ck-button.ck-button_with-keystroke .ck-button__label{flex-grow:1}.ck.ck-button.ck-on,a.ck.ck-button.ck-on{background:var(--ck-color-button-on-background)}.ck.ck-button.ck-on:not(.ck-disabled):hover,a.ck.ck-button.ck-on:not(.ck-disabled):hover{background:var(--ck-color-button-on-hover-background)}.ck.ck-button.ck-on:not(.ck-disabled):active,a.ck.ck-button.ck-on:not(.ck-disabled):active{background:var(--ck-color-button-on-active-background);box-shadow:inset 0 2px 2px var(--ck-color-button-on-active-shadow)}.ck.ck-button.ck-on.ck-disabled,a.ck.ck-button.ck-on.ck-disabled{background:var(--ck-color-button-on-disabled-background)}.ck.ck-button.ck-button-save,a.ck.ck-button.ck-button-save{color:var(--ck-color-button-save)}.ck.ck-button.ck-button-cancel,a.ck.ck-button.ck-button-cancel{color:var(--ck-color-button-cancel)}.ck.ck-button-action,a.ck.ck-button-action{background:var(--ck-color-button-action-background)}.ck.ck-button-action:not(.ck-disabled):hover,a.ck.ck-button-action:not(.ck-disabled):hover{background:var(--ck-color-button-action-hover-background)}.ck.ck-button-action:not(.ck-disabled):active,a.ck.ck-button-action:not(.ck-disabled):active{background:var(--ck-color-button-action-active-background);box-shadow:inset 0 2px 2px var(--ck-color-button-action-active-shadow)}.ck.ck-button-action.ck-disabled,a.ck.ck-button-action.ck-disabled{background:var(--ck-color-button-action-disabled-background)}.ck.ck-button-action,a.ck.ck-button-action{color:var(--ck-color-button-action-text)}.ck.ck-button-bold,a.ck.ck-button-bold{font-weight:700}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/button/button.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/mixins/_tooltip.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/button/button.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/mixins/_button.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_disabled.css"],names:[],mappings:"AAQA,6BCCC,qBAAsB,CACtB,wBAAyB,CACzB,oBAAqB,CACrB,gBD6BD,CE/BC,qDACC,aAqBD,CAHC,oBAnBD,qDAoBE,YAEF,CADC,CFvBF,6BAKC,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,oBAyBD,CAvBC,iEACC,YACD,CAGC,yGACC,oBACD,CAID,iFACC,sBACD,CEkBA,iEACC,kBAAmB,CACnB,SACD,CAbA,yFACC,YACD,CC7BD,6BCAC,oDD0ID,CCvIE,6EACC,0DACD,CAEA,+EACC,2DAA4C,CAC5C,uEACD,CAID,qDACC,6DACD,CDhBD,6BEDC,eF2ID,CA1IA,wIEGE,qCFuIF,CA1IA,6BAKC,kBAAmB,CACnB,cAAe,CACf,qBAAsB,CACtB,8BAA+B,CAC/B,iBAAkB,CAGlB,2CAA4C,CAC5C,4CAA6C,CAI7C,aAAc,CAGd,iBAAkB,CAGlB,4BAA6B,CAG7B,4DAA8D,CAG9D,uBA6GD,CA3GC,oFGjCA,YAAa,CACb,2BAA2B,CCF3B,2CJsCA,CAIC,kJAEC,aACD,CAGD,iEAEC,iBAAkB,CAClB,mBAAoB,CACpB,aAAc,CACd,cAAe,CAIf,qBASD,CAlBA,qFAYE,eAMF,CAlBA,qFAgBE,gBAEF,CAEA,yEACC,aAYD,CAbA,6FAIE,mCASF,CAbA,6FAQE,oCAKF,CAbA,yEAWC,eAAiB,CACjB,UACD,CAIC,oIIrFD,oDJyFC,CAEA,uFK3FD,kCL6FC,CAGA,yFKhGD,kCLkGC,CAEA,iGACC,UACD,CAGD,qEACC,yDAcD,CAXC,2HAEE,4CAA+C,CAC/C,oCAOF,CAVA,2HAOE,6CAAgD,CAChD,mCAEF,CAKA,mHACC,WACD,CAID,yCC/HA,+CDiIA,CC9HC,yFACC,qDACD,CAEA,2FACC,sDAA4C,CAC5C,kEACD,CAID,iEACC,wDACD,CDmHA,2DACC,iCACD,CAEA,+DACC,mCACD,CAID,2CC7IC,mDDkJD,CC/IE,2FACC,yDACD,CAEA,6FACC,0DAA4C,CAC5C,sEACD,CAID,mEACC,4DACD,CD6HD,2CAIC,wCACD,CAEA,uCAEC,eACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../mixins/_unselectable.css";\n@import "../tooltip/mixins/_tooltip.css";\n\n.ck.ck-button,\na.ck.ck-button {\n\t@mixin ck-unselectable;\n\t@mixin ck-tooltip_enabled;\n\n\tposition: relative;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: left;\n\n\t& .ck-button__label {\n\t\tdisplay: none;\n\t}\n\n\t&.ck-button_with-text {\n\t\t& .ck-button__label {\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n\n\t/* Center the icon horizontally in a button without text. */\n\t&:not(.ck-button_with-text) {\n\t\tjustify-content: center;\n\t}\n\n\t&:hover {\n\t\t@mixin ck-tooltip_visible;\n\t}\n\n\t/* Get rid of the native focus outline around the tooltip when focused (but not :hover). */\n\t&:focus:not(:hover) {\n\t\t@mixin ck-tooltip_disabled;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Makes element unselectable.\n */\n@define-mixin ck-unselectable {\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Enables the tooltip, which is the tooltip is in DOM but\n * not yet displayed.\n */\n@define-mixin ck-tooltip_enabled {\n\t& .ck-tooltip {\n\t\tdisplay: block;\n\n\t\t/*\n\t\t * Don't display tooltips in devices which don't support :hover.\n\t\t * In fact, it's all about iOS, which forces user to click UI elements twice to execute\n\t\t * the primary action, when tooltips are enabled.\n\t\t *\n\t\t * Q: OK, but why not the following query?\n\t\t *\n\t\t * @media (hover) {\n\t\t * display: block;\n\t\t * }\n\t\t *\n\t\t * A: Because FF does not support it and it would completely disable tooltips\n\t\t * in that browser.\n\t\t *\n\t\t * More in https://github.com/ckeditor/ckeditor5/issues/920.\n\t\t */\n\t\t@media (hover:none) {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n/**\n * Disables the tooltip making it disappear from DOM.\n */\n@define-mixin ck-tooltip_disabled {\n\t& .ck-tooltip {\n\t\tdisplay: none;\n\t}\n}\n\n/**\n * Shows the tooltip, which is already in DOM.\n * Requires `ck-tooltip_enabled` first.\n */\n@define-mixin ck-tooltip_visible {\n\t& .ck-tooltip {\n\t\tvisibility: visible;\n\t\topacity: 1;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_focus.css";\n@import "../../../mixins/_shadow.css";\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_rounded.css";\n@import "../../mixins/_button.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-button,\na.ck.ck-button {\n\t@mixin ck-button-colors --ck-color-button-default;\n\t@mixin ck-rounded-corners;\n\n\twhite-space: nowrap;\n\tcursor: default;\n\tvertical-align: middle;\n\tpadding: var(--ck-spacing-tiny);\n\ttext-align: center;\n\n\t/* A very important piece of styling. Go to variable declaration to learn more. */\n\tmin-width: var(--ck-ui-component-min-height);\n\tmin-height: var(--ck-ui-component-min-height);\n\n\t/* Normalize the height of the line. Removing this will break consistent height\n\tamong text and text-less buttons (with icons). */\n\tline-height: 1;\n\n\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\tfont-size: inherit;\n\n\t/* Avoid flickering when the foucs border shows up. */\n\tborder: 1px solid transparent;\n\n\t/* Apply some smooth transition to the box-shadow and border. */\n\ttransition: box-shadow .2s ease-in-out, border .2s ease-in-out;\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/189 */\n\t-webkit-appearance: none;\n\n\t&:active,\n\t&:focus {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\n\t}\n\n\t/* Allow icon coloring using the text "color" property. */\n\t& .ck-button__icon {\n\t\t& use,\n\t\t& use * {\n\t\t\tcolor: inherit;\n\t\t}\n\t}\n\n\t& .ck-button__label {\n\t\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\t\tfont-size: inherit;\n\t\tfont-weight: inherit;\n\t\tcolor: inherit;\n\t\tcursor: inherit;\n\n\t\t/* Must be consistent with .ck-icon\'s vertical align. Otherwise, buttons with and\n\t\twithout labels (but with icons) have different sizes in Chrome */\n\t\tvertical-align: middle;\n\n\t\t@mixin ck-dir ltr {\n\t\t\ttext-align: left;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\ttext-align: right;\n\t\t}\n\t}\n\n\t& .ck-button__keystroke {\n\t\tcolor: inherit;\n\n\t\t@mixin ck-dir ltr {\n\t\t\tmargin-left: var(--ck-spacing-large);\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tmargin-right: var(--ck-spacing-large);\n\t\t}\n\n\t\tfont-weight: bold;\n\t\topacity: .7;\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/70 */\n\t&.ck-disabled {\n\t\t&:active,\n\t\t&:focus {\n\t\t\t/* The disabled button should have a slightly less visible shadow when focused. */\n\t\t\t@mixin ck-box-shadow var(--ck-focus-disabled-outer-shadow);\n\t\t}\n\n\t\t& .ck-button__icon {\n\t\t\t@mixin ck-disabled;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/98 */\n\t\t& .ck-button__label {\n\t\t\t@mixin ck-disabled;\n\t\t}\n\n\t\t& .ck-button__keystroke {\n\t\t\topacity: .3;\n\t\t}\n\t}\n\n\t&.ck-button_with-text {\n\t\tpadding: var(--ck-spacing-tiny) var(--ck-spacing-standard);\n\n\t\t/* stylelint-disable-next-line no-descending-specificity */\n\t\t& .ck-button__icon {\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: calc(-1 * var(--ck-spacing-small));\n\t\t\t\tmargin-right: var(--ck-spacing-small);\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-right: calc(-1 * var(--ck-spacing-small));\n\t\t\t\tmargin-left: var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\t}\n\n\t&.ck-button_with-keystroke {\n\t\t/* stylelint-disable-next-line no-descending-specificity */\n\t\t& .ck-button__label {\n\t\t\tflex-grow: 1;\n\t\t}\n\t}\n\n\t/* A style of the button which is currently on, e.g. its feature is active. */\n\t&.ck-on {\n\t\t@mixin ck-button-colors --ck-color-button-on;\n\t}\n\n\t&.ck-button-save {\n\t\tcolor: var(--ck-color-button-save);\n\t}\n\n\t&.ck-button-cancel {\n\t\tcolor: var(--ck-color-button-cancel);\n\t}\n}\n\n/* A style of the button which handles the primary action. */\n.ck.ck-button-action,\na.ck.ck-button-action {\n\t@mixin ck-button-colors --ck-color-button-action;\n\n\tcolor: var(--ck-color-button-action-text);\n}\n\n.ck.ck-button-bold,\na.ck.ck-button-bold {\n\tfont-weight: bold;\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements a button of given background color.\n *\n * @param {String} $background - Background color of the button.\n * @param {String} $border - Border color of the button.\n */\n@define-mixin ck-button-colors $prefix {\n\tbackground: var($(prefix)-background);\n\n\t&:not(.ck-disabled) {\n\t\t&:hover {\n\t\t\tbackground: var($(prefix)-hover-background);\n\t\t}\n\n\t\t&:active {\n\t\t\tbackground: var($(prefix)-active-background);\n\t\t\tbox-shadow: inset 0 2px 2px var($(prefix)-active-shadow);\n\t\t}\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/98 */\n\t&.ck-disabled {\n\t\tbackground: var($(prefix)-disabled-background);\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which indicates that an element holding it is disabled.\n */\n@define-mixin ck-disabled {\n\topacity: var(--ck-disabled-opacity);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-button.ck-switchbutton .ck-button__toggle,.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{display:block}:root{--ck-switch-button-toggle-width:2.6153846154em;--ck-switch-button-toggle-inner-size:1.0769230769em;--ck-switch-button-toggle-spacing:1px;--ck-switch-button-translation:calc(var(--ck-switch-button-toggle-width) - var(--ck-switch-button-toggle-inner-size) - var(--ck-switch-button-toggle-spacing)*2)}[dir=ltr] .ck.ck-button.ck-switchbutton .ck-button__label{margin-right:calc(var(--ck-spacing-large)*2)}[dir=rtl] .ck.ck-button.ck-switchbutton .ck-button__label{margin-left:calc(var(--ck-spacing-large)*2)}.ck.ck-button.ck-switchbutton .ck-button__toggle{border-radius:0}.ck-rounded-corners .ck.ck-button.ck-switchbutton .ck-button__toggle,.ck.ck-button.ck-switchbutton .ck-button__toggle.ck-rounded-corners{border-radius:var(--ck-border-radius)}[dir=ltr] .ck.ck-button.ck-switchbutton .ck-button__toggle{margin-left:auto}[dir=rtl] .ck.ck-button.ck-switchbutton .ck-button__toggle{margin-right:auto}.ck.ck-button.ck-switchbutton .ck-button__toggle{transition:background .4s ease;width:var(--ck-switch-button-toggle-width);background:var(--ck-color-switch-button-off-background)}.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{border-radius:0}.ck-rounded-corners .ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner,.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner.ck-rounded-corners{border-radius:var(--ck-border-radius);border-radius:calc(var(--ck-border-radius)*0.5)}.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{margin:var(--ck-switch-button-toggle-spacing);width:var(--ck-switch-button-toggle-inner-size);height:var(--ck-switch-button-toggle-inner-size);background:var(--ck-color-switch-button-inner-background);transition:all .3s ease}.ck.ck-button.ck-switchbutton .ck-button__toggle:hover{background:var(--ck-color-switch-button-off-hover-background)}.ck.ck-button.ck-switchbutton .ck-button__toggle:hover .ck-button__toggle__inner{box-shadow:0 0 0 5px var(--ck-color-switch-button-inner-shadow)}.ck.ck-button.ck-switchbutton.ck-disabled .ck-button__toggle{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle{background:var(--ck-color-switch-button-on-background)}.ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle:hover{background:var(--ck-color-switch-button-on-hover-background)}[dir=ltr] .ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle .ck-button__toggle__inner{transform:translateX(var(--ck-switch-button-translation))}[dir=rtl] .ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle .ck-button__toggle__inner{transform:translateX(calc(var(--ck-switch-button-translation)*-1))}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/button/switchbutton.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/button/switchbutton.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_disabled.css"],names:[],mappings:"AASE,4HACC,aACD,CCCF,MAEC,8CAA+C,CAE/C,mDAAoD,CACpD,qCAAsC,CACtC,gKAKD,CAGC,0DAGE,4CAOF,CAVA,0DAQE,2CAEF,CAEA,iDC3BA,eDoEA,CAzCA,yICvBC,qCDgED,CAzCA,2DAKE,gBAoCF,CAzCA,2DAUE,iBA+BF,CAzCA,iDAcC,8BAAiC,CAEjC,0CAA2C,CAC3C,uDAwBD,CAtBC,2EC9CD,eD2DC,CAbA,6LC1CA,qCAAsC,CD4CpC,+CAWF,CAbA,2EAMC,6CAA8C,CAC9C,+CAAgD,CAChD,gDAAiD,CACjD,yDAA0D,CAG1D,uBACD,CAEA,uDACC,6DAKD,CAHC,iFACC,+DACD,CAIF,6DExEA,kCF0EA,CAEA,uDACC,sDAkBD,CAhBC,6DACC,4DACD,CAEA,2FAKE,yDAMF,CAXA,2FASE,kEAEF",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-button.ck-switchbutton {\n\t& .ck-button__toggle {\n\t\tdisplay: block;\n\n\t\t& .ck-button__toggle__inner {\n\t\t\tdisplay: block;\n\t\t}\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_disabled.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n/* Note: To avoid rendering issues (aliasing) but to preserve the responsive nature\nof the component, floating–point numbers have been used which, for the default font size\n(see: --ck-font-size-base), will generate simple integers. */\n:root {\n\t/* 34px at 13px font-size */\n\t--ck-switch-button-toggle-width: 2.6153846154em;\n\t/* 14px at 13px font-size */\n\t--ck-switch-button-toggle-inner-size: 1.0769230769em;\n\t--ck-switch-button-toggle-spacing: 1px;\n\t--ck-switch-button-translation: calc(\n\t\tvar(--ck-switch-button-toggle-width) -\n\t\tvar(--ck-switch-button-toggle-inner-size) -\n\t\t2 * var(--ck-switch-button-toggle-spacing)\n\t);\n}\n\n.ck.ck-button.ck-switchbutton {\n\t& .ck-button__label {\n\t\t@mixin ck-dir ltr {\n\t\t\t/* Separate the label from the switch */\n\t\t\tmargin-right: calc(2 * var(--ck-spacing-large));\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\t/* Separate the label from the switch */\n\t\t\tmargin-left: calc(2 * var(--ck-spacing-large));\n\t\t}\n\t}\n\n\t& .ck-button__toggle {\n\t\t@mixin ck-rounded-corners;\n\n\t\t@mixin ck-dir ltr {\n\t\t\t/* Make sure the toggle is always to the right as far as possible. */\n\t\t\tmargin-left: auto;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\t/* Make sure the toggle is always to the left as far as possible. */\n\t\t\tmargin-right: auto;\n\t\t}\n\n\t\t/* Gently animate the background color of the toggle switch */\n\t\ttransition: background 400ms ease;\n\n\t\twidth: var(--ck-switch-button-toggle-width);\n\t\tbackground: var(--ck-color-switch-button-off-background);\n\n\t\t& .ck-button__toggle__inner {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-radius: calc(.5 * var(--ck-border-radius));\n\t\t\t}\n\n\t\t\t/* Leave some tiny bit of space around the inner part of the switch */\n\t\t\tmargin: var(--ck-switch-button-toggle-spacing);\n\t\t\twidth: var(--ck-switch-button-toggle-inner-size);\n\t\t\theight: var(--ck-switch-button-toggle-inner-size);\n\t\t\tbackground: var(--ck-color-switch-button-inner-background);\n\n\t\t\t/* Gently animate the inner part of the toggle switch */\n\t\t\ttransition: all 300ms ease;\n\t\t}\n\n\t\t&:hover {\n\t\t\tbackground: var(--ck-color-switch-button-off-hover-background);\n\n\t\t\t& .ck-button__toggle__inner {\n\t\t\t\tbox-shadow: 0 0 0 5px var(--ck-color-switch-button-inner-shadow);\n\t\t\t}\n\t\t}\n\t}\n\n\t&.ck-disabled .ck-button__toggle {\n\t\t@mixin ck-disabled;\n\t}\n\n\t&.ck-on .ck-button__toggle {\n\t\tbackground: var(--ck-color-switch-button-on-background);\n\n\t\t&:hover {\n\t\t\tbackground: var(--ck-color-switch-button-on-hover-background);\n\t\t}\n\n\t\t& .ck-button__toggle__inner {\n\t\t\t/*\n\t\t\t * Move the toggle switch to the right. It will be animated.\n\t\t\t */\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\ttransform: translateX( var( --ck-switch-button-translation ) );\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\ttransform: translateX( calc( -1 * var( --ck-switch-button-translation ) ) );\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which indicates that an element holding it is disabled.\n */\n@define-mixin ck-disabled {\n\topacity: var(--ck-disabled-opacity);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-color-grid{display:grid}:root{--ck-color-grid-tile-size:24px;--ck-color-color-grid-check-icon:#000}.ck.ck-color-grid{grid-gap:5px;padding:8px}.ck.ck-color-grid__tile{width:var(--ck-color-grid-tile-size);height:var(--ck-color-grid-tile-size);min-width:var(--ck-color-grid-tile-size);min-height:var(--ck-color-grid-tile-size);padding:0;transition:box-shadow .2s ease;border:0}.ck.ck-color-grid__tile.ck-disabled{cursor:unset;transition:unset}.ck.ck-color-grid__tile.ck-color-table__color-tile_bordered{box-shadow:0 0 0 1px var(--ck-color-base-border)}.ck.ck-color-grid__tile .ck.ck-icon{display:none;color:var(--ck-color-color-grid-check-icon)}.ck.ck-color-grid__tile.ck-on{box-shadow:inset 0 0 0 1px var(--ck-color-base-background),0 0 0 2px var(--ck-color-base-text)}.ck.ck-color-grid__tile.ck-on .ck.ck-icon{display:block}.ck.ck-color-grid__tile.ck-on,.ck.ck-color-grid__tile:focus:not(.ck-disabled),.ck.ck-color-grid__tile:hover:not(.ck-disabled){border:0}.ck.ck-color-grid__tile:focus:not(.ck-disabled),.ck.ck-color-grid__tile:hover:not(.ck-disabled){box-shadow:inset 0 0 0 1px var(--ck-color-base-background),0 0 0 2px var(--ck-color-focus-border)}.ck.ck-color-grid__label{padding:0 var(--ck-spacing-standard)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/colorgrid/colorgrid.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/colorgrid/colorgrid.css"],names:[],mappings:"AAKA,kBACC,YACD,CCAA,MACC,8BAA+B,CAK/B,qCACD,CAEA,kBACC,YAAa,CACb,WACD,CAEA,wBACC,oCAAqC,CACrC,qCAAsC,CACtC,wCAAyC,CACzC,yCAA0C,CAC1C,SAAU,CACV,8BAA+B,CAC/B,QAmCD,CAjCC,oCACC,YAAa,CACb,gBACD,CAEA,4DACC,gDACD,CAEA,oCACC,YAAa,CACb,2CACD,CAEA,8BACC,8FAKD,CAHC,0CACC,aACD,CAGD,8HAIC,QACD,CAEA,gGAEC,iGACD,CAGD,yBACC,oCACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-color-grid {\n\tdisplay: grid;\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n:root {\n\t--ck-color-grid-tile-size: 24px;\n\n\t/* Not using global colors here because these may change but some colors in a pallette\n\t * require special treatment. For instance, this ensures no matter what the UI text color is,\n\t * the check icon will look good on the black color tile. */\n\t--ck-color-color-grid-check-icon: hsl(0, 0%, 0%);\n}\n\n.ck.ck-color-grid {\n\tgrid-gap: 5px;\n\tpadding: 8px;\n}\n\n.ck.ck-color-grid__tile {\n\twidth: var(--ck-color-grid-tile-size);\n\theight: var(--ck-color-grid-tile-size);\n\tmin-width: var(--ck-color-grid-tile-size);\n\tmin-height: var(--ck-color-grid-tile-size);\n\tpadding: 0;\n\ttransition: .2s ease box-shadow;\n\tborder: 0;\n\n\t&.ck-disabled {\n\t\tcursor: unset;\n\t\ttransition: unset;\n\t}\n\n\t&.ck-color-table__color-tile_bordered {\n\t\tbox-shadow: 0 0 0 1px var(--ck-color-base-border);\n\t}\n\n\t& .ck.ck-icon {\n\t\tdisplay: none;\n\t\tcolor: var(--ck-color-color-grid-check-icon);\n\t}\n\n\t&.ck-on {\n\t\tbox-shadow: inset 0 0 0 1px var(--ck-color-base-background), 0 0 0 2px var(--ck-color-base-text);\n\n\t\t& .ck.ck-icon {\n\t\t\tdisplay: block;\n\t\t}\n\t}\n\n\t&.ck-on,\n\t&:focus:not( .ck-disabled ),\n\t&:hover:not( .ck-disabled ) {\n\t\t/* Disable the default .ck-button\'s border ring. */\n\t\tborder: 0;\n\t}\n\n\t&:focus:not( .ck-disabled ),\n\t&:hover:not( .ck-disabled ) {\n\t\tbox-shadow: inset 0 0 0 1px var(--ck-color-base-background), 0 0 0 2px var(--ck-color-focus-border);\n\t}\n}\n\n.ck.ck-color-grid__label {\n\tpadding: 0 var(--ck-spacing-standard);\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-splitbutton{font-size:inherit}.ck.ck-splitbutton .ck-splitbutton__action:focus{z-index:calc(var(--ck-z-default) + 1)}.ck.ck-splitbutton.ck-splitbutton_open>.ck-button .ck-tooltip{display:none}:root{--ck-color-split-button-hover-background:#ebebeb;--ck-color-split-button-hover-border:#b3b3b3}[dir=ltr] .ck.ck-splitbutton>.ck-splitbutton__action{border-top-right-radius:unset;border-bottom-right-radius:unset}[dir=rtl] .ck.ck-splitbutton>.ck-splitbutton__action{border-top-left-radius:unset;border-bottom-left-radius:unset}.ck.ck-splitbutton>.ck-splitbutton__arrow{min-width:unset}[dir=ltr] .ck.ck-splitbutton>.ck-splitbutton__arrow{border-radius:0}.ck-rounded-corners [dir=ltr] .ck.ck-splitbutton>.ck-splitbutton__arrow,[dir=ltr] .ck.ck-splitbutton>.ck-splitbutton__arrow.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:unset;border-bottom-left-radius:unset}[dir=rtl] .ck.ck-splitbutton>.ck-splitbutton__arrow{border-top-right-radius:unset;border-bottom-right-radius:unset}.ck.ck-splitbutton>.ck-splitbutton__arrow svg{width:var(--ck-dropdown-arrow-size)}.ck.ck-splitbutton.ck-splitbutton_open>.ck-button:not(.ck-on):not(.ck-disabled):not(:hover),.ck.ck-splitbutton:hover>.ck-button:not(.ck-on):not(.ck-disabled):not(:hover){background:var(--ck-color-split-button-hover-background)}[dir=ltr] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled),[dir=ltr] .ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled){border-left-color:var(--ck-color-split-button-hover-border)}[dir=rtl] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled),[dir=rtl] .ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled){border-right-color:var(--ck-color-split-button-hover-border)}.ck.ck-splitbutton.ck-splitbutton_open{border-radius:0}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__action,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners>.ck-splitbutton__action{border-bottom-left-radius:0}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners>.ck-splitbutton__arrow{border-bottom-right-radius:0}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/splitbutton.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/mixins/_tooltip.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/splitbutton.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,mBAEC,iBAUD,CARC,iDACC,qCACD,CC0BA,8DACC,YACD,CClCD,MACC,gDAAyD,CACzD,4CACD,CAMC,qDAGE,6BAA8B,CAC9B,gCAQF,CAZA,qDASE,4BAA6B,CAC7B,+BAEF,CAEA,0CAGC,eAmBD,CAtBA,oDCnBA,eDyCA,CAtBA,+ICfC,qCAAsC,CDuBpC,4BAA6B,CAC7B,+BAaH,CAtBA,oDAeE,6BAA8B,CAC9B,gCAMF,CAHC,8CACC,mCACD,CASA,0KACC,wDACD,CAGC,sKACC,2DACD,CAIA,sKACC,4DACD,CAMF,uCCpEA,eD8EA,CAVA,qHChEC,qCD0ED,CARE,qKACC,2BACD,CAEA,mKACC,4BACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../tooltip/mixins/_tooltip.css";\n\n.ck.ck-splitbutton {\n\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\tfont-size: inherit;\n\n\t& .ck-splitbutton__action:focus {\n\t\tz-index: calc(var(--ck-z-default) + 1);\n\t}\n\n\t/* Disable tooltips for the buttons when the button is "open" */\n\t&.ck-splitbutton_open > .ck-button {\n\t\t@mixin ck-tooltip_disabled;\n\t}\n}\n\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Enables the tooltip, which is the tooltip is in DOM but\n * not yet displayed.\n */\n@define-mixin ck-tooltip_enabled {\n\t& .ck-tooltip {\n\t\tdisplay: block;\n\n\t\t/*\n\t\t * Don't display tooltips in devices which don't support :hover.\n\t\t * In fact, it's all about iOS, which forces user to click UI elements twice to execute\n\t\t * the primary action, when tooltips are enabled.\n\t\t *\n\t\t * Q: OK, but why not the following query?\n\t\t *\n\t\t * @media (hover) {\n\t\t * display: block;\n\t\t * }\n\t\t *\n\t\t * A: Because FF does not support it and it would completely disable tooltips\n\t\t * in that browser.\n\t\t *\n\t\t * More in https://github.com/ckeditor/ckeditor5/issues/920.\n\t\t */\n\t\t@media (hover:none) {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n/**\n * Disables the tooltip making it disappear from DOM.\n */\n@define-mixin ck-tooltip_disabled {\n\t& .ck-tooltip {\n\t\tdisplay: none;\n\t}\n}\n\n/**\n * Shows the tooltip, which is already in DOM.\n * Requires `ck-tooltip_enabled` first.\n */\n@define-mixin ck-tooltip_visible {\n\t& .ck-tooltip {\n\t\tvisibility: visible;\n\t\topacity: 1;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n:root {\n\t--ck-color-split-button-hover-background: hsl(0, 0%, 92%);\n\t--ck-color-split-button-hover-border: hsl(0, 0%, 70%);\n}\n\n.ck.ck-splitbutton {\n\t/*\n\t * Note: ck-rounded and ck-dir mixins don\'t go together (because they both use @nest).\n\t */\n\t& > .ck-splitbutton__action {\n\t\t@nest [dir="ltr"] & {\n\t\t\t/* Don\'t round the action button on the right side */\n\t\t\tborder-top-right-radius: unset;\n\t\t\tborder-bottom-right-radius: unset;\n\t\t}\n\n\t\t@nest [dir="rtl"] & {\n\t\t\t/* Don\'t round the action button on the left side */\n\t\t\tborder-top-left-radius: unset;\n\t\t\tborder-bottom-left-radius: unset;\n\t\t}\n\t}\n\n\t& > .ck-splitbutton__arrow {\n\t\t/* It\'s a text-less button and since the icon is positioned absolutely in such situation,\n\t\tit must get some arbitrary min-width. */\n\t\tmin-width: unset;\n\n\t\t@nest [dir="ltr"] & {\n\t\t\t/* Don\'t round the arrow button on the left side */\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-top-left-radius: unset;\n\t\t\t\tborder-bottom-left-radius: unset;\n\t\t\t}\n\t\t}\n\n\t\t@nest [dir="rtl"] & {\n\t\t\t/* Don\'t round the arrow button on the right side */\n\t\t\tborder-top-right-radius: unset;\n\t\t\tborder-bottom-right-radius: unset;\n\t\t}\n\n\t\t& svg {\n\t\t\twidth: var(--ck-dropdown-arrow-size);\n\t\t}\n\t}\n\n\t/* When the split button is "open" (the arrow is on) or being hovered, it should get some styling\n\tas a whole. The background of both buttons should stand out and there should be a visual\n\tseparation between both buttons. */\n\t&.ck-splitbutton_open,\n\t&:hover {\n\t\t/* When the split button hovered as a whole, not as individual buttons. */\n\t\t& > .ck-button:not(.ck-on):not(.ck-disabled):not(:hover) {\n\t\t\tbackground: var(--ck-color-split-button-hover-background);\n\t\t}\n\n\t\t@nest [dir="ltr"] & {\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled) {\n\t\t\t\tborder-left-color: var(--ck-color-split-button-hover-border);\n\t\t\t}\n\t\t}\n\n\t\t@nest [dir="rtl"] & {\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled) {\n\t\t\t\tborder-right-color: var(--ck-color-split-button-hover-border);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Don\'t round the bottom left and right corners of the buttons when "open"\n\thttps://github.com/ckeditor/ckeditor5/issues/816 */\n\t&.ck-splitbutton_open {\n\t\t@mixin ck-rounded-corners {\n\t\t\t& > .ck-splitbutton__action {\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t}\n\n\t\t\t& > .ck-splitbutton__arrow {\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,":root{--ck-dropdown-max-width:75vw}.ck.ck-dropdown{display:inline-block;position:relative}.ck.ck-dropdown .ck-dropdown__arrow{pointer-events:none;z-index:var(--ck-z-default)}.ck.ck-dropdown .ck-button.ck-dropdown__button{width:100%}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on .ck-tooltip{display:none}.ck.ck-dropdown .ck-dropdown__panel{-webkit-backface-visibility:hidden;display:none;z-index:var(--ck-z-modal);max-width:var(--ck-dropdown-max-width);position:absolute}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel-visible{display:inline-block}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_n,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_ne,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nmw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nw{bottom:100%}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_s,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_smw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sw{top:100%;bottom:auto}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_ne,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se{left:0}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sw{right:0}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_n,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_s{left:50%;transform:translateX(-50%)}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nmw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_smw{left:75%;transform:translateX(-75%)}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sme{left:25%;transform:translateX(-25%)}.ck.ck-toolbar .ck-dropdown__panel{z-index:calc(var(--ck-z-modal) + 1)}:root{--ck-dropdown-arrow-size:calc(var(--ck-icon-size)*0.5)}.ck.ck-dropdown{font-size:inherit}.ck.ck-dropdown .ck-dropdown__arrow{width:var(--ck-dropdown-arrow-size)}[dir=ltr] .ck.ck-dropdown .ck-dropdown__arrow{right:var(--ck-spacing-standard);margin-left:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-dropdown .ck-dropdown__arrow{left:var(--ck-spacing-standard);margin-right:var(--ck-spacing-small)}.ck.ck-dropdown.ck-disabled .ck-dropdown__arrow{opacity:var(--ck-disabled-opacity)}[dir=ltr] .ck.ck-dropdown .ck-button.ck-dropdown__button:not(.ck-button_with-text){padding-left:var(--ck-spacing-small)}[dir=rtl] .ck.ck-dropdown .ck-button.ck-dropdown__button:not(.ck-button_with-text){padding-right:var(--ck-spacing-small)}.ck.ck-dropdown .ck-button.ck-dropdown__button .ck-button__label{width:7em;overflow:hidden;text-overflow:ellipsis}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-disabled .ck-button__label{opacity:var(--ck-disabled-opacity)}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on{border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-dropdown__button_label-width_auto .ck-button__label{width:auto}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-off:active,.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on:active{box-shadow:none}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-off:active:focus,.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on:active:focus{box-shadow:var(--ck-focus-outer-shadow),0 0}.ck.ck-dropdown__panel{border-radius:0}.ck-rounded-corners .ck.ck-dropdown__panel,.ck.ck-dropdown__panel.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-dropdown__panel{box-shadow:var(--ck-drop-shadow),0 0;background:var(--ck-color-dropdown-panel-background);border:1px solid var(--ck-color-dropdown-panel-border);bottom:0;min-width:100%}.ck.ck-dropdown__panel.ck-dropdown__panel_se{border-top-left-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_sw{border-top-right-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_ne{border-bottom-left-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_nw{border-bottom-right-radius:0}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/dropdown.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/mixins/_tooltip.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/dropdown.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_disabled.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,MACC,4BACD,CAEA,gBACC,oBAAqB,CACrB,iBAqFD,CAnFC,oCACC,mBAAoB,CACpB,2BACD,CAGA,+CACC,UAOD,CCUA,iEACC,YACD,CDVA,oCAGC,kCAAmC,CAEnC,YAAa,CACb,yBAA0B,CAC1B,sCAAuC,CAEvC,iBAyDD,CAvDC,+DACC,oBACD,CAEA,mSAKC,WACD,CAEA,mSASC,QAAS,CACT,WACD,CAEA,oHAEC,MACD,CAEA,oHAEC,OACD,CAEA,kHAGC,QAAS,CACT,0BACD,CAEA,sHAGC,QAAS,CACT,0BACD,CAEA,sHAGC,QAAS,CACT,0BACD,CAQF,mCACC,mCACD,CEhGA,MACC,sDACD,CAEA,gBAEC,iBA2ED,CAzEC,oCACC,mCACD,CAGC,8CACC,gCAAiC,CAGjC,sCACD,CAIA,8CACC,+BAAgC,CAGhC,oCACD,CAGD,gDC/BA,kCDiCA,CAIE,mFAEC,oCACD,CAIA,mFAEC,qCACD,CAID,iEACC,SAAU,CACV,eAAgB,CAChB,sBACD,CAGA,6EC1DD,kCD4DC,CAGA,qDACC,2BAA4B,CAC5B,4BACD,CAEA,sGACC,UACD,CAGA,yHAEC,eAKD,CAHC,qIE7EF,2CF+EE,CAKH,uBGlFC,eH8GD,CA5BA,qFG9EE,qCH0GF,CA5BA,uBEpFC,oCAA8B,CFwF9B,oDAAqD,CACrD,sDAAuD,CACvD,QAAS,CAGT,cAmBD,CAfC,6CACC,wBACD,CAEA,6CACC,yBACD,CAEA,6CACC,2BACD,CAEA,6CACC,4BACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import \"../tooltip/mixins/_tooltip.css\";\n\n:root {\n\t--ck-dropdown-max-width: 75vw;\n}\n\n.ck.ck-dropdown {\n\tdisplay: inline-block;\n\tposition: relative;\n\n\t& .ck-dropdown__arrow {\n\t\tpointer-events: none;\n\t\tz-index: var(--ck-z-default);\n\t}\n\n\t/* Dropdown button should span horizontally, e.g. in vertical toolbars */\n\t& .ck-button.ck-dropdown__button {\n\t\twidth: 100%;\n\n\t\t/* Disable main button's tooltip when the dropdown is open. Otherwise the panel may\n\t\tpartially cover the tooltip */\n\t\t&.ck-on {\n\t\t\t@mixin ck-tooltip_disabled;\n\t\t}\n\t}\n\n\t& .ck-dropdown__panel {\n\t\t/* This is to get rid of flickering when the tooltip is shown under the panel,\n\t\twhich looks like the panel moves vertically a pixel down and up. */\n\t\t-webkit-backface-visibility: hidden;\n\n\t\tdisplay: none;\n\t\tz-index: var(--ck-z-modal);\n\t\tmax-width: var(--ck-dropdown-max-width);\n\n\t\tposition: absolute;\n\n\t\t&.ck-dropdown__panel-visible {\n\t\t\tdisplay: inline-block;\n\t\t}\n\n\t\t&.ck-dropdown__panel_ne,\n\t\t&.ck-dropdown__panel_nw,\n\t\t&.ck-dropdown__panel_n,\n\t\t&.ck-dropdown__panel_nmw,\n\t\t&.ck-dropdown__panel_nme {\n\t\t\tbottom: 100%;\n\t\t}\n\n\t\t&.ck-dropdown__panel_se,\n\t\t&.ck-dropdown__panel_sw,\n\t\t&.ck-dropdown__panel_smw,\n\t\t&.ck-dropdown__panel_sme,\n\t\t&.ck-dropdown__panel_s {\n\t\t\t/*\n\t\t\t * Using transform: translate3d( 0, 100%, 0 ) causes blurry dropdown on Chrome 67-78+ on non-retina displays.\n\t\t\t * See https://github.com/ckeditor/ckeditor5/issues/1053.\n\t\t\t */\n\t\t\ttop: 100%;\n\t\t\tbottom: auto;\n\t\t}\n\n\t\t&.ck-dropdown__panel_ne,\n\t\t&.ck-dropdown__panel_se {\n\t\t\tleft: 0px;\n\t\t}\n\n\t\t&.ck-dropdown__panel_nw,\n\t\t&.ck-dropdown__panel_sw {\n\t\t\tright: 0px;\n\t\t}\n\n\t\t&.ck-dropdown__panel_s,\n\t\t&.ck-dropdown__panel_n {\n\t\t\t/* Positioning panels relative to the center of the button */\n\t\t\tleft: 50%;\n\t\t\ttransform: translateX(-50%);\n\t\t}\n\n\t\t&.ck-dropdown__panel_nmw,\n\t\t&.ck-dropdown__panel_smw {\n\t\t\t/* Positioning panels relative to the middle-west of the button */\n\t\t\tleft: 75%;\n\t\t\ttransform: translateX(-75%);\n\t\t}\n\n\t\t&.ck-dropdown__panel_nme,\n\t\t&.ck-dropdown__panel_sme {\n\t\t\t/* Positioning panels relative to the middle-east of the button */\n\t\t\tleft: 25%;\n\t\t\ttransform: translateX(-25%);\n\t\t}\n\t}\n}\n\n/*\n * Toolbar dropdown panels should be always above the UI (eg. other dropdown panels) from the editor's content.\n * See https://github.com/ckeditor/ckeditor5/issues/7874\n */\n.ck.ck-toolbar .ck-dropdown__panel {\n\tz-index: calc( var(--ck-z-modal) + 1 );\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Enables the tooltip, which is the tooltip is in DOM but\n * not yet displayed.\n */\n@define-mixin ck-tooltip_enabled {\n\t& .ck-tooltip {\n\t\tdisplay: block;\n\n\t\t/*\n\t\t * Don't display tooltips in devices which don't support :hover.\n\t\t * In fact, it's all about iOS, which forces user to click UI elements twice to execute\n\t\t * the primary action, when tooltips are enabled.\n\t\t *\n\t\t * Q: OK, but why not the following query?\n\t\t *\n\t\t * @media (hover) {\n\t\t * display: block;\n\t\t * }\n\t\t *\n\t\t * A: Because FF does not support it and it would completely disable tooltips\n\t\t * in that browser.\n\t\t *\n\t\t * More in https://github.com/ckeditor/ckeditor5/issues/920.\n\t\t */\n\t\t@media (hover:none) {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n/**\n * Disables the tooltip making it disappear from DOM.\n */\n@define-mixin ck-tooltip_disabled {\n\t& .ck-tooltip {\n\t\tdisplay: none;\n\t}\n}\n\n/**\n * Shows the tooltip, which is already in DOM.\n * Requires `ck-tooltip_enabled` first.\n */\n@define-mixin ck-tooltip_visible {\n\t& .ck-tooltip {\n\t\tvisibility: visible;\n\t\topacity: 1;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_shadow.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n:root {\n\t--ck-dropdown-arrow-size: calc(0.5 * var(--ck-icon-size));\n}\n\n.ck.ck-dropdown {\n\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\tfont-size: inherit;\n\n\t& .ck-dropdown__arrow {\n\t\twidth: var(--ck-dropdown-arrow-size);\n\t}\n\n\t@mixin ck-dir ltr {\n\t\t& .ck-dropdown__arrow {\n\t\t\tright: var(--ck-spacing-standard);\n\n\t\t\t/* A space to accommodate the triangle. */\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-dir rtl {\n\t\t& .ck-dropdown__arrow {\n\t\t\tleft: var(--ck-spacing-standard);\n\n\t\t\t/* A space to accommodate the triangle. */\n\t\t\tmargin-right: var(--ck-spacing-small);\n\t\t}\n\t}\n\n\t&.ck-disabled .ck-dropdown__arrow {\n\t\t@mixin ck-disabled;\n\t}\n\n\t& .ck-button.ck-dropdown__button {\n\t\t@mixin ck-dir ltr {\n\t\t\t&:not(.ck-button_with-text) {\n\t\t\t\t/* Make sure dropdowns with just an icon have the right inner spacing */\n\t\t\t\tpadding-left: var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\t&:not(.ck-button_with-text) {\n\t\t\t\t/* Make sure dropdowns with just an icon have the right inner spacing */\n\t\t\t\tpadding-right: var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\n\t\t/* #23 */\n\t\t& .ck-button__label {\n\t\t\twidth: 7em;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/70 */\n\t\t&.ck-disabled .ck-button__label {\n\t\t\t@mixin ck-disabled;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5/issues/816 */\n\t\t&.ck-on {\n\t\t\tborder-bottom-left-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\n\t\t&.ck-dropdown__button_label-width_auto .ck-button__label {\n\t\t\twidth: auto;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5/issues/8699 */\n\t\t&.ck-off:active,\n\t\t&.ck-on:active {\n\t\t\tbox-shadow: none;\n\t\t\t\n\t\t\t&:focus {\n\t\t\t\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\n\t\t\t}\n\t\t}\n\t}\n}\n\n.ck.ck-dropdown__panel {\n\t@mixin ck-rounded-corners;\n\t@mixin ck-drop-shadow;\n\n\tbackground: var(--ck-color-dropdown-panel-background);\n\tborder: 1px solid var(--ck-color-dropdown-panel-border);\n\tbottom: 0;\n\n\t/* Make sure the panel is at least as wide as the drop-down\'s button. */\n\tmin-width: 100%;\n\n\t/* Disabled corner border radius to be consistent with the .dropdown__button\n\thttps://github.com/ckeditor/ckeditor5/issues/816 */\n\t&.ck-dropdown__panel_se {\n\t\tborder-top-left-radius: 0;\n\t}\n\n\t&.ck-dropdown__panel_sw {\n\t\tborder-top-right-radius: 0;\n\t}\n\n\t&.ck-dropdown__panel_ne {\n\t\tborder-bottom-left-radius: 0;\n\t}\n\n\t&.ck-dropdown__panel_nw {\n\t\tborder-bottom-right-radius: 0;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which indicates that an element holding it is disabled.\n */\n@define-mixin ck-disabled {\n\topacity: var(--ck-disabled-opacity);\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-toolbar{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-flow:row nowrap;align-items:center}.ck.ck-toolbar>.ck-toolbar__items{display:flex;flex-flow:row wrap;align-items:center;flex-grow:1}.ck.ck-toolbar .ck.ck-toolbar__separator{display:inline-block}.ck.ck-toolbar .ck.ck-toolbar__separator:first-child,.ck.ck-toolbar .ck.ck-toolbar__separator:last-child{display:none}.ck.ck-toolbar .ck-toolbar__line-break{flex-basis:100%}.ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items{flex-wrap:nowrap}.ck.ck-toolbar.ck-toolbar_vertical>.ck-toolbar__items{flex-direction:column}.ck.ck-toolbar.ck-toolbar_floating>.ck-toolbar__items{flex-wrap:nowrap}.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown>.ck-dropdown__button .ck-dropdown__arrow{display:none}.ck.ck-toolbar{border-radius:0}.ck-rounded-corners .ck.ck-toolbar,.ck.ck-toolbar.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-toolbar{background:var(--ck-color-toolbar-background);padding:0 var(--ck-spacing-small);border:1px solid var(--ck-color-toolbar-border)}.ck.ck-toolbar .ck.ck-toolbar__separator{align-self:stretch;width:1px;min-width:1px;background:var(--ck-color-toolbar-border);margin-top:var(--ck-spacing-small);margin-bottom:var(--ck-spacing-small)}.ck.ck-toolbar .ck-toolbar__line-break{height:0}.ck.ck-toolbar>.ck-toolbar__items>:not(.ck-toolbar__line-break){margin-right:var(--ck-spacing-small)}.ck.ck-toolbar>.ck-toolbar__items:empty+.ck.ck-toolbar__separator{display:none}.ck.ck-toolbar>.ck-toolbar__items>:not(.ck-toolbar__line-break),.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown{margin-top:var(--ck-spacing-small);margin-bottom:var(--ck-spacing-small)}.ck.ck-toolbar.ck-toolbar_vertical{padding:0}.ck.ck-toolbar.ck-toolbar_vertical>.ck-toolbar__items>.ck{width:100%;margin:0;border-radius:0;border:0}.ck.ck-toolbar.ck-toolbar_compact{padding:0}.ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>*{margin:0}.ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>:not(:first-child):not(:last-child){border-radius:0}.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown>.ck.ck-button.ck-dropdown__button{padding-left:var(--ck-spacing-tiny)}.ck-toolbar-container .ck.ck-toolbar{border:0}.ck.ck-toolbar[dir=rtl]>.ck-toolbar__items>.ck,[dir=rtl] .ck.ck-toolbar>.ck-toolbar__items>.ck{margin-right:0}.ck.ck-toolbar[dir=rtl]:not(.ck-toolbar_compact)>.ck-toolbar__items>.ck,[dir=rtl] .ck.ck-toolbar:not(.ck-toolbar_compact)>.ck-toolbar__items>.ck{margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=rtl]>.ck-toolbar__items>.ck:last-child,[dir=rtl] .ck.ck-toolbar>.ck-toolbar__items>.ck:last-child{margin-left:0}.ck.ck-toolbar[dir=rtl].ck-toolbar_compact>.ck-toolbar__items>.ck:first-child,[dir=rtl] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.ck.ck-toolbar[dir=rtl].ck-toolbar_compact>.ck-toolbar__items>.ck:last-child,[dir=rtl] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:last-child{border-top-right-radius:0;border-bottom-right-radius:0}.ck.ck-toolbar[dir=rtl]>.ck.ck-toolbar__separator,[dir=rtl] .ck.ck-toolbar>.ck.ck-toolbar__separator{margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=rtl].ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child),[dir=rtl] .ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child){margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=ltr]>.ck-toolbar__items>.ck:last-child,[dir=ltr] .ck.ck-toolbar>.ck-toolbar__items>.ck:last-child{margin-right:0}.ck.ck-toolbar[dir=ltr].ck-toolbar_compact>.ck-toolbar__items>.ck:first-child,[dir=ltr] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.ck.ck-toolbar[dir=ltr].ck-toolbar_compact>.ck-toolbar__items>.ck:last-child,[dir=ltr] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.ck.ck-toolbar[dir=ltr]>.ck.ck-toolbar__separator,[dir=ltr] .ck.ck-toolbar>.ck.ck-toolbar__separator{margin-right:var(--ck-spacing-small)}.ck.ck-toolbar[dir=ltr].ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child),[dir=ltr] .ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child){margin-right:var(--ck-spacing-small)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/toolbar.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/toolbar/toolbar.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,eCEC,qBAAsB,CACtB,wBAAyB,CACzB,oBAAqB,CACrB,gBAAgB,CDFhB,YAAa,CACb,oBAAqB,CACrB,kBA6CD,CA3CC,kCACC,YAAa,CACb,kBAAmB,CACnB,kBAAmB,CACnB,WAED,CAEA,yCACC,oBAWD,CAJC,yGAEC,YACD,CAGD,uCACC,eACD,CAEA,sDACC,gBACD,CAEA,sDACC,qBACD,CAEA,sDACC,gBACD,CAGC,yFACC,YACD,CE/CF,eCGC,eD0FD,CA7FA,qECOE,qCDsFF,CA7FA,eAGC,6CAA8C,CAC9C,iCAAkC,CAClC,+CAwFD,CAtFC,yCACC,kBAAmB,CACnB,SAAU,CACV,aAAc,CACd,yCAA0C,CAM1C,kCAAmC,CACnC,qCACD,CAEA,uCACC,QACD,CAGC,gEAEC,oCACD,CAIA,kEACC,YACD,CAGD,gHAGC,kCAAmC,CACnC,qCACD,CAEA,mCAEC,SAgBD,CAbC,0DAEC,UAAW,CAGX,QAAS,CAGT,eAAgB,CAGhB,QACD,CAGD,kCAEC,SAWD,CATC,uDAEC,QAMD,CAHC,yFACC,eACD,CASD,kFACC,mCACD,CAvFF,qCA2FE,QAEF,CAYC,+FACC,cACD,CAEA,iJAEC,mCACD,CAEA,qHACC,aACD,CAIC,6JACC,wBAAyB,CACzB,2BACD,CAGA,2JACC,yBAA0B,CAC1B,4BACD,CAID,qGACC,mCACD,CAGA,yLACC,mCACD,CAWA,qHACC,cACD,CAIC,6JACC,yBAA0B,CAC1B,4BACD,CAGA,2JACC,wBAAyB,CACzB,2BACD,CAID,qGACC,oCACD,CAGA,yLACC,oCACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../mixins/_unselectable.css";\n\n.ck.ck-toolbar {\n\t@mixin ck-unselectable;\n\n\tdisplay: flex;\n\tflex-flow: row nowrap;\n\talign-items: center;\n\n\t& > .ck-toolbar__items {\n\t\tdisplay: flex;\n\t\tflex-flow: row wrap;\n\t\talign-items: center;\n\t\tflex-grow: 1;\n\n\t}\n\n\t& .ck.ck-toolbar__separator {\n\t\tdisplay: inline-block;\n\n\t\t/*\n\t\t * A leading or trailing separator makes no sense (separates from nothing on one side).\n\t\t * For instance, it can happen when toolbar items (also separators) are getting grouped one by one and\n\t\t * moved to another toolbar in the dropdown.\n\t\t */\n\t\t&:first-child,\n\t\t&:last-child {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t& .ck-toolbar__line-break {\n\t\tflex-basis: 100%;\n\t}\n\n\t&.ck-toolbar_grouping > .ck-toolbar__items {\n\t\tflex-wrap: nowrap;\n\t}\n\n\t&.ck-toolbar_vertical > .ck-toolbar__items {\n\t\tflex-direction: column;\n\t}\n\n\t&.ck-toolbar_floating > .ck-toolbar__items {\n\t\tflex-wrap: nowrap;\n\t}\n\n\t& > .ck.ck-toolbar__grouped-dropdown {\n\t\t& > .ck-dropdown__button .ck-dropdown__arrow {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Makes element unselectable.\n */\n@define-mixin ck-unselectable {\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-toolbar {\n\t@mixin ck-rounded-corners;\n\n\tbackground: var(--ck-color-toolbar-background);\n\tpadding: 0 var(--ck-spacing-small);\n\tborder: 1px solid var(--ck-color-toolbar-border);\n\n\t& .ck.ck-toolbar__separator {\n\t\talign-self: stretch;\n\t\twidth: 1px;\n\t\tmin-width: 1px;\n\t\tbackground: var(--ck-color-toolbar-border);\n\n\t\t/*\n\t\t * These margins make the separators look better in balloon toolbars (when aligned with the "tip").\n\t\t * See https://github.com/ckeditor/ckeditor5/issues/7493.\n\t\t */\n\t\tmargin-top: var(--ck-spacing-small);\n\t\tmargin-bottom: var(--ck-spacing-small);\n\t}\n\n\t& .ck-toolbar__line-break {\n\t\theight: 0;\n\t}\n\n\t& > .ck-toolbar__items {\n\t\t& > *:not(.ck-toolbar__line-break) {\n\t\t\t/* (#11) Separate toolbar items. */\n\t\t\tmargin-right: var(--ck-spacing-small);\n\t\t}\n\n\t\t/* Don\'t display a separator after an empty items container, for instance,\n\t\twhen all items were grouped */\n\t\t&:empty + .ck.ck-toolbar__separator {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t& > .ck-toolbar__items > *:not(.ck-toolbar__line-break),\n\t& > .ck.ck-toolbar__grouped-dropdown {\n\t\t/* Make sure items wrapped to the next line have v-spacing */\n\t\tmargin-top: var(--ck-spacing-small);\n\t\tmargin-bottom: var(--ck-spacing-small);\n\t}\n\n\t&.ck-toolbar_vertical {\n\t\t/* Items in a vertical toolbar span the entire width. */\n\t\tpadding: 0;\n\n\t\t/* Specificity matters here. See https://github.com/ckeditor/ckeditor5-theme-lark/issues/168. */\n\t\t& > .ck-toolbar__items > .ck {\n\t\t\t/* Items in a vertical toolbar should span the horizontal space. */\n\t\t\twidth: 100%;\n\n\t\t\t/* Items in a vertical toolbar should have no margin. */\n\t\t\tmargin: 0;\n\n\t\t\t/* Items in a vertical toolbar span the entire width so rounded corners are pointless. */\n\t\t\tborder-radius: 0;\n\n\t\t\t/* Items in a vertical toolbar span the entire width so any border is pointless. */\n\t\t\tborder: 0;\n\t\t}\n\t}\n\n\t&.ck-toolbar_compact {\n\t\t/* No spacing around items. */\n\t\tpadding: 0;\n\n\t\t& > .ck-toolbar__items > * {\n\t\t\t/* Compact toolbar items have no spacing between them. */\n\t\t\tmargin: 0;\n\n\t\t\t/* "Middle" children should have no rounded corners. */\n\t\t\t&:not(:first-child):not(:last-child) {\n\t\t\t\tborder-radius: 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t& > .ck.ck-toolbar__grouped-dropdown {\n\t\t/*\n\t\t * Dropdown button has asymmetric padding to fit the arrow.\n\t\t * This button has no arrow so let\'s revert that padding back to normal.\n\t\t */\n\t\t& > .ck.ck-button.ck-dropdown__button {\n\t\t\tpadding-left: var(--ck-spacing-tiny);\n\t\t}\n\t}\n\n\t@nest .ck-toolbar-container & {\n\t\tborder: 0;\n\t}\n}\n\n/* stylelint-disable */\n\n/*\n * Styles for RTL toolbars.\n *\n * Note: In some cases (e.g. a decoupled editor), the toolbar has its own "dir"\n * because its parent is not controlled by the editor framework.\n */\n[dir="rtl"] .ck.ck-toolbar,\n.ck.ck-toolbar[dir="rtl"] {\n\t& > .ck-toolbar__items > .ck {\n\t\tmargin-right: 0;\n\t}\n\n\t&:not(.ck-toolbar_compact) > .ck-toolbar__items > .ck {\n\t\t/* (#11) Separate toolbar items. */\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n\n\t& > .ck-toolbar__items > .ck:last-child {\n\t\tmargin-left: 0;\n\t}\n\n\t&.ck-toolbar_compact > .ck-toolbar__items > .ck {\n\t\t/* No rounded corners on the right side of the first child. */\n\t\t&:first-child {\n\t\t\tborder-top-left-radius: 0;\n\t\t\tborder-bottom-left-radius: 0;\n\t\t}\n\n\t\t/* No rounded corners on the left side of the last child. */\n\t\t&:last-child {\n\t\t\tborder-top-right-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\t}\n\n\t/* Separate the the separator form the grouping dropdown when some items are grouped. */\n\t& > .ck.ck-toolbar__separator {\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n\n\t/* Some spacing between the items and the separator before the grouped items dropdown. */\n\t&.ck-toolbar_grouping > .ck-toolbar__items:not(:empty):not(:only-child) {\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n}\n\n/*\n * Styles for LTR toolbars.\n *\n * Note: In some cases (e.g. a decoupled editor), the toolbar has its own "dir"\n * because its parent is not controlled by the editor framework.\n */\n[dir="ltr"] .ck.ck-toolbar,\n.ck.ck-toolbar[dir="ltr"] {\n\t& > .ck-toolbar__items > .ck:last-child {\n\t\tmargin-right: 0;\n\t}\n\n\t&.ck-toolbar_compact > .ck-toolbar__items > .ck {\n\t\t/* No rounded corners on the right side of the first child. */\n\t\t&:first-child {\n\t\t\tborder-top-right-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\n\t\t/* No rounded corners on the left side of the last child. */\n\t\t&:last-child {\n\t\t\tborder-top-left-radius: 0;\n\t\t\tborder-bottom-left-radius: 0;\n\t\t}\n\t}\n\n\t/* Separate the the separator form the grouping dropdown when some items are grouped. */\n\t& > .ck.ck-toolbar__separator {\n\t\tmargin-right: var(--ck-spacing-small);\n\t}\n\n\t/* Some spacing between the items and the separator before the grouped items dropdown. */\n\t&.ck-toolbar_grouping > .ck-toolbar__items:not(:empty):not(:only-child) {\n\t\tmargin-right: var(--ck-spacing-small);\n\t}\n}\n\n/* stylelint-enable */\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-list{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-direction:column}.ck.ck-list .ck-list__item,.ck.ck-list .ck-list__separator{display:block}.ck.ck-list .ck-list__item>:focus{position:relative;z-index:var(--ck-z-default)}.ck.ck-list{border-radius:0}.ck-rounded-corners .ck.ck-list,.ck.ck-list.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-list{list-style-type:none;background:var(--ck-color-list-background)}.ck.ck-list__item{cursor:default;min-width:12em}.ck.ck-list__item .ck-button{min-height:unset;width:100%;text-align:left;border-radius:0;padding:calc(var(--ck-line-height-base)*0.2*var(--ck-font-size-base)) calc(var(--ck-line-height-base)*0.4*var(--ck-font-size-base))}.ck.ck-list__item .ck-button .ck-button__label{line-height:calc(var(--ck-line-height-base)*1.2*var(--ck-font-size-base))}.ck.ck-list__item .ck-button:active{box-shadow:none}.ck.ck-list__item .ck-button.ck-on{background:var(--ck-color-list-button-on-background);color:var(--ck-color-list-button-on-text)}.ck.ck-list__item .ck-button.ck-on:active{box-shadow:none}.ck.ck-list__item .ck-button.ck-on:hover:not(.ck-disabled){background:var(--ck-color-list-button-on-background-focus)}.ck.ck-list__item .ck-button.ck-on:focus:not(.ck-disabled){border-color:var(--ck-color-base-background)}.ck.ck-list__item .ck-button:hover:not(.ck-disabled){background:var(--ck-color-list-button-hover-background)}.ck.ck-list__item .ck-switchbutton.ck-on{background:var(--ck-color-list-background);color:inherit}.ck.ck-list__item .ck-switchbutton.ck-on:hover:not(.ck-disabled){background:var(--ck-color-list-button-hover-background);color:inherit}.ck.ck-list__separator{height:1px;width:100%;background:var(--ck-color-base-border)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/list/list.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/list/list.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,YCEC,qBAAsB,CACtB,wBAAyB,CACzB,oBAAqB,CACrB,gBAAgB,CDFhB,YAAa,CACb,qBAcD,CAZC,2DAEC,aACD,CAKA,kCACC,iBAAkB,CAClB,2BACD,CEfD,YCEC,eDGD,CALA,+DCME,qCDDF,CALA,YAGC,oBAAqB,CACrB,0CACD,CAEA,kBACC,cAAe,CACf,cA2DD,CAzDC,6BACC,gBAAiB,CACjB,UAAW,CACX,eAAgB,CAChB,eAAgB,CAKhB,mIAiCD,CA7BC,+CAEC,yEACD,CAEA,oCACC,eACD,CAEA,mCACC,oDAAqD,CACrD,yCAaD,CAXC,0CACC,eACD,CAEA,2DACC,0DACD,CAEA,2DACC,4CACD,CAGD,qDACC,uDACD,CAMA,yCACC,0CAA2C,CAC3C,aAMD,CAJC,iEACC,uDAAwD,CACxD,aACD,CAKH,uBACC,UAAW,CACX,UAAW,CACX,sCACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../mixins/_unselectable.css";\n\n.ck.ck-list {\n\t@mixin ck-unselectable;\n\n\tdisplay: flex;\n\tflex-direction: column;\n\n\t& .ck-list__item,\n\t& .ck-list__separator {\n\t\tdisplay: block;\n\t}\n\n\t/* Make sure that whatever child of the list item gets focus, it remains on the\n\ttop. Thanks to that, styles like box-shadow, outline, etc. are not masked by\n\tadjacent list items. */\n\t& .ck-list__item > *:focus {\n\t\tposition: relative;\n\t\tz-index: var(--ck-z-default);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Makes element unselectable.\n */\n@define-mixin ck-unselectable {\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_shadow.css";\n\n.ck.ck-list {\n\t@mixin ck-rounded-corners;\n\n\tlist-style-type: none;\n\tbackground: var(--ck-color-list-background);\n}\n\n.ck.ck-list__item {\n\tcursor: default;\n\tmin-width: 12em;\n\n\t& .ck-button {\n\t\tmin-height: unset;\n\t\twidth: 100%;\n\t\ttext-align: left;\n\t\tborder-radius: 0;\n\n\t\t/* List items should have the same height. Use absolute units to make sure it is so\n\t\t because e.g. different heading styles may have different height\n\t\t https://github.com/ckeditor/ckeditor5-heading/issues/63 */\n\t\tpadding:\n\t\t\tcalc(.2 * var(--ck-line-height-base) * var(--ck-font-size-base))\n\t\t\tcalc(.4 * var(--ck-line-height-base) * var(--ck-font-size-base));\n\n\t\t& .ck-button__label {\n\t\t\t/* https://github.com/ckeditor/ckeditor5-heading/issues/63 */\n\t\t\tline-height: calc(1.2 * var(--ck-line-height-base) * var(--ck-font-size-base));\n\t\t}\n\n\t\t&:active {\n\t\t\tbox-shadow: none;\n\t\t}\n\n\t\t&.ck-on {\n\t\t\tbackground: var(--ck-color-list-button-on-background);\n\t\t\tcolor: var(--ck-color-list-button-on-text);\n\n\t\t\t&:active {\n\t\t\t\tbox-shadow: none;\n\t\t\t}\n\n\t\t\t&:hover:not(.ck-disabled) {\n\t\t\t\tbackground: var(--ck-color-list-button-on-background-focus);\n\t\t\t}\n\n\t\t\t&:focus:not(.ck-disabled) {\n\t\t\t\tborder-color: var(--ck-color-base-background);\n\t\t\t}\n\t\t}\n\n\t\t&:hover:not(.ck-disabled) {\n\t\t\tbackground: var(--ck-color-list-button-hover-background);\n\t\t}\n\t}\n\n\t/* It\'s unnecessary to change the background/text of a switch toggle; it has different ways\n\tof conveying its state (like the switcher) */\n\t& .ck-switchbutton {\n\t\t&.ck-on {\n\t\t\tbackground: var(--ck-color-list-background);\n\t\t\tcolor: inherit;\n\n\t\t\t&:hover:not(.ck-disabled) {\n\t\t\t\tbackground: var(--ck-color-list-button-hover-background);\n\t\t\t\tcolor: inherit;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.ck.ck-list__separator {\n\theight: 1px;\n\twidth: 100%;\n\tbackground: var(--ck-color-base-border);\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,":root{--ck-toolbar-dropdown-max-width:60vw}.ck.ck-toolbar-dropdown>.ck-dropdown__panel{width:max-content;max-width:var(--ck-toolbar-dropdown-max-width)}.ck.ck-toolbar-dropdown>.ck-dropdown__panel .ck-button:focus{z-index:calc(var(--ck-z-default) + 1)}.ck.ck-toolbar-dropdown .ck-toolbar{border:0}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/toolbardropdown.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/toolbardropdown.css"],names:[],mappings:"AAKA,MACC,oCACD,CAEA,4CAEC,iBAAkB,CAClB,8CAOD,CAJE,6DACC,qCACD,CCZF,oCACC,QACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-toolbar-dropdown-max-width: 60vw;\n}\n\n.ck.ck-toolbar-dropdown > .ck-dropdown__panel {\n\t/* https://github.com/ckeditor/ckeditor5/issues/5586 */\n\twidth: max-content;\n\tmax-width: var(--ck-toolbar-dropdown-max-width);\n\n\t& .ck-button {\n\t\t&:focus {\n\t\t\tz-index: calc(var(--ck-z-default) + 1);\n\t\t}\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-toolbar-dropdown .ck-toolbar {\n\tborder: 0;\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-dropdown .ck-dropdown__panel .ck-list{border-radius:0}.ck-rounded-corners .ck.ck-dropdown .ck-dropdown__panel .ck-list,.ck.ck-dropdown .ck-dropdown__panel .ck-list.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0}.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:first-child .ck-button{border-radius:0}.ck-rounded-corners .ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:first-child .ck-button,.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:first-child .ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:last-child .ck-button{border-radius:0}.ck-rounded-corners .ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:last-child .ck-button,.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:last-child .ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/listdropdown.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,6CCIC,eDqBD,CAzBA,iICQE,qCAAsC,CDJtC,wBAqBF,CAfE,mFCND,eDYC,CANA,6MCFA,qCAAsC,CDIpC,wBAAyB,CACzB,2BAA4B,CAC5B,4BAEF,CAEA,kFCdD,eDmBC,CALA,2MCVA,qCAAsC,CDYpC,wBAAyB,CACzB,yBAEF",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n.ck.ck-dropdown .ck-dropdown__panel .ck-list {\n\t/* Disabled radius of top-left border to be consistent with .dropdown__button\n\thttps://github.com/ckeditor/ckeditor5/issues/816 */\n\t@mixin ck-rounded-corners {\n\t\tborder-top-left-radius: 0;\n\t}\n\n\t/* Make sure the button belonging to the first/last child of the list goes well with the\n\tborder radius of the entire panel. */\n\t& .ck-list__item {\n\t\t&:first-child .ck-button {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\t\t}\n\n\t\t&:last-child .ck-button {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\tborder-top-right-radius: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,":root{--ck-color-editable-blur-selection:#d9d9d9}.ck.ck-editor__editable:not(.ck-editor__nested-editable){border-radius:0}.ck-rounded-corners .ck.ck-editor__editable:not(.ck-editor__nested-editable),.ck.ck-editor__editable:not(.ck-editor__nested-editable).ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-editor__editable:not(.ck-editor__nested-editable).ck-focused{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0}.ck.ck-editor__editable_inline{overflow:auto;padding:0 var(--ck-spacing-standard);border:1px solid transparent}.ck.ck-editor__editable_inline[dir=ltr]{text-align:left}.ck.ck-editor__editable_inline[dir=rtl]{text-align:right}.ck.ck-editor__editable_inline>:first-child{margin-top:var(--ck-spacing-large)}.ck.ck-editor__editable_inline>:last-child{margin-bottom:var(--ck-spacing-large)}.ck.ck-editor__editable_inline.ck-blurred ::selection{background:var(--ck-color-editable-blur-selection)}.ck.ck-balloon-panel.ck-toolbar-container[class*=arrow_n]:after{border-bottom-color:var(--ck-color-base-foreground)}.ck.ck-balloon-panel.ck-toolbar-container[class*=arrow_s]:after{border-top-color:var(--ck-color-base-foreground)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/editorui/editorui.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAWA,MACC,0CACD,CAEA,yDCJC,eDWD,CAPA,yJCAE,qCDOF,CAJC,oEERA,YAAa,CACb,2BAA2B,CCF3B,qCHYA,CAGD,+BACC,aAAc,CACd,oCAAqC,CACrC,4BAwBD,CAtBC,wCACC,eACD,CAEA,wCACC,gBACD,CAGA,4CACC,kCACD,CAGA,2CACC,qCACD,CAGA,sDACC,kDACD,CAKA,gEACC,mDACD,CAIA,gEACC,gDACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_shadow.css";\n@import "../../../mixins/_focus.css";\n@import "../../mixins/_button.css";\n\n:root {\n\t--ck-color-editable-blur-selection: hsl(0, 0%, 85%);\n}\n\n.ck.ck-editor__editable:not(.ck-editor__nested-editable) {\n\t@mixin ck-rounded-corners;\n\n\t&.ck-focused {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-inner-shadow);\n\t}\n}\n\n.ck.ck-editor__editable_inline {\n\toverflow: auto;\n\tpadding: 0 var(--ck-spacing-standard);\n\tborder: 1px solid transparent;\n\n\t&[dir="ltr"] {\n\t\ttext-align: left;\n\t}\n\n\t&[dir="rtl"] {\n\t\ttext-align: right;\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/116 */\n\t& > *:first-child {\n\t\tmargin-top: var(--ck-spacing-large);\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5/issues/847 */\n\t& > *:last-child {\n\t\tmargin-bottom: var(--ck-spacing-large);\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5/issues/6517 */\n\t&.ck-blurred ::selection {\n\t\tbackground: var(--ck-color-editable-blur-selection);\n\t}\n}\n\n/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/111 */\n.ck.ck-balloon-panel.ck-toolbar-container[class*="arrow_n"] {\n\t&::after {\n\t\tborder-bottom-color: var(--ck-color-base-foreground);\n\t}\n}\n\n.ck.ck-balloon-panel.ck-toolbar-container[class*="arrow_s"] {\n\t&::after {\n\t\tborder-top-color: var(--ck-color-base-foreground);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-label{display:block}.ck.ck-voice-label{display:none}.ck.ck-label{font-weight:700}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/label/label.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/label/label.css"],names:[],mappings:"AAKA,aACC,aACD,CAEA,mBACC,YACD,CCNA,aACC,eACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-label {\n\tdisplay: block;\n}\n\n.ck.ck-voice-label {\n\tdisplay: none;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-label {\n\tfont-weight: bold;\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-form__header{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:space-between}:root{--ck-form-header-height:38px}.ck.ck-form__header{padding:var(--ck-spacing-small) var(--ck-spacing-large);height:var(--ck-form-header-height);line-height:var(--ck-form-header-height);border-bottom:1px solid var(--ck-color-base-border)}.ck.ck-form__header .ck-form__header__label{font-weight:700}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/formheader/formheader.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/formheader/formheader.css"],names:[],mappings:"AAKA,oBACC,YAAa,CACb,kBAAmB,CACnB,gBAAiB,CACjB,kBAAmB,CACnB,6BACD,CCNA,MACC,4BACD,CAEA,oBACC,uDAAwD,CACxD,mCAAoC,CACpC,wCAAyC,CACzC,mDAKD,CAHC,4CACC,eACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-form__header {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-form-header-height: 38px;\n}\n\n.ck.ck-form__header {\n\tpadding: var(--ck-spacing-small) var(--ck-spacing-large);\n\theight: var(--ck-form-header-height);\n\tline-height: var(--ck-form-header-height);\n\tborder-bottom: 1px solid var(--ck-color-base-border);\n\n\t& .ck-form__header__label {\n\t\tfont-weight: bold;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,":root{--ck-input-text-width:18em}.ck.ck-input-text{border-radius:0}.ck-rounded-corners .ck.ck-input-text,.ck.ck-input-text.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-input-text{background:var(--ck-color-input-background);border:1px solid var(--ck-color-input-border);padding:var(--ck-spacing-extra-tiny) var(--ck-spacing-medium);min-width:var(--ck-input-text-width);min-height:var(--ck-ui-component-min-height);transition:box-shadow .1s ease-in-out,border .1s ease-in-out}.ck.ck-input-text:focus{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-focus-outer-shadow),0 0}.ck.ck-input-text[readonly]{border:1px solid var(--ck-color-input-disabled-border);background:var(--ck-color-input-disabled-background);color:var(--ck-color-input-disabled-text)}.ck.ck-input-text[readonly]:focus{box-shadow:var(--ck-focus-disabled-outer-shadow),0 0}.ck.ck-input-text.ck-error{border-color:var(--ck-color-input-error-border);animation:ck-text-input-shake .3s ease both}.ck.ck-input-text.ck-error:focus{box-shadow:var(--ck-focus-error-outer-shadow),0 0}@keyframes ck-text-input-shake{20%{transform:translateX(-2px)}40%{transform:translateX(2px)}60%{transform:translateX(-1px)}80%{transform:translateX(1px)}}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/inputtext/inputtext.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AASA,MACC,0BACD,CAEA,kBCFC,eDwCD,CAtCA,2ECEE,qCDoCF,CAtCA,kBAGC,2CAA4C,CAC5C,6CAA8C,CAC9C,6DAA8D,CAC9D,oCAAqC,CAGrC,4CAA6C,CAG7C,4DA0BD,CAxBC,wBEjBA,YAAa,CACb,2BAA2B,CCF3B,2CHqBA,CAEA,4BACC,sDAAuD,CACvD,oDAAqD,CACrD,yCAMD,CAJC,kCG5BD,oDH+BC,CAGD,2BACC,+CAAgD,CAChD,2CAKD,CAHC,iCGtCD,iDHwCC,CAIF,+BACC,IACC,0BACD,CAEA,IACC,yBACD,CAEA,IACC,0BACD,CAEA,IACC,yBACD,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_focus.css";\n@import "../../../mixins/_shadow.css";\n\n:root {\n\t--ck-input-text-width: 18em;\n}\n\n.ck.ck-input-text {\n\t@mixin ck-rounded-corners;\n\n\tbackground: var(--ck-color-input-background);\n\tborder: 1px solid var(--ck-color-input-border);\n\tpadding: var(--ck-spacing-extra-tiny) var(--ck-spacing-medium);\n\tmin-width: var(--ck-input-text-width);\n\n\t/* This is important to stay of the same height as surrounding buttons */\n\tmin-height: var(--ck-ui-component-min-height);\n\n\t/* Apply some smooth transition to the box-shadow and border. */\n\ttransition: box-shadow .1s ease-in-out, border .1s ease-in-out;\n\n\t&:focus {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\n\t}\n\n\t&[readonly] {\n\t\tborder: 1px solid var(--ck-color-input-disabled-border);\n\t\tbackground: var(--ck-color-input-disabled-background);\n\t\tcolor: var(--ck-color-input-disabled-text);\n\n\t\t&:focus {\n\t\t\t/* The read-only input should have a slightly less visible shadow when focused. */\n\t\t\t@mixin ck-box-shadow var(--ck-focus-disabled-outer-shadow);\n\t\t}\n\t}\n\n\t&.ck-error {\n\t\tborder-color: var(--ck-color-input-error-border);\n\t\tanimation: ck-text-input-shake .3s ease both;\n\n\t\t&:focus {\n\t\t\t@mixin ck-box-shadow var(--ck-focus-error-outer-shadow);\n\t\t}\n\t}\n}\n\n@keyframes ck-text-input-shake {\n\t20% {\n\t\ttransform: translateX(-2px);\n\t}\n\n\t40% {\n\t\ttransform: translateX(2px);\n\t}\n\n\t60% {\n\t\ttransform: translateX(-1px);\n\t}\n\n\t80% {\n\t\ttransform: translateX(1px);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper{display:flex;position:relative}.ck.ck-labeled-field-view .ck.ck-label{display:block;position:absolute}:root{--ck-labeled-field-view-transition:.1s cubic-bezier(0,0,0.24,0.95);--ck-labeled-field-empty-unfocused-max-width:100% - 2 * var(--ck-spacing-medium);--ck-color-labeled-field-label-background:var(--ck-color-base-background)}.ck.ck-labeled-field-view{border-radius:0}.ck-rounded-corners .ck.ck-labeled-field-view,.ck.ck-labeled-field-view.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper{width:100%}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{top:0}[dir=ltr] .ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{left:0}[dir=rtl] .ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{right:0}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{pointer-events:none;transform-origin:0 0;transform:translate(var(--ck-spacing-medium),-6px) scale(.75);background:var(--ck-color-labeled-field-label-background);padding:0 calc(var(--ck-font-size-tiny)*0.5);line-height:normal;font-weight:400;text-overflow:ellipsis;overflow:hidden;max-width:100%;transition:transform var(--ck-labeled-field-view-transition),padding var(--ck-labeled-field-view-transition),background var(--ck-labeled-field-view-transition)}.ck.ck-labeled-field-view.ck-error .ck-input:not([readonly])+.ck.ck-label,.ck.ck-labeled-field-view.ck-error>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{color:var(--ck-color-base-error)}.ck.ck-labeled-field-view .ck-labeled-field-view__status{font-size:var(--ck-font-size-small);margin-top:var(--ck-spacing-small);white-space:normal}.ck.ck-labeled-field-view .ck-labeled-field-view__status.ck-labeled-field-view__status_error{color:var(--ck-color-base-error)}.ck.ck-labeled-field-view.ck-disabled>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{color:var(--ck-color-input-disabled-text)}[dir=ltr] .ck.ck-labeled-field-view.ck-disabled>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,[dir=ltr] .ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{transform:translate(var(--ck-spacing-medium),calc(var(--ck-font-size-base)*0.6)) scale(1)}[dir=rtl] .ck.ck-labeled-field-view.ck-disabled>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,[dir=rtl] .ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{transform:translate(calc(var(--ck-spacing-medium)*-1),calc(var(--ck-font-size-base)*0.6)) scale(1)}.ck.ck-labeled-field-view.ck-disabled>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{max-width:calc(var(--ck-labeled-field-empty-unfocused-max-width));background:transparent;padding:0}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown>.ck.ck-button{background:transparent}.ck.ck-labeled-field-view.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown>.ck-button>.ck-button__label{opacity:0}.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown+.ck-label{max-width:calc(var(--ck-labeled-field-empty-unfocused-max-width) - var(--ck-dropdown-arrow-size) - var(--ck-spacing-standard))}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/labeledfield/labeledfieldview.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAMC,mEACC,YAAa,CACb,iBACD,CAEA,uCACC,aAAc,CACd,iBACD,CCND,MACC,kEAAsE,CACtE,gFAAiF,CACjF,yEACD,CAEA,0BCHC,eD4GD,CAzGA,2FCCE,qCDwGF,CAtGC,mEACC,UAmCD,CAjCC,gFACC,KA+BD,CAhCA,0FAIE,MA4BF,CAhCA,0FAQE,OAwBF,CAhCA,gFAWC,mBAAoB,CACpB,oBAAqB,CAGrB,6DAA+D,CAE/D,yDAA0D,CAC1D,4CAA8C,CAC9C,kBAAoB,CACpB,eAAmB,CAGnB,sBAAuB,CACvB,eAAgB,CAEhB,cAAe,CAEf,+JAID,CAQA,mKACC,gCACD,CAGD,yDACC,mCAAoC,CACpC,kCAAmC,CAInC,kBAKD,CAHC,6FACC,gCACD,CAID,4OAEC,yCACD,CAIA,wSAGE,yFAYF,CAfA,wSAOE,kGAQF,CAfA,oRAWC,iEAAkE,CAElE,sBAAuB,CACvB,SACD,CAKA,8FACC,sBACD,CAGA,yIACC,SACD,CAGA,kMACC,8HACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-labeled-field-view {\n\t& > .ck.ck-labeled-field-view__input-wrapper {\n\t\tdisplay: flex;\n\t\tposition: relative;\n\t}\n\n\t& .ck.ck-label {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n@import "../../../mixins/_rounded.css";\n\n:root {\n\t--ck-labeled-field-view-transition: .1s cubic-bezier(0, 0, 0.24, 0.95);\n\t--ck-labeled-field-empty-unfocused-max-width: 100% - 2 * var(--ck-spacing-medium);\n\t--ck-color-labeled-field-label-background: var(--ck-color-base-background);\n}\n\n.ck.ck-labeled-field-view {\n\t@mixin ck-rounded-corners;\n\n\t& > .ck.ck-labeled-field-view__input-wrapper {\n\t\twidth: 100%;\n\n\t\t& > .ck.ck-label {\n\t\t\ttop: 0px;\n\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tleft: 0px;\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tright: 0px;\n\t\t\t}\n\n\t\t\tpointer-events: none;\n\t\t\ttransform-origin: 0 0;\n\n\t\t\t/* By default, display the label scaled down above the field. */\n\t\t\ttransform: translate(var(--ck-spacing-medium), -6px) scale(.75);\n\n\t\t\tbackground: var(--ck-color-labeled-field-label-background);\n\t\t\tpadding: 0 calc(.5 * var(--ck-font-size-tiny));\n\t\t\tline-height: initial;\n\t\t\tfont-weight: normal;\n\n\t\t\t/* Prevent overflow when the label is longer than the input */\n\t\t\ttext-overflow: ellipsis;\n\t\t\toverflow: hidden;\n\n\t\t\tmax-width: 100%;\n\n\t\t\ttransition:\n\t\t\t\ttransform var(--ck-labeled-field-view-transition),\n\t\t\t\tpadding var(--ck-labeled-field-view-transition),\n\t\t\t\tbackground var(--ck-labeled-field-view-transition);\n\t\t}\n\t}\n\n\t&.ck-error {\n\t\t& > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label {\n\t\t\tcolor: var(--ck-color-base-error);\n\t\t}\n\n\t\t& .ck-input:not([readonly]) + .ck.ck-label {\n\t\t\tcolor: var(--ck-color-base-error);\n\t\t}\n\t}\n\n\t& .ck-labeled-field-view__status {\n\t\tfont-size: var(--ck-font-size-small);\n\t\tmargin-top: var(--ck-spacing-small);\n\n\t\t/* Let the info wrap to the next line to avoid stretching the layout horizontally.\n\t\tThe status could be very long. */\n\t\twhite-space: normal;\n\n\t\t&.ck-labeled-field-view__status_error {\n\t\t\tcolor: var(--ck-color-base-error);\n\t\t}\n\t}\n\n\t/* Disabled fields and fields that have no focus should fade out. */\n\t&.ck-disabled > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label,\n\t&.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused) > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label {\n\t\tcolor: var(--ck-color-input-disabled-text);\n\t}\n\n\t/* Fields that are disabled or not focused and without a placeholder should have full-sized labels. */\n\t/* stylelint-disable-next-line no-descending-specificity */\n\t&.ck-disabled > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label,\n\t&.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder) > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label {\n\t\t@mixin ck-dir ltr {\n\t\t\ttransform: translate(var(--ck-spacing-medium), calc(0.6 * var(--ck-font-size-base))) scale(1);\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\ttransform: translate(calc(-1 * var(--ck-spacing-medium)), calc(0.6 * var(--ck-font-size-base))) scale(1);\n\t\t}\n\n\t\t/* Compensate for the default translate position. */\n\t\tmax-width: calc(var(--ck-labeled-field-empty-unfocused-max-width));\n\n\t\tbackground: transparent;\n\t\tpadding: 0;\n\t}\n\n\t/*------ DropdownView integration ----------------------------------------------------------------------------------- */\n\n\t/* Make sure dropdown\' background color in any of dropdown\'s state does not collide with labeled field. */\n\t& > .ck.ck-labeled-field-view__input-wrapper > .ck-dropdown > .ck.ck-button {\n\t\tbackground: transparent;\n\t}\n\n\t/* When the dropdown is "empty", the labeled field label replaces its label. */\n\t&.ck-labeled-field-view_empty > .ck.ck-labeled-field-view__input-wrapper > .ck-dropdown > .ck-button > .ck-button__label {\n\t\topacity: 0;\n\t}\n\n\t/* Make sure the label of the empty, unfocused input does not cover the dropdown arrow. */\n\t&.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder) > .ck.ck-labeled-field-view__input-wrapper > .ck-dropdown + .ck-label {\n\t\tmax-width: calc(var(--ck-labeled-field-empty-unfocused-max-width) - var(--ck-dropdown-arrow-size) - var(--ck-spacing-standard));\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,':root{--ck-balloon-panel-arrow-z-index:calc(var(--ck-z-default) - 3)}.ck.ck-balloon-panel{display:none;position:absolute;z-index:var(--ck-z-modal)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after,.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{content:"";position:absolute}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel[class*=arrow_n]:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel[class*=arrow_n]:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel[class*=arrow_s]:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel[class*=arrow_s]:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel.ck-balloon-panel_visible{display:block}:root{--ck-balloon-arrow-offset:2px;--ck-balloon-arrow-height:10px;--ck-balloon-arrow-half-width:8px;--ck-balloon-arrow-drop-shadow:0 2px 2px var(--ck-color-shadow-drop)}.ck.ck-balloon-panel{border-radius:0}.ck-rounded-corners .ck.ck-balloon-panel,.ck.ck-balloon-panel.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-balloon-panel{box-shadow:var(--ck-drop-shadow),0 0;min-height:15px;background:var(--ck-color-panel-background);border:1px solid var(--ck-color-panel-border)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after,.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{width:0;height:0;border-style:solid}.ck.ck-balloon-panel[class*=arrow_n]:after,.ck.ck-balloon-panel[class*=arrow_n]:before{border-left-width:var(--ck-balloon-arrow-half-width);border-bottom-width:var(--ck-balloon-arrow-height);border-right-width:var(--ck-balloon-arrow-half-width);border-top-width:0}.ck.ck-balloon-panel[class*=arrow_n]:before{border-bottom-color:var(--ck-color-panel-border)}.ck.ck-balloon-panel[class*=arrow_n]:after,.ck.ck-balloon-panel[class*=arrow_n]:before{border-left-color:transparent;border-right-color:transparent;border-top-color:transparent}.ck.ck-balloon-panel[class*=arrow_n]:after{border-bottom-color:var(--ck-color-panel-background);margin-top:var(--ck-balloon-arrow-offset)}.ck.ck-balloon-panel[class*=arrow_s]:after,.ck.ck-balloon-panel[class*=arrow_s]:before{border-left-width:var(--ck-balloon-arrow-half-width);border-bottom-width:0;border-right-width:var(--ck-balloon-arrow-half-width);border-top-width:var(--ck-balloon-arrow-height)}.ck.ck-balloon-panel[class*=arrow_s]:before{border-top-color:var(--ck-color-panel-border);filter:drop-shadow(var(--ck-balloon-arrow-drop-shadow))}.ck.ck-balloon-panel[class*=arrow_s]:after,.ck.ck-balloon-panel[class*=arrow_s]:before{border-left-color:transparent;border-bottom-color:transparent;border-right-color:transparent}.ck.ck-balloon-panel[class*=arrow_s]:after{border-top-color:var(--ck-color-panel-background);margin-bottom:var(--ck-balloon-arrow-offset)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_n:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_n:before{left:50%;margin-left:calc(var(--ck-balloon-arrow-half-width)*-1);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nw:before{left:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_ne:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_ne:before{right:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_s:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_s:before{left:50%;margin-left:calc(var(--ck-balloon-arrow-half-width)*-1);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:before{left:calc(var(--ck-balloon-arrow-half-width)*2);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:before{right:calc(var(--ck-balloon-arrow-half-width)*2);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sme:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sme:before{right:25%;margin-right:calc(var(--ck-balloon-arrow-half-width)*2);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_smw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_smw:before{left:25%;margin-left:calc(var(--ck-balloon-arrow-half-width)*2);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nme:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nme:before{right:25%;margin-right:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nmw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nmw:before{left:25%;margin-left:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonpanel.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/balloonpanel.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAKA,MAEC,8DACD,CAEA,qBACC,YAAa,CACb,iBAAkB,CAElB,yBAyCD,CAtCE,+GAEC,UAAW,CACX,iBACD,CAEA,wDACC,6CACD,CAEA,uDACC,uDACD,CAIA,4CACC,6CACD,CAEA,2CACC,uDACD,CAIA,4CACC,6CACD,CAEA,2CACC,uDACD,CAGD,8CACC,aACD,CC9CD,MACC,6BAA8B,CAC9B,8BAA+B,CAC/B,iCAAkC,CAClC,oEACD,CAEA,qBCJC,eD4ID,CAxIA,iFCAE,qCDwIF,CAxIA,qBENC,oCAA8B,CFU9B,eAAgB,CAEhB,2CAA4C,CAC5C,6CAiID,CA9HE,+GAEC,OAAQ,CACR,QAAS,CACT,kBACD,CAIA,uFAEC,oDAAoH,CAApH,kDAAoH,CAApH,qDAAoH,CAApH,kBACD,CAEA,4CACC,gDACD,CAEA,uFAHC,6BAA8E,CAA9E,8BAA8E,CAA9E,4BAMD,CAHA,2CACC,oDAAkF,CAClF,yCACD,CAIA,uFAEC,oDAAoH,CAApH,qBAAoH,CAApH,qDAAoH,CAApH,+CACD,CAEA,4CACC,6CAAkE,CAClE,uDACD,CAEA,uFAJC,6BAAkE,CAAlE,+BAAkE,CAAlE,8BAOD,CAHA,2CACC,iDAAkF,CAClF,4CACD,CAIA,yGAEC,QAAS,CACT,uDAA0D,CAC1D,2CACD,CAIA,2GAEC,+CAAkD,CAClD,2CACD,CAIA,2GAEC,gDAAmD,CACnD,2CACD,CAIA,yGAEC,QAAS,CACT,uDAA0D,CAC1D,8CACD,CAIA,2GAEC,+CAAkD,CAClD,8CACD,CAIA,2GAEC,gDAAmD,CACnD,8CACD,CAIA,6GAEC,SAAU,CACV,uDAA0D,CAC1D,8CACD,CAIA,6GAEC,QAAS,CACT,sDAAyD,CACzD,8CACD,CAIA,6GAEC,SAAU,CACV,uDAA0D,CAC1D,2CACD,CAIA,6GAEC,QAAS,CACT,sDAAyD,CACzD,2CACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/* Make sure the balloon arrow does not float over its children. */\n\t--ck-balloon-panel-arrow-z-index: calc(var(--ck-z-default) - 3);\n}\n\n.ck.ck-balloon-panel {\n\tdisplay: none;\n\tposition: absolute;\n\n\tz-index: var(--ck-z-modal);\n\n\t&.ck-balloon-panel_with-arrow {\n\t\t&::before,\n\t\t&::after {\n\t\t\tcontent: "";\n\t\t\tposition: absolute;\n\t\t}\n\n\t\t&::before {\n\t\t\tz-index: var(--ck-balloon-panel-arrow-z-index);\n\t\t}\n\n\t\t&::after {\n\t\t\tz-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1);\n\t\t}\n\t}\n\n\t&[class*="arrow_n"] {\n\t\t&::before {\n\t\t\tz-index: var(--ck-balloon-panel-arrow-z-index);\n\t\t}\n\n\t\t&::after {\n\t\t\tz-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1);\n\t\t}\n\t}\n\n\t&[class*="arrow_s"] {\n\t\t&::before {\n\t\t\tz-index: var(--ck-balloon-panel-arrow-z-index);\n\t\t}\n\n\t\t&::after {\n\t\t\tz-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1);\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_visible {\n\t\tdisplay: block;\n\t}\n}\n','/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_shadow.css";\n\n:root {\n\t--ck-balloon-arrow-offset: 2px;\n\t--ck-balloon-arrow-height: 10px;\n\t--ck-balloon-arrow-half-width: 8px;\n\t--ck-balloon-arrow-drop-shadow: 0 2px 2px var(--ck-color-shadow-drop);\n}\n\n.ck.ck-balloon-panel {\n\t@mixin ck-rounded-corners;\n\t@mixin ck-drop-shadow;\n\n\tmin-height: 15px;\n\n\tbackground: var(--ck-color-panel-background);\n\tborder: 1px solid var(--ck-color-panel-border);\n\n\t&.ck-balloon-panel_with-arrow {\n\t\t&::before,\n\t\t&::after {\n\t\t\twidth: 0;\n\t\t\theight: 0;\n\t\t\tborder-style: solid;\n\t\t}\n\t}\n\n\t&[class*="arrow_n"] {\n\t\t&::before,\n\t\t&::after {\n\t\t\tborder-width: 0 var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width);\n\t\t}\n\n\t\t&::before {\n\t\t\tborder-color: transparent transparent var(--ck-color-panel-border) transparent;\n\t\t}\n\n\t\t&::after {\n\t\t\tborder-color: transparent transparent var(--ck-color-panel-background) transparent;\n\t\t\tmargin-top: var(--ck-balloon-arrow-offset);\n\t\t}\n\t}\n\n\t&[class*="arrow_s"] {\n\t\t&::before,\n\t\t&::after {\n\t\t\tborder-width: var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width) 0 var(--ck-balloon-arrow-half-width);\n\t\t}\n\n\t\t&::before {\n\t\t\tborder-color: var(--ck-color-panel-border) transparent transparent;\n\t\t\tfilter: drop-shadow(var(--ck-balloon-arrow-drop-shadow));\n\t\t}\n\n\t\t&::after {\n\t\t\tborder-color: var(--ck-color-panel-background) transparent transparent transparent;\n\t\t\tmargin-bottom: var(--ck-balloon-arrow-offset);\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_n {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 50%;\n\t\t\tmargin-left: calc(-1 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_nw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_ne {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_s {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 50%;\n\t\t\tmargin-left: calc(-1 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_sw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_se {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_sme {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: 25%;\n\t\t\tmargin-right: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_smw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 25%;\n\t\t\tmargin-left: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_nme {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: 25%;\n\t\t\tmargin-right: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_nmw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 25%;\n\t\t\tmargin-left: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck .ck-balloon-rotator__navigation{display:flex;align-items:center;justify-content:center}.ck .ck-balloon-rotator__content .ck-toolbar{justify-content:center}.ck .ck-balloon-rotator__navigation{background:var(--ck-color-toolbar-background);border-bottom:1px solid var(--ck-color-toolbar-border);padding:0 var(--ck-spacing-small)}.ck .ck-balloon-rotator__navigation>*{margin-right:var(--ck-spacing-small);margin-top:var(--ck-spacing-small);margin-bottom:var(--ck-spacing-small)}.ck .ck-balloon-rotator__navigation .ck-balloon-rotator__counter{margin-right:var(--ck-spacing-standard);margin-left:var(--ck-spacing-small)}.ck .ck-balloon-rotator__content .ck.ck-annotation-wrapper{box-shadow:none}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonrotator.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/balloonrotator.css"],names:[],mappings:"AAKA,oCACC,YAAa,CACb,kBAAmB,CACnB,sBACD,CAKA,6CACC,sBACD,CCXA,oCACC,6CAA8C,CAC9C,sDAAuD,CACvD,iCAgBD,CAbC,sCACC,oCAAqC,CACrC,kCAAmC,CACnC,qCACD,CAGA,iEACC,uCAAwC,CAGxC,mCACD,CAMA,2DACC,eACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-balloon-rotator__navigation {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n/* Buttons inside a toolbar should be centered when rotator bar is wider.\n * See: https://github.com/ckeditor/ckeditor5-ui/issues/495\n */\n.ck .ck-balloon-rotator__content .ck-toolbar {\n\tjustify-content: center;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-balloon-rotator__navigation {\n\tbackground: var(--ck-color-toolbar-background);\n\tborder-bottom: 1px solid var(--ck-color-toolbar-border);\n\tpadding: 0 var(--ck-spacing-small);\n\n\t/* Let's keep similar appearance to `ck-toolbar`. */\n\t& > * {\n\t\tmargin-right: var(--ck-spacing-small);\n\t\tmargin-top: var(--ck-spacing-small);\n\t\tmargin-bottom: var(--ck-spacing-small);\n\t}\n\n\t/* Gives counter more breath than buttons. */\n\t& .ck-balloon-rotator__counter {\n\t\tmargin-right: var(--ck-spacing-standard);\n\n\t\t/* We need to use smaller margin because of previous button's right margin. */\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n}\n\n.ck .ck-balloon-rotator__content {\n\n\t/* Disable default annotation shadow inside rotator with fake panels. */\n\t& .ck.ck-annotation-wrapper {\n\t\tbox-shadow: none;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck .ck-fake-panel{position:absolute;z-index:calc(var(--ck-z-modal) - 1)}.ck .ck-fake-panel div{position:absolute}.ck .ck-fake-panel div:first-child{z-index:2}.ck .ck-fake-panel div:nth-child(2){z-index:1}:root{--ck-balloon-fake-panel-offset-horizontal:6px;--ck-balloon-fake-panel-offset-vertical:6px}.ck .ck-fake-panel div{box-shadow:var(--ck-drop-shadow),0 0;min-height:15px;background:var(--ck-color-panel-background);border:1px solid var(--ck-color-panel-border);border-radius:var(--ck-border-radius);width:100%;height:100%}.ck .ck-fake-panel div:first-child{margin-left:var(--ck-balloon-fake-panel-offset-horizontal);margin-top:var(--ck-balloon-fake-panel-offset-vertical)}.ck .ck-fake-panel div:nth-child(2){margin-left:calc(var(--ck-balloon-fake-panel-offset-horizontal)*2);margin-top:calc(var(--ck-balloon-fake-panel-offset-vertical)*2)}.ck .ck-fake-panel div:nth-child(3){margin-left:calc(var(--ck-balloon-fake-panel-offset-horizontal)*3);margin-top:calc(var(--ck-balloon-fake-panel-offset-vertical)*3)}.ck .ck-balloon-panel_arrow_s+.ck-fake-panel,.ck .ck-balloon-panel_arrow_se+.ck-fake-panel,.ck .ck-balloon-panel_arrow_sw+.ck-fake-panel{--ck-balloon-fake-panel-offset-vertical:-6px}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/fakepanel.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/fakepanel.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAKA,mBACC,iBAAkB,CAGlB,mCACD,CAEA,uBACC,iBACD,CAEA,mCACC,SACD,CAEA,oCACC,SACD,CCfA,MACC,6CAA8C,CAC9C,2CACD,CAGA,uBCJC,oCAA8B,CDO9B,eAAgB,CAEhB,2CAA4C,CAC5C,6CAA8C,CAC9C,qCAAsC,CAEtC,UAAW,CACX,WACD,CAEA,mCACC,0DAA2D,CAC3D,uDACD,CAEA,oCACC,kEAAqE,CACrE,+DACD,CACA,oCACC,kEAAqE,CACrE,+DACD,CAGA,yIAGC,4CACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-fake-panel {\n\tposition: absolute;\n\n\t/* Fake panels should be placed under main balloon content. */\n\tz-index: calc(var(--ck-z-modal) - 1);\n}\n\n.ck .ck-fake-panel div {\n\tposition: absolute;\n}\n\n.ck .ck-fake-panel div:nth-child( 1 ) {\n\tz-index: 2;\n}\n\n.ck .ck-fake-panel div:nth-child( 2 ) {\n\tz-index: 1;\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_shadow.css";\n\n:root {\n\t--ck-balloon-fake-panel-offset-horizontal: 6px;\n\t--ck-balloon-fake-panel-offset-vertical: 6px;\n}\n\n/* Let\'s use `.ck-balloon-panel` appearance. See: balloonpanel.css. */\n.ck .ck-fake-panel div {\n\t@mixin ck-drop-shadow;\n\n\tmin-height: 15px;\n\n\tbackground: var(--ck-color-panel-background);\n\tborder: 1px solid var(--ck-color-panel-border);\n\tborder-radius: var(--ck-border-radius);\n\n\twidth: 100%;\n\theight: 100%;\n}\n\n.ck .ck-fake-panel div:nth-child( 1 ) {\n\tmargin-left: var(--ck-balloon-fake-panel-offset-horizontal);\n\tmargin-top: var(--ck-balloon-fake-panel-offset-vertical);\n}\n\n.ck .ck-fake-panel div:nth-child( 2 ) {\n\tmargin-left: calc(var(--ck-balloon-fake-panel-offset-horizontal) * 2);\n\tmargin-top: calc(var(--ck-balloon-fake-panel-offset-vertical) * 2);\n}\n.ck .ck-fake-panel div:nth-child( 3 ) {\n\tmargin-left: calc(var(--ck-balloon-fake-panel-offset-horizontal) * 3);\n\tmargin-top: calc(var(--ck-balloon-fake-panel-offset-vertical) * 3);\n}\n\n/* If balloon is positioned above element, we need to move fake panel to the top. */\n.ck .ck-balloon-panel_arrow_s + .ck-fake-panel,\n.ck .ck-balloon-panel_arrow_se + .ck-fake-panel,\n.ck .ck-balloon-panel_arrow_sw + .ck-fake-panel {\n\t--ck-balloon-fake-panel-offset-vertical: -6px;\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-sticky-panel .ck-sticky-panel__content_sticky{z-index:var(--ck-z-modal);position:fixed;top:0}.ck.ck-sticky-panel .ck-sticky-panel__content_sticky_bottom-limit{top:auto;position:absolute}.ck.ck-sticky-panel .ck-sticky-panel__content_sticky{box-shadow:var(--ck-drop-shadow),0 0;border-width:0 1px 1px;border-top-left-radius:0;border-top-right-radius:0}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/stickypanel.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/stickypanel.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAMC,qDACC,yBAA0B,CAC1B,cAAe,CACf,KACD,CAEA,kEACC,QAAS,CACT,iBACD,CCPA,qDCCA,oCAA8B,CDE7B,sBAAuB,CACvB,wBAAyB,CACzB,yBACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-sticky-panel {\n\t& .ck-sticky-panel__content_sticky {\n\t\tz-index: var(--ck-z-modal); /* #315 */\n\t\tposition: fixed;\n\t\ttop: 0;\n\t}\n\n\t& .ck-sticky-panel__content_sticky_bottom-limit {\n\t\ttop: auto;\n\t\tposition: absolute;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_shadow.css";\n\n.ck.ck-sticky-panel {\n\t& .ck-sticky-panel__content_sticky {\n\t\t@mixin ck-drop-shadow;\n\n\t\tborder-width: 0 1px 1px;\n\t\tborder-top-left-radius: 0;\n\t\tborder-top-right-radius: 0;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-block-toolbar-button{position:absolute;z-index:var(--ck-z-default)}:root{--ck-color-block-toolbar-button:var(--ck-color-text);--ck-block-toolbar-button-size:var(--ck-font-size-normal)}.ck.ck-block-toolbar-button{color:var(--ck-color-block-toolbar-button);font-size:var(--ck-block-toolbar-size)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/blocktoolbar.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/toolbar/blocktoolbar.css"],names:[],mappings:"AAKA,4BACC,iBAAkB,CAClB,2BACD,CCHA,MACC,oDAAqD,CACrD,yDACD,CAEA,4BACC,0CAA2C,CAC3C,sCACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-block-toolbar-button {\n\tposition: absolute;\n\tz-index: var(--ck-z-default);\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-block-toolbar-button: var(--ck-color-text);\n\t--ck-block-toolbar-button-size: var(--ck-font-size-normal);\n}\n\n.ck.ck-block-toolbar-button {\n\tcolor: var(--ck-color-block-toolbar-button);\n\tfont-size: var(--ck-block-toolbar-size);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-placeholder,.ck .ck-placeholder{position:relative}.ck.ck-placeholder:before,.ck .ck-placeholder:before{position:absolute;left:0;right:0;content:attr(data-placeholder);pointer-events:none}.ck.ck-read-only .ck-placeholder:before{display:none}.ck.ck-placeholder:before,.ck .ck-placeholder:before{cursor:text;color:var(--ck-color-engine-placeholder-text)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-engine/theme/placeholder.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-engine/placeholder.css"],names:[],mappings:"AAMA,uCAEC,iBAWD,CATC,qDACC,iBAAkB,CAClB,MAAO,CACP,OAAQ,CACR,8BAA+B,CAG/B,mBACD,CAKA,wCACC,YACD,CClBA,qDACC,WAAY,CACZ,6CACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* See ckeditor/ckeditor5#936. */\n.ck.ck-placeholder,\n.ck .ck-placeholder {\n\tposition: relative;\n\n\t&::before {\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\tright: 0;\n\t\tcontent: attr(data-placeholder);\n\n\t\t/* See ckeditor/ckeditor5#469. */\n\t\tpointer-events: none;\n\t}\n}\n\n/* See ckeditor/ckeditor5#1987. */\n.ck.ck-read-only .ck-placeholder {\n\t&::before {\n\t\tdisplay: none;\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* See ckeditor/ckeditor5#936. */\n.ck.ck-placeholder, .ck .ck-placeholder {\n\t&::before {\n\t\tcursor: text;\n\t\tcolor: var(--ck-color-engine-placeholder-text);\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-editor{position:relative}.ck.ck-editor .ck-editor__top .ck-sticky-panel .ck-toolbar{z-index:var(--ck-z-modal)}.ck.ck-editor__top .ck-sticky-panel .ck-toolbar{border-radius:0}.ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-toolbar,.ck.ck-editor__top .ck-sticky-panel .ck-toolbar.ck-rounded-corners{border-radius:var(--ck-border-radius);border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-editor__top .ck-sticky-panel .ck-toolbar{border-bottom-width:0}.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content_sticky .ck-toolbar{border-bottom-width:1px;border-radius:0}.ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content_sticky .ck-toolbar,.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content_sticky .ck-toolbar.ck-rounded-corners{border-radius:var(--ck-border-radius);border-radius:0}.ck.ck-editor__main>.ck-editor__editable{background:var(--ck-color-base-background);border-radius:0}.ck-rounded-corners .ck.ck-editor__main>.ck-editor__editable,.ck.ck-editor__main>.ck-editor__editable.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}.ck.ck-editor__main>.ck-editor__editable:not(.ck-focused){border-color:var(--ck-color-base-border)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-editor-classic/theme/classiceditor.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-editor-classic/classiceditor.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAKA,cAIC,iBAMD,CAJC,2DAEC,yBACD,CCLC,gDCED,eDKC,CAPA,uICMA,qCAAsC,CDJpC,2BAA4B,CAC5B,4BAIF,CAPA,gDAMC,qBACD,CAEA,iFACC,uBAAwB,CCR1B,eDaC,CANA,yMCHA,qCAAsC,CDOpC,eAEF,CAKF,yCAEC,0CAA2C,CCpB3C,eD8BD,CAZA,yHCdE,qCAAsC,CDmBtC,wBAAyB,CACzB,yBAMF,CAHC,0DACC,wCACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor {\n\t/* All the elements within `.ck-editor` are positioned relatively to it.\n\t If any element needs to be positioned with respect to the <body>, etc.,\n\t it must land outside of the `.ck-editor` in DOM. */\n\tposition: relative;\n\n\t& .ck-editor__top .ck-sticky-panel .ck-toolbar {\n\t\t/* https://github.com/ckeditor/ckeditor5-editor-classic/issues/62 */\n\t\tz-index: var(--ck-z-modal);\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../mixins/_rounded.css";\n\n.ck.ck-editor__top {\n\t& .ck-sticky-panel {\n\t\t& .ck-toolbar {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\n\t\t\tborder-bottom-width: 0;\n\t\t}\n\n\t\t& .ck-sticky-panel__content_sticky .ck-toolbar {\n\t\t\tborder-bottom-width: 1px;\n\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-radius: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/* Note: Use ck-editor__main to make sure these styles don\'t apply to other editor types */\n.ck.ck-editor__main > .ck-editor__editable {\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/113 */\n\tbackground: var(--ck-color-base-background);\n\n\t@mixin ck-rounded-corners {\n\t\tborder-top-left-radius: 0;\n\t\tborder-top-right-radius: 0;\n\t}\n\n\t&:not(.ck-focused) {\n\t\tborder-color: var(--ck-color-base-border);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,'.ck .ck-widget .ck-widget__type-around__button{display:block;position:absolute;overflow:hidden;z-index:var(--ck-z-default)}.ck .ck-widget .ck-widget__type-around__button svg{position:absolute;top:50%;left:50%;z-index:calc(var(--ck-z-default) + 2)}.ck .ck-widget .ck-widget__type-around__button.ck-widget__type-around__button_before{top:calc(var(--ck-widget-outline-thickness)*-0.5);left:min(10%,30px);transform:translateY(-50%)}.ck .ck-widget .ck-widget__type-around__button.ck-widget__type-around__button_after{bottom:calc(var(--ck-widget-outline-thickness)*-0.5);right:min(10%,30px);transform:translateY(50%)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:after,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover:after{content:"";display:block;position:absolute;top:1px;left:1px;z-index:calc(var(--ck-z-default) + 1)}.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__fake-caret{display:none;position:absolute;left:0;right:0}.ck .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__fake-caret{left:calc(var(--ck-widget-outline-thickness)*-1);right:calc(var(--ck-widget-outline-thickness)*-1)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_before>.ck-widget__type-around>.ck-widget__type-around__fake-caret{top:calc(var(--ck-widget-outline-thickness)*-1 - 1px);display:block}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after>.ck-widget__type-around>.ck-widget__type-around__fake-caret{bottom:calc(var(--ck-widget-outline-thickness)*-1 - 1px);display:block}.ck.ck-editor__editable.ck-read-only .ck-widget__type-around,.ck.ck-editor__editable.ck-restricted-editing_mode_restricted .ck-widget__type-around,.ck.ck-editor__editable.ck-widget__type-around_disabled .ck-widget__type-around{display:none}:root{--ck-widget-type-around-button-size:20px;--ck-color-widget-type-around-button-active:var(--ck-color-focus-border);--ck-color-widget-type-around-button-hover:var(--ck-color-widget-hover-border);--ck-color-widget-type-around-button-blurred-editable:var(--ck-color-widget-blurred-border);--ck-color-widget-type-around-button-radar-start-alpha:0;--ck-color-widget-type-around-button-radar-end-alpha:.3;--ck-color-widget-type-around-button-icon:var(--ck-color-base-background)}.ck .ck-widget .ck-widget__type-around__button{width:var(--ck-widget-type-around-button-size);height:var(--ck-widget-type-around-button-size);background:var(--ck-color-widget-type-around-button);border-radius:100px;transition:opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);opacity:0;pointer-events:none}.ck .ck-widget .ck-widget__type-around__button svg{width:10px;height:8px;transform:translate(-50%,-50%);transition:transform .5s ease;margin-top:1px}.ck .ck-widget .ck-widget__type-around__button svg *{stroke-dasharray:10;stroke-dashoffset:0;fill:none;stroke:var(--ck-color-widget-type-around-button-icon);stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.ck .ck-widget .ck-widget__type-around__button svg line{stroke-dasharray:7}.ck .ck-widget .ck-widget__type-around__button:hover{animation:ck-widget-type-around-button-sonar 1s ease infinite}.ck .ck-widget .ck-widget__type-around__button:hover svg polyline{animation:ck-widget-type-around-arrow-dash 2s linear}.ck .ck-widget .ck-widget__type-around__button:hover svg line{animation:ck-widget-type-around-arrow-tip-dash 2s linear}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__button{opacity:1;pointer-events:auto}.ck .ck-widget:not(.ck-widget_selected)>.ck-widget__type-around>.ck-widget__type-around__button{background:var(--ck-color-widget-type-around-button-hover)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover{background:var(--ck-color-widget-type-around-button-active)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:after,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover:after{width:calc(var(--ck-widget-type-around-button-size) - 2px);height:calc(var(--ck-widget-type-around-button-size) - 2px);border-radius:100px;background:linear-gradient(135deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.3))}.ck .ck-widget.ck-widget_with-selection-handle>.ck-widget__type-around>.ck-widget__type-around__button_before{margin-left:20px}.ck .ck-widget .ck-widget__type-around__fake-caret{pointer-events:none;height:1px;animation:ck-widget-type-around-fake-caret-pulse 1s linear infinite normal forwards;outline:1px solid hsla(0,0%,100%,.5);background:var(--ck-color-base-text)}.ck .ck-widget.ck-widget_selected.ck-widget_type-around_show-fake-caret_after,.ck .ck-widget.ck-widget_selected.ck-widget_type-around_show-fake-caret_before{outline-color:transparent}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_selected:hover,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_selected:hover{outline-color:var(--ck-color-widget-hover-border)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before>.ck-widget__type-around>.ck-widget__type-around__button{opacity:0;pointer-events:none}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle{opacity:0}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_selected.ck-widget_with-resizer>.ck-widget__resizer,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_selected.ck-widget_with-resizer>.ck-widget__resizer{opacity:0}.ck[dir=rtl] .ck-widget.ck-widget_with-selection-handle .ck-widget__type-around>.ck-widget__type-around__button_before{margin-left:0;margin-right:20px}.ck-editor__nested-editable.ck-editor__editable_selected .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck-editor__nested-editable.ck-editor__editable_selected .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__button{opacity:0;pointer-events:none}.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:not(:hover){background:var(--ck-color-widget-type-around-button-blurred-editable)}.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:not(:hover) svg *{stroke:#999}@keyframes ck-widget-type-around-arrow-dash{0%{stroke-dashoffset:10}20%,to{stroke-dashoffset:0}}@keyframes ck-widget-type-around-arrow-tip-dash{0%,20%{stroke-dashoffset:7}40%,to{stroke-dashoffset:0}}@keyframes ck-widget-type-around-button-sonar{0%{box-shadow:0 0 0 0 hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-start-alpha))}50%{box-shadow:0 0 0 5px hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-end-alpha))}to{box-shadow:0 0 0 5px hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-start-alpha))}}@keyframes ck-widget-type-around-fake-caret-pulse{0%{opacity:1}49%{opacity:1}50%{opacity:0}99%{opacity:0}to{opacity:1}}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-widget/theme/widgettypearound.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-widget/widgettypearound.css"],names:[],mappings:"AASC,+CACC,aAAc,CACd,iBAAkB,CAClB,eAAgB,CAChB,2BAwBD,CAtBC,mDACC,iBAAkB,CAClB,OAAQ,CACR,QAAS,CACT,qCACD,CAEA,qFAEC,iDAAoD,CACpD,kBAAoB,CAEpB,0BACD,CAEA,oFAEC,oDAAuD,CACvD,mBAAqB,CAErB,yBACD,CAUA,mLACC,UAAW,CACX,aAAc,CACd,iBAAkB,CAClB,OAAQ,CACR,QAAS,CACT,qCACD,CAMD,2EACC,YAAa,CACb,iBAAkB,CAClB,MAAO,CACP,OACD,CAOA,iFACC,gDAAqD,CACrD,iDACD,CAKA,wHACC,qDAA0D,CAC1D,aACD,CAKA,uHACC,wDAA6D,CAC7D,aACD,CAoBD,mOACC,YACD,CC3GA,MACC,wCAAyC,CACzC,wEAAyE,CACzE,8EAA+E,CAC/E,2FAA4F,CAC5F,wDAAyD,CACzD,uDAAwD,CACxD,yEACD,CAgBC,+CACC,8CAA+C,CAC/C,+CAAgD,CAChD,oDAAqD,CACrD,mBAAoB,CACpB,uMAAyM,CAb1M,SAAU,CACV,mBA0DA,CA1CC,mDACC,UAAW,CACX,UAAW,CACX,8BAA+B,CAC/B,6BAA8B,CAC9B,cAgBD,CAdC,qDACC,mBAAoB,CACpB,mBAAoB,CAEpB,SAAU,CACV,qDAAsD,CACtD,kBAAmB,CACnB,oBAAqB,CACrB,qBACD,CAEA,wDACC,kBACD,CAGD,qDAIC,6DAcD,CARE,kEACC,oDACD,CAEA,8DACC,wDACD,CAUF,uKAvED,SAAU,CACV,mBAwEC,CAOD,gGACC,0DACD,CAOA,uKAEC,2DAQD,CANC,mLACC,0DAA2D,CAC3D,2DAA4D,CAC5D,mBAAoB,CACpB,uEACD,CAOD,8GACC,gBACD,CAKA,mDACC,mBAAoB,CACpB,UAAW,CACX,mFAAoF,CAMpF,oCAAwC,CACxC,oCACD,CAOC,6JAEC,yBACD,CAUA,yKACC,iDACD,CAMA,uOAlJD,SAAU,CACV,mBAmJC,CASE,0jBACC,SACD,CASF,mPACC,SACD,CASF,uHACC,aAAc,CACd,iBACD,CAYG,iRAlMF,SAAU,CACV,mBAmME,CAQH,kIACC,qEAKD,CAHC,wIACC,WACD,CAGD,4CACC,GACC,oBACD,CACA,OACC,mBACD,CACD,CAEA,gDACC,OACC,mBACD,CACA,OACC,mBACD,CACD,CAEA,8CACC,GACC,6HACD,CACA,IACC,6HACD,CACA,GACC,+HACD,CACD,CAEA,kDACC,GACC,SACD,CACA,IACC,SACD,CACA,IACC,SACD,CACA,IACC,SACD,CACA,GACC,SACD,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-widget {\n\t/*\n\t * Styles of the type around buttons\n\t */\n\t& .ck-widget__type-around__button {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\toverflow: hidden;\n\t\tz-index: var(--ck-z-default);\n\n\t\t& svg {\n\t\t\tposition: absolute;\n\t\t\ttop: 50%;\n\t\t\tleft: 50%;\n\t\t\tz-index: calc(var(--ck-z-default) + 2);\n\t\t}\n\n\t\t&.ck-widget__type-around__button_before {\n\t\t\t/* Place it in the middle of the outline */\n\t\t\ttop: calc(-0.5 * var(--ck-widget-outline-thickness));\n\t\t\tleft: min(10%, 30px);\n\n\t\t\ttransform: translateY(-50%);\n\t\t}\n\n\t\t&.ck-widget__type-around__button_after {\n\t\t\t/* Place it in the middle of the outline */\n\t\t\tbottom: calc(-0.5 * var(--ck-widget-outline-thickness));\n\t\t\tright: min(10%, 30px);\n\n\t\t\ttransform: translateY(50%);\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the buttons when:\n\t * - the widget is selected,\n\t * - or the button is being hovered (regardless of the widget state).\n\t */\n\t&.ck-widget_selected > .ck-widget__type-around > .ck-widget__type-around__button,\n\t& > .ck-widget__type-around > .ck-widget__type-around__button:hover {\n\t\t&::after {\n\t\t\tcontent: "";\n\t\t\tdisplay: block;\n\t\t\tposition: absolute;\n\t\t\ttop: 1px;\n\t\t\tleft: 1px;\n\t\t\tz-index: calc(var(--ck-z-default) + 1);\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" which is displayed when the user navigates using the keyboard.\n\t */\n\t& > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\tdisplay: none;\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\tright: 0;\n\t}\n\n\t/*\n\t * When the widget is hovered the "fake caret" would normally be narrower than the\n\t * extra outline displayed around the widget. Let\'s extend the "fake caret" to match\n\t * the full width of the widget.\n\t */\n\t&:hover > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\tleft: calc( -1 * var(--ck-widget-outline-thickness) );\n\t\tright: calc( -1 * var(--ck-widget-outline-thickness) );\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" when it should be displayed before the widget (backward keyboard navigation).\n\t */\n\t&.ck-widget_type-around_show-fake-caret_before > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\ttop: calc( -1 * var(--ck-widget-outline-thickness) - 1px );\n\t\tdisplay: block;\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" when it should be displayed after the widget (forward keyboard navigation).\n\t */\n\t&.ck-widget_type-around_show-fake-caret_after > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\tbottom: calc( -1 * var(--ck-widget-outline-thickness) - 1px );\n\t\tdisplay: block;\n\t}\n}\n\n/*\n * Integration with the read-only mode of the editor.\n */\n.ck.ck-editor__editable.ck-read-only .ck-widget__type-around {\n\tdisplay: none;\n}\n\n/*\n * Integration with the restricted editing mode (feature) of the editor.\n */\n.ck.ck-editor__editable.ck-restricted-editing_mode_restricted .ck-widget__type-around {\n\tdisplay: none;\n}\n\n/*\n * Integration with the #isEnabled property of the WidgetTypeAround plugin.\n */\n.ck.ck-editor__editable.ck-widget__type-around_disabled .ck-widget__type-around {\n\tdisplay: none;\n}\n','/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-widget-type-around-button-size: 20px;\n\t--ck-color-widget-type-around-button-active: var(--ck-color-focus-border);\n\t--ck-color-widget-type-around-button-hover: var(--ck-color-widget-hover-border);\n\t--ck-color-widget-type-around-button-blurred-editable: var(--ck-color-widget-blurred-border);\n\t--ck-color-widget-type-around-button-radar-start-alpha: 0;\n\t--ck-color-widget-type-around-button-radar-end-alpha: .3;\n\t--ck-color-widget-type-around-button-icon: var(--ck-color-base-background);\n}\n\n@define-mixin ck-widget-type-around-button-visible {\n\topacity: 1;\n\tpointer-events: auto;\n}\n\n@define-mixin ck-widget-type-around-button-hidden {\n\topacity: 0;\n\tpointer-events: none;\n}\n\n.ck .ck-widget {\n\t/*\n\t * Styles of the type around buttons\n\t */\n\t& .ck-widget__type-around__button {\n\t\twidth: var(--ck-widget-type-around-button-size);\n\t\theight: var(--ck-widget-type-around-button-size);\n\t\tbackground: var(--ck-color-widget-type-around-button);\n\t\tborder-radius: 100px;\n\t\ttransition: opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve), background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\n\n\t\t@mixin ck-widget-type-around-button-hidden;\n\n\t\t& svg {\n\t\t\twidth: 10px;\n\t\t\theight: 8px;\n\t\t\ttransform: translate(-50%,-50%);\n\t\t\ttransition: transform .5s ease;\n\t\t\tmargin-top: 1px;\n\n\t\t\t& * {\n\t\t\t\tstroke-dasharray: 10;\n\t\t\t\tstroke-dashoffset: 0;\n\n\t\t\t\tfill: none;\n\t\t\t\tstroke: var(--ck-color-widget-type-around-button-icon);\n\t\t\t\tstroke-width: 1.5px;\n\t\t\t\tstroke-linecap: round;\n\t\t\t\tstroke-linejoin: round;\n\t\t\t}\n\n\t\t\t& line {\n\t\t\t\tstroke-dasharray: 7;\n\t\t\t}\n\t\t}\n\n\t\t&:hover {\n\t\t\t/*\n\t\t\t * Display the "sonar" around the button when hovered.\n\t\t\t */\n\t\t\tanimation: ck-widget-type-around-button-sonar 1s ease infinite;\n\n\t\t\t/*\n\t\t\t * Animate active button\'s icon.\n\t\t\t */\n\t\t\t& svg {\n\t\t\t\t& polyline {\n\t\t\t\t\tanimation: ck-widget-type-around-arrow-dash 2s linear;\n\t\t\t\t}\n\n\t\t\t\t& line {\n\t\t\t\t\tanimation: ck-widget-type-around-arrow-tip-dash 2s linear;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t * Show type around buttons when the widget gets selected or being hovered.\n\t */\n\t&.ck-widget_selected,\n\t&:hover {\n\t\t& > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\t\t@mixin ck-widget-type-around-button-visible;\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the buttons when the widget is NOT selected (but the buttons are visible\n\t * and still can be hovered).\n\t */\n\t&:not(.ck-widget_selected) > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\tbackground: var(--ck-color-widget-type-around-button-hover);\n\t}\n\n\t/*\n\t * Styles for the buttons when:\n\t * - the widget is selected,\n\t * - or the button is being hovered (regardless of the widget state).\n\t */\n\t&.ck-widget_selected > .ck-widget__type-around > .ck-widget__type-around__button,\n\t& > .ck-widget__type-around > .ck-widget__type-around__button:hover {\n\t\tbackground: var(--ck-color-widget-type-around-button-active);\n\n\t\t&::after {\n\t\t\twidth: calc(var(--ck-widget-type-around-button-size) - 2px);\n\t\t\theight: calc(var(--ck-widget-type-around-button-size) - 2px);\n\t\t\tborder-radius: 100px;\n\t\t\tbackground: linear-gradient(135deg, hsla(0,0%,100%,0) 0%, hsla(0,0%,100%,.3) 100%);\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the "before" button when the widget has a selection handle. Because some space\n\t * is consumed by the handle, the button must be moved slightly to the right to let it breathe.\n\t */\n\t&.ck-widget_with-selection-handle > .ck-widget__type-around > .ck-widget__type-around__button_before {\n\t\tmargin-left: 20px;\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" which is displayed when the user navigates using the keyboard.\n\t */\n\t& .ck-widget__type-around__fake-caret {\n\t\tpointer-events: none;\n\t\theight: 1px;\n\t\tanimation: ck-widget-type-around-fake-caret-pulse linear 1s infinite normal forwards;\n\n\t\t/*\n\t\t * The semi-transparent-outline+background combo improves the contrast\n\t\t * when the background underneath the fake caret is dark.\n\t\t */\n\t\toutline: solid 1px hsla(0, 0%, 100%, .5);\n\t\tbackground: var(--ck-color-base-text);\n\t}\n\n\t/*\n\t * Styles of the widget when the "fake caret" is blinking (e.g. upon keyboard navigation).\n\t * Despite the widget being physically selected in the model, its outline should disappear.\n\t */\n\t&.ck-widget_selected {\n\t\t&.ck-widget_type-around_show-fake-caret_before,\n\t\t&.ck-widget_type-around_show-fake-caret_after {\n\t\t\toutline-color: transparent;\n\t\t}\n\t}\n\n\t&.ck-widget_type-around_show-fake-caret_before,\n\t&.ck-widget_type-around_show-fake-caret_after {\n\t\t/*\n\t\t * When the "fake caret" is visible we simulate that the widget is not selected\n\t\t * (despite being physically selected), so the outline color should be for the\n\t\t * unselected widget.\n\t\t */\n\t\t&.ck-widget_selected:hover {\n\t\t\toutline-color: var(--ck-color-widget-hover-border);\n\t\t}\n\n\t\t/*\n\t\t * Styles of the type around buttons when the "fake caret" is blinking (e.g. upon keyboard navigation).\n\t\t * In this state, the type around buttons would collide with the fake carets so they should disappear.\n\t\t */\n\t\t& > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\t\t@mixin ck-widget-type-around-button-hidden;\n\t\t}\n\n\t\t/*\n\t\t * Fake horizontal caret integration with the selection handle. When the caret is visible, simply\n\t\t * hide the handle because it intersects with the caret (and does not make much sense anyway).\n\t\t */\n\t\t&.ck-widget_with-selection-handle {\n\t\t\t&.ck-widget_selected,\n\t\t\t&.ck-widget_selected:hover {\n\t\t\t\t& > .ck-widget__selection-handle {\n\t\t\t\t\topacity: 0\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t * Fake horizontal caret integration with the resize UI. When the caret is visible, simply\n\t\t * hide the resize UI because it creates too much noise. It can be visible when the user\n\t\t * hovers the widget, though.\n\t\t */\n\t\t&.ck-widget_selected.ck-widget_with-resizer > .ck-widget__resizer {\n\t\t\topacity: 0\n\t\t}\n\t}\n}\n\n/*\n * Styles for the "before" button when the widget has a selection handle in an RTL environment.\n * The selection handler is aligned to the right side of the widget so there is no need to create\n * additional space for it next to the "before" button.\n */\n.ck[dir="rtl"] .ck-widget.ck-widget_with-selection-handle .ck-widget__type-around > .ck-widget__type-around__button_before {\n\tmargin-left: 0;\n\tmargin-right: 20px;\n}\n\n/*\n * Hide type around buttons when the widget is selected as a child of a selected\n * nested editable (e.g. mulit-cell table selection).\n *\n * See https://github.com/ckeditor/ckeditor5/issues/7263.\n */\n.ck-editor__nested-editable.ck-editor__editable_selected {\n\t& .ck-widget {\n\t\t&.ck-widget_selected,\n\t\t&:hover {\n\t\t\t& > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\t\t\t@mixin ck-widget-type-around-button-hidden;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/*\n * Styles for the buttons when the widget is selected but the user clicked outside of the editor (blurred the editor).\n */\n.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected > .ck-widget__type-around > .ck-widget__type-around__button:not(:hover) {\n\tbackground: var(--ck-color-widget-type-around-button-blurred-editable);\n\n\t& svg * {\n\t\tstroke: hsl(0,0%,60%);\n\t}\n}\n\n@keyframes ck-widget-type-around-arrow-dash {\n\t0% {\n\t\tstroke-dashoffset: 10;\n\t}\n\t20%, 100% {\n\t\tstroke-dashoffset: 0;\n\t}\n}\n\n@keyframes ck-widget-type-around-arrow-tip-dash {\n\t0%, 20% {\n\t\tstroke-dashoffset: 7;\n\t}\n\t40%, 100% {\n\t\tstroke-dashoffset: 0;\n\t}\n}\n\n@keyframes ck-widget-type-around-button-sonar {\n\t0% {\n\t\tbox-shadow: 0 0 0 0 hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-start-alpha));\n\t}\n\t50% {\n\t\tbox-shadow: 0 0 0 5px hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-end-alpha));\n\t}\n\t100% {\n\t\tbox-shadow: 0 0 0 5px hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-start-alpha));\n\t}\n}\n\n@keyframes ck-widget-type-around-fake-caret-pulse {\n\t0% {\n\t\topacity: 1;\n\t}\n\t49% {\n\t\topacity: 1;\n\t}\n\t50% {\n\t\topacity: 0;\n\t}\n\t99% {\n\t\topacity: 0;\n\t}\n\t100% {\n\t\topacity: 1;\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,":root{--ck-color-resizer:var(--ck-color-focus-border);--ck-color-resizer-tooltip-background:#262626;--ck-color-resizer-tooltip-text:#f2f2f2;--ck-resizer-border-radius:var(--ck-border-radius);--ck-resizer-tooltip-offset:10px}.ck .ck-widget,.ck .ck-widget.ck-widget_with-selection-handle{position:relative}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{position:absolute}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon{display:block}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected .ck-widget__selection-handle,.ck .ck-widget.ck-widget_with-selection-handle:hover .ck-widget__selection-handle{visibility:visible}.ck .ck-size-view{background:var(--ck-color-resizer-tooltip-background);color:var(--ck-color-resizer-tooltip-text);border:1px solid var(--ck-color-resizer-tooltip-text);border-radius:var(--ck-resizer-border-radius);font-size:var(--ck-font-size-tiny);display:block;padding:var(--ck-spacing-small)}.ck .ck-size-view.ck-orientation-bottom-left,.ck .ck-size-view.ck-orientation-bottom-right,.ck .ck-size-view.ck-orientation-top-left,.ck .ck-size-view.ck-orientation-top-right{position:absolute}.ck .ck-size-view.ck-orientation-top-left{top:var(--ck-resizer-tooltip-offset);left:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-top-right{top:var(--ck-resizer-tooltip-offset);right:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-bottom-right{bottom:var(--ck-resizer-tooltip-offset);right:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-bottom-left{bottom:var(--ck-resizer-tooltip-offset);left:var(--ck-resizer-tooltip-offset)}:root{--ck-widget-outline-thickness:3px;--ck-widget-handler-icon-size:16px;--ck-widget-handler-animation-duration:200ms;--ck-widget-handler-animation-curve:ease;--ck-color-widget-blurred-border:#dedede;--ck-color-widget-hover-border:#ffc83d;--ck-color-widget-editable-focus-background:var(--ck-color-base-background);--ck-color-widget-drag-handler-icon-color:var(--ck-color-base-background)}.ck .ck-widget{outline-width:var(--ck-widget-outline-thickness);outline-style:solid;outline-color:transparent;transition:outline-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve)}.ck .ck-widget.ck-widget_selected,.ck .ck-widget.ck-widget_selected:hover{outline:var(--ck-widget-outline-thickness) solid var(--ck-color-focus-border)}.ck .ck-widget:hover{outline-color:var(--ck-color-widget-hover-border)}.ck .ck-editor__nested-editable{border:1px solid transparent}.ck .ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck .ck-editor__nested-editable:focus{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0;background-color:var(--ck-color-widget-editable-focus-background)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{padding:4px;box-sizing:border-box;background-color:transparent;opacity:0;transition:background-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),visibility var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);border-radius:var(--ck-border-radius) var(--ck-border-radius) 0 0;transform:translateY(-100%);left:calc(0px - var(--ck-widget-outline-thickness))}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon{width:var(--ck-widget-handler-icon-size);height:var(--ck-widget-handler-icon-size);color:var(--ck-color-widget-drag-handler-icon-color)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator{opacity:0;transition:opacity .3s var(--ck-widget-handler-animation-curve)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle:hover .ck-icon .ck-icon__selected-indicator{opacity:1}.ck .ck-widget.ck-widget_with-selection-handle:hover .ck-widget__selection-handle{opacity:1;background-color:var(--ck-color-widget-hover-border)}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected .ck-widget__selection-handle,.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected:hover .ck-widget__selection-handle{opacity:1;background-color:var(--ck-color-focus-border)}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected .ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator,.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected:hover .ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator{opacity:1}.ck[dir=rtl] .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{left:auto;right:calc(0px - var(--ck-widget-outline-thickness))}.ck.ck-editor__editable.ck-read-only .ck-widget{transition:none}.ck.ck-editor__editable.ck-read-only .ck-widget:not(.ck-widget_selected){--ck-widget-outline-thickness:0px}.ck.ck-editor__editable.ck-read-only .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle,.ck.ck-editor__editable.ck-read-only .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle:hover{background:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected:hover{outline-color:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle .ck-widget__selection-handle,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle .ck-widget__selection-handle:hover,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected:hover.ck-widget_with-selection-handle .ck-widget__selection-handle,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected:hover.ck-widget_with-selection-handle .ck-widget__selection-handle:hover{background:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable>.ck-widget.ck-widget_with-selection-handle:first-child,.ck.ck-editor__editable blockquote>.ck-widget.ck-widget_with-selection-handle:first-child{margin-top:calc(1em + var(--ck-widget-handler-icon-size))}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-widget/theme/widget.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-widget/widget.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAKA,MACC,+CAAgD,CAChD,6CAAsD,CACtD,uCAAgD,CAEhD,kDAAmD,CACnD,gCACD,CAOA,8DAEC,iBAuBD,CArBC,4EACC,iBAOD,CALC,qFAGC,aACD,CAWD,iLACC,kBACD,CAGD,kBACC,qDAAsD,CACtD,0CAA2C,CAC3C,qDAAsD,CACtD,6CAA8C,CAC9C,kCAAmC,CACnC,aAAc,CACd,+BA4BD,CA1BC,gLAIC,iBACD,CAEA,0CACC,oCAAqC,CACrC,qCACD,CAEA,2CACC,oCAAqC,CACrC,sCACD,CAEA,8CACC,uCAAwC,CACxC,sCACD,CAEA,6CACC,uCAAwC,CACxC,qCACD,CCxED,MACC,iCAAkC,CAClC,kCAAmC,CACnC,4CAA6C,CAC7C,wCAAyC,CAEzC,wCAAiD,CACjD,sCAAkD,CAClD,2EAA4E,CAC5E,yEACD,CAEA,eACC,gDAAiD,CACjD,mBAAoB,CACpB,yBAA0B,CAC1B,6GAUD,CARC,0EAEC,6EACD,CAEA,qBACC,iDACD,CAGD,gCACC,4BAWD,CAPC,yGC/BA,YAAa,CACb,2BAA2B,CCF3B,qCAA8B,CFqC7B,iEACD,CAIA,4EACC,WAAY,CACZ,qBAAsB,CAGtB,4BAA6B,CAC7B,SAAU,CAMV,6SAG6F,CAG7F,iEAAkE,CAGlE,2BAA4B,CAC5B,mDAqBD,CAnBC,qFAEC,wCAAyC,CACzC,yCAA0C,CAC1C,oDASD,CANC,kHACC,SAAU,CAGV,+DACD,CAID,wHACC,SACD,CAID,kFACC,SAAU,CACV,oDACD,CAKC,oMACC,SAAU,CACV,6CAMD,CAHC,gRACC,SACD,CAOH,qFACC,SAAU,CACV,oDACD,CAGA,gDAEC,eAkBD,CAhBC,yEAOC,iCACD,CAGC,gOAEC,gDACD,CAOD,wIAEC,mDAQD,CALE,ghBAEC,gDACD,CAKH,yKAOC,yDACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-resizer: var(--ck-color-focus-border);\n\t--ck-color-resizer-tooltip-background: hsl(0, 0%, 15%);\n\t--ck-color-resizer-tooltip-text: hsl(0, 0%, 95%);\n\n\t--ck-resizer-border-radius: var(--ck-border-radius);\n\t--ck-resizer-tooltip-offset: 10px;\n}\n\n.ck .ck-widget {\n\t/* This is neccessary for type around UI to be positioned properly. */\n\tposition: relative;\n}\n\n.ck .ck-widget.ck-widget_with-selection-handle {\n\t/* Make the widget wrapper a relative positioning container for the drag handle. */\n\tposition: relative;\n\n\t& .ck-widget__selection-handle {\n\t\tposition: absolute;\n\n\t\t& .ck-icon {\n\t\t\t/* Make sure the icon in not a subject to font-size or line-height to avoid\n\t\t\tunnecessary spacing around it. */\n\t\t\tdisplay: block;\n\t\t}\n\t}\n\n\t/* Show the selection handle on mouse hover over the widget. */\n\t&:hover {\n\t\t& .ck-widget__selection-handle {\n\t\t\tvisibility: visible;\n\t\t}\n\t}\n\n\t/* Show the selection handle when the widget is selected. */\n\t&.ck-widget_selected .ck-widget__selection-handle {\n\t\tvisibility: visible;\n\t}\n}\n\n.ck .ck-size-view {\n\tbackground: var(--ck-color-resizer-tooltip-background);\n\tcolor: var(--ck-color-resizer-tooltip-text);\n\tborder: 1px solid var(--ck-color-resizer-tooltip-text);\n\tborder-radius: var(--ck-resizer-border-radius);\n\tfont-size: var(--ck-font-size-tiny);\n\tdisplay: block;\n\tpadding: var(--ck-spacing-small);\n\n\t&.ck-orientation-top-left,\n\t&.ck-orientation-top-right,\n\t&.ck-orientation-bottom-right,\n\t&.ck-orientation-bottom-left {\n\t\tposition: absolute;\n\t}\n\n\t&.ck-orientation-top-left {\n\t\ttop: var(--ck-resizer-tooltip-offset);\n\t\tleft: var(--ck-resizer-tooltip-offset);\n\t}\n\n\t&.ck-orientation-top-right {\n\t\ttop: var(--ck-resizer-tooltip-offset);\n\t\tright: var(--ck-resizer-tooltip-offset);\n\t}\n\n\t&.ck-orientation-bottom-right {\n\t\tbottom: var(--ck-resizer-tooltip-offset);\n\t\tright: var(--ck-resizer-tooltip-offset);\n\t}\n\n\t&.ck-orientation-bottom-left {\n\t\tbottom: var(--ck-resizer-tooltip-offset);\n\t\tleft: var(--ck-resizer-tooltip-offset);\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../mixins/_focus.css";\n@import "../mixins/_shadow.css";\n\n:root {\n\t--ck-widget-outline-thickness: 3px;\n\t--ck-widget-handler-icon-size: 16px;\n\t--ck-widget-handler-animation-duration: 200ms;\n\t--ck-widget-handler-animation-curve: ease;\n\n\t--ck-color-widget-blurred-border: hsl(0, 0%, 87%);\n\t--ck-color-widget-hover-border: hsl(43, 100%, 62%);\n\t--ck-color-widget-editable-focus-background: var(--ck-color-base-background);\n\t--ck-color-widget-drag-handler-icon-color: var(--ck-color-base-background);\n}\n\n.ck .ck-widget {\n\toutline-width: var(--ck-widget-outline-thickness);\n\toutline-style: solid;\n\toutline-color: transparent;\n\ttransition: outline-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\n\n\t&.ck-widget_selected,\n\t&.ck-widget_selected:hover {\n\t\toutline: var(--ck-widget-outline-thickness) solid var(--ck-color-focus-border);\n\t}\n\n\t&:hover {\n\t\toutline-color: var(--ck-color-widget-hover-border);\n\t}\n}\n\n.ck .ck-editor__nested-editable {\n\tborder: 1px solid transparent;\n\n\t/* The :focus style is applied before .ck-editor__nested-editable_focused class is rendered in the view.\n\tThese styles show a different border for a blink of an eye, so `:focus` need to have same styles applied. */\n\t&.ck-editor__nested-editable_focused,\n\t&:focus {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-inner-shadow);\n\n\t\tbackground-color: var(--ck-color-widget-editable-focus-background);\n\t}\n}\n\n.ck .ck-widget.ck-widget_with-selection-handle {\n\t& .ck-widget__selection-handle {\n\t\tpadding: 4px;\n\t\tbox-sizing: border-box;\n\n\t\t/* Background and opacity will be animated as the handler shows up or the widget gets selected. */\n\t\tbackground-color: transparent;\n\t\topacity: 0;\n\n\t\t/* Transition:\n\t\t * background-color for the .ck-widget_selected state change,\n\t\t * visibility for hiding the handler,\n\t\t * opacity for the proper look of the icon when the handler disappears. */\n\t\ttransition:\n\t\t\tbackground-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),\n\t\t\tvisibility var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),\n\t\t\topacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\n\n\t\t/* Make only top corners round. */\n\t\tborder-radius: var(--ck-border-radius) var(--ck-border-radius) 0 0;\n\n\t\t/* Place the drag handler outside the widget wrapper. */\n\t\ttransform: translateY(-100%);\n\t\tleft: calc(0px - var(--ck-widget-outline-thickness));\n\n\t\t& .ck-icon {\n\t\t\t/* Make sure the dimensions of the icon are independent of the fon-size of the content. */\n\t\t\twidth: var(--ck-widget-handler-icon-size);\n\t\t\theight: var(--ck-widget-handler-icon-size);\n\t\t\tcolor: var(--ck-color-widget-drag-handler-icon-color);\n\n\t\t\t/* The "selected" part of the icon is invisible by default */\n\t\t\t& .ck-icon__selected-indicator {\n\t\t\t\topacity: 0;\n\n\t\t\t\t/* Note: The animation is longer on purpose. Simply feels better. */\n\t\t\t\ttransition: opacity 300ms var(--ck-widget-handler-animation-curve);\n\t\t\t}\n\t\t}\n\n\t\t/* Advertise using the look of the icon that once clicked the handler, the widget will be selected. */\n\t\t&:hover .ck-icon .ck-icon__selected-indicator {\n\t\t\topacity: 1;\n\t\t}\n\t}\n\n\t/* Show the selection handler on mouse hover over the widget. */\n\t&:hover .ck-widget__selection-handle {\n\t\topacity: 1;\n\t\tbackground-color: var(--ck-color-widget-hover-border);\n\t}\n\n\t/* Show the selection handler when the widget is selected. */\n\t&.ck-widget_selected,\n\t&.ck-widget_selected:hover {\n\t\t& .ck-widget__selection-handle {\n\t\t\topacity: 1;\n\t\t\tbackground-color: var(--ck-color-focus-border);\n\n\t\t\t/* When the widget is selected, notify the user using the proper look of the icon. */\n\t\t\t& .ck-icon .ck-icon__selected-indicator {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/* In a RTL environment, align the selection handler to the right side of the widget */\n/* stylelint-disable-next-line no-descending-specificity */\n.ck[dir="rtl"] .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle {\n\tleft: auto;\n\tright: calc(0px - var(--ck-widget-outline-thickness));\n}\n\n/* https://github.com/ckeditor/ckeditor5/issues/6415 */\n.ck.ck-editor__editable.ck-read-only .ck-widget {\n\t/* Prevent the :hover outline from showing up because of the used outline-color transition. */\n\ttransition: none;\n\n\t&:not(.ck-widget_selected) {\n\t\t/* Disable visual effects of hover/active widget when CKEditor is in readOnly mode.\n\t\t * See: https://github.com/ckeditor/ckeditor5/issues/1261\n\t\t *\n\t\t * Leave the unit because this custom property is used in calc() by other features.\n\t\t * See: https://github.com/ckeditor/ckeditor5/issues/6775\n\t\t */\n\t\t--ck-widget-outline-thickness: 0px;\n\t}\n\n\t&.ck-widget_with-selection-handle {\n\t\t& .ck-widget__selection-handle,\n\t\t& .ck-widget__selection-handle:hover {\n\t\t\tbackground: var(--ck-color-widget-blurred-border);\n\t\t}\n\t}\n}\n\n/* Style the widget when it\'s selected but the editable it belongs to lost focus. */\n/* stylelint-disable-next-line no-descending-specificity */\n.ck.ck-editor__editable.ck-blurred .ck-widget {\n\t&.ck-widget_selected,\n\t&.ck-widget_selected:hover {\n\t\toutline-color: var(--ck-color-widget-blurred-border);\n\n\t\t&.ck-widget_with-selection-handle {\n\t\t\t& .ck-widget__selection-handle,\n\t\t\t& .ck-widget__selection-handle:hover {\n\t\t\t\tbackground: var(--ck-color-widget-blurred-border);\n\t\t\t}\n\t\t}\n\t}\n}\n\n.ck.ck-editor__editable > .ck-widget.ck-widget_with-selection-handle:first-child,\n.ck.ck-editor__editable blockquote > .ck-widget.ck-widget_with-selection-handle:first-child {\n\t/* Do not crop selection handler if a widget is a first-child in the blockquote or in the root editable.\n\tIn fact, anything with overflow: hidden.\n\thttps://github.com/ckeditor/ckeditor5-block-quote/issues/28\n\thttps://github.com/ckeditor/ckeditor5-widget/issues/44\n\thttps://github.com/ckeditor/ckeditor5-widget/issues/66 */\n\tmargin-top: calc(1em + var(--ck-widget-handler-icon-size));\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,'.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position{display:inline;position:relative;pointer-events:none}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span{position:absolute;width:0}.ck.ck-editor__editable .ck-widget:-webkit-drag>.ck-widget__selection-handle,.ck.ck-editor__editable .ck-widget:-webkit-drag>.ck-widget__type-around{display:none}:root{--ck-clipboard-drop-target-dot-width:12px;--ck-clipboard-drop-target-dot-height:8px;--ck-clipboard-drop-target-color:var(--ck-color-focus-border)}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span{bottom:calc(var(--ck-clipboard-drop-target-dot-height)*-0.5);top:calc(var(--ck-clipboard-drop-target-dot-height)*-0.5);border:1px solid var(--ck-clipboard-drop-target-color);background:var(--ck-clipboard-drop-target-color);margin-left:-1px}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span:after{content:"";width:0;height:0;display:block;position:absolute;left:50%;top:calc(var(--ck-clipboard-drop-target-dot-height)*-0.5);transform:translateX(-50%);border-left:calc(var(--ck-clipboard-drop-target-dot-width)*0.5) solid transparent;border-bottom:0 solid transparent;border-right:calc(var(--ck-clipboard-drop-target-dot-width)*0.5) solid transparent;border-top:calc(var(--ck-clipboard-drop-target-dot-height)) solid var(--ck-clipboard-drop-target-color)}.ck.ck-editor__editable .ck-widget.ck-clipboard-drop-target-range{outline:var(--ck-widget-outline-thickness) solid var(--ck-clipboard-drop-target-color)!important}.ck.ck-editor__editable .ck-widget:-webkit-drag{zoom:.6;outline:none!important}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-clipboard/theme/clipboard.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-clipboard/clipboard.css"],names:[],mappings:"AASC,8DACC,cAAe,CACf,iBAAkB,CAClB,mBAMD,CAJC,mEACC,iBAAkB,CAClB,OACD,CAWA,qJACC,YACD,CCzBF,MACC,yCAA0C,CAC1C,yCAA0C,CAC1C,6DACD,CAOE,mEACC,4DAA8D,CAC9D,yDAA2D,CAC3D,sDAAuD,CACvD,gDAAiD,CACjD,gBAkBD,CAfC,yEACC,UAAW,CACX,OAAQ,CACR,QAAS,CAET,aAAc,CACd,iBAAkB,CAClB,QAAS,CACT,yDAA2D,CAE3D,0BAA2B,CAG3B,iFAAmB,CAAnB,iCAAmB,CAAnB,kFAAmB,CAAnB,uGACD,CA2DF,kEACC,gGACD,CAKA,gDACC,OAAS,CACT,sBACD",sourcesContent:["/*\n * Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor__editable {\n\t/*\n\t * Vertical drop target (in text).\n\t */\n\t& .ck.ck-clipboard-drop-target-position {\n\t\tdisplay: inline;\n\t\tposition: relative;\n\t\tpointer-events: none;\n\n\t\t& span {\n\t\t\tposition: absolute;\n\t\t\twidth: 0;\n\t\t}\n\t}\n\n\t/*\n\t * Styles of the widget being dragged (its preview).\n\t */\n\t& .ck-widget:-webkit-drag {\n\t\t& > .ck-widget__selection-handle {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t& > .ck-widget__type-around {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n",'/*\n * Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-clipboard-drop-target-dot-width: 12px;\n\t--ck-clipboard-drop-target-dot-height: 8px;\n\t--ck-clipboard-drop-target-color: var(--ck-color-focus-border)\n}\n\n.ck.ck-editor__editable {\n\t/*\n\t * Vertical drop target (in text).\n\t */\n\t& .ck.ck-clipboard-drop-target-position {\n\t\t& span {\n\t\t\tbottom: calc(-.5 * var(--ck-clipboard-drop-target-dot-height));\n\t\t\ttop: calc(-.5 * var(--ck-clipboard-drop-target-dot-height));\n\t\t\tborder: 1px solid var(--ck-clipboard-drop-target-color);\n\t\t\tbackground: var(--ck-clipboard-drop-target-color);\n\t\t\tmargin-left: -1px;\n\n\t\t\t/* The triangle above the marker */\n\t\t\t&::after {\n\t\t\t\tcontent: "";\n\t\t\t\twidth: 0;\n\t\t\t\theight: 0;\n\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 50%;\n\t\t\t\ttop: calc(var(--ck-clipboard-drop-target-dot-height) * -.5);\n\n\t\t\t\ttransform: translateX(-50%);\n\t\t\t\tborder-color: var(--ck-clipboard-drop-target-color) transparent transparent transparent;\n\t\t\t\tborder-width: calc(var(--ck-clipboard-drop-target-dot-height)) calc(.5 * var(--ck-clipboard-drop-target-dot-width)) 0 calc(.5 * var(--ck-clipboard-drop-target-dot-width));\n\t\t\t\tborder-style: solid;\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t// Horizontal drop target (between blocks).\n\t& .ck.ck-clipboard-drop-target-position {\n\t\tdisplay: block;\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\theight: 0;\n\t\tmargin: 0;\n\t\ttext-align: initial;\n\n\t\t& .ck-clipboard-drop-target__line {\n\t\t\tposition: absolute;\n\t\t\twidth: 100%;\n\t\t\theight: 0;\n\t\t\tborder: 1px solid var(--ck-clipboard-drop-target-color);\n\t\t\tmargin-top: -1px;\n\n\t\t\t&::before {\n\t\t\t\tcontent: "";\n\t\t\t\twidth: 0;\n\t\t\t\theight: 0;\n\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: calc(-1 * var(--ck-clipboard-drop-target-dot-size));\n\t\t\t\ttop: 0;\n\n\t\t\t\ttransform: translateY(-50%);\n\t\t\t\tborder-color: transparent transparent transparent var(--ck-clipboard-drop-target-color);\n\t\t\t\tborder-width: var(--ck-clipboard-drop-target-dot-size) 0 var(--ck-clipboard-drop-target-dot-size) calc(2 * var(--ck-clipboard-drop-target-dot-size));\n\t\t\t\tborder-style: solid;\n\t\t\t}\n\n\t\t\t&::after {\n\t\t\t\tcontent: "";\n\t\t\t\twidth: 0;\n\t\t\t\theight: 0;\n\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tright: calc(-1 * var(--ck-clipboard-drop-target-dot-size));\n\t\t\t\ttop: 0;\n\n\t\t\t\ttransform: translateY(-50%);\n\t\t\t\tborder-color: transparent var(--ck-clipboard-drop-target-color) transparent transparent;\n\t\t\t\tborder-width: var(--ck-clipboard-drop-target-dot-size) calc(2 * var(--ck-clipboard-drop-target-dot-size)) var(--ck-clipboard-drop-target-dot-size) 0;\n\t\t\t\tborder-style: solid;\n\t\t\t}\n\t\t}\n\t}\n\t*/\n\n\t/*\n\t * Styles of the widget that it a drop target.\n\t */\n\t& .ck-widget.ck-clipboard-drop-target-range {\n\t\toutline: var(--ck-widget-outline-thickness) solid var(--ck-clipboard-drop-target-color) !important;\n\t}\n\n\t/*\n\t * Styles of the widget being dragged (its preview).\n\t */\n\t& .ck-widget:-webkit-drag {\n\t\tzoom: 0.6;\n\t\toutline: none !important;\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck .ck-widget_with-resizer{position:relative}.ck .ck-widget__resizer{display:none;position:absolute;pointer-events:none;left:0;top:0}.ck-focused .ck-widget_with-resizer.ck-widget_selected>.ck-widget__resizer{display:block}.ck .ck-widget__resizer__handle{position:absolute;pointer-events:all}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right,.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{cursor:nwse-resize}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left,.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{cursor:nesw-resize}:root{--ck-resizer-size:10px;--ck-resizer-offset:calc(var(--ck-resizer-size)/-2 - 2px);--ck-resizer-border-width:1px}.ck .ck-widget__resizer{outline:1px solid var(--ck-color-resizer)}.ck .ck-widget__resizer__handle{width:var(--ck-resizer-size);height:var(--ck-resizer-size);background:var(--ck-color-focus-border);border:var(--ck-resizer-border-width) solid #fff;border-radius:var(--ck-resizer-border-radius)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{top:var(--ck-resizer-offset);left:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{top:var(--ck-resizer-offset);right:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right{bottom:var(--ck-resizer-offset);right:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left{bottom:var(--ck-resizer-offset);left:var(--ck-resizer-offset)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-widget/theme/widgetresize.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-widget/widgetresize.css"],names:[],mappings:"AAKA,4BAEC,iBACD,CAEA,wBACC,YAAa,CACb,iBAAkB,CAGlB,mBAAoB,CAEpB,MAAO,CACP,KACD,CAGC,2EACC,aACD,CAGD,gCACC,iBAAkB,CAGlB,kBAWD,CATC,4IAEC,kBACD,CAEA,4IAEC,kBACD,CCpCD,MACC,sBAAuB,CAGvB,yDAAiE,CACjE,6BACD,CAEA,wBACC,yCACD,CAEA,gCACC,4BAA6B,CAC7B,6BAA8B,CAC9B,uCAAwC,CACxC,gDAA6D,CAC7D,6CAqBD,CAnBC,oEACC,4BAA6B,CAC7B,6BACD,CAEA,qEACC,4BAA6B,CAC7B,8BACD,CAEA,wEACC,+BAAgC,CAChC,8BACD,CAEA,uEACC,+BAAgC,CAChC,6BACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-widget_with-resizer {\n\t/* Make the widget wrapper a relative positioning container for the drag handle. */\n\tposition: relative;\n}\n\n.ck .ck-widget__resizer {\n\tdisplay: none;\n\tposition: absolute;\n\n\t/* The wrapper itself should not interfere with the pointer device, only the handles should. */\n\tpointer-events: none;\n\n\tleft: 0;\n\ttop: 0;\n}\n\n.ck-focused .ck-widget_with-resizer.ck-widget_selected {\n\t& > .ck-widget__resizer {\n\t\tdisplay: block;\n\t}\n}\n\n.ck .ck-widget__resizer__handle {\n\tposition: absolute;\n\n\t/* Resizers are the only UI elements that should interfere with a pointer device. */\n\tpointer-events: all;\n\n\t&.ck-widget__resizer__handle-top-left,\n\t&.ck-widget__resizer__handle-bottom-right {\n\t\tcursor: nwse-resize;\n\t}\n\n\t&.ck-widget__resizer__handle-top-right,\n\t&.ck-widget__resizer__handle-bottom-left {\n\t\tcursor: nesw-resize;\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-resizer-size: 10px;\n\n\t/* Set the resizer with a 50% offset. */\n\t--ck-resizer-offset: calc( ( var(--ck-resizer-size) / -2 ) - 2px);\n\t--ck-resizer-border-width: 1px;\n}\n\n.ck .ck-widget__resizer {\n\toutline: 1px solid var(--ck-color-resizer);\n}\n\n.ck .ck-widget__resizer__handle {\n\twidth: var(--ck-resizer-size);\n\theight: var(--ck-resizer-size);\n\tbackground: var(--ck-color-focus-border);\n\tborder: var(--ck-resizer-border-width) solid hsl(0, 0%, 100%);\n\tborder-radius: var(--ck-resizer-border-radius);\n\n\t&.ck-widget__resizer__handle-top-left {\n\t\ttop: var(--ck-resizer-offset);\n\t\tleft: var(--ck-resizer-offset);\n\t}\n\n\t&.ck-widget__resizer__handle-top-right {\n\t\ttop: var(--ck-resizer-offset);\n\t\tright: var(--ck-resizer-offset);\n\t}\n\n\t&.ck-widget__resizer__handle-bottom-right {\n\t\tbottom: var(--ck-resizer-offset);\n\t\tright: var(--ck-resizer-offset);\n\t}\n\n\t&.ck-widget__resizer__handle-bottom-left {\n\t\tbottom: var(--ck-resizer-offset);\n\t\tleft: var(--ck-resizer-offset);\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck-content blockquote{overflow:hidden;padding-right:1.5em;padding-left:1.5em;margin-left:0;margin-right:0;font-style:italic;border-left:5px solid #ccc}.ck-content[dir=rtl] blockquote{border-left:0;border-right:5px solid #ccc}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-block-quote/theme/blockquote.css"],names:[],mappings:"AAKA,uBAEC,eAAgB,CAGhB,mBAAoB,CACpB,kBAAmB,CAEnB,aAAc,CACd,cAAe,CACf,iBAAkB,CAClB,0BACD,CAEA,gCACC,aAAc,CACd,2BACD",sourcesContent:['/**\n * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content blockquote {\n\t/* See #12 */\n\toverflow: hidden;\n\n\t/* https://github.com/ckeditor/ckeditor5-block-quote/issues/15 */\n\tpadding-right: 1.5em;\n\tpadding-left: 1.5em;\n\n\tmargin-left: 0;\n\tmargin-right: 0;\n\tfont-style: italic;\n\tborder-left: solid 5px hsl(0, 0%, 80%);\n}\n\n.ck-content[dir="rtl"] blockquote {\n\tborder-left: 0;\n\tborder-right: solid 5px hsl(0, 0%, 80%);\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck .ck-button.ck-color-table__remove-color{display:flex;align-items:center;width:100%}label.ck.ck-color-grid__label{font-weight:unset}.ck .ck-button.ck-color-table__remove-color{padding:calc(var(--ck-spacing-standard)/2) var(--ck-spacing-standard);border-bottom-left-radius:0;border-bottom-right-radius:0}.ck .ck-button.ck-color-table__remove-color:not(:focus){border-bottom:1px solid var(--ck-color-base-border)}[dir=ltr] .ck .ck-button.ck-color-table__remove-color .ck.ck-icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck .ck-button.ck-color-table__remove-color .ck.ck-icon{margin-left:var(--ck-spacing-standard)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-font/theme/fontcolor.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-font/fontcolor.css"],names:[],mappings:"AAKA,4CACC,YAAa,CACb,kBAAmB,CACnB,UACD,CAEA,8BACC,iBACD,CCNA,4CACC,qEAAyE,CACzE,2BAA4B,CAC5B,4BAeD,CAbC,wDACC,mDACD,CAEA,kEAEE,uCAMF,CARA,kEAME,sCAEF",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-button.ck-color-table__remove-color {\n\tdisplay: flex;\n\talign-items: center;\n\twidth: 100%;\n}\n\nlabel.ck.ck-color-grid__label {\n\tfont-weight: unset;\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck .ck-button.ck-color-table__remove-color {\n\tpadding: calc(var(--ck-spacing-standard) / 2 ) var(--ck-spacing-standard);\n\tborder-bottom-left-radius: 0;\n\tborder-bottom-right-radius: 0;\n\n\t&:not(:focus) {\n\t\tborder-bottom: 1px solid var(--ck-color-base-border);\n\t}\n\n\t& .ck.ck-icon {\n\t\t@mixin ck-dir ltr {\n\t\t\tmargin-right: var(--ck-spacing-standard);\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n}\n\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck-content .text-tiny{font-size:.7em}.ck-content .text-small{font-size:.85em}.ck-content .text-big{font-size:1.4em}.ck-content .text-huge{font-size:1.8em}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-font/theme/fontsize.css"],names:[],mappings:"AAUC,uBACC,cACD,CAEA,wBACC,eACD,CAEA,sBACC,eACD,CAEA,uBACC,eACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* The values should be synchronized with the "FONT_SIZE_PRESET_UNITS" object in the "/src/fontsize/utils.js" file. */\n\n/* Styles should be prefixed with the `.ck-content` class.\nSee https://github.com/ckeditor/ckeditor5/issues/6636 */\n.ck-content {\n\t& .text-tiny {\n\t\tfont-size: .7em;\n\t}\n\n\t& .text-small {\n\t\tfont-size: .85em;\n\t}\n\n\t& .text-big {\n\t\tfont-size: 1.4em;\n\t}\n\n\t& .text-huge {\n\t\tfont-size: 1.8em;\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-heading_heading1{font-size:20px}.ck.ck-heading_heading2{font-size:17px}.ck.ck-heading_heading3{font-size:14px}.ck[class*=ck-heading_heading]{font-weight:700}.ck.ck-dropdown.ck-heading-dropdown .ck-dropdown__button .ck-button__label{width:8em}.ck.ck-dropdown.ck-heading-dropdown .ck-dropdown__panel .ck-list__item{min-width:18em}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-heading/theme/heading.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-heading/heading.css"],names:[],mappings:"AAKA,wBACC,cACD,CAEA,wBACC,cACD,CAEA,wBACC,cACD,CAEA,+BACC,eACD,CCZC,2EACC,SACD,CAEA,uEACC,cACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-heading_heading1 {\n\tfont-size: 20px;\n}\n\n.ck.ck-heading_heading2 {\n\tfont-size: 17px;\n}\n\n.ck.ck-heading_heading3 {\n\tfont-size: 14px;\n}\n\n.ck[class*="ck-heading_heading"] {\n\tfont-weight: bold;\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* Resize dropdown's button label. */\n.ck.ck-dropdown.ck-heading-dropdown {\n\t& .ck-dropdown__button .ck-button__label {\n\t\twidth: 8em;\n\t}\n\n\t& .ck-dropdown__panel .ck-list__item {\n\t\tmin-width: 18em;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,":root{--ck-highlight-marker-yellow:#fdfd77;--ck-highlight-marker-green:#62f962;--ck-highlight-marker-pink:#fc7899;--ck-highlight-marker-blue:#72ccfd;--ck-highlight-pen-red:#e71313;--ck-highlight-pen-green:#128a00}.ck-content .marker-yellow{background-color:var(--ck-highlight-marker-yellow)}.ck-content .marker-green{background-color:var(--ck-highlight-marker-green)}.ck-content .marker-pink{background-color:var(--ck-highlight-marker-pink)}.ck-content .marker-blue{background-color:var(--ck-highlight-marker-blue)}.ck-content .pen-red{color:var(--ck-highlight-pen-red);background-color:transparent}.ck-content .pen-green{color:var(--ck-highlight-pen-green);background-color:transparent}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-highlight/theme/highlight.css"],names:[],mappings:"AAKA,MACC,oCAA+C,CAC/C,mCAA+C,CAC/C,kCAA8C,CAC9C,kCAA8C,CAC9C,8BAAwC,CACxC,gCACD,CAGC,2BACC,kDACD,CAFA,0BACC,iDACD,CAFA,yBACC,gDACD,CAFA,yBACC,gDACD,CAIA,qBACC,iCAAqC,CAGrC,4BACD,CALA,uBACC,mCAAqC,CAGrC,4BACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-highlight-marker-yellow: hsl(60, 97%, 73%);\n\t--ck-highlight-marker-green: hsl(120, 93%, 68%);\n\t--ck-highlight-marker-pink: hsl(345, 96%, 73%);\n\t--ck-highlight-marker-blue: hsl(201, 97%, 72%);\n\t--ck-highlight-pen-red: hsl(0, 85%, 49%);\n\t--ck-highlight-pen-green: hsl(112, 100%, 27%);\n}\n\n@define-mixin highlight-marker-color $color {\n\t.ck-content .marker-$color {\n\t\tbackground-color: var(--ck-highlight-marker-$color);\n\t}\n}\n\n@define-mixin highlight-pen-color $color {\n\t.ck-content .pen-$color {\n\t\tcolor: var(--ck-highlight-pen-$color);\n\n\t\t/* Override default yellow background of `<mark>` from user agent stylesheet */\n\t\tbackground-color: transparent;\n\t}\n}\n\n@mixin highlight-marker-color yellow;\n@mixin highlight-marker-color green;\n@mixin highlight-marker-color pink;\n@mixin highlight-marker-color blue;\n\n@mixin highlight-pen-color red;\n@mixin highlight-pen-color green;\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck-editor__editable .ck-horizontal-line{display:flow-root}.ck-content hr{margin:15px 0;height:4px;background:#dedede;border:0}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-horizontal-line/theme/horizontalline.css"],names:[],mappings:"AAMA,yCAEC,iBACD,CAEA,eACC,aAAc,CACd,UAAW,CACX,kBAA2B,CAC3B,QACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n\n.ck-editor__editable .ck-horizontal-line {\n\t/* Necessary to render properly next to floated objects, e.g. side image case. */\n\tdisplay: flow-root;\n}\n\n.ck-content hr {\n\tmargin: 15px 0;\n\theight: 4px;\n\tbackground: hsl(0, 0%, 87%);\n\tborder: 0;\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck-widget.raw-html-embed{margin:1em auto;position:relative;display:flow-root}.ck-widget.raw-html-embed:before{position:absolute;z-index:1}.ck-widget.raw-html-embed .raw-html-embed__buttons-wrapper{position:absolute;display:flex;flex-direction:column}.ck-widget.raw-html-embed .raw-html-embed__preview{position:relative;overflow:hidden;display:flex}.ck-widget.raw-html-embed .raw-html-embed__preview-content{width:100%;position:relative;margin:auto;display:table;border-collapse:separate;border-spacing:7px}.ck-widget.raw-html-embed .raw-html-embed__preview-placeholder{position:absolute;left:0;top:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center}.ck-content .raw-html-embed{margin:1em auto;min-width:15em;font-style:normal}:root{--ck-html-embed-content-width:calc(100% - var(--ck-icon-size)*1.5);--ck-html-embed-source-height:10em;--ck-html-embed-unfocused-outline-width:1px;--ck-html-embed-content-min-height:calc(var(--ck-icon-size) + var(--ck-spacing-standard));--ck-html-embed-source-disabled-background:var(--ck-color-base-foreground);--ck-html-embed-source-disabled-color:hsl(0deg 0% 45%)}.ck-widget.raw-html-embed{font-size:var(--ck-font-size-base);background-color:var(--ck-color-base-foreground)}.ck-widget.raw-html-embed:not(.ck-widget_selected):not(:hover){outline:var(--ck-html-embed-unfocused-outline-width) dashed var(--ck-color-widget-blurred-border)}.ck-widget.raw-html-embed[dir=ltr]{text-align:left}.ck-widget.raw-html-embed[dir=rtl]{text-align:right}.ck-widget.raw-html-embed:before{content:attr(data-html-embed-label);top:calc(var(--ck-html-embed-unfocused-outline-width)*-1);left:var(--ck-spacing-standard);background:hsl(0deg 0% 60%);transition:background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);padding:calc(var(--ck-spacing-tiny) + var(--ck-html-embed-unfocused-outline-width)) var(--ck-spacing-small) var(--ck-spacing-tiny);border-radius:0 0 var(--ck-border-radius) var(--ck-border-radius);color:var(--ck-color-base-background);font-size:var(--ck-font-size-tiny);font-family:var(--ck-font-face)}.ck-widget.raw-html-embed[dir=rtl]:before{left:auto;right:var(--ck-spacing-standard)}.ck-widget.raw-html-embed[dir=ltr] .ck-widget__type-around .ck-widget__type-around__button.ck-widget__type-around__button_before{margin-left:50px}.ck.ck-editor__editable.ck-blurred .ck-widget.raw-html-embed.ck-widget_selected:before{top:0;padding:var(--ck-spacing-tiny) var(--ck-spacing-small)}.ck.ck-editor__editable:not(.ck-blurred) .ck-widget.raw-html-embed.ck-widget_selected:before{top:0;padding:var(--ck-spacing-tiny) var(--ck-spacing-small);background:var(--ck-color-focus-border)}.ck.ck-editor__editable .ck-widget.raw-html-embed:not(.ck-widget_selected):hover:before{top:0;padding:var(--ck-spacing-tiny) var(--ck-spacing-small)}.ck-widget.raw-html-embed .raw-html-embed__content-wrapper{padding:var(--ck-spacing-standard)}.ck-widget.raw-html-embed .raw-html-embed__buttons-wrapper{top:var(--ck-spacing-standard);right:var(--ck-spacing-standard)}.ck-widget.raw-html-embed .raw-html-embed__buttons-wrapper .ck-button.raw-html-embed__save-button{color:var(--ck-color-button-save)}.ck-widget.raw-html-embed .raw-html-embed__buttons-wrapper .ck-button.raw-html-embed__cancel-button{color:var(--ck-color-button-cancel)}.ck-widget.raw-html-embed .raw-html-embed__buttons-wrapper .ck-button:not(:first-child){margin-top:var(--ck-spacing-small)}.ck-widget.raw-html-embed[dir=rtl] .raw-html-embed__buttons-wrapper{left:var(--ck-spacing-standard);right:auto}.ck-widget.raw-html-embed .raw-html-embed__source{box-sizing:border-box;height:var(--ck-html-embed-source-height);width:var(--ck-html-embed-content-width);resize:none;min-width:0;padding:var(--ck-spacing-standard);font-family:monospace;tab-size:4;white-space:pre-wrap;font-size:var(--ck-font-size-base);text-align:left;direction:ltr}.ck-widget.raw-html-embed .raw-html-embed__source[disabled]{background:var(--ck-html-embed-source-disabled-background);color:var(--ck-html-embed-source-disabled-color);-webkit-text-fill-color:var(--ck-html-embed-source-disabled-color);opacity:1}.ck-widget.raw-html-embed .raw-html-embed__preview{min-height:var(--ck-html-embed-content-min-height);width:var(--ck-html-embed-content-width)}.ck-editor__editable:not(.ck-read-only) .ck-widget.raw-html-embed .raw-html-embed__preview{pointer-events:none}.ck-widget.raw-html-embed .raw-html-embed__preview-content{box-sizing:border-box;text-align:center;background-color:var(--ck-color-base-foreground)}.ck-widget.raw-html-embed .raw-html-embed__preview-content>*{margin-left:auto;margin-right:auto}.ck-widget.raw-html-embed .raw-html-embed__preview-placeholder{color:var(--ck-html-embed-source-disabled-color)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-html-embed/theme/htmlembed.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-html-embed/htmlembed.css"],names:[],mappings:"AAMA,0BAEC,eAAgB,CAChB,iBAAkB,CAClB,iBAgDD,CA5CC,iCACC,iBAAkB,CAGlB,SACD,CAKA,2DACC,iBAAkB,CAClB,YAAa,CACb,qBACD,CAEA,mDACC,iBAAkB,CAClB,eAAgB,CAChB,YACD,CAEA,2DACC,UAAW,CACX,iBAAkB,CAClB,WAAY,CAGZ,aAAc,CACd,wBAAyB,CACzB,kBACD,CAEA,+DACC,iBAAkB,CAClB,MAAO,CACP,KAAM,CACN,OAAQ,CACR,QAAS,CAET,YAAa,CACb,kBAAmB,CACnB,sBACD,CAGD,4BAEC,eAAgB,CAIhB,cAAe,CAGf,iBACD,CCjEA,MACC,kEAAqE,CACrE,kCAAmC,CACnC,2CAA4C,CAC5C,yFAA0F,CAE1F,0EAA2E,CAC3E,sDACD,CAGA,0BACC,kCAAmC,CACnC,gDA0ID,CAxIC,+DACC,iGACD,CAGA,mCACC,eACD,CAEA,mCACC,gBACD,CAIA,iCACC,mCAAoC,CACpC,yDAA4D,CAC5D,+BAAgC,CAChC,2BAA4B,CAC5B,0GAA2G,CAC3G,kIAAmI,CACnI,iEAAkE,CAClE,qCAAsC,CACtC,kCAAmC,CACnC,+BACD,CAEA,0CACC,SAAU,CACV,gCACD,CAGA,iIACC,gBACD,CAxCD,uFA2CE,KAAQ,CACR,sDAgGF,CA5IA,6FAgDE,KAAM,CACN,sDAAuD,CACvD,uCA0FF,CA5IA,wFAsDE,KAAQ,CACR,sDAqFF,CAhFC,2DACC,kCACD,CAGA,2DACC,8BAA+B,CAC/B,gCAaD,CAXC,kGACC,iCACD,CAEA,oGACC,mCACD,CAEA,wFACC,kCACD,CAGD,oEACC,+BAAgC,CAChC,UACD,CAGA,kDACC,qBAAsB,CACtB,yCAA0C,CAC1C,wCAAyC,CACzC,WAAY,CACZ,WAAY,CACZ,kCAAmC,CAEnC,qBAAsB,CACtB,UAAW,CACX,oBAAqB,CACrB,kCAAmC,CAGnC,eAAgB,CAChB,aAUD,CARC,4DACC,0DAA2D,CAC3D,gDAAiD,CAGjD,kEAAmE,CACnE,SACD,CAID,mDACC,kDAAmD,CACnD,wCAMD,CARA,2FAME,mBAEF,CAEA,2DACC,qBAAsB,CACtB,iBAAkB,CAClB,gDAMD,CAJC,6DACC,gBAAiB,CACjB,iBACD,CAGD,+DACC,gDACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* The feature container. */\n.ck-widget.raw-html-embed {\n\t/* Give the embed some air. */\n\tmargin: 1em auto;\n\tposition: relative;\n\tdisplay: flow-root;\n\n\t/* ----- Emebed label in the upper left corner ----------------------------------------------- */\n\n\t&::before {\n\t\tposition: absolute;\n\n\t\t/* Make sure the content does not cover the label. */\n\t\tz-index: 1;\n\t}\n\n\t/* ----- Emebed internals --------------------------------------------------------------------- */\n\n\t/* The switch mode button wrapper. */\n\t& .raw-html-embed__buttons-wrapper {\n\t\tposition: absolute;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t& .raw-html-embed__preview {\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tdisplay: flex;\n\t}\n\n\t& .raw-html-embed__preview-content {\n\t\twidth: 100%;\n\t\tposition: relative;\n\t\tmargin: auto;\n\n\t\t/* Gives spacing to the small renderable elements, so they always cover the placeholder. */\n\t\tdisplay: table;\n\t\tborder-collapse: separate;\n\t\tborder-spacing: 7px;\n\t}\n\n\t& .raw-html-embed__preview-placeholder {\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\ttop: 0;\n\t\tright: 0;\n\t\tbottom: 0;\n\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n}\n\n.ck-content .raw-html-embed {\n\t/* Give the embed some air. */\n\tmargin: 1em auto;\n\n\t/* Give the html embed some minimal width in the content to prevent them\n\tfrom being "squashed" in tight spaces, e.g. in table cells (https://github.com/ckeditor/ckeditor5/issues/8331) */\n\tmin-width: 15em;\n\n\t/* Don\'t inherit the style, e.g. when in a block quote. */\n\tfont-style: normal;\n}\n','/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-html-embed-content-width: calc(100% - 1.5 * var(--ck-icon-size));\n\t--ck-html-embed-source-height: 10em;\n\t--ck-html-embed-unfocused-outline-width: 1px;\n\t--ck-html-embed-content-min-height: calc(var(--ck-icon-size) + var(--ck-spacing-standard));\n\n\t--ck-html-embed-source-disabled-background: var(--ck-color-base-foreground);\n\t--ck-html-embed-source-disabled-color: hsl(0deg 0% 45%);\n}\n\n/* The feature container. */\n.ck-widget.raw-html-embed {\n\tfont-size: var(--ck-font-size-base);\n\tbackground-color: var(--ck-color-base-foreground);\n\n\t&:not(.ck-widget_selected):not(:hover) {\n\t\toutline: var(--ck-html-embed-unfocused-outline-width) dashed var(--ck-color-widget-blurred-border);\n\t}\n\n\t/* HTML embed widget itself should respect UI language direction */\n\t&[dir="ltr"] {\n\t\ttext-align: left;\n\t}\n\n\t&[dir="rtl"] {\n\t\ttext-align: right;\n\t}\n\n\t/* ----- Embed label in the upper left corner ----------------------------------------------- */\n\n\t&::before {\n\t\tcontent: attr(data-html-embed-label);\n\t\ttop: calc(-1 * var(--ck-html-embed-unfocused-outline-width));\n\t\tleft: var(--ck-spacing-standard);\n\t\tbackground: hsl(0deg 0% 60%);\n\t\ttransition: background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\n\t\tpadding: calc(var(--ck-spacing-tiny) + var(--ck-html-embed-unfocused-outline-width)) var(--ck-spacing-small) var(--ck-spacing-tiny);\n\t\tborder-radius: 0 0 var(--ck-border-radius) var(--ck-border-radius);\n\t\tcolor: var(--ck-color-base-background);\n\t\tfont-size: var(--ck-font-size-tiny);\n\t\tfont-family: var(--ck-font-face);\n\t}\n\n\t&[dir="rtl"]::before {\n\t\tleft: auto;\n\t\tright: var(--ck-spacing-standard);\n\t}\n\n\t/* Make space for label but it only collides in LTR languages */\n\t&[dir="ltr"] .ck-widget__type-around .ck-widget__type-around__button.ck-widget__type-around__button_before {\n\t\tmargin-left: 50px;\n\t}\n\n\t@nest .ck.ck-editor__editable.ck-blurred &.ck-widget_selected::before {\n\t\ttop: 0px;\n\t\tpadding: var(--ck-spacing-tiny) var(--ck-spacing-small);\n\t}\n\n\t@nest .ck.ck-editor__editable:not(.ck-blurred) &.ck-widget_selected::before {\n\t\ttop: 0;\n\t\tpadding: var(--ck-spacing-tiny) var(--ck-spacing-small);\n\t\tbackground: var(--ck-color-focus-border);\n\t}\n\n\t@nest .ck.ck-editor__editable &:not(.ck-widget_selected):hover::before {\n\t\ttop: 0px;\n\t\tpadding: var(--ck-spacing-tiny) var(--ck-spacing-small);\n\t}\n\n\t/* ----- Emebed internals --------------------------------------------------------------------- */\n\n\t& .raw-html-embed__content-wrapper {\n\t\tpadding: var(--ck-spacing-standard);\n\t}\n\n\t/* The switch mode button wrapper. */\n\t& .raw-html-embed__buttons-wrapper {\n\t\ttop: var(--ck-spacing-standard);\n\t\tright: var(--ck-spacing-standard);\n\n\t\t& .ck-button.raw-html-embed__save-button {\n\t\t\tcolor: var(--ck-color-button-save);\n\t\t}\n\n\t\t& .ck-button.raw-html-embed__cancel-button {\n\t\t\tcolor: var(--ck-color-button-cancel);\n\t\t}\n\n\t\t& .ck-button:not(:first-child) {\n\t\t\tmargin-top: var(--ck-spacing-small);\n\t\t}\n\t}\n\n\t&[dir="rtl"] .raw-html-embed__buttons-wrapper {\n\t\tleft: var(--ck-spacing-standard);\n\t\tright: auto;\n\t}\n\n\t/* The edit source element. */\n\t& .raw-html-embed__source {\n\t\tbox-sizing: border-box;\n\t\theight: var(--ck-html-embed-source-height);\n\t\twidth: var(--ck-html-embed-content-width);\n\t\tresize: none;\n\t\tmin-width: 0;\n\t\tpadding: var(--ck-spacing-standard);\n\n\t\tfont-family: monospace;\n\t\ttab-size: 4;\n\t\twhite-space: pre-wrap;\n\t\tfont-size: var(--ck-font-size-base); /* Safari needs this. */\n\n\t\t/* HTML code is direction–agnostic. */\n\t\ttext-align: left;\n\t\tdirection: ltr;\n\n\t\t&[disabled] {\n\t\t\tbackground: var(--ck-html-embed-source-disabled-background);\n\t\t\tcolor: var(--ck-html-embed-source-disabled-color);\n\n\t\t\t/* Safari needs this for the proper text color in disabled input (https://github.com/ckeditor/ckeditor5/issues/8320). */\n\t\t\t-webkit-text-fill-color: var(--ck-html-embed-source-disabled-color);\n\t\t\topacity: 1;\n\t\t}\n\t}\n\n\t/* The preview data container. */\n\t& .raw-html-embed__preview {\n\t\tmin-height: var(--ck-html-embed-content-min-height);\n\t\twidth: var(--ck-html-embed-content-width);\n\n\t\t/* Disable all mouse interaction as long as the editor is not read–only. */\n\t\t@nest .ck-editor__editable:not(.ck-read-only) & {\n\t\t\tpointer-events: none;\n\t\t}\n\t}\n\n\t& .raw-html-embed__preview-content {\n\t\tbox-sizing: border-box;\n\t\ttext-align: center;\n\t\tbackground-color: var(--ck-color-base-foreground);\n\n\t\t& > * {\n\t\t\tmargin-left: auto;\n\t\t\tmargin-right: auto;\n\t\t}\n\t}\n\n\t& .raw-html-embed__preview-placeholder {\n\t\tcolor: var(--ck-html-embed-source-disabled-color)\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-text-alternative-form{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-text-alternative-form .ck-labeled-field-view{display:inline-block}.ck.ck-text-alternative-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-text-alternative-form{flex-wrap:wrap}.ck.ck-text-alternative-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-text-alternative-form .ck-button{flex-basis:50%}}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/textalternativeform.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css"],names:[],mappings:"AAOA,6BACC,YAAa,CACb,kBAAmB,CACnB,gBAqBD,CAnBC,oDACC,oBACD,CAEA,uCACC,YACD,CCZA,oCDCD,6BAcE,cAUF,CARE,oDACC,eACD,CAEA,wCACC,cACD,CCrBD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-text-alternative-form {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\n\t& .ck-labeled-field-view {\n\t\tdisplay: inline-block;\n\t}\n\n\t& .ck-label {\n\t\tdisplay: none;\n\t}\n\n\t@mixin ck-media-phone {\n\t\tflex-wrap: wrap;\n\n\t\t& .ck-labeled-field-view {\n\t\t\tflex-basis: 100%;\n\t\t}\n\n\t\t& .ck-button {\n\t\t\tflex-basis: 50%;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,'.ck-vertical-form .ck-button:after{content:"";width:0;position:absolute;right:-1px;top:var(--ck-spacing-small);bottom:var(--ck-spacing-small);z-index:1}@media screen and (max-width:600px){.ck.ck-responsive-form .ck-button:after{content:"";width:0;position:absolute;right:-1px;top:var(--ck-spacing-small);bottom:var(--ck-spacing-small);z-index:1}}.ck-vertical-form>.ck-button:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form{padding:var(--ck-spacing-large)}.ck.ck-responsive-form:focus{outline:none}[dir=ltr] .ck.ck-responsive-form>:not(:first-child),[dir=rtl] .ck.ck-responsive-form>:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-responsive-form{padding:0;width:calc(var(--ck-input-text-width)*0.8)}.ck.ck-responsive-form .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) 0}.ck.ck-responsive-form .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-responsive-form .ck-labeled-field-view .ck-labeled-field-view__error{white-space:normal}.ck.ck-responsive-form>.ck-button:last-child,.ck.ck-responsive-form>.ck-button:nth-last-child(2){padding:var(--ck-spacing-standard);margin-top:var(--ck-spacing-large);border-radius:0;border:0;border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-responsive-form>.ck-button:last-child,[dir=ltr] .ck.ck-responsive-form>.ck-button:nth-last-child(2),[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2){margin-left:0}.ck.ck-responsive-form>.ck-button:nth-last-child(2):after,[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child:last-of-type,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2):last-of-type{border-right:1px solid var(--ck-color-base-border)}}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/responsive-form/responsiveform.css"],names:[],mappings:"AAOA,mCACC,UAAW,CACX,OAAQ,CACR,iBAAkB,CAClB,UAAW,CACX,2BAA4B,CAC5B,8BAA+B,CAC/B,SACD,CCTC,oCDaC,wCACC,UAAW,CACX,OAAQ,CACR,iBAAkB,CAClB,UAAW,CACX,2BAA4B,CAC5B,8BAA+B,CAC/B,SACD,CCnBD,CCAD,qDACC,kDACD,CAEA,uBACC,+BAkED,CAhEC,6BAEC,YACD,CASC,uGACC,sCACD,CDvBD,oCCMD,uBAqBE,SAAU,CACV,0CA6CF,CA3CE,8CACC,wDAWD,CATC,6DACC,WAAY,CACZ,UACD,CAGA,4EACC,kBACD,CAID,iGAEC,kCAAmC,CACnC,kCAAmC,CAEnC,eAAgB,CAChB,QAAS,CACT,gDAaD,CApBA,0OAcE,aAMF,CAGC,yMACC,kDACD,CDpEF",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck-vertical-form .ck-button::after {\n\tcontent: "";\n\twidth: 0;\n\tposition: absolute;\n\tright: -1px;\n\ttop: var(--ck-spacing-small);\n\tbottom: var(--ck-spacing-small);\n\tz-index: 1;\n}\n\n.ck.ck-responsive-form {\n\t@mixin ck-media-phone {\n\t\t& .ck-button::after {\n\t\t\tcontent: "";\n\t\t\twidth: 0;\n\t\t\tposition: absolute;\n\t\t\tright: -1px;\n\t\t\ttop: var(--ck-spacing-small);\n\t\t\tbottom: var(--ck-spacing-small);\n\t\t\tz-index: 1;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck-vertical-form > .ck-button:nth-last-child(2)::after {\n\tborder-right: 1px solid var(--ck-color-base-border);\n}\n\n.ck.ck-responsive-form {\n\tpadding: var(--ck-spacing-large);\n\n\t&:focus {\n\t\t/* See: https://github.com/ckeditor/ckeditor5/issues/4773 */\n\t\toutline: none;\n\t}\n\n\t@mixin ck-dir ltr {\n\t\t& > :not(:first-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-dir rtl {\n\t\t& > :not(:last-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-media-phone {\n\t\tpadding: 0;\n\t\twidth: calc(.8 * var(--ck-input-text-width));\n\n\t\t& .ck-labeled-field-view {\n\t\t\tmargin: var(--ck-spacing-large) var(--ck-spacing-large) 0;\n\n\t\t\t& .ck-input-text {\n\t\t\t\tmin-width: 0;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t/* Let the long error messages wrap in the narrow form. */\n\t\t\t& .ck-labeled-field-view__error {\n\t\t\t\twhite-space: normal;\n\t\t\t}\n\t\t}\n\n\t\t/* Styles for two last buttons in the form (save&cancel, edit&unlink, etc.). */\n\t\t& > .ck-button:nth-last-child(1),\n\t\t& > .ck-button:nth-last-child(2) {\n\t\t\tpadding: var(--ck-spacing-standard);\n\t\t\tmargin-top: var(--ck-spacing-large);\n\n\t\t\tborder-radius: 0;\n\t\t\tborder: 0;\n\t\t\tborder-top: 1px solid var(--ck-color-base-border);\n\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-left: 0;\n\n\t\t\t\t&:last-of-type {\n\t\t\t\t\tborder-right: 1px solid var(--ck-color-base-border);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t& > .ck-button:nth-last-child(2) {\n\t\t\t&::after {\n\t\t\t\tborder-right: 1px solid var(--ck-color-base-border);\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck-content .image{display:table;clear:both;text-align:center;margin:1em auto}.ck-content .image img{display:block;margin:0 auto;max-width:100%;min-width:50px}.ck.ck-editor__editable .image>figcaption.ck-placeholder:before{position:static}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/image.css"],names:[],mappings:"AAKA,mBACC,aAAc,CACd,UAAW,CACX,iBAAkB,CAGlB,eAeD,CAbC,uBAEC,aAAc,CAGd,aAAc,CAGd,cAAe,CAGf,cACD,CAQD,gEACC,eACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content .image {\n\tdisplay: table;\n\tclear: both;\n\ttext-align: center;\n\n\t/* Make sure there is some space between the content and the image. Center image by default. */\n\tmargin: 1em auto;\n\n\t& img {\n\t\t/* Prevent unnecessary margins caused by line-height (see #44). */\n\t\tdisplay: block;\n\n\t\t/* Center the image if its width is smaller than the content's width. */\n\t\tmargin: 0 auto;\n\n\t\t/* Make sure the image never exceeds the size of the parent container (ckeditor/ckeditor5-ui#67). */\n\t\tmax-width: 100%;\n\n\t\t/* Make sure the caption will be displayed properly (See: https://github.com/ckeditor/ckeditor5/issues/1870). */\n\t\tmin-width: 50px;\n\t}\n}\n\n/*\n * Since the caption placeholder for images disappears when focused, it does not require special treatment\n * and can go with a position that follows text alignment of an .image out-of-the-box (center by default).\n * See https://github.com/ckeditor/ckeditor5/issues/8689.\n */\n.ck.ck-editor__editable .image > figcaption.ck-placeholder::before {\n\tposition: static;\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck-content .image>figcaption{display:table-caption;caption-side:bottom;word-break:break-word;color:#333;background-color:#f7f7f7;padding:.6em;font-size:.75em;outline-offset:-1px}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imagecaption.css"],names:[],mappings:"AAKA,8BACC,qBAAsB,CACtB,mBAAoB,CACpB,qBAAsB,CACtB,UAAsB,CACtB,wBAAiC,CACjC,YAAa,CACb,eAAgB,CAChB,mBACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content .image > figcaption {\n\tdisplay: table-caption;\n\tcaption-side: bottom;\n\tword-break: break-word;\n\tcolor: hsl(0, 0%, 20%);\n\tbackground-color: hsl(0, 0%, 97%);\n\tpadding: .6em;\n\tfont-size: .75em;\n\toutline-offset: -1px;\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-editor__editable .image{position:relative}.ck.ck-editor__editable .image .ck-progress-bar{position:absolute;top:0;left:0}.ck.ck-editor__editable .image.ck-appear{animation:fadeIn .7s}.ck.ck-editor__editable .image .ck-progress-bar{height:2px;width:0;background:var(--ck-color-upload-bar-background);transition:width .1s}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageuploadprogress.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadprogress.css"],names:[],mappings:"AAKA,+BACC,iBACD,CAGA,gDACC,iBAAkB,CAClB,KAAM,CACN,MACD,CCPC,yCACC,oBACD,CAID,gDACC,UAAW,CACX,OAAQ,CACR,gDAAiD,CACjD,oBACD,CAEA,kBACC,GAAO,SAAY,CACnB,GAAO,SAAY,CACpB",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor__editable .image {\n\tposition: relative;\n}\n\n/* Upload progress bar. */\n.ck.ck-editor__editable .image .ck-progress-bar {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor__editable .image {\n\t/* Showing animation. */\n\t&.ck-appear {\n\t\tanimation: fadeIn 700ms;\n\t}\n}\n\n/* Upload progress bar. */\n.ck.ck-editor__editable .image .ck-progress-bar {\n\theight: 2px;\n\twidth: 0;\n\tbackground: var(--ck-color-upload-bar-background);\n\ttransition: width 100ms;\n}\n\n@keyframes fadeIn {\n\tfrom { opacity: 0; }\n\tto { opacity: 1; }\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,'.ck-image-upload-complete-icon{display:block;position:absolute;top:10px;right:10px;border-radius:50%}.ck-image-upload-complete-icon:after{content:"";position:absolute}:root{--ck-color-image-upload-icon:#fff;--ck-color-image-upload-icon-background:#008a00;--ck-image-upload-icon-size:20px;--ck-image-upload-icon-width:2px}.ck-image-upload-complete-icon{width:var(--ck-image-upload-icon-size);height:var(--ck-image-upload-icon-size);opacity:0;background:var(--ck-color-image-upload-icon-background);animation-name:ck-upload-complete-icon-show,ck-upload-complete-icon-hide;animation-fill-mode:forwards,forwards;animation-duration:.5s,.5s;font-size:var(--ck-image-upload-icon-size);animation-delay:0ms,3s}.ck-image-upload-complete-icon:after{left:25%;top:50%;opacity:0;height:0;width:0;transform:scaleX(-1) rotate(135deg);transform-origin:left top;border-top:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);border-right:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);animation-name:ck-upload-complete-icon-check;animation-duration:.5s;animation-delay:.5s;animation-fill-mode:forwards;box-sizing:border-box}@keyframes ck-upload-complete-icon-show{0%{opacity:0}to{opacity:1}}@keyframes ck-upload-complete-icon-hide{0%{opacity:1}to{opacity:0}}@keyframes ck-upload-complete-icon-check{0%{opacity:1;width:0;height:0}33%{width:.3em;height:0}to{opacity:1;width:.3em;height:.45em}}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageuploadicon.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadicon.css"],names:[],mappings:"AAKA,+BACC,aAAc,CACd,iBAAkB,CAClB,QAAS,CACT,UAAW,CACX,iBAMD,CAJC,qCACC,UAAW,CACX,iBACD,CCVD,MACC,iCAA8C,CAC9C,+CAA4D,CAE5D,gCAAiC,CACjC,gCACD,CAEA,+BACC,sCAAuC,CACvC,uCAAwC,CACxC,SAAU,CACV,uDAAwD,CACxD,wEAA0E,CAC1E,qCAAuC,CACvC,0BAAgC,CAGhC,0CAA2C,CAG3C,sBAyBD,CAtBC,qCAEC,QAAS,CAET,OAAQ,CACR,SAAU,CACV,QAAS,CACT,OAAQ,CAER,mCAAoC,CACpC,yBAA0B,CAC1B,oFAAqF,CACrF,sFAAuF,CAEvF,4CAA6C,CAC7C,sBAAyB,CACzB,mBAAsB,CACtB,4BAA6B,CAG7B,qBACD,CAGD,wCACC,GACC,SACD,CAEA,GACC,SACD,CACD,CAEA,wCACC,GACC,SACD,CAEA,GACC,SACD,CACD,CAEA,yCACC,GACC,SAAU,CACV,OAAQ,CACR,QACD,CACA,IACC,UAAY,CACZ,QACD,CACA,GACC,SAAU,CACV,UAAY,CACZ,YACD,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-image-upload-complete-icon {\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 10px;\n\tright: 10px;\n\tborder-radius: 50%;\n\n\t&::after {\n\t\tcontent: "";\n\t\tposition: absolute;\n\t}\n}\n','/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-image-upload-icon: hsl(0, 0%, 100%);\n\t--ck-color-image-upload-icon-background: hsl(120, 100%, 27%);\n\n\t--ck-image-upload-icon-size: 20px;\n\t--ck-image-upload-icon-width: 2px;\n}\n\n.ck-image-upload-complete-icon {\n\twidth: var(--ck-image-upload-icon-size);\n\theight: var(--ck-image-upload-icon-size);\n\topacity: 0;\n\tbackground: var(--ck-color-image-upload-icon-background);\n\tanimation-name: ck-upload-complete-icon-show, ck-upload-complete-icon-hide;\n\tanimation-fill-mode: forwards, forwards;\n\tanimation-duration: 500ms, 500ms;\n\n\t/* To make animation scalable. */\n\tfont-size: var(--ck-image-upload-icon-size);\n\n\t/* Hide completed upload icon after 3 seconds. */\n\tanimation-delay: 0ms, 3000ms;\n\n\t/* This is check icon element made from border-width mixed with animations. */\n\t&::after {\n\t\t/* Because of border transformation we need to "hard code" left position. */\n\t\tleft: 25%;\n\n\t\ttop: 50%;\n\t\topacity: 0;\n\t\theight: 0;\n\t\twidth: 0;\n\n\t\ttransform: scaleX(-1) rotate(135deg);\n\t\ttransform-origin: left top;\n\t\tborder-top: var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);\n\t\tborder-right: var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);\n\n\t\tanimation-name: ck-upload-complete-icon-check;\n\t\tanimation-duration: 500ms;\n\t\tanimation-delay: 500ms;\n\t\tanimation-fill-mode: forwards;\n\n\t\t/* #1095. While reset is not providing proper box-sizing for pseudoelements, we need to handle it. */\n\t\tbox-sizing: border-box;\n\t}\n}\n\n@keyframes ck-upload-complete-icon-show {\n\tfrom {\n\t\topacity: 0;\n\t}\n\n\tto {\n\t\topacity: 1;\n\t}\n}\n\n@keyframes ck-upload-complete-icon-hide {\n\tfrom {\n\t\topacity: 1;\n\t}\n\n\tto {\n\t\topacity: 0;\n\t}\n}\n\n@keyframes ck-upload-complete-icon-check {\n\t0% {\n\t\topacity: 1;\n\t\twidth: 0;\n\t\theight: 0;\n\t}\n\t33% {\n\t\twidth: 0.3em;\n\t\theight: 0;\n\t}\n\t100% {\n\t\topacity: 1;\n\t\twidth: 0.3em;\n\t\theight: 0.45em;\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,'.ck .ck-upload-placeholder-loader{position:absolute;display:flex;align-items:center;justify-content:center;top:0;left:0}.ck .ck-upload-placeholder-loader:before{content:"";position:relative}:root{--ck-color-upload-placeholder-loader:#b3b3b3;--ck-upload-placeholder-loader-size:32px}.ck .ck-image-upload-placeholder{width:100%;margin:0}.ck .ck-upload-placeholder-loader{width:100%;height:100%}.ck .ck-upload-placeholder-loader:before{width:var(--ck-upload-placeholder-loader-size);height:var(--ck-upload-placeholder-loader-size);border-radius:50%;border-top:3px solid var(--ck-color-upload-placeholder-loader);border-right:2px solid transparent;animation:ck-upload-placeholder-loader 1s linear infinite}@keyframes ck-upload-placeholder-loader{to{transform:rotate(1turn)}}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageuploadloader.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadloader.css"],names:[],mappings:"AAKA,kCACC,iBAAkB,CAClB,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,KAAM,CACN,MAMD,CAJC,yCACC,UAAW,CACX,iBACD,CCXD,MACC,4CAAqD,CACrD,wCACD,CAEA,iCAEC,UAAW,CACX,QACD,CAEA,kCACC,UAAW,CACX,WAUD,CARC,yCACC,8CAA+C,CAC/C,+CAAgD,CAChD,iBAAkB,CAClB,8DAA+D,CAC/D,kCAAmC,CACnC,yDACD,CAGD,wCACC,GACC,uBACD,CACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-upload-placeholder-loader {\n\tposition: absolute;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\ttop: 0;\n\tleft: 0;\n\n\t&::before {\n\t\tcontent: '';\n\t\tposition: relative;\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-upload-placeholder-loader: hsl(0, 0%, 70%);\n\t--ck-upload-placeholder-loader-size: 32px;\n}\n\n.ck .ck-image-upload-placeholder {\n\t/* We need to control the full width of the SVG gray background. */\n\twidth: 100%;\n\tmargin: 0;\n}\n\n.ck .ck-upload-placeholder-loader {\n\twidth: 100%;\n\theight: 100%;\n\n\t&::before {\n\t\twidth: var(--ck-upload-placeholder-loader-size);\n\t\theight: var(--ck-upload-placeholder-loader-size);\n\t\tborder-radius: 50%;\n\t\tborder-top: 3px solid var(--ck-color-upload-placeholder-loader);\n\t\tborder-right: 2px solid transparent;\n\t\tanimation: ck-upload-placeholder-loader 1s linear infinite;\n\t}\n}\n\n@keyframes ck-upload-placeholder-loader {\n\tto {\n\t\ttransform: rotate( 360deg );\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-image-insert-form:focus{outline:none}.ck.ck-form__row{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.ck.ck-form__row>:not(.ck-label){flex-grow:1}.ck.ck-form__row.ck-image-insert-form__action-row{margin-top:var(--ck-spacing-standard)}.ck.ck-form__row.ck-image-insert-form__action-row .ck-button-cancel,.ck.ck-form__row.ck-image-insert-form__action-row .ck-button-save{justify-content:center}.ck.ck-form__row.ck-image-insert-form__action-row .ck-button .ck-button__label{color:var(--ck-color-text)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageinsertformrowview.css"],names:[],mappings:"AAMC,+BAEC,YACD,CAGD,iBACC,YAAa,CACb,kBAAmB,CACnB,gBAAiB,CACjB,6BAmBD,CAhBC,iCACC,WACD,CAEA,kDACC,qCAUD,CARC,sIAEC,sBACD,CAEA,+EACC,0BACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-image-insert-form {\n\t&:focus {\n\t\t/* See: https://github.com/ckeditor/ckeditor5/issues/4773 */\n\t\toutline: none;\n\t}\n}\n\n.ck.ck-form__row {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\tjustify-content: space-between;\n\n\t/* Ignore labels that work as fieldset legends */\n\t& > *:not(.ck-label) {\n\t\tflex-grow: 1;\n\t}\n\n\t&.ck-image-insert-form__action-row {\n\t\tmargin-top: var(--ck-spacing-standard);\n\n\t\t& .ck-button-save,\n\t\t& .ck-button-cancel {\n\t\t\tjustify-content: center;\n\t\t}\n\n\t\t& .ck-button .ck-button__label {\n\t\t\tcolor: var(--ck-color-text);\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-image-insert__panel{padding:var(--ck-spacing-large)}.ck.ck-image-insert__ck-finder-button{display:block;width:100%;margin:var(--ck-spacing-standard) auto;border:1px solid #ccc;border-radius:var(--ck-border-radius)}.ck.ck-splitbutton>.ck-file-dialog-button.ck-button{padding:0;margin:0;border:none}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageinsert.css"],names:[],mappings:"AAKA,2BACC,+BACD,CAEA,sCACC,aAAc,CACd,UAAW,CACX,sCAAuC,CACvC,qBAAiC,CACjC,qCACD,CAGA,oDACC,SAAU,CACV,QAAS,CACT,WACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-image-insert__panel {\n\tpadding: var(--ck-spacing-large);\n}\n\n.ck.ck-image-insert__ck-finder-button {\n\tdisplay: block;\n\twidth: 100%;\n\tmargin: var(--ck-spacing-standard) auto;\n\tborder: 1px solid hsl(0, 0%, 80%);\n\tborder-radius: var(--ck-border-radius);\n}\n\n/* https://github.com/ckeditor/ckeditor5/issues/7986 */\n.ck.ck-splitbutton > .ck-file-dialog-button.ck-button {\n\tpadding: 0;\n\tmargin: 0;\n\tborder: none;\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,":root{--ck-image-style-spacing:1.5em}.ck-content .image-style-side{float:right;margin-left:var(--ck-image-style-spacing);max-width:50%}.ck-content .image-style-align-left{float:left;margin-right:var(--ck-image-style-spacing)}.ck-content .image-style-align-center{margin-left:auto;margin-right:auto}.ck-content .image-style-align-right{float:right;margin-left:var(--ck-image-style-spacing)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imagestyle.css"],names:[],mappings:"AAKA,MACC,8BACD,CAGC,8BACC,WAAY,CACZ,yCAA0C,CAC1C,aACD,CAEA,oCACC,UAAW,CACX,0CACD,CAEA,sCACC,gBAAiB,CACjB,iBACD,CAEA,qCACC,WAAY,CACZ,yCACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-image-style-spacing: 1.5em;\n}\n\n.ck-content {\n\t& .image-style-side {\n\t\tfloat: right;\n\t\tmargin-left: var(--ck-image-style-spacing);\n\t\tmax-width: 50%;\n\t}\n\n\t& .image-style-align-left {\n\t\tfloat: left;\n\t\tmargin-right: var(--ck-image-style-spacing);\n\t}\n\n\t& .image-style-align-center {\n\t\tmargin-left: auto;\n\t\tmargin-right: auto;\n\t}\n\n\t& .image-style-align-right {\n\t\tfloat: right;\n\t\tmargin-left: var(--ck-image-style-spacing);\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck .ck-link_selected{background:var(--ck-color-link-selected-background)}.ck .ck-fake-link-selection{background:var(--ck-color-link-fake-selection)}.ck .ck-fake-link-selection_collapsed{height:100%;border-right:1px solid var(--ck-color-base-text);margin-right:-1px;outline:1px solid hsla(0,0%,100%,.5)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-link/link.css"],names:[],mappings:"AAMA,sBACC,mDACD,CAMA,4BACC,8CACD,CAGA,sCACC,WAAY,CACZ,gDAAiD,CACjD,iBAAkB,CAClB,oCACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* Class added to span element surrounding currently selected link. */\n.ck .ck-link_selected {\n\tbackground: var(--ck-color-link-selected-background);\n}\n\n/*\n * Classes used by the "fake visual selection" displayed in the content when an input\n * in the link UI has focus (the browser does not render the native selection in this state).\n */\n.ck .ck-fake-link-selection {\n\tbackground: var(--ck-color-link-fake-selection);\n}\n\n/* A collapsed fake visual selection. */\n.ck .ck-fake-link-selection_collapsed {\n\theight: 100%;\n\tborder-right: 1px solid var(--ck-color-base-text);\n\tmargin-right: -1px;\n\toutline: solid 1px hsla(0, 0%, 100%, .5);\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-link-form{display:flex}.ck.ck-link-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-link-form{flex-wrap:wrap}.ck.ck-link-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-link-form .ck-button{flex-basis:50%}}.ck.ck-link-form_layout-vertical{display:block}.ck.ck-link-form_layout-vertical .ck-button.ck-button-cancel,.ck.ck-link-form_layout-vertical .ck-button.ck-button-save{margin-top:var(--ck-spacing-medium)}.ck.ck-link-form_layout-vertical{padding:0;min-width:var(--ck-input-text-width)}.ck.ck-link-form_layout-vertical .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) var(--ck-spacing-small)}.ck.ck-link-form_layout-vertical .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-link-form_layout-vertical .ck-button{padding:var(--ck-spacing-standard);margin:0;border-radius:0;border:0;border-top:1px solid var(--ck-color-base-border);width:50%}[dir=ltr] .ck.ck-link-form_layout-vertical .ck-button,[dir=rtl] .ck.ck-link-form_layout-vertical .ck-button{margin-left:0}[dir=rtl] .ck.ck-link-form_layout-vertical .ck-button:last-of-type{border-right:1px solid var(--ck-color-base-border)}.ck.ck-link-form_layout-vertical .ck.ck-list{margin:var(--ck-spacing-standard) var(--ck-spacing-large)}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton{border:0;padding:0;width:100%}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton:hover{background:none}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-link/theme/linkform.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-link/linkform.css"],names:[],mappings:"AAOA,iBACC,YAiBD,CAfC,2BACC,YACD,CCNA,oCDCD,iBAQE,cAUF,CARE,wCACC,eACD,CAEA,4BACC,cACD,CCfD,CDuBD,iCACC,aAYD,CALE,wHAEC,mCACD,CE/BF,iCACC,SAAU,CACV,oCA8CD,CA5CC,wDACC,8EAMD,CAJC,uEACC,WAAY,CACZ,UACD,CAGD,4CACC,kCAAmC,CACnC,QAAS,CACT,eAAgB,CAChB,QAAS,CACT,gDAAiD,CACjD,SAaD,CAnBA,4GAaE,aAMF,CAJE,mEACC,kDACD,CAKF,6CACC,yDAWD,CATC,wEACC,QAAS,CACT,SAAU,CACV,UAKD,CAHC,8EACC,eACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-link-form {\n\tdisplay: flex;\n\n\t& .ck-label {\n\t\tdisplay: none;\n\t}\n\n\t@mixin ck-media-phone {\n\t\tflex-wrap: wrap;\n\n\t\t& .ck-labeled-field-view {\n\t\t\tflex-basis: 100%;\n\t\t}\n\n\t\t& .ck-button {\n\t\t\tflex-basis: 50%;\n\t\t}\n\t}\n}\n\n/*\n * Style link form differently when manual decorators are available.\n * See: https://github.com/ckeditor/ckeditor5-link/issues/186.\n */\n.ck.ck-link-form_layout-vertical {\n\tdisplay: block;\n\n\t/*\n\t * Whether the form is in the responsive mode or not, if there are decorator buttons\n\t * keep the top margin of action buttons medium.\n\t */\n\t& .ck-button {\n\t\t&.ck-button-save,\n\t\t&.ck-button-cancel {\n\t\t\tmargin-top: var(--ck-spacing-medium);\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n/*\n * Style link form differently when manual decorators are available.\n * See: https://github.com/ckeditor/ckeditor5-link/issues/186.\n */\n.ck.ck-link-form_layout-vertical {\n\tpadding: 0;\n\tmin-width: var(--ck-input-text-width);\n\n\t& .ck-labeled-field-view {\n\t\tmargin: var(--ck-spacing-large) var(--ck-spacing-large) var(--ck-spacing-small);\n\n\t\t& .ck-input-text {\n\t\t\tmin-width: 0;\n\t\t\twidth: 100%;\n\t\t}\n\t}\n\n\t& .ck-button {\n\t\tpadding: var(--ck-spacing-standard);\n\t\tmargin: 0;\n\t\tborder-radius: 0;\n\t\tborder: 0;\n\t\tborder-top: 1px solid var(--ck-color-base-border);\n\t\twidth: 50%;\n\n\t\t@mixin ck-dir ltr {\n\t\t\tmargin-left: 0;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tmargin-left: 0;\n\n\t\t\t&:last-of-type {\n\t\t\t\tborder-right: 1px solid var(--ck-color-base-border);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Using additional `.ck` class for stronger CSS specificity than `.ck.ck-link-form > :not(:first-child)`. */\n\t& .ck.ck-list {\n\t\tmargin: var(--ck-spacing-standard) var(--ck-spacing-large);\n\n\t\t& .ck-button.ck-switchbutton {\n\t\t\tborder: 0;\n\t\t\tpadding: 0;\n\t\t\twidth: 100%;\n\n\t\t\t&:hover {\n\t\t\t\tbackground: none;\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-link-actions{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-link-actions .ck-link-actions__preview{display:inline-block}.ck.ck-link-actions .ck-link-actions__preview .ck-button__label{overflow:hidden}@media screen and (max-width:600px){.ck.ck-link-actions{flex-wrap:wrap}.ck.ck-link-actions .ck-link-actions__preview{flex-basis:100%}.ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){flex-basis:50%}}.ck.ck-link-actions .ck-button.ck-link-actions__preview{padding-left:0;padding-right:0}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label{padding:0 var(--ck-spacing-medium);color:var(--ck-color-link-default);text-overflow:ellipsis;cursor:pointer;max-width:var(--ck-input-text-width);min-width:3em;text-align:center}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label:hover{text-decoration:underline}.ck.ck-link-actions .ck-button.ck-link-actions__preview,.ck.ck-link-actions .ck-button.ck-link-actions__preview:active,.ck.ck-link-actions .ck-button.ck-link-actions__preview:focus,.ck.ck-link-actions .ck-button.ck-link-actions__preview:hover{background:none}.ck.ck-link-actions .ck-button.ck-link-actions__preview:active{box-shadow:none}.ck.ck-link-actions .ck-button.ck-link-actions__preview:focus .ck-button__label{text-decoration:underline}[dir=ltr] .ck.ck-link-actions .ck-button:not(:first-child),[dir=rtl] .ck.ck-link-actions .ck-button:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-link-actions .ck-button.ck-link-actions__preview{margin:var(--ck-spacing-standard) var(--ck-spacing-standard) 0}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label{min-width:0;max-width:100%}[dir=ltr] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview),[dir=rtl] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){margin-left:0}}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-link/theme/linkactions.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-link/linkactions.css"],names:[],mappings:"AAOA,oBACC,YAAa,CACb,kBAAmB,CACnB,gBAqBD,CAnBC,8CACC,oBAKD,CAHC,gEACC,eACD,CCXD,oCDCD,oBAcE,cAUF,CARE,8CACC,eACD,CAEA,8DACC,cACD,CCrBD,CCKA,wDACC,cAAe,CACf,eAmCD,CAjCC,0EACC,kCAAmC,CACnC,kCAAmC,CACnC,sBAAuB,CACvB,cAAe,CAIf,oCAAqC,CACrC,aAAc,CACd,iBAKD,CAHC,gFACC,yBACD,CAGD,mPAIC,eACD,CAEA,+DACC,eACD,CAGC,gFACC,yBACD,CAWD,qHACC,sCACD,CDvDD,oCC2DC,wDACC,8DAMD,CAJC,0EACC,WAAY,CACZ,cACD,CAGD,gJAME,aAEF,CD1ED",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-link-actions {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\n\t& .ck-link-actions__preview {\n\t\tdisplay: inline-block;\n\n\t\t& .ck-button__label {\n\t\t\toverflow: hidden;\n\t\t}\n\t}\n\n\t@mixin ck-media-phone {\n\t\tflex-wrap: wrap;\n\n\t\t& .ck-link-actions__preview {\n\t\t\tflex-basis: 100%;\n\t\t}\n\n\t\t& .ck-button:not(.ck-link-actions__preview) {\n\t\t\tflex-basis: 50%;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/components/tooltip/mixins/_tooltip.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n@import "../mixins/_focus.css";\n@import "../mixins/_shadow.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-link-actions {\n\t& .ck-button.ck-link-actions__preview {\n\t\tpadding-left: 0;\n\t\tpadding-right: 0;\n\n\t\t& .ck-button__label {\n\t\t\tpadding: 0 var(--ck-spacing-medium);\n\t\t\tcolor: var(--ck-color-link-default);\n\t\t\ttext-overflow: ellipsis;\n\t\t\tcursor: pointer;\n\n\t\t\t/* Match the box model of the link editor form\'s input so the balloon\n\t\t\tdoes not change width when moving between actions and the form. */\n\t\t\tmax-width: var(--ck-input-text-width);\n\t\t\tmin-width: 3em;\n\t\t\ttext-align: center;\n\n\t\t\t&:hover {\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\n\t\t&,\n\t\t&:hover,\n\t\t&:focus,\n\t\t&:active {\n\t\t\tbackground: none;\n\t\t}\n\n\t\t&:active {\n\t\t\tbox-shadow: none;\n\t\t}\n\n\t\t&:focus {\n\t\t\t& .ck-button__label {\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\t}\n\n\t@mixin ck-dir ltr {\n\t\t& .ck-button:not(:first-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-dir rtl {\n\t\t& .ck-button:not(:last-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-media-phone {\n\t\t& .ck-button.ck-link-actions__preview {\n\t\t\tmargin: var(--ck-spacing-standard) var(--ck-spacing-standard) 0;\n\n\t\t\t& .ck-button__label {\n\t\t\t\tmin-width: 0;\n\t\t\t\tmax-width: 100%;\n\t\t\t}\n\t\t}\n\n\t\t& .ck-button:not(.ck-link-actions__preview) {\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-link-image_icon{position:absolute;top:var(--ck-spacing-medium);right:var(--ck-spacing-medium);width:28px;height:28px;padding:4px;box-sizing:border-box;border-radius:var(--ck-border-radius)}.ck.ck-link-image_icon svg{fill:currentColor}.ck.ck-link-image_icon{color:#fff;background:rgba(0,0,0,.4)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-link/theme/linkimage.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-link/linkimage.css"],names:[],mappings:"AAKA,uBACC,iBAAkB,CAClB,4BAA6B,CAC7B,8BAA+B,CAC/B,UAAW,CACX,WAAY,CACZ,WAAY,CACZ,qBAAsB,CACtB,qCAKD,CAHC,2BACC,iBACD,CCZD,uBACC,UAAuB,CACvB,yBACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-link-image_icon {\n\tposition: absolute;\n\ttop: var(--ck-spacing-medium);\n\tright: var(--ck-spacing-medium);\n\twidth: 28px;\n\theight: 28px;\n\tpadding: 4px;\n\tbox-sizing: border-box;\n\tborder-radius: var(--ck-border-radius);\n\n\t& svg {\n\t\tfill: currentColor;\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-link-image_icon {\n\tcolor: hsl(0, 0%, 100%);\n\tbackground: hsla(0, 0%, 0%, .4);\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,":root{--ck-color-table-focused-cell-background:rgba(158,207,250,0.3)}.ck-widget.table td.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table td.ck-editor__nested-editable:focus,.ck-widget.table th.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table th.ck-editor__nested-editable:focus{background:var(--ck-color-table-focused-cell-background);border-style:none;outline:1px solid var(--ck-color-focus-border);outline-offset:-1px}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/tableediting.css"],names:[],mappings:"AAKA,MACC,8DACD,CAKE,8QAGC,wDAAyD,CAKzD,iBAAkB,CAClB,8CAA+C,CAC/C,mBACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-table-focused-cell-background: hsla(208, 90%, 80%, .3);\n}\n\n.ck-widget.table {\n\t& td,\n\t& th {\n\t\t&.ck-editor__nested-editable.ck-editor__nested-editable_focused,\n\t\t&.ck-editor__nested-editable:focus {\n\t\t\t/* A very slight background to highlight the focused cell */\n\t\t\tbackground: var(--ck-color-table-focused-cell-background);\n\n\t\t\t/* Fixes the problem where surrounding cells cover the focused cell's border.\n\t\t\tIt does not fix the problem in all places but the UX is improved.\n\t\t\tSee https://github.com/ckeditor/ckeditor5-table/issues/29. */\n\t\t\tborder-style: none;\n\t\t\toutline: 1px solid var(--ck-color-focus-border);\n\t\t\toutline-offset: -1px; /* progressive enhancement - no IE support */\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck .ck-insert-table-dropdown__grid{display:flex;flex-direction:row;flex-wrap:wrap}:root{--ck-insert-table-dropdown-padding:10px;--ck-insert-table-dropdown-box-height:11px;--ck-insert-table-dropdown-box-width:12px;--ck-insert-table-dropdown-box-margin:1px}.ck .ck-insert-table-dropdown__grid{width:calc(var(--ck-insert-table-dropdown-box-width)*10 + var(--ck-insert-table-dropdown-box-margin)*20 + var(--ck-insert-table-dropdown-padding)*2);padding:var(--ck-insert-table-dropdown-padding) var(--ck-insert-table-dropdown-padding) 0}.ck .ck-insert-table-dropdown__label{text-align:center}.ck .ck-insert-table-dropdown-grid-box{width:var(--ck-insert-table-dropdown-box-width);height:var(--ck-insert-table-dropdown-box-height);margin:var(--ck-insert-table-dropdown-box-margin);border:1px solid var(--ck-color-base-border);border-radius:1px}.ck .ck-insert-table-dropdown-grid-box.ck-on{border-color:var(--ck-color-focus-border);background:var(--ck-color-focus-outer-shadow)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/inserttable.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/inserttable.css"],names:[],mappings:"AAKA,oCACC,YAAa,CACb,kBAAmB,CACnB,cACD,CCJA,MACC,uCAAwC,CACxC,0CAA2C,CAC3C,yCAA0C,CAC1C,yCACD,CAEA,oCAEC,oJAA2J,CAC3J,yFACD,CAEA,qCACC,iBACD,CAEA,uCACC,+CAAgD,CAChD,iDAAkD,CAClD,iDAAkD,CAClD,4CAA6C,CAC7C,iBAMD,CAJC,6CACC,yCAA0C,CAC1C,6CACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-insert-table-dropdown__grid {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: wrap;\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-insert-table-dropdown-padding: 10px;\n\t--ck-insert-table-dropdown-box-height: 11px;\n\t--ck-insert-table-dropdown-box-width: 12px;\n\t--ck-insert-table-dropdown-box-margin: 1px;\n}\n\n.ck .ck-insert-table-dropdown__grid {\n\t/* The width of a container should match 10 items in a row so there will be a 10x10 grid. */\n\twidth: calc(var(--ck-insert-table-dropdown-box-width) * 10 + var(--ck-insert-table-dropdown-box-margin) * 20 + var(--ck-insert-table-dropdown-padding) * 2);\n\tpadding: var(--ck-insert-table-dropdown-padding) var(--ck-insert-table-dropdown-padding) 0;\n}\n\n.ck .ck-insert-table-dropdown__label {\n\ttext-align: center;\n}\n\n.ck .ck-insert-table-dropdown-grid-box {\n\twidth: var(--ck-insert-table-dropdown-box-width);\n\theight: var(--ck-insert-table-dropdown-box-height);\n\tmargin: var(--ck-insert-table-dropdown-box-margin);\n\tborder: 1px solid var(--ck-color-base-border);\n\tborder-radius: 1px;\n\n\t&.ck-on {\n\t\tborder-color: var(--ck-color-focus-border);\n\t\tbackground: var(--ck-color-focus-outer-shadow);\n\t}\n}\n\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,':root{--ck-table-selected-cell-background:rgba(158,207,250,0.3)}.ck.ck-editor__editable .table table td.ck-editor__editable_selected,.ck.ck-editor__editable .table table th.ck-editor__editable_selected{position:relative;caret-color:transparent;outline:unset;box-shadow:unset}.ck.ck-editor__editable .table table td.ck-editor__editable_selected:after,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:after{content:"";pointer-events:none;background-color:var(--ck-table-selected-cell-background);position:absolute;top:0;left:0;right:0;bottom:0}.ck.ck-editor__editable .table table td.ck-editor__editable_selected ::selection,.ck.ck-editor__editable .table table td.ck-editor__editable_selected:focus,.ck.ck-editor__editable .table table th.ck-editor__editable_selected ::selection,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:focus{background-color:transparent}.ck.ck-editor__editable .table table td.ck-editor__editable_selected .ck-widget_selected,.ck.ck-editor__editable .table table th.ck-editor__editable_selected .ck-widget_selected{outline:unset}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/tableselection.css"],names:[],mappings:"AAKA,MACC,yDACD,CAGC,0IAEC,iBAAkB,CAClB,uBAAwB,CACxB,aAAc,CACd,gBAsBD,CAnBC,sJACC,UAAW,CACX,mBAAoB,CACpB,yDAA0D,CAC1D,iBAAkB,CAClB,KAAM,CACN,MAAO,CACP,OAAQ,CACR,QACD,CAEA,wTAEC,4BACD,CAEA,kLACC,aACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-table-selected-cell-background: hsla(208, 90%, 80%, .3);\n}\n\n.ck.ck-editor__editable .table table {\n\t& td.ck-editor__editable_selected,\n\t& th.ck-editor__editable_selected {\n\t\tposition: relative;\n\t\tcaret-color: transparent;\n\t\toutline: unset;\n\t\tbox-shadow: unset;\n\n\t\t/* https://github.com/ckeditor/ckeditor5/issues/6446 */\n\t\t&:after {\n\t\t\tcontent: '';\n\t\t\tpointer-events: none;\n\t\t\tbackground-color: var(--ck-table-selected-cell-background);\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\tright: 0;\n\t\t\tbottom: 0;\n\t\t}\n\n\t\t& ::selection,\n\t\t&:focus {\n\t\t\tbackground-color: transparent;\n\t\t}\n\n\t\t& .ck-widget_selected {\n\t\t\toutline: unset;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck-content .table{margin:1em auto;display:table}.ck-content .table table{border-collapse:collapse;border-spacing:0;width:100%;height:100%;border:1px double #b3b3b3}.ck-content .table table td,.ck-content .table table th{min-width:2em;padding:.4em;border:1px solid #bfbfbf}.ck-content .table table th{font-weight:700;background:hsla(0,0%,0%,5%)}.ck-content[dir=rtl] .table th{text-align:right}.ck-content[dir=ltr] .table th{text-align:left}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/table.css"],names:[],mappings:"AAKA,mBAEC,eAAgB,CAChB,aAgCD,CA9BC,yBAEC,wBAAyB,CACzB,gBAAiB,CAIjB,UAAW,CACX,WAAY,CAIZ,yBAiBD,CAfC,wDAEC,aAAc,CACd,YAAa,CAKb,wBACD,CAEA,4BACC,eAAiB,CACjB,2BACD,CAMF,+BACC,gBACD,CAEA,+BACC,eACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content .table {\n\t/* Give the table widget some air and center it horizontally */\n\tmargin: 1em auto;\n\tdisplay: table;\n\n\t& table {\n\t\t/* The table cells should have slight borders */\n\t\tborder-collapse: collapse;\n\t\tborder-spacing: 0;\n\n\t\t/* Table width and height are set on the parent <figure>. Make sure the table inside stretches\n\t\tto the full dimensions of the container (https://github.com/ckeditor/ckeditor5/issues/6186). */\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t\t/* The outer border of the table should be slightly darker than the inner lines.\n\t\tAlso see https://github.com/ckeditor/ckeditor5-table/issues/50. */\n\t\tborder: 1px double hsl(0, 0%, 70%);\n\n\t\t& td,\n\t\t& th {\n\t\t\tmin-width: 2em;\n\t\t\tpadding: .4em;\n\n\t\t\t/* The border is inherited from .ck-editor__nested-editable styles, so theoretically it\'s not necessary here.\n\t\t\tHowever, the border is a content style, so it should use .ck-content (so it works outside the editor).\n\t\t\tHence, the duplication. See https://github.com/ckeditor/ckeditor5/issues/6314 */\n\t\t\tborder: 1px solid hsl(0, 0%, 75%);\n\t\t}\n\n\t\t& th {\n\t\t\tfont-weight: bold;\n\t\t\tbackground: hsla(0, 0%, 0%, 5%);\n\t\t}\n\t}\n}\n\n/* Text alignment of the table header should match the editor settings and override the native browser styling,\nwhen content is available outside the ediitor. See https://github.com/ckeditor/ckeditor5/issues/6638 */\n.ck-content[dir="rtl"] .table th {\n\ttext-align: right;\n}\n\n.ck-content[dir="ltr"] .table th {\n\ttext-align: left;\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-input-color{width:100%;display:flex;flex-direction:row-reverse}.ck.ck-input-color>input.ck.ck-input-text{min-width:auto;flex-grow:1}.ck.ck-input-color>div.ck.ck-dropdown{min-width:auto}.ck.ck-input-color>div.ck.ck-dropdown>.ck-input-color__button .ck-dropdown__arrow{display:none}.ck.ck-input-color .ck.ck-input-color__button .ck.ck-input-color__button__preview{position:relative;overflow:hidden}.ck.ck-input-color .ck.ck-input-color__button .ck.ck-input-color__button__preview>.ck.ck-input-color__button__preview__no-color-indicator{position:absolute;display:block}[dir=ltr] .ck.ck-input-color>.ck.ck-input-text{border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .ck.ck-input-color>.ck.ck-input-text{border-top-left-radius:0;border-bottom-left-radius:0}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{padding:0}[dir=ltr] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{border-left-width:0;border-top-left-radius:0;border-bottom-left-radius:0}[dir=rtl] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{border-right-width:0;border-top-right-radius:0;border-bottom-right-radius:0}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button.ck-disabled{background:var(--ck-color-input-disabled-background)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview{border-radius:0}.ck-rounded-corners .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview,.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview{width:20px;height:20px;border:1px solid var(--ck-color-input-border)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview>.ck.ck-input-color__button__preview__no-color-indicator{top:-30%;left:50%;height:150%;width:8%;background:red;border-radius:2px;transform:rotate(45deg);transform-origin:50%}.ck.ck-input-color .ck.ck-input-color__remove-color{width:100%;border-bottom:1px solid var(--ck-color-input-border);padding:calc(var(--ck-spacing-standard)/2) var(--ck-spacing-standard);border-bottom-left-radius:0;border-bottom-right-radius:0}[dir=ltr] .ck.ck-input-color .ck.ck-input-color__remove-color{border-top-right-radius:0}[dir=rtl] .ck.ck-input-color .ck.ck-input-color__remove-color{border-top-left-radius:0}.ck.ck-input-color .ck.ck-input-color__remove-color .ck.ck-icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-input-color .ck.ck-input-color__remove-color .ck.ck-icon{margin-right:0;margin-left:var(--ck-spacing-standard)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/colorinput.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/colorinput.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAKA,mBACC,UAAW,CACX,YAAa,CACb,0BA2BD,CAzBC,0CACC,cAAe,CACf,WACD,CAEA,sCACC,cAMD,CAHC,kFACC,YACD,CAIA,kFACC,iBAAkB,CAClB,eAMD,CAJC,0IACC,iBAAkB,CAClB,aACD,CCvBF,+CAEE,yBAA0B,CAC1B,4BAOF,CAVA,+CAOE,wBAAyB,CACzB,2BAEF,CAGC,wEACC,SAoCD,CArCA,kFAIE,mBAAoB,CACpB,wBAAyB,CACzB,2BA+BF,CArCA,kFAUE,oBAAqB,CACrB,yBAA0B,CAC1B,4BAyBF,CAtBC,oFACC,oDACD,CAEA,4GC9BF,eD+CE,CAjBA,+PC1BD,qCD2CC,CAjBA,4GAGC,UAAW,CACX,WAAY,CACZ,6CAYD,CAVC,oKACC,QAAS,CACT,QAAS,CACT,WAAY,CACZ,QAAS,CACT,cAA6B,CAC7B,iBAAkB,CAClB,uBAAwB,CACxB,oBACD,CAKH,oDACC,UAAW,CACX,oDAAqD,CACrD,qEAAwE,CAExE,2BAA4B,CAC5B,4BAkBD,CAxBA,8DASE,yBAeF,CAxBA,8DAaE,wBAWF,CARC,gEACC,uCAMD,CAPA,0EAIE,cAAe,CACf,sCAEF",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-input-color {\n\twidth: 100%;\n\tdisplay: flex;\n\tflex-direction: row-reverse;\n\n\t& > input.ck.ck-input-text {\n\t\tmin-width: auto;\n\t\tflex-grow: 1;\n\t}\n\n\t& > div.ck.ck-dropdown {\n\t\tmin-width: auto;\n\n\t\t/* This dropdown has no arrow but a color preview instead. */\n\t\t& > .ck-input-color__button .ck-dropdown__arrow {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t& .ck.ck-input-color__button {\n\t\t& .ck.ck-input-color__button__preview {\n\t\t\tposition: relative;\n\t\t\toverflow: hidden;\n\n\t\t\t& > .ck.ck-input-color__button__preview__no-color-indicator {\n\t\t\t\tposition: absolute;\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t}\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n@import "../mixins/_rounded.css";\n\n.ck.ck-input-color {\n\t& > .ck.ck-input-text {\n\t\t@mixin ck-dir ltr {\n\t\t\tborder-top-right-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tborder-top-left-radius: 0;\n\t\t\tborder-bottom-left-radius: 0;\n\t\t}\n\t}\n\n\t& > .ck.ck-dropdown {\n\t\t& > .ck.ck-button.ck-input-color__button {\n\t\t\tpadding: 0;\n\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tborder-left-width: 0;\n\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tborder-right-width: 0;\n\t\t\t\tborder-top-right-radius: 0;\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\n\t\t\t&.ck-disabled {\n\t\t\t\tbackground: var(--ck-color-input-disabled-background);\n\t\t\t}\n\n\t\t\t& > .ck.ck-input-color__button__preview {\n\t\t\t\t@mixin ck-rounded-corners;\n\n\t\t\t\twidth: 20px;\n\t\t\t\theight: 20px;\n\t\t\t\tborder: 1px solid var(--ck-color-input-border);\n\n\t\t\t\t& > .ck.ck-input-color__button__preview__no-color-indicator {\n\t\t\t\t\ttop: -30%;\n\t\t\t\t\tleft: 50%;\n\t\t\t\t\theight: 150%;\n\t\t\t\t\twidth: 8%;\n\t\t\t\t\tbackground: hsl(0, 100%, 50%);\n\t\t\t\t\tborder-radius: 2px;\n\t\t\t\t\ttransform: rotate(45deg);\n\t\t\t\t\ttransform-origin: 50%;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t& .ck.ck-input-color__remove-color {\n\t\twidth: 100%;\n\t\tborder-bottom: 1px solid var(--ck-color-input-border);\n\t\tpadding: calc(var(--ck-spacing-standard) / 2) var(--ck-spacing-standard);\n\n\t\tborder-bottom-left-radius: 0;\n\t\tborder-bottom-right-radius: 0;\n\n\t\t@mixin ck-dir ltr {\n\t\t\tborder-top-right-radius: 0;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tborder-top-left-radius: 0;\n\t\t}\n\n\t\t& .ck.ck-icon {\n\t\t\tmargin-right: var(--ck-spacing-standard);\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-right: 0;\n\t\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-form__row{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.ck.ck-form__row>:not(.ck-label){flex-grow:1}.ck.ck-form__row.ck-table-form__action-row .ck-button-cancel,.ck.ck-form__row.ck-table-form__action-row .ck-button-save{justify-content:center}.ck.ck-form__row{padding:var(--ck-spacing-standard) var(--ck-spacing-large) 0}[dir=ltr] .ck.ck-form__row>:not(.ck-label)+*{margin-left:var(--ck-spacing-large)}[dir=rtl] .ck.ck-form__row>:not(.ck-label)+*{margin-right:var(--ck-spacing-large)}.ck.ck-form__row>.ck-label{width:100%;min-width:100%}.ck.ck-form__row.ck-table-form__action-row{margin-top:var(--ck-spacing-large)}.ck.ck-form__row.ck-table-form__action-row .ck-button .ck-button__label{color:var(--ck-color-text)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/formrow.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/formrow.css"],names:[],mappings:"AAKA,iBACC,YAAa,CACb,kBAAmB,CACnB,gBAAiB,CACjB,6BAaD,CAVC,iCACC,WACD,CAGC,wHAEC,sBACD,CCbF,iBACC,4DA2BD,CAvBE,6CAEE,mCAMF,CARA,6CAME,oCAEF,CAGD,2BACC,UAAW,CACX,cACD,CAEA,2CACC,kCAKD,CAHC,wEACC,0BACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-form__row {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\tjustify-content: space-between;\n\n\t/* Ignore labels that work as fieldset legends */\n\t& > *:not(.ck-label) {\n\t\tflex-grow: 1;\n\t}\n\n\t&.ck-table-form__action-row {\n\t\t& .ck-button-save,\n\t\t& .ck-button-cancel {\n\t\t\tjustify-content: center;\n\t\t}\n\t}\n}\n",'/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-form__row {\n\tpadding: var(--ck-spacing-standard) var(--ck-spacing-large) 0;\n\n\t/* Ignore labels that work as fieldset legends */\n\t& > *:not(.ck-label) {\n\t\t& + * {\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: var(--ck-spacing-large);\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-right: var(--ck-spacing-large);\n\t\t\t}\n\t\t}\n\t}\n\n\t& > .ck-label {\n\t\twidth: 100%;\n\t\tmin-width: 100%;\n\t}\n\n\t&.ck-table-form__action-row {\n\t\tmargin-top: var(--ck-spacing-large);\n\n\t\t& .ck-button .ck-button__label {\n\t\t\tcolor: var(--ck-color-text);\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-form{padding:0 0 var(--ck-spacing-large)}.ck.ck-form:focus{outline:none}.ck.ck-form .ck.ck-input-text{min-width:100%;width:0}.ck.ck-form .ck.ck-dropdown{min-width:100%}.ck.ck-form .ck.ck-dropdown .ck-dropdown__button:not(:focus){border:1px solid var(--ck-color-base-border)}.ck.ck-form .ck.ck-dropdown .ck-dropdown__button .ck-button__label{width:100%}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/form.css"],names:[],mappings:"AAKA,YACC,mCAyBD,CAvBC,kBAEC,YACD,CAEA,8BACC,cAAe,CACf,OACD,CAEA,4BACC,cAWD,CARE,6DACC,4CACD,CAEA,mEACC,UACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-form {\n\tpadding: 0 0 var(--ck-spacing-large);\n\n\t&:focus {\n\t\t/* See: https://github.com/ckeditor/ckeditor5/issues/4773 */\n\t\toutline: none;\n\t}\n\n\t& .ck.ck-input-text {\n\t\tmin-width: 100%;\n\t\twidth: 0;\n\t}\n\n\t& .ck.ck-dropdown {\n\t\tmin-width: 100%;\n\n\t\t& .ck-dropdown__button {\n\t\t\t&:not(:focus) {\n\t\t\t\tborder: 1px solid var(--ck-color-base-border);\n\t\t\t}\n\n\t\t\t& .ck-button__label {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,'.ck.ck-table-form .ck-form__row.ck-table-form__background-row,.ck.ck-table-form .ck-form__row.ck-table-form__border-row{flex-wrap:wrap}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row{flex-wrap:wrap;align-items:center}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-labeled-field-view{display:flex;flex-direction:column-reverse;align-items:center}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-labeled-field-view .ck.ck-dropdown,.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimension-operator{flex-grow:0}.ck.ck-table-form .ck.ck-labeled-field-view{position:relative}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{position:absolute;left:50%;bottom:calc(var(--ck-table-properties-error-arrow-size)*-1);transform:translate(-50%,100%);z-index:1}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status:after{content:"";position:absolute;top:calc(var(--ck-table-properties-error-arrow-size)*-1);left:50%;transform:translateX(-50%)}:root{--ck-table-properties-error-arrow-size:6px;--ck-table-properties-min-error-width:150px}.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-labeled-field-view>.ck-label{font-size:var(--ck-font-size-tiny);text-align:center}.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-table-form__border-style,.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-table-form__border-width{width:80px;min-width:80px;max-width:80px}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row{padding:0}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimensions-row__height,.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimensions-row__width{margin:0}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimension-operator{align-self:flex-end;display:inline-block;height:var(--ck-ui-component-min-height);line-height:var(--ck-ui-component-min-height);margin:0 var(--ck-spacing-small)}.ck.ck-table-form .ck.ck-labeled-field-view{padding-top:var(--ck-spacing-standard)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{border-radius:0}.ck-rounded-corners .ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status,.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{background:var(--ck-color-base-error);color:var(--ck-color-base-background);padding:var(--ck-spacing-small) var(--ck-spacing-medium);min-width:var(--ck-table-properties-min-error-width);text-align:center}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status:after{border-left:var(--ck-table-properties-error-arrow-size) solid transparent;border-bottom:var(--ck-table-properties-error-arrow-size) solid var(--ck-color-base-error);border-right:var(--ck-table-properties-error-arrow-size) solid transparent;border-top:0 solid transparent}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{animation:ck-table-form-labeled-view-status-appear .15s ease both}.ck.ck-table-form .ck.ck-labeled-field-view .ck-input.ck-error:not(:focus)+.ck.ck-labeled-field-view__status{display:none}@keyframes ck-table-form-labeled-view-status-appear{0%{opacity:0}to{opacity:1}}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/tableform.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/tableform.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAWE,wHACC,cACD,CAEA,8DACC,cAAe,CACf,kBAeD,CAbC,qFACC,YAAa,CACb,6BAA8B,CAC9B,kBAKD,CAEA,sMACC,WACD,CAIF,4CAEC,iBAoBD,CAlBC,8EACC,iBAAkB,CAClB,QAAS,CACT,2DAAgE,CAChE,8BAA+B,CAG/B,SAUD,CAPC,oFACC,UAAW,CACX,iBAAkB,CAClB,wDAA6D,CAC7D,QAAS,CACT,0BACD,CChDH,MACC,0CAA2C,CAC3C,2CACD,CAMI,2FACC,kCAAmC,CACnC,iBACD,CAGD,8KAEC,UAAW,CACX,cAAe,CACf,cACD,CAGD,8DACC,SAcD,CAZC,yMAEC,QACD,CAEA,iGACC,mBAAoB,CACpB,oBAAqB,CACrB,wCAAyC,CACzC,6CAA8C,CAC9C,gCACD,CAIF,4CACC,sCAyBD,CAvBC,8ECxCD,eDyDC,CAjBA,mMCpCA,qCDqDA,CAjBA,8EAGC,qCAAsC,CACtC,qCAAsC,CACtC,wDAAyD,CACzD,oDAAqD,CACrD,iBAUD,CAPC,oFAGC,yEAAmB,CAAnB,0FAAmB,CAAnB,0EAAmB,CAAnB,8BACD,CAdD,8EAgBC,iEACD,CAGA,6GACC,YACD,CAIF,oDACC,GACC,SACD,CAEA,GACC,SACD,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-table-form {\n\t& .ck-form__row {\n\t\t&.ck-table-form__border-row {\n\t\t\tflex-wrap: wrap;\n\t\t}\n\n\t\t&.ck-table-form__background-row {\n\t\t\tflex-wrap: wrap;\n\t\t}\n\n\t\t&.ck-table-form__dimensions-row {\n\t\t\tflex-wrap: wrap;\n\t\t\talign-items: center;\n\n\t\t\t& .ck-labeled-field-view {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column-reverse;\n\t\t\t\talign-items: center;\n\n\t\t\t\t& .ck.ck-dropdown {\n\t\t\t\t\tflex-grow: 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t& .ck-table-form__dimension-operator {\n\t\t\t\tflex-grow: 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t& .ck.ck-labeled-field-view {\n\t\t/* Allow absolute positioning of the status (error) balloons. */\n\t\tposition: relative;\n\n\t\t& .ck.ck-labeled-field-view__status {\n\t\t\tposition: absolute;\n\t\t\tleft: 50%;\n\t\t\tbottom: calc( -1 * var(--ck-table-properties-error-arrow-size) );\n\t\t\ttransform: translate(-50%,100%);\n\n\t\t\t/* Make sure the balloon status stays on top of other form elements. */\n\t\t\tz-index: 1;\n\n\t\t\t/* The arrow pointing towards the field. */\n\t\t\t&::after {\n\t\t\t\tcontent: "";\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: calc( -1 * var(--ck-table-properties-error-arrow-size) );\n\t\t\t\tleft: 50%;\n\t\t\t\ttransform: translateX( -50% );\n\t\t\t}\n\t\t}\n\t}\n}\n','/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../mixins/_rounded.css";\n\n:root {\n\t--ck-table-properties-error-arrow-size: 6px;\n\t--ck-table-properties-min-error-width: 150px;\n}\n\n.ck.ck-table-form {\n\t& .ck-form__row {\n\t\t&.ck-table-form__border-row {\n\t\t\t& .ck-labeled-field-view {\n\t\t\t\t& > .ck-label {\n\t\t\t\t\tfont-size: var(--ck-font-size-tiny);\n\t\t\t\t\ttext-align: center;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t& .ck-table-form__border-style,\n\t\t\t& .ck-table-form__border-width {\n\t\t\t\twidth: 80px;\n\t\t\t\tmin-width: 80px;\n\t\t\t\tmax-width: 80px;\n\t\t\t}\n\t\t}\n\n\t\t&.ck-table-form__dimensions-row {\n\t\t\tpadding: 0;\n\n\t\t\t& .ck-table-form__dimensions-row__width,\n\t\t\t& .ck-table-form__dimensions-row__height {\n\t\t\t\tmargin: 0\n\t\t\t}\n\n\t\t\t& .ck-table-form__dimension-operator {\n\t\t\t\talign-self: flex-end;\n\t\t\t\tdisplay: inline-block;\n\t\t\t\theight: var(--ck-ui-component-min-height);\n\t\t\t\tline-height: var(--ck-ui-component-min-height);\n\t\t\t\tmargin: 0 var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\t}\n\n\t& .ck.ck-labeled-field-view {\n\t\tpadding-top: var(--ck-spacing-standard);\n\n\t\t& .ck.ck-labeled-field-view__status {\n\t\t\t@mixin ck-rounded-corners;\n\n\t\t\tbackground: var(--ck-color-base-error);\n\t\t\tcolor: var(--ck-color-base-background);\n\t\t\tpadding: var(--ck-spacing-small) var(--ck-spacing-medium);\n\t\t\tmin-width: var(--ck-table-properties-min-error-width);\n\t\t\ttext-align: center;\n\n\t\t\t/* The arrow pointing towards the field. */\n\t\t\t&::after {\n\t\t\t\tborder-color: transparent transparent var(--ck-color-base-error) transparent;\n\t\t\t\tborder-width: 0 var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size);\n\t\t\t\tborder-style: solid;\n\t\t\t}\n\n\t\t\tanimation: ck-table-form-labeled-view-status-appear .15s ease both;\n\t\t}\n\n\t\t/* Hide the error balloon when the field is blurred. Makes the experience much more clear. */\n\t\t& .ck-input.ck-error:not(:focus) + .ck.ck-labeled-field-view__status {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n@keyframes ck-table-form-labeled-view-status-appear {\n\t0% {\n\t\topacity: 0;\n\t}\n\n\t100% {\n\t\topacity: 1;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row{flex-wrap:wrap;flex-basis:0;align-content:baseline}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar .ck-toolbar__items{flex-wrap:nowrap}.ck.ck-table-properties-form{width:320px}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row{align-self:flex-end;padding:0}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar{background:none;margin-top:var(--ck-spacing-standard)}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar .ck-toolbar__items>*{width:40px}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/tableproperties.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/tableproperties.css"],names:[],mappings:"AAOE,mFACC,cAAe,CACf,YAAa,CACb,sBAKD,CAHC,qHACC,gBACD,CCTH,6BACC,WAmBD,CAhBE,mFACC,mBAAoB,CACpB,SAYD,CAVC,kGACC,eAAgB,CAGhB,qCAKD,CAHC,uHACC,UACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-table-properties-form {\n\t& .ck-form__row {\n\t\t&.ck-table-properties-form__alignment-row {\n\t\t\tflex-wrap: wrap;\n\t\t\tflex-basis: 0;\n\t\t\talign-content: baseline;\n\n\t\t\t& .ck.ck-toolbar .ck-toolbar__items {\n\t\t\t\tflex-wrap: nowrap;\n\t\t\t}\n\t\t}\n\t}\n}\n","/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-table-properties-form {\n\twidth: 320px;\n\n\t& .ck-form__row {\n\t\t&.ck-table-properties-form__alignment-row {\n\t\t\talign-self: flex-end;\n\t\t\tpadding: 0;\n\n\t\t\t& .ck.ck-toolbar {\n\t\t\t\tbackground: none;\n\n\t\t\t\t/* Compensate for missing input label that would push the margin (toolbar has no inputs). */\n\t\t\t\tmargin-top: var(--ck-spacing-standard);\n\n\t\t\t\t& .ck-toolbar__items > * {\n\t\t\t\t\twidth: 40px;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,".ck-content span[lang]{font-style:italic}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-language/theme/language.css"],names:[],mappings:"AAAA,uBACC,iBACD",sourcesContent:[".ck-content span[lang] {\n\tfont-style: italic;\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e,n){"use strict";var o=n(2);var i=n.n(o);var r=n(3);var s=n.n(r);var a=s()(i.a);a.push([t.i,':root{--ck-todo-list-checkmark-size:16px}.ck-content .todo-list{list-style:none}.ck-content .todo-list li{margin-bottom:5px}.ck-content .todo-list li .todo-list{margin-top:5px}.ck-content .todo-list .todo-list__label>input{-webkit-appearance:none;display:inline-block;position:relative;width:var(--ck-todo-list-checkmark-size);height:var(--ck-todo-list-checkmark-size);vertical-align:middle;border:0;left:-25px;margin-right:-15px;right:0;margin-left:0}.ck-content .todo-list .todo-list__label>input:before{display:block;position:absolute;box-sizing:border-box;content:"";width:100%;height:100%;border:1px solid #333;border-radius:2px;transition:box-shadow .25s ease-in-out,background .25s ease-in-out,border .25s ease-in-out}.ck-content .todo-list .todo-list__label>input:after{display:block;position:absolute;box-sizing:content-box;pointer-events:none;content:"";left:calc(var(--ck-todo-list-checkmark-size)/3);top:calc(var(--ck-todo-list-checkmark-size)/5.3);width:calc(var(--ck-todo-list-checkmark-size)/5.3);height:calc(var(--ck-todo-list-checkmark-size)/2.6);border-left:0 solid transparent;border-bottom:calc(var(--ck-todo-list-checkmark-size)/8) solid transparent;border-right:calc(var(--ck-todo-list-checkmark-size)/8) solid transparent;border-top:0 solid transparent;transform:rotate(45deg)}.ck-content .todo-list .todo-list__label>input[checked]:before{background:#26ab33;border-color:#26ab33}.ck-content .todo-list .todo-list__label>input[checked]:after{border-color:#fff}.ck-content .todo-list .todo-list__label .todo-list__label__description{vertical-align:middle}[dir=rtl] .todo-list .todo-list__label>input{left:0;margin-right:0;right:-25px;margin-left:-15px}.ck-editor__editable .todo-list .todo-list__label>input{cursor:pointer}.ck-editor__editable .todo-list .todo-list__label>input:hover:before{box-shadow:0 0 0 5px rgba(0,0,0,.1)}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-list/theme/todolist.css"],names:[],mappings:"AAKA,MACC,kCACD,CAEA,uBACC,eA0ED,CAxEC,0BACC,iBAKD,CAHC,qCACC,cACD,CAIA,+CACC,uBAAwB,CACxB,oBAAqB,CACrB,iBAAkB,CAClB,wCAAyC,CACzC,yCAA0C,CAC1C,qBAAsB,CAGtB,QAAS,CAGT,UAAW,CACX,kBAAmB,CACnB,OAAQ,CACR,aA0CD,CAxCC,sDACC,aAAc,CACd,iBAAkB,CAClB,qBAAsB,CACtB,UAAW,CACX,UAAW,CACX,WAAY,CACZ,qBAAiC,CACjC,iBAAkB,CAClB,0FACD,CAEA,qDACC,aAAc,CACd,iBAAkB,CAClB,sBAAuB,CACvB,mBAAoB,CACpB,UAAW,CAGX,+CAAoD,CACpD,gDAAqD,CACrD,kDAAuD,CACvD,mDAAwD,CAGxD,+BAA+G,CAA/G,0EAA+G,CAA/G,yEAA+G,CAA/G,8BAA+G,CAC/G,uBACD,CAGC,+DACC,kBAA8B,CAC9B,oBACD,CAEA,8DACC,iBACD,CAIF,wEACC,qBACD,CAKF,6CACC,MAAO,CACP,cAAe,CACf,WAAY,CACZ,iBACD,CAMA,wDACC,cAKD,CAHC,qEACC,mCACD",sourcesContent:["/*\n * Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-todo-list-checkmark-size: 16px;\n}\n\n.ck-content .todo-list {\n\tlist-style: none;\n\n\t& li {\n\t\tmargin-bottom: 5px;\n\n\t\t& .todo-list {\n\t\t\tmargin-top: 5px;\n\t\t}\n\t}\n\n\t& .todo-list__label {\n\t\t& > input {\n\t\t\t-webkit-appearance: none;\n\t\t\tdisplay: inline-block;\n\t\t\tposition: relative;\n\t\t\twidth: var(--ck-todo-list-checkmark-size);\n\t\t\theight: var(--ck-todo-list-checkmark-size);\n\t\t\tvertical-align: middle;\n\n\t\t\t/* Needed on iOS */\n\t\t\tborder: 0;\n\n\t\t\t/* LTR styles */\n\t\t\tleft: -25px;\n\t\t\tmargin-right: -15px;\n\t\t\tright: 0;\n\t\t\tmargin-left: 0;\n\n\t\t\t&::before {\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tcontent: '';\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tborder: 1px solid hsl(0, 0%, 20%);\n\t\t\t\tborder-radius: 2px;\n\t\t\t\ttransition: 250ms ease-in-out box-shadow, 250ms ease-in-out background, 250ms ease-in-out border;\n\t\t\t}\n\n\t\t\t&::after {\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tbox-sizing: content-box;\n\t\t\t\tpointer-events: none;\n\t\t\t\tcontent: '';\n\n\t\t\t\t/* Calculate tick position, size and border-width proportional to the checkmark size. */\n\t\t\t\tleft: calc( var(--ck-todo-list-checkmark-size) / 3 );\n\t\t\t\ttop: calc( var(--ck-todo-list-checkmark-size) / 5.3 );\n\t\t\t\twidth: calc( var(--ck-todo-list-checkmark-size) / 5.3 );\n\t\t\t\theight: calc( var(--ck-todo-list-checkmark-size) / 2.6 );\n\t\t\t\tborder-style: solid;\n\t\t\t\tborder-color: transparent;\n\t\t\t\tborder-width: 0 calc( var(--ck-todo-list-checkmark-size) / 8 ) calc( var(--ck-todo-list-checkmark-size) / 8 ) 0;\n\t\t\t\ttransform: rotate(45deg);\n\t\t\t}\n\n\t\t\t&[checked] {\n\t\t\t\t&::before {\n\t\t\t\t\tbackground: hsl(126, 64%, 41%);\n\t\t\t\t\tborder-color: hsl(126, 64%, 41%);\n\t\t\t\t}\n\n\t\t\t\t&::after {\n\t\t\t\t\tborder-color: hsl(0, 0%, 100%);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t& .todo-list__label__description {\n\t\t\tvertical-align: middle;\n\t\t}\n\t}\n}\n\n/* RTL styles */\n[dir=\"rtl\"] .todo-list .todo-list__label > input {\n\tleft: 0;\n\tmargin-right: 0;\n\tright: -25px;\n\tmargin-left: -15px;\n}\n\n/*\n * To-do list should be interactive only during the editing\n * (https://github.com/ckeditor/ckeditor5/issues/2090).\n */\n.ck-editor__editable .todo-list .todo-list__label > input {\n\tcursor: pointer;\n\n\t&:hover::before {\n\t\tbox-shadow: 0 0 0 5px hsla(0, 0%, 0%, 0.1);\n\t}\n}\n"],sourceRoot:""}]);e["a"]=a},function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(t){if(typeof window==="object")n=window}t.exports=n},function(t,e,n){"use strict";function o(){return false}e["a"]=o},function(t,e,n){"use strict";n.r(e);function o(){return function t(){t.called=true}}var i=o;class r{constructor(t,e){this.source=t;this.name=e;this.path=[];this.stop=i();this.off=i()}}const s=new Array(256).fill().map(((t,e)=>("0"+e.toString(16)).slice(-2)));function a(){const t=Math.random()*4294967296>>>0;const e=Math.random()*4294967296>>>0;const n=Math.random()*4294967296>>>0;const o=Math.random()*4294967296>>>0;return"e"+s[t>>0&255]+s[t>>8&255]+s[t>>16&255]+s[t>>24&255]+s[e>>0&255]+s[e>>8&255]+s[e>>16&255]+s[e>>24&255]+s[n>>0&255]+s[n>>8&255]+s[n>>16&255]+s[n>>24&255]+s[o>>0&255]+s[o>>8&255]+s[o>>16&255]+s[o>>24&255]}const c={get(t){if(typeof t!="number"){return this[t]||this.normal}else{return t}},highest:1e5,high:1e3,normal:0,low:-1e3,lowest:-1e5};var l=c;var d=n(8);var u=n(0);const h=Symbol("listeningTo");const f=Symbol("emitterId");const m={on(t,e,n={}){this.listenTo(this,t,e,n)},once(t,e,n){let o=false;const i=function(t,...n){if(!o){o=true;t.off();e.call(this,t,...n)}};this.listenTo(this,t,i,n)},off(t,e){this.stopListening(this,t,e)},listenTo(t,e,n,o={}){let i,r;if(!this[h]){this[h]={}}const s=this[h];if(!k(t)){b(t)}const a=k(t);if(!(i=s[a])){i=s[a]={emitter:t,callbacks:{}}}if(!(r=i.callbacks[e])){r=i.callbacks[e]=[]}r.push(n);x(this,t,e,n,o)},stopListening(t,e,n){const o=this[h];let i=t&&k(t);const r=o&&i&&o[i];const s=r&&e&&r.callbacks[e];if(!o||t&&!r||e&&!s){return}if(n){E(this,t,e,n);const o=s.indexOf(n);if(o!==-1){if(s.length===1){delete r.callbacks[e]}else{E(this,t,e,n)}}}else if(s){while(n=s.pop()){E(this,t,e,n)}delete r.callbacks[e]}else if(r){for(e in r.callbacks){this.stopListening(t,e)}delete o[i]}else{for(i in o){this.stopListening(o[i].emitter)}delete this[h]}},fire(t,...e){try{const n=t instanceof r?t:new r(this,t);const o=n.name;let i=v(this,o);n.path.push(this);if(i){const t=[n,...e];i=Array.from(i);for(let e=0;e<i.length;e++){i[e].callback.apply(this,t);if(n.off.called){delete n.off.called;this._removeEventListener(o,i[e].callback)}if(n.stop.called){break}}}if(this._delegations){const t=this._delegations.get(o);const i=this._delegations.get("*");if(t){y(t,n,e)}if(i){y(i,n,e)}}return n.return}catch(t){u["a"].rethrowUnexpectedError(t,this)}},delegate(...t){return{to:(e,n)=>{if(!this._delegations){this._delegations=new Map}t.forEach((t=>{const o=this._delegations.get(t);if(!o){this._delegations.set(t,new Map([[e,n]]))}else{o.set(e,n)}}))}}},stopDelegating(t,e){if(!this._delegations){return}if(!t){this._delegations.clear()}else if(!e){this._delegations.delete(t)}else{const n=this._delegations.get(t);if(n){n.delete(e)}}},_addEventListener(t,e,n){A(this,t);const o=_(this,t);const i=l.get(n.priority);const r={callback:e,priority:i};for(const t of o){let e=false;for(let n=0;n<t.length;n++){if(t[n].priority<i){t.splice(n,0,r);e=true;break}}if(!e){t.push(r)}}},_removeEventListener(t,e){const n=_(this,t);for(const t of n){for(let n=0;n<t.length;n++){if(t[n].callback==e){t.splice(n,1);n--}}}}};var g=m;function p(t,e){if(t[h]&&t[h][e]){return t[h][e].emitter}return null}function b(t,e){if(!t[f]){t[f]=e||a()}}function k(t){return t[f]}function w(t){if(!t._events){Object.defineProperty(t,"_events",{value:{}})}return t._events}function C(){return{callbacks:[],childEvents:[]}}function A(t,e){const n=w(t);if(n[e]){return}let o=e;let i=null;const r=[];while(o!==""){if(n[o]){break}n[o]=C();r.push(n[o]);if(i){n[o].childEvents.push(i)}i=o;o=o.substr(0,o.lastIndexOf(":"))}if(o!==""){for(const t of r){t.callbacks=n[o].callbacks.slice()}n[o].childEvents.push(i)}}function _(t,e){const n=w(t)[e];if(!n){return[]}let o=[n.callbacks];for(let e=0;e<n.childEvents.length;e++){const i=_(t,n.childEvents[e]);o=o.concat(i)}return o}function v(t,e){let n;if(!t._events||!(n=t._events[e])||!n.callbacks.length){if(e.indexOf(":")>-1){return v(t,e.substr(0,e.lastIndexOf(":")))}else{return null}}return n.callbacks}function y(t,e,n){for(let[o,i]of t){if(!i){i=e.name}else if(typeof i=="function"){i=i(e.name)}const t=new r(e.source,i);t.path=[...e.path];o.fire(t,...n)}}function x(t,e,n,o,i){if(e._addEventListener){e._addEventListener(n,o,i)}else{t._addEventListener.call(e,n,o,i)}}function E(t,e,n,o){if(e._removeEventListener){e._removeEventListener(n,o)}else{t._removeEventListener.call(e,n,o)}}function D(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}var S=D;var B=n(5);var T=B["a"].Symbol;var P=T;var I=Object.prototype;var R=I.hasOwnProperty;var F=I.toString;var z=P?P.toStringTag:undefined;function O(t){var e=R.call(t,z),n=t[z];try{t[z]=undefined;var o=true}catch(t){}var i=F.call(t);if(o){if(e){t[z]=n}else{delete t[z]}}return i}var N=O;var M=Object.prototype;var V=M.toString;function L(t){return V.call(t)}var H=L;var K="[object Null]",q="[object Undefined]";var j=P?P.toStringTag:undefined;function W(t){if(t==null){return t===undefined?q:K}return j&&j in Object(t)?N(t):H(t)}var G=W;var U="[object AsyncFunction]",$="[object Function]",J="[object GeneratorFunction]",Y="[object Proxy]";function Q(t){if(!S(t)){return false}var e=G(t);return e==$||e==J||e==U||e==Y}var X=Q;var Z=B["a"]["__core-js_shared__"];var tt=Z;var et=function(){var t=/[^.]+$/.exec(tt&&tt.keys&&tt.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();function nt(t){return!!et&&et in t}var ot=nt;var it=Function.prototype;var rt=it.toString;function st(t){if(t!=null){try{return rt.call(t)}catch(t){}try{return t+""}catch(t){}}return""}var at=st;var ct=/[\\^$.*+?()[\]{}|]/g;var lt=/^\[object .+?Constructor\]$/;var dt=Function.prototype,ut=Object.prototype;var ht=dt.toString;var ft=ut.hasOwnProperty;var mt=RegExp("^"+ht.call(ft).replace(ct,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function gt(t){if(!S(t)||ot(t)){return false}var e=X(t)?mt:lt;return e.test(at(t))}var pt=gt;function bt(t,e){return t==null?undefined:t[e]}var kt=bt;function wt(t,e){var n=kt(t,e);return pt(n)?n:undefined}var Ct=wt;var At=function(){try{var t=Ct(Object,"defineProperty");t({},"",{});return t}catch(t){}}();var _t=At;function vt(t,e,n){if(e=="__proto__"&&_t){_t(t,e,{configurable:true,enumerable:true,value:n,writable:true})}else{t[e]=n}}var yt=vt;function xt(t,e){return t===e||t!==t&&e!==e}var Et=xt;var Dt=Object.prototype;var St=Dt.hasOwnProperty;function Bt(t,e,n){var o=t[e];if(!(St.call(t,e)&&Et(o,n))||n===undefined&&!(e in t)){yt(t,e,n)}}var Tt=Bt;function Pt(t,e,n,o){var i=!n;n||(n={});var r=-1,s=e.length;while(++r<s){var a=e[r];var c=o?o(n[a],t[a],a,n,t):undefined;if(c===undefined){c=t[a]}if(i){yt(n,a,c)}else{Tt(n,a,c)}}return n}var It=Pt;function Rt(t){return t}var Ft=Rt;function zt(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}var Ot=zt;var Nt=Math.max;function Mt(t,e,n){e=Nt(e===undefined?t.length-1:e,0);return function(){var o=arguments,i=-1,r=Nt(o.length-e,0),s=Array(r);while(++i<r){s[i]=o[e+i]}i=-1;var a=Array(e+1);while(++i<e){a[i]=o[i]}a[e]=n(s);return Ot(t,this,a)}}var Vt=Mt;function Lt(t){return function(){return t}}var Ht=Lt;var Kt=!_t?Ft:function(t,e){return _t(t,"toString",{configurable:true,enumerable:false,value:Ht(e),writable:true})};var qt=Kt;var jt=800,Wt=16;var Gt=Date.now;function Ut(t){var e=0,n=0;return function(){var o=Gt(),i=Wt-(o-n);n=o;if(i>0){if(++e>=jt){return arguments[0]}}else{e=0}return t.apply(undefined,arguments)}}var $t=Ut;var Jt=$t(qt);var Yt=Jt;function Qt(t,e){return Yt(Vt(t,e,Ft),t+"")}var Xt=Qt;var Zt=9007199254740991;function te(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=Zt}var ee=te;function ne(t){return t!=null&&ee(t.length)&&!X(t)}var oe=ne;var ie=9007199254740991;var re=/^(?:0|[1-9]\d*)$/;function se(t,e){var n=typeof t;e=e==null?ie:e;return!!e&&(n=="number"||n!="symbol"&&re.test(t))&&(t>-1&&t%1==0&&t<e)}var ae=se;function ce(t,e,n){if(!S(n)){return false}var o=typeof e;if(o=="number"?oe(n)&&ae(e,n.length):o=="string"&&e in n){return Et(n[e],t)}return false}var le=ce;function de(t){return Xt((function(e,n){var o=-1,i=n.length,r=i>1?n[i-1]:undefined,s=i>2?n[2]:undefined;r=t.length>3&&typeof r=="function"?(i--,r):undefined;if(s&&le(n[0],n[1],s)){r=i<3?undefined:r;i=1}e=Object(e);while(++o<i){var a=n[o];if(a){t(e,a,o,r)}}return e}))}var ue=de;function he(t,e){var n=-1,o=Array(t);while(++n<t){o[n]=e(n)}return o}var fe=he;function me(t){return t!=null&&typeof t=="object"}var ge=me;var pe="[object Arguments]";function be(t){return ge(t)&&G(t)==pe}var ke=be;var we=Object.prototype;var Ce=we.hasOwnProperty;var Ae=we.propertyIsEnumerable;var _e=ke(function(){return arguments}())?ke:function(t){return ge(t)&&Ce.call(t,"callee")&&!Ae.call(t,"callee")};var ve=_e;var ye=Array.isArray;var xe=ye;var Ee=n(6);var De="[object Arguments]",Se="[object Array]",Be="[object Boolean]",Te="[object Date]",Pe="[object Error]",Ie="[object Function]",Re="[object Map]",Fe="[object Number]",ze="[object Object]",Oe="[object RegExp]",Ne="[object Set]",Me="[object String]",Ve="[object WeakMap]";var Le="[object ArrayBuffer]",He="[object DataView]",Ke="[object Float32Array]",qe="[object Float64Array]",je="[object Int8Array]",We="[object Int16Array]",Ge="[object Int32Array]",Ue="[object Uint8Array]",$e="[object Uint8ClampedArray]",Je="[object Uint16Array]",Ye="[object Uint32Array]";var Qe={};Qe[Ke]=Qe[qe]=Qe[je]=Qe[We]=Qe[Ge]=Qe[Ue]=Qe[$e]=Qe[Je]=Qe[Ye]=true;Qe[De]=Qe[Se]=Qe[Le]=Qe[Be]=Qe[He]=Qe[Te]=Qe[Pe]=Qe[Ie]=Qe[Re]=Qe[Fe]=Qe[ze]=Qe[Oe]=Qe[Ne]=Qe[Me]=Qe[Ve]=false;function Xe(t){return ge(t)&&ee(t.length)&&!!Qe[G(t)]}var Ze=Xe;function tn(t){return function(e){return t(e)}}var en=tn;var nn=n(7);var on=nn["a"]&&nn["a"].isTypedArray;var rn=on?en(on):Ze;var sn=rn;var an=Object.prototype;var cn=an.hasOwnProperty;function ln(t,e){var n=xe(t),o=!n&&ve(t),i=!n&&!o&&Object(Ee["a"])(t),r=!n&&!o&&!i&&sn(t),s=n||o||i||r,a=s?fe(t.length,String):[],c=a.length;for(var l in t){if((e||cn.call(t,l))&&!(s&&(l=="length"||i&&(l=="offset"||l=="parent")||r&&(l=="buffer"||l=="byteLength"||l=="byteOffset")||ae(l,c)))){a.push(l)}}return a}var dn=ln;var un=Object.prototype;function hn(t){var e=t&&t.constructor,n=typeof e=="function"&&e.prototype||un;return t===n}var fn=hn;function mn(t){var e=[];if(t!=null){for(var n in Object(t)){e.push(n)}}return e}var gn=mn;var pn=Object.prototype;var bn=pn.hasOwnProperty;function kn(t){if(!S(t)){return gn(t)}var e=fn(t),n=[];for(var o in t){if(!(o=="constructor"&&(e||!bn.call(t,o)))){n.push(o)}}return n}var wn=kn;function Cn(t){return oe(t)?dn(t,true):wn(t)}var An=Cn;var _n=ue((function(t,e){It(e,An(e),t)}));var vn=_n;const yn=Symbol("observableProperties");const xn=Symbol("boundObservables");const En=Symbol("boundProperties");const Dn=Symbol("decoratedMethods");const Sn=Symbol("decoratedOriginal");const Bn={set(t,e){if(S(t)){Object.keys(t).forEach((e=>{this.set(e,t[e])}),this);return}Pn(this);const n=this[yn];if(t in this&&!n.has(t)){throw new u["a"]("observable-set-cannot-override",this)}Object.defineProperty(this,t,{enumerable:true,configurable:true,get(){return n.get(t)},set(e){const o=n.get(t);let i=this.fire("set:"+t,t,e,o);if(i===undefined){i=e}if(o!==i||!n.has(t)){n.set(t,i);this.fire("change:"+t,t,i,o)}}});this[t]=e},bind(...t){if(!t.length||!zn(t)){throw new u["a"]("observable-bind-wrong-properties",this)}if(new Set(t).size!==t.length){throw new u["a"]("observable-bind-duplicate-properties",this)}Pn(this);const e=this[En];t.forEach((t=>{if(e.has(t)){throw new u["a"]("observable-bind-rebind",this)}}));const n=new Map;t.forEach((t=>{const o={property:t,to:[]};e.set(t,o);n.set(t,o)}));return{to:In,toMany:Rn,_observable:this,_bindProperties:t,_to:[],_bindings:n}},unbind(...t){if(!this[yn]){return}const e=this[En];const n=this[xn];if(t.length){if(!zn(t)){throw new u["a"]("observable-unbind-wrong-properties",this)}t.forEach((t=>{const o=e.get(t);if(!o){return}let i,r,s,a;o.to.forEach((t=>{i=t[0];r=t[1];s=n.get(i);a=s[r];a.delete(o);if(!a.size){delete s[r]}if(!Object.keys(s).length){n.delete(i);this.stopListening(i,"change")}}));e.delete(t)}))}else{n.forEach(((t,e)=>{this.stopListening(e,"change")}));n.clear();e.clear()}},decorate(t){const e=this[t];if(!e){throw new u["a"]("observablemixin-cannot-decorate-undefined",this,{object:this,methodName:t})}this.on(t,((t,n)=>{t.return=e.apply(this,n)}));this[t]=function(...e){return this.fire(t,e)};this[t][Sn]=e;if(!this[Dn]){this[Dn]=[]}this[Dn].push(t)}};vn(Bn,g);Bn.stopListening=function(t,e,n){if(!t&&this[Dn]){for(const t of this[Dn]){this[t]=this[t][Sn]}delete this[Dn]}g.stopListening.call(this,t,e,n)};var Tn=Bn;function Pn(t){if(t[yn]){return}Object.defineProperty(t,yn,{value:new Map});Object.defineProperty(t,xn,{value:new Map});Object.defineProperty(t,En,{value:new Map})}function In(...t){const e=On(...t);const n=Array.from(this._bindings.keys());const o=n.length;if(!e.callback&&e.to.length>1){throw new u["a"]("observable-bind-to-no-callback",this)}if(o>1&&e.callback){throw new u["a"]("observable-bind-to-extra-callback",this)}e.to.forEach((t=>{if(t.properties.length&&t.properties.length!==o){throw new u["a"]("observable-bind-to-properties-length",this)}if(!t.properties.length){t.properties=this._bindProperties}}));this._to=e.to;if(e.callback){this._bindings.get(n[0]).callback=e.callback}Ln(this._observable,this._to);Mn(this);this._bindProperties.forEach((t=>{Vn(this._observable,t)}))}function Rn(t,e,n){if(this._bindings.size>1){throw new u["a"]("observable-bind-to-many-not-one-binding",this)}this.to(...Fn(t,e),n)}function Fn(t,e){const n=t.map((t=>[t,e]));return Array.prototype.concat.apply([],n)}function zn(t){return t.every((t=>typeof t=="string"))}function On(...t){if(!t.length){throw new u["a"]("observable-bind-to-parse-error",null)}const e={to:[]};let n;if(typeof t[t.length-1]=="function"){e.callback=t.pop()}t.forEach((t=>{if(typeof t=="string"){n.properties.push(t)}else if(typeof t=="object"){n={observable:t,properties:[]};e.to.push(n)}else{throw new u["a"]("observable-bind-to-parse-error",null)}}));return e}function Nn(t,e,n,o){const i=t[xn];const r=i.get(n);const s=r||{};if(!s[o]){s[o]=new Set}s[o].add(e);if(!r){i.set(n,s)}}function Mn(t){let e;t._bindings.forEach(((n,o)=>{t._to.forEach((i=>{e=i.properties[n.callback?0:t._bindProperties.indexOf(o)];n.to.push([i.observable,e]);Nn(t._observable,n,i.observable,e)}))}))}function Vn(t,e){const n=t[En];const o=n.get(e);let i;if(o.callback){i=o.callback.apply(t,o.to.map((t=>t[0][t[1]])))}else{i=o.to[0];i=i[0][i[1]]}if(Object.prototype.hasOwnProperty.call(t,e)){t[e]=i}else{t.set(e,i)}}function Ln(t,e){e.forEach((e=>{const n=t[xn];let o;if(!n.get(e.observable)){t.listenTo(e.observable,"change",((i,r)=>{o=n.get(e.observable)[r];if(o){o.forEach((e=>{Vn(t,e.property)}))}}))}}))}function Hn(t,...e){e.forEach((e=>{Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e)).forEach((n=>{if(n in t.prototype){return}const o=Object.getOwnPropertyDescriptor(e,n);o.enumerable=false;Object.defineProperty(t.prototype,n,o)}))}))}class Kn{constructor(t){this.editor=t;this.set("isEnabled",true);this._disableStack=new Set}forceDisabled(t){this._disableStack.add(t);if(this._disableStack.size==1){this.on("set:isEnabled",qn,{priority:"highest"});this.isEnabled=false}}clearForceDisabled(t){this._disableStack.delete(t);if(this._disableStack.size==0){this.off("set:isEnabled",qn);this.isEnabled=true}}destroy(){this.stopListening()}static get isContextPlugin(){return false}}Hn(Kn,Tn);function qn(t){t.return=false;t.stop()}class jn{constructor(t){this.editor=t;this.set("value",undefined);this.set("isEnabled",false);this._disableStack=new Set;this.decorate("execute");this.listenTo(this.editor.model.document,"change",(()=>{this.refresh()}));this.on("execute",(t=>{if(!this.isEnabled){t.stop()}}),{priority:"high"});this.listenTo(t,"change:isReadOnly",((t,e,n)=>{if(n){this.forceDisabled("readOnlyMode")}else{this.clearForceDisabled("readOnlyMode")}}))}refresh(){this.isEnabled=true}forceDisabled(t){this._disableStack.add(t);if(this._disableStack.size==1){this.on("set:isEnabled",Wn,{priority:"highest"});this.isEnabled=false}}clearForceDisabled(t){this._disableStack.delete(t);if(this._disableStack.size==0){this.off("set:isEnabled",Wn);this.refresh()}}execute(){}destroy(){this.stopListening()}}Hn(jn,Tn);function Wn(t){t.return=false;t.stop()}class Gn extends jn{constructor(t){super(t);this._childCommands=[]}refresh(){}execute(...t){const e=this._getFirstEnabledCommand();return e.execute(t)}registerChildCommand(t){this._childCommands.push(t);t.on("change:isEnabled",(()=>this._checkEnabled()));this._checkEnabled()}_checkEnabled(){this.isEnabled=!!this._getFirstEnabledCommand()}_getFirstEnabledCommand(){return this._childCommands.find((t=>t.isEnabled))}}function Un(t,e){return function(n){return t(e(n))}}var $n=Un;var Jn=$n(Object.getPrototypeOf,Object);var Yn=Jn;var Qn="[object Object]";var Xn=Function.prototype,Zn=Object.prototype;var to=Xn.toString;var eo=Zn.hasOwnProperty;var no=to.call(Object);function oo(t){if(!ge(t)||G(t)!=Qn){return false}var e=Yn(t);if(e===null){return true}var n=eo.call(e,"constructor")&&e.constructor;return typeof n=="function"&&n instanceof n&&to.call(n)==no}var io=oo;function ro(){this.__data__=[];this.size=0}var so=ro;function ao(t,e){var n=t.length;while(n--){if(Et(t[n][0],e)){return n}}return-1}var co=ao;var lo=Array.prototype;var uo=lo.splice;function ho(t){var e=this.__data__,n=co(e,t);if(n<0){return false}var o=e.length-1;if(n==o){e.pop()}else{uo.call(e,n,1)}--this.size;return true}var fo=ho;function mo(t){var e=this.__data__,n=co(e,t);return n<0?undefined:e[n][1]}var go=mo;function po(t){return co(this.__data__,t)>-1}var bo=po;function ko(t,e){var n=this.__data__,o=co(n,t);if(o<0){++this.size;n.push([t,e])}else{n[o][1]=e}return this}var wo=ko;function Co(t){var e=-1,n=t==null?0:t.length;this.clear();while(++e<n){var o=t[e];this.set(o[0],o[1])}}Co.prototype.clear=so;Co.prototype["delete"]=fo;Co.prototype.get=go;Co.prototype.has=bo;Co.prototype.set=wo;var Ao=Co;function _o(){this.__data__=new Ao;this.size=0}var vo=_o;function yo(t){var e=this.__data__,n=e["delete"](t);this.size=e.size;return n}var xo=yo;function Eo(t){return this.__data__.get(t)}var Do=Eo;function So(t){return this.__data__.has(t)}var Bo=So;var To=Ct(B["a"],"Map");var Po=To;var Io=Ct(Object,"create");var Ro=Io;function Fo(){this.__data__=Ro?Ro(null):{};this.size=0}var zo=Fo;function Oo(t){var e=this.has(t)&&delete this.__data__[t];this.size-=e?1:0;return e}var No=Oo;var Mo="__lodash_hash_undefined__";var Vo=Object.prototype;var Lo=Vo.hasOwnProperty;function Ho(t){var e=this.__data__;if(Ro){var n=e[t];return n===Mo?undefined:n}return Lo.call(e,t)?e[t]:undefined}var Ko=Ho;var qo=Object.prototype;var jo=qo.hasOwnProperty;function Wo(t){var e=this.__data__;return Ro?e[t]!==undefined:jo.call(e,t)}var Go=Wo;var Uo="__lodash_hash_undefined__";function $o(t,e){var n=this.__data__;this.size+=this.has(t)?0:1;n[t]=Ro&&e===undefined?Uo:e;return this}var Jo=$o;function Yo(t){var e=-1,n=t==null?0:t.length;this.clear();while(++e<n){var o=t[e];this.set(o[0],o[1])}}Yo.prototype.clear=zo;Yo.prototype["delete"]=No;Yo.prototype.get=Ko;Yo.prototype.has=Go;Yo.prototype.set=Jo;var Qo=Yo;function Xo(){this.size=0;this.__data__={hash:new Qo,map:new(Po||Ao),string:new Qo}}var Zo=Xo;function ti(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}var ei=ti;function ni(t,e){var n=t.__data__;return ei(e)?n[typeof e=="string"?"string":"hash"]:n.map}var oi=ni;function ii(t){var e=oi(this,t)["delete"](t);this.size-=e?1:0;return e}var ri=ii;function si(t){return oi(this,t).get(t)}var ai=si;function ci(t){return oi(this,t).has(t)}var li=ci;function di(t,e){var n=oi(this,t),o=n.size;n.set(t,e);this.size+=n.size==o?0:1;return this}var ui=di;function hi(t){var e=-1,n=t==null?0:t.length;this.clear();while(++e<n){var o=t[e];this.set(o[0],o[1])}}hi.prototype.clear=Zo;hi.prototype["delete"]=ri;hi.prototype.get=ai;hi.prototype.has=li;hi.prototype.set=ui;var fi=hi;var mi=200;function gi(t,e){var n=this.__data__;if(n instanceof Ao){var o=n.__data__;if(!Po||o.length<mi-1){o.push([t,e]);this.size=++n.size;return this}n=this.__data__=new fi(o)}n.set(t,e);this.size=n.size;return this}var pi=gi;function bi(t){var e=this.__data__=new Ao(t);this.size=e.size}bi.prototype.clear=vo;bi.prototype["delete"]=xo;bi.prototype.get=Do;bi.prototype.has=Bo;bi.prototype.set=pi;var ki=bi;function wi(t,e){var n=-1,o=t==null?0:t.length;while(++n<o){if(e(t[n],n,t)===false){break}}return t}var Ci=wi;var Ai=$n(Object.keys,Object);var _i=Ai;var vi=Object.prototype;var yi=vi.hasOwnProperty;function xi(t){if(!fn(t)){return _i(t)}var e=[];for(var n in Object(t)){if(yi.call(t,n)&&n!="constructor"){e.push(n)}}return e}var Ei=xi;function Di(t){return oe(t)?dn(t):Ei(t)}var Si=Di;function Bi(t,e){return t&&It(e,Si(e),t)}var Ti=Bi;function Pi(t,e){return t&&It(e,An(e),t)}var Ii=Pi;var Ri=n(10);function Fi(t,e){var n=-1,o=t.length;e||(e=Array(o));while(++n<o){e[n]=t[n]}return e}var zi=Fi;function Oi(t,e){var n=-1,o=t==null?0:t.length,i=0,r=[];while(++n<o){var s=t[n];if(e(s,n,t)){r[i++]=s}}return r}var Ni=Oi;function Mi(){return[]}var Vi=Mi;var Li=Object.prototype;var Hi=Li.propertyIsEnumerable;var Ki=Object.getOwnPropertySymbols;var qi=!Ki?Vi:function(t){if(t==null){return[]}t=Object(t);return Ni(Ki(t),(function(e){return Hi.call(t,e)}))};var ji=qi;function Wi(t,e){return It(t,ji(t),e)}var Gi=Wi;function Ui(t,e){var n=-1,o=e.length,i=t.length;while(++n<o){t[i+n]=e[n]}return t}var $i=Ui;var Ji=Object.getOwnPropertySymbols;var Yi=!Ji?Vi:function(t){var e=[];while(t){$i(e,ji(t));t=Yn(t)}return e};var Qi=Yi;function Xi(t,e){return It(t,Qi(t),e)}var Zi=Xi;function tr(t,e,n){var o=e(t);return xe(t)?o:$i(o,n(t))}var er=tr;function nr(t){return er(t,Si,ji)}var or=nr;function ir(t){return er(t,An,Qi)}var rr=ir;var sr=Ct(B["a"],"DataView");var ar=sr;var cr=Ct(B["a"],"Promise");var lr=cr;var dr=Ct(B["a"],"Set");var ur=dr;var hr=Ct(B["a"],"WeakMap");var fr=hr;var mr="[object Map]",gr="[object Object]",pr="[object Promise]",br="[object Set]",kr="[object WeakMap]";var wr="[object DataView]";var Cr=at(ar),Ar=at(Po),_r=at(lr),vr=at(ur),yr=at(fr);var xr=G;if(ar&&xr(new ar(new ArrayBuffer(1)))!=wr||Po&&xr(new Po)!=mr||lr&&xr(lr.resolve())!=pr||ur&&xr(new ur)!=br||fr&&xr(new fr)!=kr){xr=function(t){var e=G(t),n=e==gr?t.constructor:undefined,o=n?at(n):"";if(o){switch(o){case Cr:return wr;case Ar:return mr;case _r:return pr;case vr:return br;case yr:return kr}}return e}}var Er=xr;var Dr=Object.prototype;var Sr=Dr.hasOwnProperty;function Br(t){var e=t.length,n=new t.constructor(e);if(e&&typeof t[0]=="string"&&Sr.call(t,"index")){n.index=t.index;n.input=t.input}return n}var Tr=Br;var Pr=B["a"].Uint8Array;var Ir=Pr;function Rr(t){var e=new t.constructor(t.byteLength);new Ir(e).set(new Ir(t));return e}var Fr=Rr;function zr(t,e){var n=e?Fr(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}var Or=zr;var Nr=/\w*$/;function Mr(t){var e=new t.constructor(t.source,Nr.exec(t));e.lastIndex=t.lastIndex;return e}var Vr=Mr;var Lr=P?P.prototype:undefined,Hr=Lr?Lr.valueOf:undefined;function Kr(t){return Hr?Object(Hr.call(t)):{}}var qr=Kr;function jr(t,e){var n=e?Fr(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}var Wr=jr;var Gr="[object Boolean]",Ur="[object Date]",$r="[object Map]",Jr="[object Number]",Yr="[object RegExp]",Qr="[object Set]",Xr="[object String]",Zr="[object Symbol]";var ts="[object ArrayBuffer]",es="[object DataView]",ns="[object Float32Array]",os="[object Float64Array]",is="[object Int8Array]",rs="[object Int16Array]",ss="[object Int32Array]",as="[object Uint8Array]",cs="[object Uint8ClampedArray]",ls="[object Uint16Array]",ds="[object Uint32Array]";function us(t,e,n){var o=t.constructor;switch(e){case ts:return Fr(t);case Gr:case Ur:return new o(+t);case es:return Or(t,n);case ns:case os:case is:case rs:case ss:case as:case cs:case ls:case ds:return Wr(t,n);case $r:return new o;case Jr:case Xr:return new o(t);case Yr:return Vr(t);case Qr:return new o;case Zr:return qr(t)}}var hs=us;var fs=Object.create;var ms=function(){function t(){}return function(e){if(!S(e)){return{}}if(fs){return fs(e)}t.prototype=e;var n=new t;t.prototype=undefined;return n}}();var gs=ms;function ps(t){return typeof t.constructor=="function"&&!fn(t)?gs(Yn(t)):{}}var bs=ps;var ks="[object Map]";function ws(t){return ge(t)&&Er(t)==ks}var Cs=ws;var As=nn["a"]&&nn["a"].isMap;var _s=As?en(As):Cs;var vs=_s;var ys="[object Set]";function xs(t){return ge(t)&&Er(t)==ys}var Es=xs;var Ds=nn["a"]&&nn["a"].isSet;var Ss=Ds?en(Ds):Es;var Bs=Ss;var Ts=1,Ps=2,Is=4;var Rs="[object Arguments]",Fs="[object Array]",zs="[object Boolean]",Os="[object Date]",Ns="[object Error]",Ms="[object Function]",Vs="[object GeneratorFunction]",Ls="[object Map]",Hs="[object Number]",Ks="[object Object]",qs="[object RegExp]",js="[object Set]",Ws="[object String]",Gs="[object Symbol]",Us="[object WeakMap]";var $s="[object ArrayBuffer]",Js="[object DataView]",Ys="[object Float32Array]",Qs="[object Float64Array]",Xs="[object Int8Array]",Zs="[object Int16Array]",ta="[object Int32Array]",ea="[object Uint8Array]",na="[object Uint8ClampedArray]",oa="[object Uint16Array]",ia="[object Uint32Array]";var ra={};ra[Rs]=ra[Fs]=ra[$s]=ra[Js]=ra[zs]=ra[Os]=ra[Ys]=ra[Qs]=ra[Xs]=ra[Zs]=ra[ta]=ra[Ls]=ra[Hs]=ra[Ks]=ra[qs]=ra[js]=ra[Ws]=ra[Gs]=ra[ea]=ra[na]=ra[oa]=ra[ia]=true;ra[Ns]=ra[Ms]=ra[Us]=false;function sa(t,e,n,o,i,r){var s,a=e&Ts,c=e&Ps,l=e&Is;if(n){s=i?n(t,o,i,r):n(t)}if(s!==undefined){return s}if(!S(t)){return t}var d=xe(t);if(d){s=Tr(t);if(!a){return zi(t,s)}}else{var u=Er(t),h=u==Ms||u==Vs;if(Object(Ee["a"])(t)){return Object(Ri["a"])(t,a)}if(u==Ks||u==Rs||h&&!i){s=c||h?{}:bs(t);if(!a){return c?Zi(t,Ii(s,t)):Gi(t,Ti(s,t))}}else{if(!ra[u]){return i?t:{}}s=hs(t,u,a)}}r||(r=new ki);var f=r.get(t);if(f){return f}r.set(t,s);if(Bs(t)){t.forEach((function(o){s.add(sa(o,e,n,o,t,r))}))}else if(vs(t)){t.forEach((function(o,i){s.set(i,sa(o,e,n,i,t,r))}))}var m=l?c?rr:or:c?An:Si;var g=d?undefined:m(t);Ci(g||t,(function(o,i){if(g){i=o;o=t[i]}Tt(s,i,sa(o,e,n,i,t,r))}));return s}var aa=sa;var ca=1,la=4;function da(t,e){e=typeof e=="function"?e:undefined;return aa(t,ca|la,e)}var ua=da;function ha(t){return ge(t)&&t.nodeType===1&&!io(t)}var fa=ha;class ma{constructor(t,e){this._config={};if(e){this.define(ga(e))}if(t){this._setObjectToTarget(this._config,t)}}set(t,e){this._setToTarget(this._config,t,e)}define(t,e){const n=true;this._setToTarget(this._config,t,e,n)}get(t){return this._getFromSource(this._config,t)}*names(){for(const t of Object.keys(this._config)){yield t}}_setToTarget(t,e,n,o=false){if(io(e)){this._setObjectToTarget(t,e,o);return}const i=e.split(".");e=i.pop();for(const e of i){if(!io(t[e])){t[e]={}}t=t[e]}if(io(n)){if(!io(t[e])){t[e]={}}t=t[e];this._setObjectToTarget(t,n,o);return}if(o&&typeof t[e]!="undefined"){return}t[e]=n}_getFromSource(t,e){const n=e.split(".");e=n.pop();for(const e of n){if(!io(t[e])){t=null;break}t=t[e]}return t?ga(t[e]):undefined}_setObjectToTarget(t,e,n){Object.keys(e).forEach((o=>{this._setToTarget(t,o,e[o],n)}))}}function ga(t){return ua(t,pa)}function pa(t){return fa(t)?t:undefined}function ba(t){return!!(t&&t[Symbol.iterator])}class ka{constructor(t={},e={}){const n=ba(t);if(!n){e=t}this._items=[];this._itemMap=new Map;this._idProperty=e.idProperty||"id";this._bindToExternalToInternalMap=new WeakMap;this._bindToInternalToExternalMap=new WeakMap;this._skippedIndexesFromExternal=[];if(n){for(const e of t){this._items.push(e);this._itemMap.set(this._getItemIdBeforeAdding(e),e)}}}get length(){return this._items.length}get first(){return this._items[0]||null}get last(){return this._items[this.length-1]||null}add(t,e){return this.addMany([t],e)}addMany(t,e){if(e===undefined){e=this._items.length}else if(e>this._items.length||e<0){throw new u["a"]("collection-add-item-invalid-index",this)}for(let n=0;n<t.length;n++){const o=t[n];const i=this._getItemIdBeforeAdding(o);const r=e+n;this._items.splice(r,0,o);this._itemMap.set(i,o);this.fire("add",o,r)}this.fire("change",{added:t,removed:[],index:e});return this}get(t){let e;if(typeof t=="string"){e=this._itemMap.get(t)}else if(typeof t=="number"){e=this._items[t]}else{throw new u["a"]("collection-get-invalid-arg",this)}return e||null}has(t){if(typeof t=="string"){return this._itemMap.has(t)}else{const e=this._idProperty;const n=t[e];return this._itemMap.has(n)}}getIndex(t){let e;if(typeof t=="string"){e=this._itemMap.get(t)}else{e=t}return this._items.indexOf(e)}remove(t){const[e,n]=this._remove(t);this.fire("change",{added:[],removed:[e],index:n});return e}map(t,e){return this._items.map(t,e)}find(t,e){return this._items.find(t,e)}filter(t,e){return this._items.filter(t,e)}clear(){if(this._bindToCollection){this.stopListening(this._bindToCollection);this._bindToCollection=null}const t=Array.from(this._items);while(this.length){this._remove(0)}this.fire("change",{added:[],removed:t,index:0})}bindTo(t){if(this._bindToCollection){throw new u["a"]("collection-bind-to-rebind",this)}this._bindToCollection=t;return{as:t=>{this._setUpBindToBinding((e=>new t(e)))},using:t=>{if(typeof t=="function"){this._setUpBindToBinding((e=>t(e)))}else{this._setUpBindToBinding((e=>e[t]))}}}}_setUpBindToBinding(t){const e=this._bindToCollection;const n=(n,o,i)=>{const r=e._bindToCollection==this;const s=e._bindToInternalToExternalMap.get(o);if(r&&s){this._bindToExternalToInternalMap.set(o,s);this._bindToInternalToExternalMap.set(s,o)}else{const n=t(o);if(!n){this._skippedIndexesFromExternal.push(i);return}let r=i;for(const t of this._skippedIndexesFromExternal){if(i>t){r--}}for(const t of e._skippedIndexesFromExternal){if(r>=t){r++}}this._bindToExternalToInternalMap.set(o,n);this._bindToInternalToExternalMap.set(n,o);this.add(n,r);for(let t=0;t<e._skippedIndexesFromExternal.length;t++){if(r<=e._skippedIndexesFromExternal[t]){e._skippedIndexesFromExternal[t]++}}}};for(const t of e){n(null,t,e.getIndex(t))}this.listenTo(e,"add",n);this.listenTo(e,"remove",((t,e,n)=>{const o=this._bindToExternalToInternalMap.get(e);if(o){this.remove(o)}this._skippedIndexesFromExternal=this._skippedIndexesFromExternal.reduce(((t,e)=>{if(n<e){t.push(e-1)}if(n>e){t.push(e)}return t}),[])}))}_getItemIdBeforeAdding(t){const e=this._idProperty;let n;if(e in t){n=t[e];if(typeof n!="string"){throw new u["a"]("collection-add-invalid-id",this)}if(this.get(n)){throw new u["a"]("collection-add-item-already-exists",this)}}else{t[e]=n=a()}return n}_remove(t){let e,n,o;let i=false;const r=this._idProperty;if(typeof t=="string"){n=t;o=this._itemMap.get(n);i=!o;if(o){e=this._items.indexOf(o)}}else if(typeof t=="number"){e=t;o=this._items[e];i=!o;if(o){n=o[r]}}else{o=t;n=o[r];e=this._items.indexOf(o);i=e==-1||!this._itemMap.get(n)}if(i){throw new u["a"]("collection-remove-404",this)}this._items.splice(e,1);this._itemMap.delete(n);const s=this._bindToInternalToExternalMap.get(o);this._bindToInternalToExternalMap.delete(o);this._bindToExternalToInternalMap.delete(s);this.fire("remove",o,e);return[o,e]}[Symbol.iterator](){return this._items[Symbol.iterator]()}}Hn(ka,g);class wa{constructor(t,e=[],n=[]){this._context=t;this._plugins=new Map;this._availablePlugins=new Map;for(const t of e){if(t.pluginName){this._availablePlugins.set(t.pluginName,t)}}this._contextPlugins=new Map;for(const[t,e]of n){this._contextPlugins.set(t,e);this._contextPlugins.set(e,t);if(t.pluginName){this._availablePlugins.set(t.pluginName,t)}}}*[Symbol.iterator](){for(const t of this._plugins){if(typeof t[0]=="function"){yield t}}}get(t){const e=this._plugins.get(t);if(!e){let e=t;if(typeof t=="function"){e=t.pluginName||t.name}throw new u["a"]("plugincollection-plugin-not-loaded",this._context,{plugin:e})}return e}has(t){return this._plugins.has(t)}init(t,e=[],n=[]){const o=this;const i=this._context;f(t);g(t);const r=t.filter((t=>!d(t,e)));const s=[...m(r)];A(s,n);const a=w(s);return C(a,"init").then((()=>C(a,"afterInit"))).then((()=>a));function c(t){return typeof t==="function"}function l(t){return c(t)&&t.isContextPlugin}function d(t,e){return e.some((e=>{if(e===t){return true}if(h(t)===e){return true}if(h(e)===t){return true}return false}))}function h(t){return c(t)?t.pluginName||t.name:t}function f(t,e=new Set){t.forEach((t=>{if(!c(t)){return}if(e.has(t)){return}e.add(t);if(t.pluginName&&!o._availablePlugins.has(t.pluginName)){o._availablePlugins.set(t.pluginName,t)}if(t.requires){f(t.requires,e)}}))}function m(t,e=new Set){return t.map((t=>c(t)?t:o._availablePlugins.get(t))).reduce(((t,n)=>{if(e.has(n)){return t}e.add(n);if(n.requires){g(n.requires,n);m(n.requires,e).forEach((e=>t.add(e)))}return t.add(n)}),new Set)}function g(t,e=null){t.map((t=>c(t)?t:o._availablePlugins.get(t)||t)).forEach((t=>{p(t,e);b(t,e);k(t,e)}))}function p(t,e){if(c(t)){return}if(e){throw new u["a"]("plugincollection-soft-required",i,{missingPlugin:t,requiredBy:h(e)})}throw new u["a"]("plugincollection-plugin-not-found",i,{plugin:t})}function b(t,e){if(!l(e)){return}if(l(t)){return}throw new u["a"]("plugincollection-context-required",i,{plugin:h(t),requiredBy:h(e)})}function k(t,n){if(!n){return}if(!d(t,e)){return}throw new u["a"]("plugincollection-required",i,{plugin:h(t),requiredBy:h(n)})}function w(t){return t.map((t=>{const e=o._contextPlugins.get(t)||new t(i);o._add(t,e);return e}))}function C(t,e){return t.reduce(((t,n)=>{if(!n[e]){return t}if(o._contextPlugins.has(n)){return t}return t.then(n[e].bind(n))}),Promise.resolve())}function A(t,e){for(const n of e){if(typeof n!="function"){throw new u["a"]("plugincollection-replace-plugin-invalid-type",null,{pluginItem:n})}const e=n.pluginName;if(!e){throw new u["a"]("plugincollection-replace-plugin-missing-name",null,{pluginItem:n})}if(n.requires&&n.requires.length){throw new u["a"]("plugincollection-plugin-for-replacing-cannot-have-dependencies",null,{pluginName:e})}const i=o._availablePlugins.get(e);if(!i){throw new u["a"]("plugincollection-plugin-for-replacing-not-exist",null,{pluginName:e})}const r=t.indexOf(i);if(r===-1){if(o._contextPlugins.has(i)){return}throw new u["a"]("plugincollection-plugin-for-replacing-not-loaded",null,{pluginName:e})}if(i.requires&&i.requires.length){throw new u["a"]("plugincollection-replaced-plugin-cannot-have-dependencies",null,{pluginName:e})}t.splice(r,1,n);o._availablePlugins.set(e,n)}}}destroy(){const t=[];for(const[,e]of this){if(typeof e.destroy=="function"&&!this._contextPlugins.has(e)){t.push(e.destroy())}}return Promise.all(t)}_add(t,e){this._plugins.set(t,e);const n=t.pluginName;if(!n){return}if(this._plugins.has(n)){throw new u["a"]("plugincollection-plugin-name-conflict",null,{pluginName:n,plugin1:this._plugins.get(n).constructor,plugin2:t})}this._plugins.set(n,e)}}Hn(wa,g);function Ca(t){return Array.isArray(t)?t:[t]}if(!window.CKEDITOR_TRANSLATIONS){window.CKEDITOR_TRANSLATIONS={}}function Aa(t,e,n){if(!window.CKEDITOR_TRANSLATIONS[t]){window.CKEDITOR_TRANSLATIONS[t]={}}const o=window.CKEDITOR_TRANSLATIONS[t];o.dictionary=o.dictionary||{};o.getPluralForm=n||o.getPluralForm;Object.assign(o.dictionary,e)}function _a(t,e,n=1){if(typeof n!=="number"){throw new u["a"]("translation-service-quantity-not-a-number",null,{quantity:n})}const o=xa();if(o===1){t=Object.keys(window.CKEDITOR_TRANSLATIONS)[0]}const i=e.id||e.string;if(o===0||!ya(t,i)){if(n!==1){return e.plural}return e.string}const r=window.CKEDITOR_TRANSLATIONS[t].dictionary;const s=window.CKEDITOR_TRANSLATIONS[t].getPluralForm||(t=>t===1?0:1);if(typeof r[i]==="string"){return r[i]}const a=Number(s(n));return r[i][a]}function va(){window.CKEDITOR_TRANSLATIONS={}}function ya(t,e){return!!window.CKEDITOR_TRANSLATIONS[t]&&!!window.CKEDITOR_TRANSLATIONS[t].dictionary[e]}function xa(){return Object.keys(window.CKEDITOR_TRANSLATIONS).length}const Ea=["ar","ara","fa","per","fas","he","heb","ku","kur","ug","uig"];function Da(t){return Ea.includes(t)?"rtl":"ltr"}class Sa{constructor(t={}){this.uiLanguage=t.uiLanguage||"en";this.contentLanguage=t.contentLanguage||this.uiLanguage;this.uiLanguageDirection=Da(this.uiLanguage);this.contentLanguageDirection=Da(this.contentLanguage);this.t=(t,e)=>this._t(t,e)}get language(){console.warn("locale-deprecated-language-property: "+"The Locale#language property has been deprecated and will be removed in the near future. "+"Please use #uiLanguage and #contentLanguage properties instead.");return this.uiLanguage}_t(t,e=[]){e=Ca(e);if(typeof t==="string"){t={string:t}}const n=!!t.plural;const o=n?e[0]:1;const i=_a(this.uiLanguage,t,o);return Ba(i,e)}}function Ba(t,e){return t.replace(/%(\d+)/g,((t,n)=>n<e.length?e[n]:t))}class Ta{constructor(t){this.config=new ma(t,this.constructor.defaultConfig);const e=this.constructor.builtinPlugins;this.config.define("plugins",e);this.plugins=new wa(this,e);const n=this.config.get("language")||{};this.locale=new Sa({uiLanguage:typeof n==="string"?n:n.ui,contentLanguage:this.config.get("language.content")});this.t=this.locale.t;this.editors=new ka;this._contextOwner=null}initPlugins(){const t=this.config.get("plugins")||[];const e=this.config.get("substitutePlugins")||[];for(const n of t.concat(e)){if(typeof n!="function"){throw new u["a"]("context-initplugins-constructor-only",null,{Plugin:n})}if(n.isContextPlugin!==true){throw new u["a"]("context-initplugins-invalid-plugin",null,{Plugin:n})}}return this.plugins.init(t,[],e)}destroy(){return Promise.all(Array.from(this.editors,(t=>t.destroy()))).then((()=>this.plugins.destroy()))}_addEditor(t,e){if(this._contextOwner){throw new u["a"]("context-addeditor-private-context")}this.editors.add(t);if(e){this._contextOwner=t}}_removeEditor(t){if(this.editors.has(t)){this.editors.remove(t)}if(this._contextOwner===t){return this.destroy()}return Promise.resolve()}_getEditorConfig(){const t={};for(const e of this.config.names()){if(!["plugins","removePlugins","extraPlugins"].includes(e)){t[e]=this.config.get(e)}}return t}static create(t){return new Promise((e=>{const n=new this(t);e(n.initPlugins().then((()=>n)))}))}}class Pa{constructor(t){this.context=t}destroy(){this.stopListening()}static get isContextPlugin(){return true}}Hn(Pa,Tn);function Ia(t,e){const n=Math.min(t.length,e.length);for(let o=0;o<n;o++){if(t[o]!=e[o]){return o}}if(t.length==e.length){return"same"}else if(t.length<e.length){return"prefix"}else{return"extension"}}var Ra=4;function Fa(t){return aa(t,Ra)}var za=Fa;class Oa{constructor(t){this.document=t;this.parent=null}get index(){let t;if(!this.parent){return null}if((t=this.parent.getChildIndex(this))==-1){throw new u["a"]("view-node-not-found-in-parent",this)}return t}get nextSibling(){const t=this.index;return t!==null&&this.parent.getChild(t+1)||null}get previousSibling(){const t=this.index;return t!==null&&this.parent.getChild(t-1)||null}get root(){let t=this;while(t.parent){t=t.parent}return t}isAttached(){return this.root.is("rootElement")}getPath(){const t=[];let e=this;while(e.parent){t.unshift(e.index);e=e.parent}return t}getAncestors(t={includeSelf:false,parentFirst:false}){const e=[];let n=t.includeSelf?this:this.parent;while(n){e[t.parentFirst?"push":"unshift"](n);n=n.parent}return e}getCommonAncestor(t,e={}){const n=this.getAncestors(e);const o=t.getAncestors(e);let i=0;while(n[i]==o[i]&&n[i]){i++}return i===0?null:n[i-1]}isBefore(t){if(this==t){return false}if(this.root!==t.root){return false}const e=this.getPath();const n=t.getPath();const o=Ia(e,n);switch(o){case"prefix":return true;case"extension":return false;default:return e[o]<n[o]}}isAfter(t){if(this==t){return false}if(this.root!==t.root){return false}return!this.isBefore(t)}_remove(){this.parent._removeChildren(this.index)}_fireChange(t,e){this.fire("change:"+t,e);if(this.parent){this.parent._fireChange(t,e)}}toJSON(){const t=za(this);delete t.parent;return t}is(t){return t==="node"||t==="view:node"}}Hn(Oa,g);class Na extends Oa{constructor(t,e){super(t);this._textData=e}is(t){return t==="$text"||t==="view:$text"||t==="text"||t==="view:text"||t==="node"||t==="view:node"}get data(){return this._textData}get _data(){return this.data}set _data(t){this._fireChange("text",this);this._textData=t}isSimilar(t){if(!(t instanceof Na)){return false}return this===t||this.data===t.data}_clone(){return new Na(this.document,this.data)}}class Ma{constructor(t,e,n){this.textNode=t;if(e<0||e>t.data.length){throw new u["a"]("view-textproxy-wrong-offsetintext",this)}if(n<0||e+n>t.data.length){throw new u["a"]("view-textproxy-wrong-length",this)}this.data=t.data.substring(e,e+n);this.offsetInText=e}get offsetSize(){return this.data.length}get isPartial(){return this.data.length!==this.textNode.data.length}get parent(){return this.textNode.parent}get root(){return this.textNode.root}get document(){return this.textNode.document}is(t){return t==="$textProxy"||t==="view:$textProxy"||t==="textProxy"||t==="view:textProxy"}getAncestors(t={includeSelf:false,parentFirst:false}){const e=[];let n=t.includeSelf?this.textNode:this.parent;while(n!==null){e[t.parentFirst?"push":"unshift"](n);n=n.parent}return e}}function Va(t){const e=new Map;for(const n in t){e.set(n,t[n])}return e}function La(t){if(ba(t)){return new Map(t)}else{return Va(t)}}class Ha{constructor(...t){this._patterns=[];this.add(...t)}add(...t){for(let e of t){if(typeof e=="string"||e instanceof RegExp){e={name:e}}if(e.classes&&(typeof e.classes=="string"||e.classes instanceof RegExp)){e.classes=[e.classes]}this._patterns.push(e)}}match(...t){for(const e of t){for(const t of this._patterns){const n=Ka(e,t);if(n){return{element:e,pattern:t,match:n}}}}return null}matchAll(...t){const e=[];for(const n of t){for(const t of this._patterns){const o=Ka(n,t);if(o){e.push({element:n,pattern:t,match:o})}}}return e.length>0?e:null}getElementName(){if(this._patterns.length!==1){return null}const t=this._patterns[0];const e=t.name;return typeof t!="function"&&e&&!(e instanceof RegExp)?e:null}}function Ka(t,e){if(typeof e=="function"){return e(t)}const n={};if(e.name){n.name=qa(e.name,t.name);if(!n.name){return null}}if(e.attributes){n.attributes=ja(e.attributes,t);if(!n.attributes){return null}}if(e.classes){n.classes=Wa(e.classes,t);if(!n.classes){return false}}if(e.styles){n.styles=Ga(e.styles,t);if(!n.styles){return false}}return n}function qa(t,e){if(t instanceof RegExp){return t.test(e)}return t===e}function ja(t,e){const n=[];for(const o in t){const i=t[o];if(e.hasAttribute(o)){const t=e.getAttribute(o);if(i===true){n.push(o)}else if(i instanceof RegExp){if(i.test(t)){n.push(o)}else{return null}}else if(t===i){n.push(o)}else{return null}}else{return null}}return n}function Wa(t,e){const n=[];for(const o of t){if(o instanceof RegExp){const t=e.getClassNames();for(const e of t){if(o.test(e)){n.push(e)}}if(n.length===0){return null}}else if(e.hasClass(o)){n.push(o)}else{return null}}return n}function Ga(t,e){const n=[];for(const o in t){const i=t[o];if(e.hasStyle(o)){const t=e.getStyle(o);if(i instanceof RegExp){if(i.test(t)){n.push(o)}else{return null}}else if(t===i){n.push(o)}else{return null}}else{return null}}return n}var Ua="[object Symbol]";function $a(t){return typeof t=="symbol"||ge(t)&&G(t)==Ua}var Ja=$a;var Ya=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Qa=/^\w*$/;function Xa(t,e){if(xe(t)){return false}var n=typeof t;if(n=="number"||n=="symbol"||n=="boolean"||t==null||Ja(t)){return true}return Qa.test(t)||!Ya.test(t)||e!=null&&t in Object(e)}var Za=Xa;var tc="Expected a function";function ec(t,e){if(typeof t!="function"||e!=null&&typeof e!="function"){throw new TypeError(tc)}var n=function(){var o=arguments,i=e?e.apply(this,o):o[0],r=n.cache;if(r.has(i)){return r.get(i)}var s=t.apply(this,o);n.cache=r.set(i,s)||r;return s};n.cache=new(ec.Cache||fi);return n}ec.Cache=fi;var nc=ec;var oc=500;function ic(t){var e=nc(t,(function(t){if(n.size===oc){n.clear()}return t}));var n=e.cache;return e}var rc=ic;var sc=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;var ac=/\\(\\)?/g;var cc=rc((function(t){var e=[];if(t.charCodeAt(0)===46){e.push("")}t.replace(sc,(function(t,n,o,i){e.push(o?i.replace(ac,"$1"):n||t)}));return e}));var lc=cc;function dc(t,e){var n=-1,o=t==null?0:t.length,i=Array(o);while(++n<o){i[n]=e(t[n],n,t)}return i}var uc=dc;var hc=1/0;var fc=P?P.prototype:undefined,mc=fc?fc.toString:undefined;function gc(t){if(typeof t=="string"){return t}if(xe(t)){return uc(t,gc)+""}if(Ja(t)){return mc?mc.call(t):""}var e=t+"";return e=="0"&&1/t==-hc?"-0":e}var pc=gc;function bc(t){return t==null?"":pc(t)}var kc=bc;function wc(t,e){if(xe(t)){return t}return Za(t,e)?[t]:lc(kc(t))}var Cc=wc;function Ac(t){var e=t==null?0:t.length;return e?t[e-1]:undefined}var _c=Ac;var vc=1/0;function yc(t){if(typeof t=="string"||Ja(t)){return t}var e=t+"";return e=="0"&&1/t==-vc?"-0":e}var xc=yc;function Ec(t,e){e=Cc(e,t);var n=0,o=e.length;while(t!=null&&n<o){t=t[xc(e[n++])]}return n&&n==o?t:undefined}var Dc=Ec;function Sc(t,e,n){var o=-1,i=t.length;if(e<0){e=-e>i?0:i+e}n=n>i?i:n;if(n<0){n+=i}i=e>n?0:n-e>>>0;e>>>=0;var r=Array(i);while(++o<i){r[o]=t[o+e]}return r}var Bc=Sc;function Tc(t,e){return e.length<2?t:Dc(t,Bc(e,0,-1))}var Pc=Tc;function Ic(t,e){e=Cc(e,t);t=Pc(t,e);return t==null||delete t[xc(_c(e))]}var Rc=Ic;function Fc(t,e){return t==null?true:Rc(t,e)}var zc=Fc;function Oc(t,e,n){var o=t==null?undefined:Dc(t,e);return o===undefined?n:o}var Nc=Oc;function Mc(t,e,n){if(n!==undefined&&!Et(t[e],n)||n===undefined&&!(e in t)){yt(t,e,n)}}var Vc=Mc;function Lc(t){return function(e,n,o){var i=-1,r=Object(e),s=o(e),a=s.length;while(a--){var c=s[t?a:++i];if(n(r[c],c,r)===false){break}}return e}}var Hc=Lc;var Kc=Hc();var qc=Kc;function jc(t){return ge(t)&&oe(t)}var Wc=jc;function Gc(t,e){if(e==="constructor"&&typeof t[e]==="function"){return}if(e=="__proto__"){return}return t[e]}var Uc=Gc;function $c(t){return It(t,An(t))}var Jc=$c;function Yc(t,e,n,o,i,r,s){var a=Uc(t,n),c=Uc(e,n),l=s.get(c);if(l){Vc(t,n,l);return}var d=r?r(a,c,n+"",t,e,s):undefined;var u=d===undefined;if(u){var h=xe(c),f=!h&&Object(Ee["a"])(c),m=!h&&!f&&sn(c);d=c;if(h||f||m){if(xe(a)){d=a}else if(Wc(a)){d=zi(a)}else if(f){u=false;d=Object(Ri["a"])(c,true)}else if(m){u=false;d=Wr(c,true)}else{d=[]}}else if(io(c)||ve(c)){d=a;if(ve(a)){d=Jc(a)}else if(!S(a)||X(a)){d=bs(c)}}else{u=false}}if(u){s.set(c,d);i(d,c,o,r,s);s["delete"](c)}Vc(t,n,d)}var Qc=Yc;function Xc(t,e,n,o,i){if(t===e){return}qc(e,(function(r,s){i||(i=new ki);if(S(r)){Qc(t,e,s,n,Xc,o,i)}else{var a=o?o(Uc(t,s),r,s+"",t,e,i):undefined;if(a===undefined){a=r}Vc(t,s,a)}}),An)}var Zc=Xc;var tl=ue((function(t,e,n){Zc(t,e,n)}));var el=tl;function nl(t,e,n,o){if(!S(t)){return t}e=Cc(e,t);var i=-1,r=e.length,s=r-1,a=t;while(a!=null&&++i<r){var c=xc(e[i]),l=n;if(c==="__proto__"||c==="constructor"||c==="prototype"){return t}if(i!=s){var d=a[c];l=o?o(d,c,a):undefined;if(l===undefined){l=S(d)?d:ae(e[i+1])?[]:{}}}Tt(a,c,l);a=a[c]}return t}var ol=nl;function il(t,e,n){return t==null?t:ol(t,e,n)}var rl=il;class sl{constructor(t){this._styles={};this._styleProcessor=t}get isEmpty(){const t=Object.entries(this._styles);const e=Array.from(t);return!e.length}get size(){if(this.isEmpty){return 0}return this.getStyleNames().length}setTo(t){this.clear();const e=Array.from(cl(t).entries());for(const[t,n]of e){this._styleProcessor.toNormalizedForm(t,n,this._styles)}}has(t){if(this.isEmpty){return false}const e=this._styleProcessor.getReducedForm(t,this._styles);const n=e.find((([e])=>e===t));return Array.isArray(n)}set(t,e){if(S(t)){for(const[e,n]of Object.entries(t)){this._styleProcessor.toNormalizedForm(e,n,this._styles)}}else{this._styleProcessor.toNormalizedForm(t,e,this._styles)}}remove(t){const e=ll(t);zc(this._styles,e);delete this._styles[t];this._cleanEmptyObjectsOnPath(e)}getNormalized(t){return this._styleProcessor.getNormalized(t,this._styles)}toString(){if(this.isEmpty){return""}return this._getStylesEntries().map((t=>t.join(":"))).sort().join(";")+";"}getAsString(t){if(this.isEmpty){return}if(this._styles[t]&&!S(this._styles[t])){return this._styles[t]}const e=this._styleProcessor.getReducedForm(t,this._styles);const n=e.find((([e])=>e===t));if(Array.isArray(n)){return n[1]}}getStyleNames(){if(this.isEmpty){return[]}const t=this._getStylesEntries();return t.map((([t])=>t))}clear(){this._styles={}}_getStylesEntries(){const t=[];const e=Object.keys(this._styles);for(const n of e){t.push(...this._styleProcessor.getReducedForm(n,this._styles))}return t}_cleanEmptyObjectsOnPath(t){const e=t.split(".");const n=e.length>1;if(!n){return}const o=e.splice(0,e.length-1).join(".");const i=Nc(this._styles,o);if(!i){return}const r=!Array.from(Object.keys(i)).length;if(r){this.remove(o)}}}class al{constructor(){this._normalizers=new Map;this._extractors=new Map;this._reducers=new Map;this._consumables=new Map}toNormalizedForm(t,e,n){if(S(e)){dl(n,ll(t),e);return}if(this._normalizers.has(t)){const o=this._normalizers.get(t);const{path:i,value:r}=o(e);dl(n,i,r)}else{dl(n,t,e)}}getNormalized(t,e){if(!t){return el({},e)}if(e[t]!==undefined){return e[t]}if(this._extractors.has(t)){const n=this._extractors.get(t);if(typeof n==="string"){return Nc(e,n)}const o=n(t,e);if(o){return o}}return Nc(e,ll(t))}getReducedForm(t,e){const n=this.getNormalized(t,e);if(n===undefined){return[]}if(this._reducers.has(t)){const e=this._reducers.get(t);return e(n)}return[[t,n]]}getRelatedStyles(t){return this._consumables.get(t)||[]}setNormalizer(t,e){this._normalizers.set(t,e)}setExtractor(t,e){this._extractors.set(t,e)}setReducer(t,e){this._reducers.set(t,e)}setStyleRelation(t,e){this._mapStyleNames(t,e);for(const n of e){this._mapStyleNames(n,[t])}}_mapStyleNames(t,e){if(!this._consumables.has(t)){this._consumables.set(t,[])}this._consumables.get(t).push(...e)}}function cl(t){let e=null;let n=0;let o=0;let i=null;const r=new Map;if(t===""){return r}if(t.charAt(t.length-1)!=";"){t=t+";"}for(let s=0;s<t.length;s++){const a=t.charAt(s);if(e===null){switch(a){case":":if(!i){i=t.substr(n,s-n);o=s+1}break;case'"':case"'":e=a;break;case";":{const e=t.substr(o,s-o);if(i){r.set(i.trim(),e.trim())}i=null;n=s+1;break}}}else if(a===e){e=null}}return r}function ll(t){return t.replace("-",".")}function dl(t,e,n){let o=n;if(S(n)){o=el({},Nc(t,e),n)}rl(t,e,o)}class ul extends Oa{constructor(t,e,n,o){super(t);this.name=e;this._attrs=hl(n);this._children=[];if(o){this._insertChild(0,o)}this._classes=new Set;if(this._attrs.has("class")){const t=this._attrs.get("class");fl(this._classes,t);this._attrs.delete("class")}this._styles=new sl(this.document.stylesProcessor);if(this._attrs.has("style")){this._styles.setTo(this._attrs.get("style"));this._attrs.delete("style")}this._customProperties=new Map;this._isAllowedInsideAttributeElement=false}get childCount(){return this._children.length}get isEmpty(){return this._children.length===0}get isAllowedInsideAttributeElement(){return this._isAllowedInsideAttributeElement}is(t,e=null){if(!e){return t==="element"||t==="view:element"||t==="node"||t==="view:node"}else{return e===this.name&&(t==="element"||t==="view:element")}}getChild(t){return this._children[t]}getChildIndex(t){return this._children.indexOf(t)}getChildren(){return this._children[Symbol.iterator]()}*getAttributeKeys(){if(this._classes.size>0){yield"class"}if(!this._styles.isEmpty){yield"style"}yield*this._attrs.keys()}*getAttributes(){yield*this._attrs.entries();if(this._classes.size>0){yield["class",this.getAttribute("class")]}if(!this._styles.isEmpty){yield["style",this.getAttribute("style")]}}getAttribute(t){if(t=="class"){if(this._classes.size>0){return[...this._classes].join(" ")}return undefined}if(t=="style"){const t=this._styles.toString();return t==""?undefined:t}return this._attrs.get(t)}hasAttribute(t){if(t=="class"){return this._classes.size>0}if(t=="style"){return!this._styles.isEmpty}return this._attrs.has(t)}isSimilar(t){if(!(t instanceof ul)){return false}if(this===t){return true}if(this.name!=t.name){return false}if(this.isAllowedInsideAttributeElement!=t.isAllowedInsideAttributeElement){return false}if(this._attrs.size!==t._attrs.size||this._classes.size!==t._classes.size||this._styles.size!==t._styles.size){return false}for(const[e,n]of this._attrs){if(!t._attrs.has(e)||t._attrs.get(e)!==n){return false}}for(const e of this._classes){if(!t._classes.has(e)){return false}}for(const e of this._styles.getStyleNames()){if(!t._styles.has(e)||t._styles.getAsString(e)!==this._styles.getAsString(e)){return false}}return true}hasClass(...t){for(const e of t){if(!this._classes.has(e)){return false}}return true}getClassNames(){return this._classes.keys()}getStyle(t){return this._styles.getAsString(t)}getNormalizedStyle(t){return this._styles.getNormalized(t)}getStyleNames(){return this._styles.getStyleNames()}hasStyle(...t){for(const e of t){if(!this._styles.has(e)){return false}}return true}findAncestor(...t){const e=new Ha(...t);let n=this.parent;while(n){if(e.match(n)){return n}n=n.parent}return null}getCustomProperty(t){return this._customProperties.get(t)}*getCustomProperties(){yield*this._customProperties.entries()}getIdentity(){const t=Array.from(this._classes).sort().join(",");const e=this._styles.toString();const n=Array.from(this._attrs).map((t=>`${t[0]}="${t[1]}"`)).sort().join(" ");return this.name+(t==""?"":` class="${t}"`)+(!e?"":` style="${e}"`)+(n==""?"":` ${n}`)}_clone(t=false){const e=[];if(t){for(const n of this.getChildren()){e.push(n._clone(t))}}const n=new this.constructor(this.document,this.name,this._attrs,e);n._classes=new Set(this._classes);n._styles.set(this._styles.getNormalized());n._customProperties=new Map(this._customProperties);n.getFillerOffset=this.getFillerOffset;n._isAllowedInsideAttributeElement=this.isAllowedInsideAttributeElement;return n}_appendChild(t){return this._insertChild(this.childCount,t)}_insertChild(t,e){this._fireChange("children",this);let n=0;const o=ml(this.document,e);for(const e of o){if(e.parent!==null){e._remove()}e.parent=this;e.document=this.document;this._children.splice(t,0,e);t++;n++}return n}_removeChildren(t,e=1){this._fireChange("children",this);for(let n=t;n<t+e;n++){this._children[n].parent=null}return this._children.splice(t,e)}_setAttribute(t,e){e=String(e);this._fireChange("attributes",this);if(t=="class"){fl(this._classes,e)}else if(t=="style"){this._styles.setTo(e)}else{this._attrs.set(t,e)}}_removeAttribute(t){this._fireChange("attributes",this);if(t=="class"){if(this._classes.size>0){this._classes.clear();return true}return false}if(t=="style"){if(!this._styles.isEmpty){this._styles.clear();return true}return false}return this._attrs.delete(t)}_addClass(t){this._fireChange("attributes",this);for(const e of Ca(t)){this._classes.add(e)}}_removeClass(t){this._fireChange("attributes",this);for(const e of Ca(t)){this._classes.delete(e)}}_setStyle(t,e){this._fireChange("attributes",this);this._styles.set(t,e)}_removeStyle(t){this._fireChange("attributes",this);for(const e of Ca(t)){this._styles.remove(e)}}_setCustomProperty(t,e){this._customProperties.set(t,e)}_removeCustomProperty(t){return this._customProperties.delete(t)}}function hl(t){t=La(t);for(const[e,n]of t){if(n===null){t.delete(e)}else if(typeof n!="string"){t.set(e,String(n))}}return t}function fl(t,e){const n=e.split(/\s+/);t.clear();n.forEach((e=>t.add(e)))}function ml(t,e){if(typeof e=="string"){return[new Na(t,e)]}if(!ba(e)){e=[e]}return Array.from(e).map((e=>{if(typeof e=="string"){return new Na(t,e)}if(e instanceof Ma){return new Na(t,e.data)}return e}))}class gl extends ul{constructor(t,e,n,o){super(t,e,n,o);this.getFillerOffset=pl}is(t,e=null){if(!e){return t==="containerElement"||t==="view:containerElement"||t==="element"||t==="view:element"||t==="node"||t==="view:node"}else{return e===this.name&&(t==="containerElement"||t==="view:containerElement"||t==="element"||t==="view:element")}}}function pl(){const t=[...this.getChildren()];const e=t[this.childCount-1];if(e&&e.is("element","br")){return this.childCount}for(const e of t){if(!e.is("uiElement")){return null}}return this.childCount}class bl extends gl{constructor(t,e,n,o){super(t,e,n,o);this.set("isReadOnly",false);this.set("isFocused",false);this.bind("isReadOnly").to(t);this.bind("isFocused").to(t,"isFocused",(e=>e&&t.selection.editableElement==this));this.listenTo(t.selection,"change",(()=>{this.isFocused=t.isFocused&&t.selection.editableElement==this}))}is(t,e=null){if(!e){return t==="editableElement"||t==="view:editableElement"||t==="containerElement"||t==="view:containerElement"||t==="element"||t==="view:element"||t==="node"||t==="view:node"}else{return e===this.name&&(t==="editableElement"||t==="view:editableElement"||t==="containerElement"||t==="view:containerElement"||t==="element"||t==="view:element")}}destroy(){this.stopListening()}}Hn(bl,Tn);const kl=Symbol("rootName");class wl extends bl{constructor(t,e){super(t,e);this.rootName="main"}is(t,e=null){if(!e){return t==="rootElement"||t==="view:rootElement"||t==="editableElement"||t==="view:editableElement"||t==="containerElement"||t==="view:containerElement"||t==="element"||t==="view:element"||t==="node"||t==="view:node"}else{return e===this.name&&(t==="rootElement"||t==="view:rootElement"||t==="editableElement"||t==="view:editableElement"||t==="containerElement"||t==="view:containerElement"||t==="element"||t==="view:element")}}get rootName(){return this.getCustomProperty(kl)}set rootName(t){this._setCustomProperty(kl,t)}set _name(t){this.name=t}}class Cl{constructor(t={}){if(!t.boundaries&&!t.startPosition){throw new u["a"]("view-tree-walker-no-start-position",null)}if(t.direction&&t.direction!="forward"&&t.direction!="backward"){throw new u["a"]("view-tree-walker-unknown-direction",t.startPosition,{direction:t.direction})}this.boundaries=t.boundaries||null;if(t.startPosition){this.position=Al._createAt(t.startPosition)}else{this.position=Al._createAt(t.boundaries[t.direction=="backward"?"end":"start"])}this.direction=t.direction||"forward";this.singleCharacters=!!t.singleCharacters;this.shallow=!!t.shallow;this.ignoreElementEnd=!!t.ignoreElementEnd;this._boundaryStartParent=this.boundaries?this.boundaries.start.parent:null;this._boundaryEndParent=this.boundaries?this.boundaries.end.parent:null}[Symbol.iterator](){return this}skip(t){let e,n,o;do{o=this.position;({done:e,value:n}=this.next())}while(!e&&t(n));if(!e){this.position=o}}next(){if(this.direction=="forward"){return this._next()}else{return this._previous()}}_next(){let t=this.position.clone();const e=this.position;const n=t.parent;if(n.parent===null&&t.offset===n.childCount){return{done:true}}if(n===this._boundaryEndParent&&t.offset==this.boundaries.end.offset){return{done:true}}let o;if(n instanceof Na){if(t.isAtEnd){this.position=Al._createAfter(n);return this._next()}o=n.data[t.offset]}else{o=n.getChild(t.offset)}if(o instanceof ul){if(!this.shallow){t=new Al(o,0)}else{t.offset++}this.position=t;return this._formatReturnValue("elementStart",o,e,t,1)}else if(o instanceof Na){if(this.singleCharacters){t=new Al(o,0);this.position=t;return this._next()}else{let n=o.data.length;let i;if(o==this._boundaryEndParent){n=this.boundaries.end.offset;i=new Ma(o,0,n);t=Al._createAfter(i)}else{i=new Ma(o,0,o.data.length);t.offset++}this.position=t;return this._formatReturnValue("text",i,e,t,n)}}else if(typeof o=="string"){let o;if(this.singleCharacters){o=1}else{const e=n===this._boundaryEndParent?this.boundaries.end.offset:n.data.length;o=e-t.offset}const i=new Ma(n,t.offset,o);t.offset+=o;this.position=t;return this._formatReturnValue("text",i,e,t,o)}else{t=Al._createAfter(n);this.position=t;if(this.ignoreElementEnd){return this._next()}else{return this._formatReturnValue("elementEnd",n,e,t)}}}_previous(){let t=this.position.clone();const e=this.position;const n=t.parent;if(n.parent===null&&t.offset===0){return{done:true}}if(n==this._boundaryStartParent&&t.offset==this.boundaries.start.offset){return{done:true}}let o;if(n instanceof Na){if(t.isAtStart){this.position=Al._createBefore(n);return this._previous()}o=n.data[t.offset-1]}else{o=n.getChild(t.offset-1)}if(o instanceof ul){if(!this.shallow){t=new Al(o,o.childCount);this.position=t;if(this.ignoreElementEnd){return this._previous()}else{return this._formatReturnValue("elementEnd",o,e,t)}}else{t.offset--;this.position=t;return this._formatReturnValue("elementStart",o,e,t,1)}}else if(o instanceof Na){if(this.singleCharacters){t=new Al(o,o.data.length);this.position=t;return this._previous()}else{let n=o.data.length;let i;if(o==this._boundaryStartParent){const e=this.boundaries.start.offset;i=new Ma(o,e,o.data.length-e);n=i.data.length;t=Al._createBefore(i)}else{i=new Ma(o,0,o.data.length);t.offset--}this.position=t;return this._formatReturnValue("text",i,e,t,n)}}else if(typeof o=="string"){let o;if(!this.singleCharacters){const e=n===this._boundaryStartParent?this.boundaries.start.offset:0;o=t.offset-e}else{o=1}t.offset-=o;const i=new Ma(n,t.offset,o);this.position=t;return this._formatReturnValue("text",i,e,t,o)}else{t=Al._createBefore(n);this.position=t;return this._formatReturnValue("elementStart",n,e,t,1)}}_formatReturnValue(t,e,n,o,i){if(e instanceof Ma){if(e.offsetInText+e.data.length==e.textNode.data.length){if(this.direction=="forward"&&!(this.boundaries&&this.boundaries.end.isEqual(this.position))){o=Al._createAfter(e.textNode);this.position=o}else{n=Al._createAfter(e.textNode)}}if(e.offsetInText===0){if(this.direction=="backward"&&!(this.boundaries&&this.boundaries.start.isEqual(this.position))){o=Al._createBefore(e.textNode);this.position=o}else{n=Al._createBefore(e.textNode)}}}return{done:false,value:{type:t,item:e,previousPosition:n,nextPosition:o,length:i}}}}class Al{constructor(t,e){this.parent=t;this.offset=e}get nodeAfter(){if(this.parent.is("$text")){return null}return this.parent.getChild(this.offset)||null}get nodeBefore(){if(this.parent.is("$text")){return null}return this.parent.getChild(this.offset-1)||null}get isAtStart(){return this.offset===0}get isAtEnd(){const t=this.parent.is("$text")?this.parent.data.length:this.parent.childCount;return this.offset===t}get root(){return this.parent.root}get editableElement(){let t=this.parent;while(!(t instanceof bl)){if(t.parent){t=t.parent}else{return null}}return t}getShiftedBy(t){const e=Al._createAt(this);const n=e.offset+t;e.offset=n<0?0:n;return e}getLastMatchingPosition(t,e={}){e.startPosition=this;const n=new Cl(e);n.skip(t);return n.position}getAncestors(){if(this.parent.is("documentFragment")){return[this.parent]}else{return this.parent.getAncestors({includeSelf:true})}}getCommonAncestor(t){const e=this.getAncestors();const n=t.getAncestors();let o=0;while(e[o]==n[o]&&e[o]){o++}return o===0?null:e[o-1]}is(t){return t==="position"||t==="view:position"}isEqual(t){return this.parent==t.parent&&this.offset==t.offset}isBefore(t){return this.compareWith(t)=="before"}isAfter(t){return this.compareWith(t)=="after"}compareWith(t){if(this.root!==t.root){return"different"}if(this.isEqual(t)){return"same"}const e=this.parent.is("node")?this.parent.getPath():[];const n=t.parent.is("node")?t.parent.getPath():[];e.push(this.offset);n.push(t.offset);const o=Ia(e,n);switch(o){case"prefix":return"before";case"extension":return"after";default:return e[o]<n[o]?"before":"after"}}getWalker(t={}){t.startPosition=this;return new Cl(t)}clone(){return new Al(this.parent,this.offset)}static _createAt(t,e){if(t instanceof Al){return new this(t.parent,t.offset)}else{const n=t;if(e=="end"){e=n.is("$text")?n.data.length:n.childCount}else if(e=="before"){return this._createBefore(n)}else if(e=="after"){return this._createAfter(n)}else if(e!==0&&!e){throw new u["a"]("view-createpositionat-offset-required",n)}return new Al(n,e)}}static _createAfter(t){if(t.is("$textProxy")){return new Al(t.textNode,t.offsetInText+t.data.length)}if(!t.parent){throw new u["a"]("view-position-after-root",t,{root:t})}return new Al(t.parent,t.index+1)}static _createBefore(t){if(t.is("$textProxy")){return new Al(t.textNode,t.offsetInText)}if(!t.parent){throw new u["a"]("view-position-before-root",t,{root:t})}return new Al(t.parent,t.index)}}class _l{constructor(t,e=null){this.start=t.clone();this.end=e?e.clone():t.clone()}*[Symbol.iterator](){yield*new Cl({boundaries:this,ignoreElementEnd:true})}get isCollapsed(){return this.start.isEqual(this.end)}get isFlat(){return this.start.parent===this.end.parent}get root(){return this.start.root}getEnlarged(){let t=this.start.getLastMatchingPosition(vl,{direction:"backward"});let e=this.end.getLastMatchingPosition(vl);if(t.parent.is("$text")&&t.isAtStart){t=Al._createBefore(t.parent)}if(e.parent.is("$text")&&e.isAtEnd){e=Al._createAfter(e.parent)}return new _l(t,e)}getTrimmed(){let t=this.start.getLastMatchingPosition(vl);if(t.isAfter(this.end)||t.isEqual(this.end)){return new _l(t,t)}let e=this.end.getLastMatchingPosition(vl,{direction:"backward"});const n=t.nodeAfter;const o=e.nodeBefore;if(n&&n.is("$text")){t=new Al(n,0)}if(o&&o.is("$text")){e=new Al(o,o.data.length)}return new _l(t,e)}isEqual(t){return this==t||this.start.isEqual(t.start)&&this.end.isEqual(t.end)}containsPosition(t){return t.isAfter(this.start)&&t.isBefore(this.end)}containsRange(t,e=false){if(t.isCollapsed){e=false}const n=this.containsPosition(t.start)||e&&this.start.isEqual(t.start);const o=this.containsPosition(t.end)||e&&this.end.isEqual(t.end);return n&&o}getDifference(t){const e=[];if(this.isIntersecting(t)){if(this.containsPosition(t.start)){e.push(new _l(this.start,t.start))}if(this.containsPosition(t.end)){e.push(new _l(t.end,this.end))}}else{e.push(this.clone())}return e}getIntersection(t){if(this.isIntersecting(t)){let e=this.start;let n=this.end;if(this.containsPosition(t.start)){e=t.start}if(this.containsPosition(t.end)){n=t.end}return new _l(e,n)}return null}getWalker(t={}){t.boundaries=this;return new Cl(t)}getCommonAncestor(){return this.start.getCommonAncestor(this.end)}getContainedElement(){if(this.isCollapsed){return null}let t=this.start.nodeAfter;let e=this.end.nodeBefore;if(this.start.parent.is("$text")&&this.start.isAtEnd&&this.start.parent.nextSibling){t=this.start.parent.nextSibling}if(this.end.parent.is("$text")&&this.end.isAtStart&&this.end.parent.previousSibling){e=this.end.parent.previousSibling}if(t&&t.is("element")&&t===e){return t}return null}clone(){return new _l(this.start,this.end)}*getItems(t={}){t.boundaries=this;t.ignoreElementEnd=true;const e=new Cl(t);for(const t of e){yield t.item}}*getPositions(t={}){t.boundaries=this;const e=new Cl(t);yield e.position;for(const t of e){yield t.nextPosition}}is(t){return t==="range"||t==="view:range"}isIntersecting(t){return this.start.isBefore(t.end)&&this.end.isAfter(t.start)}static _createFromParentsAndOffsets(t,e,n,o){return new this(new Al(t,e),new Al(n,o))}static _createFromPositionAndShift(t,e){const n=t;const o=t.getShiftedBy(e);return e>0?new this(n,o):new this(o,n)}static _createIn(t){return this._createFromParentsAndOffsets(t,0,t,t.childCount)}static _createOn(t){const e=t.is("$textProxy")?t.offsetSize:1;return this._createFromPositionAndShift(Al._createBefore(t),e)}}function vl(t){if(t.item.is("attributeElement")||t.item.is("uiElement")){return true}return false}function yl(t){let e=0;for(const n of t){e++}return e}class xl{constructor(t=null,e,n){this._ranges=[];this._lastRangeBackward=false;this._isFake=false;this._fakeSelectionLabel="";this.setTo(t,e,n)}get isFake(){return this._isFake}get fakeSelectionLabel(){return this._fakeSelectionLabel}get anchor(){if(!this._ranges.length){return null}const t=this._ranges[this._ranges.length-1];const e=this._lastRangeBackward?t.end:t.start;return e.clone()}get focus(){if(!this._ranges.length){return null}const t=this._ranges[this._ranges.length-1];const e=this._lastRangeBackward?t.start:t.end;return e.clone()}get isCollapsed(){return this.rangeCount===1&&this._ranges[0].isCollapsed}get rangeCount(){return this._ranges.length}get isBackward(){return!this.isCollapsed&&this._lastRangeBackward}get editableElement(){if(this.anchor){return this.anchor.editableElement}return null}*getRanges(){for(const t of this._ranges){yield t.clone()}}getFirstRange(){let t=null;for(const e of this._ranges){if(!t||e.start.isBefore(t.start)){t=e}}return t?t.clone():null}getLastRange(){let t=null;for(const e of this._ranges){if(!t||e.end.isAfter(t.end)){t=e}}return t?t.clone():null}getFirstPosition(){const t=this.getFirstRange();return t?t.start.clone():null}getLastPosition(){const t=this.getLastRange();return t?t.end.clone():null}isEqual(t){if(this.isFake!=t.isFake){return false}if(this.isFake&&this.fakeSelectionLabel!=t.fakeSelectionLabel){return false}if(this.rangeCount!=t.rangeCount){return false}else if(this.rangeCount===0){return true}if(!this.anchor.isEqual(t.anchor)||!this.focus.isEqual(t.focus)){return false}for(const e of this._ranges){let n=false;for(const o of t._ranges){if(e.isEqual(o)){n=true;break}}if(!n){return false}}return true}isSimilar(t){if(this.isBackward!=t.isBackward){return false}const e=yl(this.getRanges());const n=yl(t.getRanges());if(e!=n){return false}if(e==0){return true}for(let e of this.getRanges()){e=e.getTrimmed();let n=false;for(let o of t.getRanges()){o=o.getTrimmed();if(e.start.isEqual(o.start)&&e.end.isEqual(o.end)){n=true;break}}if(!n){return false}}return true}getSelectedElement(){if(this.rangeCount!==1){return null}return this.getFirstRange().getContainedElement()}setTo(t,e,n){if(t===null){this._setRanges([]);this._setFakeOptions(e)}else if(t instanceof xl||t instanceof El){this._setRanges(t.getRanges(),t.isBackward);this._setFakeOptions({fake:t.isFake,label:t.fakeSelectionLabel})}else if(t instanceof _l){this._setRanges([t],e&&e.backward);this._setFakeOptions(e)}else if(t instanceof Al){this._setRanges([new _l(t)]);this._setFakeOptions(e)}else if(t instanceof Oa){const o=!!n&&!!n.backward;let i;if(e===undefined){throw new u["a"]("view-selection-setto-required-second-parameter",this)}else if(e=="in"){i=_l._createIn(t)}else if(e=="on"){i=_l._createOn(t)}else{i=new _l(Al._createAt(t,e))}this._setRanges([i],o);this._setFakeOptions(n)}else if(ba(t)){this._setRanges(t,e&&e.backward);this._setFakeOptions(e)}else{throw new u["a"]("view-selection-setto-not-selectable",this)}this.fire("change")}setFocus(t,e){if(this.anchor===null){throw new u["a"]("view-selection-setfocus-no-ranges",this)}const n=Al._createAt(t,e);if(n.compareWith(this.focus)=="same"){return}const o=this.anchor;this._ranges.pop();if(n.compareWith(o)=="before"){this._addRange(new _l(n,o),true)}else{this._addRange(new _l(o,n))}this.fire("change")}is(t){return t==="selection"||t==="view:selection"}_setRanges(t,e=false){t=Array.from(t);this._ranges=[];for(const e of t){this._addRange(e)}this._lastRangeBackward=!!e}_setFakeOptions(t={}){this._isFake=!!t.fake;this._fakeSelectionLabel=t.fake?t.label||"":""}_addRange(t,e=false){if(!(t instanceof _l)){throw new u["a"]("view-selection-add-range-not-range",this)}this._pushRange(t);this._lastRangeBackward=!!e}_pushRange(t){for(const e of this._ranges){if(t.isIntersecting(e)){throw new u["a"]("view-selection-range-intersects",this,{addedRange:t,intersectingRange:e})}}this._ranges.push(new _l(t.start,t.end))}}Hn(xl,g);class El{constructor(t=null,e,n){this._selection=new xl;this._selection.delegate("change").to(this);this._selection.setTo(t,e,n)}get isFake(){return this._selection.isFake}get fakeSelectionLabel(){return this._selection.fakeSelectionLabel}get anchor(){return this._selection.anchor}get focus(){return this._selection.focus}get isCollapsed(){return this._selection.isCollapsed}get rangeCount(){return this._selection.rangeCount}get isBackward(){return this._selection.isBackward}get editableElement(){return this._selection.editableElement}get _ranges(){return this._selection._ranges}*getRanges(){yield*this._selection.getRanges()}getFirstRange(){return this._selection.getFirstRange()}getLastRange(){return this._selection.getLastRange()}getFirstPosition(){return this._selection.getFirstPosition()}getLastPosition(){return this._selection.getLastPosition()}getSelectedElement(){return this._selection.getSelectedElement()}isEqual(t){return this._selection.isEqual(t)}isSimilar(t){return this._selection.isSimilar(t)}is(t){return t==="selection"||t=="documentSelection"||t=="view:selection"||t=="view:documentSelection"}_setTo(t,e,n){this._selection.setTo(t,e,n)}_setFocus(t,e){this._selection.setFocus(t,e)}}Hn(El,g);class Dl extends r{constructor(t,e,n){super(t,e);this.startRange=n;this._eventPhase="none";this._currentTarget=null}get eventPhase(){return this._eventPhase}get currentTarget(){return this._currentTarget}}const Sl=Symbol("bubbling contexts");const Bl={fire(t,...e){try{const n=t instanceof r?t:new r(this,t);const o=Fl(this);if(!o.size){return}Pl(n,"capturing",this);if(Il(o,"$capture",n,...e)){return n.return}const i=n.startRange||this.selection.getFirstRange();const s=i?i.getContainedElement():null;const a=s?Boolean(Rl(o,s)):false;let c=s||zl(i);Pl(n,"atTarget",c);if(!a){if(Il(o,"$text",n,...e)){return n.return}Pl(n,"bubbling",c)}while(c){if(c.is("rootElement")){if(Il(o,"$root",n,...e)){return n.return}}else if(c.is("element")){if(Il(o,c.name,n,...e)){return n.return}}if(Il(o,c,n,...e)){return n.return}c=c.parent;Pl(n,"bubbling",c)}Pl(n,"bubbling",this);Il(o,"$document",n,...e);return n.return}catch(t){u["a"].rethrowUnexpectedError(t,this)}},_addEventListener(t,e,n){const o=Ca(n.context||"$document");const i=Fl(this);for(const r of o){let o=i.get(r);if(!o){o=Object.create(g);i.set(r,o)}this.listenTo(o,t,e,n)}},_removeEventListener(t,e){const n=Fl(this);for(const o of n.values()){this.stopListening(o,t,e)}}};var Tl=Bl;function Pl(t,e,n){if(t instanceof Dl){t._eventPhase=e;t._currentTarget=n}}function Il(t,e,n,...o){const i=typeof e=="string"?t.get(e):Rl(t,e);if(!i){return false}i.fire(n,...o);return n.stop.called}function Rl(t,e){for(const[n,o]of t){if(typeof n=="function"&&n(e)){return o}}return null}function Fl(t){if(!t[Sl]){t[Sl]=new Map}return t[Sl]}function zl(t){if(!t){return null}const e=t.start.parent;const n=t.end.parent;const o=e.getPath();const i=n.getPath();return o.length>i.length?e:n}class Ol{constructor(t){this.selection=new El;this.roots=new ka({idProperty:"rootName"});this.stylesProcessor=t;this.set("isReadOnly",false);this.set("isFocused",false);this.set("isComposing",false);this._postFixers=new Set}getRoot(t="main"){return this.roots.get(t)}registerPostFixer(t){this._postFixers.add(t)}destroy(){this.roots.map((t=>t.destroy()));this.stopListening()}_callPostFixers(t){let e=false;do{for(const n of this._postFixers){e=n(t);if(e){break}}}while(e)}}Hn(Ol,Tl);Hn(Ol,Tn);const Nl=10;class Ml extends ul{constructor(t,e,n,o){super(t,e,n,o);this.getFillerOffset=Vl;this._priority=Nl;this._id=null;this._clonesGroup=null}get priority(){return this._priority}get id(){return this._id}getElementsWithSameId(){if(this.id===null){throw new u["a"]("attribute-element-get-elements-with-same-id-no-id",this)}return new Set(this._clonesGroup)}is(t,e=null){if(!e){return t==="attributeElement"||t==="view:attributeElement"||t==="element"||t==="view:element"||t==="node"||t==="view:node"}else{return e===this.name&&(t==="attributeElement"||t==="view:attributeElement"||t==="element"||t==="view:element")}}isSimilar(t){if(this.id!==null||t.id!==null){return this.id===t.id}return super.isSimilar(t)&&this.priority==t.priority}_clone(t){const e=super._clone(t);e._priority=this._priority;e._id=this._id;return e}}Ml.DEFAULT_PRIORITY=Nl;function Vl(){if(Ll(this)){return null}let t=this.parent;while(t&&t.is("attributeElement")){if(Ll(t)>1){return null}t=t.parent}if(!t||Ll(t)>1){return null}return this.childCount}function Ll(t){return Array.from(t.getChildren()).filter((t=>!t.is("uiElement"))).length}class Hl extends ul{constructor(t,e,n,o){super(t,e,n,o);this._isAllowedInsideAttributeElement=true;this.getFillerOffset=Kl}is(t,e=null){if(!e){return t==="emptyElement"||t==="view:emptyElement"||t==="element"||t==="view:element"||t==="node"||t==="view:node"}else{return e===this.name&&(t==="emptyElement"||t==="view:emptyElement"||t==="element"||t==="view:element")}}_insertChild(t,e){if(e&&(e instanceof Oa||Array.from(e).length>0)){throw new u["a"]("view-emptyelement-cannot-add",[this,e])}}}function Kl(){return null}const ql=navigator.userAgent.toLowerCase();const jl={isMac:Gl(ql),isGecko:Ul(ql),isSafari:$l(ql),isAndroid:Jl(ql),isBlink:Yl(ql),features:{isRegExpUnicodePropertySupported:Ql()}};var Wl=jl;function Gl(t){return t.indexOf("macintosh")>-1}function Ul(t){return!!t.match(/gecko\/\d+/)}function $l(t){return t.indexOf(" applewebkit/")>-1&&t.indexOf("chrome")===-1}function Jl(t){return t.indexOf("android")>-1}function Yl(t){return t.indexOf("chrome/")>-1&&t.indexOf("edge/")<0}function Ql(){let t=false;try{t="ć".search(new RegExp("[\\p{L}]","u"))===0}catch(t){}return t}const Xl={ctrl:"⌃",cmd:"⌘",alt:"⌥",shift:"⇧"};const Zl={ctrl:"Ctrl+",alt:"Alt+",shift:"Shift+"};const td=ld();const ed=Object.fromEntries(Object.entries(td).map((([t,e])=>[e,t.charAt(0).toUpperCase()+t.slice(1)])));function nd(t){let e;if(typeof t=="string"){e=td[t.toLowerCase()];if(!e){throw new u["a"]("keyboard-unknown-key",null,{key:t})}}else{e=t.keyCode+(t.altKey?td.alt:0)+(t.ctrlKey?td.ctrl:0)+(t.shiftKey?td.shift:0)+(t.metaKey?td.cmd:0)}return e}function od(t){if(typeof t=="string"){t=dd(t)}return t.map((t=>typeof t=="string"?ad(t):t)).reduce(((t,e)=>e+t),0)}function id(t){let e=od(t);const n=Object.entries(Wl.isMac?Xl:Zl);const o=n.reduce(((t,[n,o])=>{if((e&td[n])!=0){e&=~td[n];t+=o}return t}),"");return o+(e?ed[e]:"")}function rd(t){return t==td.arrowright||t==td.arrowleft||t==td.arrowup||t==td.arrowdown}function sd(t,e){const n=e==="ltr";switch(t){case td.arrowleft:return n?"left":"right";case td.arrowright:return n?"right":"left";case td.arrowup:return"up";case td.arrowdown:return"down"}}function ad(t){if(t.endsWith("!")){return nd(t.slice(0,-1))}const e=nd(t);return Wl.isMac&&e==td.ctrl?td.cmd:e}function cd(t,e){const n=sd(t,e);return n==="down"||n==="right"}function ld(){const t={arrowleft:37,arrowup:38,arrowright:39,arrowdown:40,backspace:8,delete:46,enter:13,space:32,esc:27,tab:9,ctrl:1114112,shift:2228224,alt:4456448,cmd:8912896};for(let e=65;e<=90;e++){const n=String.fromCharCode(e);t[n.toLowerCase()]=e}for(let e=48;e<=57;e++){t[e-48]=e}for(let e=112;e<=123;e++){t["f"+(e-111)]=e}return t}function dd(t){return t.split("+").map((t=>t.trim()))}class ud extends ul{constructor(t,e,n,o){super(t,e,n,o);this._isAllowedInsideAttributeElement=true;this.getFillerOffset=fd}is(t,e=null){if(!e){return t==="uiElement"||t==="view:uiElement"||t==="element"||t==="view:element"||t==="node"||t==="view:node"}else{return e===this.name&&(t==="uiElement"||t==="view:uiElement"||t==="element"||t==="view:element")}}_insertChild(t,e){if(e&&(e instanceof Oa||Array.from(e).length>0)){throw new u["a"]("view-uielement-cannot-add",this)}}render(t){return this.toDomElement(t)}toDomElement(t){const e=t.createElement(this.name);for(const t of this.getAttributeKeys()){e.setAttribute(t,this.getAttribute(t))}return e}}function hd(t){t.document.on("arrowKey",((e,n)=>md(e,n,t.domConverter)),{priority:"low"})}function fd(){return null}function md(t,e,n){if(e.keyCode==td.arrowright){const t=e.domTarget.ownerDocument.defaultView.getSelection();const o=t.rangeCount==1&&t.getRangeAt(0).collapsed;if(o||e.shiftKey){const e=t.focusNode;const i=t.focusOffset;const r=n.domPositionToView(e,i);if(r===null){return}let s=false;const a=r.getLastMatchingPosition((t=>{if(t.item.is("uiElement")){s=true}if(t.item.is("uiElement")||t.item.is("attributeElement")){return true}return false}));if(s){const e=n.viewPositionToDom(a);if(o){t.collapse(e.parent,e.offset)}else{t.extend(e.parent,e.offset)}}}}}class gd extends ul{constructor(t,e,n,o){super(t,e,n,o);this._isAllowedInsideAttributeElement=true;this.getFillerOffset=pd}is(t,e=null){if(!e){return t==="rawElement"||t==="view:rawElement"||t===this.name||t==="view:"+this.name||t==="element"||t==="view:element"||t==="node"||t==="view:node"}else{return e===this.name&&(t==="rawElement"||t==="view:rawElement"||t==="element"||t==="view:element")}}_insertChild(t,e){if(e&&(e instanceof Oa||Array.from(e).length>0)){throw new u["a"]("view-rawelement-cannot-add",[this,e])}}}function pd(){return null}class bd{constructor(t,e){this.document=t;this._children=[];if(e){this._insertChild(0,e)}}[Symbol.iterator](){return this._children[Symbol.iterator]()}get childCount(){return this._children.length}get isEmpty(){return this.childCount===0}get root(){return this}get parent(){return null}is(t){return t==="documentFragment"||t==="view:documentFragment"}_appendChild(t){return this._insertChild(this.childCount,t)}getChild(t){return this._children[t]}getChildIndex(t){return this._children.indexOf(t)}getChildren(){return this._children[Symbol.iterator]()}_insertChild(t,e){this._fireChange("children",this);let n=0;const o=kd(this.document,e);for(const e of o){if(e.parent!==null){e._remove()}e.parent=this;this._children.splice(t,0,e);t++;n++}return n}_removeChildren(t,e=1){this._fireChange("children",this);for(let n=t;n<t+e;n++){this._children[n].parent=null}return this._children.splice(t,e)}_fireChange(t,e){this.fire("change:"+t,e)}}Hn(bd,g);function kd(t,e){if(typeof e=="string"){return[new Na(t,e)]}if(!ba(e)){e=[e]}return Array.from(e).map((e=>{if(typeof e=="string"){return new Na(t,e)}if(e instanceof Ma){return new Na(t,e.data)}return e}))}class wd{constructor(t){this.document=t;this._cloneGroups=new Map}setSelection(t,e,n){this.document.selection._setTo(t,e,n)}setSelectionFocus(t,e){this.document.selection._setFocus(t,e)}createDocumentFragment(t){return new bd(this.document,t)}createText(t){return new Na(this.document,t)}createAttributeElement(t,e,n={}){const o=new Ml(this.document,t,e);if(n.priority){o._priority=n.priority}if(n.id){o._id=n.id}return o}createContainerElement(t,e,n={}){const o=new gl(this.document,t,e);if(n.isAllowedInsideAttributeElement!==undefined){o._isAllowedInsideAttributeElement=n.isAllowedInsideAttributeElement}return o}createEditableElement(t,e){const n=new bl(this.document,t,e);n._document=this.document;return n}createEmptyElement(t,e,n={}){const o=new Hl(this.document,t,e);if(n.isAllowedInsideAttributeElement!==undefined){o._isAllowedInsideAttributeElement=n.isAllowedInsideAttributeElement}return o}createUIElement(t,e,n,o={}){const i=new ud(this.document,t,e);if(n){i.render=n}if(o.isAllowedInsideAttributeElement!==undefined){i._isAllowedInsideAttributeElement=o.isAllowedInsideAttributeElement}return i}createRawElement(t,e,n,o={}){const i=new gd(this.document,t,e);i.render=n||(()=>{});if(o.isAllowedInsideAttributeElement!==undefined){i._isAllowedInsideAttributeElement=o.isAllowedInsideAttributeElement}return i}setAttribute(t,e,n){n._setAttribute(t,e)}removeAttribute(t,e){e._removeAttribute(t)}addClass(t,e){e._addClass(t)}removeClass(t,e){e._removeClass(t)}setStyle(t,e,n){if(io(t)&&n===undefined){n=e}n._setStyle(t,e)}removeStyle(t,e){e._removeStyle(t)}setCustomProperty(t,e,n){n._setCustomProperty(t,e)}removeCustomProperty(t,e){return e._removeCustomProperty(t)}breakAttributes(t){if(t instanceof Al){return this._breakAttributes(t)}else{return this._breakAttributesRange(t)}}breakContainer(t){const e=t.parent;if(!e.is("containerElement")){throw new u["a"]("view-writer-break-non-container-element",this.document)}if(!e.parent){throw new u["a"]("view-writer-break-root",this.document)}if(t.isAtStart){return Al._createBefore(e)}else if(!t.isAtEnd){const n=e._clone(false);this.insert(Al._createAfter(e),n);const o=new _l(t,Al._createAt(e,"end"));const i=new Al(n,0);this.move(o,i)}return Al._createAfter(e)}mergeAttributes(t){const e=t.offset;const n=t.parent;if(n.is("$text")){return t}if(n.is("attributeElement")&&n.childCount===0){const t=n.parent;const e=n.index;n._remove();this._removeFromClonedElementsGroup(n);return this.mergeAttributes(new Al(t,e))}const o=n.getChild(e-1);const i=n.getChild(e);if(!o||!i){return t}if(o.is("$text")&&i.is("$text")){return xd(o,i)}else if(o.is("attributeElement")&&i.is("attributeElement")&&o.isSimilar(i)){const t=o.childCount;o._appendChild(i.getChildren());i._remove();this._removeFromClonedElementsGroup(i);return this.mergeAttributes(new Al(o,t))}return t}mergeContainers(t){const e=t.nodeBefore;const n=t.nodeAfter;if(!e||!n||!e.is("containerElement")||!n.is("containerElement")){throw new u["a"]("view-writer-merge-containers-invalid-position",this.document)}const o=e.getChild(e.childCount-1);const i=o instanceof Na?Al._createAt(o,"end"):Al._createAt(e,"end");this.move(_l._createIn(n),Al._createAt(e,"end"));this.remove(_l._createOn(n));return i}insert(t,e){e=ba(e)?[...e]:[e];Ed(e,this.document);const n=e.reduce(((t,e)=>{const n=t[t.length-1];const o=!(e.is("uiElement")&&e.isAllowedInsideAttributeElement);if(!n||n.breakAttributes!=o){t.push({breakAttributes:o,nodes:[e]})}else{n.nodes.push(e)}return t}),[]);let o=null;let i=t;for(const{nodes:t,breakAttributes:e}of n){const n=this._insertNodes(i,t,e);if(!o){o=n.start}i=n.end}if(!o){return new _l(t)}return new _l(o,i)}remove(t){const e=t instanceof _l?t:_l._createOn(t);Bd(e,this.document);if(e.isCollapsed){return new bd(this.document)}const{start:n,end:o}=this._breakAttributesRange(e,true);const i=n.parent;const r=o.offset-n.offset;const s=i._removeChildren(n.offset,r);for(const t of s){this._removeFromClonedElementsGroup(t)}const a=this.mergeAttributes(n);e.start=a;e.end=a.clone();return new bd(this.document,s)}clear(t,e){Bd(t,this.document);const n=t.getWalker({direction:"backward",ignoreElementEnd:true});for(const o of n){const n=o.item;let i;if(n.is("element")&&e.isSimilar(n)){i=_l._createOn(n)}else if(!o.nextPosition.isAfter(t.start)&&n.is("$textProxy")){const t=n.getAncestors().find((t=>t.is("element")&&e.isSimilar(t)));if(t){i=_l._createIn(t)}}if(i){if(i.end.isAfter(t.end)){i.end=t.end}if(i.start.isBefore(t.start)){i.start=t.start}this.remove(i)}}}move(t,e){let n;if(e.isAfter(t.end)){e=this._breakAttributes(e,true);const o=e.parent;const i=o.childCount;t=this._breakAttributesRange(t,true);n=this.remove(t);e.offset+=o.childCount-i}else{n=this.remove(t)}return this.insert(e,n)}wrap(t,e){if(!(e instanceof Ml)){throw new u["a"]("view-writer-wrap-invalid-attribute",this.document)}Bd(t,this.document);if(!t.isCollapsed){return this._wrapRange(t,e)}else{let n=t.start;if(n.parent.is("element")&&!Cd(n.parent)){n=n.getLastMatchingPosition((t=>t.item.is("uiElement")))}n=this._wrapPosition(n,e);const o=this.document.selection;if(o.isCollapsed&&o.getFirstPosition().isEqual(t.start)){this.setSelection(n)}return new _l(n)}}unwrap(t,e){if(!(e instanceof Ml)){throw new u["a"]("view-writer-unwrap-invalid-attribute",this.document)}Bd(t,this.document);if(t.isCollapsed){return t}const{start:n,end:o}=this._breakAttributesRange(t,true);const i=n.parent;const r=this._unwrapChildren(i,n.offset,o.offset,e);const s=this.mergeAttributes(r.start);if(!s.isEqual(r.start)){r.end.offset--}const a=this.mergeAttributes(r.end);return new _l(s,a)}rename(t,e){const n=new gl(this.document,t,e.getAttributes());this.insert(Al._createAfter(e),n);this.move(_l._createIn(e),Al._createAt(n,0));this.remove(_l._createOn(e));return n}clearClonedElementsGroup(t){this._cloneGroups.delete(t)}createPositionAt(t,e){return Al._createAt(t,e)}createPositionAfter(t){return Al._createAfter(t)}createPositionBefore(t){return Al._createBefore(t)}createRange(t,e){return new _l(t,e)}createRangeOn(t){return _l._createOn(t)}createRangeIn(t){return _l._createIn(t)}createSelection(t,e,n){return new xl(t,e,n)}_insertNodes(t,e,n){let o;if(n){o=Ad(t)}else{o=t.parent.is("$text")?t.parent.parent:t.parent}if(!o){throw new u["a"]("view-writer-invalid-position-container",this.document)}let i;if(n){i=this._breakAttributes(t,true)}else{i=t.parent.is("$text")?yd(t):t}const r=o._insertChild(i.offset,e);for(const t of e){this._addToClonedElementsGroup(t)}const s=i.getShiftedBy(r);const a=this.mergeAttributes(i);if(!a.isEqual(i)){s.offset--}const c=this.mergeAttributes(s);return new _l(a,c)}_wrapChildren(t,e,n,o){let i=e;const r=[];while(i<n){const e=t.getChild(i);const n=e.is("$text");const s=e.is("attributeElement");const a=e.isAllowedInsideAttributeElement;if(s&&this._wrapAttributeElement(o,e)){r.push(new Al(t,i))}else if(n||a||s&&_d(o,e)){const n=o._clone();e._remove();n._appendChild(e);t._insertChild(i,n);this._addToClonedElementsGroup(n);r.push(new Al(t,i))}else if(s){this._wrapChildren(e,0,e.childCount,o)}i++}let s=0;for(const t of r){t.offset-=s;if(t.offset==e){continue}const o=this.mergeAttributes(t);if(!o.isEqual(t)){s++;n--}}return _l._createFromParentsAndOffsets(t,e,t,n)}_unwrapChildren(t,e,n,o){let i=e;const r=[];while(i<n){const e=t.getChild(i);if(!e.is("attributeElement")){i++;continue}if(e.isSimilar(o)){const o=e.getChildren();const s=e.childCount;e._remove();t._insertChild(i,o);this._removeFromClonedElementsGroup(e);r.push(new Al(t,i),new Al(t,i+s));i+=s;n+=s-1;continue}if(this._unwrapAttributeElement(o,e)){r.push(new Al(t,i),new Al(t,i+1));i++;continue}this._unwrapChildren(e,0,e.childCount,o);i++}let s=0;for(const t of r){t.offset-=s;if(t.offset==e||t.offset==n){continue}const o=this.mergeAttributes(t);if(!o.isEqual(t)){s++;n--}}return _l._createFromParentsAndOffsets(t,e,t,n)}_wrapRange(t,e){const{start:n,end:o}=this._breakAttributesRange(t,true);const i=n.parent;const r=this._wrapChildren(i,n.offset,o.offset,e);const s=this.mergeAttributes(r.start);if(!s.isEqual(r.start)){r.end.offset--}const a=this.mergeAttributes(r.end);return new _l(s,a)}_wrapPosition(t,e){if(e.isSimilar(t.parent)){return vd(t.clone())}if(t.parent.is("$text")){t=yd(t)}const n=this.createAttributeElement();n._priority=Number.POSITIVE_INFINITY;n.isSimilar=()=>false;t.parent._insertChild(t.offset,n);const o=new _l(t,t.getShiftedBy(1));this.wrap(o,e);const i=new Al(n.parent,n.index);n._remove();const r=i.nodeBefore;const s=i.nodeAfter;if(r instanceof Na&&s instanceof Na){return xd(r,s)}return vd(i)}_wrapAttributeElement(t,e){if(!Td(t,e)){return false}if(t.name!==e.name||t.priority!==e.priority){return false}for(const n of t.getAttributeKeys()){if(n==="class"||n==="style"){continue}if(e.hasAttribute(n)&&e.getAttribute(n)!==t.getAttribute(n)){return false}}for(const n of t.getStyleNames()){if(e.hasStyle(n)&&e.getStyle(n)!==t.getStyle(n)){return false}}for(const n of t.getAttributeKeys()){if(n==="class"||n==="style"){continue}if(!e.hasAttribute(n)){this.setAttribute(n,t.getAttribute(n),e)}}for(const n of t.getStyleNames()){if(!e.hasStyle(n)){this.setStyle(n,t.getStyle(n),e)}}for(const n of t.getClassNames()){if(!e.hasClass(n)){this.addClass(n,e)}}return true}_unwrapAttributeElement(t,e){if(!Td(t,e)){return false}if(t.name!==e.name||t.priority!==e.priority){return false}for(const n of t.getAttributeKeys()){if(n==="class"||n==="style"){continue}if(!e.hasAttribute(n)||e.getAttribute(n)!==t.getAttribute(n)){return false}}if(!e.hasClass(...t.getClassNames())){return false}for(const n of t.getStyleNames()){if(!e.hasStyle(n)||e.getStyle(n)!==t.getStyle(n)){return false}}for(const n of t.getAttributeKeys()){if(n==="class"||n==="style"){continue}this.removeAttribute(n,e)}this.removeClass(Array.from(t.getClassNames()),e);this.removeStyle(Array.from(t.getStyleNames()),e);return true}_breakAttributesRange(t,e=false){const n=t.start;const o=t.end;Bd(t,this.document);if(t.isCollapsed){const n=this._breakAttributes(t.start,e);return new _l(n,n)}const i=this._breakAttributes(o,e);const r=i.parent.childCount;const s=this._breakAttributes(n,e);i.offset+=i.parent.childCount-r;return new _l(s,i)}_breakAttributes(t,e=false){const n=t.offset;const o=t.parent;if(t.parent.is("emptyElement")){throw new u["a"]("view-writer-cannot-break-empty-element",this.document)}if(t.parent.is("uiElement")){throw new u["a"]("view-writer-cannot-break-ui-element",this.document)}if(t.parent.is("rawElement")){throw new u["a"]("view-writer-cannot-break-raw-element",this.document)}if(!e&&o.is("$text")&&Sd(o.parent)){return t.clone()}if(Sd(o)){return t.clone()}if(o.is("$text")){return this._breakAttributes(yd(t),e)}const i=o.childCount;if(n==i){const t=new Al(o.parent,o.index+1);return this._breakAttributes(t,e)}else{if(n===0){const t=new Al(o.parent,o.index);return this._breakAttributes(t,e)}else{const t=o.index+1;const i=o._clone();o.parent._insertChild(t,i);this._addToClonedElementsGroup(i);const r=o.childCount-n;const s=o._removeChildren(n,r);i._appendChild(s);const a=new Al(o.parent,t);return this._breakAttributes(a,e)}}}_addToClonedElementsGroup(t){if(!t.root.is("rootElement")){return}if(t.is("element")){for(const e of t.getChildren()){this._addToClonedElementsGroup(e)}}const e=t.id;if(!e){return}let n=this._cloneGroups.get(e);if(!n){n=new Set;this._cloneGroups.set(e,n)}n.add(t);t._clonesGroup=n}_removeFromClonedElementsGroup(t){if(t.is("element")){for(const e of t.getChildren()){this._removeFromClonedElementsGroup(e)}}const e=t.id;if(!e){return}const n=this._cloneGroups.get(e);if(!n){return}n.delete(t)}}function Cd(t){return Array.from(t.getChildren()).some((t=>!t.is("uiElement")))}function Ad(t){let e=t.parent;while(!Sd(e)){if(!e){return undefined}e=e.parent}return e}function _d(t,e){if(t.priority<e.priority){return true}else if(t.priority>e.priority){return false}return t.getIdentity()<e.getIdentity()}function vd(t){const e=t.nodeBefore;if(e&&e.is("$text")){return new Al(e,e.data.length)}const n=t.nodeAfter;if(n&&n.is("$text")){return new Al(n,0)}return t}function yd(t){if(t.offset==t.parent.data.length){return new Al(t.parent.parent,t.parent.index+1)}if(t.offset===0){return new Al(t.parent.parent,t.parent.index)}const e=t.parent.data.slice(t.offset);t.parent._data=t.parent.data.slice(0,t.offset);t.parent.parent._insertChild(t.parent.index+1,new Na(t.root.document,e));return new Al(t.parent.parent,t.parent.index+1)}function xd(t,e){const n=t.data.length;t._data+=e.data;e._remove();return new Al(t,n)}function Ed(t,e){for(const n of t){if(!Dd.some((t=>n instanceof t))){throw new u["a"]("view-writer-insert-invalid-node-type",e)}if(!n.is("$text")){Ed(n.getChildren(),e)}}}const Dd=[Na,Ml,gl,Hl,gd,ud];function Sd(t){return t&&(t.is("containerElement")||t.is("documentFragment"))}function Bd(t,e){const n=Ad(t.start);const o=Ad(t.end);if(!n||!o||n!==o){throw new u["a"]("view-writer-invalid-range-container",e)}}function Td(t,e){return t.id===null&&e.id===null}function Pd(t){return Object.prototype.toString.call(t)=="[object Text]"}const Id=t=>t.createTextNode(" ");const Rd=t=>{const e=t.createElement("br");e.dataset.ckeFiller=true;return e};const Fd=7;const zd="".repeat(Fd);function Od(t){return Pd(t)&&t.data.substr(0,Fd)===zd}function Nd(t){return t.data.length==Fd&&Od(t)}function Md(t){if(Od(t)){return t.data.slice(Fd)}else{return t.data}}function Vd(t){t.document.on("arrowKey",Ld,{priority:"low"})}function Ld(t,e){if(e.keyCode==td.arrowleft){const t=e.domTarget.ownerDocument.defaultView.getSelection();if(t.rangeCount==1&&t.getRangeAt(0).collapsed){const e=t.getRangeAt(0).startContainer;const n=t.getRangeAt(0).startOffset;if(Od(e)&&n<=Fd){t.collapse(e,0)}}}}function Hd(t,e,n,o=false){n=n||function(t,e){return t===e};if(!Array.isArray(t)){t=Array.prototype.slice.call(t)}if(!Array.isArray(e)){e=Array.prototype.slice.call(e)}const i=Kd(t,e,n);return o?Gd(i,e.length):Wd(e,i)}function Kd(t,e,n){const o=qd(t,e,n);if(o===-1){return{firstIndex:-1,lastIndexOld:-1,lastIndexNew:-1}}const i=jd(t,o);const r=jd(e,o);const s=qd(i,r,n);const a=t.length-s;const c=e.length-s;return{firstIndex:o,lastIndexOld:a,lastIndexNew:c}}function qd(t,e,n){for(let o=0;o<Math.max(t.length,e.length);o++){if(t[o]===undefined||e[o]===undefined||!n(t[o],e[o])){return o}}return-1}function jd(t,e){return t.slice(e).reverse()}function Wd(t,e){const n=[];const{firstIndex:o,lastIndexOld:i,lastIndexNew:r}=e;if(r-o>0){n.push({index:o,type:"insert",values:t.slice(o,r)})}if(i-o>0){n.push({index:o+(r-o),type:"delete",howMany:i-o})}return n}function Gd(t,e){const{firstIndex:n,lastIndexOld:o,lastIndexNew:i}=t;if(n===-1){return Array(e).fill("equal")}let r=[];if(n>0){r=r.concat(Array(n).fill("equal"))}if(i-n>0){r=r.concat(Array(i-n).fill("insert"))}if(o-n>0){r=r.concat(Array(o-n).fill("delete"))}if(i<e){r=r.concat(Array(e-i).fill("equal"))}return r}function Ud(t,e,n){n=n||function(t,e){return t===e};const o=t.length;const i=e.length;if(o>200||i>200||o+i>300){return Ud.fastDiff(t,e,n,true)}let r,s;if(i<o){const n=t;t=e;e=n;r="delete";s="insert"}else{r="insert";s="delete"}const a=t.length;const c=e.length;const l=c-a;const d={};const u={};function h(o){const i=(u[o-1]!==undefined?u[o-1]:-1)+1;const l=u[o+1]!==undefined?u[o+1]:-1;const h=i>l?-1:1;if(d[o+h]){d[o]=d[o+h].slice(0)}if(!d[o]){d[o]=[]}d[o].push(i>l?r:s);let f=Math.max(i,l);let m=f-o;while(m<a&&f<c&&n(t[m],e[f])){m++;f++;d[o].push("equal")}return f}let f=0;let m;do{for(m=-f;m<l;m++){u[m]=h(m)}for(m=l+f;m>l;m--){u[m]=h(m)}u[l]=h(l);f++}while(u[l]!==c);return d[l].slice(1)}Ud.fastDiff=Hd;function $d(t,e,n){t.insertBefore(n,t.childNodes[e]||null)}function Jd(t){const e=t.parentNode;if(e){e.removeChild(t)}}function Yd(t){if(t){if(t.defaultView){return t instanceof t.defaultView.Document}else if(t.ownerDocument&&t.ownerDocument.defaultView){return t instanceof t.ownerDocument.defaultView.Node}}return false}class Qd{constructor(t,e){this.domDocuments=new Set;this.domConverter=t;this.markedAttributes=new Set;this.markedChildren=new Set;this.markedTexts=new Set;this.selection=e;this.isFocused=false;this._inlineFiller=null;this._fakeSelectionContainer=null}markToSync(t,e){if(t==="text"){if(this.domConverter.mapViewToDom(e.parent)){this.markedTexts.add(e)}}else{if(!this.domConverter.mapViewToDom(e)){return}if(t==="attributes"){this.markedAttributes.add(e)}else if(t==="children"){this.markedChildren.add(e)}else{throw new u["a"]("view-renderer-unknown-type",this)}}}render(){let t;for(const t of this.markedChildren){this._updateChildrenMappings(t)}if(this._inlineFiller&&!this._isSelectionInInlineFiller()){this._removeInlineFiller()}if(this._inlineFiller){t=this._getInlineFillerPosition()}else if(this._needsInlineFillerAtSelection()){t=this.selection.getFirstPosition();this.markedChildren.add(t.parent)}for(const t of this.markedAttributes){this._updateAttrs(t)}for(const e of this.markedChildren){this._updateChildren(e,{inlineFillerPosition:t})}for(const e of this.markedTexts){if(!this.markedChildren.has(e.parent)&&this.domConverter.mapViewToDom(e.parent)){this._updateText(e,{inlineFillerPosition:t})}}if(t){const e=this.domConverter.viewPositionToDom(t);const n=e.parent.ownerDocument;if(!Od(e.parent)){this._inlineFiller=Zd(n,e.parent,e.offset)}else{this._inlineFiller=e.parent}}else{this._inlineFiller=null}this._updateFocus();this._updateSelection();this.markedTexts.clear();this.markedAttributes.clear();this.markedChildren.clear()}_updateChildrenMappings(t){const e=this.domConverter.mapViewToDom(t);if(!e){return}const n=this.domConverter.mapViewToDom(t).childNodes;const o=Array.from(this.domConverter.viewChildrenToDom(t,e.ownerDocument,{withChildren:false}));const i=this._diffNodeLists(n,o);const r=this._findReplaceActions(i,n,o);if(r.indexOf("replace")!==-1){const e={equal:0,insert:0,delete:0};for(const i of r){if(i==="replace"){const i=e.equal+e.insert;const r=e.equal+e.delete;const s=t.getChild(i);if(s&&!(s.is("uiElement")||s.is("rawElement"))){this._updateElementMappings(s,n[r])}Jd(o[i]);e.equal++}else{e[i]++}}}}_updateElementMappings(t,e){this.domConverter.unbindDomElement(e);this.domConverter.bindElements(e,t);this.markedChildren.add(t);this.markedAttributes.add(t)}_getInlineFillerPosition(){const t=this.selection.getFirstPosition();if(t.parent.is("$text")){return Al._createBefore(this.selection.getFirstPosition().parent)}else{return t}}_isSelectionInInlineFiller(){if(this.selection.rangeCount!=1||!this.selection.isCollapsed){return false}const t=this.selection.getFirstPosition();const e=this.domConverter.viewPositionToDom(t);if(e&&Pd(e.parent)&&Od(e.parent)){return true}return false}_removeInlineFiller(){const t=this._inlineFiller;if(!Od(t)){throw new u["a"]("view-renderer-filler-was-lost",this)}if(Nd(t)){t.parentNode.removeChild(t)}else{t.data=t.data.substr(Fd)}this._inlineFiller=null}_needsInlineFillerAtSelection(){if(this.selection.rangeCount!=1||!this.selection.isCollapsed){return false}const t=this.selection.getFirstPosition();const e=t.parent;const n=t.offset;if(!this.domConverter.mapViewToDom(e.root)){return false}if(!e.is("element")){return false}if(!Xd(e)){return false}if(n===e.getFillerOffset()){return false}const o=t.nodeBefore;const i=t.nodeAfter;if(o instanceof Na||i instanceof Na){return false}return true}_updateText(t,e){const n=this.domConverter.findCorrespondingDomText(t);const o=this.domConverter.viewToDom(t,n.ownerDocument);const i=n.data;let r=o.data;const s=e.inlineFillerPosition;if(s&&s.parent==t.parent&&s.offset==t.index){r=zd+r}if(i!=r){const t=Hd(i,r);for(const e of t){if(e.type==="insert"){n.insertData(e.index,e.values.join(""))}else{n.deleteData(e.index,e.howMany)}}}}_updateAttrs(t){const e=this.domConverter.mapViewToDom(t);if(!e){return}const n=Array.from(e.attributes).map((t=>t.name));const o=t.getAttributeKeys();for(const n of o){e.setAttribute(n,t.getAttribute(n))}for(const o of n){if(!t.hasAttribute(o)){e.removeAttribute(o)}}}_updateChildren(t,e){const n=this.domConverter.mapViewToDom(t);if(!n){return}const o=e.inlineFillerPosition;const i=this.domConverter.mapViewToDom(t).childNodes;const r=Array.from(this.domConverter.viewChildrenToDom(t,n.ownerDocument,{bind:true,inlineFillerPosition:o}));if(o&&o.parent===t){Zd(n.ownerDocument,r,o.offset)}const s=this._diffNodeLists(i,r);let a=0;const c=new Set;for(const t of s){if(t==="delete"){c.add(i[a]);Jd(i[a])}else if(t==="equal"){a++}}a=0;for(const t of s){if(t==="insert"){$d(n,a,r[a]);a++}else if(t==="equal"){this._markDescendantTextToSync(this.domConverter.domToView(r[a]));a++}}for(const t of c){if(!t.parentNode){this.domConverter.unbindDomElement(t)}}}_diffNodeLists(t,e){t=ou(t,this._fakeSelectionContainer);return Ud(t,e,eu.bind(null,this.domConverter))}_findReplaceActions(t,e,n){if(t.indexOf("insert")===-1||t.indexOf("delete")===-1){return t}let o=[];let i=[];let r=[];const s={equal:0,insert:0,delete:0};for(const a of t){if(a==="insert"){r.push(n[s.equal+s.insert])}else if(a==="delete"){i.push(e[s.equal+s.delete])}else{o=o.concat(Ud(i,r,tu).map((t=>t==="equal"?"replace":t)));o.push("equal");i=[];r=[]}s[a]++}return o.concat(Ud(i,r,tu).map((t=>t==="equal"?"replace":t)))}_markDescendantTextToSync(t){if(!t){return}if(t.is("$text")){this.markedTexts.add(t)}else if(t.is("element")){for(const e of t.getChildren()){this._markDescendantTextToSync(e)}}}_updateSelection(){if(this.selection.rangeCount===0){this._removeDomSelection();this._removeFakeSelection();return}const t=this.domConverter.mapViewToDom(this.selection.editableElement);if(!this.isFocused||!t){return}if(this.selection.isFake){this._updateFakeSelection(t)}else{this._removeFakeSelection();this._updateDomSelection(t)}}_updateFakeSelection(t){const e=t.ownerDocument;if(!this._fakeSelectionContainer){this._fakeSelectionContainer=iu(e)}const n=this._fakeSelectionContainer;this.domConverter.bindFakeSelection(n,this.selection);if(!this._fakeSelectionNeedsUpdate(t)){return}if(!n.parentElement||n.parentElement!=t){t.appendChild(n)}n.textContent=this.selection.fakeSelectionLabel||" ";const o=e.getSelection();const i=e.createRange();o.removeAllRanges();i.selectNodeContents(n);o.addRange(i)}_updateDomSelection(t){const e=t.ownerDocument.defaultView.getSelection();if(!this._domSelectionNeedsUpdate(e)){return}const n=this.domConverter.viewPositionToDom(this.selection.anchor);const o=this.domConverter.viewPositionToDom(this.selection.focus);e.collapse(n.parent,n.offset);e.extend(o.parent,o.offset);if(Wl.isGecko){nu(o,e)}}_domSelectionNeedsUpdate(t){if(!this.domConverter.isDomSelectionCorrect(t)){return true}const e=t&&this.domConverter.domSelectionToView(t);if(e&&this.selection.isEqual(e)){return false}if(!this.selection.isCollapsed&&this.selection.isSimilar(e)){return false}return true}_fakeSelectionNeedsUpdate(t){const e=this._fakeSelectionContainer;const n=t.ownerDocument.getSelection();if(!e||e.parentElement!==t){return true}if(n.anchorNode!==e&&!e.contains(n.anchorNode)){return true}return e.textContent!==this.selection.fakeSelectionLabel}_removeDomSelection(){for(const t of this.domDocuments){const e=t.getSelection();if(e.rangeCount){const e=t.activeElement;const n=this.domConverter.mapDomToView(e);if(e&&n){t.getSelection().removeAllRanges()}}}}_removeFakeSelection(){const t=this._fakeSelectionContainer;if(t){t.remove()}}_updateFocus(){if(this.isFocused){const t=this.selection.editableElement;if(t){this.domConverter.focus(t)}}}}Hn(Qd,Tn);function Xd(t){if(t.getAttribute("contenteditable")=="false"){return false}const e=t.findAncestor((t=>t.hasAttribute("contenteditable")));return!e||e.getAttribute("contenteditable")=="true"}function Zd(t,e,n){const o=e instanceof Array?e:e.childNodes;const i=o[n];if(Pd(i)){i.data=zd+i.data;return i}else{const i=t.createTextNode(zd);if(Array.isArray(e)){o.splice(n,0,i)}else{$d(e,n,i)}return i}}function tu(t,e){return Yd(t)&&Yd(e)&&!Pd(t)&&!Pd(e)&&t.nodeType!==Node.COMMENT_NODE&&e.nodeType!==Node.COMMENT_NODE&&t.tagName.toLowerCase()===e.tagName.toLowerCase()}function eu(t,e,n){if(e===n){return true}else if(Pd(e)&&Pd(n)){return e.data===n.data}else if(t.isBlockFiller(e)&&t.isBlockFiller(n)){return true}return false}function nu(t,e){const n=t.parent;if(n.nodeType!=Node.ELEMENT_NODE||t.offset!=n.childNodes.length-1){return}const o=n.childNodes[t.offset];if(o&&o.tagName=="BR"){e.addRange(e.getRangeAt(0))}}function ou(t,e){const n=Array.from(t);if(n.length==0||!e){return n}const o=n[n.length-1];if(o==e){n.pop()}return n}function iu(t){const e=t.createElement("div");e.className="ck-fake-selection-container";Object.assign(e.style,{position:"fixed",top:0,left:"-9999px",width:"42px"});e.textContent=" ";return e}var ru={window:window,document:document};function su(t){let e=0;while(t.previousSibling){t=t.previousSibling;e++}return e}function au(t){const e=[];while(t&&t.nodeType!=Node.DOCUMENT_NODE){e.unshift(t);t=t.parentNode}return e}function cu(t,e){const n=au(t);const o=au(e);let i=0;while(n[i]==o[i]&&n[i]){i++}return i===0?null:n[i-1]}const lu=Rd(document);class du{constructor(t,e={}){this.document=t;this.blockFillerMode=e.blockFillerMode||"br";this.preElements=["pre"];this.blockElements=["p","div","h1","h2","h3","h4","h5","h6","li","dd","dt","figcaption","td","th"];this._blockFiller=this.blockFillerMode=="br"?Rd:Id;this._domToViewMapping=new WeakMap;this._viewToDomMapping=new WeakMap;this._fakeSelectionMapping=new WeakMap;this._rawContentElementMatcher=new Ha;this._encounteredRawContentDomNodes=new WeakSet}bindFakeSelection(t,e){this._fakeSelectionMapping.set(t,new xl(e))}fakeSelectionToView(t){return this._fakeSelectionMapping.get(t)}bindElements(t,e){this._domToViewMapping.set(t,e);this._viewToDomMapping.set(e,t)}unbindDomElement(t){const e=this._domToViewMapping.get(t);if(e){this._domToViewMapping.delete(t);this._viewToDomMapping.delete(e);for(const e of t.childNodes){this.unbindDomElement(e)}}}bindDocumentFragments(t,e){this._domToViewMapping.set(t,e);this._viewToDomMapping.set(e,t)}viewToDom(t,e,n={}){if(t.is("$text")){const n=this._processDataFromViewText(t);return e.createTextNode(n)}else{if(this.mapViewToDom(t)){return this.mapViewToDom(t)}let o;if(t.is("documentFragment")){o=e.createDocumentFragment();if(n.bind){this.bindDocumentFragments(o,t)}}else if(t.is("uiElement")){o=t.render(e);if(n.bind){this.bindElements(o,t)}return o}else{if(t.hasAttribute("xmlns")){o=e.createElementNS(t.getAttribute("xmlns"),t.name)}else{o=e.createElement(t.name)}if(t.is("rawElement")){t.render(o)}if(n.bind){this.bindElements(o,t)}for(const e of t.getAttributeKeys()){o.setAttribute(e,t.getAttribute(e))}}if(n.withChildren!==false){for(const i of this.viewChildrenToDom(t,e,n)){o.appendChild(i)}}return o}}*viewChildrenToDom(t,e,n={}){const o=t.getFillerOffset&&t.getFillerOffset();let i=0;for(const r of t.getChildren()){if(o===i){yield this._blockFiller(e)}yield this.viewToDom(r,e,n);i++}if(o===i){yield this._blockFiller(e)}}viewRangeToDom(t){const e=this.viewPositionToDom(t.start);const n=this.viewPositionToDom(t.end);const o=document.createRange();o.setStart(e.parent,e.offset);o.setEnd(n.parent,n.offset);return o}viewPositionToDom(t){const e=t.parent;if(e.is("$text")){const n=this.findCorrespondingDomText(e);if(!n){return null}let o=t.offset;if(Od(n)){o+=Fd}return{parent:n,offset:o}}else{let n,o,i;if(t.offset===0){n=this.mapViewToDom(e);if(!n){return null}i=n.childNodes[0]}else{const e=t.nodeBefore;o=e.is("$text")?this.findCorrespondingDomText(e):this.mapViewToDom(t.nodeBefore);if(!o){return null}n=o.parentNode;i=o.nextSibling}if(Pd(i)&&Od(i)){return{parent:i,offset:Fd}}const r=o?su(o)+1:0;return{parent:n,offset:r}}}domToView(t,e={}){if(this.isBlockFiller(t,this.blockFillerMode)){return null}const n=this.getHostViewElement(t);if(n){return n}if(Pd(t)){if(Nd(t)){return null}else{const e=this._processDataFromDomText(t);return e===""?null:new Na(this.document,e)}}else if(this.isComment(t)){return null}else{if(this.mapDomToView(t)){return this.mapDomToView(t)}let n;if(this.isDocumentFragment(t)){n=new bd(this.document);if(e.bind){this.bindDocumentFragments(t,n)}}else{const o=e.keepOriginalCase?t.tagName:t.tagName.toLowerCase();n=new ul(this.document,o);if(e.bind){this.bindElements(t,n)}const i=t.attributes;for(let t=i.length-1;t>=0;t--){n._setAttribute(i[t].name,i[t].value)}if(e.withChildren!==false&&this._rawContentElementMatcher.match(n)){n._setCustomProperty("$rawContent",t.innerHTML);this._encounteredRawContentDomNodes.add(t);return n}}if(e.withChildren!==false){for(const o of this.domChildrenToView(t,e)){n._appendChild(o)}}return n}}*domChildrenToView(t,e={}){for(let n=0;n<t.childNodes.length;n++){const o=t.childNodes[n];const i=this.domToView(o,e);if(i!==null){yield i}}}domSelectionToView(t){if(t.rangeCount===1){let e=t.getRangeAt(0).startContainer;if(Pd(e)){e=e.parentNode}const n=this.fakeSelectionToView(e);if(n){return n}}const e=this.isDomSelectionBackward(t);const n=[];for(let e=0;e<t.rangeCount;e++){const o=t.getRangeAt(e);const i=this.domRangeToView(o);if(i){n.push(i)}}return new xl(n,{backward:e})}domRangeToView(t){const e=this.domPositionToView(t.startContainer,t.startOffset);const n=this.domPositionToView(t.endContainer,t.endOffset);if(e&&n){return new _l(e,n)}return null}domPositionToView(t,e){if(this.isBlockFiller(t,this.blockFillerMode)){return this.domPositionToView(t.parentNode,su(t))}const n=this.mapDomToView(t);if(n&&(n.is("uiElement")||n.is("rawElement"))){return Al._createBefore(n)}if(Pd(t)){if(Nd(t)){return this.domPositionToView(t.parentNode,su(t))}const n=this.findCorrespondingViewText(t);let o=e;if(!n){return null}if(Od(t)){o-=Fd;o=o<0?0:o}return new Al(n,o)}else{if(e===0){const e=this.mapDomToView(t);if(e){return new Al(e,0)}}else{const n=t.childNodes[e-1];const o=Pd(n)?this.findCorrespondingViewText(n):this.mapDomToView(n);if(o&&o.parent){return new Al(o.parent,o.index+1)}}return null}}mapDomToView(t){const e=this.getHostViewElement(t);return e||this._domToViewMapping.get(t)}findCorrespondingViewText(t){if(Nd(t)){return null}const e=this.getHostViewElement(t);if(e){return e}const n=t.previousSibling;if(n){if(!this.isElement(n)){return null}const t=this.mapDomToView(n);if(t){const e=t.nextSibling;if(e instanceof Na){return t.nextSibling}else{return null}}}else{const e=this.mapDomToView(t.parentNode);if(e){const t=e.getChild(0);if(t instanceof Na){return t}else{return null}}}return null}mapViewToDom(t){return this._viewToDomMapping.get(t)}findCorrespondingDomText(t){const e=t.previousSibling;if(e&&this.mapViewToDom(e)){return this.mapViewToDom(e).nextSibling}if(!e&&t.parent&&this.mapViewToDom(t.parent)){return this.mapViewToDom(t.parent).childNodes[0]}return null}focus(t){const e=this.mapViewToDom(t);if(e&&e.ownerDocument.activeElement!==e){const{scrollX:t,scrollY:n}=ru.window;const o=[];hu(e,(t=>{const{scrollLeft:e,scrollTop:n}=t;o.push([e,n])}));e.focus();hu(e,(t=>{const[e,n]=o.shift();t.scrollLeft=e;t.scrollTop=n}));ru.window.scrollTo(t,n)}}isElement(t){return t&&t.nodeType==Node.ELEMENT_NODE}isDocumentFragment(t){return t&&t.nodeType==Node.DOCUMENT_FRAGMENT_NODE}isComment(t){return t&&t.nodeType==Node.COMMENT_NODE}isBlockFiller(t){if(this.blockFillerMode=="br"){return t.isEqualNode(lu)}if(t.tagName==="BR"&&mu(t,this.blockElements)&&t.parentNode.childNodes.length===1){return true}return fu(t,this.blockElements)}isDomSelectionBackward(t){if(t.isCollapsed){return false}const e=document.createRange();e.setStart(t.anchorNode,t.anchorOffset);e.setEnd(t.focusNode,t.focusOffset);const n=e.collapsed;e.detach();return n}getHostViewElement(t){const e=au(t);e.pop();while(e.length){const t=e.pop();const n=this._domToViewMapping.get(t);if(n&&(n.is("uiElement")||n.is("rawElement"))){return n}}return null}isDomSelectionCorrect(t){return this._isDomSelectionPositionCorrect(t.anchorNode,t.anchorOffset)&&this._isDomSelectionPositionCorrect(t.focusNode,t.focusOffset)}registerRawContentMatcher(t){this._rawContentElementMatcher.add(t)}_isDomSelectionPositionCorrect(t,e){if(Pd(t)&&Od(t)&&e<Fd){return false}if(this.isElement(t)&&Od(t.childNodes[e])){return false}const n=this.mapDomToView(t);if(n&&(n.is("uiElement")||n.is("rawElement"))){return false}return true}_processDataFromViewText(t){let e=t.data;if(t.getAncestors().some((t=>this.preElements.includes(t.name)))){return e}if(e.charAt(0)==" "){const n=this._getTouchingViewTextNode(t,false);const o=n&&this._nodeEndsWithSpace(n);if(o||!n){e=" "+e.substr(1)}}if(e.charAt(e.length-1)==" "){const n=this._getTouchingViewTextNode(t,true);if(e.charAt(e.length-2)==" "||!n||n.data.charAt(0)==" "){e=e.substr(0,e.length-1)+" "}}return e.replace(/ {2}/g," ")}_nodeEndsWithSpace(t){if(t.getAncestors().some((t=>this.preElements.includes(t.name)))){return false}const e=this._processDataFromViewText(t);return e.charAt(e.length-1)==" "}_processDataFromDomText(t){let e=t.data;if(uu(t,this.preElements)){return Md(t)}e=e.replace(/[ \n\t\r]{1,}/g," ");const n=this._getTouchingInlineDomNode(t,false);const o=this._getTouchingInlineDomNode(t,true);const i=this._checkShouldLeftTrimDomText(t,n);const r=this._checkShouldRightTrimDomText(t,o);if(i){e=e.replace(/^ /,"")}if(r){e=e.replace(/ $/,"")}e=Md(new Text(e));e=e.replace(/ \u00A0/g," ");if(/( |\u00A0)\u00A0$/.test(e)||!o||o.data&&o.data.charAt(0)==" "){e=e.replace(/\u00A0$/," ")}if(i){e=e.replace(/^\u00A0/," ")}return e}_checkShouldLeftTrimDomText(t,e){if(!e){return true}if(fa(e)){return true}if(this._encounteredRawContentDomNodes.has(t.previousSibling)){return false}return/[^\S\u00A0]/.test(e.data.charAt(e.data.length-1))}_checkShouldRightTrimDomText(t,e){if(e){return false}return!Od(t)}_getTouchingViewTextNode(t,e){const n=new Cl({startPosition:e?Al._createAfter(t):Al._createBefore(t),direction:e?"forward":"backward"});for(const t of n){if(t.item.is("containerElement")){return null}else if(t.item.is("element","br")){return null}else if(t.item.is("$textProxy")){return t.item}}return null}_getTouchingInlineDomNode(t,e){if(!t.parentNode){return null}const n=e?"nextNode":"previousNode";const o=t.ownerDocument;const i=au(t)[0];const r=o.createTreeWalker(i,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,{acceptNode(t){if(Pd(t)){return NodeFilter.FILTER_ACCEPT}if(t.tagName=="BR"){return NodeFilter.FILTER_ACCEPT}return NodeFilter.FILTER_SKIP}});r.currentNode=t;const s=r[n]();if(s!==null){const e=cu(t,s);if(e&&!uu(t,this.blockElements,e)&&!uu(s,this.blockElements,e)){return s}}return null}}function uu(t,e,n){let o=au(t);if(n){o=o.slice(o.indexOf(n)+1)}return o.some((t=>t.tagName&&e.includes(t.tagName.toLowerCase())))}function hu(t,e){while(t&&t!=ru.document){e(t);t=t.parentNode}}function fu(t,e){const n=Pd(t)&&t.data==" ";return n&&mu(t,e)&&t.parentNode.childNodes.length===1}function mu(t,e){const n=t.parentNode;return n&&n.tagName&&e.includes(n.tagName.toLowerCase())}function gu(t){const e=Object.prototype.toString.apply(t);if(e=="[object Window]"){return true}if(e=="[object global]"){return true}return false}const pu=vn({},g,{listenTo(t,...e){if(Yd(t)||gu(t)){const n=this._getProxyEmitter(t)||new ku(t);n.attach(...e);t=n}g.listenTo.call(this,t,...e)},stopListening(t,e,n){if(Yd(t)||gu(t)){const e=this._getProxyEmitter(t);if(!e){return}t=e}g.stopListening.call(this,t,e,n);if(t instanceof ku){t.detach(e)}},_getProxyEmitter(t){return p(this,wu(t))}});var bu=pu;class ku{constructor(t){b(this,wu(t));this._domNode=t}}vn(ku.prototype,g,{attach(t,e,n={}){if(this._domListeners&&this._domListeners[t]){return}const o={capture:!!n.useCapture,passive:!!n.usePassive};const i=this._createDomListener(t,o);this._domNode.addEventListener(t,i,o);if(!this._domListeners){this._domListeners={}}this._domListeners[t]=i},detach(t){let e;if(this._domListeners[t]&&(!(e=this._events[t])||!e.callbacks.length)){this._domListeners[t].removeListener()}},_createDomListener(t,e){const n=e=>{this.fire(t,e)};n.removeListener=()=>{this._domNode.removeEventListener(t,n,e);delete this._domListeners[t]};return n}});function wu(t){return t["data-ck-expando"]||(t["data-ck-expando"]=a())}class Cu{constructor(t){this.view=t;this.document=t.document;this.isEnabled=false}enable(){this.isEnabled=true}disable(){this.isEnabled=false}destroy(){this.disable();this.stopListening()}checkShouldIgnoreEventFromTarget(t){if(t&&t.nodeType===3){t=t.parentNode}if(!t||t.nodeType!==1){return false}return t.matches("[data-cke-ignore-events], [data-cke-ignore-events] *")}}Hn(Cu,bu);var Au="__lodash_hash_undefined__";function _u(t){this.__data__.set(t,Au);return this}var vu=_u;function yu(t){return this.__data__.has(t)}var xu=yu;function Eu(t){var e=-1,n=t==null?0:t.length;this.__data__=new fi;while(++e<n){this.add(t[e])}}Eu.prototype.add=Eu.prototype.push=vu;Eu.prototype.has=xu;var Du=Eu;function Su(t,e){var n=-1,o=t==null?0:t.length;while(++n<o){if(e(t[n],n,t)){return true}}return false}var Bu=Su;function Tu(t,e){return t.has(e)}var Pu=Tu;var Iu=1,Ru=2;function Fu(t,e,n,o,i,r){var s=n&Iu,a=t.length,c=e.length;if(a!=c&&!(s&&c>a)){return false}var l=r.get(t);var d=r.get(e);if(l&&d){return l==e&&d==t}var u=-1,h=true,f=n&Ru?new Du:undefined;r.set(t,e);r.set(e,t);while(++u<a){var m=t[u],g=e[u];if(o){var p=s?o(g,m,u,e,t,r):o(m,g,u,t,e,r)}if(p!==undefined){if(p){continue}h=false;break}if(f){if(!Bu(e,(function(t,e){if(!Pu(f,e)&&(m===t||i(m,t,n,o,r))){return f.push(e)}}))){h=false;break}}else if(!(m===g||i(m,g,n,o,r))){h=false;break}}r["delete"](t);r["delete"](e);return h}var zu=Fu;function Ou(t){var e=-1,n=Array(t.size);t.forEach((function(t,o){n[++e]=[o,t]}));return n}var Nu=Ou;function Mu(t){var e=-1,n=Array(t.size);t.forEach((function(t){n[++e]=t}));return n}var Vu=Mu;var Lu=1,Hu=2;var Ku="[object Boolean]",qu="[object Date]",ju="[object Error]",Wu="[object Map]",Gu="[object Number]",Uu="[object RegExp]",$u="[object Set]",Ju="[object String]",Yu="[object Symbol]";var Qu="[object ArrayBuffer]",Xu="[object DataView]";var Zu=P?P.prototype:undefined,th=Zu?Zu.valueOf:undefined;function eh(t,e,n,o,i,r,s){switch(n){case Xu:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset){return false}t=t.buffer;e=e.buffer;case Qu:if(t.byteLength!=e.byteLength||!r(new Ir(t),new Ir(e))){return false}return true;case Ku:case qu:case Gu:return Et(+t,+e);case ju:return t.name==e.name&&t.message==e.message;case Uu:case Ju:return t==e+"";case Wu:var a=Nu;case $u:var c=o&Lu;a||(a=Vu);if(t.size!=e.size&&!c){return false}var l=s.get(t);if(l){return l==e}o|=Hu;s.set(t,e);var d=zu(a(t),a(e),o,i,r,s);s["delete"](t);return d;case Yu:if(th){return th.call(t)==th.call(e)}}return false}var nh=eh;var oh=1;var ih=Object.prototype;var rh=ih.hasOwnProperty;function sh(t,e,n,o,i,r){var s=n&oh,a=or(t),c=a.length,l=or(e),d=l.length;if(c!=d&&!s){return false}var u=c;while(u--){var h=a[u];if(!(s?h in e:rh.call(e,h))){return false}}var f=r.get(t);var m=r.get(e);if(f&&m){return f==e&&m==t}var g=true;r.set(t,e);r.set(e,t);var p=s;while(++u<c){h=a[u];var b=t[h],k=e[h];if(o){var w=s?o(k,b,h,e,t,r):o(b,k,h,t,e,r)}if(!(w===undefined?b===k||i(b,k,n,o,r):w)){g=false;break}p||(p=h=="constructor")}if(g&&!p){var C=t.constructor,A=e.constructor;if(C!=A&&("constructor"in t&&"constructor"in e)&&!(typeof C=="function"&&C instanceof C&&typeof A=="function"&&A instanceof A)){g=false}}r["delete"](t);r["delete"](e);return g}var ah=sh;var ch=1;var lh="[object Arguments]",dh="[object Array]",uh="[object Object]";var hh=Object.prototype;var fh=hh.hasOwnProperty;function mh(t,e,n,o,i,r){var s=xe(t),a=xe(e),c=s?dh:Er(t),l=a?dh:Er(e);c=c==lh?uh:c;l=l==lh?uh:l;var d=c==uh,u=l==uh,h=c==l;if(h&&Object(Ee["a"])(t)){if(!Object(Ee["a"])(e)){return false}s=true;d=false}if(h&&!d){r||(r=new ki);return s||sn(t)?zu(t,e,n,o,i,r):nh(t,e,c,n,o,i,r)}if(!(n&ch)){var f=d&&fh.call(t,"__wrapped__"),m=u&&fh.call(e,"__wrapped__");if(f||m){var g=f?t.value():t,p=m?e.value():e;r||(r=new ki);return i(g,p,n,o,r)}}if(!h){return false}r||(r=new ki);return ah(t,e,n,o,i,r)}var gh=mh;function ph(t,e,n,o,i){if(t===e){return true}if(t==null||e==null||!ge(t)&&!ge(e)){return t!==t&&e!==e}return gh(t,e,n,o,ph,i)}var bh=ph;function kh(t,e,n){n=typeof n=="function"?n:undefined;var o=n?n(t,e):undefined;return o===undefined?bh(t,e,undefined,n):!!o}var wh=kh;class Ch extends Cu{constructor(t){super(t);this._config={childList:true,characterData:true,characterDataOldValue:true,subtree:true};this.domConverter=t.domConverter;this.renderer=t._renderer;this._domElements=[];this._mutationObserver=new window.MutationObserver(this._onMutations.bind(this))}flush(){this._onMutations(this._mutationObserver.takeRecords())}observe(t){this._domElements.push(t);if(this.isEnabled){this._mutationObserver.observe(t,this._config)}}enable(){super.enable();for(const t of this._domElements){this._mutationObserver.observe(t,this._config)}}disable(){super.disable();this._mutationObserver.disconnect()}destroy(){super.destroy();this._mutationObserver.disconnect()}_onMutations(t){if(t.length===0){return}const e=this.domConverter;const n=new Map;const o=new Set;for(const n of t){if(n.type==="childList"){const t=e.mapDomToView(n.target);if(t&&(t.is("uiElement")||t.is("rawElement"))){continue}if(t&&!this._isBogusBrMutation(n)){o.add(t)}}}for(const i of t){const t=e.mapDomToView(i.target);if(t&&(t.is("uiElement")||t.is("rawElement"))){continue}if(i.type==="characterData"){const t=e.findCorrespondingViewText(i.target);if(t&&!o.has(t.parent)){n.set(t,{type:"text",oldText:t.data,newText:Md(i.target),node:t})}else if(!t&&Od(i.target)){o.add(e.mapDomToView(i.target.parentNode))}}}const i=[];for(const t of n.values()){this.renderer.markToSync("text",t.node);i.push(t)}for(const t of o){const n=e.mapViewToDom(t);const o=Array.from(t.getChildren());const r=Array.from(e.domChildrenToView(n,{withChildren:false}));if(!wh(o,r,a)){this.renderer.markToSync("children",t);i.push({type:"children",oldChildren:o,newChildren:r,node:t})}}const r=t[0].target.ownerDocument.getSelection();let s=null;if(r&&r.anchorNode){const t=e.domPositionToView(r.anchorNode,r.anchorOffset);const n=e.domPositionToView(r.focusNode,r.focusOffset);if(t&&n){s=new xl(t);s.setFocus(n)}}if(i.length){this.document.fire("mutations",i,s);this.view.forceRender()}function a(t,e){if(Array.isArray(t)){return}if(t===e){return true}else if(t.is("$text")&&e.is("$text")){return t.data===e.data}return false}}_isBogusBrMutation(t){let e=null;if(t.nextSibling===null&&t.removedNodes.length===0&&t.addedNodes.length==1){e=this.domConverter.domToView(t.addedNodes[0],{withChildren:false})}return e&&e.is("element","br")}}class Ah{constructor(t,e,n){this.view=t;this.document=t.document;this.domEvent=e;this.domTarget=e.target;vn(this,n)}get target(){return this.view.domConverter.mapDomToView(this.domTarget)}preventDefault(){this.domEvent.preventDefault()}stopPropagation(){this.domEvent.stopPropagation()}}class _h extends Cu{constructor(t){super(t);this.useCapture=false}observe(t){const e=typeof this.domEventType=="string"?[this.domEventType]:this.domEventType;e.forEach((e=>{this.listenTo(t,e,((t,e)=>{if(this.isEnabled&&!this.checkShouldIgnoreEventFromTarget(e.target)){this.onDomEvent(e)}}),{useCapture:this.useCapture})}))}fire(t,e,n){if(this.isEnabled){this.document.fire(t,new Ah(this.view,e,n))}}}class vh extends _h{constructor(t){super(t);this.domEventType=["keydown","keyup"]}onDomEvent(t){this.fire(t.type,t,{keyCode:t.keyCode,altKey:t.altKey,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,metaKey:t.metaKey,get keystroke(){return nd(this)}})}}var yh=function(){return B["a"].Date.now()};var xh=yh;var Eh=/\s/;function Dh(t){var e=t.length;while(e--&&Eh.test(t.charAt(e))){}return e}var Sh=Dh;var Bh=/^\s+/;function Th(t){return t?t.slice(0,Sh(t)+1).replace(Bh,""):t}var Ph=Th;var Ih=0/0;var Rh=/^[-+]0x[0-9a-f]+$/i;var Fh=/^0b[01]+$/i;var zh=/^0o[0-7]+$/i;var Oh=parseInt;function Nh(t){if(typeof t=="number"){return t}if(Ja(t)){return Ih}if(S(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=S(e)?e+"":e}if(typeof t!="string"){return t===0?t:+t}t=Ph(t);var n=Fh.test(t);return n||zh.test(t)?Oh(t.slice(2),n?2:8):Rh.test(t)?Ih:+t}var Mh=Nh;var Vh="Expected a function";var Lh=Math.max,Hh=Math.min;function Kh(t,e,n){var o,i,r,s,a,c,l=0,d=false,u=false,h=true;if(typeof t!="function"){throw new TypeError(Vh)}e=Mh(e)||0;if(S(n)){d=!!n.leading;u="maxWait"in n;r=u?Lh(Mh(n.maxWait)||0,e):r;h="trailing"in n?!!n.trailing:h}function f(e){var n=o,r=i;o=i=undefined;l=e;s=t.apply(r,n);return s}function m(t){l=t;a=setTimeout(b,e);return d?f(t):s}function g(t){var n=t-c,o=t-l,i=e-n;return u?Hh(i,r-o):i}function p(t){var n=t-c,o=t-l;return c===undefined||n>=e||n<0||u&&o>=r}function b(){var t=xh();if(p(t)){return k(t)}a=setTimeout(b,g(t))}function k(t){a=undefined;if(h&&o){return f(t)}o=i=undefined;return s}function w(){if(a!==undefined){clearTimeout(a)}l=0;o=c=i=a=undefined}function C(){return a===undefined?s:k(xh())}function A(){var t=xh(),n=p(t);o=arguments;i=this;c=t;if(n){if(a===undefined){return m(c)}if(u){clearTimeout(a);a=setTimeout(b,e);return f(c)}}if(a===undefined){a=setTimeout(b,e)}return s}A.cancel=w;A.flush=C;return A}var qh=Kh;class jh extends Cu{constructor(t){super(t);this._fireSelectionChangeDoneDebounced=qh((t=>this.document.fire("selectionChangeDone",t)),200)}observe(){const t=this.document;t.on("arrowKey",((e,n)=>{const o=t.selection;if(o.isFake&&this.isEnabled){n.preventDefault()}}),{context:"$capture"});t.on("arrowKey",((e,n)=>{const o=t.selection;if(o.isFake&&this.isEnabled){this._handleSelectionMove(n.keyCode)}}),{priority:"lowest"})}destroy(){super.destroy();this._fireSelectionChangeDoneDebounced.cancel()}_handleSelectionMove(t){const e=this.document.selection;const n=new xl(e.getRanges(),{backward:e.isBackward,fake:false});if(t==td.arrowleft||t==td.arrowup){n.setTo(n.getFirstPosition())}if(t==td.arrowright||t==td.arrowdown){n.setTo(n.getLastPosition())}const o={oldSelection:e,newSelection:n,domSelection:null};this.document.fire("selectionChange",o);this._fireSelectionChangeDoneDebounced(o)}}class Wh extends Cu{constructor(t){super(t);this.mutationObserver=t.getObserver(Ch);this.selection=this.document.selection;this.domConverter=t.domConverter;this._documents=new WeakSet;this._fireSelectionChangeDoneDebounced=qh((t=>this.document.fire("selectionChangeDone",t)),200);this._clearInfiniteLoopInterval=setInterval((()=>this._clearInfiniteLoop()),1e3);this._loopbackCounter=0}observe(t){const e=t.ownerDocument;if(this._documents.has(e)){return}this.listenTo(e,"selectionchange",((t,n)=>{this._handleSelectionChange(n,e)}));this._documents.add(e)}destroy(){super.destroy();clearInterval(this._clearInfiniteLoopInterval);this._fireSelectionChangeDoneDebounced.cancel()}_handleSelectionChange(t,e){if(!this.isEnabled){return}const n=e.defaultView.getSelection();if(this.checkShouldIgnoreEventFromTarget(n.anchorNode)){return}this.mutationObserver.flush();const o=this.domConverter.domSelectionToView(n);if(o.rangeCount==0){this.view.hasDomSelection=false;return}this.view.hasDomSelection=true;if(this.selection.isEqual(o)&&this.domConverter.isDomSelectionCorrect(n)){return}if(++this._loopbackCounter>60){return}if(this.selection.isSimilar(o)){this.view.forceRender()}else{const t={oldSelection:this.selection,newSelection:o,domSelection:n};this.document.fire("selectionChange",t);this._fireSelectionChangeDoneDebounced(t)}}_clearInfiniteLoop(){this._loopbackCounter=0}}class Gh extends _h{constructor(t){super(t);this.domEventType=["focus","blur"];this.useCapture=true;const e=this.document;e.on("focus",(()=>{e.isFocused=true;this._renderTimeoutId=setTimeout((()=>t.forceRender()),50)}));e.on("blur",((n,o)=>{const i=e.selection.editableElement;if(i===null||i===o.target){e.isFocused=false;t.forceRender()}}))}onDomEvent(t){this.fire(t.type,t)}destroy(){if(this._renderTimeoutId){clearTimeout(this._renderTimeoutId)}super.destroy()}}class Uh extends _h{constructor(t){super(t);this.domEventType=["compositionstart","compositionupdate","compositionend"];const e=this.document;e.on("compositionstart",(()=>{e.isComposing=true}));e.on("compositionend",(()=>{e.isComposing=false}))}onDomEvent(t){this.fire(t.type,t)}}class $h extends _h{constructor(t){super(t);this.domEventType=["beforeinput"]}onDomEvent(t){this.fire(t.type,t)}}class Jh{constructor(){this._replacedElements=[]}replace(t,e){this._replacedElements.push({element:t,newElement:e});t.style.display="none";if(e){t.parentNode.insertBefore(e,t.nextSibling)}}restore(){this._replacedElements.forEach((({element:t,newElement:e})=>{t.style.display="";if(e){e.remove()}}));this._replacedElements=[]}}var Yh="[object String]";function Qh(t){return typeof t=="string"||!xe(t)&&ge(t)&&G(t)==Yh}var Xh=Qh;function Zh(t,e,n={},o=[]){const i=n&&n.xmlns;const r=i?t.createElementNS(i,e):t.createElement(e);for(const t in n){r.setAttribute(t,n[t])}if(Xh(o)||!ba(o)){o=[o]}for(let e of o){if(Xh(e)){e=t.createTextNode(e)}r.appendChild(e)}return r}function tf(t){if(t instanceof HTMLTextAreaElement){return t.value}return t.innerHTML}function ef(t){return Object.prototype.toString.apply(t)=="[object Range]"}function nf(t){const e=t.ownerDocument.defaultView.getComputedStyle(t);return{top:parseInt(e.borderTopWidth,10),right:parseInt(e.borderRightWidth,10),bottom:parseInt(e.borderBottomWidth,10),left:parseInt(e.borderLeftWidth,10)}}const of=["top","right","bottom","left","width","height"];class rf{constructor(t){const e=ef(t);Object.defineProperty(this,"_source",{value:t._source||t,writable:true,enumerable:false});if(fa(t)||e){if(e){const e=rf.getDomRangeRects(t);sf(this,rf.getBoundingRect(e))}else{sf(this,t.getBoundingClientRect())}}else if(gu(t)){const{innerWidth:e,innerHeight:n}=t;sf(this,{top:0,right:e,bottom:n,left:0,width:e,height:n})}else{sf(this,t)}}clone(){return new rf(this)}moveTo(t,e){this.top=e;this.right=t+this.width;this.bottom=e+this.height;this.left=t;return this}moveBy(t,e){this.top+=e;this.right+=t;this.left+=t;this.bottom+=e;return this}getIntersection(t){const e={top:Math.max(this.top,t.top),right:Math.min(this.right,t.right),bottom:Math.min(this.bottom,t.bottom),left:Math.max(this.left,t.left)};e.width=e.right-e.left;e.height=e.bottom-e.top;if(e.width<0||e.height<0){return null}else{return new rf(e)}}getIntersectionArea(t){const e=this.getIntersection(t);if(e){return e.getArea()}else{return 0}}getArea(){return this.width*this.height}getVisible(){const t=this._source;let e=this.clone();if(!af(t)){let n=t.parentNode||t.commonAncestorContainer;while(n&&!af(n)){const t=new rf(n);const o=e.getIntersection(t);if(o){if(o.getArea()<e.getArea()){e=o}}else{return null}n=n.parentNode}}return e}isEqual(t){for(const e of of){if(this[e]!==t[e]){return false}}return true}contains(t){const e=this.getIntersection(t);return!!(e&&e.isEqual(t))}excludeScrollbarsAndBorders(){const t=this._source;let e,n,o;if(gu(t)){e=t.innerWidth-t.document.documentElement.clientWidth;n=t.innerHeight-t.document.documentElement.clientHeight;o=t.getComputedStyle(t.document.documentElement).direction}else{const i=nf(this._source);e=t.offsetWidth-t.clientWidth-i.left-i.right;n=t.offsetHeight-t.clientHeight-i.top-i.bottom;o=t.ownerDocument.defaultView.getComputedStyle(t).direction;this.left+=i.left;this.top+=i.top;this.right-=i.right;this.bottom-=i.bottom;this.width=this.right-this.left;this.height=this.bottom-this.top}this.width-=e;if(o==="ltr"){this.right-=e}else{this.left+=e}this.height-=n;this.bottom-=n;return this}static getDomRangeRects(t){const e=[];const n=Array.from(t.getClientRects());if(n.length){for(const t of n){e.push(new rf(t))}}else{let n=t.startContainer;if(Pd(n)){n=n.parentNode}const o=new rf(n.getBoundingClientRect());o.right=o.left;o.width=0;e.push(o)}return e}static getBoundingRect(t){const e={left:Number.POSITIVE_INFINITY,top:Number.POSITIVE_INFINITY,right:Number.NEGATIVE_INFINITY,bottom:Number.NEGATIVE_INFINITY};let n=0;for(const o of t){n++;e.left=Math.min(e.left,o.left);e.top=Math.min(e.top,o.top);e.right=Math.max(e.right,o.right);e.bottom=Math.max(e.bottom,o.bottom)}if(n==0){return null}e.width=e.right-e.left;e.height=e.bottom-e.top;return new rf(e)}}function sf(t,e){for(const n of of){t[n]=e[n]}}function af(t){if(!fa(t)){return false}return t===t.ownerDocument.body}const cf=100;class lf{constructor(t,e){if(!lf._observerInstance){lf._createObserver()}this._element=t;this._callback=e;lf._addElementCallback(t,e);lf._observerInstance.observe(t)}destroy(){lf._deleteElementCallback(this._element,this._callback)}static _addElementCallback(t,e){if(!lf._elementCallbacks){lf._elementCallbacks=new Map}let n=lf._elementCallbacks.get(t);if(!n){n=new Set;lf._elementCallbacks.set(t,n)}n.add(e)}static _deleteElementCallback(t,e){const n=lf._getElementCallbacks(t);if(n){n.delete(e);if(!n.size){lf._elementCallbacks.delete(t);lf._observerInstance.unobserve(t)}}if(lf._elementCallbacks&&!lf._elementCallbacks.size){lf._observerInstance=null;lf._elementCallbacks=null}}static _getElementCallbacks(t){if(!lf._elementCallbacks){return null}return lf._elementCallbacks.get(t)}static _createObserver(){let t;if(typeof ru.window.ResizeObserver==="function"){t=ru.window.ResizeObserver}else{t=df}lf._observerInstance=new t((t=>{for(const e of t){const t=lf._getElementCallbacks(e.target);if(t){for(const n of t){n(e)}}}}))}}lf._observerInstance=null;lf._elementCallbacks=null;class df{constructor(t){this._callback=t;this._elements=new Set;this._previousRects=new Map;this._periodicCheckTimeout=null}observe(t){this._elements.add(t);this._checkElementRectsAndExecuteCallback();if(this._elements.size===1){this._startPeriodicCheck()}}unobserve(t){this._elements.delete(t);this._previousRects.delete(t);if(!this._elements.size){this._stopPeriodicCheck()}}_startPeriodicCheck(){const t=()=>{this._checkElementRectsAndExecuteCallback();this._periodicCheckTimeout=setTimeout(t,cf)};this.listenTo(ru.window,"resize",(()=>{this._checkElementRectsAndExecuteCallback()}));this._periodicCheckTimeout=setTimeout(t,cf)}_stopPeriodicCheck(){clearTimeout(this._periodicCheckTimeout);this.stopListening();this._previousRects.clear()}_checkElementRectsAndExecuteCallback(){const t=[];for(const e of this._elements){if(this._hasRectChanged(e)){t.push({target:e,contentRect:this._previousRects.get(e)})}}if(t.length){this._callback(t)}}_hasRectChanged(t){if(!t.ownerDocument.body.contains(t)){return false}const e=new rf(t);const n=this._previousRects.get(t);const o=!n||!n.isEqual(e);this._previousRects.set(t,e);return o}}Hn(df,bu);function uf(t,e){if(t instanceof HTMLTextAreaElement){t.value=e}t.innerHTML=e}function hf(t){return e=>e+t}function ff(t){const e=t.next();if(e.done){return null}return e.value}class mf{constructor(){this.set("isFocused",false);this.set("focusedElement",null);this._elements=new Set;this._nextEventLoopTimeout=null}add(t){if(this._elements.has(t)){throw new u["a"]("focustracker-add-element-already-exist",this)}this.listenTo(t,"focus",(()=>this._focus(t)),{useCapture:true});this.listenTo(t,"blur",(()=>this._blur()),{useCapture:true});this._elements.add(t)}remove(t){if(t===this.focusedElement){this._blur(t)}if(this._elements.has(t)){this.stopListening(t);this._elements.delete(t)}}destroy(){this.stopListening()}_focus(t){clearTimeout(this._nextEventLoopTimeout);this.focusedElement=t;this.isFocused=true}_blur(){clearTimeout(this._nextEventLoopTimeout);this._nextEventLoopTimeout=setTimeout((()=>{this.focusedElement=null;this.isFocused=false}),0)}}Hn(mf,bu);Hn(mf,Tn);class gf{constructor(){this._listener=Object.create(bu)}listenTo(t){this._listener.listenTo(t,"keydown",((t,e)=>{this._listener.fire("_keydown:"+nd(e),e)}))}set(t,e,n={}){const o=od(t);const i=n.priority;this._listener.listenTo(this._listener,"_keydown:"+o,((t,n)=>{e(n,(()=>{n.preventDefault();n.stopPropagation();t.stop()}));t.return=true}),{priority:i})}press(t){return!!this._listener.fire("_keydown:"+nd(t),t)}destroy(){this._listener.stopListening()}}class pf extends Cu{constructor(t){super(t);this.document.on("keydown",((t,e)=>{if(this.isEnabled&&rd(e.keyCode)){const n=new Dl(this.document,"arrowKey",this.document.selection.getFirstRange());this.document.fire(n,e);if(n.stop.called){t.stop()}}}))}observe(){}}const bf={};function kf({target:t,viewportOffset:e=0}){const n=Ef(t);let o=n;let i=null;while(o){let r;if(o==n){r=Df(t)}else{r=Df(i)}Af(r,(()=>Sf(t,o)));const s=Sf(t,o);Cf(o,s,e);if(o.parent!=o){i=o.frameElement;o=o.parent;if(!i){return}}else{o=null}}}function wf(t){const e=Df(t);Af(e,(()=>new rf(t)))}Object.assign(bf,{scrollViewportToShowTarget:kf,scrollAncestorsToShowTarget:wf});function Cf(t,e,n){const o=e.clone().moveBy(0,n);const i=e.clone().moveBy(0,-n);const r=new rf(t).excludeScrollbarsAndBorders();const s=[i,o];if(!s.every((t=>r.contains(t)))){let{scrollX:s,scrollY:a}=t;if(vf(i,r)){a-=r.top-e.top+n}else if(_f(o,r)){a+=e.bottom-r.bottom+n}if(yf(e,r)){s-=r.left-e.left+n}else if(xf(e,r)){s+=e.right-r.right+n}t.scrollTo(s,a)}}function Af(t,e){const n=Ef(t);let o,i;while(t!=n.document.body){i=e();o=new rf(t).excludeScrollbarsAndBorders();if(!o.contains(i)){if(vf(i,o)){t.scrollTop-=o.top-i.top}else if(_f(i,o)){t.scrollTop+=i.bottom-o.bottom}if(yf(i,o)){t.scrollLeft-=o.left-i.left}else if(xf(i,o)){t.scrollLeft+=i.right-o.right}}t=t.parentNode}}function _f(t,e){return t.bottom>e.bottom}function vf(t,e){return t.top<e.top}function yf(t,e){return t.left<e.left}function xf(t,e){return t.right>e.right}function Ef(t){if(ef(t)){return t.startContainer.ownerDocument.defaultView}else{return t.ownerDocument.defaultView}}function Df(t){if(ef(t)){let e=t.commonAncestorContainer;if(Pd(e)){e=e.parentNode}return e}else{return t.parentNode}}function Sf(t,e){const n=Ef(t);const o=new rf(t);if(n===e){return o}else{let t=n;while(t!=e){const e=t.frameElement;const n=new rf(e).excludeScrollbarsAndBorders();o.moveBy(n.left,n.top);t=t.parent}}return o}class Bf{constructor(t){this.document=new Ol(t);this.domConverter=new du(this.document);this.domRoots=new Map;this.set("isRenderingInProgress",false);this.set("hasDomSelection",false);this._renderer=new Qd(this.domConverter,this.document.selection);this._renderer.bind("isFocused").to(this.document);this._initialDomRootAttributes=new WeakMap;this._observers=new Map;this._ongoingChange=false;this._postFixersInProgress=false;this._renderingDisabled=false;this._hasChangedSinceTheLastRendering=false;this._writer=new wd(this.document);this.addObserver(Ch);this.addObserver(Wh);this.addObserver(Gh);this.addObserver(vh);this.addObserver(jh);this.addObserver(Uh);this.addObserver(pf);if(Wl.isAndroid){this.addObserver($h)}Vd(this);hd(this);this.on("render",(()=>{this._render();this.document.fire("layoutChanged");this._hasChangedSinceTheLastRendering=false}));this.listenTo(this.document.selection,"change",(()=>{this._hasChangedSinceTheLastRendering=true}))}attachDomRoot(t,e="main"){const n=this.document.getRoot(e);n._name=t.tagName.toLowerCase();const o={};for(const{name:e,value:i}of Array.from(t.attributes)){o[e]=i;if(e==="class"){this._writer.addClass(i.split(" "),n)}else{this._writer.setAttribute(e,i,n)}}this._initialDomRootAttributes.set(t,o);const i=()=>{this._writer.setAttribute("contenteditable",!n.isReadOnly,n);if(n.isReadOnly){this._writer.addClass("ck-read-only",n)}else{this._writer.removeClass("ck-read-only",n)}};i();this.domRoots.set(e,t);this.domConverter.bindElements(t,n);this._renderer.markToSync("children",n);this._renderer.markToSync("attributes",n);this._renderer.domDocuments.add(t.ownerDocument);n.on("change:children",((t,e)=>this._renderer.markToSync("children",e)));n.on("change:attributes",((t,e)=>this._renderer.markToSync("attributes",e)));n.on("change:text",((t,e)=>this._renderer.markToSync("text",e)));n.on("change:isReadOnly",(()=>this.change(i)));n.on("change",(()=>{this._hasChangedSinceTheLastRendering=true}));for(const n of this._observers.values()){n.observe(t,e)}}detachDomRoot(t){const e=this.domRoots.get(t);Array.from(e.attributes).forEach((({name:t})=>e.removeAttribute(t)));const n=this._initialDomRootAttributes.get(e);for(const t in n){e.setAttribute(t,n[t])}this.domRoots.delete(t);this.domConverter.unbindDomElement(e)}getDomRoot(t="main"){return this.domRoots.get(t)}addObserver(t){let e=this._observers.get(t);if(e){return e}e=new t(this);this._observers.set(t,e);for(const[t,n]of this.domRoots){e.observe(n,t)}e.enable();return e}getObserver(t){return this._observers.get(t)}disableObservers(){for(const t of this._observers.values()){t.disable()}}enableObservers(){for(const t of this._observers.values()){t.enable()}}scrollToTheSelection(){const t=this.document.selection.getFirstRange();if(t){kf({target:this.domConverter.viewRangeToDom(t),viewportOffset:20})}}focus(){if(!this.document.isFocused){const t=this.document.selection.editableElement;if(t){this.domConverter.focus(t);this.forceRender()}else{}}}change(t){if(this.isRenderingInProgress||this._postFixersInProgress){throw new u["a"]("cannot-change-view-tree",this)}try{if(this._ongoingChange){return t(this._writer)}this._ongoingChange=true;const e=t(this._writer);this._ongoingChange=false;if(!this._renderingDisabled&&this._hasChangedSinceTheLastRendering){this._postFixersInProgress=true;this.document._callPostFixers(this._writer);this._postFixersInProgress=false;this.fire("render")}return e}catch(t){u["a"].rethrowUnexpectedError(t,this)}}forceRender(){this._hasChangedSinceTheLastRendering=true;this.change((()=>{}))}destroy(){for(const t of this._observers.values()){t.destroy()}this.document.destroy();this.stopListening()}createPositionAt(t,e){return Al._createAt(t,e)}createPositionAfter(t){return Al._createAfter(t)}createPositionBefore(t){return Al._createBefore(t)}createRange(t,e){return new _l(t,e)}createRangeOn(t){return _l._createOn(t)}createRangeIn(t){return _l._createIn(t)}createSelection(t,e,n){return new xl(t,e,n)}_disableRendering(t){this._renderingDisabled=t;if(t==false){this.change((()=>{}))}}_render(){this.isRenderingInProgress=true;this.disableObservers();this._renderer.render();this.enableObservers();this.isRenderingInProgress=false}}Hn(Bf,Tn);class Tf{constructor(t){this.parent=null;this._attrs=La(t)}get index(){let t;if(!this.parent){return null}if((t=this.parent.getChildIndex(this))===null){throw new u["a"]("model-node-not-found-in-parent",this)}return t}get startOffset(){let t;if(!this.parent){return null}if((t=this.parent.getChildStartOffset(this))===null){throw new u["a"]("model-node-not-found-in-parent",this)}return t}get offsetSize(){return 1}get endOffset(){if(!this.parent){return null}return this.startOffset+this.offsetSize}get nextSibling(){const t=this.index;return t!==null&&this.parent.getChild(t+1)||null}get previousSibling(){const t=this.index;return t!==null&&this.parent.getChild(t-1)||null}get root(){let t=this;while(t.parent){t=t.parent}return t}isAttached(){return this.root.is("rootElement")}getPath(){const t=[];let e=this;while(e.parent){t.unshift(e.startOffset);e=e.parent}return t}getAncestors(t={includeSelf:false,parentFirst:false}){const e=[];let n=t.includeSelf?this:this.parent;while(n){e[t.parentFirst?"push":"unshift"](n);n=n.parent}return e}getCommonAncestor(t,e={}){const n=this.getAncestors(e);const o=t.getAncestors(e);let i=0;while(n[i]==o[i]&&n[i]){i++}return i===0?null:n[i-1]}isBefore(t){if(this==t){return false}if(this.root!==t.root){return false}const e=this.getPath();const n=t.getPath();const o=Ia(e,n);switch(o){case"prefix":return true;case"extension":return false;default:return e[o]<n[o]}}isAfter(t){if(this==t){return false}if(this.root!==t.root){return false}return!this.isBefore(t)}hasAttribute(t){return this._attrs.has(t)}getAttribute(t){return this._attrs.get(t)}getAttributes(){return this._attrs.entries()}getAttributeKeys(){return this._attrs.keys()}toJSON(){const t={};if(this._attrs.size){t.attributes=Array.from(this._attrs).reduce(((t,e)=>{t[e[0]]=e[1];return t}),{})}return t}is(t){return t==="node"||t==="model:node"}_clone(){return new Tf(this._attrs)}_remove(){this.parent._removeChildren(this.index)}_setAttribute(t,e){this._attrs.set(t,e)}_setAttributesTo(t){this._attrs=La(t)}_removeAttribute(t){return this._attrs.delete(t)}_clearAttributes(){this._attrs.clear()}}class Pf extends Tf{constructor(t,e){super(e);this._data=t||""}get offsetSize(){return this.data.length}get data(){return this._data}is(t){return t==="$text"||t==="model:$text"||t==="text"||t==="model:text"||t==="node"||t==="model:node"}toJSON(){const t=super.toJSON();t.data=this.data;return t}_clone(){return new Pf(this.data,this.getAttributes())}static fromJSON(t){return new Pf(t.data,t.attributes)}}class If{constructor(t,e,n){this.textNode=t;if(e<0||e>t.offsetSize){throw new u["a"]("model-textproxy-wrong-offsetintext",this)}if(n<0||e+n>t.offsetSize){throw new u["a"]("model-textproxy-wrong-length",this)}this.data=t.data.substring(e,e+n);this.offsetInText=e}get startOffset(){return this.textNode.startOffset!==null?this.textNode.startOffset+this.offsetInText:null}get offsetSize(){return this.data.length}get endOffset(){return this.startOffset!==null?this.startOffset+this.offsetSize:null}get isPartial(){return this.offsetSize!==this.textNode.offsetSize}get parent(){return this.textNode.parent}get root(){return this.textNode.root}is(t){return t==="$textProxy"||t==="model:$textProxy"||t==="textProxy"||t==="model:textProxy"}getPath(){const t=this.textNode.getPath();if(t.length>0){t[t.length-1]+=this.offsetInText}return t}getAncestors(t={includeSelf:false,parentFirst:false}){const e=[];let n=t.includeSelf?this:this.parent;while(n){e[t.parentFirst?"push":"unshift"](n);n=n.parent}return e}hasAttribute(t){return this.textNode.hasAttribute(t)}getAttribute(t){return this.textNode.getAttribute(t)}getAttributes(){return this.textNode.getAttributes()}getAttributeKeys(){return this.textNode.getAttributeKeys()}}class Rf{constructor(t){this._nodes=[];if(t){this._insertNodes(0,t)}}[Symbol.iterator](){return this._nodes[Symbol.iterator]()}get length(){return this._nodes.length}get maxOffset(){return this._nodes.reduce(((t,e)=>t+e.offsetSize),0)}getNode(t){return this._nodes[t]||null}getNodeIndex(t){const e=this._nodes.indexOf(t);return e==-1?null:e}getNodeStartOffset(t){const e=this.getNodeIndex(t);return e===null?null:this._nodes.slice(0,e).reduce(((t,e)=>t+e.offsetSize),0)}indexToOffset(t){if(t==this._nodes.length){return this.maxOffset}const e=this._nodes[t];if(!e){throw new u["a"]("model-nodelist-index-out-of-bounds",this)}return this.getNodeStartOffset(e)}offsetToIndex(t){let e=0;for(const n of this._nodes){if(t>=e&&t<e+n.offsetSize){return this.getNodeIndex(n)}e+=n.offsetSize}if(e!=t){throw new u["a"]("model-nodelist-offset-out-of-bounds",this,{offset:t,nodeList:this})}return this.length}_insertNodes(t,e){for(const t of e){if(!(t instanceof Tf)){throw new u["a"]("model-nodelist-insertnodes-not-node",this)}}this._nodes.splice(t,0,...e)}_removeNodes(t,e=1){return this._nodes.splice(t,e)}toJSON(){return this._nodes.map((t=>t.toJSON()))}}class Ff extends Tf{constructor(t,e,n){super(e);this.name=t;this._children=new Rf;if(n){this._insertChild(0,n)}}get childCount(){return this._children.length}get maxOffset(){return this._children.maxOffset}get isEmpty(){return this.childCount===0}is(t,e=null){if(!e){return t==="element"||t==="model:element"||t==="node"||t==="model:node"}return e===this.name&&(t==="element"||t==="model:element")}getChild(t){return this._children.getNode(t)}getChildren(){return this._children[Symbol.iterator]()}getChildIndex(t){return this._children.getNodeIndex(t)}getChildStartOffset(t){return this._children.getNodeStartOffset(t)}offsetToIndex(t){return this._children.offsetToIndex(t)}getNodeByPath(t){let e=this;for(const n of t){e=e.getChild(e.offsetToIndex(n))}return e}findAncestor(t,e={includeSelf:false}){let n=e.includeSelf?this:this.parent;while(n){if(n.name===t){return n}n=n.parent}return null}toJSON(){const t=super.toJSON();t.name=this.name;if(this._children.length>0){t.children=[];for(const e of this._children){t.children.push(e.toJSON())}}return t}_clone(t=false){const e=t?Array.from(this._children).map((t=>t._clone(true))):null;return new Ff(this.name,this.getAttributes(),e)}_appendChild(t){this._insertChild(this.childCount,t)}_insertChild(t,e){const n=zf(e);for(const t of n){if(t.parent!==null){t._remove()}t.parent=this}this._children._insertNodes(t,n)}_removeChildren(t,e=1){const n=this._children._removeNodes(t,e);for(const t of n){t.parent=null}return n}static fromJSON(t){let e=null;if(t.children){e=[];for(const n of t.children){if(n.name){e.push(Ff.fromJSON(n))}else{e.push(Pf.fromJSON(n))}}}return new Ff(t.name,t.attributes,e)}}function zf(t){if(typeof t=="string"){return[new Pf(t)]}if(!ba(t)){t=[t]}return Array.from(t).map((t=>{if(typeof t=="string"){return new Pf(t)}if(t instanceof If){return new Pf(t.data,t.getAttributes())}return t}))}class Of{constructor(t={}){if(!t.boundaries&&!t.startPosition){throw new u["a"]("model-tree-walker-no-start-position",null)}const e=t.direction||"forward";if(e!="forward"&&e!="backward"){throw new u["a"]("model-tree-walker-unknown-direction",t,{direction:e})}this.direction=e;this.boundaries=t.boundaries||null;if(t.startPosition){this.position=t.startPosition.clone()}else{this.position=Mf._createAt(this.boundaries[this.direction=="backward"?"end":"start"])}this.position.stickiness="toNone";this.singleCharacters=!!t.singleCharacters;this.shallow=!!t.shallow;this.ignoreElementEnd=!!t.ignoreElementEnd;this._boundaryStartParent=this.boundaries?this.boundaries.start.parent:null;this._boundaryEndParent=this.boundaries?this.boundaries.end.parent:null;this._visitedParent=this.position.parent}[Symbol.iterator](){return this}skip(t){let e,n,o,i;do{o=this.position;i=this._visitedParent;({done:e,value:n}=this.next())}while(!e&&t(n));if(!e){this.position=o;this._visitedParent=i}}next(){if(this.direction=="forward"){return this._next()}else{return this._previous()}}_next(){const t=this.position;const e=this.position.clone();const n=this._visitedParent;if(n.parent===null&&e.offset===n.maxOffset){return{done:true}}if(n===this._boundaryEndParent&&e.offset==this.boundaries.end.offset){return{done:true}}const o=e.parent;const i=Vf(e,o);const r=i?i:Lf(e,o,i);if(r instanceof Ff){if(!this.shallow){e.path.push(0);this._visitedParent=r}else{e.offset++}this.position=e;return Nf("elementStart",r,t,e,1)}else if(r instanceof Pf){let o;if(this.singleCharacters){o=1}else{let t=r.endOffset;if(this._boundaryEndParent==n&&this.boundaries.end.offset<t){t=this.boundaries.end.offset}o=t-e.offset}const i=e.offset-r.startOffset;const s=new If(r,i,o);e.offset+=o;this.position=e;return Nf("text",s,t,e,o)}else{e.path.pop();e.offset++;this.position=e;this._visitedParent=n.parent;if(this.ignoreElementEnd){return this._next()}else{return Nf("elementEnd",n,t,e)}}}_previous(){const t=this.position;const e=this.position.clone();const n=this._visitedParent;if(n.parent===null&&e.offset===0){return{done:true}}if(n==this._boundaryStartParent&&e.offset==this.boundaries.start.offset){return{done:true}}const o=e.parent;const i=Vf(e,o);const r=i?i:Hf(e,o,i);if(r instanceof Ff){e.offset--;if(!this.shallow){e.path.push(r.maxOffset);this.position=e;this._visitedParent=r;if(this.ignoreElementEnd){return this._previous()}else{return Nf("elementEnd",r,t,e)}}else{this.position=e;return Nf("elementStart",r,t,e,1)}}else if(r instanceof Pf){let o;if(this.singleCharacters){o=1}else{let t=r.startOffset;if(this._boundaryStartParent==n&&this.boundaries.start.offset>t){t=this.boundaries.start.offset}o=e.offset-t}const i=e.offset-r.startOffset;const s=new If(r,i-o,o);e.offset-=o;this.position=e;return Nf("text",s,t,e,o)}else{e.path.pop();this.position=e;this._visitedParent=n.parent;return Nf("elementStart",n,t,e,1)}}}function Nf(t,e,n,o,i){return{done:false,value:{type:t,item:e,previousPosition:n,nextPosition:o,length:i}}}class Mf{constructor(t,e,n="toNone"){if(!t.is("element")&&!t.is("documentFragment")){throw new u["a"]("model-position-root-invalid",t)}if(!(e instanceof Array)||e.length===0){throw new u["a"]("model-position-path-incorrect-format",t,{path:e})}if(t.is("rootElement")){e=e.slice()}else{e=[...t.getPath(),...e];t=t.root}this.root=t;this.path=e;this.stickiness=n}get offset(){return this.path[this.path.length-1]}set offset(t){this.path[this.path.length-1]=t}get parent(){let t=this.root;for(let e=0;e<this.path.length-1;e++){t=t.getChild(t.offsetToIndex(this.path[e]));if(!t){throw new u["a"]("model-position-path-incorrect",this,{position:this})}}if(t.is("$text")){throw new u["a"]("model-position-path-incorrect",this,{position:this})}return t}get index(){return this.parent.offsetToIndex(this.offset)}get textNode(){return Vf(this,this.parent)}get nodeAfter(){const t=this.parent;return Lf(this,t,Vf(this,t))}get nodeBefore(){const t=this.parent;return Hf(this,t,Vf(this,t))}get isAtStart(){return this.offset===0}get isAtEnd(){return this.offset==this.parent.maxOffset}compareWith(t){if(this.root!=t.root){return"different"}const e=Ia(this.path,t.path);switch(e){case"same":return"same";case"prefix":return"before";case"extension":return"after";default:return this.path[e]<t.path[e]?"before":"after"}}getLastMatchingPosition(t,e={}){e.startPosition=this;const n=new Of(e);n.skip(t);return n.position}getParentPath(){return this.path.slice(0,-1)}getAncestors(){const t=this.parent;if(t.is("documentFragment")){return[t]}else{return t.getAncestors({includeSelf:true})}}findAncestor(t){const e=this.parent;if(e.is("element")){return e.findAncestor(t,{includeSelf:true})}return null}getCommonPath(t){if(this.root!=t.root){return[]}const e=Ia(this.path,t.path);const n=typeof e=="string"?Math.min(this.path.length,t.path.length):e;return this.path.slice(0,n)}getCommonAncestor(t){const e=this.getAncestors();const n=t.getAncestors();let o=0;while(e[o]==n[o]&&e[o]){o++}return o===0?null:e[o-1]}getShiftedBy(t){const e=this.clone();const n=e.offset+t;e.offset=n<0?0:n;return e}isAfter(t){return this.compareWith(t)=="after"}isBefore(t){return this.compareWith(t)=="before"}isEqual(t){return this.compareWith(t)=="same"}isTouching(t){let e=null;let n=null;const o=this.compareWith(t);switch(o){case"same":return true;case"before":e=Mf._createAt(this);n=Mf._createAt(t);break;case"after":e=Mf._createAt(t);n=Mf._createAt(this);break;default:return false}let i=e.parent;while(e.path.length+n.path.length){if(e.isEqual(n)){return true}if(e.path.length>n.path.length){if(e.offset!==i.maxOffset){return false}e.path=e.path.slice(0,-1);i=i.parent;e.offset++}else{if(n.offset!==0){return false}n.path=n.path.slice(0,-1)}}}is(t){return t==="position"||t==="model:position"}hasSameParentAs(t){if(this.root!==t.root){return false}const e=this.getParentPath();const n=t.getParentPath();return Ia(e,n)=="same"}getTransformedByOperation(t){let e;switch(t.type){case"insert":e=this._getTransformedByInsertOperation(t);break;case"move":case"remove":case"reinsert":e=this._getTransformedByMoveOperation(t);break;case"split":e=this._getTransformedBySplitOperation(t);break;case"merge":e=this._getTransformedByMergeOperation(t);break;default:e=Mf._createAt(this);break}return e}_getTransformedByInsertOperation(t){return this._getTransformedByInsertion(t.position,t.howMany)}_getTransformedByMoveOperation(t){return this._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany)}_getTransformedBySplitOperation(t){const e=t.movedRange;const n=e.containsPosition(this)||e.start.isEqual(this)&&this.stickiness=="toNext";if(n){return this._getCombined(t.splitPosition,t.moveTargetPosition)}else{if(t.graveyardPosition){return this._getTransformedByMove(t.graveyardPosition,t.insertionPosition,1)}else{return this._getTransformedByInsertion(t.insertionPosition,1)}}}_getTransformedByMergeOperation(t){const e=t.movedRange;const n=e.containsPosition(this)||e.start.isEqual(this);let o;if(n){o=this._getCombined(t.sourcePosition,t.targetPosition);if(t.sourcePosition.isBefore(t.targetPosition)){o=o._getTransformedByDeletion(t.deletionPosition,1)}}else if(this.isEqual(t.deletionPosition)){o=Mf._createAt(t.deletionPosition)}else{o=this._getTransformedByMove(t.deletionPosition,t.graveyardPosition,1)}return o}_getTransformedByDeletion(t,e){const n=Mf._createAt(this);if(this.root!=t.root){return n}if(Ia(t.getParentPath(),this.getParentPath())=="same"){if(t.offset<this.offset){if(t.offset+e>this.offset){return null}else{n.offset-=e}}}else if(Ia(t.getParentPath(),this.getParentPath())=="prefix"){const o=t.path.length-1;if(t.offset<=this.path[o]){if(t.offset+e>this.path[o]){return null}else{n.path[o]-=e}}}return n}_getTransformedByInsertion(t,e){const n=Mf._createAt(this);if(this.root!=t.root){return n}if(Ia(t.getParentPath(),this.getParentPath())=="same"){if(t.offset<this.offset||t.offset==this.offset&&this.stickiness!="toPrevious"){n.offset+=e}}else if(Ia(t.getParentPath(),this.getParentPath())=="prefix"){const o=t.path.length-1;if(t.offset<=this.path[o]){n.path[o]+=e}}return n}_getTransformedByMove(t,e,n){e=e._getTransformedByDeletion(t,n);if(t.isEqual(e)){return Mf._createAt(this)}const o=this._getTransformedByDeletion(t,n);const i=o===null||t.isEqual(this)&&this.stickiness=="toNext"||t.getShiftedBy(n).isEqual(this)&&this.stickiness=="toPrevious";if(i){return this._getCombined(t,e)}else{return o._getTransformedByInsertion(e,n)}}_getCombined(t,e){const n=t.path.length-1;const o=Mf._createAt(e);o.stickiness=this.stickiness;o.offset=o.offset+this.path[n]-t.offset;o.path=[...o.path,...this.path.slice(n+1)];return o}toJSON(){return{root:this.root.toJSON(),path:Array.from(this.path),stickiness:this.stickiness}}clone(){return new this.constructor(this.root,this.path,this.stickiness)}static _createAt(t,e,n="toNone"){if(t instanceof Mf){return new Mf(t.root,t.path,t.stickiness)}else{const o=t;if(e=="end"){e=o.maxOffset}else if(e=="before"){return this._createBefore(o,n)}else if(e=="after"){return this._createAfter(o,n)}else if(e!==0&&!e){throw new u["a"]("model-createpositionat-offset-required",[this,t])}if(!o.is("element")&&!o.is("documentFragment")){throw new u["a"]("model-position-parent-incorrect",[this,t])}const i=o.getPath();i.push(e);return new this(o.root,i,n)}}static _createAfter(t,e){if(!t.parent){throw new u["a"]("model-position-after-root",[this,t],{root:t})}return this._createAt(t.parent,t.endOffset,e)}static _createBefore(t,e){if(!t.parent){throw new u["a"]("model-position-before-root",t,{root:t})}return this._createAt(t.parent,t.startOffset,e)}static fromJSON(t,e){if(t.root==="$graveyard"){const n=new Mf(e.graveyard,t.path);n.stickiness=t.stickiness;return n}if(!e.getRoot(t.root)){throw new u["a"]("model-position-fromjson-no-root",e,{rootName:t.root})}return new Mf(e.getRoot(t.root),t.path,t.stickiness)}}function Vf(t,e){const n=e.getChild(e.offsetToIndex(t.offset));if(n&&n.is("$text")&&n.startOffset<t.offset){return n}return null}function Lf(t,e,n){if(n!==null){return null}return e.getChild(e.offsetToIndex(t.offset))}function Hf(t,e,n){if(n!==null){return null}return e.getChild(e.offsetToIndex(t.offset)-1)}class Kf{constructor(t,e=null){this.start=Mf._createAt(t);this.end=e?Mf._createAt(e):Mf._createAt(t);this.start.stickiness=this.isCollapsed?"toNone":"toNext";this.end.stickiness=this.isCollapsed?"toNone":"toPrevious"}*[Symbol.iterator](){yield*new Of({boundaries:this,ignoreElementEnd:true})}get isCollapsed(){return this.start.isEqual(this.end)}get isFlat(){const t=this.start.getParentPath();const e=this.end.getParentPath();return Ia(t,e)=="same"}get root(){return this.start.root}containsPosition(t){return t.isAfter(this.start)&&t.isBefore(this.end)}containsRange(t,e=false){if(t.isCollapsed){e=false}const n=this.containsPosition(t.start)||e&&this.start.isEqual(t.start);const o=this.containsPosition(t.end)||e&&this.end.isEqual(t.end);return n&&o}containsItem(t){const e=Mf._createBefore(t);return this.containsPosition(e)||this.start.isEqual(e)}is(t){return t==="range"||t==="model:range"}isEqual(t){return this.start.isEqual(t.start)&&this.end.isEqual(t.end)}isIntersecting(t){return this.start.isBefore(t.end)&&this.end.isAfter(t.start)}getDifference(t){const e=[];if(this.isIntersecting(t)){if(this.containsPosition(t.start)){e.push(new Kf(this.start,t.start))}if(this.containsPosition(t.end)){e.push(new Kf(t.end,this.end))}}else{e.push(new Kf(this.start,this.end))}return e}getIntersection(t){if(this.isIntersecting(t)){let e=this.start;let n=this.end;if(this.containsPosition(t.start)){e=t.start}if(this.containsPosition(t.end)){n=t.end}return new Kf(e,n)}return null}getJoined(t,e=false){let n=this.isIntersecting(t);if(!n){if(this.start.isBefore(t.start)){n=e?this.end.isTouching(t.start):this.end.isEqual(t.start)}else{n=e?t.end.isTouching(this.start):t.end.isEqual(this.start)}}if(!n){return null}let o=this.start;let i=this.end;if(t.start.isBefore(o)){o=t.start}if(t.end.isAfter(i)){i=t.end}return new Kf(o,i)}getMinimalFlatRanges(){const t=[];const e=this.start.getCommonPath(this.end).length;const n=Mf._createAt(this.start);let o=n.parent;while(n.path.length>e+1){const e=o.maxOffset-n.offset;if(e!==0){t.push(new Kf(n,n.getShiftedBy(e)))}n.path=n.path.slice(0,-1);n.offset++;o=o.parent}while(n.path.length<=this.end.path.length){const e=this.end.path[n.path.length-1];const o=e-n.offset;if(o!==0){t.push(new Kf(n,n.getShiftedBy(o)))}n.offset=e;n.path.push(0)}return t}getWalker(t={}){t.boundaries=this;return new Of(t)}*getItems(t={}){t.boundaries=this;t.ignoreElementEnd=true;const e=new Of(t);for(const t of e){yield t.item}}*getPositions(t={}){t.boundaries=this;const e=new Of(t);yield e.position;for(const t of e){yield t.nextPosition}}getTransformedByOperation(t){switch(t.type){case"insert":return this._getTransformedByInsertOperation(t);case"move":case"remove":case"reinsert":return this._getTransformedByMoveOperation(t);case"split":return[this._getTransformedBySplitOperation(t)];case"merge":return[this._getTransformedByMergeOperation(t)]}return[new Kf(this.start,this.end)]}getTransformedByOperations(t){const e=[new Kf(this.start,this.end)];for(const n of t){for(let t=0;t<e.length;t++){const o=e[t].getTransformedByOperation(n);e.splice(t,1,...o);t+=o.length-1}}for(let t=0;t<e.length;t++){const n=e[t];for(let o=t+1;o<e.length;o++){const t=e[o];if(n.containsRange(t)||t.containsRange(n)||n.isEqual(t)){e.splice(o,1)}}}return e}getCommonAncestor(){return this.start.getCommonAncestor(this.end)}getContainedElement(){if(this.isCollapsed){return null}const t=this.start.nodeAfter;const e=this.end.nodeBefore;if(t&&t.is("element")&&t===e){return t}return null}toJSON(){return{start:this.start.toJSON(),end:this.end.toJSON()}}clone(){return new this.constructor(this.start,this.end)}_getTransformedByInsertOperation(t,e=false){return this._getTransformedByInsertion(t.position,t.howMany,e)}_getTransformedByMoveOperation(t,e=false){const n=t.sourcePosition;const o=t.howMany;const i=t.targetPosition;return this._getTransformedByMove(n,i,o,e)}_getTransformedBySplitOperation(t){const e=this.start._getTransformedBySplitOperation(t);let n=this.end._getTransformedBySplitOperation(t);if(this.end.isEqual(t.insertionPosition)){n=this.end.getShiftedBy(1)}if(e.root!=n.root){n=this.end.getShiftedBy(-1)}return new Kf(e,n)}_getTransformedByMergeOperation(t){if(this.start.isEqual(t.targetPosition)&&this.end.isEqual(t.deletionPosition)){return new Kf(this.start)}let e=this.start._getTransformedByMergeOperation(t);let n=this.end._getTransformedByMergeOperation(t);if(e.root!=n.root){n=this.end.getShiftedBy(-1)}if(e.isAfter(n)){if(t.sourcePosition.isBefore(t.targetPosition)){e=Mf._createAt(n);e.offset=0}else{if(!t.deletionPosition.isEqual(e)){n=t.deletionPosition}e=t.targetPosition}return new Kf(e,n)}return new Kf(e,n)}_getTransformedByInsertion(t,e,n=false){if(n&&this.containsPosition(t)){return[new Kf(this.start,t),new Kf(t.getShiftedBy(e),this.end._getTransformedByInsertion(t,e))]}else{const n=new Kf(this.start,this.end);n.start=n.start._getTransformedByInsertion(t,e);n.end=n.end._getTransformedByInsertion(t,e);return[n]}}_getTransformedByMove(t,e,n,o=false){if(this.isCollapsed){const o=this.start._getTransformedByMove(t,e,n);return[new Kf(o)]}const i=Kf._createFromPositionAndShift(t,n);const r=e._getTransformedByDeletion(t,n);if(this.containsPosition(e)&&!o){if(i.containsPosition(this.start)||i.containsPosition(this.end)){const o=this.start._getTransformedByMove(t,e,n);const i=this.end._getTransformedByMove(t,e,n);return[new Kf(o,i)]}}let s;const a=this.getDifference(i);let c=null;const l=this.getIntersection(i);if(a.length==1){c=new Kf(a[0].start._getTransformedByDeletion(t,n),a[0].end._getTransformedByDeletion(t,n))}else if(a.length==2){c=new Kf(this.start,this.end._getTransformedByDeletion(t,n))}if(c){s=c._getTransformedByInsertion(r,n,l!==null||o)}else{s=[]}if(l){const t=new Kf(l.start._getCombined(i.start,r),l.end._getCombined(i.start,r));if(s.length==2){s.splice(1,0,t)}else{s.push(t)}}return s}_getTransformedByDeletion(t,e){let n=this.start._getTransformedByDeletion(t,e);let o=this.end._getTransformedByDeletion(t,e);if(n==null&&o==null){return null}if(n==null){n=t}if(o==null){o=t}return new Kf(n,o)}static _createFromPositionAndShift(t,e){const n=t;const o=t.getShiftedBy(e);return e>0?new this(n,o):new this(o,n)}static _createIn(t){return new this(Mf._createAt(t,0),Mf._createAt(t,t.maxOffset))}static _createOn(t){return this._createFromPositionAndShift(Mf._createBefore(t),t.offsetSize)}static _createFromRanges(t){if(t.length===0){throw new u["a"]("range-create-from-ranges-empty-array",null)}else if(t.length==1){return t[0].clone()}const e=t[0];t.sort(((t,e)=>t.start.isAfter(e.start)?1:-1));const n=t.indexOf(e);const o=new this(e.start,e.end);if(n>0){for(let e=n-1;true;e++){if(t[e].end.isEqual(o.start)){o.start=Mf._createAt(t[e].start)}else{break}}}for(let e=n+1;e<t.length;e++){if(t[e].start.isEqual(o.end)){o.end=Mf._createAt(t[e].end)}else{break}}return o}static fromJSON(t,e){return new this(Mf.fromJSON(t.start,e),Mf.fromJSON(t.end,e))}}class qf{constructor(){this._modelToViewMapping=new WeakMap;this._viewToModelMapping=new WeakMap;this._viewToModelLengthCallbacks=new Map;this._markerNameToElements=new Map;this._elementToMarkerNames=new Map;this._unboundMarkerNames=new Set;this.on("modelToViewPosition",((t,e)=>{if(e.viewPosition){return}const n=this._modelToViewMapping.get(e.modelPosition.parent);e.viewPosition=this.findPositionIn(n,e.modelPosition.offset)}),{priority:"low"});this.on("viewToModelPosition",((t,e)=>{if(e.modelPosition){return}const n=this.findMappedViewAncestor(e.viewPosition);const o=this._viewToModelMapping.get(n);const i=this._toModelOffset(e.viewPosition.parent,e.viewPosition.offset,n);e.modelPosition=Mf._createAt(o,i)}),{priority:"low"})}bindElements(t,e){this._modelToViewMapping.set(t,e);this._viewToModelMapping.set(e,t)}unbindViewElement(t){const e=this.toModelElement(t);this._viewToModelMapping.delete(t);if(this._elementToMarkerNames.has(t)){for(const e of this._elementToMarkerNames.get(t)){this._unboundMarkerNames.add(e)}}if(this._modelToViewMapping.get(e)==t){this._modelToViewMapping.delete(e)}}unbindModelElement(t){const e=this.toViewElement(t);this._modelToViewMapping.delete(t);if(this._viewToModelMapping.get(e)==t){this._viewToModelMapping.delete(e)}}bindElementToMarker(t,e){const n=this._markerNameToElements.get(e)||new Set;n.add(t);const o=this._elementToMarkerNames.get(t)||new Set;o.add(e);this._markerNameToElements.set(e,n);this._elementToMarkerNames.set(t,o)}unbindElementFromMarkerName(t,e){const n=this._markerNameToElements.get(e);if(n){n.delete(t);if(n.size==0){this._markerNameToElements.delete(e)}}const o=this._elementToMarkerNames.get(t);if(o){o.delete(e);if(o.size==0){this._elementToMarkerNames.delete(t)}}}flushUnboundMarkerNames(){const t=Array.from(this._unboundMarkerNames);this._unboundMarkerNames.clear();return t}clearBindings(){this._modelToViewMapping=new WeakMap;this._viewToModelMapping=new WeakMap;this._markerNameToElements=new Map;this._elementToMarkerNames=new Map;this._unboundMarkerNames=new Set}toModelElement(t){return this._viewToModelMapping.get(t)}toViewElement(t){return this._modelToViewMapping.get(t)}toModelRange(t){return new Kf(this.toModelPosition(t.start),this.toModelPosition(t.end))}toViewRange(t){return new _l(this.toViewPosition(t.start),this.toViewPosition(t.end))}toModelPosition(t){const e={viewPosition:t,mapper:this};this.fire("viewToModelPosition",e);return e.modelPosition}toViewPosition(t,e={isPhantom:false}){const n={modelPosition:t,mapper:this,isPhantom:e.isPhantom};this.fire("modelToViewPosition",n);return n.viewPosition}markerNameToElements(t){const e=this._markerNameToElements.get(t);if(!e){return null}const n=new Set;for(const t of e){if(t.is("attributeElement")){for(const e of t.getElementsWithSameId()){n.add(e)}}else{n.add(t)}}return n}registerViewToModelLength(t,e){this._viewToModelLengthCallbacks.set(t,e)}findMappedViewAncestor(t){let e=t.parent;while(!this._viewToModelMapping.has(e)){e=e.parent}return e}_toModelOffset(t,e,n){if(n!=t){const o=this._toModelOffset(t.parent,t.index,n);const i=this._toModelOffset(t,e,t);return o+i}if(t.is("$text")){return e}let o=0;for(let n=0;n<e;n++){o+=this.getModelLength(t.getChild(n))}return o}getModelLength(t){if(this._viewToModelLengthCallbacks.get(t.name)){const e=this._viewToModelLengthCallbacks.get(t.name);return e(t)}else if(this._viewToModelMapping.has(t)){return 1}else if(t.is("$text")){return t.data.length}else if(t.is("uiElement")){return 0}else{let e=0;for(const n of t.getChildren()){e+=this.getModelLength(n)}return e}}findPositionIn(t,e){let n;let o=0;let i=0;let r=0;if(t.is("$text")){return new Al(t,e)}while(i<e){n=t.getChild(r);o=this.getModelLength(n);i+=o;r++}if(i==e){return this._moveViewPositionToTextNode(new Al(t,r))}else{return this.findPositionIn(n,e-(i-o))}}_moveViewPositionToTextNode(t){const e=t.nodeBefore;const n=t.nodeAfter;if(e instanceof Na){return new Al(e,e.data.length)}else if(n instanceof Na){return new Al(n,0)}return t}}Hn(qf,g);class jf{constructor(){this._consumable=new Map;this._textProxyRegistry=new Map}add(t,e){e=Wf(e);if(t instanceof If){t=this._getSymbolForTextProxy(t)}if(!this._consumable.has(t)){this._consumable.set(t,new Map)}this._consumable.get(t).set(e,true)}consume(t,e){e=Wf(e);if(t instanceof If){t=this._getSymbolForTextProxy(t)}if(this.test(t,e)){this._consumable.get(t).set(e,false);return true}else{return false}}test(t,e){e=Wf(e);if(t instanceof If){t=this._getSymbolForTextProxy(t)}const n=this._consumable.get(t);if(n===undefined){return null}const o=n.get(e);if(o===undefined){return null}return o}revert(t,e){e=Wf(e);if(t instanceof If){t=this._getSymbolForTextProxy(t)}const n=this.test(t,e);if(n===false){this._consumable.get(t).set(e,true);return true}else if(n===true){return false}return null}_getSymbolForTextProxy(t){let e=null;const n=this._textProxyRegistry.get(t.startOffset);if(n){const o=n.get(t.endOffset);if(o){e=o.get(t.parent)}}if(!e){e=this._addSymbolForTextProxy(t.startOffset,t.endOffset,t.parent)}return e}_addSymbolForTextProxy(t,e,n){const o=Symbol("textProxySymbol");let i,r;i=this._textProxyRegistry.get(t);if(!i){i=new Map;this._textProxyRegistry.set(t,i)}r=i.get(e);if(!r){r=new Map;i.set(e,r)}r.set(n,o);return o}}function Wf(t){const e=t.split(":");return e.length>1?e[0]+":"+e[1]:e[0]}class Gf{constructor(t){this.conversionApi=Object.assign({dispatcher:this},t);this._reconversionEventsMapping=new Map}convertChanges(t,e,n){for(const e of t.getMarkersToRemove()){this.convertMarkerRemove(e.name,e.range,n)}const o=this._mapChangesWithAutomaticReconversion(t);for(const t of o){if(t.type==="insert"){this.convertInsert(Kf._createFromPositionAndShift(t.position,t.length),n)}else if(t.type==="remove"){this.convertRemove(t.position,t.length,t.name,n)}else if(t.type==="reconvert"){this.reconvertElement(t.element,n)}else{this.convertAttribute(t.range,t.attributeKey,t.attributeOldValue,t.attributeNewValue,n)}}for(const t of this.conversionApi.mapper.flushUnboundMarkerNames()){const o=e.get(t).getRange();this.convertMarkerRemove(t,o,n);this.convertMarkerAdd(t,o,n)}for(const e of t.getMarkersToAdd()){this.convertMarkerAdd(e.name,e.range,n)}}convertInsert(t,e){this.conversionApi.writer=e;this.conversionApi.consumable=this._createInsertConsumable(t);for(const e of Array.from(t).map(Jf)){this._convertInsertWithAttributes(e)}this._clearConversionApi()}convertRemove(t,e,n,o){this.conversionApi.writer=o;this.fire("remove:"+n,{position:t,length:e},this.conversionApi);this._clearConversionApi()}convertAttribute(t,e,n,o,i){this.conversionApi.writer=i;this.conversionApi.consumable=this._createConsumableForRange(t,`attribute:${e}`);for(const i of t){const t=i.item;const r=Kf._createFromPositionAndShift(i.previousPosition,i.length);const s={item:t,range:r,attributeKey:e,attributeOldValue:n,attributeNewValue:o};this._testAndFire(`attribute:${e}`,s)}this._clearConversionApi()}reconvertElement(t,e){const n=Kf._createOn(t);this.conversionApi.writer=e;this.conversionApi.consumable=this._createInsertConsumable(n);const o=this.conversionApi.mapper;const i=o.toViewElement(t);e.remove(i);this._convertInsertWithAttributes({item:t,range:n});const r=o.toViewElement(t);for(const n of Kf._createIn(t)){const{item:t}=n;const i=Yf(t,o);if(i){if(i.root!==r.root){e.move(e.createRangeOn(i),o.toViewPosition(Mf._createBefore(t)))}}else{this._convertInsertWithAttributes(Jf(n))}}o.unbindViewElement(i);this._clearConversionApi()}convertSelection(t,e,n){const o=Array.from(e.getMarkersAtPosition(t.getFirstPosition()));this.conversionApi.writer=n;this.conversionApi.consumable=this._createSelectionConsumable(t,o);this.fire("selection",{selection:t},this.conversionApi);if(!t.isCollapsed){return}for(const e of o){const n=e.getRange();if(!Uf(t.getFirstPosition(),e,this.conversionApi.mapper)){continue}const o={item:t,markerName:e.name,markerRange:n};if(this.conversionApi.consumable.test(t,"addMarker:"+e.name)){this.fire("addMarker:"+e.name,o,this.conversionApi)}}for(const e of t.getAttributeKeys()){const n={item:t,range:t.getFirstRange(),attributeKey:e,attributeOldValue:null,attributeNewValue:t.getAttribute(e)};if(this.conversionApi.consumable.test(t,"attribute:"+n.attributeKey)){this.fire("attribute:"+n.attributeKey+":$text",n,this.conversionApi)}}this._clearConversionApi()}convertMarkerAdd(t,e,n){if(!e.root.document||e.root.rootName=="$graveyard"){return}this.conversionApi.writer=n;const o="addMarker:"+t;const i=new jf;i.add(e,o);this.conversionApi.consumable=i;this.fire(o,{markerName:t,markerRange:e},this.conversionApi);if(!i.test(e,o)){return}this.conversionApi.consumable=this._createConsumableForRange(e,o);for(const n of e.getItems()){if(!this.conversionApi.consumable.test(n,o)){continue}const i={item:n,range:Kf._createOn(n),markerName:t,markerRange:e};this.fire(o,i,this.conversionApi)}this._clearConversionApi()}convertMarkerRemove(t,e,n){if(!e.root.document||e.root.rootName=="$graveyard"){return}this.conversionApi.writer=n;this.fire("removeMarker:"+t,{markerName:t,markerRange:e},this.conversionApi);this._clearConversionApi()}_mapReconversionTriggerEvent(t,e){this._reconversionEventsMapping.set(e,t)}_createInsertConsumable(t){const e=new jf;for(const n of t){const t=n.item;e.add(t,"insert");for(const n of t.getAttributeKeys()){e.add(t,"attribute:"+n)}}return e}_createConsumableForRange(t,e){const n=new jf;for(const o of t.getItems()){n.add(o,e)}return n}_createSelectionConsumable(t,e){const n=new jf;n.add(t,"selection");for(const o of e){n.add(t,"addMarker:"+o.name)}for(const e of t.getAttributeKeys()){n.add(t,"attribute:"+e)}return n}_testAndFire(t,e){if(!this.conversionApi.consumable.test(e.item,t)){return}this.fire($f(t,e),e,this.conversionApi)}_clearConversionApi(){delete this.conversionApi.writer;delete this.conversionApi.consumable}_convertInsertWithAttributes(t){this._testAndFire("insert",t);for(const e of t.item.getAttributeKeys()){t.attributeKey=e;t.attributeOldValue=null;t.attributeNewValue=t.item.getAttribute(e);this._testAndFire(`attribute:${e}`,t)}}_mapChangesWithAutomaticReconversion(t){const e=new Set;const n=[];for(const o of t.getChanges()){const t=o.position||o.range.start;const i=t.parent;const r=Vf(t,i);if(r){n.push(o);continue}const s=o.type==="attribute"?Lf(t,i,null):i;if(s.is("$text")){n.push(o);continue}let a;if(o.type==="attribute"){a=`attribute:${o.attributeKey}:${s.name}`}else{a=`${o.type}:${o.name}`}if(this._isReconvertTriggerEvent(a,s.name)){if(e.has(s)){continue}e.add(s);n.push({type:"reconvert",element:s})}else{n.push(o)}}return n}_isReconvertTriggerEvent(t,e){return this._reconversionEventsMapping.get(t)===e}}Hn(Gf,g);function Uf(t,e,n){const o=e.getRange();const i=Array.from(t.getAncestors());i.shift();i.reverse();const r=i.some((t=>{if(o.containsItem(t)){const e=n.toViewElement(t);return!!e.getCustomProperty("addHighlight")}}));return!r}function $f(t,e){const n=e.item.name||"$text";return`${t}:${n}`}function Jf(t){const e=t.item;const n=Kf._createFromPositionAndShift(t.previousPosition,t.length);return{item:e,range:n}}function Yf(t,e){if(t.is("textProxy")){const n=e.toViewPosition(Mf._createBefore(t));const o=n.parent;return o.is("$text")?o:null}return e.toViewElement(t)}class Qf{constructor(t,e,n){this._lastRangeBackward=false;this._ranges=[];this._attrs=new Map;if(t){this.setTo(t,e,n)}}get anchor(){if(this._ranges.length>0){const t=this._ranges[this._ranges.length-1];return this._lastRangeBackward?t.end:t.start}return null}get focus(){if(this._ranges.length>0){const t=this._ranges[this._ranges.length-1];return this._lastRangeBackward?t.start:t.end}return null}get isCollapsed(){const t=this._ranges.length;if(t===1){return this._ranges[0].isCollapsed}else{return false}}get rangeCount(){return this._ranges.length}get isBackward(){return!this.isCollapsed&&this._lastRangeBackward}isEqual(t){if(this.rangeCount!=t.rangeCount){return false}else if(this.rangeCount===0){return true}if(!this.anchor.isEqual(t.anchor)||!this.focus.isEqual(t.focus)){return false}for(const e of this._ranges){let n=false;for(const o of t._ranges){if(e.isEqual(o)){n=true;break}}if(!n){return false}}return true}*getRanges(){for(const t of this._ranges){yield new Kf(t.start,t.end)}}getFirstRange(){let t=null;for(const e of this._ranges){if(!t||e.start.isBefore(t.start)){t=e}}return t?new Kf(t.start,t.end):null}getLastRange(){let t=null;for(const e of this._ranges){if(!t||e.end.isAfter(t.end)){t=e}}return t?new Kf(t.start,t.end):null}getFirstPosition(){const t=this.getFirstRange();return t?t.start.clone():null}getLastPosition(){const t=this.getLastRange();return t?t.end.clone():null}setTo(t,e,n){if(t===null){this._setRanges([])}else if(t instanceof Qf){this._setRanges(t.getRanges(),t.isBackward)}else if(t&&typeof t.getRanges=="function"){this._setRanges(t.getRanges(),t.isBackward)}else if(t instanceof Kf){this._setRanges([t],!!e&&!!e.backward)}else if(t instanceof Mf){this._setRanges([new Kf(t)])}else if(t instanceof Tf){const o=!!n&&!!n.backward;let i;if(e=="in"){i=Kf._createIn(t)}else if(e=="on"){i=Kf._createOn(t)}else if(e!==undefined){i=new Kf(Mf._createAt(t,e))}else{throw new u["a"]("model-selection-setto-required-second-parameter",[this,t])}this._setRanges([i],o)}else if(ba(t)){this._setRanges(t,e&&!!e.backward)}else{throw new u["a"]("model-selection-setto-not-selectable",[this,t])}}_setRanges(t,e=false){t=Array.from(t);const n=t.some((e=>{if(!(e instanceof Kf)){throw new u["a"]("model-selection-set-ranges-not-range",[this,t])}return this._ranges.every((t=>!t.isEqual(e)))}));if(t.length===this._ranges.length&&!n){return}this._removeAllRanges();for(const e of t){this._pushRange(e)}this._lastRangeBackward=!!e;this.fire("change:range",{directChange:true})}setFocus(t,e){if(this.anchor===null){throw new u["a"]("model-selection-setfocus-no-ranges",[this,t])}const n=Mf._createAt(t,e);if(n.compareWith(this.focus)=="same"){return}const o=this.anchor;if(this._ranges.length){this._popRange()}if(n.compareWith(o)=="before"){this._pushRange(new Kf(n,o));this._lastRangeBackward=true}else{this._pushRange(new Kf(o,n));this._lastRangeBackward=false}this.fire("change:range",{directChange:true})}getAttribute(t){return this._attrs.get(t)}getAttributes(){return this._attrs.entries()}getAttributeKeys(){return this._attrs.keys()}hasAttribute(t){return this._attrs.has(t)}removeAttribute(t){if(this.hasAttribute(t)){this._attrs.delete(t);this.fire("change:attribute",{attributeKeys:[t],directChange:true})}}setAttribute(t,e){if(this.getAttribute(t)!==e){this._attrs.set(t,e);this.fire("change:attribute",{attributeKeys:[t],directChange:true})}}getSelectedElement(){if(this.rangeCount!==1){return null}return this.getFirstRange().getContainedElement()}is(t){return t==="selection"||t==="model:selection"}*getSelectedBlocks(){const t=new WeakSet;for(const e of this.getRanges()){const n=tm(e.start,t);if(n&&em(n,e)){yield n}for(const n of e.getWalker()){const o=n.item;if(n.type=="elementEnd"&&Zf(o,t,e)){yield o}}const o=tm(e.end,t);if(o&&!e.end.isTouching(Mf._createAt(o,0))&&em(o,e)){yield o}}}containsEntireContent(t=this.anchor.root){const e=Mf._createAt(t,0);const n=Mf._createAt(t,"end");return e.isTouching(this.getFirstPosition())&&n.isTouching(this.getLastPosition())}_pushRange(t){this._checkRange(t);this._ranges.push(new Kf(t.start,t.end))}_checkRange(t){for(let e=0;e<this._ranges.length;e++){if(t.isIntersecting(this._ranges[e])){throw new u["a"]("model-selection-range-intersects",[this,t],{addedRange:t,intersectingRange:this._ranges[e]})}}}_removeAllRanges(){while(this._ranges.length>0){this._popRange()}}_popRange(){this._ranges.pop()}}Hn(Qf,g);function Xf(t,e){if(e.has(t)){return false}e.add(t);return t.root.document.model.schema.isBlock(t)&&t.parent}function Zf(t,e,n){return Xf(t,e)&&em(t,n)}function tm(t,e){const n=t.parent;const o=n.root.document.model.schema;const i=t.parent.getAncestors({parentFirst:true,includeSelf:true});let r=false;const s=i.find((t=>{if(r){return false}r=o.isLimit(t);return!r&&Xf(t,e)}));i.forEach((t=>e.add(t)));return s}function em(t,e){const n=nm(t);if(!n){return true}const o=e.containsRange(Kf._createOn(n),true);return!o}function nm(t){const e=t.root.document.model.schema;let n=t.parent;while(n){if(e.isBlock(n)){return n}n=n.parent}}class om extends Kf{constructor(t,e){super(t,e);im.call(this)}detach(){this.stopListening()}is(t){return t==="liveRange"||t==="model:liveRange"||t=="range"||t==="model:range"}toRange(){return new Kf(this.start,this.end)}static fromRange(t){return new om(t.start,t.end)}}function im(){this.listenTo(this.root.document.model,"applyOperation",((t,e)=>{const n=e[0];if(!n.isDocumentOperation){return}rm.call(this,n)}),{priority:"low"})}function rm(t){const e=this.getTransformedByOperation(t);const n=Kf._createFromRanges(e);const o=!n.isEqual(this);const i=sm(this,t);let r=null;if(o){if(n.root.rootName=="$graveyard"){if(t.type=="remove"){r=t.sourcePosition}else{r=t.deletionPosition}}const e=this.toRange();this.start=n.start;this.end=n.end;this.fire("change:range",e,{deletionPosition:r})}else if(i){this.fire("change:content",this.toRange(),{deletionPosition:r})}}function sm(t,e){switch(e.type){case"insert":return t.containsPosition(e.position);case"move":case"remove":case"reinsert":case"merge":return t.containsPosition(e.sourcePosition)||t.start.isEqual(e.sourcePosition)||t.containsPosition(e.targetPosition);case"split":return t.containsPosition(e.splitPosition)||t.containsPosition(e.insertionPosition)}return false}Hn(om,g);const am="selection:";class cm{constructor(t){this._selection=new lm(t);this._selection.delegate("change:range").to(this);this._selection.delegate("change:attribute").to(this);this._selection.delegate("change:marker").to(this)}get isCollapsed(){return this._selection.isCollapsed}get anchor(){return this._selection.anchor}get focus(){return this._selection.focus}get rangeCount(){return this._selection.rangeCount}get hasOwnRange(){return this._selection.hasOwnRange}get isBackward(){return this._selection.isBackward}get isGravityOverridden(){return this._selection.isGravityOverridden}get markers(){return this._selection.markers}get _ranges(){return this._selection._ranges}getRanges(){return this._selection.getRanges()}getFirstPosition(){return this._selection.getFirstPosition()}getLastPosition(){return this._selection.getLastPosition()}getFirstRange(){return this._selection.getFirstRange()}getLastRange(){return this._selection.getLastRange()}getSelectedBlocks(){return this._selection.getSelectedBlocks()}getSelectedElement(){return this._selection.getSelectedElement()}containsEntireContent(t){return this._selection.containsEntireContent(t)}destroy(){this._selection.destroy()}getAttributeKeys(){return this._selection.getAttributeKeys()}getAttributes(){return this._selection.getAttributes()}getAttribute(t){return this._selection.getAttribute(t)}hasAttribute(t){return this._selection.hasAttribute(t)}refresh(){this._selection._updateMarkers();this._selection._updateAttributes(false)}observeMarkers(t){this._selection.observeMarkers(t)}is(t){return t==="selection"||t=="model:selection"||t=="documentSelection"||t=="model:documentSelection"}_setFocus(t,e){this._selection.setFocus(t,e)}_setTo(t,e,n){this._selection.setTo(t,e,n)}_setAttribute(t,e){this._selection.setAttribute(t,e)}_removeAttribute(t){this._selection.removeAttribute(t)}_getStoredAttributes(){return this._selection._getStoredAttributes()}_overrideGravity(){return this._selection.overrideGravity()}_restoreGravity(t){this._selection.restoreGravity(t)}static _getStoreAttributeKey(t){return am+t}static _isStoreAttributeKey(t){return t.startsWith(am)}}Hn(cm,g);class lm extends Qf{constructor(t){super();this.markers=new ka({idProperty:"name"});this._model=t.model;this._document=t;this._attributePriority=new Map;this._selectionRestorePosition=null;this._hasChangedRange=false;this._overriddenGravityRegister=new Set;this._observedMarkers=new Set;this.listenTo(this._model,"applyOperation",((t,e)=>{const n=e[0];if(!n.isDocumentOperation||n.type=="marker"||n.type=="rename"||n.type=="noop"){return}if(this._ranges.length==0&&this._selectionRestorePosition){this._fixGraveyardSelection(this._selectionRestorePosition)}this._selectionRestorePosition=null;if(this._hasChangedRange){this._hasChangedRange=false;this.fire("change:range",{directChange:false})}}),{priority:"lowest"});this.on("change:range",(()=>{for(const t of this.getRanges()){if(!this._document._validateSelectionRange(t)){throw new u["a"]("document-selection-wrong-position",this,{range:t})}}}));this.listenTo(this._model.markers,"update",((t,e,n,o)=>{this._updateMarker(e,o)}));this.listenTo(this._document,"change",((t,e)=>{um(this._model,e)}))}get isCollapsed(){const t=this._ranges.length;return t===0?this._document._getDefaultRange().isCollapsed:super.isCollapsed}get anchor(){return super.anchor||this._document._getDefaultRange().start}get focus(){return super.focus||this._document._getDefaultRange().end}get rangeCount(){return this._ranges.length?this._ranges.length:1}get hasOwnRange(){return this._ranges.length>0}get isGravityOverridden(){return!!this._overriddenGravityRegister.size}destroy(){for(let t=0;t<this._ranges.length;t++){this._ranges[t].detach()}this.stopListening()}*getRanges(){if(this._ranges.length){yield*super.getRanges()}else{yield this._document._getDefaultRange()}}getFirstRange(){return super.getFirstRange()||this._document._getDefaultRange()}getLastRange(){return super.getLastRange()||this._document._getDefaultRange()}setTo(t,e,n){super.setTo(t,e,n);this._updateAttributes(true);this._updateMarkers()}setFocus(t,e){super.setFocus(t,e);this._updateAttributes(true);this._updateMarkers()}setAttribute(t,e){if(this._setAttribute(t,e)){const e=[t];this.fire("change:attribute",{attributeKeys:e,directChange:true})}}removeAttribute(t){if(this._removeAttribute(t)){const e=[t];this.fire("change:attribute",{attributeKeys:e,directChange:true})}}overrideGravity(){const t=a();this._overriddenGravityRegister.add(t);if(this._overriddenGravityRegister.size===1){this._updateAttributes(true)}return t}restoreGravity(t){if(!this._overriddenGravityRegister.has(t)){throw new u["a"]("document-selection-gravity-wrong-restore",this,{uid:t})}this._overriddenGravityRegister.delete(t);if(!this.isGravityOverridden){this._updateAttributes(true)}}observeMarkers(t){this._observedMarkers.add(t);this._updateMarkers()}_popRange(){this._ranges.pop().detach()}_pushRange(t){const e=this._prepareRange(t);if(e){this._ranges.push(e)}}_prepareRange(t){this._checkRange(t);if(t.root==this._document.graveyard){return}const e=om.fromRange(t);e.on("change:range",((t,n,o)=>{this._hasChangedRange=true;if(e.root==this._document.graveyard){this._selectionRestorePosition=o.deletionPosition;const t=this._ranges.indexOf(e);this._ranges.splice(t,1);e.detach()}}));return e}_updateMarkers(){if(!this._observedMarkers.size){return}const t=[];let e=false;for(const e of this._model.markers){const n=e.name.split(":",1)[0];if(!this._observedMarkers.has(n)){continue}const o=e.getRange();for(const n of this.getRanges()){if(o.containsRange(n,!n.isCollapsed)){t.push(e)}}}const n=Array.from(this.markers);for(const n of t){if(!this.markers.has(n)){this.markers.add(n);e=true}}for(const n of Array.from(this.markers)){if(!t.includes(n)){this.markers.remove(n);e=true}}if(e){this.fire("change:marker",{oldMarkers:n,directChange:false})}}_updateMarker(t,e){const n=t.name.split(":",1)[0];if(!this._observedMarkers.has(n)){return}let o=false;const i=Array.from(this.markers);const r=this.markers.has(t);if(!e){if(r){this.markers.remove(t);o=true}}else{let n=false;for(const t of this.getRanges()){if(e.containsRange(t,!t.isCollapsed)){n=true;break}}if(n&&!r){this.markers.add(t);o=true}else if(!n&&r){this.markers.remove(t);o=true}}if(o){this.fire("change:marker",{oldMarkers:i,directChange:false})}}_updateAttributes(t){const e=La(this._getSurroundingAttributes());const n=La(this.getAttributes());if(t){this._attributePriority=new Map;this._attrs=new Map}else{for(const[t,e]of this._attributePriority){if(e=="low"){this._attrs.delete(t);this._attributePriority.delete(t)}}}this._setAttributesTo(e);const o=[];for(const[t,e]of this.getAttributes()){if(!n.has(t)||n.get(t)!==e){o.push(t)}}for(const[t]of n){if(!this.hasAttribute(t)){o.push(t)}}if(o.length>0){this.fire("change:attribute",{attributeKeys:o,directChange:false})}}_setAttribute(t,e,n=true){const o=n?"normal":"low";if(o=="low"&&this._attributePriority.get(t)=="normal"){return false}const i=super.getAttribute(t);if(i===e){return false}this._attrs.set(t,e);this._attributePriority.set(t,o);return true}_removeAttribute(t,e=true){const n=e?"normal":"low";if(n=="low"&&this._attributePriority.get(t)=="normal"){return false}this._attributePriority.set(t,n);if(!super.hasAttribute(t)){return false}this._attrs.delete(t);return true}_setAttributesTo(t){const e=new Set;for(const[e,n]of this.getAttributes()){if(t.get(e)===n){continue}this._removeAttribute(e,false)}for(const[n,o]of t){const t=this._setAttribute(n,o,false);if(t){e.add(n)}}return e}*_getStoredAttributes(){const t=this.getFirstPosition().parent;if(this.isCollapsed&&t.isEmpty){for(const e of t.getAttributeKeys()){if(e.startsWith(am)){const n=e.substr(am.length);yield[n,t.getAttribute(e)]}}}}_getSurroundingAttributes(){const t=this.getFirstPosition();const e=this._model.schema;let n=null;if(!this.isCollapsed){const t=this.getFirstRange();for(const o of t){if(o.item.is("element")&&e.isObject(o.item)){break}if(o.type=="text"){n=o.item.getAttributes();break}}}else{const o=t.textNode?t.textNode:t.nodeBefore;const i=t.textNode?t.textNode:t.nodeAfter;if(!this.isGravityOverridden){n=dm(o)}if(!n){n=dm(i)}if(!this.isGravityOverridden&&!n){let t=o;while(t&&!e.isInline(t)&&!n){t=t.previousSibling;n=dm(t)}}if(!n){let t=i;while(t&&!e.isInline(t)&&!n){t=t.nextSibling;n=dm(t)}}if(!n){n=this._getStoredAttributes()}}return n}_fixGraveyardSelection(t){const e=this._model.schema.getNearestSelectionRange(t);if(e){this._pushRange(e)}}}function dm(t){if(t instanceof If||t instanceof Pf){return t.getAttributes()}return null}function um(t,e){const n=t.document.differ;for(const o of n.getChanges()){if(o.type!="insert"){continue}const n=o.position.parent;const i=o.length===n.maxOffset;if(i){t.enqueueChange(e,(t=>{const e=Array.from(n.getAttributeKeys()).filter((t=>t.startsWith(am)));for(const o of e){t.removeAttribute(o,n)}}))}}}class hm{constructor(t){this._dispatchers=t}add(t){for(const e of this._dispatchers){t(e)}return this}}var fm=1,mm=4;function gm(t){return aa(t,fm|mm)}var pm=gm;class bm extends hm{elementToElement(t){return this.add(Nm(t))}attributeToElement(t){return this.add(Mm(t))}attributeToAttribute(t){return this.add(Vm(t))}markerToElement(t){return this.add(Lm(t))}markerToHighlight(t){return this.add(Km(t))}markerToData(t){return this.add(Hm(t))}}function km(){return(t,e,n)=>{if(!n.consumable.consume(e.item,"insert")){return}const o=n.writer;const i=n.mapper.toViewPosition(e.range.start);const r=o.createText(e.item.data);o.insert(i,r)}}function wm(){return(t,e,n)=>{const o=n.mapper.toViewPosition(e.position);const i=e.position.getShiftedBy(e.length);const r=n.mapper.toViewPosition(i,{isPhantom:true});const s=n.writer.createRange(o,r);const a=n.writer.remove(s.getTrimmed());for(const t of n.writer.createRangeIn(a).getItems()){n.mapper.unbindViewElement(t)}}}function Cm(t,e){const n=t.createAttributeElement("span",e.attributes);if(e.classes){n._addClass(e.classes)}if(e.priority){n._priority=e.priority}n._id=e.id;return n}function Am(){return(t,e,n)=>{const o=e.selection;if(o.isCollapsed){return}if(!n.consumable.consume(o,"selection")){return}const i=[];for(const t of o.getRanges()){const e=n.mapper.toViewRange(t);i.push(e)}n.writer.setSelection(i,{backward:o.isBackward})}}function _m(){return(t,e,n)=>{const o=e.selection;if(!o.isCollapsed){return}if(!n.consumable.consume(o,"selection")){return}const i=n.writer;const r=o.getFirstPosition();const s=n.mapper.toViewPosition(r);const a=i.breakAttributes(s);i.setSelection(a)}}function vm(){return(t,e,n)=>{const o=n.writer;const i=o.document.selection;for(const t of i.getRanges()){if(t.isCollapsed){if(t.end.parent.isAttached()){n.writer.mergeAttributes(t.start)}}}o.setSelection(null)}}function ym(t){return(e,n,o)=>{const i=t(n.attributeOldValue,o);const r=t(n.attributeNewValue,o);if(!i&&!r){return}if(!o.consumable.consume(n.item,e.name)){return}const s=o.writer;const a=s.document.selection;if(n.item instanceof Qf||n.item instanceof cm){s.wrap(a.getFirstRange(),r)}else{let t=o.mapper.toViewRange(n.range);if(n.attributeOldValue!==null&&i){t=s.unwrap(t,i)}if(n.attributeNewValue!==null&&r){s.wrap(t,r)}}}}function xm(t){return(e,n,o)=>{const i=t(n.item,o);if(!i){return}if(!o.consumable.consume(n.item,"insert")){return}const r=o.mapper.toViewPosition(n.range.start);o.mapper.bindElements(n.item,i);o.writer.insert(r,i)}}function Em(t){return(e,n,o)=>{n.isOpening=true;const i=t(n,o);n.isOpening=false;const r=t(n,o);if(!i||!r){return}const s=n.markerRange;if(s.isCollapsed&&!o.consumable.consume(s,e.name)){return}for(const t of s){if(!o.consumable.consume(t.item,e.name)){return}}const a=o.mapper;const c=o.writer;c.insert(a.toViewPosition(s.start),i);o.mapper.bindElementToMarker(i,n.markerName);if(!s.isCollapsed){c.insert(a.toViewPosition(s.end),r);o.mapper.bindElementToMarker(r,n.markerName)}e.stop()}}function Dm(){return(t,e,n)=>{const o=n.mapper.markerNameToElements(e.markerName);if(!o){return}for(const t of o){n.mapper.unbindElementFromMarkerName(t,e.markerName);n.writer.clear(n.writer.createRangeOn(t),t)}n.writer.clearClonedElementsGroup(e.markerName);t.stop()}}function Sm(t){return(e,n,o)=>{const i=t(n.markerName,o);if(!i){return}const r=n.markerRange;if(!o.consumable.consume(r,e.name)){return}Bm(r,false,o,n,i);Bm(r,true,o,n,i);e.stop()}}function Bm(t,e,n,o,i){const r=e?t.start:t.end;const s=n.schema.checkChild(r,"$text");if(s){const t=n.mapper.toViewPosition(r);Pm(t,e,n,o,i)}else{let t;let s;if(e&&r.nodeAfter||!e&&!r.nodeBefore){t=r.nodeAfter;s=true}else{t=r.nodeBefore;s=false}const a=n.mapper.toViewElement(t);Tm(a,e,s,n,o,i)}}function Tm(t,e,n,o,i,r){const s=`data-${r.group}-${e?"start":"end"}-${n?"before":"after"}`;const a=t.hasAttribute(s)?t.getAttribute(s).split(","):[];a.unshift(r.name);o.writer.setAttribute(s,a.join(","),t);o.mapper.bindElementToMarker(t,i.markerName)}function Pm(t,e,n,o,i){const r=`${i.group}-${e?"start":"end"}`;const s=i.name?{name:i.name}:null;const a=n.writer.createUIElement(r,s);n.writer.insert(t,a);n.mapper.bindElementToMarker(a,o.markerName)}function Im(t){return(e,n,o)=>{const i=t(n.markerName,o);if(!i){return}const r=o.mapper.markerNameToElements(n.markerName);if(!r){return}for(const t of r){o.mapper.unbindElementFromMarkerName(t,n.markerName);if(t.is("containerElement")){s(`data-${i.group}-start-before`,t);s(`data-${i.group}-start-after`,t);s(`data-${i.group}-end-before`,t);s(`data-${i.group}-end-after`,t)}else{o.writer.clear(o.writer.createRangeOn(t),t)}}o.writer.clearClonedElementsGroup(n.markerName);e.stop();function s(t,e){if(e.hasAttribute(t)){const n=new Set(e.getAttribute(t).split(","));n.delete(i.name);if(n.size==0){o.writer.removeAttribute(t,e)}else{o.writer.setAttribute(t,Array.from(n).join(","),e)}}}}}function Rm(t){return(e,n,o)=>{const i=t(n.attributeOldValue,o);const r=t(n.attributeNewValue,o);if(!i&&!r){return}if(!o.consumable.consume(n.item,e.name)){return}const s=o.mapper.toViewElement(n.item);const a=o.writer;if(!s){throw new u["a"]("conversion-attribute-to-attribute-on-text",[n,o])}if(n.attributeOldValue!==null&&i){if(i.key=="class"){const t=Ca(i.value);for(const e of t){a.removeClass(e,s)}}else if(i.key=="style"){const t=Object.keys(i.value);for(const e of t){a.removeStyle(e,s)}}else{a.removeAttribute(i.key,s)}}if(n.attributeNewValue!==null&&r){if(r.key=="class"){const t=Ca(r.value);for(const e of t){a.addClass(e,s)}}else if(r.key=="style"){const t=Object.keys(r.value);for(const e of t){a.setStyle(e,r.value[e],s)}}else{a.setAttribute(r.key,r.value,s)}}}}function Fm(t){return(e,n,o)=>{if(!n.item){return}if(!(n.item instanceof Qf||n.item instanceof cm)&&!n.item.is("$textProxy")){return}const i=Um(t,n,o);if(!i){return}if(!o.consumable.consume(n.item,e.name)){return}const r=o.writer;const s=Cm(r,i);const a=r.document.selection;if(n.item instanceof Qf||n.item instanceof cm){r.wrap(a.getFirstRange(),s,a)}else{const t=o.mapper.toViewRange(n.range);const e=r.wrap(t,s);for(const t of e.getItems()){if(t.is("attributeElement")&&t.isSimilar(s)){o.mapper.bindElementToMarker(t,n.markerName);break}}}}}function zm(t){return(e,n,o)=>{if(!n.item){return}if(!(n.item instanceof Ff)){return}const i=Um(t,n,o);if(!i){return}if(!o.consumable.test(n.item,e.name)){return}const r=o.mapper.toViewElement(n.item);if(r&&r.getCustomProperty("addHighlight")){o.consumable.consume(n.item,e.name);for(const t of Kf._createIn(n.item)){o.consumable.consume(t.item,e.name)}r.getCustomProperty("addHighlight")(r,i,o.writer);o.mapper.bindElementToMarker(r,n.markerName)}}}function Om(t){return(e,n,o)=>{if(n.markerRange.isCollapsed){return}const i=Um(t,n,o);if(!i){return}const r=Cm(o.writer,i);const s=o.mapper.markerNameToElements(n.markerName);if(!s){return}for(const t of s){o.mapper.unbindElementFromMarkerName(t,n.markerName);if(t.is("attributeElement")){o.writer.unwrap(o.writer.createRangeOn(t),r)}else{t.getCustomProperty("removeHighlight")(t,i.id,o.writer)}}o.writer.clearClonedElementsGroup(n.markerName);e.stop()}}function Nm(t){t=pm(t);t.view=qm(t.view,"container");return e=>{e.on("insert:"+t.model,xm(t.view),{priority:t.converterPriority||"normal"});if(t.triggerBy){if(t.triggerBy.attributes){for(const n of t.triggerBy.attributes){e._mapReconversionTriggerEvent(t.model,`attribute:${n}:${t.model}`)}}if(t.triggerBy.children){for(const n of t.triggerBy.children){e._mapReconversionTriggerEvent(t.model,`insert:${n}`);e._mapReconversionTriggerEvent(t.model,`remove:${n}`)}}}}}function Mm(t){t=pm(t);const e=t.model.key?t.model.key:t.model;let n="attribute:"+e;if(t.model.name){n+=":"+t.model.name}if(t.model.values){for(const e of t.model.values){t.view[e]=qm(t.view[e],"attribute")}}else{t.view=qm(t.view,"attribute")}const o=Wm(t);return e=>{e.on(n,ym(o),{priority:t.converterPriority||"normal"})}}function Vm(t){t=pm(t);const e=t.model.key?t.model.key:t.model;let n="attribute:"+e;if(t.model.name){n+=":"+t.model.name}if(t.model.values){for(const e of t.model.values){t.view[e]=Gm(t.view[e])}}else{t.view=Gm(t.view)}const o=Wm(t);return e=>{e.on(n,Rm(o),{priority:t.converterPriority||"normal"})}}function Lm(t){t=pm(t);t.view=qm(t.view,"ui");return e=>{e.on("addMarker:"+t.model,Em(t.view),{priority:t.converterPriority||"normal"});e.on("removeMarker:"+t.model,Dm(t.view),{priority:t.converterPriority||"normal"})}}function Hm(t){t=pm(t);const e=t.model;if(!t.view){t.view=n=>({group:e,name:n.substr(t.model.length+1)})}return n=>{n.on("addMarker:"+e,Sm(t.view),{priority:t.converterPriority||"normal"});n.on("removeMarker:"+e,Im(t.view),{priority:t.converterPriority||"normal"})}}function Km(t){return e=>{e.on("addMarker:"+t.model,Fm(t.view),{priority:t.converterPriority||"normal"});e.on("addMarker:"+t.model,zm(t.view),{priority:t.converterPriority||"normal"});e.on("removeMarker:"+t.model,Om(t.view),{priority:t.converterPriority||"normal"})}}function qm(t,e){if(typeof t=="function"){return t}return(n,o)=>jm(t,o,e)}function jm(t,e,n){if(typeof t=="string"){t={name:t}}let o;const i=e.writer;const r=Object.assign({},t.attributes);if(n=="container"){o=i.createContainerElement(t.name,r)}else if(n=="attribute"){const e={priority:t.priority||Ml.DEFAULT_PRIORITY};o=i.createAttributeElement(t.name,r,e)}else{o=i.createUIElement(t.name,r)}if(t.styles){const e=Object.keys(t.styles);for(const n of e){i.setStyle(n,t.styles[n],o)}}if(t.classes){const e=t.classes;if(typeof e=="string"){i.addClass(e,o)}else{for(const t of e){i.addClass(t,o)}}}return o}function Wm(t){if(t.model.values){return(e,n)=>{const o=t.view[e];if(o){return o(e,n)}return null}}else{return t.view}}function Gm(t){if(typeof t=="string"){return e=>({key:t,value:e})}else if(typeof t=="object"){if(t.value){return()=>t}else{return e=>({key:t.key,value:e})}}else{return t}}function Um(t,e,n){const o=typeof t=="function"?t(e,n):t;if(!o){return null}if(!o.priority){o.priority=10}if(!o.id){o.id=e.markerName}return o}function $m(t){const{schema:e,document:n}=t.model;for(const o of n.getRootNames()){const i=n.getRoot(o);if(i.isEmpty&&!e.checkChild(i,"$text")){if(e.checkChild(i,"paragraph")){t.insertElement("paragraph",i);return true}}}return false}function Jm(t,e,n){const o=n.createContext(t);if(!n.checkChild(o,"paragraph")){return false}if(!n.checkChild(o.push("paragraph"),e)){return false}return true}function Ym(t,e){const n=e.createElement("paragraph");e.insert(n,t);return e.createPositionAt(n,0)}class Qm extends hm{elementToElement(t){return this.add(eg(t))}elementToAttribute(t){return this.add(ng(t))}attributeToAttribute(t){return this.add(og(t))}elementToMarker(t){Object(u["b"])("upcast-helpers-element-to-marker-deprecated");return this.add(ig(t))}dataToMarker(t){return this.add(rg(t))}}function Xm(){return(t,e,n)=>{if(!e.modelRange&&n.consumable.consume(e.viewItem,{name:true})){const{modelRange:t,modelCursor:o}=n.convertChildren(e.viewItem,e.modelCursor);e.modelRange=t;e.modelCursor=o}}}function Zm(){return(t,e,{schema:n,consumable:o,writer:i})=>{let r=e.modelCursor;if(!o.test(e.viewItem)){return}if(!n.checkChild(r,"$text")){if(!Jm(r,"$text",n)){return}r=Ym(r,i)}o.consume(e.viewItem);const s=i.createText(e.viewItem.data);i.insert(s,r);e.modelRange=i.createRange(r,r.getShiftedBy(s.offsetSize));e.modelCursor=e.modelRange.end}}function tg(t,e){return(n,o)=>{const i=o.newSelection;const r=[];for(const t of i.getRanges()){r.push(e.toModelRange(t))}const s=t.createSelection(r,{backward:i.isBackward});if(!s.isEqual(t.document.selection)){t.change((t=>{t.setSelection(s)}))}}}function eg(t){t=pm(t);const e=cg(t);const n=ag(t.view);const o=n?"element:"+n:"element";return n=>{n.on(o,e,{priority:t.converterPriority||"normal"})}}function ng(t){t=pm(t);ug(t);const e=hg(t,false);const n=ag(t.view);const o=n?"element:"+n:"element";return n=>{n.on(o,e,{priority:t.converterPriority||"low"})}}function og(t){t=pm(t);let e=null;if(typeof t.view=="string"||t.view.key){e=dg(t)}ug(t,e);const n=hg(t,true);return e=>{e.on("element",n,{priority:t.converterPriority||"low"})}}function ig(t){t=pm(t);gg(t);return eg(t)}function rg(t){t=pm(t);if(!t.model){t.model=e=>e?t.view+":"+e:t.view}const e=cg(pg(t,"start"));const n=cg(pg(t,"end"));return o=>{o.on("element:"+t.view+"-start",e,{priority:t.converterPriority||"normal"});o.on("element:"+t.view+"-end",n,{priority:t.converterPriority||"normal"});const i=l.get("low");const r=l.get("highest");const s=l.get(t.converterPriority)/r;o.on("element",sg(t),{priority:i+s})}}function sg(t){return(e,n,o)=>{const i=`data-${t.view}`;if(!n.modelRange){n=Object.assign(n,o.convertChildren(n.viewItem,n.modelCursor))}if(o.consumable.consume(n.viewItem,{attributes:i+"-end-after"})){r(n.modelRange.end,n.viewItem.getAttribute(i+"-end-after").split(","))}if(o.consumable.consume(n.viewItem,{attributes:i+"-start-after"})){r(n.modelRange.end,n.viewItem.getAttribute(i+"-start-after").split(","))}if(o.consumable.consume(n.viewItem,{attributes:i+"-end-before"})){r(n.modelRange.start,n.viewItem.getAttribute(i+"-end-before").split(","))}if(o.consumable.consume(n.viewItem,{attributes:i+"-start-before"})){r(n.modelRange.start,n.viewItem.getAttribute(i+"-start-before").split(","))}function r(e,i){for(const r of i){const i=t.model(r,o);const s=o.writer.createElement("$marker",{"data-name":i});o.writer.insert(s,e);if(n.modelCursor.isEqual(e)){n.modelCursor=n.modelCursor.getShiftedBy(1)}else{n.modelCursor=n.modelCursor._getTransformedByInsertion(e,1)}n.modelRange=n.modelRange._getTransformedByInsertion(e,1)[0]}}}}function ag(t){if(typeof t=="string"){return t}if(typeof t=="object"&&typeof t.name=="string"){return t.name}return null}function cg(t){const e=new Ha(t.view);return(n,o,i)=>{const r=e.match(o.viewItem);if(!r){return}const s=r.match;s.name=true;if(!i.consumable.test(o.viewItem,s)){return}const a=lg(t.model,o.viewItem,i);if(!a){return}if(!i.safeInsert(a,o.modelCursor)){return}i.consumable.consume(o.viewItem,s);i.convertChildren(o.viewItem,a);i.updateConversionResult(a,o)}}function lg(t,e,n){if(t instanceof Function){return t(e,n)}else{return n.writer.createElement(t)}}function dg(t){if(typeof t.view=="string"){t.view={key:t.view}}const e=t.view.key;let n;if(e=="class"||e=="style"){const o=e=="class"?"classes":"styles";n={[o]:t.view.value}}else{const o=typeof t.view.value=="undefined"?/[\s\S]*/:t.view.value;n={attributes:{[e]:o}}}if(t.view.name){n.name=t.view.name}t.view=n;return e}function ug(t,e=null){const n=e===null?true:t=>t.getAttribute(e);const o=typeof t.model!="object"?t.model:t.model.key;const i=typeof t.model!="object"||typeof t.model.value=="undefined"?n:t.model.value;t.model={key:o,value:i}}function hg(t,e){const n=new Ha(t.view);return(o,i,r)=>{const s=n.match(i.viewItem);if(!s){return}const a=t.model.key;const c=typeof t.model.value=="function"?t.model.value(i.viewItem,r):t.model.value;if(c===null){return}if(fg(t.view,i.viewItem)){s.match.name=true}else{delete s.match.name}if(!r.consumable.test(i.viewItem,s.match)){return}if(!i.modelRange){i=Object.assign(i,r.convertChildren(i.viewItem,i.modelCursor))}const l=mg(i.modelRange,{key:a,value:c},e,r);if(l){r.consumable.consume(i.viewItem,s.match)}}}function fg(t,e){const n=typeof t=="function"?t(e):t;if(typeof n=="object"&&!ag(n)){return false}return!n.classes&&!n.attributes&&!n.styles}function mg(t,e,n,o){let i=false;for(const r of Array.from(t.getItems({shallow:n}))){if(o.schema.checkAttribute(r,e.key)){o.writer.setAttribute(e.key,e.value,r);i=true}}return i}function gg(t){const e=t.model;t.model=(t,n)=>{const o=typeof e=="string"?e:e(t,n);return n.writer.createElement("$marker",{"data-name":o})}}function pg(t,e){const n={};n.view=t.view+"-"+e;n.model=(e,n)=>{const o=e.getAttribute("name");const i=t.model(o,n);return n.writer.createElement("$marker",{"data-name":i})};return n}class bg{constructor(t,e){this.model=t;this.view=new Bf(e);this.mapper=new qf;this.downcastDispatcher=new Gf({mapper:this.mapper,schema:t.schema});const n=this.model.document;const o=n.selection;const i=this.model.markers;this.listenTo(this.model,"_beforeChanges",(()=>{this.view._disableRendering(true)}),{priority:"highest"});this.listenTo(this.model,"_afterChanges",(()=>{this.view._disableRendering(false)}),{priority:"lowest"});this.listenTo(n,"change",(()=>{this.view.change((t=>{this.downcastDispatcher.convertChanges(n.differ,i,t);this.downcastDispatcher.convertSelection(o,i,t)}))}),{priority:"low"});this.listenTo(this.view.document,"selectionChange",tg(this.model,this.mapper));this.downcastDispatcher.on("insert:$text",km(),{priority:"lowest"});this.downcastDispatcher.on("remove",wm(),{priority:"low"});this.downcastDispatcher.on("selection",vm(),{priority:"low"});this.downcastDispatcher.on("selection",Am(),{priority:"low"});this.downcastDispatcher.on("selection",_m(),{priority:"low"});this.view.document.roots.bindTo(this.model.document.roots).using((t=>{if(t.rootName=="$graveyard"){return null}const e=new wl(this.view.document,t.name);e.rootName=t.rootName;this.mapper.bindElements(t,e);return e}))}destroy(){this.view.destroy();this.stopListening()}}Hn(bg,Tn);class kg{constructor(){this._commands=new Map}add(t,e){this._commands.set(t,e)}get(t){return this._commands.get(t)}execute(t,...e){const n=this.get(t);if(!n){throw new u["a"]("commandcollection-command-not-found",this,{commandName:t})}return n.execute(...e)}*names(){yield*this._commands.keys()}*commands(){yield*this._commands.values()}[Symbol.iterator](){return this._commands[Symbol.iterator]()}destroy(){for(const t of this.commands()){t.destroy()}}}class wg{constructor(){this._consumables=new Map}add(t,e){let n;if(t.is("$text")||t.is("documentFragment")){this._consumables.set(t,true);return}if(!this._consumables.has(t)){n=new Cg(t);this._consumables.set(t,n)}else{n=this._consumables.get(t)}n.add(e)}test(t,e){const n=this._consumables.get(t);if(n===undefined){return null}if(t.is("$text")||t.is("documentFragment")){return n}return n.test(e)}consume(t,e){if(this.test(t,e)){if(t.is("$text")||t.is("documentFragment")){this._consumables.set(t,false)}else{this._consumables.get(t).consume(e)}return true}return false}revert(t,e){const n=this._consumables.get(t);if(n!==undefined){if(t.is("$text")||t.is("documentFragment")){this._consumables.set(t,true)}else{n.revert(e)}}}static consumablesFromElement(t){const e={element:t,name:true,attributes:[],classes:[],styles:[]};const n=t.getAttributeKeys();for(const t of n){if(t=="style"||t=="class"){continue}e.attributes.push(t)}const o=t.getClassNames();for(const t of o){e.classes.push(t)}const i=t.getStyleNames();for(const t of i){e.styles.push(t)}return e}static createFrom(t,e){if(!e){e=new wg(t)}if(t.is("$text")){e.add(t);return e}if(t.is("element")){e.add(t,wg.consumablesFromElement(t))}if(t.is("documentFragment")){e.add(t)}for(const n of t.getChildren()){e=wg.createFrom(n,e)}return e}}class Cg{constructor(t){this.element=t;this._canConsumeName=null;this._consumables={attributes:new Map,styles:new Map,classes:new Map}}add(t){if(t.name){this._canConsumeName=true}for(const e in this._consumables){if(e in t){this._add(e,t[e])}}}test(t){if(t.name&&!this._canConsumeName){return this._canConsumeName}for(const e in this._consumables){if(e in t){const n=this._test(e,t[e]);if(n!==true){return n}}}return true}consume(t){if(t.name){this._canConsumeName=false}for(const e in this._consumables){if(e in t){this._consume(e,t[e])}}}revert(t){if(t.name){this._canConsumeName=true}for(const e in this._consumables){if(e in t){this._revert(e,t[e])}}}_add(t,e){const n=xe(e)?e:[e];const o=this._consumables[t];for(const e of n){if(t==="attributes"&&(e==="class"||e==="style")){throw new u["a"]("viewconsumable-invalid-attribute",this)}o.set(e,true);if(t==="styles"){for(const t of this.element.document.stylesProcessor.getRelatedStyles(e)){o.set(t,true)}}}}_test(t,e){const n=xe(e)?e:[e];const o=this._consumables[t];for(const e of n){if(t==="attributes"&&(e==="class"||e==="style")){const t=e=="class"?"classes":"styles";const n=this._test(t,[...this._consumables[t].keys()]);if(n!==true){return n}}else{const t=o.get(e);if(t===undefined){return null}if(!t){return false}}}return true}_consume(t,e){const n=xe(e)?e:[e];const o=this._consumables[t];for(const e of n){if(t==="attributes"&&(e==="class"||e==="style")){const t=e=="class"?"classes":"styles";this._consume(t,[...this._consumables[t].keys()])}else{o.set(e,false);if(t=="styles"){for(const t of this.element.document.stylesProcessor.getRelatedStyles(e)){o.set(t,false)}}}}}_revert(t,e){const n=xe(e)?e:[e];const o=this._consumables[t];for(const e of n){if(t==="attributes"&&(e==="class"||e==="style")){const t=e=="class"?"classes":"styles";this._revert(t,[...this._consumables[t].keys()])}else{const t=o.get(e);if(t===false){o.set(e,true)}}}}}class Ag{constructor(){this._sourceDefinitions={};this._attributeProperties={};this.decorate("checkChild");this.decorate("checkAttribute");this.on("checkAttribute",((t,e)=>{e[0]=new _g(e[0])}),{priority:"highest"});this.on("checkChild",((t,e)=>{e[0]=new _g(e[0]);e[1]=this.getDefinition(e[1])}),{priority:"highest"})}register(t,e){if(this._sourceDefinitions[t]){throw new u["a"]("schema-cannot-register-item-twice",this,{itemName:t})}this._sourceDefinitions[t]=[Object.assign({},e)];this._clearCache()}extend(t,e){if(!this._sourceDefinitions[t]){throw new u["a"]("schema-cannot-extend-missing-item",this,{itemName:t})}this._sourceDefinitions[t].push(Object.assign({},e));this._clearCache()}getDefinitions(){if(!this._compiledDefinitions){this._compile()}return this._compiledDefinitions}getDefinition(t){let e;if(typeof t=="string"){e=t}else if(t.is&&(t.is("$text")||t.is("$textProxy"))){e="$text"}else{e=t.name}return this.getDefinitions()[e]}isRegistered(t){return!!this.getDefinition(t)}isBlock(t){const e=this.getDefinition(t);return!!(e&&e.isBlock)}isLimit(t){const e=this.getDefinition(t);if(!e){return false}return!!(e.isLimit||e.isObject)}isObject(t){const e=this.getDefinition(t);if(!e){return false}return!!(e.isObject||e.isLimit&&e.isSelectable&&e.isContent)}isInline(t){const e=this.getDefinition(t);return!!(e&&e.isInline)}isSelectable(t){const e=this.getDefinition(t);if(!e){return false}return!!(e.isSelectable||e.isObject)}isContent(t){const e=this.getDefinition(t);if(!e){return false}return!!(e.isContent||e.isObject)}checkChild(t,e){if(!e){return false}return this._checkContextMatch(e,t)}checkAttribute(t,e){const n=this.getDefinition(t.last);if(!n){return false}return n.allowAttributes.includes(e)}checkMerge(t,e=null){if(t instanceof Mf){const e=t.nodeBefore;const n=t.nodeAfter;if(!(e instanceof Ff)){throw new u["a"]("schema-check-merge-no-element-before",this)}if(!(n instanceof Ff)){throw new u["a"]("schema-check-merge-no-element-after",this)}return this.checkMerge(e,n)}for(const n of e.getChildren()){if(!this.checkChild(t,n)){return false}}return true}addChildCheck(t){this.on("checkChild",((e,[n,o])=>{if(!o){return}const i=t(n,o);if(typeof i=="boolean"){e.stop();e.return=i}}),{priority:"high"})}addAttributeCheck(t){this.on("checkAttribute",((e,[n,o])=>{const i=t(n,o);if(typeof i=="boolean"){e.stop();e.return=i}}),{priority:"high"})}setAttributeProperties(t,e){this._attributeProperties[t]=Object.assign(this.getAttributeProperties(t),e)}getAttributeProperties(t){return this._attributeProperties[t]||{}}getLimitElement(t){let e;if(t instanceof Mf){e=t.parent}else{const n=t instanceof Kf?[t]:Array.from(t.getRanges());e=n.reduce(((t,e)=>{const n=e.getCommonAncestor();if(!t){return n}return t.getCommonAncestor(n,{includeSelf:true})}),null)}while(!this.isLimit(e)){if(e.parent){e=e.parent}else{break}}return e}checkAttributeInSelection(t,e){if(t.isCollapsed){const n=t.getFirstPosition();const o=[...n.getAncestors(),new Pf("",t.getAttributes())];return this.checkAttribute(o,e)}else{const n=t.getRanges();for(const t of n){for(const n of t){if(this.checkAttribute(n.item,e)){return true}}}}return false}*getValidRanges(t,e){t=Ng(t);for(const n of t){yield*this._getValidRangesForRange(n,e)}}getNearestSelectionRange(t,e="both"){if(this.checkChild(t,"$text")){return new Kf(t)}let n,o;const i=t.getAncestors().reverse().find((t=>this.isLimit(t)))||t.root;if(e=="both"||e=="backward"){n=new Of({boundaries:Kf._createIn(i),startPosition:t,direction:"backward"})}if(e=="both"||e=="forward"){o=new Of({boundaries:Kf._createIn(i),startPosition:t})}for(const t of Og(n,o)){const e=t.walker==n?"elementEnd":"elementStart";const o=t.value;if(o.type==e&&this.isObject(o.item)){return Kf._createOn(o.item)}if(this.checkChild(o.nextPosition,"$text")){return new Kf(o.nextPosition)}}return null}findAllowedParent(t,e){let n=t.parent;while(n){if(this.checkChild(n,e)){return n}if(this.isLimit(n)){return null}n=n.parent}return null}removeDisallowedAttributes(t,e){for(const n of t){if(n.is("$text")){Mg(this,n,e)}else{const t=Kf._createIn(n);const o=t.getPositions();for(const t of o){const n=t.nodeBefore||t.parent;Mg(this,n,e)}}}}createContext(t){return new _g(t)}_clearCache(){this._compiledDefinitions=null}_compile(){const t={};const e=this._sourceDefinitions;const n=Object.keys(e);for(const o of n){t[o]=vg(e[o],o)}for(const e of n){yg(t,e)}for(const e of n){xg(t,e)}for(const e of n){Eg(t,e);Dg(t,e)}for(const e of n){Sg(t,e);Bg(t,e)}this._compiledDefinitions=t}_checkContextMatch(t,e,n=e.length-1){const o=e.getItem(n);if(t.allowIn.includes(o.name)){if(n==0){return true}else{const t=this.getDefinition(o);return this._checkContextMatch(t,e,n-1)}}else{return false}}*_getValidRangesForRange(t,e){let n=t.start;let o=t.start;for(const i of t.getItems({shallow:true})){if(i.is("element")){yield*this._getValidRangesForRange(Kf._createIn(i),e)}if(!this.checkAttribute(i,e)){if(!n.isEqual(o)){yield new Kf(n,o)}n=Mf._createAfter(i)}o=Mf._createAfter(i)}if(!n.isEqual(o)){yield new Kf(n,o)}}}Hn(Ag,Tn);class _g{constructor(t){if(t instanceof _g){return t}if(typeof t=="string"){t=[t]}else if(!Array.isArray(t)){t=t.getAncestors({includeSelf:true})}if(t[0]&&typeof t[0]!="string"&&t[0].is("documentFragment")){t.shift()}this._items=t.map(zg)}get length(){return this._items.length}get last(){return this._items[this._items.length-1]}[Symbol.iterator](){return this._items[Symbol.iterator]()}push(t){const e=new _g([t]);e._items=[...this._items,...e._items];return e}getItem(t){return this._items[t]}*getNames(){yield*this._items.map((t=>t.name))}endsWith(t){return Array.from(this.getNames()).join(" ").endsWith(t)}startsWith(t){return Array.from(this.getNames()).join(" ").startsWith(t)}}function vg(t,e){const n={name:e,allowIn:[],allowContentOf:[],allowWhere:[],allowAttributes:[],allowAttributesOf:[],inheritTypesFrom:[]};Tg(t,n);Pg(t,n,"allowIn");Pg(t,n,"allowContentOf");Pg(t,n,"allowWhere");Pg(t,n,"allowAttributes");Pg(t,n,"allowAttributesOf");Pg(t,n,"inheritTypesFrom");Ig(t,n);return n}function yg(t,e){for(const n of t[e].allowContentOf){if(t[n]){const o=Rg(t,n);o.forEach((t=>{t.allowIn.push(e)}))}}delete t[e].allowContentOf}function xg(t,e){for(const n of t[e].allowWhere){const o=t[n];if(o){const n=o.allowIn;t[e].allowIn.push(...n)}}delete t[e].allowWhere}function Eg(t,e){for(const n of t[e].allowAttributesOf){const o=t[n];if(o){const n=o.allowAttributes;t[e].allowAttributes.push(...n)}}delete t[e].allowAttributesOf}function Dg(t,e){const n=t[e];for(const e of n.inheritTypesFrom){const o=t[e];if(o){const t=Object.keys(o).filter((t=>t.startsWith("is")));for(const e of t){if(!(e in n)){n[e]=o[e]}}}}delete n.inheritTypesFrom}function Sg(t,e){const n=t[e];const o=n.allowIn.filter((e=>t[e]));n.allowIn=Array.from(new Set(o))}function Bg(t,e){const n=t[e];n.allowAttributes=Array.from(new Set(n.allowAttributes))}function Tg(t,e){for(const n of t){const t=Object.keys(n).filter((t=>t.startsWith("is")));for(const o of t){e[o]=n[o]}}}function Pg(t,e,n){for(const o of t){if(typeof o[n]=="string"){e[n].push(o[n])}else if(Array.isArray(o[n])){e[n].push(...o[n])}}}function Ig(t,e){for(const n of t){const t=n.inheritAllFrom;if(t){e.allowContentOf.push(t);e.allowWhere.push(t);e.allowAttributesOf.push(t);e.inheritTypesFrom.push(t)}}}function Rg(t,e){const n=t[e];return Fg(t).filter((t=>t.allowIn.includes(n.name)))}function Fg(t){return Object.keys(t).map((e=>t[e]))}function zg(t){if(typeof t=="string"){return{name:t,*getAttributeKeys(){},getAttribute(){}}}else{return{name:t.is("element")?t.name:"$text",*getAttributeKeys(){yield*t.getAttributeKeys()},getAttribute(e){return t.getAttribute(e)}}}}function*Og(t,e){let n=false;while(!n){n=true;if(t){const e=t.next();if(!e.done){n=false;yield{walker:t,value:e.value}}}if(e){const t=e.next();if(!t.done){n=false;yield{walker:e,value:t.value}}}}}function*Ng(t){for(const e of t){yield*e.getMinimalFlatRanges()}}function Mg(t,e,n){for(const o of e.getAttributeKeys()){if(!t.checkAttribute(e,o)){n.removeAttribute(o,e)}}}class Vg{constructor(t={}){this._splitParts=new Map;this._cursorParents=new Map;this._modelCursor=null;this.conversionApi=Object.assign({},t);this.conversionApi.convertItem=this._convertItem.bind(this);this.conversionApi.convertChildren=this._convertChildren.bind(this);this.conversionApi.safeInsert=this._safeInsert.bind(this);this.conversionApi.updateConversionResult=this._updateConversionResult.bind(this);this.conversionApi.splitToAllowedParent=this._splitToAllowedParent.bind(this);this.conversionApi.getSplitParts=this._getSplitParts.bind(this)}convert(t,e,n=["$root"]){this.fire("viewCleanup",t);this._modelCursor=Hg(n,e);this.conversionApi.writer=e;this.conversionApi.consumable=wg.createFrom(t);this.conversionApi.store={};const{modelRange:o}=this._convertItem(t,this._modelCursor);const i=e.createDocumentFragment();if(o){this._removeEmptyElements();for(const t of Array.from(this._modelCursor.parent.getChildren())){e.append(t,i)}i.markers=Lg(i,e)}this._modelCursor=null;this._splitParts.clear();this._cursorParents.clear();this.conversionApi.writer=null;this.conversionApi.store=null;return i}_convertItem(t,e){const n=Object.assign({viewItem:t,modelCursor:e,modelRange:null});if(t.is("element")){this.fire("element:"+t.name,n,this.conversionApi)}else if(t.is("$text")){this.fire("text",n,this.conversionApi)}else{this.fire("documentFragment",n,this.conversionApi)}if(n.modelRange&&!(n.modelRange instanceof Kf)){throw new u["a"]("view-conversion-dispatcher-incorrect-result",this)}return{modelRange:n.modelRange,modelCursor:n.modelCursor}}_convertChildren(t,e){let n=e.is("position")?e:Mf._createAt(e,0);const o=new Kf(n);for(const e of Array.from(t.getChildren())){const t=this._convertItem(e,n);if(t.modelRange instanceof Kf){o.end=t.modelRange.end;n=t.modelCursor}}return{modelRange:o,modelCursor:n}}_safeInsert(t,e){const n=this._splitToAllowedParent(t,e);if(!n){return false}this.conversionApi.writer.insert(t,n.position);return true}_updateConversionResult(t,e){const n=this._getSplitParts(t);const o=this.conversionApi.writer;if(!e.modelRange){e.modelRange=o.createRange(o.createPositionBefore(t),o.createPositionAfter(n[n.length-1]))}const i=this._cursorParents.get(t);if(i){e.modelCursor=o.createPositionAt(i,0)}else{e.modelCursor=e.modelRange.end}}_splitToAllowedParent(t,e){const{schema:n,writer:o}=this.conversionApi;let i=n.findAllowedParent(e,t);if(i){if(i===e.parent){return{position:e}}if(this._modelCursor.parent.getAncestors().includes(i)){i=null}}if(!i){if(!Jm(e,t,n)){return null}return{position:Ym(e,o)}}const r=this.conversionApi.writer.split(e,i);const s=[];for(const t of r.range.getWalker()){if(t.type=="elementEnd"){s.push(t.item)}else{const e=s.pop();const n=t.item;this._registerSplitPair(e,n)}}const a=r.range.end.parent;this._cursorParents.set(t,a);return{position:r.position,cursorParent:a}}_registerSplitPair(t,e){if(!this._splitParts.has(t)){this._splitParts.set(t,[t])}const n=this._splitParts.get(t);this._splitParts.set(e,n);n.push(e)}_getSplitParts(t){let e;if(!this._splitParts.has(t)){e=[t]}else{e=this._splitParts.get(t)}return e}_removeEmptyElements(){let t=false;for(const e of this._splitParts.keys()){if(e.isEmpty){this.conversionApi.writer.remove(e);this._splitParts.delete(e);t=true}}if(t){this._removeEmptyElements()}}}Hn(Vg,g);function Lg(t,e){const n=new Set;const o=new Map;const i=Kf._createIn(t).getItems();for(const t of i){if(t.name=="$marker"){n.add(t)}}for(const t of n){const n=t.getAttribute("data-name");const i=e.createPositionBefore(t);if(!o.has(n)){o.set(n,new Kf(i.clone()))}else{o.get(n).end=i.clone()}e.remove(t)}return o}function Hg(t,e){let n;for(const o of new _g(t)){const t={};for(const e of o.getAttributeKeys()){t[e]=o.getAttribute(e)}const i=e.createElement(o.name,t);if(n){e.append(i,n)}n=Mf._createAt(i,0)}return n}class Kg{getHtml(t){const e=document.implementation.createHTMLDocument("");const n=e.createElement("div");n.appendChild(t);return n.innerHTML}}class qg{constructor(t){this._domParser=new DOMParser;this._domConverter=new du(t,{blockFillerMode:"nbsp"});this._htmlWriter=new Kg}toData(t){const e=this._domConverter.viewToDom(t,document);return this._htmlWriter.getHtml(e)}toView(t){const e=this._toDom(t);return this._domConverter.domToView(e)}registerRawContentMatcher(t){this._domConverter.registerRawContentMatcher(t)}_toDom(t){const e=this._domParser.parseFromString(t,"text/html");const n=e.createDocumentFragment();const o=e.body.childNodes;while(o.length>0){n.appendChild(o[0])}return n}}class jg{constructor(t,e){this.model=t;this.mapper=new qf;this.downcastDispatcher=new Gf({mapper:this.mapper,schema:t.schema});this.downcastDispatcher.on("insert:$text",km(),{priority:"lowest"});this.upcastDispatcher=new Vg({schema:t.schema});this.viewDocument=new Ol(e);this.stylesProcessor=e;this.htmlProcessor=new qg(this.viewDocument);this.processor=this.htmlProcessor;this._viewWriter=new wd(this.viewDocument);this.upcastDispatcher.on("text",Zm(),{priority:"lowest"});this.upcastDispatcher.on("element",Xm(),{priority:"lowest"});this.upcastDispatcher.on("documentFragment",Xm(),{priority:"lowest"});this.decorate("init");this.decorate("set");this.on("init",(()=>{this.fire("ready")}),{priority:"lowest"});this.on("ready",(()=>{this.model.enqueueChange("transparent",$m)}),{priority:"lowest"})}get(t={}){const{rootName:e="main",trim:n="empty"}=t;if(!this._checkIfRootsExists([e])){throw new u["a"]("datacontroller-get-non-existent-root",this)}const o=this.model.document.getRoot(e);if(n==="empty"&&!this.model.hasContent(o,{ignoreWhitespaces:true})){return""}return this.stringify(o,t)}stringify(t,e={}){const n=this.toView(t,e);return this.processor.toData(n)}toView(t,e={}){const n=this.viewDocument;const o=this._viewWriter;this.mapper.clearBindings();const i=Kf._createIn(t);const r=new bd(n);this.mapper.bindElements(t,r);this.downcastDispatcher.conversionApi.options=e;this.downcastDispatcher.convertInsert(i,o);if(!t.is("documentFragment")){const e=Wg(t);for(const[t,n]of e){this.downcastDispatcher.convertMarkerAdd(t,n,o)}}delete this.downcastDispatcher.conversionApi.options;return r}init(t){if(this.model.document.version){throw new u["a"]("datacontroller-init-document-not-empty",this)}let e={};if(typeof t==="string"){e.main=t}else{e=t}if(!this._checkIfRootsExists(Object.keys(e))){throw new u["a"]("datacontroller-init-non-existent-root",this)}this.model.enqueueChange("transparent",(t=>{for(const n of Object.keys(e)){const o=this.model.document.getRoot(n);t.insert(this.parse(e[n],o),o,0)}}));return Promise.resolve()}set(t){let e={};if(typeof t==="string"){e.main=t}else{e=t}if(!this._checkIfRootsExists(Object.keys(e))){throw new u["a"]("datacontroller-set-non-existent-root",this)}this.model.enqueueChange("transparent",(t=>{t.setSelection(null);t.removeSelectionAttribute(this.model.document.selection.getAttributeKeys());for(const n of Object.keys(e)){const o=this.model.document.getRoot(n);t.remove(t.createRangeIn(o));t.insert(this.parse(e[n],o),o,0)}}))}parse(t,e="$root"){const n=this.processor.toView(t);return this.toModel(n,e)}toModel(t,e="$root"){return this.model.change((n=>this.upcastDispatcher.convert(t,n,e)))}addStyleProcessorRules(t){t(this.stylesProcessor)}registerRawContentMatcher(t){if(this.processor&&this.processor!==this.htmlProcessor){this.processor.registerRawContentMatcher(t)}this.htmlProcessor.registerRawContentMatcher(t)}destroy(){this.stopListening()}_checkIfRootsExists(t){for(const e of t){if(!this.model.document.getRootNames().includes(e)){return false}}return true}}Hn(jg,Tn);function Wg(t){const e=[];const n=t.root.document;if(!n){return[]}const o=Kf._createIn(t);for(const t of n.model.markers){const n=o.getIntersection(t.getRange());if(n){e.push([t.name,n])}}return e}class Gg{constructor(t,e){this._helpers=new Map;this._downcast=Ca(t);this._createConversionHelpers({name:"downcast",dispatchers:this._downcast,isDowncast:true});this._upcast=Ca(e);this._createConversionHelpers({name:"upcast",dispatchers:this._upcast,isDowncast:false})}addAlias(t,e){const n=this._downcast.includes(e);const o=this._upcast.includes(e);if(!o&&!n){throw new u["a"]("conversion-add-alias-dispatcher-not-registered",this)}this._createConversionHelpers({name:t,dispatchers:[e],isDowncast:n})}for(t){if(!this._helpers.has(t)){throw new u["a"]("conversion-for-unknown-group",this)}return this._helpers.get(t)}elementToElement(t){this.for("downcast").elementToElement(t);for(const{model:e,view:n}of Ug(t)){this.for("upcast").elementToElement({model:e,view:n,converterPriority:t.converterPriority})}}attributeToElement(t){this.for("downcast").attributeToElement(t);for(const{model:e,view:n}of Ug(t)){this.for("upcast").elementToAttribute({view:n,model:e,converterPriority:t.converterPriority})}}attributeToAttribute(t){this.for("downcast").attributeToAttribute(t);for(const{model:e,view:n}of Ug(t)){this.for("upcast").attributeToAttribute({view:n,model:e})}}_createConversionHelpers({name:t,dispatchers:e,isDowncast:n}){if(this._helpers.has(t)){throw new u["a"]("conversion-group-exists",this)}const o=n?new bm(e):new Qm(e);this._helpers.set(t,o)}}function*Ug(t){if(t.model.values){for(const e of t.model.values){const n={key:t.model.key,value:e};const o=t.view[e];const i=t.upcastAlso?t.upcastAlso[e]:undefined;yield*$g(n,o,i)}}else{yield*$g(t.model,t.view,t.upcastAlso)}}function*$g(t,e,n){yield{model:t,view:e};if(n){for(const e of Ca(n)){yield{model:t,view:e}}}}class Jg{constructor(t="default"){this.operations=[];this.type=t}get baseVersion(){for(const t of this.operations){if(t.baseVersion!==null){return t.baseVersion}}return null}addOperation(t){t.batch=this;this.operations.push(t);return t}}class Yg{constructor(t){this.baseVersion=t;this.isDocumentOperation=this.baseVersion!==null;this.batch=null}_validate(){}toJSON(){const t=Object.assign({},this);t.__className=this.constructor.className;delete t.batch;delete t.isDocumentOperation;return t}static get className(){return"Operation"}static fromJSON(t){return new this(t.baseVersion)}}class Qg{constructor(t){this.markers=new Map;this._children=new Rf;if(t){this._insertChild(0,t)}}[Symbol.iterator](){return this.getChildren()}get childCount(){return this._children.length}get maxOffset(){return this._children.maxOffset}get isEmpty(){return this.childCount===0}get root(){return this}get parent(){return null}is(t){return t==="documentFragment"||t==="model:documentFragment"}getChild(t){return this._children.getNode(t)}getChildren(){return this._children[Symbol.iterator]()}getChildIndex(t){return this._children.getNodeIndex(t)}getChildStartOffset(t){return this._children.getNodeStartOffset(t)}getPath(){return[]}getNodeByPath(t){let e=this;for(const n of t){e=e.getChild(e.offsetToIndex(n))}return e}offsetToIndex(t){return this._children.offsetToIndex(t)}toJSON(){const t=[];for(const e of this._children){t.push(e.toJSON())}return t}static fromJSON(t){const e=[];for(const n of t){if(n.name){e.push(Ff.fromJSON(n))}else{e.push(Pf.fromJSON(n))}}return new Qg(e)}_appendChild(t){this._insertChild(this.childCount,t)}_insertChild(t,e){const n=Xg(e);for(const t of n){if(t.parent!==null){t._remove()}t.parent=this}this._children._insertNodes(t,n)}_removeChildren(t,e=1){const n=this._children._removeNodes(t,e);for(const t of n){t.parent=null}return n}}function Xg(t){if(typeof t=="string"){return[new Pf(t)]}if(!ba(t)){t=[t]}return Array.from(t).map((t=>{if(typeof t=="string"){return new Pf(t)}if(t instanceof If){return new Pf(t.data,t.getAttributes())}return t}))}function Zg(t,e){e=op(e);const n=e.reduce(((t,e)=>t+e.offsetSize),0);const o=t.parent;rp(t);const i=t.index;o._insertChild(i,e);ip(o,i+e.length);ip(o,i);return new Kf(t,t.getShiftedBy(n))}function tp(t){if(!t.isFlat){throw new u["a"]("operation-utils-remove-range-not-flat",this)}const e=t.start.parent;rp(t.start);rp(t.end);const n=e._removeChildren(t.start.index,t.end.index-t.start.index);ip(e,t.start.index);return n}function ep(t,e){if(!t.isFlat){throw new u["a"]("operation-utils-move-range-not-flat",this)}const n=tp(t);e=e._getTransformedByDeletion(t.start,t.end.offset-t.start.offset);return Zg(e,n)}function np(t,e,n){rp(t.start);rp(t.end);for(const o of t.getItems({shallow:true})){const t=o.is("$textProxy")?o.textNode:o;if(n!==null){t._setAttribute(e,n)}else{t._removeAttribute(e)}ip(t.parent,t.index)}ip(t.end.parent,t.end.index)}function op(t){const e=[];if(!(t instanceof Array)){t=[t]}for(let n=0;n<t.length;n++){if(typeof t[n]=="string"){e.push(new Pf(t[n]))}else if(t[n]instanceof If){e.push(new Pf(t[n].data,t[n].getAttributes()))}else if(t[n]instanceof Qg||t[n]instanceof Rf){for(const o of t[n]){e.push(o)}}else if(t[n]instanceof Tf){e.push(t[n])}}for(let t=1;t<e.length;t++){const n=e[t];const o=e[t-1];if(n instanceof Pf&&o instanceof Pf&&sp(n,o)){e.splice(t-1,2,new Pf(o.data+n.data,o.getAttributes()));t--}}return e}function ip(t,e){const n=t.getChild(e-1);const o=t.getChild(e);if(n&&o&&n.is("$text")&&o.is("$text")&&sp(n,o)){const i=new Pf(n.data+o.data,n.getAttributes());t._removeChildren(e-1,2);t._insertChild(e-1,i)}}function rp(t){const e=t.textNode;const n=t.parent;if(e){const o=t.offset-e.startOffset;const i=e.index;n._removeChildren(i,1);const r=new Pf(e.data.substr(0,o),e.getAttributes());const s=new Pf(e.data.substr(o),e.getAttributes());n._insertChild(i,[r,s])}}function sp(t,e){const n=t.getAttributes();const o=e.getAttributes();for(const t of n){if(t[1]!==e.getAttribute(t[0])){return false}o.next()}return o.next().done}function ap(t,e){return bh(t,e)}var cp=ap;class lp extends Yg{constructor(t,e,n,o,i){super(i);this.range=t.clone();this.key=e;this.oldValue=n===undefined?null:n;this.newValue=o===undefined?null:o}get type(){if(this.oldValue===null){return"addAttribute"}else if(this.newValue===null){return"removeAttribute"}else{return"changeAttribute"}}clone(){return new lp(this.range,this.key,this.oldValue,this.newValue,this.baseVersion)}getReversed(){return new lp(this.range,this.key,this.newValue,this.oldValue,this.baseVersion+1)}toJSON(){const t=super.toJSON();t.range=this.range.toJSON();return t}_validate(){if(!this.range.isFlat){throw new u["a"]("attribute-operation-range-not-flat",this)}for(const t of this.range.getItems({shallow:true})){if(this.oldValue!==null&&!cp(t.getAttribute(this.key),this.oldValue)){throw new u["a"]("attribute-operation-wrong-old-value",this,{item:t,key:this.key,value:this.oldValue})}if(this.oldValue===null&&this.newValue!==null&&t.hasAttribute(this.key)){throw new u["a"]("attribute-operation-attribute-exists",this,{node:t,key:this.key})}}}_execute(){if(!cp(this.oldValue,this.newValue)){np(this.range,this.key,this.newValue)}}static get className(){return"AttributeOperation"}static fromJSON(t,e){return new lp(Kf.fromJSON(t.range,e),t.key,t.oldValue,t.newValue,t.baseVersion)}}class dp extends Yg{constructor(t,e){super(null);this.sourcePosition=t.clone();this.howMany=e}get type(){return"detach"}toJSON(){const t=super.toJSON();t.sourcePosition=this.sourcePosition.toJSON();return t}_validate(){if(this.sourcePosition.root.document){throw new u["a"]("detach-operation-on-document-node",this)}}_execute(){tp(Kf._createFromPositionAndShift(this.sourcePosition,this.howMany))}static get className(){return"DetachOperation"}}class up extends Yg{constructor(t,e,n,o){super(o);this.sourcePosition=t.clone();this.sourcePosition.stickiness="toNext";this.howMany=e;this.targetPosition=n.clone();this.targetPosition.stickiness="toNone"}get type(){if(this.targetPosition.root.rootName=="$graveyard"){return"remove"}else if(this.sourcePosition.root.rootName=="$graveyard"){return"reinsert"}return"move"}clone(){return new this.constructor(this.sourcePosition,this.howMany,this.targetPosition,this.baseVersion)}getMovedRangeStart(){return this.targetPosition._getTransformedByDeletion(this.sourcePosition,this.howMany)}getReversed(){const t=this.sourcePosition._getTransformedByInsertion(this.targetPosition,this.howMany);return new this.constructor(this.getMovedRangeStart(),this.howMany,t,this.baseVersion+1)}_validate(){const t=this.sourcePosition.parent;const e=this.targetPosition.parent;const n=this.sourcePosition.offset;const o=this.targetPosition.offset;if(n+this.howMany>t.maxOffset){throw new u["a"]("move-operation-nodes-do-not-exist",this)}else if(t===e&&n<o&&o<n+this.howMany){throw new u["a"]("move-operation-range-into-itself",this)}else if(this.sourcePosition.root==this.targetPosition.root){if(Ia(this.sourcePosition.getParentPath(),this.targetPosition.getParentPath())=="prefix"){const t=this.sourcePosition.path.length-1;if(this.targetPosition.path[t]>=n&&this.targetPosition.path[t]<n+this.howMany){throw new u["a"]("move-operation-node-into-itself",this)}}}}_execute(){ep(Kf._createFromPositionAndShift(this.sourcePosition,this.howMany),this.targetPosition)}toJSON(){const t=super.toJSON();t.sourcePosition=this.sourcePosition.toJSON();t.targetPosition=this.targetPosition.toJSON();return t}static get className(){return"MoveOperation"}static fromJSON(t,e){const n=Mf.fromJSON(t.sourcePosition,e);const o=Mf.fromJSON(t.targetPosition,e);return new this(n,t.howMany,o,t.baseVersion)}}class hp extends Yg{constructor(t,e,n){super(n);this.position=t.clone();this.position.stickiness="toNone";this.nodes=new Rf(op(e));this.shouldReceiveAttributes=false}get type(){return"insert"}get howMany(){return this.nodes.maxOffset}clone(){const t=new Rf([...this.nodes].map((t=>t._clone(true))));const e=new hp(this.position,t,this.baseVersion);e.shouldReceiveAttributes=this.shouldReceiveAttributes;return e}getReversed(){const t=this.position.root.document.graveyard;const e=new Mf(t,[0]);return new up(this.position,this.nodes.maxOffset,e,this.baseVersion+1)}_validate(){const t=this.position.parent;if(!t||t.maxOffset<this.position.offset){throw new u["a"]("insert-operation-position-invalid",this)}}_execute(){const t=this.nodes;this.nodes=new Rf([...t].map((t=>t._clone(true))));Zg(this.position,t)}toJSON(){const t=super.toJSON();t.position=this.position.toJSON();t.nodes=this.nodes.toJSON();return t}static get className(){return"InsertOperation"}static fromJSON(t,e){const n=[];for(const e of t.nodes){if(e.name){n.push(Ff.fromJSON(e))}else{n.push(Pf.fromJSON(e))}}const o=new hp(Mf.fromJSON(t.position,e),n,t.baseVersion);o.shouldReceiveAttributes=t.shouldReceiveAttributes;return o}}class fp extends Yg{constructor(t,e,n,o,i,r){super(r);this.name=t;this.oldRange=e?e.clone():null;this.newRange=n?n.clone():null;this.affectsData=i;this._markers=o}get type(){return"marker"}clone(){return new fp(this.name,this.oldRange,this.newRange,this._markers,this.affectsData,this.baseVersion)}getReversed(){return new fp(this.name,this.newRange,this.oldRange,this._markers,this.affectsData,this.baseVersion+1)}_execute(){const t=this.newRange?"_set":"_remove";this._markers[t](this.name,this.newRange,true,this.affectsData)}toJSON(){const t=super.toJSON();if(this.oldRange){t.oldRange=this.oldRange.toJSON()}if(this.newRange){t.newRange=this.newRange.toJSON()}delete t._markers;return t}static get className(){return"MarkerOperation"}static fromJSON(t,e){return new fp(t.name,t.oldRange?Kf.fromJSON(t.oldRange,e):null,t.newRange?Kf.fromJSON(t.newRange,e):null,e.model.markers,t.affectsData,t.baseVersion)}}class mp extends Yg{constructor(t,e,n,o){super(o);this.position=t;this.position.stickiness="toNext";this.oldName=e;this.newName=n}get type(){return"rename"}clone(){return new mp(this.position.clone(),this.oldName,this.newName,this.baseVersion)}getReversed(){return new mp(this.position.clone(),this.newName,this.oldName,this.baseVersion+1)}_validate(){const t=this.position.nodeAfter;if(!(t instanceof Ff)){throw new u["a"]("rename-operation-wrong-position",this)}else if(t.name!==this.oldName){throw new u["a"]("rename-operation-wrong-name",this)}}_execute(){const t=this.position.nodeAfter;t.name=this.newName}toJSON(){const t=super.toJSON();t.position=this.position.toJSON();return t}static get className(){return"RenameOperation"}static fromJSON(t,e){return new mp(Mf.fromJSON(t.position,e),t.oldName,t.newName,t.baseVersion)}}class gp extends Yg{constructor(t,e,n,o,i){super(i);this.root=t;this.key=e;this.oldValue=n;this.newValue=o}get type(){if(this.oldValue===null){return"addRootAttribute"}else if(this.newValue===null){return"removeRootAttribute"}else{return"changeRootAttribute"}}clone(){return new gp(this.root,this.key,this.oldValue,this.newValue,this.baseVersion)}getReversed(){return new gp(this.root,this.key,this.newValue,this.oldValue,this.baseVersion+1)}_validate(){if(this.root!=this.root.root||this.root.is("documentFragment")){throw new u["a"]("rootattribute-operation-not-a-root",this,{root:this.root,key:this.key})}if(this.oldValue!==null&&this.root.getAttribute(this.key)!==this.oldValue){throw new u["a"]("rootattribute-operation-wrong-old-value",this,{root:this.root,key:this.key})}if(this.oldValue===null&&this.newValue!==null&&this.root.hasAttribute(this.key)){throw new u["a"]("rootattribute-operation-attribute-exists",this,{root:this.root,key:this.key})}}_execute(){if(this.newValue!==null){this.root._setAttribute(this.key,this.newValue)}else{this.root._removeAttribute(this.key)}}toJSON(){const t=super.toJSON();t.root=this.root.toJSON();return t}static get className(){return"RootAttributeOperation"}static fromJSON(t,e){if(!e.getRoot(t.root)){throw new u["a"]("rootattribute-operation-fromjson-no-root",this,{rootName:t.root})}return new gp(e.getRoot(t.root),t.key,t.oldValue,t.newValue,t.baseVersion)}}class pp extends Yg{constructor(t,e,n,o,i){super(i);this.sourcePosition=t.clone();this.sourcePosition.stickiness="toPrevious";this.howMany=e;this.targetPosition=n.clone();this.targetPosition.stickiness="toNext";this.graveyardPosition=o.clone()}get type(){return"merge"}get deletionPosition(){return new Mf(this.sourcePosition.root,this.sourcePosition.path.slice(0,-1))}get movedRange(){const t=this.sourcePosition.getShiftedBy(Number.POSITIVE_INFINITY);return new Kf(this.sourcePosition,t)}clone(){return new this.constructor(this.sourcePosition,this.howMany,this.targetPosition,this.graveyardPosition,this.baseVersion)}getReversed(){const t=this.targetPosition._getTransformedByMergeOperation(this);const e=this.sourcePosition.path.slice(0,-1);const n=new Mf(this.sourcePosition.root,e)._getTransformedByMergeOperation(this);return new bp(t,this.howMany,n,this.graveyardPosition,this.baseVersion+1)}_validate(){const t=this.sourcePosition.parent;const e=this.targetPosition.parent;if(!t.parent){throw new u["a"]("merge-operation-source-position-invalid",this)}else if(!e.parent){throw new u["a"]("merge-operation-target-position-invalid",this)}else if(this.howMany!=t.maxOffset){throw new u["a"]("merge-operation-how-many-invalid",this)}}_execute(){const t=this.sourcePosition.parent;const e=Kf._createIn(t);ep(e,this.targetPosition);ep(Kf._createOn(t),this.graveyardPosition)}toJSON(){const t=super.toJSON();t.sourcePosition=t.sourcePosition.toJSON();t.targetPosition=t.targetPosition.toJSON();t.graveyardPosition=t.graveyardPosition.toJSON();return t}static get className(){return"MergeOperation"}static fromJSON(t,e){const n=Mf.fromJSON(t.sourcePosition,e);const o=Mf.fromJSON(t.targetPosition,e);const i=Mf.fromJSON(t.graveyardPosition,e);return new this(n,t.howMany,o,i,t.baseVersion)}}class bp extends Yg{constructor(t,e,n,o,i){super(i);this.splitPosition=t.clone();this.splitPosition.stickiness="toNext";this.howMany=e;this.insertionPosition=n;this.graveyardPosition=o?o.clone():null;if(this.graveyardPosition){this.graveyardPosition.stickiness="toNext"}}get type(){return"split"}get moveTargetPosition(){const t=this.insertionPosition.path.slice();t.push(0);return new Mf(this.insertionPosition.root,t)}get movedRange(){const t=this.splitPosition.getShiftedBy(Number.POSITIVE_INFINITY);return new Kf(this.splitPosition,t)}clone(){return new this.constructor(this.splitPosition,this.howMany,this.insertionPosition,this.graveyardPosition,this.baseVersion)}getReversed(){const t=this.splitPosition.root.document.graveyard;const e=new Mf(t,[0]);return new pp(this.moveTargetPosition,this.howMany,this.splitPosition,e,this.baseVersion+1)}_validate(){const t=this.splitPosition.parent;const e=this.splitPosition.offset;if(!t||t.maxOffset<e){throw new u["a"]("split-operation-position-invalid",this)}else if(!t.parent){throw new u["a"]("split-operation-split-in-root",this)}else if(this.howMany!=t.maxOffset-this.splitPosition.offset){throw new u["a"]("split-operation-how-many-invalid",this)}else if(this.graveyardPosition&&!this.graveyardPosition.nodeAfter){throw new u["a"]("split-operation-graveyard-position-invalid",this)}}_execute(){const t=this.splitPosition.parent;if(this.graveyardPosition){ep(Kf._createFromPositionAndShift(this.graveyardPosition,1),this.insertionPosition)}else{const e=t._clone();Zg(this.insertionPosition,e)}const e=new Kf(Mf._createAt(t,this.splitPosition.offset),Mf._createAt(t,t.maxOffset));ep(e,this.moveTargetPosition)}toJSON(){const t=super.toJSON();t.splitPosition=this.splitPosition.toJSON();t.insertionPosition=this.insertionPosition.toJSON();if(this.graveyardPosition){t.graveyardPosition=this.graveyardPosition.toJSON()}return t}static get className(){return"SplitOperation"}static getInsertionPosition(t){const e=t.path.slice(0,-1);e[e.length-1]++;return new Mf(t.root,e,"toPrevious")}static fromJSON(t,e){const n=Mf.fromJSON(t.splitPosition,e);const o=Mf.fromJSON(t.insertionPosition,e);const i=t.graveyardPosition?Mf.fromJSON(t.graveyardPosition,e):null;return new this(n,t.howMany,o,i,t.baseVersion)}}class kp extends Ff{constructor(t,e,n="main"){super(e);this._document=t;this.rootName=n}get document(){return this._document}is(t,e){if(!e){return t==="rootElement"||t==="model:rootElement"||t==="element"||t==="model:element"||t==="node"||t==="model:node"}return e===this.name&&(t==="rootElement"||t==="model:rootElement"||t==="element"||t==="model:element")}toJSON(){return this.rootName}}class wp{constructor(t,e){this.model=t;this.batch=e}createText(t,e){return new Pf(t,e)}createElement(t,e){return new Ff(t,e)}createDocumentFragment(){return new Qg}cloneElement(t,e=true){return t._clone(e)}insert(t,e,n=0){this._assertWriterUsedCorrectly();if(t instanceof Pf&&t.data==""){return}const o=Mf._createAt(e,n);if(t.parent){if(yp(t.root,o.root)){this.move(Kf._createOn(t),o);return}else{if(t.root.document){throw new u["a"]("model-writer-insert-forbidden-move",this)}else{this.remove(t)}}}const i=o.root.document?o.root.document.version:null;const r=new hp(o,t,i);if(t instanceof Pf){r.shouldReceiveAttributes=true}this.batch.addOperation(r);this.model.applyOperation(r);if(t instanceof Qg){for(const[e,n]of t.markers){const t=Mf._createAt(n.root,0);const i=new Kf(n.start._getCombined(t,o),n.end._getCombined(t,o));const r={range:i,usingOperation:true,affectsData:true};if(this.model.markers.has(e)){this.updateMarker(e,r)}else{this.addMarker(e,r)}}}}insertText(t,e,n,o){if(e instanceof Qg||e instanceof Ff||e instanceof Mf){this.insert(this.createText(t),e,n)}else{this.insert(this.createText(t,e),n,o)}}insertElement(t,e,n,o){if(e instanceof Qg||e instanceof Ff||e instanceof Mf){this.insert(this.createElement(t),e,n)}else{this.insert(this.createElement(t,e),n,o)}}append(t,e){this.insert(t,e,"end")}appendText(t,e,n){if(e instanceof Qg||e instanceof Ff){this.insert(this.createText(t),e,"end")}else{this.insert(this.createText(t,e),n,"end")}}appendElement(t,e,n){if(e instanceof Qg||e instanceof Ff){this.insert(this.createElement(t),e,"end")}else{this.insert(this.createElement(t,e),n,"end")}}setAttribute(t,e,n){this._assertWriterUsedCorrectly();if(n instanceof Kf){const o=n.getMinimalFlatRanges();for(const n of o){Cp(this,t,e,n)}}else{Ap(this,t,e,n)}}setAttributes(t,e){for(const[n,o]of La(t)){this.setAttribute(n,o,e)}}removeAttribute(t,e){this._assertWriterUsedCorrectly();if(e instanceof Kf){const n=e.getMinimalFlatRanges();for(const e of n){Cp(this,t,null,e)}}else{Ap(this,t,null,e)}}clearAttributes(t){this._assertWriterUsedCorrectly();const e=t=>{for(const e of t.getAttributeKeys()){this.removeAttribute(e,t)}};if(!(t instanceof Kf)){e(t)}else{for(const n of t.getItems()){e(n)}}}move(t,e,n){this._assertWriterUsedCorrectly();if(!(t instanceof Kf)){throw new u["a"]("writer-move-invalid-range",this)}if(!t.isFlat){throw new u["a"]("writer-move-range-not-flat",this)}const o=Mf._createAt(e,n);if(o.isEqual(t.start)){return}this._addOperationForAffectedMarkers("move",t);if(!yp(t.root,o.root)){throw new u["a"]("writer-move-different-document",this)}const i=t.root.document?t.root.document.version:null;const r=new up(t.start,t.end.offset-t.start.offset,o,i);this.batch.addOperation(r);this.model.applyOperation(r)}remove(t){this._assertWriterUsedCorrectly();const e=t instanceof Kf?t:Kf._createOn(t);const n=e.getMinimalFlatRanges().reverse();for(const t of n){this._addOperationForAffectedMarkers("move",t);vp(t.start,t.end.offset-t.start.offset,this.batch,this.model)}}merge(t){this._assertWriterUsedCorrectly();const e=t.nodeBefore;const n=t.nodeAfter;this._addOperationForAffectedMarkers("merge",t);if(!(e instanceof Ff)){throw new u["a"]("writer-merge-no-element-before",this)}if(!(n instanceof Ff)){throw new u["a"]("writer-merge-no-element-after",this)}if(!t.root.document){this._mergeDetached(t)}else{this._merge(t)}}createPositionFromPath(t,e,n){return this.model.createPositionFromPath(t,e,n)}createPositionAt(t,e){return this.model.createPositionAt(t,e)}createPositionAfter(t){return this.model.createPositionAfter(t)}createPositionBefore(t){return this.model.createPositionBefore(t)}createRange(t,e){return this.model.createRange(t,e)}createRangeIn(t){return this.model.createRangeIn(t)}createRangeOn(t){return this.model.createRangeOn(t)}createSelection(t,e,n){return this.model.createSelection(t,e,n)}_mergeDetached(t){const e=t.nodeBefore;const n=t.nodeAfter;this.move(Kf._createIn(n),Mf._createAt(e,"end"));this.remove(n)}_merge(t){const e=Mf._createAt(t.nodeBefore,"end");const n=Mf._createAt(t.nodeAfter,0);const o=t.root.document.graveyard;const i=new Mf(o,[0]);const r=t.root.document.version;const s=new pp(n,t.nodeAfter.maxOffset,e,i,r);this.batch.addOperation(s);this.model.applyOperation(s)}rename(t,e){this._assertWriterUsedCorrectly();if(!(t instanceof Ff)){throw new u["a"]("writer-rename-not-element-instance",this)}const n=t.root.document?t.root.document.version:null;const o=new mp(Mf._createBefore(t),t.name,e,n);this.batch.addOperation(o);this.model.applyOperation(o)}split(t,e){this._assertWriterUsedCorrectly();let n=t.parent;if(!n.parent){throw new u["a"]("writer-split-element-no-parent",this)}if(!e){e=n.parent}if(!t.parent.getAncestors({includeSelf:true}).includes(e)){throw new u["a"]("writer-split-invalid-limit-element",this)}let o,i;do{const e=n.root.document?n.root.document.version:null;const r=n.maxOffset-t.offset;const s=bp.getInsertionPosition(t);const a=new bp(t,r,s,null,e);this.batch.addOperation(a);this.model.applyOperation(a);if(!o&&!i){o=n;i=t.parent.nextSibling}t=this.createPositionAfter(t.parent);n=t.parent}while(n!==e);return{position:t,range:new Kf(Mf._createAt(o,"end"),Mf._createAt(i,0))}}wrap(t,e){this._assertWriterUsedCorrectly();if(!t.isFlat){throw new u["a"]("writer-wrap-range-not-flat",this)}const n=e instanceof Ff?e:new Ff(e);if(n.childCount>0){throw new u["a"]("writer-wrap-element-not-empty",this)}if(n.parent!==null){throw new u["a"]("writer-wrap-element-attached",this)}this.insert(n,t.start);const o=new Kf(t.start.getShiftedBy(1),t.end.getShiftedBy(1));this.move(o,Mf._createAt(n,0))}unwrap(t){this._assertWriterUsedCorrectly();if(t.parent===null){throw new u["a"]("writer-unwrap-element-no-parent",this)}this.move(Kf._createIn(t),this.createPositionAfter(t));this.remove(t)}addMarker(t,e){this._assertWriterUsedCorrectly();if(!e||typeof e.usingOperation!="boolean"){throw new u["a"]("writer-addmarker-no-usingoperation",this)}const n=e.usingOperation;const o=e.range;const i=e.affectsData===undefined?false:e.affectsData;if(this.model.markers.has(t)){throw new u["a"]("writer-addmarker-marker-exists",this)}if(!o){throw new u["a"]("writer-addmarker-no-range",this)}if(!n){return this.model.markers._set(t,o,n,i)}_p(this,t,null,o,i);return this.model.markers.get(t)}updateMarker(t,e){this._assertWriterUsedCorrectly();const n=typeof t=="string"?t:t.name;const o=this.model.markers.get(n);if(!o){throw new u["a"]("writer-updatemarker-marker-not-exists",this)}if(!e){this.model.markers._refresh(o);return}const i=typeof e.usingOperation=="boolean";const r=typeof e.affectsData=="boolean";const s=r?e.affectsData:o.affectsData;if(!i&&!e.range&&!r){throw new u["a"]("writer-updatemarker-wrong-options",this)}const a=o.getRange();const c=e.range?e.range:a;if(i&&e.usingOperation!==o.managedUsingOperations){if(e.usingOperation){_p(this,n,null,c,s)}else{_p(this,n,a,null,s);this.model.markers._set(n,c,undefined,s)}return}if(o.managedUsingOperations){_p(this,n,a,c,s)}else{this.model.markers._set(n,c,undefined,s)}}removeMarker(t){this._assertWriterUsedCorrectly();const e=typeof t=="string"?t:t.name;if(!this.model.markers.has(e)){throw new u["a"]("writer-removemarker-no-marker",this)}const n=this.model.markers.get(e);if(!n.managedUsingOperations){this.model.markers._remove(e);return}const o=n.getRange();_p(this,e,o,null,n.affectsData)}setSelection(t,e,n){this._assertWriterUsedCorrectly();this.model.document.selection._setTo(t,e,n)}setSelectionFocus(t,e){this._assertWriterUsedCorrectly();this.model.document.selection._setFocus(t,e)}setSelectionAttribute(t,e){this._assertWriterUsedCorrectly();if(typeof t==="string"){this._setSelectionAttribute(t,e)}else{for(const[e,n]of La(t)){this._setSelectionAttribute(e,n)}}}removeSelectionAttribute(t){this._assertWriterUsedCorrectly();if(typeof t==="string"){this._removeSelectionAttribute(t)}else{for(const e of t){this._removeSelectionAttribute(e)}}}overrideSelectionGravity(){return this.model.document.selection._overrideGravity()}restoreSelectionGravity(t){this.model.document.selection._restoreGravity(t)}_setSelectionAttribute(t,e){const n=this.model.document.selection;if(n.isCollapsed&&n.anchor.parent.isEmpty){const o=cm._getStoreAttributeKey(t);this.setAttribute(o,e,n.anchor.parent)}n._setAttribute(t,e)}_removeSelectionAttribute(t){const e=this.model.document.selection;if(e.isCollapsed&&e.anchor.parent.isEmpty){const n=cm._getStoreAttributeKey(t);this.removeAttribute(n,e.anchor.parent)}e._removeAttribute(t)}_assertWriterUsedCorrectly(){if(this.model._currentWriter!==this){throw new u["a"]("writer-incorrect-use",this)}}_addOperationForAffectedMarkers(t,e){for(const n of this.model.markers){if(!n.managedUsingOperations){continue}const o=n.getRange();let i=false;if(t==="move"){i=e.containsPosition(o.start)||e.start.isEqual(o.start)||e.containsPosition(o.end)||e.end.isEqual(o.end)}else{const t=e.nodeBefore;const n=e.nodeAfter;const r=o.start.parent==t&&o.start.isAtEnd;const s=o.end.parent==n&&o.end.offset==0;const a=o.end.nodeAfter==n;const c=o.start.nodeAfter==n;i=r||s||a||c}if(i){this.updateMarker(n.name,{range:o})}}}}function Cp(t,e,n,o){const i=t.model;const r=i.document;let s=o.start;let a;let c;let l;for(const t of o.getWalker({shallow:true})){l=t.item.getAttribute(e);if(a&&c!=l){if(c!=n){d()}s=a}a=t.nextPosition;c=l}if(a instanceof Mf&&a!=s&&c!=n){d()}function d(){const o=new Kf(s,a);const l=o.root.document?r.version:null;const d=new lp(o,e,c,n,l);t.batch.addOperation(d);i.applyOperation(d)}}function Ap(t,e,n,o){const i=t.model;const r=i.document;const s=o.getAttribute(e);let a,c;if(s!=n){const l=o.root===o;if(l){const t=o.document?r.version:null;c=new gp(o,e,s,n,t)}else{a=new Kf(Mf._createBefore(o),t.createPositionAfter(o));const i=a.root.document?r.version:null;c=new lp(a,e,s,n,i)}t.batch.addOperation(c);i.applyOperation(c)}}function _p(t,e,n,o,i){const r=t.model;const s=r.document;const a=new fp(e,n,o,r.markers,i,s.version);t.batch.addOperation(a);r.applyOperation(a)}function vp(t,e,n,o){let i;if(t.root.document){const n=o.document;const r=new Mf(n.graveyard,[0]);i=new up(t,e,r,n.version)}else{i=new dp(t,e)}n.addOperation(i);o.applyOperation(i)}function yp(t,e){if(t===e){return true}if(t instanceof kp&&e instanceof kp){return true}return false}class xp{constructor(t){this._markerCollection=t;this._changesInElement=new Map;this._elementSnapshots=new Map;this._changedMarkers=new Map;this._changeCount=0;this._cachedChanges=null;this._cachedChangesWithGraveyard=null}get isEmpty(){return this._changesInElement.size==0&&this._changedMarkers.size==0}refreshItem(t){if(this._isInInsertedElement(t.parent)){return}this._markRemove(t.parent,t.startOffset,t.offsetSize);this._markInsert(t.parent,t.startOffset,t.offsetSize);const e=Kf._createOn(t);for(const t of this._markerCollection.getMarkersIntersectingRange(e)){const e=t.getRange();this.bufferMarkerChange(t.name,e,e,t.affectsData)}this._cachedChanges=null}bufferOperation(t){switch(t.type){case"insert":{if(this._isInInsertedElement(t.position.parent)){return}this._markInsert(t.position.parent,t.position.offset,t.nodes.maxOffset);break}case"addAttribute":case"removeAttribute":case"changeAttribute":{for(const e of t.range.getItems({shallow:true})){if(this._isInInsertedElement(e.parent)){continue}this._markAttribute(e)}break}case"remove":case"move":case"reinsert":{if(t.sourcePosition.isEqual(t.targetPosition)||t.sourcePosition.getShiftedBy(t.howMany).isEqual(t.targetPosition)){return}const e=this._isInInsertedElement(t.sourcePosition.parent);const n=this._isInInsertedElement(t.targetPosition.parent);if(!e){this._markRemove(t.sourcePosition.parent,t.sourcePosition.offset,t.howMany)}if(!n){this._markInsert(t.targetPosition.parent,t.getMovedRangeStart().offset,t.howMany)}break}case"rename":{if(this._isInInsertedElement(t.position.parent)){return}this._markRemove(t.position.parent,t.position.offset,1);this._markInsert(t.position.parent,t.position.offset,1);const e=Kf._createFromPositionAndShift(t.position,1);for(const t of this._markerCollection.getMarkersIntersectingRange(e)){const e=t.getRange();this.bufferMarkerChange(t.name,e,e,t.affectsData)}break}case"split":{const e=t.splitPosition.parent;if(!this._isInInsertedElement(e)){this._markRemove(e,t.splitPosition.offset,t.howMany)}if(!this._isInInsertedElement(t.insertionPosition.parent)){this._markInsert(t.insertionPosition.parent,t.insertionPosition.offset,1)}if(t.graveyardPosition){this._markRemove(t.graveyardPosition.parent,t.graveyardPosition.offset,1)}break}case"merge":{const e=t.sourcePosition.parent;if(!this._isInInsertedElement(e.parent)){this._markRemove(e.parent,e.startOffset,1)}const n=t.graveyardPosition.parent;this._markInsert(n,t.graveyardPosition.offset,1);const o=t.targetPosition.parent;if(!this._isInInsertedElement(o)){this._markInsert(o,t.targetPosition.offset,e.maxOffset)}break}}this._cachedChanges=null}bufferMarkerChange(t,e,n,o){const i=this._changedMarkers.get(t);if(!i){this._changedMarkers.set(t,{oldRange:e,newRange:n,affectsData:o})}else{i.newRange=n;i.affectsData=o;if(i.oldRange==null&&i.newRange==null){this._changedMarkers.delete(t)}}}getMarkersToRemove(){const t=[];for(const[e,n]of this._changedMarkers){if(n.oldRange!=null){t.push({name:e,range:n.oldRange})}}return t}getMarkersToAdd(){const t=[];for(const[e,n]of this._changedMarkers){if(n.newRange!=null){t.push({name:e,range:n.newRange})}}return t}getChangedMarkers(){return Array.from(this._changedMarkers).map((t=>({name:t[0],data:{oldRange:t[1].oldRange,newRange:t[1].newRange}})))}hasDataChanges(){for(const[,t]of this._changedMarkers){if(t.affectsData){return true}}return this._changesInElement.size>0}getChanges(t={includeChangesInGraveyard:false}){if(this._cachedChanges){if(t.includeChangesInGraveyard){return this._cachedChangesWithGraveyard.slice()}else{return this._cachedChanges.slice()}}let e=[];for(const t of this._changesInElement.keys()){const n=this._changesInElement.get(t).sort(((t,e)=>{if(t.offset===e.offset){if(t.type!=e.type){return t.type=="remove"?-1:1}return 0}return t.offset<e.offset?-1:1}));const o=this._elementSnapshots.get(t);const i=Ep(t.getChildren());const r=Dp(o.length,n);let s=0;let a=0;for(const n of r){if(n==="i"){e.push(this._getInsertDiff(t,s,i[s].name));s++}else if(n==="r"){e.push(this._getRemoveDiff(t,s,o[a].name));a++}else if(n==="a"){const n=i[s].attributes;const r=o[a].attributes;let c;if(i[s].name=="$text"){c=new Kf(Mf._createAt(t,s),Mf._createAt(t,s+1))}else{const e=t.offsetToIndex(s);c=new Kf(Mf._createAt(t,s),Mf._createAt(t.getChild(e),0))}e.push(...this._getAttributesDiff(c,r,n));s++;a++}else{s++;a++}}}e.sort(((t,e)=>{if(t.position.root!=e.position.root){return t.position.root.rootName<e.position.root.rootName?-1:1}if(t.position.isEqual(e.position)){return t.changeCount-e.changeCount}return t.position.isBefore(e.position)?-1:1}));for(let t=1,n=0;t<e.length;t++){const o=e[n];const i=e[t];const r=o.type=="remove"&&i.type=="remove"&&o.name=="$text"&&i.name=="$text"&&o.position.isEqual(i.position);const s=o.type=="insert"&&i.type=="insert"&&o.name=="$text"&&i.name=="$text"&&o.position.parent==i.position.parent&&o.position.offset+o.length==i.position.offset;const a=o.type=="attribute"&&i.type=="attribute"&&o.position.parent==i.position.parent&&o.range.isFlat&&i.range.isFlat&&o.position.offset+o.length==i.position.offset&&o.attributeKey==i.attributeKey&&o.attributeOldValue==i.attributeOldValue&&o.attributeNewValue==i.attributeNewValue;if(r||s||a){o.length++;if(a){o.range.end=o.range.end.getShiftedBy(1)}e[t]=null}else{n=t}}e=e.filter((t=>t));for(const t of e){delete t.changeCount;if(t.type=="attribute"){delete t.position;delete t.length}}this._changeCount=0;this._cachedChangesWithGraveyard=e.slice();this._cachedChanges=e.filter(Sp);if(t.includeChangesInGraveyard){return this._cachedChangesWithGraveyard}else{return this._cachedChanges}}reset(){this._changesInElement.clear();this._elementSnapshots.clear();this._changedMarkers.clear();this._cachedChanges=null}_markInsert(t,e,n){const o={type:"insert",offset:e,howMany:n,count:this._changeCount++};this._markChange(t,o)}_markRemove(t,e,n){const o={type:"remove",offset:e,howMany:n,count:this._changeCount++};this._markChange(t,o);this._removeAllNestedChanges(t,e,n)}_markAttribute(t){const e={type:"attribute",offset:t.startOffset,howMany:t.offsetSize,count:this._changeCount++};this._markChange(t.parent,e)}_markChange(t,e){this._makeSnapshot(t);const n=this._getChangesForElement(t);this._handleChange(e,n);n.push(e);for(let t=0;t<n.length;t++){if(n[t].howMany<1){n.splice(t,1);t--}}}_getChangesForElement(t){let e;if(this._changesInElement.has(t)){e=this._changesInElement.get(t)}else{e=[];this._changesInElement.set(t,e)}return e}_makeSnapshot(t){if(!this._elementSnapshots.has(t)){this._elementSnapshots.set(t,Ep(t.getChildren()))}}_handleChange(t,e){t.nodesToHandle=t.howMany;for(const n of e){const o=t.offset+t.howMany;const i=n.offset+n.howMany;if(t.type=="insert"){if(n.type=="insert"){if(t.offset<=n.offset){n.offset+=t.howMany}else if(t.offset<i){n.howMany+=t.nodesToHandle;t.nodesToHandle=0}}if(n.type=="remove"){if(t.offset<n.offset){n.offset+=t.howMany}}if(n.type=="attribute"){if(t.offset<=n.offset){n.offset+=t.howMany}else if(t.offset<i){const i=n.howMany;n.howMany=t.offset-n.offset;e.unshift({type:"attribute",offset:o,howMany:i-n.howMany,count:this._changeCount++})}}}if(t.type=="remove"){if(n.type=="insert"){if(o<=n.offset){n.offset-=t.howMany}else if(o<=i){if(t.offset<n.offset){const e=o-n.offset;n.offset=t.offset;n.howMany-=e;t.nodesToHandle-=e}else{n.howMany-=t.nodesToHandle;t.nodesToHandle=0}}else{if(t.offset<=n.offset){t.nodesToHandle-=n.howMany;n.howMany=0}else if(t.offset<i){const e=i-t.offset;n.howMany-=e;t.nodesToHandle-=e}}}if(n.type=="remove"){if(o<=n.offset){n.offset-=t.howMany}else if(t.offset<n.offset){t.nodesToHandle+=n.howMany;n.howMany=0}}if(n.type=="attribute"){if(o<=n.offset){n.offset-=t.howMany}else if(t.offset<n.offset){const e=o-n.offset;n.offset=t.offset;n.howMany-=e}else if(t.offset<i){if(o<=i){const o=n.howMany;n.howMany=t.offset-n.offset;const i=o-n.howMany-t.nodesToHandle;e.unshift({type:"attribute",offset:t.offset,howMany:i,count:this._changeCount++})}else{n.howMany-=i-t.offset}}}}if(t.type=="attribute"){if(n.type=="insert"){if(t.offset<n.offset&&o>n.offset){if(o>i){const t={type:"attribute",offset:i,howMany:o-i,count:this._changeCount++};this._handleChange(t,e);e.push(t)}t.nodesToHandle=n.offset-t.offset;t.howMany=t.nodesToHandle}else if(t.offset>=n.offset&&t.offset<i){if(o>i){t.nodesToHandle=o-i;t.offset=i}else{t.nodesToHandle=0}}}if(n.type=="remove"){if(t.offset<n.offset&&o>n.offset){const i={type:"attribute",offset:n.offset,howMany:o-n.offset,count:this._changeCount++};this._handleChange(i,e);e.push(i);t.nodesToHandle=n.offset-t.offset;t.howMany=t.nodesToHandle}}if(n.type=="attribute"){if(t.offset>=n.offset&&o<=i){t.nodesToHandle=0;t.howMany=0;t.offset=0}else if(t.offset<=n.offset&&o>=i){n.howMany=0}}}}t.howMany=t.nodesToHandle;delete t.nodesToHandle}_getInsertDiff(t,e,n){return{type:"insert",position:Mf._createAt(t,e),name:n,length:1,changeCount:this._changeCount++}}_getRemoveDiff(t,e,n){return{type:"remove",position:Mf._createAt(t,e),name:n,length:1,changeCount:this._changeCount++}}_getAttributesDiff(t,e,n){const o=[];n=new Map(n);for(const[i,r]of e){const e=n.has(i)?n.get(i):null;if(e!==r){o.push({type:"attribute",position:t.start,range:t.clone(),length:1,attributeKey:i,attributeOldValue:r,attributeNewValue:e,changeCount:this._changeCount++})}n.delete(i)}for(const[e,i]of n){o.push({type:"attribute",position:t.start,range:t.clone(),length:1,attributeKey:e,attributeOldValue:null,attributeNewValue:i,changeCount:this._changeCount++})}return o}_isInInsertedElement(t){const e=t.parent;if(!e){return false}const n=this._changesInElement.get(e);const o=t.startOffset;if(n){for(const t of n){if(t.type=="insert"&&o>=t.offset&&o<t.offset+t.howMany){return true}}}return this._isInInsertedElement(e)}_removeAllNestedChanges(t,e,n){const o=new Kf(Mf._createAt(t,e),Mf._createAt(t,e+n));for(const t of o.getItems({shallow:true})){if(t.is("element")){this._elementSnapshots.delete(t);this._changesInElement.delete(t);this._removeAllNestedChanges(t,0,t.maxOffset)}}}}function Ep(t){const e=[];for(const n of t){if(n.is("$text")){for(let t=0;t<n.data.length;t++){e.push({name:"$text",attributes:new Map(n.getAttributes())})}}else{e.push({name:n.name,attributes:new Map(n.getAttributes())})}}return e}function Dp(t,e){const n=[];let o=0;let i=0;for(const t of e){if(t.offset>o){for(let e=0;e<t.offset-o;e++){n.push("e")}i+=t.offset-o}if(t.type=="insert"){for(let e=0;e<t.howMany;e++){n.push("i")}o=t.offset+t.howMany}else if(t.type=="remove"){for(let e=0;e<t.howMany;e++){n.push("r")}o=t.offset;i+=t.howMany}else{n.push(..."a".repeat(t.howMany).split(""));o=t.offset+t.howMany;i+=t.howMany}}if(i<t){for(let e=0;e<t-i-o;e++){n.push("e")}}return n}function Sp(t){const e=t.position&&t.position.root.rootName=="$graveyard";const n=t.range&&t.range.root.rootName=="$graveyard";return!e&&!n}class Bp{constructor(){this._operations=[];this._undoPairs=new Map;this._undoneOperations=new Set}addOperation(t){if(this._operations.includes(t)){return}this._operations.push(t)}getOperations(t=Number.NEGATIVE_INFINITY,e=Number.POSITIVE_INFINITY){const n=[];for(const o of this._operations){if(o.baseVersion>=t&&o.baseVersion<e){n.push(o)}}return n}getOperation(t){for(const e of this._operations){if(e.baseVersion==t){return e}}}setOperationAsUndone(t,e){this._undoPairs.set(e,t);this._undoneOperations.add(t)}isUndoingOperation(t){return this._undoPairs.has(t)}isUndoneOperation(t){return this._undoneOperations.has(t)}getUndoneOperation(t){return this._undoPairs.get(t)}}function Tp(t){return!!t&&t.length==1&&/[\u0300-\u036f\u1ab0-\u1aff\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f]/.test(t)}function Pp(t){return!!t&&t.length==1&&/[\ud800-\udbff]/.test(t)}function Ip(t){return!!t&&t.length==1&&/[\udc00-\udfff]/.test(t)}function Rp(t,e){return Pp(t.charAt(e-1))&&Ip(t.charAt(e))}function Fp(t,e){return Tp(t.charAt(e))}const zp="$graveyard";class Op{constructor(t){this.model=t;this.version=0;this.history=new Bp(this);this.selection=new cm(this);this.roots=new ka({idProperty:"rootName"});this.differ=new xp(t.markers);this._postFixers=new Set;this._hasSelectionChangedFromTheLastChangeBlock=false;this.createRoot("$root",zp);this.listenTo(t,"applyOperation",((t,e)=>{const n=e[0];if(n.isDocumentOperation&&n.baseVersion!==this.version){throw new u["a"]("model-document-applyoperation-wrong-version",this,{operation:n})}}),{priority:"highest"});this.listenTo(t,"applyOperation",((t,e)=>{const n=e[0];if(n.isDocumentOperation){this.differ.bufferOperation(n)}}),{priority:"high"});this.listenTo(t,"applyOperation",((t,e)=>{const n=e[0];if(n.isDocumentOperation){this.version++;this.history.addOperation(n)}}),{priority:"low"});this.listenTo(this.selection,"change",(()=>{this._hasSelectionChangedFromTheLastChangeBlock=true}));this.listenTo(t.markers,"update",((t,e,n,o)=>{this.differ.bufferMarkerChange(e.name,n,o,e.affectsData);if(n===null){e.on("change",((t,n)=>{this.differ.bufferMarkerChange(e.name,n,e.getRange(),e.affectsData)}))}}))}get graveyard(){return this.getRoot(zp)}createRoot(t="$root",e="main"){if(this.roots.get(e)){throw new u["a"]("model-document-createroot-name-exists",this,{name:e})}const n=new kp(this,t,e);this.roots.add(n);return n}destroy(){this.selection.destroy();this.stopListening()}getRoot(t="main"){return this.roots.get(t)}getRootNames(){return Array.from(this.roots,(t=>t.rootName)).filter((t=>t!=zp))}registerPostFixer(t){this._postFixers.add(t)}toJSON(){const t=za(this);t.selection="[engine.model.DocumentSelection]";t.model="[engine.model.Model]";return t}_handleChangeBlock(t){if(this._hasDocumentChangedFromTheLastChangeBlock()){this._callPostFixers(t);this.selection.refresh();if(this.differ.hasDataChanges()){this.fire("change:data",t.batch)}else{this.fire("change",t.batch)}this.selection.refresh();this.differ.reset()}this._hasSelectionChangedFromTheLastChangeBlock=false}_hasDocumentChangedFromTheLastChangeBlock(){return!this.differ.isEmpty||this._hasSelectionChangedFromTheLastChangeBlock}_getDefaultRoot(){for(const t of this.roots){if(t!==this.graveyard){return t}}return this.graveyard}_getDefaultRange(){const t=this._getDefaultRoot();const e=this.model;const n=e.schema;const o=e.createPositionFromPath(t,[0]);const i=n.getNearestSelectionRange(o);return i||e.createRange(o)}_validateSelectionRange(t){return Np(t.start)&&Np(t.end)}_callPostFixers(t){let e=false;do{for(const n of this._postFixers){this.selection.refresh();e=n(t);if(e){break}}}while(e)}}Hn(Op,g);function Np(t){const e=t.textNode;if(e){const n=e.data;const o=t.offset-e.startOffset;return!Rp(n,o)&&!Fp(n,o)}return true}class Mp{constructor(){this._markers=new Map}[Symbol.iterator](){return this._markers.values()}has(t){return this._markers.has(t)}get(t){return this._markers.get(t)||null}_set(t,e,n=false,o=false){const i=t instanceof Vp?t.name:t;if(i.includes(",")){throw new u["a"]("markercollection-incorrect-marker-name",this)}const r=this._markers.get(i);if(r){const t=r.getRange();let s=false;if(!t.isEqual(e)){r._attachLiveRange(om.fromRange(e));s=true}if(n!=r.managedUsingOperations){r._managedUsingOperations=n;s=true}if(typeof o==="boolean"&&o!=r.affectsData){r._affectsData=o;s=true}if(s){this.fire("update:"+i,r,t,e)}return r}const s=om.fromRange(e);const a=new Vp(i,s,n,o);this._markers.set(i,a);this.fire("update:"+i,a,null,e);return a}_remove(t){const e=t instanceof Vp?t.name:t;const n=this._markers.get(e);if(n){this._markers.delete(e);this.fire("update:"+e,n,n.getRange(),null);this._destroyMarker(n);return true}return false}_refresh(t){const e=t instanceof Vp?t.name:t;const n=this._markers.get(e);if(!n){throw new u["a"]("markercollection-refresh-marker-not-exists",this)}const o=n.getRange();this.fire("update:"+e,n,o,o,n.managedUsingOperations,n.affectsData)}*getMarkersAtPosition(t){for(const e of this){if(e.getRange().containsPosition(t)){yield e}}}*getMarkersIntersectingRange(t){for(const e of this){if(e.getRange().getIntersection(t)!==null){yield e}}}destroy(){for(const t of this._markers.values()){this._destroyMarker(t)}this._markers=null;this.stopListening()}*getMarkersGroup(t){for(const e of this._markers.values()){if(e.name.startsWith(t+":")){yield e}}}_destroyMarker(t){t.stopListening();t._detachLiveRange()}}Hn(Mp,g);class Vp{constructor(t,e,n,o){this.name=t;this._liveRange=this._attachLiveRange(e);this._managedUsingOperations=n;this._affectsData=o}get managedUsingOperations(){if(!this._liveRange){throw new u["a"]("marker-destroyed",this)}return this._managedUsingOperations}get affectsData(){if(!this._liveRange){throw new u["a"]("marker-destroyed",this)}return this._affectsData}getStart(){if(!this._liveRange){throw new u["a"]("marker-destroyed",this)}return this._liveRange.start.clone()}getEnd(){if(!this._liveRange){throw new u["a"]("marker-destroyed",this)}return this._liveRange.end.clone()}getRange(){if(!this._liveRange){throw new u["a"]("marker-destroyed",this)}return this._liveRange.toRange()}is(t){return t==="marker"||t==="model:marker"}_attachLiveRange(t){if(this._liveRange){this._detachLiveRange()}t.delegate("change:range").to(this);t.delegate("change:content").to(this);this._liveRange=t;return t}_detachLiveRange(){this._liveRange.stopDelegating("change:range",this);this._liveRange.stopDelegating("change:content",this);this._liveRange.detach();this._liveRange=null}}Hn(Vp,g);class Lp extends Yg{get type(){return"noop"}clone(){return new Lp(this.baseVersion)}getReversed(){return new Lp(this.baseVersion+1)}_execute(){}static get className(){return"NoOperation"}}const Hp={};Hp[lp.className]=lp;Hp[hp.className]=hp;Hp[fp.className]=fp;Hp[up.className]=up;Hp[Lp.className]=Lp;Hp[Yg.className]=Yg;Hp[mp.className]=mp;Hp[gp.className]=gp;Hp[bp.className]=bp;Hp[pp.className]=pp;class Kp{static fromJSON(t,e){return Hp[t.__className].fromJSON(t,e)}}class qp extends Mf{constructor(t,e,n="toNone"){super(t,e,n);if(!this.root.is("rootElement")){throw new u["a"]("model-liveposition-root-not-rootelement",t)}jp.call(this)}detach(){this.stopListening()}is(t){return t==="livePosition"||t==="model:livePosition"||t=="position"||t==="model:position"}toPosition(){return new Mf(this.root,this.path.slice(),this.stickiness)}static fromPosition(t,e){return new this(t.root,t.path.slice(),e?e:t.stickiness)}}function jp(){this.listenTo(this.root.document.model,"applyOperation",((t,e)=>{const n=e[0];if(!n.isDocumentOperation){return}Wp.call(this,n)}),{priority:"low"})}function Wp(t){const e=this.getTransformedByOperation(t);if(!this.isEqual(e)){const t=this.toPosition();this.path=e.path;this.root=e.root;this.fire("change",t)}}Hn(qp,g);function Gp(t,e,n,o){return t.change((i=>{let r;if(!n){r=t.document.selection}else if(n instanceof Qf||n instanceof cm){r=n}else{r=i.createSelection(n,o)}if(!r.isCollapsed){t.deleteContent(r,{doNotAutoparagraph:true})}const s=new Up(t,i,r.anchor);let a;if(e.is("documentFragment")){a=e.getChildren()}else{a=[e]}s.handleNodes(a);const c=s.getSelectionRange();if(c){if(r instanceof cm){i.setSelection(c)}else{r.setTo(c)}}else{}const l=s.getAffectedRange()||t.createRange(r.anchor);s.destroy();return l}))}class Up{constructor(t,e,n){this.model=t;this.writer=e;this.position=n;this.canMergeWith=new Set([this.position.parent]);this.schema=t.schema;this._documentFragment=e.createDocumentFragment();this._documentFragmentPosition=e.createPositionAt(this._documentFragment,0);this._firstNode=null;this._lastNode=null;this._lastAutoParagraph=null;this._filterAttributesOf=[];this._affectedStart=null;this._affectedEnd=null}handleNodes(t){for(const e of Array.from(t)){this._handleNode(e)}this._insertPartialFragment();if(this._lastAutoParagraph){this._updateLastNodeFromAutoParagraph(this._lastAutoParagraph)}this._mergeOnRight();this.schema.removeDisallowedAttributes(this._filterAttributesOf,this.writer);this._filterAttributesOf=[]}_updateLastNodeFromAutoParagraph(t){const e=this.writer.createPositionAfter(this._lastNode);const n=this.writer.createPositionAfter(t);if(n.isAfter(e)){this._lastNode=t;if(this.position.parent!=t||!this.position.isAtEnd){throw new u["a"]("insertcontent-invalid-insertion-position",this)}this.position=n;this._setAffectedBoundaries(this.position)}}getSelectionRange(){if(this.nodeToSelect){return Kf._createOn(this.nodeToSelect)}return this.model.schema.getNearestSelectionRange(this.position)}getAffectedRange(){if(!this._affectedStart){return null}return new Kf(this._affectedStart,this._affectedEnd)}destroy(){if(this._affectedStart){this._affectedStart.detach()}if(this._affectedEnd){this._affectedEnd.detach()}}_handleNode(t){if(this.schema.isObject(t)){this._handleObject(t);return}let e=this._checkAndAutoParagraphToAllowedPosition(t);if(!e){e=this._checkAndSplitToAllowedPosition(t);if(!e){this._handleDisallowedNode(t);return}}this._appendToFragment(t);if(!this._firstNode){this._firstNode=t}this._lastNode=t}_insertPartialFragment(){if(this._documentFragment.isEmpty){return}const t=qp.fromPosition(this.position,"toNext");this._setAffectedBoundaries(this.position);if(this._documentFragment.getChild(0)==this._firstNode){this.writer.insert(this._firstNode,this.position);this._mergeOnLeft();this.position=t.toPosition()}if(!this._documentFragment.isEmpty){this.writer.insert(this._documentFragment,this.position)}this._documentFragmentPosition=this.writer.createPositionAt(this._documentFragment,0);this.position=t.toPosition();t.detach()}_handleObject(t){if(this._checkAndSplitToAllowedPosition(t)){this._appendToFragment(t)}else{this._tryAutoparagraphing(t)}}_handleDisallowedNode(t){if(t.is("element")){this.handleNodes(t.getChildren())}else{this._tryAutoparagraphing(t)}}_appendToFragment(t){if(!this.schema.checkChild(this.position,t)){throw new u["a"]("insertcontent-wrong-position",this,{node:t,position:this.position})}this.writer.insert(t,this._documentFragmentPosition);this._documentFragmentPosition=this._documentFragmentPosition.getShiftedBy(t.offsetSize);if(this.schema.isObject(t)&&!this.schema.checkChild(this.position,"$text")){this.nodeToSelect=t}else{this.nodeToSelect=null}this._filterAttributesOf.push(t)}_setAffectedBoundaries(t){if(!this._affectedStart){this._affectedStart=qp.fromPosition(t,"toPrevious")}if(!this._affectedEnd||this._affectedEnd.isBefore(t)){if(this._affectedEnd){this._affectedEnd.detach()}this._affectedEnd=qp.fromPosition(t,"toNext")}}_mergeOnLeft(){const t=this._firstNode;if(!(t instanceof Ff)){return}if(!this._canMergeLeft(t)){return}const e=qp._createBefore(t);e.stickiness="toNext";const n=qp.fromPosition(this.position,"toNext");if(this._affectedStart.isEqual(e)){this._affectedStart.detach();this._affectedStart=qp._createAt(e.nodeBefore,"end","toPrevious")}if(this._firstNode===this._lastNode){this._firstNode=e.nodeBefore;this._lastNode=e.nodeBefore}this.writer.merge(e);if(e.isEqual(this._affectedEnd)&&this._firstNode===this._lastNode){this._affectedEnd.detach();this._affectedEnd=qp._createAt(e.nodeBefore,"end","toNext")}this.position=n.toPosition();n.detach();this._filterAttributesOf.push(this.position.parent);e.detach()}_mergeOnRight(){const t=this._lastNode;if(!(t instanceof Ff)){return}if(!this._canMergeRight(t)){return}const e=qp._createAfter(t);e.stickiness="toNext";if(!this.position.isEqual(e)){throw new u["a"]("insertcontent-invalid-insertion-position",this)}this.position=Mf._createAt(e.nodeBefore,"end");const n=qp.fromPosition(this.position,"toPrevious");if(this._affectedEnd.isEqual(e)){this._affectedEnd.detach();this._affectedEnd=qp._createAt(e.nodeBefore,"end","toNext")}if(this._firstNode===this._lastNode){this._firstNode=e.nodeBefore;this._lastNode=e.nodeBefore}this.writer.merge(e);if(e.getShiftedBy(-1).isEqual(this._affectedStart)&&this._firstNode===this._lastNode){this._affectedStart.detach();this._affectedStart=qp._createAt(e.nodeBefore,0,"toPrevious")}this.position=n.toPosition();n.detach();this._filterAttributesOf.push(this.position.parent);e.detach()}_canMergeLeft(t){const e=t.previousSibling;return e instanceof Ff&&this.canMergeWith.has(e)&&this.model.schema.checkMerge(e,t)}_canMergeRight(t){const e=t.nextSibling;return e instanceof Ff&&this.canMergeWith.has(e)&&this.model.schema.checkMerge(t,e)}_tryAutoparagraphing(t){const e=this.writer.createElement("paragraph");if(this._getAllowedIn(e,this.position.parent)&&this.schema.checkChild(e,t)){e._appendChild(t);this._handleNode(e)}}_checkAndAutoParagraphToAllowedPosition(t){if(this.schema.checkChild(this.position.parent,t)){return true}if(!this.schema.checkChild(this.position.parent,"paragraph")||!this.schema.checkChild("paragraph",t)){return false}this._insertPartialFragment();const e=this.writer.createElement("paragraph");this.writer.insert(e,this.position);this._setAffectedBoundaries(this.position);this._lastAutoParagraph=e;this.position=this.writer.createPositionAt(e,0);return true}_checkAndSplitToAllowedPosition(t){const e=this._getAllowedIn(t,this.position.parent);if(!e){return false}if(e!=this.position.parent){this._insertPartialFragment()}while(e!=this.position.parent){if(this.schema.isLimit(this.position.parent)){return false}if(this.position.isAtStart){const t=this.position.parent;this.position=this.writer.createPositionBefore(t);if(t.isEmpty&&t.parent===e){this.writer.remove(t)}}else if(this.position.isAtEnd){this.position=this.writer.createPositionAfter(this.position.parent)}else{const t=this.writer.createPositionAfter(this.position.parent);this._setAffectedBoundaries(this.position);this.writer.split(this.position);this.position=t;this.canMergeWith.add(this.position.nodeAfter)}}return true}_getAllowedIn(t,e){if(this.schema.checkChild(e,t)){return e}if(e.parent){return this._getAllowedIn(t,e.parent)}return null}}function $p(t,e,n={}){if(e.isCollapsed){return}const o=e.getFirstRange();if(o.root.rootName=="$graveyard"){return}const i=t.schema;t.change((t=>{if(!n.doNotResetEntireContent&&ab(i,e)){sb(t,e,i);return}const[r,s]=Jp(o);if(!r.isTouching(s)){t.remove(t.createRange(r,s))}if(!n.leaveUnmerged){Qp(t,r,s);i.removeDisallowedAttributes(r.parent.getChildren(),t)}cb(t,e,r);if(!n.doNotAutoparagraph&&ob(i,r)){rb(t,r,e)}r.detach();s.detach()}))}function Jp(t){const e=t.root.document.model;const n=t.start;let o=t.end;if(e.hasContent(t,{ignoreMarkers:true})){const n=Yp(o);if(n&&o.isTouching(e.createPositionAt(n,0))){const n=e.createSelection(t);e.modifySelection(n,{direction:"backward"});o=n.getLastPosition()}}return[qp.fromPosition(n,"toPrevious"),qp.fromPosition(o,"toNext")]}function Yp(t){const e=t.parent;const n=e.root.document.model.schema;const o=e.getAncestors({parentFirst:true,includeSelf:true});for(const t of o){if(n.isLimit(t)){return null}if(n.isBlock(t)){return t}}}function Qp(t,e,n){const o=t.model;if(!eb(t.model.schema,e,n)){return}const[i,r]=nb(e,n);if(!i||!r){return}if(!o.hasContent(i,{ignoreMarkers:true})&&o.hasContent(r,{ignoreMarkers:true})){Zp(t,e,n,i.parent)}else{Xp(t,e,n,i.parent)}}function Xp(t,e,n,o){const i=e.parent;const r=n.parent;if(i==o||r==o){return}e=t.createPositionAfter(i);n=t.createPositionBefore(r);if(!n.isEqual(e)){t.insert(r,e)}t.merge(e);while(n.parent.isEmpty){const e=n.parent;n=t.createPositionBefore(e);t.remove(e)}if(!eb(t.model.schema,e,n)){return}Xp(t,e,n,o)}function Zp(t,e,n,o){const i=e.parent;const r=n.parent;if(i==o||r==o){return}e=t.createPositionAfter(i);n=t.createPositionBefore(r);if(!n.isEqual(e)){t.insert(i,n)}while(e.parent.isEmpty){const n=e.parent;e=t.createPositionBefore(n);t.remove(n)}n=t.createPositionBefore(r);tb(t,n);if(!eb(t.model.schema,e,n)){return}Zp(t,e,n,o)}function tb(t,e){const n=e.nodeBefore;const o=e.nodeAfter;if(n.name!=o.name){t.rename(n,o.name)}t.clearAttributes(n);t.setAttributes(Object.fromEntries(o.getAttributes()),n);t.merge(e)}function eb(t,e,n){const o=e.parent;const i=n.parent;if(o==i){return false}if(t.isLimit(o)||t.isLimit(i)){return false}return ib(e,n,t)}function nb(t,e){const n=t.getAncestors();const o=e.getAncestors();let i=0;while(n[i]&&n[i]==o[i]){i++}return[n[i],o[i]]}function ob(t,e){const n=t.checkChild(e,"$text");const o=t.checkChild(e,"paragraph");return!n&&o}function ib(t,e,n){const o=new Kf(t,e);for(const t of o.getWalker()){if(n.isLimit(t.item)){return false}}return true}function rb(t,e,n){const o=t.createElement("paragraph");t.insert(o,e);cb(t,n,t.createPositionAt(o,0))}function sb(t,e){const n=t.model.schema.getLimitElement(e);t.remove(t.createRangeIn(n));rb(t,t.createPositionAt(n,0),e)}function ab(t,e){const n=t.getLimitElement(e);if(!e.containsEntireContent(n)){return false}const o=e.getFirstRange();if(o.start.parent==o.end.parent){return false}return t.checkChild(n,"paragraph")}function cb(t,e,n){if(e instanceof cm){t.setSelection(n)}else{e.setTo(n)}}const lb=' ,.?!:;"-()';function db(t,e,n={}){const o=t.schema;const i=n.direction!="backward";const r=n.unit?n.unit:"character";const s=e.focus;const a=new Of({boundaries:mb(s,i),singleCharacters:true,direction:i?"forward":"backward"});const c={walker:a,schema:o,isForward:i,unit:r};let l;while(l=a.next()){if(l.done){return}const n=ub(c,l.value);if(n){if(e instanceof cm){t.change((t=>{t.setSelectionFocus(n)}))}else{e.setFocus(n)}return}}}function ub(t,e){const{isForward:n,walker:o,unit:i,schema:r}=t;const{type:s,item:a,nextPosition:c}=e;if(s=="text"){if(t.unit==="word"){return fb(o,n)}return hb(o,i,n)}if(s==(n?"elementStart":"elementEnd")){if(r.isSelectable(a)){return Mf._createAt(a,n?"after":"before")}if(r.checkChild(c,"$text")){return c}}else{if(r.isLimit(a)){o.skip((()=>true));return}if(r.checkChild(c,"$text")){return c}}}function hb(t,e){const n=t.position.textNode;if(n){const o=n.data;let i=t.position.offset-n.startOffset;while(Rp(o,i)||e=="character"&&Fp(o,i)){t.next();i=t.position.offset-n.startOffset}}return t.position}function fb(t,e){let n=t.position.textNode;if(n){let o=t.position.offset-n.startOffset;while(!gb(n.data,o,e)&&!pb(n,o,e)){t.next();const i=e?t.position.nodeAfter:t.position.nodeBefore;if(i&&i.is("$text")){const o=i.data.charAt(e?0:i.data.length-1);if(!lb.includes(o)){t.next();n=t.position.textNode}}o=t.position.offset-n.startOffset}}return t.position}function mb(t,e){const n=t.root;const o=Mf._createAt(n,e?"end":0);if(e){return new Kf(t,o)}else{return new Kf(o,t)}}function gb(t,e,n){const o=e+(n?0:-1);return lb.includes(t.charAt(o))}function pb(t,e,n){return e===(n?t.endOffset:0)}function bb(t,e){return t.change((t=>{const n=t.createDocumentFragment();const o=e.getFirstRange();if(!o||o.isCollapsed){return n}const i=o.start.root;const r=o.start.getCommonPath(o.end);const s=i.getNodeByPath(r);let a;if(o.start.parent==o.end.parent){a=o}else{a=t.createRange(t.createPositionAt(s,o.start.path[r.length]),t.createPositionAt(s,o.end.path[r.length]+1))}const c=a.end.offset-a.start.offset;for(const e of a.getItems({shallow:true})){if(e.is("$textProxy")){t.appendText(e.data,e.getAttributes(),n)}else{t.append(t.cloneElement(e,true),n)}}if(a!=o){const e=o._getTransformedByMove(a.start,t.createPositionAt(n,0),c)[0];const i=t.createRange(t.createPositionAt(n,0),e.start);const r=t.createRange(e.end,t.createPositionAt(n,"end"));kb(r,t);kb(i,t)}return n}))}function kb(t,e){const n=[];Array.from(t.getItems({direction:"backward"})).map((t=>e.createRangeOn(t))).filter((e=>{const n=(e.start.isAfter(t.start)||e.start.isEqual(t.start))&&(e.end.isBefore(t.end)||e.end.isEqual(t.end));return n})).forEach((t=>{n.push(t.start.parent);e.remove(t)}));n.forEach((t=>{let n=t;while(n.parent&&n.isEmpty){const t=e.createRangeOn(n);n=n.parent;e.remove(t)}}))}function wb(t){t.document.registerPostFixer((e=>Cb(e,t)))}function Cb(t,e){const n=e.document.selection;const o=e.schema;const i=[];let r=false;for(const t of n.getRanges()){const e=Ab(t,o);if(e&&!e.isEqual(t)){i.push(e);r=true}else{i.push(t)}}if(r){t.setSelection(Eb(i),{backward:n.isBackward})}}function Ab(t,e){if(t.isCollapsed){return _b(t,e)}return vb(t,e)}function _b(t,e){const n=t.start;const o=e.getNearestSelectionRange(n);if(!o){return null}if(!o.isCollapsed){return o}const i=o.start;if(n.isEqual(i)){return null}return new Kf(i)}function vb(t,e){const{start:n,end:o}=t;const i=e.checkChild(n,"$text");const r=e.checkChild(o,"$text");const s=e.getLimitElement(n);const a=e.getLimitElement(o);if(s===a){if(i&&r){return null}if(xb(n,o,e)){const t=n.nodeAfter&&e.isSelectable(n.nodeAfter);const i=t?null:e.getNearestSelectionRange(n,"forward");const r=o.nodeBefore&&e.isSelectable(o.nodeBefore);const s=r?null:e.getNearestSelectionRange(o,"backward");const a=i?i.start:n;const c=s?s.end:o;return new Kf(a,c)}}const c=s&&!s.is("rootElement");const l=a&&!a.is("rootElement");if(c||l){const t=n.nodeAfter&&o.nodeBefore&&n.nodeAfter.parent===o.nodeBefore.parent;const i=c&&(!t||!Db(n.nodeAfter,e));const r=l&&(!t||!Db(o.nodeBefore,e));let d=n;let u=o;if(i){d=Mf._createBefore(yb(s,e))}if(r){u=Mf._createAfter(yb(a,e))}return new Kf(d,u)}return null}function yb(t,e){let n=t;let o=n;while(e.isLimit(o)&&o.parent){n=o;o=o.parent}return n}function xb(t,e,n){const o=t.nodeAfter&&!n.isLimit(t.nodeAfter)||n.checkChild(t,"$text");const i=e.nodeBefore&&!n.isLimit(e.nodeBefore)||n.checkChild(e,"$text");return o||i}function Eb(t){const e=[];e.push(t.shift());for(const n of t){const t=e.pop();if(n.isEqual(t)){e.push(t)}else if(n.isIntersecting(t)){const o=t.start.isAfter(n.start)?n.start:t.start;const i=t.end.isAfter(n.end)?t.end:n.end;const r=new Kf(o,i);e.push(r)}else{e.push(t);e.push(n)}}return e}function Db(t,e){return t&&e.isSelectable(t)}class Sb{constructor(){this.markers=new Mp;this.document=new Op(this);this.schema=new Ag;this._pendingChanges=[];this._currentWriter=null;["insertContent","deleteContent","modifySelection","getSelectedContent","applyOperation"].forEach((t=>this.decorate(t)));this.on("applyOperation",((t,e)=>{const n=e[0];n._validate()}),{priority:"highest"});this.schema.register("$root",{isLimit:true});this.schema.register("$block",{allowIn:"$root",isBlock:true});this.schema.register("$text",{allowIn:"$block",isInline:true,isContent:true});this.schema.register("$clipboardHolder",{allowContentOf:"$root",isLimit:true});this.schema.extend("$text",{allowIn:"$clipboardHolder"});this.schema.register("$marker");this.schema.addChildCheck(((t,e)=>{if(e.name==="$marker"){return true}}));wb(this);this.document.registerPostFixer($m)}change(t){try{if(this._pendingChanges.length===0){this._pendingChanges.push({batch:new Jg,callback:t});return this._runPendingChanges()[0]}else{return t(this._currentWriter)}}catch(t){u["a"].rethrowUnexpectedError(t,this)}}enqueueChange(t,e){try{if(typeof t==="string"){t=new Jg(t)}else if(typeof t=="function"){e=t;t=new Jg}this._pendingChanges.push({batch:t,callback:e});if(this._pendingChanges.length==1){this._runPendingChanges()}}catch(t){u["a"].rethrowUnexpectedError(t,this)}}applyOperation(t){t._execute()}insertContent(t,e,n){return Gp(this,t,e,n)}deleteContent(t,e){$p(this,t,e)}modifySelection(t,e){db(this,t,e)}getSelectedContent(t){return bb(this,t)}hasContent(t,e={}){const n=t instanceof Ff?Kf._createIn(t):t;if(n.isCollapsed){return false}const{ignoreWhitespaces:o=false,ignoreMarkers:i=false}=e;if(!i){for(const t of this.markers.getMarkersIntersectingRange(n)){if(t.affectsData){return true}}}for(const t of n.getItems()){if(this.schema.isContent(t)){if(t.is("$textProxy")){if(!o){return true}else if(t.data.search(/\S/)!==-1){return true}}else{return true}}}return false}createPositionFromPath(t,e,n){return new Mf(t,e,n)}createPositionAt(t,e){return Mf._createAt(t,e)}createPositionAfter(t){return Mf._createAfter(t)}createPositionBefore(t){return Mf._createBefore(t)}createRange(t,e){return new Kf(t,e)}createRangeIn(t){return Kf._createIn(t)}createRangeOn(t){return Kf._createOn(t)}createSelection(t,e,n){return new Qf(t,e,n)}createBatch(t){return new Jg(t)}createOperationFromJSON(t){return Kp.fromJSON(t,this.document)}destroy(){this.document.destroy();this.stopListening()}_runPendingChanges(){const t=[];this.fire("_beforeChanges");while(this._pendingChanges.length){const e=this._pendingChanges[0].batch;this._currentWriter=new wp(this,e);const n=this._pendingChanges[0].callback(this._currentWriter);t.push(n);this.document._handleChangeBlock(this._currentWriter);this._pendingChanges.shift();this._currentWriter=null}this.fire("_afterChanges");return t}}Hn(Sb,Tn);class Bb extends gf{constructor(t){super();this.editor=t}set(t,e,n={}){if(typeof e=="string"){const t=e;e=(e,n)=>{this.editor.execute(t);n()}}super.set(t,e,n)}}class Tb{constructor(t={}){this._context=t.context||new Ta({language:t.language});this._context._addEditor(this,!t.context);const e=Array.from(this.constructor.builtinPlugins||[]);this.config=new ma(t,this.constructor.defaultConfig);this.config.define("plugins",e);this.config.define(this._context._getEditorConfig());this.plugins=new wa(this,e,this._context.plugins);this.locale=this._context.locale;this.t=this.locale.t;this.commands=new kg;this.set("state","initializing");this.once("ready",(()=>this.state="ready"),{priority:"high"});this.once("destroy",(()=>this.state="destroyed"),{priority:"high"});this.set("isReadOnly",false);this.model=new Sb;const n=new al;this.data=new jg(this.model,n);this.editing=new bg(this.model,n);this.editing.view.document.bind("isReadOnly").to(this);this.conversion=new Gg([this.editing.downcastDispatcher,this.data.downcastDispatcher],this.data.upcastDispatcher);this.conversion.addAlias("dataDowncast",this.data.downcastDispatcher);this.conversion.addAlias("editingDowncast",this.editing.downcastDispatcher);this.keystrokes=new Bb(this);this.keystrokes.listenTo(this.editing.view.document)}initPlugins(){const t=this.config;const e=t.get("plugins");const n=t.get("removePlugins")||[];const o=t.get("extraPlugins")||[];const i=t.get("substitutePlugins")||[];return this.plugins.init(e.concat(o),n,i)}destroy(){let t=Promise.resolve();if(this.state=="initializing"){t=new Promise((t=>this.once("ready",t)))}return t.then((()=>{this.fire("destroy");this.stopListening();this.commands.destroy()})).then((()=>this.plugins.destroy())).then((()=>{this.model.destroy();this.data.destroy();this.editing.destroy();this.keystrokes.destroy()})).then((()=>this._context._removeEditor(this)))}execute(...t){try{return this.commands.execute(...t)}catch(t){u["a"].rethrowUnexpectedError(t,this)}}focus(){this.editing.view.focus()}}Hn(Tb,Tn);class Pb{constructor(t){this.editor=t;this._components=new Map}*names(){for(const t of this._components.values()){yield t.originalName}}add(t,e){this._components.set(Ib(t),{callback:e,originalName:t})}create(t){if(!this.has(t)){throw new u["a"]("componentfactory-item-missing",this,{name:t})}return this._components.get(Ib(t)).callback(this.editor.locale)}has(t){return this._components.has(Ib(t))}}function Ib(t){return String(t).toLowerCase()}class Rb{constructor(t){this.editor=t;this.componentFactory=new Pb(t);this.focusTracker=new mf;this._editableElementsMap=new Map;this.listenTo(t.editing.view.document,"layoutChanged",(()=>this.update()))}get element(){return null}update(){this.fire("update")}destroy(){this.stopListening();this.focusTracker.destroy();for(const t of this._editableElementsMap.values()){t.ckeditorInstance=null}this._editableElementsMap=new Map}setEditableElement(t,e){this._editableElementsMap.set(t,e);if(!e.ckeditorInstance){e.ckeditorInstance=this.editor}}getEditableElement(t="main"){return this._editableElementsMap.get(t)}getEditableElementsNames(){return this._editableElementsMap.keys()}get _editableElements(){console.warn("editor-ui-deprecated-editable-elements: "+"The EditorUI#_editableElements property has been deprecated and will be removed in the near future.",{editorUI:this});return this._editableElementsMap}}Hn(Rb,g);function Fb(t){if(!X(t.updateSourceElement)){throw new u["a"]("attachtoform-missing-elementapi-interface",t)}const e=t.sourceElement;if(e&&e.tagName.toLowerCase()==="textarea"&&e.form){let n;const o=e.form;const i=()=>t.updateSourceElement();if(X(o.submit)){n=o.submit;o.submit=()=>{i();n.apply(o)}}o.addEventListener("submit",i);t.on("destroy",(()=>{o.removeEventListener("submit",i);if(n){o.submit=n}}))}}const zb={setData(t){this.data.set(t)},getData(t){return this.data.get(t)}};var Ob=zb;const Nb={updateSourceElement(){if(!this.sourceElement){throw new u["a"]("editor-missing-sourceelement",this)}uf(this.sourceElement,this.data.get())}};var Mb=Nb;function Vb(t){const e=t.sourceElement;if(!e){return}if(e.ckeditorInstance){throw new u["a"]("editor-source-element-already-used",t)}e.ckeditorInstance=t;t.once("destroy",(()=>{delete e.ckeditorInstance}))}class Lb extends Pa{static get pluginName(){return"PendingActions"}init(){this.set("hasAny",false);this._actions=new ka({idProperty:"_id"});this._actions.delegate("add","remove").to(this)}add(t){if(typeof t!=="string"){throw new u["a"]("pendingactions-add-invalid-message",this)}const e=Object.create(Tn);e.set("message",t);this._actions.add(e);this.hasAny=true;return e}remove(t){this._actions.remove(t);this.hasAny=!!this._actions.length}get first(){return this._actions.get(0)}[Symbol.iterator](){return this._actions[Symbol.iterator]()}}var Hb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.591 10.177 4.243 4.242a1 1 0 0 1-1.415 1.415l-4.242-4.243-4.243 4.243a1 1 0 0 1-1.414-1.415l4.243-4.242L4.52 5.934A1 1 0 0 1 5.934 4.52l4.243 4.243 4.242-4.243a1 1 0 1 1 1.415 1.414l-4.243 4.243z"/></svg>';var Kb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 16h9a1 1 0 0 1 0 2H2a1 1 0 0 1 0-2z"/><path d="M17 1a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h14zm0 1.5H3a.5.5 0 0 0-.492.41L2.5 3v9a.5.5 0 0 0 .41.492L3 12.5h14a.5.5 0 0 0 .492-.41L17.5 12V3a.5.5 0 0 0-.41-.492L17 2.5z" fill-opacity=".6"/></svg>';var qb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.972 16.615a.997.997 0 0 1-.744-.292l-4.596-4.596a1 1 0 1 1 1.414-1.414l3.926 3.926 9.937-9.937a1 1 0 0 1 1.414 1.415L7.717 16.323a.997.997 0 0 1-.745.292z"/></svg>';var jb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m8.636 9.531-2.758 3.94a.5.5 0 0 0 .122.696l3.224 2.284h1.314l2.636-3.736L8.636 9.53zm.288 8.451L5.14 15.396a2 2 0 0 1-.491-2.786l6.673-9.53a2 2 0 0 1 2.785-.49l3.742 2.62a2 2 0 0 1 .491 2.785l-7.269 10.053-2.147-.066z"/><path d="M4 18h5.523v-1H4zm-2 0h1v-1H2z"/></svg>';var Wb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M5.085 6.22 2.943 4.078a.75.75 0 1 1 1.06-1.06l2.592 2.59A11.094 11.094 0 0 1 10 5.068c4.738 0 8.578 3.101 8.578 5.083 0 1.197-1.401 2.803-3.555 3.887l1.714 1.713a.75.75 0 0 1-.09 1.138.488.488 0 0 1-.15.084.75.75 0 0 1-.821-.16L6.17 7.304c-.258.11-.51.233-.757.365l6.239 6.24-.006.005.78.78c-.388.094-.78.166-1.174.215l-1.11-1.11h.011L4.55 8.197a7.2 7.2 0 0 0-.665.514l-.112.098 4.897 4.897-.005.006 1.276 1.276a10.164 10.164 0 0 1-1.477-.117l-.479-.479-.009.009-4.863-4.863-.022.031a2.563 2.563 0 0 0-.124.2c-.043.077-.08.158-.108.241a.534.534 0 0 0-.028.133.29.29 0 0 0 .008.072.927.927 0 0 0 .082.226c.067.133.145.26.234.379l3.242 3.365.025.01.59.623c-3.265-.918-5.59-3.155-5.59-4.668 0-1.194 1.448-2.838 3.663-3.93zm7.07.531a4.632 4.632 0 0 1 1.108 5.992l.345.344.046-.018a9.313 9.313 0 0 0 2-1.112c.256-.187.5-.392.727-.613.137-.134.27-.277.392-.431.072-.091.141-.185.203-.286.057-.093.107-.19.148-.292a.72.72 0 0 0 .036-.12.29.29 0 0 0 .008-.072.492.492 0 0 0-.028-.133.999.999 0 0 0-.036-.096 2.165 2.165 0 0 0-.071-.145 2.917 2.917 0 0 0-.125-.2 3.592 3.592 0 0 0-.263-.335 5.444 5.444 0 0 0-.53-.523 7.955 7.955 0 0 0-1.054-.768 9.766 9.766 0 0 0-1.879-.891c-.337-.118-.68-.219-1.027-.301zm-2.85.21-.069.002a.508.508 0 0 0-.254.097.496.496 0 0 0-.104.679.498.498 0 0 0 .326.199l.045.005c.091.003.181.003.272.012a2.45 2.45 0 0 1 2.017 1.513c.024.061.043.125.069.185a.494.494 0 0 0 .45.287h.008a.496.496 0 0 0 .35-.158.482.482 0 0 0 .13-.335.638.638 0 0 0-.048-.219 3.379 3.379 0 0 0-.36-.723 3.438 3.438 0 0 0-2.791-1.543l-.028-.001h-.013z"/></svg>';var Gb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.91 10.54c.26-.23.64-.21.88.03l3.36 3.14 2.23-2.06a.64.64 0 0 1 .87 0l2.52 2.97V4.5H3.2v10.12l3.71-4.08zm10.27-7.51c.6 0 1.09.47 1.09 1.05v11.84c0 .59-.49 1.06-1.09 1.06H2.79c-.6 0-1.09-.47-1.09-1.06V4.08c0-.58.49-1.05 1.1-1.05h14.38zm-5.22 5.56a1.96 1.96 0 1 1 3.4-1.96 1.96 1.96 0 0 1-3.4 1.96z"/></svg>';var Ub='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m9.239 13.938-2.88-1.663a.75.75 0 0 1 .75-1.3L9 12.067V4.75a.75.75 0 1 1 1.5 0v7.318l1.89-1.093a.75.75 0 0 1 .75 1.3l-2.879 1.663a.752.752 0 0 1-.511.187.752.752 0 0 1-.511-.187zM4.25 17a.75.75 0 1 1 0-1.5h10.5a.75.75 0 0 1 0 1.5H4.25z"/></svg>';var $b='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M9.75 11.875a.752.752 0 0 1 .508.184l2.883 1.666a.75.75 0 0 1-.659 1.344l-.091-.044-1.892-1.093.001 4.318a.75.75 0 1 1-1.5 0v-4.317l-1.89 1.092a.75.75 0 0 1-.75-1.3l2.879-1.663a.752.752 0 0 1 .51-.187zM15.25 9a.75.75 0 1 1 0 1.5H4.75a.75.75 0 1 1 0-1.5h10.5zM9.75.375a.75.75 0 0 1 .75.75v4.318l1.89-1.093.092-.045a.75.75 0 0 1 .659 1.344l-2.883 1.667a.752.752 0 0 1-.508.184.752.752 0 0 1-.511-.187L6.359 5.65a.75.75 0 0 1 .75-1.299L9 5.442V1.125a.75.75 0 0 1 .75-.75z"/></svg>';var Jb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m10.261 7.062 2.88 1.663a.75.75 0 0 1-.75 1.3L10.5 8.933v7.317a.75.75 0 1 1-1.5 0V8.932l-1.89 1.093a.75.75 0 0 1-.75-1.3l2.879-1.663a.752.752 0 0 1 .511-.187.752.752 0 0 1 .511.187zM15.25 4a.75.75 0 1 1 0 1.5H4.75a.75.75 0 0 1 0-1.5h10.5z"/></svg>';var Yb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 4c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75z"/></svg>';var Qb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm2.286 4c0 .414.336.75.75.75h9.928a.75.75 0 1 0 0-1.5H5.036a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h9.928a.75.75 0 1 0 0-1.5H5.036a.75.75 0 0 0-.75.75z"/></svg>';var Xb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M18 3.75a.75.75 0 0 1-.75.75H2.75a.75.75 0 1 1 0-1.5h14.5a.75.75 0 0 1 .75.75zm0 8a.75.75 0 0 1-.75.75H2.75a.75.75 0 1 1 0-1.5h14.5a.75.75 0 0 1 .75.75zm0 4a.75.75 0 0 1-.75.75H7.321a.75.75 0 1 1 0-1.5h9.929a.75.75 0 0 1 .75.75zm0-8a.75.75 0 0 1-.75.75H7.321a.75.75 0 1 1 0-1.5h9.929a.75.75 0 0 1 .75.75z"/></svg>';var Zb='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 4c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75z"/></svg>';var tk='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M18 4.5V3H2v1.5h16zm0 3V6h-5.674v1.5H18zm0 3V9h-5.674v1.5H18zm0 3V12h-5.674v1.5H18zm-8.5-6V12h-6V7.5h6zm.818-1.5H2.682C2.305 6 2 6.407 2 6.91v5.68c0 .503.305.91.682.91h7.636c.377 0 .682-.407.682-.91V6.91c0-.503-.305-.91-.682-.91zM18 16.5V15H2v1.5h16z"/></svg>';var ek='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 4.5V3h16v1.5zm4.5 3V12h7V7.5h-7zM5.758 6h8.484c.419 0 .758.407.758.91v5.681c0 .502-.34.909-.758.909H5.758c-.419 0-.758-.407-.758-.91V6.91c0-.503.34-.91.758-.91zM2 16.5V15h16v1.5z"/></svg>';var nk='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 4.5V3h16v1.5zm0 3V6h5.674v1.5zm0 3V9h5.674v1.5zm0 3V12h5.674v1.5zm8.5-6V12h6V7.5h-6zM9.682 6h7.636c.377 0 .682.407.682.91v5.68c0 .503-.305.91-.682.91H9.682c-.377 0-.682-.407-.682-.91V6.91c0-.503.305-.91.682-.91zM2 16.5V15h16v1.5z"/></svg>';var ok='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 4.5V3h16v1.5zm2.5 3V12h11V7.5h-11zM4.061 6H15.94c.586 0 1.061.407 1.061.91v5.68c0 .503-.475.91-1.061.91H4.06c-.585 0-1.06-.407-1.06-.91V6.91C3 6.406 3.475 6 4.061 6zM2 16.5V15h16v1.5z"/></svg>';var ik='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M2.5 17v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zM1 15.5v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm0-2v1h-1v-1h1zm-19 0v1H0v-1h1zM14.5 2v1h-1V2h1zm2 0v1h-1V2h1zm2 0v1h-1V2h1zm-8 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm8 0v1h-1V2h1zm-10 0v1h-1V2h1z"/><path d="M18.095 2H1.905C.853 2 0 2.895 0 4v12c0 1.105.853 2 1.905 2h16.19C19.147 18 20 17.105 20 16V4c0-1.105-.853-2-1.905-2zm0 1.5c.263 0 .476.224.476.5v12c0 .276-.213.5-.476.5H1.905a.489.489 0 0 1-.476-.5V4c0-.276.213-.5.476-.5h16.19z"/></svg>';var rk='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M2.5 17v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zM1 15.5v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm0-2v1h-1v-1h1zm-19 0v1H0v-1h1zM14.5 2v1h-1V2h1zm2 0v1h-1V2h1zm2 0v1h-1V2h1zm-8 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm8 0v1h-1V2h1zm-10 0v1h-1V2h1z"/><path d="M13 6H2a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2zm0 1.5a.5.5 0 0 1 .5.5v8a.5.5 0 0 1-.5.5H2a.5.5 0 0 1-.5-.5V8a.5.5 0 0 1 .5-.5h11z"/></svg>';var sk='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M2.5 17v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zM1 15.5v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm0-2v1h-1v-1h1zm-19 0v1H0v-1h1zM14.5 2v1h-1V2h1zm2 0v1h-1V2h1zm2 0v1h-1V2h1zm-8 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm8 0v1h-1V2h1zm-10 0v1h-1V2h1z"/><path d="M7 10H2a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h5a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2zm0 1.5a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5H2a.5.5 0 0 1-.5-.5v-4a.5.5 0 0 1 .5-.5h5z"/></svg>';var ak='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M2.5 17v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zM1 15.5v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm0-2v1h-1v-1h1zm-19 0v1H0v-1h1zM14.5 2v1h-1V2h1zm2 0v1h-1V2h1zm2 0v1h-1V2h1zm-8 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm8 0v1h-1V2h1zm-10 0v1h-1V2h1z"/><path d="M10 8H2a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2zm0 1.5a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-.5.5H2a.5.5 0 0 1-.5-.5v-6a.5.5 0 0 1 .5-.5h8z"/></svg>';var ck='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m7.3 17.37-.061.088a1.518 1.518 0 0 1-.934.535l-4.178.663-.806-4.153a1.495 1.495 0 0 1 .187-1.058l.056-.086L8.77 2.639c.958-1.351 2.803-1.076 4.296-.03 1.497 1.047 2.387 2.693 1.433 4.055L7.3 17.37zM9.14 4.728l-5.545 8.346 3.277 2.294 5.544-8.346L9.14 4.728zM6.07 16.512l-3.276-2.295.53 2.73 2.746-.435zM9.994 3.506 13.271 5.8c.316-.452-.16-1.333-1.065-1.966-.905-.634-1.895-.78-2.212-.328zM8 18.5 9.375 17H19v1.5H8z"/></svg>';var lk='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.999 2H15a1 1 0 0 1 0 2h-1.004v13a1 1 0 1 1-2 0V4H8.999v13a1 1 0 1 1-2 0v-7A4 4 0 0 1 3 6a4 4 0 0 1 3.999-4z"/></svg>';var dk='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 10.423a6.5 6.5 0 0 1 6.056-6.408l.038.67C6.448 5.423 5.354 7.663 5.22 10H9c.552 0 .5.432.5.986v4.511c0 .554-.448.503-1 .503h-5c-.552 0-.5-.449-.5-1.003v-4.574zm8 0a6.5 6.5 0 0 1 6.056-6.408l.038.67c-2.646.739-3.74 2.979-3.873 5.315H17c.552 0 .5.432.5.986v4.511c0 .554-.448.503-1 .503h-5c-.552 0-.5-.449-.5-1.003v-4.574z"/></svg>';var uk='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><circle cx="9.5" cy="4.5" r="1.5"/><circle cx="9.5" cy="10.5" r="1.5"/><circle cx="9.5" cy="16.5" r="1.5"/></svg>';const hk={cancel:Hb,caption:Kb,check:qb,eraser:jb,lowVision:Wb,image:Gb,alignBottom:Ub,alignMiddle:$b,alignTop:Jb,alignLeft:Yb,alignCenter:Qb,alignRight:Xb,alignJustify:Zb,objectLeft:tk,objectCenter:ek,objectRight:nk,objectFullWidth:ok,objectSizeFull:ik,objectSizeLarge:rk,objectSizeSmall:sk,objectSizeMedium:ak,pencil:ck,pilcrow:lk,quote:dk,threeVerticalDots:uk};function fk({emitter:t,activator:e,callback:n,contextElements:o}){t.listenTo(document,"mousedown",((t,i)=>{if(!e()){return}const r=typeof i.composedPath=="function"?i.composedPath():[];for(const t of o){if(t.contains(i.target)||r.includes(t)){return}}n()}))}function mk(t){t.set("_isCssTransitionsDisabled",false);t.disableCssTransitions=()=>{t._isCssTransitionsDisabled=true};t.enableCssTransitions=()=>{t._isCssTransitionsDisabled=false};t.extendTemplate({attributes:{class:[t.bindTemplate.if("_isCssTransitionsDisabled","ck-transitions-disabled")]}})}function gk({view:t}){t.listenTo(t.element,"submit",((e,n)=>{n.preventDefault();t.fire("submit")}),{useCapture:true})}class pk extends ka{constructor(t=[]){super(t,{idProperty:"viewUid"});this.on("add",((t,e,n)=>{this._renderViewIntoCollectionParent(e,n)}));this.on("remove",((t,e)=>{if(e.element&&this._parentElement){e.element.remove()}}));this._parentElement=null}destroy(){this.map((t=>t.destroy()))}setParent(t){this._parentElement=t;for(const t of this){this._renderViewIntoCollectionParent(t)}}delegate(...t){if(!t.length||!bk(t)){throw new u["a"]("ui-viewcollection-delegate-wrong-events",this)}return{to:e=>{for(const n of this){for(const o of t){n.delegate(o).to(e)}}this.on("add",((n,o)=>{for(const n of t){o.delegate(n).to(e)}}));this.on("remove",((n,o)=>{for(const n of t){o.stopDelegating(n,e)}}))}}}_renderViewIntoCollectionParent(t,e){if(!t.isRendered){t.render()}if(t.element&&this._parentElement){this._parentElement.insertBefore(t.element,this._parentElement.children[e])}}}function bk(t){return t.every((t=>typeof t=="string"))}var kk=n(1);var wk=n.n(kk);var Ck=n(12);var Ak={injectType:"singletonStyleTag",attributes:{"data-cke":true}};Ak.insert="head";Ak.singleton=true;var _k=wk()(Ck["a"],Ak);var vk=Ck["a"].locals||{};class yk{constructor(t){this.element=null;this.isRendered=false;this.locale=t;this.t=t&&t.t;this._viewCollections=new ka;this._unboundChildren=this.createCollection();this._viewCollections.on("add",((e,n)=>{n.locale=t}));this.decorate("render")}get bindTemplate(){if(this._bindTemplate){return this._bindTemplate}return this._bindTemplate=Ek.bind(this,this)}createCollection(t){const e=new pk(t);this._viewCollections.add(e);return e}registerChild(t){if(!ba(t)){t=[t]}for(const e of t){this._unboundChildren.add(e)}}deregisterChild(t){if(!ba(t)){t=[t]}for(const e of t){this._unboundChildren.remove(e)}}setTemplate(t){this.template=new Ek(t)}extendTemplate(t){Ek.extend(this.template,t)}render(){if(this.isRendered){throw new u["a"]("ui-view-render-already-rendered",this)}if(this.template){this.element=this.template.render();this.registerChild(this.template.getViews())}this.isRendered=true}destroy(){this.stopListening();this._viewCollections.map((t=>t.destroy()));if(this.template&&this.template._revertData){this.template.revert(this.element)}}}Hn(yk,bu);Hn(yk,Tn);const xk="http://www.w3.org/1999/xhtml";class Ek{constructor(t){Object.assign(this,Nk(Ok(t)));this._isRendered=false;this._revertData=null}render(){const t=this._renderNode({intoFragment:true});this._isRendered=true;return t}apply(t){this._revertData=Yk();this._renderNode({node:t,isApplying:true,revertData:this._revertData});return t}revert(t){if(!this._revertData){throw new u["a"]("ui-template-revert-not-applied",[this,t])}this._revertTemplateFromNode(t,this._revertData)}*getViews(){function*t(e){if(e.children){for(const n of e.children){if(Uk(n)){yield n}else if($k(n)){yield*t(n)}}}}yield*t(this)}static bind(t,e){return{to(n,o){return new Sk({eventNameOrFunction:n,attribute:n,observable:t,emitter:e,callback:o})},if(n,o,i){return new Bk({observable:t,emitter:e,attribute:n,valueIfTrue:o,callback:i})}}}static extend(t,e){if(t._isRendered){throw new u["a"]("template-extend-render",[this,t])}Wk(t,Nk(Ok(e)))}_renderNode(t){let e;if(t.node){e=this.tag&&this.text}else{e=this.tag?this.text:!this.text}if(e){throw new u["a"]("ui-template-wrong-syntax",this)}if(this.text){return this._renderText(t)}else{return this._renderElement(t)}}_renderElement(t){let e=t.node;if(!e){e=t.node=document.createElementNS(this.ns||xk,this.tag)}this._renderAttributes(t);this._renderElementChildren(t);this._setUpListeners(t);return e}_renderText(t){let e=t.node;if(e){t.revertData.text=e.textContent}else{e=t.node=document.createTextNode("")}if(Tk(this.text)){this._bindToObservable({schema:this.text,updater:Rk(e),data:t})}else{e.textContent=this.text.join("")}return e}_renderAttributes(t){let e,n,o,i;if(!this.attributes){return}const r=t.node;const s=t.revertData;for(e in this.attributes){o=r.getAttribute(e);n=this.attributes[e];if(s){s.attributes[e]=o}i=S(n[0])&&n[0].ns?n[0].ns:null;if(Tk(n)){const a=i?n[0].value:n;if(s&&Qk(e)){a.unshift(o)}this._bindToObservable({schema:a,updater:Fk(r,e,i),data:t})}else if(e=="style"&&typeof n[0]!=="string"){this._renderStyleAttribute(n[0],t)}else{if(s&&o&&Qk(e)){n.unshift(o)}n=n.map((t=>t?t.value||t:t)).reduce(((t,e)=>t.concat(e)),[]).reduce(qk,"");if(!Gk(n)){r.setAttributeNS(i,e,n)}}}}_renderStyleAttribute(t,e){const n=e.node;for(const o in t){const i=t[o];if(Tk(i)){this._bindToObservable({schema:[i],updater:zk(n,o),data:e})}else{n.style[o]=i}}}_renderElementChildren(t){const e=t.node;const n=t.intoFragment?document.createDocumentFragment():e;const o=t.isApplying;let i=0;for(const r of this.children){if(Jk(r)){if(!o){r.setParent(e);for(const t of r){n.appendChild(t.element)}}}else if(Uk(r)){if(!o){if(!r.isRendered){r.render()}n.appendChild(r.element)}}else if(Yd(r)){n.appendChild(r)}else{if(o){const e=t.revertData;const o=Yk();e.children.push(o);r._renderNode({node:n.childNodes[i++],isApplying:true,revertData:o})}else{n.appendChild(r.render())}}}if(t.intoFragment){e.appendChild(n)}}_setUpListeners(t){if(!this.eventListeners){return}for(const e in this.eventListeners){const n=this.eventListeners[e].map((n=>{const[o,i]=e.split("@");return n.activateDomEventListener(o,i,t)}));if(t.revertData){t.revertData.bindings.push(n)}}}_bindToObservable({schema:t,updater:e,data:n}){const o=n.revertData;Ik(t,e,n);const i=t.filter((t=>!Gk(t))).filter((t=>t.observable)).map((o=>o.activateAttributeListener(t,e,n)));if(o){o.bindings.push(i)}}_revertTemplateFromNode(t,e){for(const t of e.bindings){for(const e of t){e()}}if(e.text){t.textContent=e.text;return}for(const n in e.attributes){const o=e.attributes[n];if(o===null){t.removeAttribute(n)}else{t.setAttribute(n,o)}}for(let n=0;n<e.children.length;++n){this._revertTemplateFromNode(t.childNodes[n],e.children[n])}}}Hn(Ek,g);class Dk{constructor(t){Object.assign(this,t)}getValue(t){const e=this.observable[this.attribute];return this.callback?this.callback(e,t):e}activateAttributeListener(t,e,n){const o=()=>Ik(t,e,n);this.emitter.listenTo(this.observable,"change:"+this.attribute,o);return()=>{this.emitter.stopListening(this.observable,"change:"+this.attribute,o)}}}class Sk extends Dk{activateDomEventListener(t,e,n){const o=(t,n)=>{if(!e||n.target.matches(e)){if(typeof this.eventNameOrFunction=="function"){this.eventNameOrFunction(n)}else{this.observable.fire(this.eventNameOrFunction,n)}}};this.emitter.listenTo(n.node,t,o);return()=>{this.emitter.stopListening(n.node,t,o)}}}class Bk extends Dk{getValue(t){const e=super.getValue(t);return Gk(e)?false:this.valueIfTrue||true}}function Tk(t){if(!t){return false}if(t.value){t=t.value}if(Array.isArray(t)){return t.some(Tk)}else if(t instanceof Dk){return true}return false}function Pk(t,e){return t.map((t=>{if(t instanceof Dk){return t.getValue(e)}return t}))}function Ik(t,e,{node:n}){let o=Pk(t,n);if(t.length==1&&t[0]instanceof Bk){o=o[0]}else{o=o.reduce(qk,"")}if(Gk(o)){e.remove()}else{e.set(o)}}function Rk(t){return{set(e){t.textContent=e},remove(){t.textContent=""}}}function Fk(t,e,n){return{set(o){t.setAttributeNS(n,e,o)},remove(){t.removeAttributeNS(n,e)}}}function zk(t,e){return{set(n){t.style[e]=n},remove(){t.style[e]=null}}}function Ok(t){const e=ua(t,(t=>{if(t&&(t instanceof Dk||$k(t)||Uk(t)||Jk(t))){return t}}));return e}function Nk(t){if(typeof t=="string"){t=Lk(t)}else if(t.text){Hk(t)}if(t.on){t.eventListeners=Vk(t.on);delete t.on}if(!t.text){if(t.attributes){Mk(t.attributes)}const e=[];if(t.children){if(Jk(t.children)){e.push(t.children)}else{for(const n of t.children){if($k(n)||Uk(n)||Yd(n)){e.push(n)}else{e.push(new Ek(n))}}}}t.children=e}return t}function Mk(t){for(const e in t){if(t[e].value){t[e].value=Ca(t[e].value)}Kk(t,e)}}function Vk(t){for(const e in t){Kk(t,e)}return t}function Lk(t){return{text:[t]}}function Hk(t){t.text=Ca(t.text)}function Kk(t,e){t[e]=Ca(t[e])}function qk(t,e){if(Gk(e)){return t}else if(Gk(t)){return e}else{return`${t} ${e}`}}function jk(t,e){for(const n in e){if(t[n]){t[n].push(...e[n])}else{t[n]=e[n]}}}function Wk(t,e){if(e.attributes){if(!t.attributes){t.attributes={}}jk(t.attributes,e.attributes)}if(e.eventListeners){if(!t.eventListeners){t.eventListeners={}}jk(t.eventListeners,e.eventListeners)}if(e.text){t.text.push(...e.text)}if(e.children&&e.children.length){if(t.children.length!=e.children.length){throw new u["a"]("ui-template-extend-children-mismatch",t)}let n=0;for(const o of e.children){Wk(t.children[n++],o)}}}function Gk(t){return!t&&t!==0}function Uk(t){return t instanceof yk}function $k(t){return t instanceof Ek}function Jk(t){return t instanceof pk}function Yk(){return{children:[],bindings:[],attributes:{}}}function Qk(t){return t=="class"||t=="style"}class Xk extends pk{constructor(t,e=[]){super(e);this.locale=t}attachToDom(){this._bodyCollectionContainer=new Ek({tag:"div",attributes:{class:["ck","ck-reset_all","ck-body","ck-rounded-corners"],dir:this.locale.uiLanguageDirection},children:this}).render();let t=document.querySelector(".ck-body-wrapper");if(!t){t=Zh(document,"div",{class:"ck-body-wrapper"});document.body.appendChild(t)}t.appendChild(this._bodyCollectionContainer)}detachFromDom(){super.destroy();if(this._bodyCollectionContainer){this._bodyCollectionContainer.remove()}const t=document.querySelector(".ck-body-wrapper");if(t&&t.childElementCount==0){t.remove()}}}var Zk=n(13);var tw={injectType:"singletonStyleTag",attributes:{"data-cke":true}};tw.insert="head";tw.singleton=true;var ew=wk()(Zk["a"],tw);var nw=Zk["a"].locals||{};class ow extends yk{constructor(){super();const t=this.bindTemplate;this.set("content","");this.set("viewBox","0 0 20 20");this.set("fillColor","");this.setTemplate({tag:"svg",ns:"http://www.w3.org/2000/svg",attributes:{class:["ck","ck-icon"],viewBox:t.to("viewBox")}})}render(){super.render();this._updateXMLContent();this._colorFillPaths();this.on("change:content",(()=>{this._updateXMLContent();this._colorFillPaths()}));this.on("change:fillColor",(()=>{this._colorFillPaths()}))}_updateXMLContent(){if(this.content){const t=(new DOMParser).parseFromString(this.content.trim(),"image/svg+xml");const e=t.querySelector("svg");const n=e.getAttribute("viewBox");if(n){this.viewBox=n}this.element.innerHTML="";while(e.childNodes.length>0){this.element.appendChild(e.childNodes[0])}}}_colorFillPaths(){if(this.fillColor){this.element.querySelectorAll(".ck-icon__fill").forEach((t=>{t.style.fill=this.fillColor}))}}}var iw=n(14);var rw={injectType:"singletonStyleTag",attributes:{"data-cke":true}};rw.insert="head";rw.singleton=true;var sw=wk()(iw["a"],rw);var aw=iw["a"].locals||{};class cw extends yk{constructor(t){super(t);this.set("text","");this.set("position","s");const e=this.bindTemplate;this.setTemplate({tag:"span",attributes:{class:["ck","ck-tooltip",e.to("position",(t=>"ck-tooltip_"+t)),e.if("text","ck-hidden",(t=>!t.trim()))]},children:[{tag:"span",attributes:{class:["ck","ck-tooltip__text"]},children:[{text:e.to("text")}]}]})}}var lw=n(15);var dw={injectType:"singletonStyleTag",attributes:{"data-cke":true}};dw.insert="head";dw.singleton=true;var uw=wk()(lw["a"],dw);var hw=lw["a"].locals||{};class fw extends yk{constructor(t){super(t);const e=this.bindTemplate;const n=a();this.set("class");this.set("labelStyle");this.set("icon");this.set("isEnabled",true);this.set("isOn",false);this.set("isVisible",true);this.set("isToggleable",false);this.set("keystroke");this.set("label");this.set("tabindex",-1);this.set("tooltip");this.set("tooltipPosition","s");this.set("type","button");this.set("withText",false);this.set("withKeystroke",false);this.children=this.createCollection();this.tooltipView=this._createTooltipView();this.labelView=this._createLabelView(n);this.iconView=new ow;this.iconView.extendTemplate({attributes:{class:"ck-button__icon"}});this.keystrokeView=this._createKeystrokeView();this.bind("_tooltipString").to(this,"tooltip",this,"label",this,"keystroke",this._getTooltipString.bind(this));this.setTemplate({tag:"button",attributes:{class:["ck","ck-button",e.to("class"),e.if("isEnabled","ck-disabled",(t=>!t)),e.if("isVisible","ck-hidden",(t=>!t)),e.to("isOn",(t=>t?"ck-on":"ck-off")),e.if("withText","ck-button_with-text"),e.if("withKeystroke","ck-button_with-keystroke")],type:e.to("type",(t=>t?t:"button")),tabindex:e.to("tabindex"),"aria-labelledby":`ck-editor__aria-label_${n}`,"aria-disabled":e.if("isEnabled",true,(t=>!t)),"aria-pressed":e.to("isOn",(t=>this.isToggleable?String(t):false))},children:this.children,on:{mousedown:e.to((t=>{t.preventDefault()})),click:e.to((t=>{if(this.isEnabled){this.fire("execute")}else{t.preventDefault()}}))}})}render(){super.render();if(this.icon){this.iconView.bind("content").to(this,"icon");this.children.add(this.iconView)}this.children.add(this.tooltipView);this.children.add(this.labelView);if(this.withKeystroke){this.children.add(this.keystrokeView)}}focus(){this.element.focus()}_createTooltipView(){const t=new cw;t.bind("text").to(this,"_tooltipString");t.bind("position").to(this,"tooltipPosition");return t}_createLabelView(t){const e=new yk;const n=this.bindTemplate;e.setTemplate({tag:"span",attributes:{class:["ck","ck-button__label"],style:n.to("labelStyle"),id:`ck-editor__aria-label_${t}`},children:[{text:this.bindTemplate.to("label")}]});return e}_createKeystrokeView(){const t=new yk;t.setTemplate({tag:"span",attributes:{class:["ck","ck-button__keystroke"]},children:[{text:this.bindTemplate.to("keystroke",(t=>id(t)))}]});return t}_getTooltipString(t,e,n){if(t){if(typeof t=="string"){return t}else{if(n){n=id(n)}if(t instanceof Function){return t(e,n)}else{return`${e}${n?` (${n})`:""}`}}}return""}}var mw=n(16);var gw={injectType:"singletonStyleTag",attributes:{"data-cke":true}};gw.insert="head";gw.singleton=true;var pw=wk()(mw["a"],gw);var bw=mw["a"].locals||{};class kw extends fw{constructor(t){super(t);this.isToggleable=true;this.toggleSwitchView=this._createToggleView();this.extendTemplate({attributes:{class:"ck-switchbutton"}})}render(){super.render();this.children.add(this.toggleSwitchView)}_createToggleView(){const t=new yk;t.setTemplate({tag:"span",attributes:{class:["ck","ck-button__toggle"]},children:[{tag:"span",attributes:{class:["ck","ck-button__toggle__inner"]}}]});return t}}function ww(t,e){const n=t.t;const o={Black:n("Black"),"Dim grey":n("Dim grey"),Grey:n("Grey"),"Light grey":n("Light grey"),White:n("White"),Red:n("Red"),Orange:n("Orange"),Yellow:n("Yellow"),"Light green":n("Light green"),Green:n("Green"),Aquamarine:n("Aquamarine"),Turquoise:n("Turquoise"),"Light blue":n("Light blue"),Blue:n("Blue"),Purple:n("Purple")};return e.map((t=>{const e=o[t.label];if(e&&e!=t.label){t.label=e}return t}))}function Cw(t){return t.map(Aw).filter((t=>!!t))}function Aw(t){if(typeof t==="string"){return{model:t,label:t,hasBorder:false,view:{name:"span",styles:{color:t}}}}else{return{model:t.color,label:t.label||t.color,hasBorder:t.hasBorder===undefined?false:t.hasBorder,view:{name:"span",styles:{color:`${t.color}`}}}}}var _w='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path class="ck-icon__fill" d="M16.935 5.328a2 2 0 0 1 0 2.829l-7.778 7.778a2 2 0 0 1-2.829 0L3.5 13.107a1.999 1.999 0 1 1 2.828-2.829l.707.707a1 1 0 0 0 1.414 0l5.658-5.657a2 2 0 0 1 2.828 0z"/><path d="M14.814 6.035 8.448 12.4a1 1 0 0 1-1.414 0l-1.413-1.415A1 1 0 1 0 4.207 12.4l2.829 2.829a1 1 0 0 0 1.414 0l7.778-7.778a1 1 0 1 0-1.414-1.415z"/></svg>';class vw extends fw{constructor(t){super(t);const e=this.bindTemplate;this.set("color");this.set("hasBorder");this.icon=_w;this.extendTemplate({attributes:{style:{backgroundColor:e.to("color")},class:["ck","ck-color-grid__tile",e.if("hasBorder","ck-color-table__color-tile_bordered")]}})}render(){super.render();this.iconView.fillColor="hsl(0, 0%, 100%)"}}class yw{constructor(t){Object.assign(this,t);if(t.actions&&t.keystrokeHandler){for(const e in t.actions){let n=t.actions[e];if(typeof n=="string"){n=[n]}for(const o of n){t.keystrokeHandler.set(o,((t,n)=>{this[e]();n()}))}}}}get first(){return this.focusables.find(xw)||null}get last(){return this.focusables.filter(xw).slice(-1)[0]||null}get next(){return this._getFocusableItem(1)}get previous(){return this._getFocusableItem(-1)}get current(){let t=null;if(this.focusTracker.focusedElement===null){return null}this.focusables.find(((e,n)=>{const o=e.element===this.focusTracker.focusedElement;if(o){t=n}return o}));return t}focusFirst(){this._focus(this.first)}focusLast(){this._focus(this.last)}focusNext(){this._focus(this.next)}focusPrevious(){this._focus(this.previous)}_focus(t){if(t){t.focus()}}_getFocusableItem(t){const e=this.current;const n=this.focusables.length;if(!n){return null}if(e===null){return this[t===1?"first":"last"]}let o=(e+n+t)%n;do{const e=this.focusables.get(o);if(xw(e)){return e}o=(o+n+t)%n}while(o!==e);return null}}function xw(t){return!!(t.focus&&ru.window.getComputedStyle(t.element).display!="none")}var Ew=n(17);var Dw={injectType:"singletonStyleTag",attributes:{"data-cke":true}};Dw.insert="head";Dw.singleton=true;var Sw=wk()(Ew["a"],Dw);var Bw=Ew["a"].locals||{};class Tw extends yk{constructor(t,e){super(t);const n=e&&e.colorDefinitions||[];const o={};if(e&&e.columns){o.gridTemplateColumns=`repeat( ${e.columns}, 1fr)`}this.set("selectedColor");this.items=this.createCollection();this.focusTracker=new mf;this.keystrokes=new gf;this._focusCycler=new yw({focusables:this.items,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"arrowleft",focusNext:"arrowright"}});this.items.on("add",((t,e)=>{e.isOn=e.color===this.selectedColor}));n.forEach((t=>{const e=new vw;e.set({color:t.color,label:t.label,tooltip:true,hasBorder:t.options.hasBorder});e.on("execute",(()=>{this.fire("execute",{value:t.color,hasBorder:t.options.hasBorder,label:t.label})}));this.items.add(e)}));this.setTemplate({tag:"div",children:this.items,attributes:{class:["ck","ck-color-grid"],style:o}});this.on("change:selectedColor",((t,e,n)=>{for(const t of this.items){t.isOn=t.color===n}}))}focus(){if(this.items.length){this.items.first.focus()}}focusLast(){if(this.items.length){this.items.last.focus()}}render(){super.render();for(const t of this.items){this.focusTracker.add(t.element)}this.items.on("add",((t,e)=>{this.focusTracker.add(e.element)}));this.items.on("remove",((t,e)=>{this.focusTracker.remove(e.element)}));this.keystrokes.listenTo(this.element)}}var Pw='<svg viewBox="0 0 10 10" xmlns="http://www.w3.org/2000/svg"><path d="M.941 4.523a.75.75 0 1 1 1.06-1.06l3.006 3.005 3.005-3.005a.75.75 0 1 1 1.06 1.06l-3.549 3.55a.75.75 0 0 1-1.168-.136L.941 4.523z"/></svg>';class Iw extends fw{constructor(t){super(t);this.arrowView=this._createArrowView();this.extendTemplate({attributes:{"aria-haspopup":true}});this.delegate("execute").to(this,"open")}render(){super.render();this.children.add(this.arrowView)}_createArrowView(){const t=new ow;t.content=Pw;t.extendTemplate({attributes:{class:"ck-dropdown__arrow"}});return t}}var Rw=n(18);var Fw={injectType:"singletonStyleTag",attributes:{"data-cke":true}};Fw.insert="head";Fw.singleton=true;var zw=wk()(Rw["a"],Fw);var Ow=Rw["a"].locals||{};class Nw extends yk{constructor(t){super(t);const e=this.bindTemplate;this.set("icon");this.set("isEnabled",true);this.set("isOn",false);this.set("isToggleable",false);this.set("isVisible",true);this.set("keystroke");this.set("label");this.set("tabindex",-1);this.set("tooltip");this.set("tooltipPosition","s");this.set("type","button");this.set("withText",false);this.children=this.createCollection();this.actionView=this._createActionView();this.arrowView=this._createArrowView();this.keystrokes=new gf;this.focusTracker=new mf;this.setTemplate({tag:"div",attributes:{class:["ck","ck-splitbutton",e.if("isVisible","ck-hidden",(t=>!t)),this.arrowView.bindTemplate.if("isOn","ck-splitbutton_open")]},children:this.children})}render(){super.render();this.children.add(this.actionView);this.children.add(this.arrowView);this.focusTracker.add(this.actionView.element);this.focusTracker.add(this.arrowView.element);this.keystrokes.listenTo(this.element);this.keystrokes.set("arrowright",((t,e)=>{if(this.focusTracker.focusedElement===this.actionView.element){this.arrowView.focus();e()}}));this.keystrokes.set("arrowleft",((t,e)=>{if(this.focusTracker.focusedElement===this.arrowView.element){this.actionView.focus();e()}}))}focus(){this.actionView.focus()}_createActionView(){const t=new fw;t.bind("icon","isEnabled","isOn","isToggleable","keystroke","label","tabindex","tooltip","tooltipPosition","type","withText").to(this);t.extendTemplate({attributes:{class:"ck-splitbutton__action"}});t.delegate("execute").to(this);return t}_createArrowView(){const t=new fw;const e=t.bindTemplate;t.icon=Pw;t.extendTemplate({attributes:{class:"ck-splitbutton__arrow","aria-haspopup":true,"aria-expanded":e.to("isOn",(t=>String(t)))}});t.bind("isEnabled").to(this);t.delegate("execute").to(this,"open");return t}}class Mw extends yk{constructor(t){super(t);const e=this.bindTemplate;this.set("isVisible",false);this.set("position","se");this.children=this.createCollection();this.setTemplate({tag:"div",attributes:{class:["ck","ck-reset","ck-dropdown__panel",e.to("position",(t=>`ck-dropdown__panel_${t}`)),e.if("isVisible","ck-dropdown__panel-visible")]},children:this.children,on:{selectstart:e.to((t=>t.preventDefault()))}})}focus(){if(this.children.length){this.children.first.focus()}}focusLast(){if(this.children.length){const t=this.children.last;if(typeof t.focusLast==="function"){t.focusLast()}else{t.focus()}}}}var Vw=n(19);var Lw={injectType:"singletonStyleTag",attributes:{"data-cke":true}};Lw.insert="head";Lw.singleton=true;var Hw=wk()(Vw["a"],Lw);var Kw=Vw["a"].locals||{};function qw(t){if(!t||!t.parentNode){return null}if(t.offsetParent===ru.document.body){return null}return t.offsetParent}function jw({element:t,target:e,positions:n,limiter:o,fitInViewport:i}){if(X(e)){e=e()}if(X(o)){o=o()}const r=qw(t);const s=new rf(t);const a=new rf(e);let c;let l;if(!o&&!i){[l,c]=Ww(n[0],a,s)}else{const t=o&&new rf(o).getVisible();const e=i&&new rf(ru.window);const r=Gw(n,{targetRect:a,elementRect:s,limiterRect:t,viewportRect:e});[l,c]=r||Ww(n[0],a,s)}let d=Yw(c);if(r){d=Jw(d,r)}return{left:d.left,top:d.top,name:l}}function Ww(t,e,n){const o=t(e,n);if(!o){return null}const{left:i,top:r,name:s}=o;return[s,n.clone().moveTo(i,r)]}function Gw(t,e){const{elementRect:n,viewportRect:o}=e;const i=n.getArea();const r=Uw(t,e);if(o){const t=r.filter((({viewportIntersectArea:t})=>t===i));const e=$w(t,i);if(e){return e}}return $w(r,i)}function Uw(t,{targetRect:e,elementRect:n,limiterRect:o,viewportRect:i}){const r=[];const s=n.getArea();for(const a of t){const t=Ww(a,e,n);if(!t){continue}const[c,l]=t;let d=0;let u=0;if(o){if(i){const t=o.getIntersection(i);if(t){d=t.getIntersectionArea(l)}}else{d=o.getIntersectionArea(l)}}if(i){u=i.getIntersectionArea(l)}const h={positionName:c,positionRect:l,limiterIntersectArea:d,viewportIntersectArea:u};if(d===s){return[h]}r.push(h)}return r}function $w(t,e){let n=0;let o;let i;for(const{positionName:r,positionRect:s,limiterIntersectArea:a,viewportIntersectArea:c}of t){if(a===e){return[r,s]}const t=c**2+a**2;if(t>n){n=t;o=s;i=r}}return o?[i,o]:null}function Jw({left:t,top:e},n){const o=Yw(new rf(n));const i=nf(n);t-=o.left;e-=o.top;t+=n.scrollLeft;e+=n.scrollTop;t-=i.left;e-=i.top;return{left:t,top:e}}function Yw({left:t,top:e}){const{scrollX:n,scrollY:o}=ru.window;return{left:t+n,top:e+o}}class Qw extends yk{constructor(t,e,n){super(t);const o=this.bindTemplate;this.buttonView=e;this.panelView=n;this.set("isOpen",false);this.set("isEnabled",true);this.set("class");this.set("id");this.set("panelPosition","auto");this.keystrokes=new gf;this.setTemplate({tag:"div",attributes:{class:["ck","ck-dropdown",o.to("class"),o.if("isEnabled","ck-disabled",(t=>!t))],id:o.to("id"),"aria-describedby":o.to("ariaDescribedById")},children:[e,n]});e.extendTemplate({attributes:{class:["ck-dropdown__button"]}})}render(){super.render();this.listenTo(this.buttonView,"open",(()=>{this.isOpen=!this.isOpen}));this.panelView.bind("isVisible").to(this,"isOpen");this.on("change:isOpen",(()=>{if(!this.isOpen){return}if(this.panelPosition==="auto"){this.panelView.position=Qw._getOptimalPosition({element:this.panelView.element,target:this.buttonView.element,fitInViewport:true,positions:this._panelPositions}).name}else{this.panelView.position=this.panelPosition}}));this.keystrokes.listenTo(this.element);const t=(t,e)=>{if(this.isOpen){this.buttonView.focus();this.isOpen=false;e()}};this.keystrokes.set("arrowdown",((t,e)=>{if(this.buttonView.isEnabled&&!this.isOpen){this.isOpen=true;e()}}));this.keystrokes.set("arrowright",((t,e)=>{if(this.isOpen){e()}}));this.keystrokes.set("arrowleft",t);this.keystrokes.set("esc",t)}focus(){this.buttonView.focus()}get _panelPositions(){const{south:t,north:e,southEast:n,southWest:o,northEast:i,northWest:r,southMiddleEast:s,southMiddleWest:a,northMiddleEast:c,northMiddleWest:l}=Qw.defaultPanelPositions;if(this.locale.uiLanguageDirection!=="rtl"){return[n,o,s,a,t,i,r,c,l,e]}else{return[o,n,a,s,t,r,i,l,c,e]}}}Qw.defaultPanelPositions={south:(t,e)=>({top:t.bottom,left:t.left-(e.width-t.width)/2,name:"s"}),southEast:t=>({top:t.bottom,left:t.left,name:"se"}),southWest:(t,e)=>({top:t.bottom,left:t.left-e.width+t.width,name:"sw"}),southMiddleEast:(t,e)=>({top:t.bottom,left:t.left-(e.width-t.width)/4,name:"sme"}),southMiddleWest:(t,e)=>({top:t.bottom,left:t.left-(e.width-t.width)*3/4,name:"smw"}),north:(t,e)=>({top:t.top-e.height,left:t.left-(e.width-t.width)/2,name:"n"}),northEast:(t,e)=>({top:t.top-e.height,left:t.left,name:"ne"}),northWest:(t,e)=>({top:t.top-e.height,left:t.left-e.width+t.width,name:"nw"}),northMiddleEast:(t,e)=>({top:t.top-e.height,left:t.left-(e.width-t.width)/4,name:"nme"}),northMiddleWest:(t,e)=>({top:t.top-e.height,left:t.left-(e.width-t.width)*3/4,name:"nmw"})};Qw._getOptimalPosition=jw;class Xw extends yk{constructor(t){super(t);this.setTemplate({tag:"span",attributes:{class:["ck","ck-toolbar__separator"]}})}}class Zw extends yk{constructor(t){super(t);this.setTemplate({tag:"span",attributes:{class:["ck","ck-toolbar__line-break"]}})}}function tC(t){return t.bindTemplate.to((e=>{if(e.target===t.element){e.preventDefault()}}))}function eC(t){if(Array.isArray(t)){return{items:t,removeItems:[]}}if(!t){return{items:[],removeItems:[]}}return Object.assign({items:[],removeItems:[]},t)}var nC=n(20);var oC={injectType:"singletonStyleTag",attributes:{"data-cke":true}};oC.insert="head";oC.singleton=true;var iC=wk()(nC["a"],oC);var rC=nC["a"].locals||{};class sC extends yk{constructor(t,e){super(t);const n=this.bindTemplate;const o=this.t;this.options=e||{};this.set("ariaLabel",o("Editor toolbar"));this.set("maxWidth","auto");this.items=this.createCollection();this.focusTracker=new mf;this.keystrokes=new gf;this.set("class");this.set("isCompact",false);this.itemsView=new aC(t);this.children=this.createCollection();this.children.add(this.itemsView);this.focusables=this.createCollection();this._focusCycler=new yw({focusables:this.focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:["arrowleft","arrowup"],focusNext:["arrowright","arrowdown"]}});const i=["ck","ck-toolbar",n.to("class"),n.if("isCompact","ck-toolbar_compact")];if(this.options.shouldGroupWhenFull&&this.options.isFloating){i.push("ck-toolbar_floating")}this.setTemplate({tag:"div",attributes:{class:i,role:"toolbar","aria-label":n.to("ariaLabel"),style:{maxWidth:n.to("maxWidth")}},children:this.children,on:{mousedown:tC(this)}});this._behavior=this.options.shouldGroupWhenFull?new lC(this):new cC(this)}render(){super.render();for(const t of this.items){this.focusTracker.add(t.element)}this.items.on("add",((t,e)=>{this.focusTracker.add(e.element)}));this.items.on("remove",((t,e)=>{this.focusTracker.remove(e.element)}));this.keystrokes.listenTo(this.element);this._behavior.render(this)}destroy(){this._behavior.destroy();return super.destroy()}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}fillFromConfig(t,e){const n=eC(t);const o=n.items.filter(((t,o,i)=>{if(t==="|"){return true}if(n.removeItems.indexOf(t)!==-1){return false}if(t==="-"){if(this.options.shouldGroupWhenFull){Object(u["b"])("toolbarview-line-break-ignored-when-grouping-items",i);return false}return true}if(!e.has(t)){Object(u["b"])("toolbarview-item-unavailable",{name:t});return false}return true}));const i=this._cleanSeparators(o).map((t=>{if(t==="|"){return new Xw}else if(t==="-"){return new Zw}return e.create(t)}));this.items.addMany(i)}_cleanSeparators(t){const e=t=>t!=="-"&&t!=="|";const n=t.length;const o=t.findIndex(e);const i=n-t.slice().reverse().findIndex(e);return t.slice(o,i).filter(((t,n,o)=>{if(e(t)){return true}const i=n>0&&o[n-1]===t;return!i}))}}class aC extends yk{constructor(t){super(t);this.children=this.createCollection();this.setTemplate({tag:"div",attributes:{class:["ck","ck-toolbar__items"]},children:this.children})}}class cC{constructor(t){const e=t.bindTemplate;t.set("isVertical",false);t.itemsView.children.bindTo(t.items).using((t=>t));t.focusables.bindTo(t.items).using((t=>t));t.extendTemplate({attributes:{class:[e.if("isVertical","ck-toolbar_vertical")]}})}render(){}destroy(){}}class lC{constructor(t){this.view=t;this.viewChildren=t.children;this.viewFocusables=t.focusables;this.viewItemsView=t.itemsView;this.viewFocusTracker=t.focusTracker;this.viewLocale=t.locale;this.ungroupedItems=t.createCollection();this.groupedItems=t.createCollection();this.groupedItemsDropdown=this._createGroupedItemsDropdown();this.resizeObserver=null;this.cachedPadding=null;this.shouldUpdateGroupingOnNextResize=false;t.itemsView.children.bindTo(this.ungroupedItems).using((t=>t));this.ungroupedItems.on("add",this._updateFocusCycleableItems.bind(this));this.ungroupedItems.on("remove",this._updateFocusCycleableItems.bind(this));t.children.on("add",this._updateFocusCycleableItems.bind(this));t.children.on("remove",this._updateFocusCycleableItems.bind(this));t.items.on("change",((t,e)=>{const n=e.index;for(const t of e.removed){if(n>=this.ungroupedItems.length){this.groupedItems.remove(t)}else{this.ungroupedItems.remove(t)}}for(let t=n;t<n+e.added.length;t++){const o=e.added[t-n];if(t>this.ungroupedItems.length){this.groupedItems.add(o,t-this.ungroupedItems.length)}else{this.ungroupedItems.add(o,t)}}this._updateGrouping()}));t.extendTemplate({attributes:{class:["ck-toolbar_grouping"]}})}render(t){this.viewElement=t.element;this._enableGroupingOnResize();this._enableGroupingOnMaxWidthChange(t)}destroy(){this.groupedItemsDropdown.destroy();this.resizeObserver.destroy()}_updateGrouping(){if(!this.viewElement.ownerDocument.body.contains(this.viewElement)){return}if(!this.viewElement.offsetParent){this.shouldUpdateGroupingOnNextResize=true;return}const t=this.groupedItems.length;let e;while(this._areItemsOverflowing){this._groupLastItem();e=true}if(!e&&this.groupedItems.length){while(this.groupedItems.length&&!this._areItemsOverflowing){this._ungroupFirstItem()}if(this._areItemsOverflowing){this._groupLastItem()}}if(this.groupedItems.length!==t){this.view.fire("groupedItemsUpdate")}}get _areItemsOverflowing(){if(!this.ungroupedItems.length){return false}const t=this.viewElement;const e=this.viewLocale.uiLanguageDirection;const n=new rf(t.lastChild);const o=new rf(t);if(!this.cachedPadding){const n=ru.window.getComputedStyle(t);const o=e==="ltr"?"paddingRight":"paddingLeft";this.cachedPadding=Number.parseInt(n[o])}if(e==="ltr"){return n.right>o.right-this.cachedPadding}else{return n.left<o.left+this.cachedPadding}}_enableGroupingOnResize(){let t;this.resizeObserver=new lf(this.viewElement,(e=>{if(!t||t!==e.contentRect.width||this.shouldUpdateGroupingOnNextResize){this.shouldUpdateGroupingOnNextResize=false;this._updateGrouping();t=e.contentRect.width}}));this._updateGrouping()}_enableGroupingOnMaxWidthChange(t){t.on("change:maxWidth",(()=>{this._updateGrouping()}))}_groupLastItem(){if(!this.groupedItems.length){this.viewChildren.add(new Xw);this.viewChildren.add(this.groupedItemsDropdown);this.viewFocusTracker.add(this.groupedItemsDropdown.element)}this.groupedItems.add(this.ungroupedItems.remove(this.ungroupedItems.last),0)}_ungroupFirstItem(){this.ungroupedItems.add(this.groupedItems.remove(this.groupedItems.first));if(!this.groupedItems.length){this.viewChildren.remove(this.groupedItemsDropdown);this.viewChildren.remove(this.viewChildren.last);this.viewFocusTracker.remove(this.groupedItemsDropdown.element)}}_createGroupedItemsDropdown(){const t=this.viewLocale;const e=t.t;const n=xC(t);n.class="ck-toolbar__grouped-dropdown";n.panelPosition=t.uiLanguageDirection==="ltr"?"sw":"se";EC(n,[]);n.buttonView.set({label:e("Show more items"),tooltip:true,tooltipPosition:t.uiLanguageDirection==="rtl"?"se":"sw",icon:hk.threeVerticalDots});n.toolbarView.items.bindTo(this.groupedItems).using((t=>t));return n}_updateFocusCycleableItems(){this.viewFocusables.clear();this.ungroupedItems.map((t=>{this.viewFocusables.add(t)}));if(this.groupedItems.length){this.viewFocusables.add(this.groupedItemsDropdown)}}}var dC=n(21);var uC={injectType:"singletonStyleTag",attributes:{"data-cke":true}};uC.insert="head";uC.singleton=true;var hC=wk()(dC["a"],uC);var fC=dC["a"].locals||{};class mC extends yk{constructor(){super();this.items=this.createCollection();this.focusTracker=new mf;this.keystrokes=new gf;this._focusCycler=new yw({focusables:this.items,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"arrowup",focusNext:"arrowdown"}});this.setTemplate({tag:"ul",attributes:{class:["ck","ck-reset","ck-list"]},children:this.items})}render(){super.render();for(const t of this.items){this.focusTracker.add(t.element)}this.items.on("add",((t,e)=>{this.focusTracker.add(e.element)}));this.items.on("remove",((t,e)=>{this.focusTracker.remove(e.element)}));this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}}class gC extends yk{constructor(t){super(t);this.children=this.createCollection();this.setTemplate({tag:"li",attributes:{class:["ck","ck-list__item"]},children:this.children})}focus(){this.children.first.focus()}}class pC extends yk{constructor(t){super(t);this.setTemplate({tag:"li",attributes:{class:["ck","ck-list__separator"]}})}}var bC=n(22);var kC={injectType:"singletonStyleTag",attributes:{"data-cke":true}};kC.insert="head";kC.singleton=true;var wC=wk()(bC["a"],kC);var CC=bC["a"].locals||{};var AC=n(23);var _C={injectType:"singletonStyleTag",attributes:{"data-cke":true}};_C.insert="head";_C.singleton=true;var vC=wk()(AC["a"],_C);var yC=AC["a"].locals||{};function xC(t,e=Iw){const n=new e(t);const o=new Mw(t);const i=new Qw(t,n,o);n.bind("isEnabled").to(i);if(n instanceof Iw){n.bind("isOn").to(i,"isOpen")}else{n.arrowView.bind("isOn").to(i,"isOpen")}SC(i);return i}function EC(t,e){const n=t.locale;const o=n.t;const i=t.toolbarView=new sC(n);i.set("ariaLabel",o("Dropdown toolbar"));t.extendTemplate({attributes:{class:["ck-toolbar-dropdown"]}});e.map((t=>i.items.add(t)));t.panelView.children.add(i);i.items.delegate("execute").to(t)}function DC(t,e){const n=t.locale;const o=t.listView=new mC(n);o.items.bindTo(e).using((({type:t,model:e})=>{if(t==="separator"){return new pC(n)}else if(t==="button"||t==="switchbutton"){const o=new gC(n);let i;if(t==="button"){i=new fw(n)}else{i=new kw(n)}i.bind(...Object.keys(e)).to(e);i.delegate("execute").to(o);o.children.add(i);return o}}));t.panelView.children.add(o);o.items.delegate("execute").to(t)}function SC(t){BC(t);TC(t);PC(t)}function BC(t){t.on("render",(()=>{fk({emitter:t,activator:()=>t.isOpen,callback:()=>{t.isOpen=false},contextElements:[t.element]})}))}function TC(t){t.on("execute",(e=>{if(e.source instanceof kw){return}t.isOpen=false}))}function PC(t){t.keystrokes.set("arrowdown",((e,n)=>{if(t.isOpen){t.panelView.focus();n()}}));t.keystrokes.set("arrowup",((e,n)=>{if(t.isOpen){t.panelView.focusLast();n()}}))}var IC=n(24);var RC={injectType:"singletonStyleTag",attributes:{"data-cke":true}};RC.insert="head";RC.singleton=true;var FC=wk()(IC["a"],RC);var zC=IC["a"].locals||{};class OC extends yk{constructor(t){super(t);this.body=new Xk(t)}render(){super.render();this.body.attachToDom()}destroy(){this.body.detachFromDom();return super.destroy()}}var NC=n(25);var MC={injectType:"singletonStyleTag",attributes:{"data-cke":true}};MC.insert="head";MC.singleton=true;var VC=wk()(NC["a"],MC);var LC=NC["a"].locals||{};class HC extends yk{constructor(t){super(t);this.set("text");this.set("for");this.id=`ck-editor__label_${a()}`;const e=this.bindTemplate;this.setTemplate({tag:"label",attributes:{class:["ck","ck-label"],id:this.id,for:e.to("for")},children:[{text:e.to("text")}]})}}class KC extends OC{constructor(t){super(t);this.top=this.createCollection();this.main=this.createCollection();this._voiceLabelView=this._createVoiceLabel();this.setTemplate({tag:"div",attributes:{class:["ck","ck-reset","ck-editor","ck-rounded-corners"],role:"application",dir:t.uiLanguageDirection,lang:t.uiLanguage,"aria-labelledby":this._voiceLabelView.id},children:[this._voiceLabelView,{tag:"div",attributes:{class:["ck","ck-editor__top","ck-reset_all"],role:"presentation"},children:this.top},{tag:"div",attributes:{class:["ck","ck-editor__main"],role:"presentation"},children:this.main}]})}_createVoiceLabel(){const t=this.t;const e=new HC;e.text=t("Rich Text Editor");e.extendTemplate({attributes:{class:"ck-voice-label"}});return e}}class qC extends yk{constructor(t,e,n){super(t);this.setTemplate({tag:"div",attributes:{class:["ck","ck-content","ck-editor__editable","ck-rounded-corners"],lang:t.contentLanguage,dir:t.contentLanguageDirection}});this.name=null;this.set("isFocused",false);this._editableElement=n;this._hasExternalElement=!!this._editableElement;this._editingView=e}render(){super.render();if(this._hasExternalElement){this.template.apply(this.element=this._editableElement)}else{this._editableElement=this.element}this.on("change:isFocused",(()=>this._updateIsFocusedClasses()));this._updateIsFocusedClasses()}destroy(){if(this._hasExternalElement){this.template.revert(this._editableElement)}super.destroy()}_updateIsFocusedClasses(){const t=this._editingView;if(t.isRenderingInProgress){n(this)}else{e(this)}function e(e){t.change((n=>{const o=t.document.getRoot(e.name);n.addClass(e.isFocused?"ck-focused":"ck-blurred",o);n.removeClass(e.isFocused?"ck-blurred":"ck-focused",o)}))}function n(o){t.once("change:isRenderingInProgress",((t,i,r)=>{if(!r){e(o)}else{n(o)}}))}}}class jC extends qC{constructor(t,e,n){super(t,e,n);this.extendTemplate({attributes:{role:"textbox",class:"ck-editor__editable_inline"}})}render(){super.render();const t=this._editingView;const e=this.t;t.change((n=>{const o=t.document.getRoot(this.name);n.setAttribute("aria-label",e("Rich Text Editor, %0",this.name),o)}))}}var WC=n(26);var GC={injectType:"singletonStyleTag",attributes:{"data-cke":true}};GC.insert="head";GC.singleton=true;var UC=wk()(WC["a"],GC);var $C=WC["a"].locals||{};class JC extends yk{constructor(t,e={}){super(t);const n=this.bindTemplate;this.set("label",e.label||"");this.set("class",e.class||null);this.children=this.createCollection();this.setTemplate({tag:"div",attributes:{class:["ck","ck-form__header",n.to("class")]},children:this.children});const o=new yk(t);o.setTemplate({tag:"span",attributes:{class:["ck","ck-form__header__label"]},children:[{text:n.to("label")}]});this.children.add(o)}}var YC=n(27);var QC={injectType:"singletonStyleTag",attributes:{"data-cke":true}};QC.insert="head";QC.singleton=true;var XC=wk()(YC["a"],QC);var ZC=YC["a"].locals||{};class tA extends yk{constructor(t){super(t);this.set("value");this.set("id");this.set("placeholder");this.set("isReadOnly",false);this.set("hasError",false);this.set("ariaDescribedById");this.focusTracker=new mf;this.bind("isFocused").to(this.focusTracker);this.set("isEmpty",true);const e=this.bindTemplate;this.setTemplate({tag:"input",attributes:{type:"text",class:["ck","ck-input","ck-input-text",e.if("isFocused","ck-input_focused"),e.if("isEmpty","ck-input-text_empty"),e.if("hasError","ck-error")],id:e.to("id"),placeholder:e.to("placeholder"),readonly:e.to("isReadOnly"),"aria-invalid":e.if("hasError",true),"aria-describedby":e.to("ariaDescribedById")},on:{input:e.to("input"),change:e.to(this._updateIsEmpty.bind(this))}})}render(){super.render();this.focusTracker.add(this.element);this._setDomElementValue(this.value);this._updateIsEmpty();this.on("change:value",((t,e,n)=>{this._setDomElementValue(n);this._updateIsEmpty()}))}select(){this.element.select()}focus(){this.element.focus()}_updateIsEmpty(){this.isEmpty=eA(this.element)}_setDomElementValue(t){this.element.value=!t&&t!==0?"":t}}function eA(t){return!t.value}var nA=n(28);var oA={injectType:"singletonStyleTag",attributes:{"data-cke":true}};oA.insert="head";oA.singleton=true;var iA=wk()(nA["a"],oA);var rA=nA["a"].locals||{};class sA extends yk{constructor(t,e){super(t);const n=`ck-labeled-field-view-${a()}`;const o=`ck-labeled-field-view-status-${a()}`;this.fieldView=e(this,n,o);this.set("label");this.set("isEnabled",true);this.set("isEmpty",true);this.set("isFocused",false);this.set("errorText",null);this.set("infoText",null);this.set("class");this.set("placeholder");this.labelView=this._createLabelView(n);this.statusView=this._createStatusView(o);this.bind("_statusText").to(this,"errorText",this,"infoText",((t,e)=>t||e));const i=this.bindTemplate;this.setTemplate({tag:"div",attributes:{class:["ck","ck-labeled-field-view",i.to("class"),i.if("isEnabled","ck-disabled",(t=>!t)),i.if("isEmpty","ck-labeled-field-view_empty"),i.if("isFocused","ck-labeled-field-view_focused"),i.if("placeholder","ck-labeled-field-view_placeholder"),i.if("errorText","ck-error")]},children:[{tag:"div",attributes:{class:["ck","ck-labeled-field-view__input-wrapper"]},children:[this.fieldView,this.labelView]},this.statusView]})}_createLabelView(t){const e=new HC(this.locale);e.for=t;e.bind("text").to(this,"label");return e}_createStatusView(t){const e=new yk(this.locale);const n=this.bindTemplate;e.setTemplate({tag:"div",attributes:{class:["ck","ck-labeled-field-view__status",n.if("errorText","ck-labeled-field-view__status_error"),n.if("_statusText","ck-hidden",(t=>!t))],id:t,role:n.if("errorText","alert")},children:[{text:n.to("_statusText")}]});return e}focus(){this.fieldView.focus()}}function aA(t,e,n){const o=new tA(t.locale);o.set({id:e,ariaDescribedById:n});o.bind("isReadOnly").to(t,"isEnabled",(t=>!t));o.bind("hasError").to(t,"errorText",(t=>!!t));o.on("input",(()=>{t.errorText=null}));t.bind("isEmpty","isFocused","placeholder").to(o);return o}function cA(t,e,n){const o=xC(t.locale);o.set({id:e,ariaDescribedById:n});o.bind("isEnabled").to(t);return o}class lA extends Pa{static get pluginName(){return"Notification"}init(){this.on("show:warning",((t,e)=>{window.alert(e.message)}),{priority:"lowest"})}showSuccess(t,e={}){this._showNotification({message:t,type:"success",namespace:e.namespace,title:e.title})}showInfo(t,e={}){this._showNotification({message:t,type:"info",namespace:e.namespace,title:e.title})}showWarning(t,e={}){this._showNotification({message:t,type:"warning",namespace:e.namespace,title:e.title})}_showNotification(t){const e=`show:${t.type}`+(t.namespace?`:${t.namespace}`:"");this.fire(e,{message:t.message,type:t.type,title:t.title||""})}}class dA{constructor(t,e){if(e){vn(this,e)}if(t){this.set(t)}}}Hn(dA,Tn);var uA=n(29);var hA={injectType:"singletonStyleTag",attributes:{"data-cke":true}};hA.insert="head";hA.singleton=true;var fA=wk()(uA["a"],hA);var mA=uA["a"].locals||{};const gA=hf("px");const pA=ru.document.body;class bA extends yk{constructor(t){super(t);const e=this.bindTemplate;this.set("top",0);this.set("left",0);this.set("position","arrow_nw");this.set("isVisible",false);this.set("withArrow",true);this.set("class");this.content=this.createCollection();this.setTemplate({tag:"div",attributes:{class:["ck","ck-balloon-panel",e.to("position",(t=>`ck-balloon-panel_${t}`)),e.if("isVisible","ck-balloon-panel_visible"),e.if("withArrow","ck-balloon-panel_with-arrow"),e.to("class")],style:{top:e.to("top",gA),left:e.to("left",gA)}},children:this.content})}show(){this.isVisible=true}hide(){this.isVisible=false}attachTo(t){this.show();const e=bA.defaultPositions;const n=Object.assign({},{element:this.element,positions:[e.southArrowNorth,e.southArrowNorthMiddleWest,e.southArrowNorthMiddleEast,e.southArrowNorthWest,e.southArrowNorthEast,e.northArrowSouth,e.northArrowSouthMiddleWest,e.northArrowSouthMiddleEast,e.northArrowSouthWest,e.northArrowSouthEast],limiter:pA,fitInViewport:true},t);const o=bA._getOptimalPosition(n);const i=parseInt(o.left);const r=parseInt(o.top);const s=o.name;Object.assign(this,{top:r,left:i,position:s})}pin(t){this.unpin();this._pinWhenIsVisibleCallback=()=>{if(this.isVisible){this._startPinning(t)}else{this._stopPinning()}};this._startPinning(t);this.listenTo(this,"change:isVisible",this._pinWhenIsVisibleCallback)}unpin(){if(this._pinWhenIsVisibleCallback){this._stopPinning();this.stopListening(this,"change:isVisible",this._pinWhenIsVisibleCallback);this._pinWhenIsVisibleCallback=null;this.hide()}}_startPinning(t){this.attachTo(t);const e=kA(t.target);const n=t.limiter?kA(t.limiter):pA;this.listenTo(ru.document,"scroll",((o,i)=>{const r=i.target;const s=e&&r.contains(e);const a=n&&r.contains(n);if(s||a||!e||!n){this.attachTo(t)}}),{useCapture:true});this.listenTo(ru.window,"resize",(()=>{this.attachTo(t)}))}_stopPinning(){this.stopListening(ru.document,"scroll");this.stopListening(ru.window,"resize")}}function kA(t){if(fa(t)){return t}if(ef(t)){return t.commonAncestorContainer}if(typeof t=="function"){return kA(t())}return null}bA.arrowHorizontalOffset=25;bA.arrowVerticalOffset=10;bA._getOptimalPosition=jw;bA.defaultPositions={northWestArrowSouthWest:(t,e)=>({top:wA(t,e),left:t.left-bA.arrowHorizontalOffset,name:"arrow_sw"}),northWestArrowSouthMiddleWest:(t,e)=>({top:wA(t,e),left:t.left-e.width*.25-bA.arrowHorizontalOffset,name:"arrow_smw"}),northWestArrowSouth:(t,e)=>({top:wA(t,e),left:t.left-e.width/2,name:"arrow_s"}),northWestArrowSouthMiddleEast:(t,e)=>({top:wA(t,e),left:t.left-e.width*.75+bA.arrowHorizontalOffset,name:"arrow_sme"}),northWestArrowSouthEast:(t,e)=>({top:wA(t,e),left:t.left-e.width+bA.arrowHorizontalOffset,name:"arrow_se"}),northArrowSouthWest:(t,e)=>({top:wA(t,e),left:t.left+t.width/2-bA.arrowHorizontalOffset,name:"arrow_sw"}),northArrowSouthMiddleWest:(t,e)=>({top:wA(t,e),left:t.left+t.width/2-e.width*.25-bA.arrowHorizontalOffset,name:"arrow_smw"}),northArrowSouth:(t,e)=>({top:wA(t,e),left:t.left+t.width/2-e.width/2,name:"arrow_s"}),northArrowSouthMiddleEast:(t,e)=>({top:wA(t,e),left:t.left+t.width/2-e.width*.75+bA.arrowHorizontalOffset,name:"arrow_sme"}),northArrowSouthEast:(t,e)=>({top:wA(t,e),left:t.left+t.width/2-e.width+bA.arrowHorizontalOffset,name:"arrow_se"}),northEastArrowSouthWest:(t,e)=>({top:wA(t,e),left:t.right-bA.arrowHorizontalOffset,name:"arrow_sw"}),northEastArrowSouthMiddleWest:(t,e)=>({top:wA(t,e),left:t.right-e.width*.25-bA.arrowHorizontalOffset,name:"arrow_smw"}),northEastArrowSouth:(t,e)=>({top:wA(t,e),left:t.right-e.width/2,name:"arrow_s"}),northEastArrowSouthMiddleEast:(t,e)=>({top:wA(t,e),left:t.right-e.width*.75+bA.arrowHorizontalOffset,name:"arrow_sme"}),northEastArrowSouthEast:(t,e)=>({top:wA(t,e),left:t.right-e.width+bA.arrowHorizontalOffset,name:"arrow_se"}),southWestArrowNorthWest:(t,e)=>({top:CA(t,e),left:t.left-bA.arrowHorizontalOffset,name:"arrow_nw"}),southWestArrowNorthMiddleWest:(t,e)=>({top:CA(t,e),left:t.left-e.width*.25-bA.arrowHorizontalOffset,name:"arrow_nmw"}),southWestArrowNorth:(t,e)=>({top:CA(t,e),left:t.left-e.width/2,name:"arrow_n"}),southWestArrowNorthMiddleEast:(t,e)=>({top:CA(t,e),left:t.left-e.width*.75+bA.arrowHorizontalOffset,name:"arrow_nme"}),southWestArrowNorthEast:(t,e)=>({top:CA(t,e),left:t.left-e.width+bA.arrowHorizontalOffset,name:"arrow_ne"}),southArrowNorthWest:(t,e)=>({top:CA(t,e),left:t.left+t.width/2-bA.arrowHorizontalOffset,name:"arrow_nw"}),southArrowNorthMiddleWest:(t,e)=>({top:CA(t,e),left:t.left+t.width/2-e.width*.25-bA.arrowHorizontalOffset,name:"arrow_nmw"}),southArrowNorth:(t,e)=>({top:CA(t,e),left:t.left+t.width/2-e.width/2,name:"arrow_n"}),southArrowNorthMiddleEast:(t,e)=>({top:CA(t,e),left:t.left+t.width/2-e.width*.75+bA.arrowHorizontalOffset,name:"arrow_nme"}),southArrowNorthEast:(t,e)=>({top:CA(t,e),left:t.left+t.width/2-e.width+bA.arrowHorizontalOffset,name:"arrow_ne"}),southEastArrowNorthWest:(t,e)=>({top:CA(t,e),left:t.right-bA.arrowHorizontalOffset,name:"arrow_nw"}),southEastArrowNorthMiddleWest:(t,e)=>({top:CA(t,e),left:t.right-e.width*.25-bA.arrowHorizontalOffset,name:"arrow_nmw"}),southEastArrowNorth:(t,e)=>({top:CA(t,e),left:t.right-e.width/2,name:"arrow_n"}),southEastArrowNorthMiddleEast:(t,e)=>({top:CA(t,e),left:t.right-e.width*.75+bA.arrowHorizontalOffset,name:"arrow_nme"}),southEastArrowNorthEast:(t,e)=>({top:CA(t,e),left:t.right-e.width+bA.arrowHorizontalOffset,name:"arrow_ne"})};function wA(t,e){return t.top-e.height-bA.arrowVerticalOffset}function CA(t){return t.bottom+bA.arrowVerticalOffset}var AA='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M11.463 5.187a.888.888 0 1 1 1.254 1.255L9.16 10l3.557 3.557a.888.888 0 1 1-1.254 1.255L7.26 10.61a.888.888 0 0 1 .16-1.382l4.043-4.042z"/></svg>';var _A='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M8.537 14.813a.888.888 0 1 1-1.254-1.255L10.84 10 7.283 6.442a.888.888 0 1 1 1.254-1.255L12.74 9.39a.888.888 0 0 1-.16 1.382l-4.043 4.042z"/></svg>';var vA=n(30);var yA={injectType:"singletonStyleTag",attributes:{"data-cke":true}};yA.insert="head";yA.singleton=true;var xA=wk()(vA["a"],yA);var EA=vA["a"].locals||{};var DA=n(31);var SA={injectType:"singletonStyleTag",attributes:{"data-cke":true}};SA.insert="head";SA.singleton=true;var BA=wk()(DA["a"],SA);var TA=DA["a"].locals||{};const PA=hf("px");class IA extends Kn{static get pluginName(){return"ContextualBalloon"}constructor(t){super(t);this.positionLimiter=()=>{const t=this.editor.editing.view;const e=t.document;const n=e.selection.editableElement;if(n){return t.domConverter.mapViewToDom(n.root)}return null};this.set("visibleView",null);this.view=new bA(t.locale);t.ui.view.body.add(this.view);t.ui.focusTracker.add(this.view.element);this._viewToStack=new Map;this._idToStack=new Map;this.set("_numberOfStacks",0);this.set("_singleViewMode",false);this._rotatorView=this._createRotatorView();this._fakePanelsView=this._createFakePanelsView()}hasView(t){return Array.from(this._viewToStack.keys()).includes(t)}add(t){if(this.hasView(t.view)){throw new u["a"]("contextualballoon-add-view-exist",[this,t])}const e=t.stackId||"main";if(!this._idToStack.has(e)){this._idToStack.set(e,new Map([[t.view,t]]));this._viewToStack.set(t.view,this._idToStack.get(e));this._numberOfStacks=this._idToStack.size;if(!this._visibleStack||t.singleViewMode){this.showStack(e)}return}const n=this._idToStack.get(e);if(t.singleViewMode){this.showStack(e)}n.set(t.view,t);this._viewToStack.set(t.view,n);if(n===this._visibleStack){this._showView(t)}}remove(t){if(!this.hasView(t)){throw new u["a"]("contextualballoon-remove-view-not-exist",[this,t])}const e=this._viewToStack.get(t);if(this._singleViewMode&&this.visibleView===t){this._singleViewMode=false}if(this.visibleView===t){if(e.size===1){if(this._idToStack.size>1){this._showNextStack()}else{this.view.hide();this.visibleView=null;this._rotatorView.hideView()}}else{this._showView(Array.from(e.values())[e.size-2])}}if(e.size===1){this._idToStack.delete(this._getStackId(e));this._numberOfStacks=this._idToStack.size}else{e.delete(t)}this._viewToStack.delete(t)}updatePosition(t){if(t){this._visibleStack.get(this.visibleView).position=t}this.view.pin(this._getBalloonPosition());this._fakePanelsView.updatePosition()}showStack(t){this.visibleStack=t;const e=this._idToStack.get(t);if(!e){throw new u["a"]("contextualballoon-showstack-stack-not-exist",this)}if(this._visibleStack===e){return}this._showView(Array.from(e.values()).pop())}get _visibleStack(){return this._viewToStack.get(this.visibleView)}_getStackId(t){const e=Array.from(this._idToStack.entries()).find((e=>e[1]===t));return e[0]}_showNextStack(){const t=Array.from(this._idToStack.values());let e=t.indexOf(this._visibleStack)+1;if(!t[e]){e=0}this.showStack(this._getStackId(t[e]))}_showPrevStack(){const t=Array.from(this._idToStack.values());let e=t.indexOf(this._visibleStack)-1;if(!t[e]){e=t.length-1}this.showStack(this._getStackId(t[e]))}_createRotatorView(){const t=new RA(this.editor.locale);const e=this.editor.locale.t;this.view.content.add(t);t.bind("isNavigationVisible").to(this,"_numberOfStacks",this,"_singleViewMode",((t,e)=>!e&&t>1));t.on("change:isNavigationVisible",(()=>this.updatePosition()),{priority:"low"});t.bind("counter").to(this,"visibleView",this,"_numberOfStacks",((t,n)=>{if(n<2){return""}const o=Array.from(this._idToStack.values()).indexOf(this._visibleStack)+1;return e("%0 of %1",[o,n])}));t.buttonNextView.on("execute",(()=>{if(t.focusTracker.isFocused){this.editor.editing.view.focus()}this._showNextStack()}));t.buttonPrevView.on("execute",(()=>{if(t.focusTracker.isFocused){this.editor.editing.view.focus()}this._showPrevStack()}));return t}_createFakePanelsView(){const t=new FA(this.editor.locale,this.view);t.bind("numberOfPanels").to(this,"_numberOfStacks",this,"_singleViewMode",((t,e)=>{const n=!e&&t>=2;return n?Math.min(t-1,2):0}));t.listenTo(this.view,"change:top",(()=>t.updatePosition()));t.listenTo(this.view,"change:left",(()=>t.updatePosition()));this.editor.ui.view.body.add(t);return t}_showView({view:t,balloonClassName:e="",withArrow:n=true,singleViewMode:o=false}){this.view.class=e;this.view.withArrow=n;this._rotatorView.showView(t);this.visibleView=t;this.view.pin(this._getBalloonPosition());this._fakePanelsView.updatePosition();if(o){this._singleViewMode=true}}_getBalloonPosition(){let t=Array.from(this._visibleStack.values()).pop().position;if(t&&!t.limiter){t=Object.assign({},t,{limiter:this.positionLimiter})}return t}}class RA extends yk{constructor(t){super(t);const e=t.t;const n=this.bindTemplate;this.set("isNavigationVisible",true);this.focusTracker=new mf;this.buttonPrevView=this._createButtonView(e("Previous"),AA);this.buttonNextView=this._createButtonView(e("Next"),_A);this.content=this.createCollection();this.setTemplate({tag:"div",attributes:{class:["ck","ck-balloon-rotator"],"z-index":"-1"},children:[{tag:"div",attributes:{class:["ck-balloon-rotator__navigation",n.to("isNavigationVisible",(t=>t?"":"ck-hidden"))]},children:[this.buttonPrevView,{tag:"span",attributes:{class:["ck-balloon-rotator__counter"]},children:[{text:n.to("counter")}]},this.buttonNextView]},{tag:"div",attributes:{class:"ck-balloon-rotator__content"},children:this.content}]})}render(){super.render();this.focusTracker.add(this.element)}showView(t){this.hideView();this.content.add(t)}hideView(){this.content.clear()}_createButtonView(t,e){const n=new fw(this.locale);n.set({label:t,icon:e,tooltip:true});return n}}class FA extends yk{constructor(t,e){super(t);const n=this.bindTemplate;this.set("top",0);this.set("left",0);this.set("height",0);this.set("width",0);this.set("numberOfPanels",0);this.content=this.createCollection();this._balloonPanelView=e;this.setTemplate({tag:"div",attributes:{class:["ck-fake-panel",n.to("numberOfPanels",(t=>t?"":"ck-hidden"))],style:{top:n.to("top",PA),left:n.to("left",PA),width:n.to("width",PA),height:n.to("height",PA)}},children:this.content});this.on("change:numberOfPanels",((t,e,n,o)=>{if(n>o){this._addPanels(n-o)}else{this._removePanels(o-n)}this.updatePosition()}))}_addPanels(t){while(t--){const t=new yk;t.setTemplate({tag:"div"});this.content.add(t);this.registerChild(t)}}_removePanels(t){while(t--){const t=this.content.last;this.content.remove(t);this.deregisterChild(t);t.destroy()}}updatePosition(){if(this.numberOfPanels){const{top:t,left:e}=this._balloonPanelView;const{width:n,height:o}=new rf(this._balloonPanelView.element);Object.assign(this,{top:t,left:e,width:n,height:o})}}}var zA=n(32);var OA={injectType:"singletonStyleTag",attributes:{"data-cke":true}};OA.insert="head";OA.singleton=true;var NA=wk()(zA["a"],OA);var MA=zA["a"].locals||{};const VA=hf("px");class LA extends yk{constructor(t){super(t);const e=this.bindTemplate;this.set("isActive",false);this.set("isSticky",false);this.set("limiterElement",null);this.set("limiterBottomOffset",50);this.set("viewportTopOffset",0);this.set("_marginLeft",null);this.set("_isStickyToTheLimiter",false);this.set("_hasViewportTopOffset",false);this.content=this.createCollection();this._contentPanelPlaceholder=new Ek({tag:"div",attributes:{class:["ck","ck-sticky-panel__placeholder"],style:{display:e.to("isSticky",(t=>t?"block":"none")),height:e.to("isSticky",(t=>t?VA(this._panelRect.height):null))}}}).render();this._contentPanel=new Ek({tag:"div",attributes:{class:["ck","ck-sticky-panel__content",e.if("isSticky","ck-sticky-panel__content_sticky"),e.if("_isStickyToTheLimiter","ck-sticky-panel__content_sticky_bottom-limit")],style:{width:e.to("isSticky",(t=>t?VA(this._contentPanelPlaceholder.getBoundingClientRect().width):null)),top:e.to("_hasViewportTopOffset",(t=>t?VA(this.viewportTopOffset):null)),bottom:e.to("_isStickyToTheLimiter",(t=>t?VA(this.limiterBottomOffset):null)),marginLeft:e.to("_marginLeft")}},children:this.content}).render();this.setTemplate({tag:"div",attributes:{class:["ck","ck-sticky-panel"]},children:[this._contentPanelPlaceholder,this._contentPanel]})}render(){super.render();this._checkIfShouldBeSticky();this.listenTo(ru.window,"scroll",(()=>{this._checkIfShouldBeSticky()}));this.listenTo(this,"change:isActive",(()=>{this._checkIfShouldBeSticky()}))}_checkIfShouldBeSticky(){const t=this._panelRect=this._contentPanel.getBoundingClientRect();let e;if(!this.limiterElement){this.isSticky=false}else{e=this._limiterRect=this.limiterElement.getBoundingClientRect();this.isSticky=this.isActive&&e.top<this.viewportTopOffset&&this._panelRect.height+this.limiterBottomOffset<e.height}if(this.isSticky){this._isStickyToTheLimiter=e.bottom<t.height+this.limiterBottomOffset+this.viewportTopOffset;this._hasViewportTopOffset=!this._isStickyToTheLimiter&&!!this.viewportTopOffset;this._marginLeft=this._isStickyToTheLimiter?null:VA(-ru.window.scrollX)}else{this._isStickyToTheLimiter=false;this._hasViewportTopOffset=false;this._marginLeft=null}}}function HA({origin:t,originKeystrokeHandler:e,originFocusTracker:n,toolbar:o,beforeFocus:i,afterBlur:r}){n.add(o.element);e.set("Alt+F10",((t,e)=>{if(n.isFocused&&!o.focusTracker.isFocused){if(i){i()}o.focus();e()}}));o.keystrokes.set("Esc",((e,n)=>{if(o.focusTracker.isFocused){t.focus();if(r){r()}n()}}))}const KA=hf("px");class qA extends Kn{static get pluginName(){return"BalloonToolbar"}static get requires(){return[IA]}constructor(t){super(t);this._balloonConfig=eC(t.config.get("balloonToolbar"));this.toolbarView=this._createToolbarView();this.focusTracker=new mf;t.ui.once("ready",(()=>{this.focusTracker.add(t.ui.getEditableElement());this.focusTracker.add(this.toolbarView.element)}));this._resizeObserver=null;this._balloon=t.plugins.get(IA);this._fireSelectionChangeDebounced=qh((()=>this.fire("_selectionChangeDebounced")),200);this.decorate("show")}init(){const t=this.editor;const e=t.model.document.selection;this.listenTo(this.focusTracker,"change:isFocused",((t,e,n)=>{const o=this._balloon.visibleView===this.toolbarView;if(!n&&o){this.hide()}else if(n){this.show()}}));this.listenTo(e,"change:range",((t,n)=>{if(n.directChange||e.isCollapsed){this.hide()}this._fireSelectionChangeDebounced()}));this.listenTo(this,"_selectionChangeDebounced",(()=>{if(this.editor.editing.view.document.isFocused){this.show()}}));if(!this._balloonConfig.shouldNotGroupWhenFull){this.listenTo(t,"ready",(()=>{const e=t.ui.view.editable.element;this._resizeObserver=new lf(e,(()=>{this.toolbarView.maxWidth=KA(new rf(e).width*.9)}))}))}this.listenTo(this.toolbarView,"groupedItemsUpdate",(()=>{this._updatePosition()}))}afterInit(){const t=this.editor.ui.componentFactory;this.toolbarView.fillFromConfig(this._balloonConfig,t)}_createToolbarView(){const t=!this._balloonConfig.shouldNotGroupWhenFull;const e=new sC(this.editor.locale,{shouldGroupWhenFull:t,isFloating:true});e.render();return e}show(){const t=this.editor;const e=t.model.document.selection;const n=t.model.schema;if(this._balloon.hasView(this.toolbarView)){return}if(e.isCollapsed){return}if(WA(e,n)){return}if(Array.from(this.toolbarView.items).every((t=>t.isEnabled!==undefined&&!t.isEnabled))){return}this.listenTo(this.editor.ui,"update",(()=>{this._updatePosition()}));this._balloon.add({view:this.toolbarView,position:this._getBalloonPositionData(),balloonClassName:"ck-toolbar-container"})}hide(){if(this._balloon.hasView(this.toolbarView)){this.stopListening(this.editor.ui,"update");this._balloon.remove(this.toolbarView)}}_getBalloonPositionData(){const t=this.editor;const e=t.editing.view;const n=e.document;const o=n.selection;const i=n.selection.isBackward;return{target:()=>{const t=i?o.getFirstRange():o.getLastRange();const n=rf.getDomRangeRects(e.domConverter.viewRangeToDom(t));if(i){return n[0]}else{if(n.length>1&&n[n.length-1].width===0){n.pop()}return n[n.length-1]}},positions:jA(i)}}_updatePosition(){this._balloon.updatePosition(this._getBalloonPositionData())}destroy(){super.destroy();this.stopListening();this._fireSelectionChangeDebounced.cancel();this.toolbarView.destroy();this.focusTracker.destroy();if(this._resizeObserver){this._resizeObserver.destroy()}}}function jA(t){const e=bA.defaultPositions;return t?[e.northWestArrowSouth,e.northWestArrowSouthWest,e.northWestArrowSouthEast,e.northWestArrowSouthMiddleEast,e.northWestArrowSouthMiddleWest,e.southWestArrowNorth,e.southWestArrowNorthWest,e.southWestArrowNorthEast,e.southWestArrowNorthMiddleWest,e.southWestArrowNorthMiddleEast]:[e.southEastArrowNorth,e.southEastArrowNorthEast,e.southEastArrowNorthWest,e.southEastArrowNorthMiddleEast,e.southEastArrowNorthMiddleWest,e.northEastArrowSouth,e.northEastArrowSouthEast,e.northEastArrowSouthWest,e.northEastArrowSouthMiddleEast,e.northEastArrowSouthMiddleWest]}function WA(t,e){if(t.rangeCount===1){return false}return[...t.getRanges()].every((t=>{const n=t.getContainedElement();return n&&e.isSelectable(n)}))}var GA=n(33);var UA={injectType:"singletonStyleTag",attributes:{"data-cke":true}};UA.insert="head";UA.singleton=true;var $A=wk()(GA["a"],UA);var JA=GA["a"].locals||{};const YA=hf("px");class QA extends fw{constructor(t){super(t);const e=this.bindTemplate;this.isVisible=false;this.isToggleable=true;this.set("top",0);this.set("left",0);this.extendTemplate({attributes:{class:"ck-block-toolbar-button",style:{top:e.to("top",(t=>YA(t))),left:e.to("left",(t=>YA(t)))}}})}}const XA=hf("px");class ZA extends Kn{static get pluginName(){return"BlockToolbar"}constructor(t){super(t);this._blockToolbarConfig=eC(this.editor.config.get("blockToolbar"));this.toolbarView=this._createToolbarView();this.panelView=this._createPanelView();this.buttonView=this._createButtonView();this._resizeObserver=null;fk({emitter:this.panelView,contextElements:[this.panelView.element,this.buttonView.element],activator:()=>this.panelView.isVisible,callback:()=>this._hidePanel()})}init(){const t=this.editor;this.listenTo(t.model.document.selection,"change:range",((t,e)=>{if(e.directChange){this._hidePanel()}}));this.listenTo(t.ui,"update",(()=>this._updateButton()));this.listenTo(t,"change:isReadOnly",(()=>this._updateButton()),{priority:"low"});this.listenTo(t.ui.focusTracker,"change:isFocused",(()=>this._updateButton()));this.listenTo(this.buttonView,"change:isVisible",((t,e,n)=>{if(n){this.buttonView.listenTo(window,"resize",(()=>this._updateButton()))}else{this.buttonView.stopListening(window,"resize");this._hidePanel()}}))}afterInit(){const t=this.editor.ui.componentFactory;const e=this._blockToolbarConfig;this.toolbarView.fillFromConfig(e,t);for(const t of this.toolbarView.items){t.on("execute",(()=>this._hidePanel(true)),{priority:"high"})}if(!e.shouldNotGroupWhenFull){this.listenTo(this.editor,"ready",(()=>{const t=this.editor.ui.view.editable.element;this._resizeObserver=new lf(t,(()=>{this.toolbarView.maxWidth=this._getToolbarMaxWidth()}))}))}}destroy(){super.destroy();this.panelView.destroy();this.buttonView.destroy();this.toolbarView.destroy();if(this._resizeObserver){this._resizeObserver.destroy()}}_createToolbarView(){const t=!this._blockToolbarConfig.shouldNotGroupWhenFull;const e=new sC(this.editor.locale,{shouldGroupWhenFull:t,isFloating:true});e.focusTracker.on("change:isFocused",((t,e,n)=>{if(!n){this._hidePanel()}}));return e}_createPanelView(){const t=this.editor;const e=new bA(t.locale);e.content.add(this.toolbarView);e.class="ck-toolbar-container";t.ui.view.body.add(e);t.ui.focusTracker.add(e.element);this.toolbarView.keystrokes.set("Esc",((t,e)=>{this._hidePanel(true);e()}));return e}_createButtonView(){const t=this.editor;const e=t.t;const n=new QA(t.locale);n.set({label:e("Edit block"),icon:hk.pilcrow,withText:false});n.bind("isOn").to(this.panelView,"isVisible");n.bind("tooltip").to(this.panelView,"isVisible",(t=>!t));this.listenTo(n,"execute",(()=>{if(!this.panelView.isVisible){this._showPanel()}else{this._hidePanel(true)}}));t.ui.view.body.add(n);t.ui.focusTracker.add(n.element);return n}_updateButton(){const t=this.editor;const e=t.model;const n=t.editing.view;if(!t.ui.focusTracker.isFocused){this._hideButton();return}if(t.isReadOnly){this._hideButton();return}const o=Array.from(e.document.selection.getSelectedBlocks())[0];if(!o||Array.from(this.toolbarView.items).every((t=>!t.isEnabled))){this._hideButton();return}const i=n.domConverter.mapViewToDom(t.editing.mapper.toViewElement(o));this.buttonView.isVisible=true;this._attachButtonToElement(i);if(this.panelView.isVisible){this._showPanel()}}_hideButton(){this.buttonView.isVisible=false}_showPanel(){const t=this.panelView.isVisible;this.panelView.show();this.toolbarView.maxWidth=this._getToolbarMaxWidth();this.panelView.pin({target:this.buttonView.element,limiter:this.editor.ui.getEditableElement()});if(!t){this.toolbarView.items.get(0).focus()}}_hidePanel(t){this.panelView.isVisible=false;if(t){this.editor.editing.view.focus()}}_attachButtonToElement(t){const e=window.getComputedStyle(t);const n=new rf(this.editor.ui.getEditableElement());const o=parseInt(e.paddingTop,10);const i=parseInt(e.lineHeight,10)||parseInt(e.fontSize,10)*1.2;const r=jw({element:this.buttonView.element,target:t,positions:[(t,e)=>{let r;if(this.editor.locale.uiLanguageDirection==="ltr"){r=n.left-e.width}else{r=n.right}return{top:t.top+o+(i-e.height)/2,left:r}}]});this.buttonView.top=r.top;this.buttonView.left=r.left}_getToolbarMaxWidth(){const t=this.editor.ui.view.editable.element;const e=new rf(t);const n=new rf(this.buttonView.element);const o=this.editor.locale.uiLanguageDirection==="rtl";const i=o?n.left-e.right+n.width:e.left-n.left;return XA(e.width+i)}}var t_=n(34);var e_={injectType:"singletonStyleTag",attributes:{"data-cke":true}};e_.insert="head";e_.singleton=true;var n_=wk()(t_["a"],e_);var o_=t_["a"].locals||{};const i_=new WeakMap;function r_(t){const{view:e,element:n,text:o,isDirectHost:i=true,keepOnFocus:r=false}=t;const s=e.document;if(!i_.has(s)){i_.set(s,new Map);s.registerPostFixer((t=>d_(s,t)))}i_.get(s).set(n,{text:o,isDirectHost:i,keepOnFocus:r,hostElement:i?n:null});e.change((t=>d_(s,t)))}function s_(t,e){const n=e.document;t.change((t=>{if(!i_.has(n)){return}const o=i_.get(n);const i=o.get(e);t.removeAttribute("data-placeholder",i.hostElement);c_(t,i.hostElement);o.delete(e)}))}function a_(t,e){if(!e.hasClass("ck-placeholder")){t.addClass("ck-placeholder",e);return true}return false}function c_(t,e){if(e.hasClass("ck-placeholder")){t.removeClass("ck-placeholder",e);return true}return false}function l_(t,e){if(!t.isAttached()){return false}const n=Array.from(t.getChildren()).some((t=>!t.is("uiElement")));if(n){return false}if(e){return true}const o=t.document;if(!o.isFocused){return true}const i=o.selection;const r=i.anchor;return r&&r.parent!==t}function d_(t,e){const n=i_.get(t);const o=[];let i=false;for(const[t,r]of n){if(r.isDirectHost){o.push(t);if(u_(e,t,r)){i=true}}}for(const[t,r]of n){if(r.isDirectHost){continue}const n=h_(t);if(!n){continue}if(o.includes(n)){continue}r.hostElement=n;if(u_(e,t,r)){i=true}}return i}function u_(t,e,n){const{text:o,isDirectHost:i,hostElement:r}=n;let s=false;if(r.getAttribute("data-placeholder")!==o){t.setAttribute("data-placeholder",o,r);s=true}const a=i||e.childCount==1;if(a&&l_(r,n.keepOnFocus)){if(a_(t,r)){s=true}}else if(c_(t,r)){s=true}return s}function h_(t){if(t.childCount){const e=t.getChild(0);if(e.is("element")&&!e.is("uiElement")){return e}}return null}const f_=new Map;function m_(t,e,n){let o=f_.get(t);if(!o){o=new Map;f_.set(t,o)}o.set(e,n)}function g_(t,e){const n=f_.get(t);if(n&&n.has(e)){return n.get(e)}return p_}function p_(t){return[t]}function b_(t,e,n={}){const o=g_(t.constructor,e.constructor);try{t=t.clone();return o(t,e,n)}catch(t){throw t}}function k_(t,e,n){t=t.slice();e=e.slice();const o=new w_(n.document,n.useRelations,n.forceWeakRemove);o.setOriginalOperations(t);o.setOriginalOperations(e);const i=o.originalOperations;if(t.length==0||e.length==0){return{operationsA:t,operationsB:e,originalOperations:i}}const r=new WeakMap;for(const e of t){r.set(e,0)}const s={nextBaseVersionA:t[t.length-1].baseVersion+1,nextBaseVersionB:e[e.length-1].baseVersion+1,originalOperationsACount:t.length,originalOperationsBCount:e.length};let a=0;while(a<t.length){const n=t[a];const i=r.get(n);if(i==e.length){a++;continue}const s=e[i];const c=b_(n,s,o.getContext(n,s,true));const l=b_(s,n,o.getContext(s,n,false));o.updateRelation(n,s);o.setOriginalOperations(c,n);o.setOriginalOperations(l,s);for(const t of c){r.set(t,i+l.length)}t.splice(a,1,...c);e.splice(i,1,...l)}if(n.padWithNoOps){const n=t.length-s.originalOperationsACount;const o=e.length-s.originalOperationsBCount;A_(t,o-n);A_(e,n-o)}C_(t,s.nextBaseVersionB);C_(e,s.nextBaseVersionA);return{operationsA:t,operationsB:e,originalOperations:i}}class w_{constructor(t,e,n=false){this.originalOperations=new Map;this._history=t.history;this._useRelations=e;this._forceWeakRemove=!!n;this._relations=new Map}setOriginalOperations(t,e=null){const n=e?this.originalOperations.get(e):null;for(const e of t){this.originalOperations.set(e,n||e)}}updateRelation(t,e){switch(t.constructor){case up:{switch(e.constructor){case pp:{if(t.targetPosition.isEqual(e.sourcePosition)||e.movedRange.containsPosition(t.targetPosition)){this._setRelation(t,e,"insertAtSource")}else if(t.targetPosition.isEqual(e.deletionPosition)){this._setRelation(t,e,"insertBetween")}else if(t.targetPosition.isAfter(e.sourcePosition)){this._setRelation(t,e,"moveTargetAfter")}break}case up:{if(t.targetPosition.isEqual(e.sourcePosition)||t.targetPosition.isBefore(e.sourcePosition)){this._setRelation(t,e,"insertBefore")}else{this._setRelation(t,e,"insertAfter")}break}}break}case bp:{switch(e.constructor){case pp:{if(t.splitPosition.isBefore(e.sourcePosition)){this._setRelation(t,e,"splitBefore")}break}case up:{if(t.splitPosition.isEqual(e.sourcePosition)||t.splitPosition.isBefore(e.sourcePosition)){this._setRelation(t,e,"splitBefore")}else{const n=Kf._createFromPositionAndShift(e.sourcePosition,e.howMany);if(t.splitPosition.hasSameParentAs(e.sourcePosition)&&n.containsPosition(t.splitPosition)){const o=n.end.offset-t.splitPosition.offset;const i=t.splitPosition.offset-n.start.offset;this._setRelation(t,e,{howMany:o,offset:i})}}}}break}case pp:{switch(e.constructor){case pp:{if(!t.targetPosition.isEqual(e.sourcePosition)){this._setRelation(t,e,"mergeTargetNotMoved")}if(t.sourcePosition.isEqual(e.targetPosition)){this._setRelation(t,e,"mergeSourceNotMoved")}if(t.sourcePosition.isEqual(e.sourcePosition)){this._setRelation(t,e,"mergeSameElement")}break}case bp:{if(t.sourcePosition.isEqual(e.splitPosition)){this._setRelation(t,e,"splitAtSource")}}}break}case fp:{const n=t.newRange;if(!n){return}switch(e.constructor){case up:{const o=Kf._createFromPositionAndShift(e.sourcePosition,e.howMany);const i=o.containsPosition(n.start)||o.start.isEqual(n.start);const r=o.containsPosition(n.end)||o.end.isEqual(n.end);if((i||r)&&!o.containsRange(n)){this._setRelation(t,e,{side:i?"left":"right",path:i?n.start.path.slice():n.end.path.slice()})}break}case pp:{const o=n.start.isEqual(e.targetPosition);const i=n.start.isEqual(e.deletionPosition);const r=n.end.isEqual(e.deletionPosition);const s=n.end.isEqual(e.sourcePosition);if(o||i||r||s){this._setRelation(t,e,{wasInLeftElement:o,wasStartBeforeMergedElement:i,wasEndBeforeMergedElement:r,wasInRightElement:s})}break}}break}}}getContext(t,e,n){return{aIsStrong:n,aWasUndone:this._wasUndone(t),bWasUndone:this._wasUndone(e),abRelation:this._useRelations?this._getRelation(t,e):null,baRelation:this._useRelations?this._getRelation(e,t):null,forceWeakRemove:this._forceWeakRemove}}_wasUndone(t){const e=this.originalOperations.get(t);return e.wasUndone||this._history.isUndoneOperation(e)}_getRelation(t,e){const n=this.originalOperations.get(e);const o=this._history.getUndoneOperation(n);if(!o){return null}const i=this.originalOperations.get(t);const r=this._relations.get(i);if(r){return r.get(o)||null}return null}_setRelation(t,e,n){const o=this.originalOperations.get(t);const i=this.originalOperations.get(e);let r=this._relations.get(o);if(!r){r=new Map;this._relations.set(o,r)}r.set(i,n)}}function C_(t,e){for(const n of t){n.baseVersion=e++}}function A_(t,e){for(let n=0;n<e;n++){t.push(new Lp(0))}}m_(lp,lp,((t,e,n)=>{if(t.key===e.key&&t.range.start.hasSameParentAs(e.range.start)){const o=t.range.getDifference(e.range).map((e=>new lp(e,t.key,t.oldValue,t.newValue,0)));const i=t.range.getIntersection(e.range);if(i){if(n.aIsStrong){o.push(new lp(i,e.key,e.newValue,t.newValue,0))}}if(o.length==0){return[new Lp(0)]}return o}else{return[t]}}));m_(lp,hp,((t,e)=>{if(t.range.start.hasSameParentAs(e.position)&&t.range.containsPosition(e.position)){const n=t.range._getTransformedByInsertion(e.position,e.howMany,!e.shouldReceiveAttributes);const o=n.map((e=>new lp(e,t.key,t.oldValue,t.newValue,t.baseVersion)));if(e.shouldReceiveAttributes){const n=__(e,t.key,t.oldValue);if(n){o.unshift(n)}}return o}t.range=t.range._getTransformedByInsertion(e.position,e.howMany,false)[0];return[t]}));function __(t,e,n){const o=t.nodes;const i=o.getNode(0).getAttribute(e);if(i==n){return null}const r=new Kf(t.position,t.position.getShiftedBy(t.howMany));return new lp(r,e,i,n,0)}m_(lp,pp,((t,e)=>{const n=[];if(t.range.start.hasSameParentAs(e.deletionPosition)){if(t.range.containsPosition(e.deletionPosition)||t.range.start.isEqual(e.deletionPosition)){n.push(Kf._createFromPositionAndShift(e.graveyardPosition,1))}}const o=t.range._getTransformedByMergeOperation(e);if(!o.isCollapsed){n.push(o)}return n.map((e=>new lp(e,t.key,t.oldValue,t.newValue,t.baseVersion)))}));m_(lp,up,((t,e)=>{const n=v_(t.range,e);return n.map((e=>new lp(e,t.key,t.oldValue,t.newValue,t.baseVersion)))}));function v_(t,e){const n=Kf._createFromPositionAndShift(e.sourcePosition,e.howMany);let o=null;let i=[];if(n.containsRange(t,true)){o=t}else if(t.start.hasSameParentAs(n.start)){i=t.getDifference(n);o=t.getIntersection(n)}else{i=[t]}const r=[];for(let t of i){t=t._getTransformedByDeletion(e.sourcePosition,e.howMany);const n=e.getMovedRangeStart();const o=t.start.hasSameParentAs(n);t=t._getTransformedByInsertion(n,e.howMany,o);r.push(...t)}if(o){r.push(o._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany,false)[0])}return r}m_(lp,bp,((t,e)=>{if(t.range.end.isEqual(e.insertionPosition)){if(!e.graveyardPosition){t.range.end.offset++}return[t]}if(t.range.start.hasSameParentAs(e.splitPosition)&&t.range.containsPosition(e.splitPosition)){const n=t.clone();n.range=new Kf(e.moveTargetPosition.clone(),t.range.end._getCombined(e.splitPosition,e.moveTargetPosition));t.range.end=e.splitPosition.clone();t.range.end.stickiness="toPrevious";return[t,n]}t.range=t.range._getTransformedBySplitOperation(e);return[t]}));m_(hp,lp,((t,e)=>{const n=[t];if(t.shouldReceiveAttributes&&t.position.hasSameParentAs(e.range.start)&&e.range.containsPosition(t.position)){const o=__(t,e.key,e.newValue);if(o){n.push(o)}}return n}));m_(hp,hp,((t,e,n)=>{if(t.position.isEqual(e.position)&&n.aIsStrong){return[t]}t.position=t.position._getTransformedByInsertOperation(e);return[t]}));m_(hp,up,((t,e)=>{t.position=t.position._getTransformedByMoveOperation(e);return[t]}));m_(hp,bp,((t,e)=>{t.position=t.position._getTransformedBySplitOperation(e);return[t]}));m_(hp,pp,((t,e)=>{t.position=t.position._getTransformedByMergeOperation(e);return[t]}));m_(fp,hp,((t,e)=>{if(t.oldRange){t.oldRange=t.oldRange._getTransformedByInsertOperation(e)[0]}if(t.newRange){t.newRange=t.newRange._getTransformedByInsertOperation(e)[0]}return[t]}));m_(fp,fp,((t,e,n)=>{if(t.name==e.name){if(n.aIsStrong){t.oldRange=e.newRange?e.newRange.clone():null}else{return[new Lp(0)]}}return[t]}));m_(fp,pp,((t,e)=>{if(t.oldRange){t.oldRange=t.oldRange._getTransformedByMergeOperation(e)}if(t.newRange){t.newRange=t.newRange._getTransformedByMergeOperation(e)}return[t]}));m_(fp,up,((t,e,n)=>{if(t.oldRange){t.oldRange=Kf._createFromRanges(t.oldRange._getTransformedByMoveOperation(e))}if(t.newRange){if(n.abRelation){const o=Kf._createFromRanges(t.newRange._getTransformedByMoveOperation(e));if(n.abRelation.side=="left"&&e.targetPosition.isEqual(t.newRange.start)){t.newRange.start.path=n.abRelation.path;t.newRange.end=o.end;return[t]}else if(n.abRelation.side=="right"&&e.targetPosition.isEqual(t.newRange.end)){t.newRange.start=o.start;t.newRange.end.path=n.abRelation.path;return[t]}}t.newRange=Kf._createFromRanges(t.newRange._getTransformedByMoveOperation(e))}return[t]}));m_(fp,bp,((t,e,n)=>{if(t.oldRange){t.oldRange=t.oldRange._getTransformedBySplitOperation(e)}if(t.newRange){if(n.abRelation){const o=t.newRange._getTransformedBySplitOperation(e);if(t.newRange.start.isEqual(e.splitPosition)&&n.abRelation.wasStartBeforeMergedElement){t.newRange.start=Mf._createAt(e.insertionPosition)}else if(t.newRange.start.isEqual(e.splitPosition)&&!n.abRelation.wasInLeftElement){t.newRange.start=Mf._createAt(e.moveTargetPosition)}if(t.newRange.end.isEqual(e.splitPosition)&&n.abRelation.wasInRightElement){t.newRange.end=Mf._createAt(e.moveTargetPosition)}else if(t.newRange.end.isEqual(e.splitPosition)&&n.abRelation.wasEndBeforeMergedElement){t.newRange.end=Mf._createAt(e.insertionPosition)}else{t.newRange.end=o.end}return[t]}t.newRange=t.newRange._getTransformedBySplitOperation(e)}return[t]}));m_(pp,hp,((t,e)=>{if(t.sourcePosition.hasSameParentAs(e.position)){t.howMany+=e.howMany}t.sourcePosition=t.sourcePosition._getTransformedByInsertOperation(e);t.targetPosition=t.targetPosition._getTransformedByInsertOperation(e);return[t]}));m_(pp,pp,((t,e,n)=>{if(t.sourcePosition.isEqual(e.sourcePosition)&&t.targetPosition.isEqual(e.targetPosition)){if(!n.bWasUndone){return[new Lp(0)]}else{const n=e.graveyardPosition.path.slice();n.push(0);t.sourcePosition=new Mf(e.graveyardPosition.root,n);t.howMany=0;return[t]}}if(t.sourcePosition.isEqual(e.sourcePosition)&&!t.targetPosition.isEqual(e.targetPosition)&&!n.bWasUndone&&n.abRelation!="splitAtSource"){const o=t.targetPosition.root.rootName=="$graveyard";const i=e.targetPosition.root.rootName=="$graveyard";const r=o&&!i;const s=i&&!o;const a=s||!r&&n.aIsStrong;if(a){const n=e.targetPosition._getTransformedByMergeOperation(e);const o=t.targetPosition._getTransformedByMergeOperation(e);return[new up(n,t.howMany,o,0)]}else{return[new Lp(0)]}}if(t.sourcePosition.hasSameParentAs(e.targetPosition)){t.howMany+=e.howMany}t.sourcePosition=t.sourcePosition._getTransformedByMergeOperation(e);t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e);if(!t.graveyardPosition.isEqual(e.graveyardPosition)||!n.aIsStrong){t.graveyardPosition=t.graveyardPosition._getTransformedByMergeOperation(e)}return[t]}));m_(pp,up,((t,e,n)=>{const o=Kf._createFromPositionAndShift(e.sourcePosition,e.howMany);if(e.type=="remove"&&!n.bWasUndone&&!n.forceWeakRemove){if(t.deletionPosition.hasSameParentAs(e.sourcePosition)&&o.containsPosition(t.sourcePosition)){return[new Lp(0)]}}if(t.sourcePosition.hasSameParentAs(e.targetPosition)){t.howMany+=e.howMany}if(t.sourcePosition.hasSameParentAs(e.sourcePosition)){t.howMany-=e.howMany}t.sourcePosition=t.sourcePosition._getTransformedByMoveOperation(e);t.targetPosition=t.targetPosition._getTransformedByMoveOperation(e);if(!t.graveyardPosition.isEqual(e.targetPosition)){t.graveyardPosition=t.graveyardPosition._getTransformedByMoveOperation(e)}return[t]}));m_(pp,bp,((t,e,n)=>{if(e.graveyardPosition){t.graveyardPosition=t.graveyardPosition._getTransformedByDeletion(e.graveyardPosition,1);if(t.deletionPosition.isEqual(e.graveyardPosition)){t.howMany=e.howMany}}if(t.targetPosition.isEqual(e.splitPosition)){const o=e.howMany!=0;const i=e.graveyardPosition&&t.deletionPosition.isEqual(e.graveyardPosition);if(o||i||n.abRelation=="mergeTargetNotMoved"){t.sourcePosition=t.sourcePosition._getTransformedBySplitOperation(e);return[t]}}if(t.sourcePosition.isEqual(e.splitPosition)){if(n.abRelation=="mergeSourceNotMoved"){t.howMany=0;t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e);return[t]}if(n.abRelation=="mergeSameElement"||t.sourcePosition.offset>0){t.sourcePosition=e.moveTargetPosition.clone();t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e);return[t]}}if(t.sourcePosition.hasSameParentAs(e.splitPosition)){t.howMany=e.splitPosition.offset}t.sourcePosition=t.sourcePosition._getTransformedBySplitOperation(e);t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e);return[t]}));m_(up,hp,((t,e)=>{const n=Kf._createFromPositionAndShift(t.sourcePosition,t.howMany);const o=n._getTransformedByInsertOperation(e,false)[0];t.sourcePosition=o.start;t.howMany=o.end.offset-o.start.offset;if(!t.targetPosition.isEqual(e.position)){t.targetPosition=t.targetPosition._getTransformedByInsertOperation(e)}return[t]}));m_(up,up,((t,e,n)=>{const o=Kf._createFromPositionAndShift(t.sourcePosition,t.howMany);const i=Kf._createFromPositionAndShift(e.sourcePosition,e.howMany);let r=n.aIsStrong;let s=!n.aIsStrong;if(n.abRelation=="insertBefore"||n.baRelation=="insertAfter"){s=true}else if(n.abRelation=="insertAfter"||n.baRelation=="insertBefore"){s=false}let a;if(t.targetPosition.isEqual(e.targetPosition)&&s){a=t.targetPosition._getTransformedByDeletion(e.sourcePosition,e.howMany)}else{a=t.targetPosition._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany)}if(y_(t,e)&&y_(e,t)){return[e.getReversed()]}const c=o.containsPosition(e.targetPosition);if(c&&o.containsRange(i,true)){o.start=o.start._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany);o.end=o.end._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany);return x_([o],a)}const l=i.containsPosition(t.targetPosition);if(l&&i.containsRange(o,true)){o.start=o.start._getCombined(e.sourcePosition,e.getMovedRangeStart());o.end=o.end._getCombined(e.sourcePosition,e.getMovedRangeStart());return x_([o],a)}const d=Ia(t.sourcePosition.getParentPath(),e.sourcePosition.getParentPath());if(d=="prefix"||d=="extension"){o.start=o.start._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany);o.end=o.end._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany);return x_([o],a)}if(t.type=="remove"&&e.type!="remove"&&!n.aWasUndone&&!n.forceWeakRemove){r=true}else if(t.type!="remove"&&e.type=="remove"&&!n.bWasUndone&&!n.forceWeakRemove){r=false}const u=[];const h=o.getDifference(i);for(const t of h){t.start=t.start._getTransformedByDeletion(e.sourcePosition,e.howMany);t.end=t.end._getTransformedByDeletion(e.sourcePosition,e.howMany);const n=Ia(t.start.getParentPath(),e.getMovedRangeStart().getParentPath())=="same";const o=t._getTransformedByInsertion(e.getMovedRangeStart(),e.howMany,n);u.push(...o)}const f=o.getIntersection(i);if(f!==null&&r){f.start=f.start._getCombined(e.sourcePosition,e.getMovedRangeStart());f.end=f.end._getCombined(e.sourcePosition,e.getMovedRangeStart());if(u.length===0){u.push(f)}else if(u.length==1){if(i.start.isBefore(o.start)||i.start.isEqual(o.start)){u.unshift(f)}else{u.push(f)}}else{u.splice(1,0,f)}}if(u.length===0){return[new Lp(t.baseVersion)]}return x_(u,a)}));m_(up,bp,((t,e,n)=>{let o=t.targetPosition.clone();if(!t.targetPosition.isEqual(e.insertionPosition)||!e.graveyardPosition||n.abRelation=="moveTargetAfter"){o=t.targetPosition._getTransformedBySplitOperation(e)}const i=Kf._createFromPositionAndShift(t.sourcePosition,t.howMany);if(i.end.isEqual(e.insertionPosition)){if(!e.graveyardPosition){t.howMany++}t.targetPosition=o;return[t]}if(i.start.hasSameParentAs(e.splitPosition)&&i.containsPosition(e.splitPosition)){let t=new Kf(e.splitPosition,i.end);t=t._getTransformedBySplitOperation(e);const n=[new Kf(i.start,e.splitPosition),t];return x_(n,o)}if(t.targetPosition.isEqual(e.splitPosition)&&n.abRelation=="insertAtSource"){o=e.moveTargetPosition}if(t.targetPosition.isEqual(e.insertionPosition)&&n.abRelation=="insertBetween"){o=t.targetPosition}const r=i._getTransformedBySplitOperation(e);const s=[r];if(e.graveyardPosition){const o=i.start.isEqual(e.graveyardPosition)||i.containsPosition(e.graveyardPosition);if(t.howMany>1&&o&&!n.aWasUndone){s.push(Kf._createFromPositionAndShift(e.insertionPosition,1))}}return x_(s,o)}));m_(up,pp,((t,e,n)=>{const o=Kf._createFromPositionAndShift(t.sourcePosition,t.howMany);if(e.deletionPosition.hasSameParentAs(t.sourcePosition)&&o.containsPosition(e.sourcePosition)){if(t.type=="remove"&&!n.forceWeakRemove){if(!n.aWasUndone){const n=[];let o=e.graveyardPosition.clone();let i=e.targetPosition._getTransformedByMergeOperation(e);if(t.howMany>1){n.push(new up(t.sourcePosition,t.howMany-1,t.targetPosition,0));o=o._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany-1);i=i._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany-1)}const r=e.deletionPosition._getCombined(t.sourcePosition,t.targetPosition);const s=new up(o,1,r,0);const a=s.getMovedRangeStart().path.slice();a.push(0);const c=new Mf(s.targetPosition.root,a);i=i._getTransformedByMove(o,r,1);const l=new up(i,e.howMany,c,0);n.push(s);n.push(l);return n}}else{if(t.howMany==1){if(!n.bWasUndone){return[new Lp(0)]}else{t.sourcePosition=e.graveyardPosition.clone();t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e);return[t]}}}}const i=Kf._createFromPositionAndShift(t.sourcePosition,t.howMany);const r=i._getTransformedByMergeOperation(e);t.sourcePosition=r.start;t.howMany=r.end.offset-r.start.offset;t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e);return[t]}));m_(mp,hp,((t,e)=>{t.position=t.position._getTransformedByInsertOperation(e);return[t]}));m_(mp,pp,((t,e)=>{if(t.position.isEqual(e.deletionPosition)){t.position=e.graveyardPosition.clone();t.position.stickiness="toNext";return[t]}t.position=t.position._getTransformedByMergeOperation(e);return[t]}));m_(mp,up,((t,e)=>{t.position=t.position._getTransformedByMoveOperation(e);return[t]}));m_(mp,mp,((t,e,n)=>{if(t.position.isEqual(e.position)){if(n.aIsStrong){t.oldName=e.newName}else{return[new Lp(0)]}}return[t]}));m_(mp,bp,((t,e)=>{const n=t.position.path;const o=e.splitPosition.getParentPath();if(Ia(n,o)=="same"&&!e.graveyardPosition){const e=new mp(t.position.getShiftedBy(1),t.oldName,t.newName,0);return[t,e]}t.position=t.position._getTransformedBySplitOperation(e);return[t]}));m_(gp,gp,((t,e,n)=>{if(t.root===e.root&&t.key===e.key){if(!n.aIsStrong||t.newValue===e.newValue){return[new Lp(0)]}else{t.oldValue=e.newValue}}return[t]}));m_(bp,hp,((t,e)=>{if(t.splitPosition.hasSameParentAs(e.position)&&t.splitPosition.offset<e.position.offset){t.howMany+=e.howMany}t.splitPosition=t.splitPosition._getTransformedByInsertOperation(e);t.insertionPosition=t.insertionPosition._getTransformedByInsertOperation(e);return[t]}));m_(bp,pp,((t,e,n)=>{if(!t.graveyardPosition&&!n.bWasUndone&&t.splitPosition.hasSameParentAs(e.sourcePosition)){const n=e.graveyardPosition.path.slice();n.push(0);const o=new Mf(e.graveyardPosition.root,n);const i=bp.getInsertionPosition(new Mf(e.graveyardPosition.root,n));const r=new bp(o,0,i,null,0);t.splitPosition=t.splitPosition._getTransformedByMergeOperation(e);t.insertionPosition=bp.getInsertionPosition(t.splitPosition);t.graveyardPosition=r.insertionPosition.clone();t.graveyardPosition.stickiness="toNext";return[r,t]}if(t.splitPosition.hasSameParentAs(e.deletionPosition)&&!t.splitPosition.isAfter(e.deletionPosition)){t.howMany--}if(t.splitPosition.hasSameParentAs(e.targetPosition)){t.howMany+=e.howMany}t.splitPosition=t.splitPosition._getTransformedByMergeOperation(e);t.insertionPosition=bp.getInsertionPosition(t.splitPosition);if(t.graveyardPosition){t.graveyardPosition=t.graveyardPosition._getTransformedByMergeOperation(e)}return[t]}));m_(bp,up,((t,e,n)=>{const o=Kf._createFromPositionAndShift(e.sourcePosition,e.howMany);if(t.graveyardPosition){const i=o.start.isEqual(t.graveyardPosition)||o.containsPosition(t.graveyardPosition);if(!n.bWasUndone&&i){const n=t.splitPosition._getTransformedByMoveOperation(e);const o=t.graveyardPosition._getTransformedByMoveOperation(e);const i=o.path.slice();i.push(0);const r=new Mf(o.root,i);const s=new up(n,t.howMany,r,0);return[s]}t.graveyardPosition=t.graveyardPosition._getTransformedByMoveOperation(e)}const i=t.splitPosition.isEqual(e.targetPosition);if(i&&(n.baRelation=="insertAtSource"||n.abRelation=="splitBefore")){t.howMany+=e.howMany;t.splitPosition=t.splitPosition._getTransformedByDeletion(e.sourcePosition,e.howMany);t.insertionPosition=bp.getInsertionPosition(t.splitPosition);return[t]}if(i&&n.abRelation&&n.abRelation.howMany){const{howMany:e,offset:o}=n.abRelation;t.howMany+=e;t.splitPosition=t.splitPosition.getShiftedBy(o);return[t]}if(t.splitPosition.hasSameParentAs(e.sourcePosition)&&o.containsPosition(t.splitPosition)){const n=e.howMany-(t.splitPosition.offset-e.sourcePosition.offset);t.howMany-=n;if(t.splitPosition.hasSameParentAs(e.targetPosition)&&t.splitPosition.offset<e.targetPosition.offset){t.howMany+=e.howMany}t.splitPosition=e.sourcePosition.clone();t.insertionPosition=bp.getInsertionPosition(t.splitPosition);return[t]}if(!e.sourcePosition.isEqual(e.targetPosition)){if(t.splitPosition.hasSameParentAs(e.sourcePosition)&&t.splitPosition.offset<=e.sourcePosition.offset){t.howMany-=e.howMany}if(t.splitPosition.hasSameParentAs(e.targetPosition)&&t.splitPosition.offset<e.targetPosition.offset){t.howMany+=e.howMany}}t.splitPosition.stickiness="toNone";t.splitPosition=t.splitPosition._getTransformedByMoveOperation(e);t.splitPosition.stickiness="toNext";if(t.graveyardPosition){t.insertionPosition=t.insertionPosition._getTransformedByMoveOperation(e)}else{t.insertionPosition=bp.getInsertionPosition(t.splitPosition)}return[t]}));m_(bp,bp,((t,e,n)=>{if(t.splitPosition.isEqual(e.splitPosition)){if(!t.graveyardPosition&&!e.graveyardPosition){return[new Lp(0)]}if(t.graveyardPosition&&e.graveyardPosition&&t.graveyardPosition.isEqual(e.graveyardPosition)){return[new Lp(0)]}if(n.abRelation=="splitBefore"){t.howMany=0;t.graveyardPosition=t.graveyardPosition._getTransformedBySplitOperation(e);return[t]}}if(t.graveyardPosition&&e.graveyardPosition&&t.graveyardPosition.isEqual(e.graveyardPosition)){const o=t.splitPosition.root.rootName=="$graveyard";const i=e.splitPosition.root.rootName=="$graveyard";const r=o&&!i;const s=i&&!o;const a=s||!r&&n.aIsStrong;if(a){const n=[];if(e.howMany){n.push(new up(e.moveTargetPosition,e.howMany,e.splitPosition,0))}if(t.howMany){n.push(new up(t.splitPosition,t.howMany,t.moveTargetPosition,0))}return n}else{return[new Lp(0)]}}if(t.graveyardPosition){t.graveyardPosition=t.graveyardPosition._getTransformedBySplitOperation(e)}if(t.splitPosition.isEqual(e.insertionPosition)&&n.abRelation=="splitBefore"){t.howMany++;return[t]}if(e.splitPosition.isEqual(t.insertionPosition)&&n.baRelation=="splitBefore"){const n=e.insertionPosition.path.slice();n.push(0);const o=new Mf(e.insertionPosition.root,n);const i=new up(t.insertionPosition,1,o,0);return[t,i]}if(t.splitPosition.hasSameParentAs(e.splitPosition)&&t.splitPosition.offset<e.splitPosition.offset){t.howMany-=e.howMany}t.splitPosition=t.splitPosition._getTransformedBySplitOperation(e);t.insertionPosition=bp.getInsertionPosition(t.splitPosition);return[t]}));function y_(t,e){return t.targetPosition._getTransformedByDeletion(e.sourcePosition,e.howMany)===null}function x_(t,e){const n=[];for(let o=0;o<t.length;o++){const i=t[o];const r=new up(i.start,i.end.offset-i.start.offset,e,0);n.push(r);for(let e=o+1;e<t.length;e++){t[e]=t[e]._getTransformedByMove(r.sourcePosition,r.targetPosition,r.howMany)[0]}e=e._getTransformedByMove(r.sourcePosition,r.targetPosition,r.howMany)}return n}class E_ extends _h{constructor(t){super(t);this.domEventType="click"}onDomEvent(t){this.fire(t.type,t)}}class D_ extends _h{constructor(t){super(t);this.domEventType=["mousedown","mouseup"]}onDomEvent(t){this.fire(t.type,t)}}class S_{constructor(t){this.document=t}createDocumentFragment(t){return new bd(this.document,t)}createElement(t,e,n){return new ul(this.document,t,e,n)}createText(t){return new Na(this.document,t)}clone(t,e=false){return t._clone(e)}appendChild(t,e){return e._appendChild(t)}insertChild(t,e,n){return n._insertChild(t,e)}removeChildren(t,e,n){return n._removeChildren(t,e)}remove(t){const e=t.parent;if(e){return this.removeChildren(e.getChildIndex(t),1,e)}return[]}replace(t,e){const n=t.parent;if(n){const o=n.getChildIndex(t);this.removeChildren(o,1,n);this.insertChild(o,e,n);return true}return false}unwrapElement(t){const e=t.parent;if(e){const n=e.getChildIndex(t);this.remove(t);this.insertChild(n,t.getChildren(),e)}}rename(t,e){const n=new ul(this.document,t,e.getAttributes(),e.getChildren());return this.replace(e,n)?n:null}setAttribute(t,e,n){n._setAttribute(t,e)}removeAttribute(t,e){e._removeAttribute(t)}addClass(t,e){e._addClass(t)}removeClass(t,e){e._removeClass(t)}setStyle(t,e,n){if(io(t)&&n===undefined){n=e}n._setStyle(t,e)}removeStyle(t,e){e._removeStyle(t)}setCustomProperty(t,e,n){n._setCustomProperty(t,e)}removeCustomProperty(t,e){return e._removeCustomProperty(t)}createPositionAt(t,e){return Al._createAt(t,e)}createPositionAfter(t){return Al._createAfter(t)}createPositionBefore(t){return Al._createBefore(t)}createRange(t,e){return new _l(t,e)}createRangeOn(t){return _l._createOn(t)}createRangeIn(t){return _l._createIn(t)}createSelection(t,e,n){return new xl(t,e,n)}}const B_=/^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;const T_=/^rgb\([ ]?([0-9]{1,3}[ %]?,[ ]?){2,3}[0-9]{1,3}[ %]?\)$/i;const P_=/^rgba\([ ]?([0-9]{1,3}[ %]?,[ ]?){3}(1|[0-9]+%|[0]?\.?[0-9]+)\)$/i;const I_=/^hsl\([ ]?([0-9]{1,3}[ %]?[,]?[ ]*){3}(1|[0-9]+%|[0]?\.?[0-9]+)?\)$/i;const R_=/^hsla\([ ]?([0-9]{1,3}[ %]?,[ ]?){2,3}(1|[0-9]+%|[0]?\.?[0-9]+)\)$/i;const F_=new Set(["black","silver","gray","white","maroon","red","purple","fuchsia","green","lime","olive","yellow","navy","blue","teal","aqua","orange","aliceblue","antiquewhite","aquamarine","azure","beige","bisque","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","gainsboro","ghostwhite","gold","goldenrod","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","limegreen","linen","magenta","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","oldlace","olivedrab","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","thistle","tomato","turquoise","violet","wheat","whitesmoke","yellowgreen","rebeccapurple","currentcolor","transparent"]);function z_(t){if(t.startsWith("#")){return B_.test(t)}if(t.startsWith("rgb")){return T_.test(t)||P_.test(t)}if(t.startsWith("hsl")){return I_.test(t)||R_.test(t)}return F_.has(t.toLowerCase())}const O_=["none","hidden","dotted","dashed","solid","double","groove","ridge","inset","outset"];function N_(t){return O_.includes(t)}const M_=/^([+-]?[0-9]*([.][0-9]+)?(px|cm|mm|in|pc|pt|ch|em|ex|rem|vh|vw|vmin|vmax)|0)$/;function V_(t){return M_.test(t)}const L_=/^[+-]?[0-9]*([.][0-9]+)?%$/;function H_(t){return L_.test(t)}const K_=["repeat-x","repeat-y","repeat","space","round","no-repeat"];function q_(t){return K_.includes(t)}const j_=["center","top","bottom","left","right"];function W_(t){return j_.includes(t)}const G_=["fixed","scroll","local"];function U_(t){return G_.includes(t)}const $_=/^url\(/;function J_(t){return $_.test(t)}function Y_(t=""){if(t===""){return{top:undefined,right:undefined,bottom:undefined,left:undefined}}const e=tv(t);const n=e[0];const o=e[2]||n;const i=e[1]||n;const r=e[3]||i;return{top:n,bottom:o,right:i,left:r}}function Q_(t){return e=>{const{top:n,right:o,bottom:i,left:r}=e;const s=[];if(![n,o,r,i].every((t=>!!t))){if(n){s.push([t+"-top",n])}if(o){s.push([t+"-right",o])}if(i){s.push([t+"-bottom",i])}if(r){s.push([t+"-left",r])}}else{s.push([t,X_(e)])}return s}}function X_({top:t,right:e,bottom:n,left:o}){const i=[];if(o!==e){i.push(t,e,n,o)}else if(n!==t){i.push(t,e,n)}else if(e!==t){i.push(t,e)}else{i.push(t)}return i.join(" ")}function Z_(t){return e=>({path:t,value:Y_(e)})}function tv(t){return t.replace(/, /g,",").split(" ").map((t=>t.replace(/,/g,", ")))}function ev(t){t.setNormalizer("background",nv);t.setNormalizer("background-color",(t=>({path:"background.color",value:t})));t.setReducer("background",(t=>{const e=[];e.push(["background-color",t.color]);return e}))}function nv(t){const e={};const n=tv(t);for(const t of n){if(q_(t)){e.repeat=e.repeat||[];e.repeat.push(t)}else if(W_(t)){e.position=e.position||[];e.position.push(t)}else if(U_(t)){e.attachment=t}else if(z_(t)){e.color=t}else if(J_(t)){e.image=t}}return{path:"background",value:e}}function ov(t){t.setNormalizer("border",iv);t.setNormalizer("border-top",rv("top"));t.setNormalizer("border-right",rv("right"));t.setNormalizer("border-bottom",rv("bottom"));t.setNormalizer("border-left",rv("left"));t.setNormalizer("border-color",sv("color"));t.setNormalizer("border-width",sv("width"));t.setNormalizer("border-style",sv("style"));t.setNormalizer("border-top-color",cv("color","top"));t.setNormalizer("border-top-style",cv("style","top"));t.setNormalizer("border-top-width",cv("width","top"));t.setNormalizer("border-right-color",cv("color","right"));t.setNormalizer("border-right-style",cv("style","right"));t.setNormalizer("border-right-width",cv("width","right"));t.setNormalizer("border-bottom-color",cv("color","bottom"));t.setNormalizer("border-bottom-style",cv("style","bottom"));t.setNormalizer("border-bottom-width",cv("width","bottom"));t.setNormalizer("border-left-color",cv("color","left"));t.setNormalizer("border-left-style",cv("style","left"));t.setNormalizer("border-left-width",cv("width","left"));t.setExtractor("border-top",lv("top"));t.setExtractor("border-right",lv("right"));t.setExtractor("border-bottom",lv("bottom"));t.setExtractor("border-left",lv("left"));t.setExtractor("border-top-color","border.color.top");t.setExtractor("border-right-color","border.color.right");t.setExtractor("border-bottom-color","border.color.bottom");t.setExtractor("border-left-color","border.color.left");t.setExtractor("border-top-width","border.width.top");t.setExtractor("border-right-width","border.width.right");t.setExtractor("border-bottom-width","border.width.bottom");t.setExtractor("border-left-width","border.width.left");t.setExtractor("border-top-style","border.style.top");t.setExtractor("border-right-style","border.style.right");t.setExtractor("border-bottom-style","border.style.bottom");t.setExtractor("border-left-style","border.style.left");t.setReducer("border-color",Q_("border-color"));t.setReducer("border-style",Q_("border-style"));t.setReducer("border-width",Q_("border-width"));t.setReducer("border-top",fv("top"));t.setReducer("border-right",fv("right"));t.setReducer("border-bottom",fv("bottom"));t.setReducer("border-left",fv("left"));t.setReducer("border",hv);t.setStyleRelation("border",["border-color","border-style","border-width","border-top","border-right","border-bottom","border-left","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-style","border-right-style","border-bottom-style","border-left-style","border-top-width","border-right-width","border-bottom-width","border-left-width"]);t.setStyleRelation("border-color",["border-top-color","border-right-color","border-bottom-color","border-left-color"]);t.setStyleRelation("border-style",["border-top-style","border-right-style","border-bottom-style","border-left-style"]);t.setStyleRelation("border-width",["border-top-width","border-right-width","border-bottom-width","border-left-width"]);t.setStyleRelation("border-top",["border-top-color","border-top-style","border-top-width"]);t.setStyleRelation("border-right",["border-right-color","border-right-style","border-right-width"]);t.setStyleRelation("border-bottom",["border-bottom-color","border-bottom-style","border-bottom-width"]);t.setStyleRelation("border-left",["border-left-color","border-left-style","border-left-width"])}function iv(t){const{color:e,style:n,width:o}=uv(t);return{path:"border",value:{color:Y_(e),style:Y_(n),width:Y_(o)}}}function rv(t){return e=>{const{color:n,style:o,width:i}=uv(e);const r={};if(n!==undefined){r.color={[t]:n}}if(o!==undefined){r.style={[t]:o}}if(i!==undefined){r.width={[t]:i}}return{path:"border",value:r}}}function sv(t){return e=>({path:"border",value:av(e,t)})}function av(t,e){return{[e]:Y_(t)}}function cv(t,e){return n=>({path:"border",value:{[t]:{[e]:n}}})}function lv(t){return(e,n)=>{if(n.border){return dv(n.border,t)}}}function dv(t,e){const n={};if(t.width&&t.width[e]){n.width=t.width[e]}if(t.style&&t.style[e]){n.style=t.style[e]}if(t.color&&t.color[e]){n.color=t.color[e]}return n}function uv(t){const e={};const n=tv(t);for(const t of n){if(V_(t)||/thin|medium|thick/.test(t)){e.width=t}else if(N_(t)){e.style=t}else{e.color=t}}return e}function hv(t){const e=[];e.push(...mv(dv(t,"top"),"top"));e.push(...mv(dv(t,"right"),"right"));e.push(...mv(dv(t,"bottom"),"bottom"));e.push(...mv(dv(t,"left"),"left"));return e}function fv(t){return e=>mv(e,t)}function mv(t,e){const n=[];if(t&&t.width!==undefined){n.push(t.width)}if(t&&t.style!==undefined){n.push(t.style)}if(t&&t.color!==undefined){n.push(t.color)}if(n.length){return[[`border-${e}`,n.join(" ")]]}return[]}function gv(t){t.setNormalizer("margin",Z_("margin"));t.setNormalizer("margin-top",(t=>({path:"margin.top",value:t})));t.setNormalizer("margin-right",(t=>({path:"margin.right",value:t})));t.setNormalizer("margin-bottom",(t=>({path:"margin.bottom",value:t})));t.setNormalizer("margin-left",(t=>({path:"margin.left",value:t})));t.setReducer("margin",Q_("margin"));t.setStyleRelation("margin",["margin-top","margin-right","margin-bottom","margin-left"])}function pv(t){t.setNormalizer("padding",Z_("padding"));t.setNormalizer("padding-top",(t=>({path:"padding.top",value:t})));t.setNormalizer("padding-right",(t=>({path:"padding.right",value:t})));t.setNormalizer("padding-bottom",(t=>({path:"padding.bottom",value:t})));t.setNormalizer("padding-left",(t=>({path:"padding.left",value:t})));t.setReducer("padding",Q_("padding"));t.setStyleRelation("padding",["padding-top","padding-right","padding-bottom","padding-left"])}class bv extends Rb{constructor(t,e){super(t);this.view=e;this._toolbarConfig=eC(t.config.get("toolbar"));this._elementReplacer=new Jh}get element(){return this.view.element}init(t){const e=this.editor;const n=this.view;const o=e.editing.view;const i=n.editable;const r=o.document.getRoot();i.name=r.rootName;n.render();const s=i.element;this.setEditableElement(i.name,s);this.focusTracker.add(s);n.editable.bind("isFocused").to(this.focusTracker);o.attachDomRoot(s);if(t){this._elementReplacer.replace(t,this.element)}this._initPlaceholder();this._initToolbar();this.fire("ready")}destroy(){const t=this.view;const e=this.editor.editing.view;this._elementReplacer.restore();e.detachDomRoot(t.editable.name);t.destroy();super.destroy()}_initToolbar(){const t=this.editor;const e=this.view;const n=t.editing.view;e.stickyPanel.bind("isActive").to(this.focusTracker,"isFocused");e.stickyPanel.limiterElement=e.element;if(this._toolbarConfig.viewportTopOffset){e.stickyPanel.viewportTopOffset=this._toolbarConfig.viewportTopOffset}e.toolbar.fillFromConfig(this._toolbarConfig,this.componentFactory);HA({origin:n,originFocusTracker:this.focusTracker,originKeystrokeHandler:t.keystrokes,toolbar:e.toolbar})}_initPlaceholder(){const t=this.editor;const e=t.editing.view;const n=e.document.getRoot();const o=t.sourceElement;const i=t.config.get("placeholder")||o&&o.tagName.toLowerCase()==="textarea"&&o.getAttribute("placeholder");if(i){r_({view:e,element:n,text:i,isDirectHost:false,keepOnFocus:true})}}}var kv=n(35);var wv={injectType:"singletonStyleTag",attributes:{"data-cke":true}};wv.insert="head";wv.singleton=true;var Cv=wk()(kv["a"],wv);var Av=kv["a"].locals||{};class _v extends KC{constructor(t,e,n={}){super(t);this.stickyPanel=new LA(t);this.toolbar=new sC(t,{shouldGroupWhenFull:n.shouldToolbarGroupWhenFull});this.editable=new jC(t,e)}render(){super.render();this.stickyPanel.content.add(this.toolbar);this.top.add(this.stickyPanel);this.main.add(this.editable)}}class vv extends Tb{constructor(t,e){super(e);if(fa(t)){this.sourceElement=t}this.model.document.createRoot();const n=!this.config.get("toolbar.shouldNotGroupWhenFull");const o=new _v(this.locale,this.editing.view,{shouldToolbarGroupWhenFull:n});this.ui=new bv(this,o);Fb(this)}destroy(){if(this.sourceElement){this.updateSourceElement()}this.ui.destroy();return super.destroy()}static create(t,e={}){return new Promise((n=>{const o=new this(t,e);n(o.initPlugins().then((()=>o.ui.init(fa(t)?t:null))).then((()=>{if(!fa(t)&&e.initialData){throw new u["a"]("editor-create-initial-data",null)}const n=e.initialData||yv(t);return o.data.init(n)})).then((()=>o.fire("ready"))).then((()=>o)))}))}}Hn(vv,Ob);Hn(vv,Mb);function yv(t){return fa(t)?tf(t):t}const xv=["left","right","center","justify"];function Ev(t){return xv.includes(t)}function Dv(t,e){if(e.contentLanguageDirection=="rtl"){return t==="right"}else{return t==="left"}}function Sv(t){const e=t.map((t=>{let e;if(typeof t=="string"){e={name:t}}else{e=t}return e})).filter((t=>{const e=!!xv.includes(t.name);if(!e){Object(u["b"])("alignment-config-name-not-recognized",{option:t})}return e}));const n=e.filter((t=>!!t.className)).length;if(n&&n<e.length){throw new u["a"]("alignment-config-classnames-are-missing",{configuredOptions:t})}e.forEach(((e,n,o)=>{const i=o.slice(n+1);const r=i.some((t=>t.name==e.name));if(r){throw new u["a"]("alignment-config-name-already-defined",{option:e,configuredOptions:t})}if(e.className){const n=i.some((t=>t.className==e.className));if(n){throw new u["a"]("alignment-config-classname-already-defined",{option:e,configuredOptions:t})}}}));return e}const Bv="alignment";class Tv extends jn{refresh(){const t=this.editor;const e=t.locale;const n=ff(this.editor.model.document.selection.getSelectedBlocks());this.isEnabled=!!n&&this._canBeAligned(n);if(this.isEnabled&&n.hasAttribute("alignment")){this.value=n.getAttribute("alignment")}else{this.value=e.contentLanguageDirection==="rtl"?"right":"left"}}execute(t={}){const e=this.editor;const n=e.locale;const o=e.model;const i=o.document;const r=t.value;o.change((t=>{const e=Array.from(i.selection.getSelectedBlocks()).filter((t=>this._canBeAligned(t)));const o=e[0].getAttribute("alignment");const s=Dv(r,n)||o===r||!r;if(s){Pv(e,t)}else{Iv(e,t,r)}}))}_canBeAligned(t){return this.editor.model.schema.checkAttribute(t,Bv)}}function Pv(t,e){for(const n of t){e.removeAttribute(Bv,n)}}function Iv(t,e,n){for(const o of t){e.setAttribute(Bv,n,o)}}class Rv extends Kn{static get pluginName(){return"AlignmentEditing"}constructor(t){super(t);t.config.define("alignment",{options:[...xv.map((t=>({name:t})))]})}init(){const t=this.editor;const e=t.locale;const n=t.model.schema;const o=Sv(t.config.get("alignment.options"));const i=o.filter((t=>Ev(t.name)&&!Dv(t.name,e)));const r=i.some((t=>!!t.className));n.extend("$block",{allowAttributes:"alignment"});t.model.schema.setAttributeProperties("alignment",{isFormatting:true});if(r){t.conversion.attributeToAttribute(Ov(i))}else{t.conversion.for("downcast").attributeToAttribute(Fv(i))}const s=zv(i);for(const e of s){t.conversion.for("upcast").attributeToAttribute(e)}t.commands.add("alignment",new Tv(t))}}function Fv(t){const e={model:{key:"alignment",values:t.map((t=>t.name))},view:{}};for(const{name:n}of t){e.view[n]={key:"style",value:{"text-align":n}}}return e}function zv(t){const e=[];for(const{name:n}of t){e.push({view:{key:"style",value:{"text-align":n}},model:{key:"alignment",value:n}})}return e}function Ov(t){const e={model:{key:"alignment",values:t.map((t=>t.name))},view:{}};for(const n of t){e.view[n.name]={key:"class",value:n.className}}return e}const Nv=new Map([["left",hk.alignLeft],["right",hk.alignRight],["center",hk.alignCenter],["justify",hk.alignJustify]]);class Mv extends Kn{get localizedOptionTitles(){const t=this.editor.t;return{left:t("Align left"),right:t("Align right"),center:t("Align center"),justify:t("Justify")}}static get pluginName(){return"AlignmentUI"}init(){const t=this.editor;const e=t.ui.componentFactory;const n=t.t;const o=Sv(t.config.get("alignment.options"));o.map((t=>t.name)).filter(Ev).forEach((t=>this._addButton(t)));e.add("alignment",(t=>{const i=xC(t);const r=o.map((t=>e.create(`alignment:${t.name}`)));EC(i,r);i.buttonView.set({label:n("Text alignment"),tooltip:true});i.toolbarView.isVertical=true;i.toolbarView.ariaLabel=n("Text alignment toolbar");i.extendTemplate({attributes:{class:"ck-alignment-dropdown"}});const s=t.contentLanguageDirection==="rtl"?Nv.get("right"):Nv.get("left");i.buttonView.bind("icon").toMany(r,"isOn",((...t)=>{const e=t.findIndex((t=>t));if(e<0){return s}return r[e].icon}));i.bind("isEnabled").toMany(r,"isEnabled",((...t)=>t.some((t=>t))));return i}))}_addButton(t){const e=this.editor;e.ui.componentFactory.add(`alignment:${t}`,(n=>{const o=e.commands.get("alignment");const i=new fw(n);i.set({label:this.localizedOptionTitles[t],icon:Nv.get(t),tooltip:true,isToggleable:true});i.bind("isEnabled").to(o);i.bind("isOn").to(o,"value",(e=>e===t));this.listenTo(i,"execute",(()=>{e.execute("alignment",{value:t});e.editing.view.focus()}));return i}))}}class Vv extends Kn{static get requires(){return[Rv,Mv]}static get pluginName(){return"Alignment"}}class Lv{constructor(t){this.files=Hv(t);this._native=t}get types(){return this._native.types}getData(t){return this._native.getData(t)}setData(t,e){this._native.setData(t,e)}set effectAllowed(t){this._native.effectAllowed=t}get effectAllowed(){return this._native.effectAllowed}set dropEffect(t){this._native.dropEffect=t}get dropEffect(){return this._native.dropEffect}get isCanceled(){return this._native.dropEffect=="none"||!!this._native.mozUserCancelled}}function Hv(t){const e=t.files?Array.from(t.files):[];const n=t.items?Array.from(t.items):[];if(e.length){return e}return n.filter((t=>t.kind==="file")).map((t=>t.getAsFile()))}class Kv extends _h{constructor(t){super(t);const e=this.document;this.domEventType=["paste","copy","cut","drop","dragover","dragstart","dragend","dragenter","dragleave"];this.listenTo(e,"paste",n("clipboardInput"),{priority:"low"});this.listenTo(e,"drop",n("clipboardInput"),{priority:"low"});this.listenTo(e,"dragover",n("dragging"),{priority:"low"});function n(t){return(n,o)=>{o.preventDefault();const i=o.dropRange?[o.dropRange]:null;const s=new r(e,t);e.fire(s,{dataTransfer:o.dataTransfer,method:n.name,targetRanges:i,target:o.target});if(s.stop.called){o.stopPropagation()}}}}onDomEvent(t){const e={dataTransfer:new Lv(t.clipboardData?t.clipboardData:t.dataTransfer)};if(t.type=="drop"||t.type=="dragover"){e.dropRange=qv(this.view,t)}this.fire(t.type,t,e)}}function qv(t,e){const n=e.target.ownerDocument;const o=e.clientX;const i=e.clientY;let r;if(n.caretRangeFromPoint&&n.caretRangeFromPoint(o,i)){r=n.caretRangeFromPoint(o,i)}else if(e.rangeParent){r=n.createRange();r.setStart(e.rangeParent,e.rangeOffset);r.collapse(true)}if(r){return t.domConverter.domRangeToView(r)}return null}function jv(t){t=t.replace(/</g,"<").replace(/>/g,">").replace(/\r?\n\r?\n/g,"</p><p>").replace(/\r?\n/g,"<br>").replace(/^\s/," ").replace(/\s$/," ").replace(/\s\s/g," ");if(t.includes("</p><p>")||t.includes("<br>")){t=`<p>${t}</p>`}return t}function Wv(t){return t.replace(/<span(?: class="Apple-converted-space"|)>(\s+)<\/span>/g,((t,e)=>{if(e.length==1){return" "}return e}))}const Gv=["figcaption","li"];function Uv(t){let e="";if(t.is("$text")||t.is("$textProxy")){e=t.data}else if(t.is("element","img")&&t.hasAttribute("alt")){e=t.getAttribute("alt")}else if(t.is("element","br")){e="\n"}else{let n=null;for(const o of t.getChildren()){const t=Uv(o);if(n&&(n.is("containerElement")||o.is("containerElement"))){if(Gv.includes(n.name)||Gv.includes(o.name)){e+="\n"}else{e+="\n\n"}}e+=t;n=o}}return e}class $v extends Kn{static get pluginName(){return"ClipboardPipeline"}init(){const t=this.editor;const e=t.editing.view;e.addObserver(Kv);this._setupPasteDrop();this._setupCopyCut()}_setupPasteDrop(){const t=this.editor;const e=t.model;const n=t.editing.view;const o=n.document;this.listenTo(o,"clipboardInput",(e=>{if(t.isReadOnly){e.stop()}}),{priority:"highest"});this.listenTo(o,"clipboardInput",((t,e)=>{const o=e.dataTransfer;let i=e.content||"";if(!i){if(o.getData("text/html")){i=Wv(o.getData("text/html"))}else if(o.getData("text/plain")){i=jv(o.getData("text/plain"))}i=this.editor.data.htmlProcessor.toView(i)}const s=new r(this,"inputTransformation");this.fire(s,{content:i,dataTransfer:o,targetRanges:e.targetRanges,method:e.method});if(s.stop.called){t.stop()}n.scrollToTheSelection()}),{priority:"low"});this.listenTo(this,"inputTransformation",((t,n)=>{if(n.content.isEmpty){return}const o=this.editor.data;const i=o.toModel(n.content,"$clipboardHolder");if(i.childCount==0){return}t.stop();e.change((()=>{this.fire("contentInsertion",{content:i,method:n.method,dataTransfer:n.dataTransfer,targetRanges:n.targetRanges})}))}),{priority:"low"});this.listenTo(this,"contentInsertion",((t,n)=>{n.resultRange=e.insertContent(n.content)}),{priority:"low"})}_setupCopyCut(){const t=this.editor;const e=t.model.document;const n=t.editing.view;const o=n.document;function i(n,i){const r=i.dataTransfer;i.preventDefault();const s=t.data.toView(t.model.getSelectedContent(e.selection));o.fire("clipboardOutput",{dataTransfer:r,content:s,method:n.name})}this.listenTo(o,"copy",i,{priority:"low"});this.listenTo(o,"cut",((e,n)=>{if(t.isReadOnly){n.preventDefault()}else{i(e,n)}}),{priority:"low"});this.listenTo(o,"clipboardOutput",((n,o)=>{if(!o.content.isEmpty){o.dataTransfer.setData("text/html",this.editor.data.htmlProcessor.toData(o.content));o.dataTransfer.setData("text/plain",Uv(o.content))}if(o.method=="cut"){t.model.deleteContent(e.selection)}}),{priority:"low"})}}function*Jv(t,e){for(const n of e){if(n&&t.getAttributeProperties(n[0]).copyOnEnter){yield n}}}class Yv extends jn{execute(){const t=this.editor.model;const e=t.document;t.change((n=>{Qv(this.editor.model,n,e.selection,t.schema);this.fire("afterExecute",{writer:n})}))}}function Qv(t,e,n,o){const i=n.isCollapsed;const r=n.getFirstRange();const s=r.start.parent;const a=r.end.parent;if(o.isLimit(s)||o.isLimit(a)){if(!i&&s==a){t.deleteContent(n)}return}if(i){const t=Jv(e.model.schema,n.getAttributes());Xv(e,r.start);e.setSelectionAttribute(t)}else{const o=!(r.start.isAtStart&&r.end.isAtEnd);const i=s==a;t.deleteContent(n,{leaveUnmerged:o});if(o){if(i){Xv(e,n.focus)}else{e.setSelection(a,0)}}}}function Xv(t,e){t.split(e);t.setSelection(e.parent.nextSibling,0)}class Zv extends Cu{constructor(t){super(t);const e=this.document;e.on("keydown",((t,n)=>{if(this.isEnabled&&n.keyCode==td.enter){const o=new Dl(e,"enter",e.selection.getFirstRange());e.fire(o,new Ah(e,n.domEvent,{isSoft:n.shiftKey}));if(o.stop.called){t.stop()}}}))}observe(){}}class ty extends Kn{static get pluginName(){return"Enter"}init(){const t=this.editor;const e=t.editing.view;const n=e.document;e.addObserver(Zv);t.commands.add("enter",new Yv(t));this.listenTo(n,"enter",((n,o)=>{o.preventDefault();if(o.isSoft){return}t.execute("enter");e.scrollToTheSelection()}),{priority:"low"})}}class ey{constructor(t,e=20){this.model=t;this.size=0;this.limit=e;this.isLocked=false;this._changeCallback=(t,e)=>{if(e.type!="transparent"&&e!==this._batch){this._reset(true)}};this._selectionChangeCallback=()=>{this._reset()};this.model.document.on("change",this._changeCallback);this.model.document.selection.on("change:range",this._selectionChangeCallback);this.model.document.selection.on("change:attribute",this._selectionChangeCallback)}get batch(){if(!this._batch){this._batch=this.model.createBatch()}return this._batch}input(t){this.size+=t;if(this.size>=this.limit){this._reset(true)}}lock(){this.isLocked=true}unlock(){this.isLocked=false}destroy(){this.model.document.off("change",this._changeCallback);this.model.document.selection.off("change:range",this._selectionChangeCallback);this.model.document.selection.off("change:attribute",this._selectionChangeCallback)}_reset(t){if(!this.isLocked||t){this._batch=null;this.size=0}}}class ny extends jn{constructor(t,e){super(t);this.direction=e;this._buffer=new ey(t.model,t.config.get("typing.undoStep"))}get buffer(){return this._buffer}execute(t={}){const e=this.editor.model;const n=e.document;e.enqueueChange(this._buffer.batch,(o=>{this._buffer.lock();const i=o.createSelection(t.selection||n.selection);const r=t.sequence||1;const s=i.isCollapsed;if(i.isCollapsed){e.modifySelection(i,{direction:this.direction,unit:t.unit})}if(this._shouldEntireContentBeReplacedWithParagraph(r)){this._replaceEntireContentWithParagraph(o);return}if(this._shouldReplaceFirstBlockWithParagraph(i,r)){this.editor.execute("paragraph",{selection:i});return}if(i.isCollapsed){return}let a=0;i.getFirstRange().getMinimalFlatRanges().forEach((t=>{a+=yl(t.getWalker({singleCharacters:true,ignoreElementEnd:true,shallow:true}))}));e.deleteContent(i,{doNotResetEntireContent:s,direction:this.direction});this._buffer.input(a);o.setSelection(i);this._buffer.unlock()}))}_shouldEntireContentBeReplacedWithParagraph(t){if(t>1){return false}const e=this.editor.model;const n=e.document;const o=n.selection;const i=e.schema.getLimitElement(o);const r=o.isCollapsed&&o.containsEntireContent(i);if(!r){return false}if(!e.schema.checkChild(i,"paragraph")){return false}const s=i.getChild(0);if(s&&s.name==="paragraph"){return false}return true}_replaceEntireContentWithParagraph(t){const e=this.editor.model;const n=e.document;const o=n.selection;const i=e.schema.getLimitElement(o);const r=t.createElement("paragraph");t.remove(t.createRangeIn(i));t.insert(r,i);t.setSelection(r,0)}_shouldReplaceFirstBlockWithParagraph(t,e){const n=this.editor.model;if(e>1||this.direction!="backward"){return false}if(!t.isCollapsed){return false}const o=t.getFirstPosition();const i=n.schema.getLimitElement(o);const r=i.getChild(0);if(o.parent!=r){return false}if(!t.containsEntireContent(r)){return false}if(!n.schema.checkChild(i,"paragraph")){return false}if(r.name=="paragraph"){return false}return true}}class oy extends Cu{constructor(t){super(t);const e=t.document;let n=0;e.on("keyup",((t,e)=>{if(e.keyCode==td.delete||e.keyCode==td.backspace){n=0}}));e.on("keydown",((t,e)=>{const i={};if(e.keyCode==td.delete){i.direction="forward";i.unit="character"}else if(e.keyCode==td.backspace){i.direction="backward";i.unit="codePoint"}else{return}const r=Wl.isMac?e.altKey:e.ctrlKey;i.unit=r?"word":i.unit;i.sequence=++n;o(t,e.domEvent,i)}));if(Wl.isAndroid){e.on("beforeinput",((e,n)=>{if(n.domEvent.inputType!="deleteContentBackward"){return}const i={unit:"codepoint",direction:"backward",sequence:1};const r=n.domTarget.ownerDocument.defaultView.getSelection();if(r.anchorNode==r.focusNode&&r.anchorOffset+1!=r.focusOffset){i.selectionToRemove=t.domConverter.domSelectionToView(r)}o(e,n.domEvent,i)}))}function o(t,n,o){const i=new Dl(e,"delete",e.selection.getFirstRange());e.fire(i,new Ah(e,n,o));if(i.stop.called){t.stop()}}}observe(){}}class iy extends Kn{static get pluginName(){return"Delete"}init(){const t=this.editor;const e=t.editing.view;const n=e.document;e.addObserver(oy);const o=new ny(t,"forward");t.commands.add("deleteForward",o);t.commands.add("forwardDelete",o);t.commands.add("delete",new ny(t,"backward"));this.listenTo(n,"delete",((n,o)=>{const i={unit:o.unit,sequence:o.sequence};if(o.selectionToRemove){const e=t.model.createSelection();const n=[];for(const e of o.selectionToRemove.getRanges()){n.push(t.editing.mapper.toModelRange(e))}e.setTo(n);i.selection=e}t.execute(o.direction=="forward"?"deleteForward":"delete",i);o.preventDefault();e.scrollToTheSelection()}),{priority:"low"});if(Wl.isAndroid){let t=null;this.listenTo(n,"delete",((e,n)=>{const o=n.domTarget.ownerDocument.defaultView.getSelection();t={anchorNode:o.anchorNode,anchorOffset:o.anchorOffset,focusNode:o.focusNode,focusOffset:o.focusOffset}}),{priority:"lowest"});this.listenTo(n,"keyup",((e,n)=>{if(t){const e=n.domTarget.ownerDocument.defaultView.getSelection();e.collapse(t.anchorNode,t.anchorOffset);e.extend(t.focusNode,t.focusOffset);t=null}}))}}}class ry{constructor(){this._stack=[]}add(t,e){const n=this._stack;const o=n[0];this._insertDescriptor(t);const i=n[0];if(o!==i&&!sy(o,i)){this.fire("change:top",{oldDescriptor:o,newDescriptor:i,writer:e})}}remove(t,e){const n=this._stack;const o=n[0];this._removeDescriptor(t);const i=n[0];if(o!==i&&!sy(o,i)){this.fire("change:top",{oldDescriptor:o,newDescriptor:i,writer:e})}}_insertDescriptor(t){const e=this._stack;const n=e.findIndex((e=>e.id===t.id));if(sy(t,e[n])){return}if(n>-1){e.splice(n,1)}let o=0;while(e[o]&&ay(e[o],t)){o++}e.splice(o,0,t)}_removeDescriptor(t){const e=this._stack;const n=e.findIndex((e=>e.id===t));if(n>-1){e.splice(n,1)}}}Hn(ry,g);function sy(t,e){return t&&e&&t.priority==e.priority&&cy(t.classes)==cy(e.classes)}function ay(t,e){if(t.priority>e.priority){return true}else if(t.priority<e.priority){return false}return cy(t.classes)>cy(e.classes)}function cy(t){return Array.isArray(t)?t.sort().join(","):t}var ly='<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M4 0v1H1v3H0V.5A.5.5 0 0 1 .5 0H4zm8 0h3.5a.5.5 0 0 1 .5.5V4h-1V1h-3V0zM4 16H.5a.5.5 0 0 1-.5-.5V12h1v3h3v1zm8 0v-1h3v-3h1v3.5a.5.5 0 0 1-.5.5H12z"/><path fill-opacity=".256" d="M1 1h14v14H1z"/><g class="ck-icon__selected-indicator"><path d="M7 0h2v1H7V0zM0 7h1v2H0V7zm15 0h1v2h-1V7zm-8 8h2v1H7v-1z"/><path fill-opacity=".254" d="M1 1h14v14H1z"/></g></svg>';const dy="ck-widget";const uy="ck-widget_selected";function hy(t){if(!t.is("element")){return false}return!!t.getCustomProperty("widget")}function fy(t,e,n={}){if(!t.is("containerElement")){throw new u["a"]("widget-to-widget-wrong-element-type",null,{element:t})}e.setAttribute("contenteditable","false",t);e.addClass(dy,t);e.setCustomProperty("widget",true,t);t.getFillerOffset=yy;if(n.label){by(t,n.label,e)}if(n.hasSelectionHandle){xy(t,e)}py(t,e,my,gy);return t}function my(t,e,n){if(e.classes){n.addClass(Ca(e.classes),t)}if(e.attributes){for(const o in e.attributes){n.setAttribute(o,e.attributes[o],t)}}}function gy(t,e,n){if(e.classes){n.removeClass(Ca(e.classes),t)}if(e.attributes){for(const o in e.attributes){n.removeAttribute(o,t)}}}function py(t,e,n,o){const i=new ry;i.on("change:top",((e,i)=>{if(i.oldDescriptor){o(t,i.oldDescriptor,i.writer)}if(i.newDescriptor){n(t,i.newDescriptor,i.writer)}}));e.setCustomProperty("addHighlight",((t,e,n)=>i.add(e,n)),t);e.setCustomProperty("removeHighlight",((t,e,n)=>i.remove(e,n)),t)}function by(t,e,n){n.setCustomProperty("widgetLabel",e,t)}function ky(t){const e=t.getCustomProperty("widgetLabel");if(!e){return""}return typeof e=="function"?e():e}function wy(t,e){e.addClass(["ck-editor__editable","ck-editor__nested-editable"],t);e.setAttribute("contenteditable",t.isReadOnly?"false":"true",t);t.on("change:isReadOnly",((n,o,i)=>{e.setAttribute("contenteditable",i?"false":"true",t)}));t.on("change:isFocused",((n,o,i)=>{if(i){e.addClass("ck-editor__nested-editable_focused",t)}else{e.removeClass("ck-editor__nested-editable_focused",t)}}));return t}function Cy(t,e){const n=t.getSelectedElement();if(n){const o=Py(t);if(o){return e.createPositionAt(n,o)}if(e.schema.isBlock(n)){return e.createPositionAfter(n)}}const o=t.getSelectedBlocks().next().value;if(o){if(o.isEmpty){return e.createPositionAt(o,0)}const n=e.createPositionAfter(o);if(t.focus.isTouching(n)){return n}return e.createPositionBefore(o)}return t.focus}function Ay(t,e){const n=t.getSelectedElement();return!!n&&e.isObject(n)}function _y(t,e){return(n,o)=>{const{mapper:i,viewPosition:r}=o;const s=i.findMappedViewAncestor(r);if(!e(s)){return}const a=i.toModelElement(s);o.modelPosition=t.createPositionAt(a,r.isAtStart?"before":"after")}}function vy(t,e){const n=new rf(ru.window);const o=n.getIntersection(t);const i=e.height+bA.arrowVerticalOffset;if(t.top-i>n.top||t.bottom+i<n.bottom){return null}const r=o||t;const s=r.left+r.width/2-e.width/2;return{top:Math.max(t.top,0)+bA.arrowVerticalOffset,left:s,name:"arrow_n"}}function yy(){return null}function xy(t,e){const n=e.createUIElement("div",{class:"ck ck-widget__selection-handle"},(function(t){const e=this.toDomElement(t);const n=new ow;n.set("content",ly);n.render();e.appendChild(n.element);return e}));e.insert(e.createPositionAt(t,0),n);e.addClass(["ck-widget_with-selection-handle"],t)}const Ey="widget-type-around";function Dy(t,e,n){return t&&hy(t)&&!n.isInline(e)}function Sy(t){return t.closest(".ck-widget__type-around__button")}function By(t){return t.classList.contains("ck-widget__type-around__button_before")?"before":"after"}function Ty(t,e){const n=t.closest(".ck-widget");return e.mapDomToView(n)}function Py(t){return t.getAttribute(Ey)}function Iy(t){let e=null;const n=t.model;const o=t.editing.view;const i=t.commands.get("input");if(Wl.isAndroid){o.document.on("beforeinput",((t,e)=>r(e)),{priority:"lowest"})}else{o.document.on("keydown",((t,e)=>r(e)),{priority:"lowest"})}o.document.on("compositionstart",s,{priority:"lowest"});o.document.on("compositionend",(()=>{e=n.createSelection(n.document.selection)}),{priority:"lowest"});function r(t){const r=n.document;const s=o.document.isComposing;const c=e&&e.isEqual(r.selection);e=null;if(!i.isEnabled){return}if(Fy(t)||r.selection.isCollapsed){return}if(s&&t.keyCode===229){return}if(!s&&t.keyCode===229&&c){return}a()}function s(){const t=n.document;const e=t.selection.rangeCount===1?t.selection.getFirstRange().isFlat:true;if(t.selection.isCollapsed||e){return}a()}function a(){const t=i.buffer;t.lock();const e=t.batch;i._batches.add(e);n.enqueueChange(e,(()=>{n.deleteContent(n.document.selection)}));t.unlock()}}const Ry=[nd("arrowUp"),nd("arrowRight"),nd("arrowDown"),nd("arrowLeft"),9,16,17,18,19,20,27,33,34,35,36,45,91,93,144,145,173,174,175,176,177,178,179,255];for(let t=112;t<=135;t++){Ry.push(t)}function Fy(t){if(t.ctrlKey||t.metaKey){return true}return Ry.includes(t.keyCode)}var zy='<svg viewBox="0 0 10 8" xmlns="http://www.w3.org/2000/svg"><path d="M9.055.263v3.972h-6.77M1 4.216l2-2.038m-2 2 2 2.038"/></svg>';var Oy=n(36);var Ny={injectType:"singletonStyleTag",attributes:{"data-cke":true}};Ny.insert="head";Ny.singleton=true;var My=wk()(Oy["a"],Ny);var Vy=Oy["a"].locals||{};const Ly=["before","after"];const Hy=(new DOMParser).parseFromString(zy,"image/svg+xml").firstChild;const Ky="ck-widget__type-around_disabled";class qy extends Kn{static get pluginName(){return"WidgetTypeAround"}static get requires(){return[ty,iy]}constructor(t){super(t);this._currentFakeCaretModelElement=null}init(){const t=this.editor;const e=t.editing.view;this.on("change:isEnabled",((n,o,i)=>{e.change((t=>{for(const n of e.document.roots){if(i){t.removeClass(Ky,n)}else{t.addClass(Ky,n)}}}));if(!i){t.model.change((t=>{t.removeSelectionAttribute(Ey)}))}}));this._enableTypeAroundUIInjection();this._enableInsertingParagraphsOnButtonClick();this._enableInsertingParagraphsOnEnterKeypress();this._enableInsertingParagraphsOnTypingKeystroke();this._enableTypeAroundFakeCaretActivationUsingKeyboardArrows();this._enableDeleteIntegration();this._enableInsertContentIntegration()}destroy(){this._currentFakeCaretModelElement=null}_insertParagraph(t,e){const n=this.editor;const o=n.editing.view;n.execute("insertParagraph",{position:n.model.createPositionAt(t,e)});o.focus();o.scrollToTheSelection()}_listenToIfEnabled(t,e,n,o){this.listenTo(t,e,((...t)=>{if(this.isEnabled){n(...t)}}),o)}_insertParagraphAccordingToFakeCaretPosition(){const t=this.editor;const e=t.model;const n=e.document.selection;const o=Py(n);if(!o){return false}const i=n.getSelectedElement();this._insertParagraph(i,o);return true}_enableTypeAroundUIInjection(){const t=this.editor;const e=t.model.schema;const n=t.locale.t;const o={before:n("Insert paragraph before block"),after:n("Insert paragraph after block")};t.editing.downcastDispatcher.on("insert",((t,n,i)=>{const r=i.mapper.toViewElement(n.item);if(Dy(r,n.item,e)){jy(i.writer,o,r)}}),{priority:"low"})}_enableTypeAroundFakeCaretActivationUsingKeyboardArrows(){const t=this.editor;const e=t.model;const n=e.document.selection;const o=e.schema;const i=t.editing.view;this._listenToIfEnabled(i.document,"arrowKey",((t,e)=>{this._handleArrowKeyPress(t,e)}),{context:[hy,"$text"],priority:"high"});this._listenToIfEnabled(n,"change:range",((e,n)=>{if(!n.directChange){return}t.model.change((t=>{t.removeSelectionAttribute(Ey)}))}));this._listenToIfEnabled(e.document,"change:data",(()=>{const e=n.getSelectedElement();if(e){const n=t.editing.mapper.toViewElement(e);if(Dy(n,e,o)){return}}t.model.change((t=>{t.removeSelectionAttribute(Ey)}))}));this._listenToIfEnabled(t.editing.downcastDispatcher,"selection",((t,e,n)=>{const i=n.writer;if(this._currentFakeCaretModelElement){const t=n.mapper.toViewElement(this._currentFakeCaretModelElement);if(t){i.removeClass(Ly.map(r),t);this._currentFakeCaretModelElement=null}}const s=e.selection.getSelectedElement();if(!s){return}const a=n.mapper.toViewElement(s);if(!Dy(a,s,o)){return}const c=Py(e.selection);if(!c){return}i.addClass(r(c),a);this._currentFakeCaretModelElement=s}));this._listenToIfEnabled(t.ui.focusTracker,"change:isFocused",((e,n,o)=>{if(!o){t.model.change((t=>{t.removeSelectionAttribute(Ey)}))}}));function r(t){return`ck-widget_type-around_show-fake-caret_${t}`}}_handleArrowKeyPress(t,e){const n=this.editor;const o=n.model;const i=o.document.selection;const r=o.schema;const s=n.editing.view;const a=e.keyCode;const c=cd(a,n.locale.contentLanguageDirection);const l=s.document.selection.getSelectedElement();const d=n.editing.mapper.toModelElement(l);let u;if(Dy(l,d,r)){u=this._handleArrowKeyPressOnSelectedWidget(c)}else if(i.isCollapsed){u=this._handleArrowKeyPressWhenSelectionNextToAWidget(c)}if(u){e.preventDefault();t.stop()}}_handleArrowKeyPressOnSelectedWidget(t){const e=this.editor;const n=e.model;const o=n.document.selection;const i=Py(o);return n.change((e=>{if(i){const n=i===(t?"after":"before");if(!n){e.removeSelectionAttribute(Ey);return true}}else{e.setSelectionAttribute(Ey,t?"after":"before");return true}return false}))}_handleArrowKeyPressWhenSelectionNextToAWidget(t){const e=this.editor;const n=e.model;const o=n.schema;const i=e.plugins.get("Widget");const r=i._getObjectElementNextToSelection(t);const s=e.editing.mapper.toViewElement(r);if(Dy(s,r,o)){n.change((e=>{i._setSelectionOverElement(r);e.setSelectionAttribute(Ey,t?"before":"after")}));return true}return false}_enableInsertingParagraphsOnButtonClick(){const t=this.editor;const e=t.editing.view;this._listenToIfEnabled(e.document,"mousedown",((n,o)=>{const i=Sy(o.domTarget);if(!i){return}const r=By(i);const s=Ty(i,e.domConverter);const a=t.editing.mapper.toModelElement(s);this._insertParagraph(a,r);o.preventDefault();n.stop()}))}_enableInsertingParagraphsOnEnterKeypress(){const t=this.editor;const e=t.model.document.selection;const n=t.editing.view;this._listenToIfEnabled(n.document,"enter",((n,o)=>{if(n.eventPhase!="atTarget"){return}const i=e.getSelectedElement();const r=t.editing.mapper.toViewElement(i);const s=t.model.schema;let a;if(this._insertParagraphAccordingToFakeCaretPosition()){a=true}else if(Dy(r,i,s)){this._insertParagraph(i,o.isSoft?"before":"after");a=true}if(a){o.preventDefault();n.stop()}}),{context:hy})}_enableInsertingParagraphsOnTypingKeystroke(){const t=this.editor;const e=t.editing.view;const n=[td.enter,td.delete,td.backspace];this._listenToIfEnabled(e.document,"keydown",((t,e)=>{if(!n.includes(e.keyCode)&&!Fy(e)){this._insertParagraphAccordingToFakeCaretPosition()}}),{priority:"high"})}_enableDeleteIntegration(){const t=this.editor;const e=t.editing.view;const n=t.model;const o=n.schema;this._listenToIfEnabled(e.document,"delete",((e,i)=>{if(e.eventPhase!="atTarget"){return}const r=Py(n.document.selection);if(!r){return}const s=i.direction;const a=n.document.selection.getSelectedElement();const c=r==="before";const l=s=="forward";const d=c===l;if(d){t.execute("delete",{selection:n.createSelection(a,"on")})}else{const e=o.getNearestSelectionRange(n.createPositionAt(a,r),s);if(e){if(!e.isCollapsed){n.change((n=>{n.setSelection(e);t.execute(l?"deleteForward":"delete")}))}else{const i=n.createSelection(e.start);n.modifySelection(i,{direction:s});if(!i.focus.isEqual(e.start)){n.change((n=>{n.setSelection(e);t.execute(l?"deleteForward":"delete")}))}else{const t=Uy(o,e.start.parent);n.deleteContent(n.createSelection(t,"on"),{doNotAutoparagraph:true})}}}}i.preventDefault();e.stop()}),{context:hy})}_enableInsertContentIntegration(){const t=this.editor;const e=this.editor.model;const n=e.document.selection;this._listenToIfEnabled(t.model,"insertContent",((t,[o,i])=>{if(i&&!i.is("documentSelection")){return}const r=Py(n);if(!r){return}t.stop();return e.change((t=>{const i=n.getSelectedElement();const s=e.createPositionAt(i,r);const a=t.createSelection(s);const c=e.insertContent(o,a);t.setSelection(a);return c}))}),{priority:"high"})}}function jy(t,e,n){const o=t.createUIElement("div",{class:"ck ck-reset_all ck-widget__type-around"},(function(t){const n=this.toDomElement(t);Wy(n,e);Gy(n);return n}));t.insert(t.createPositionAt(n,"end"),o)}function Wy(t,e){for(const n of Ly){const o=new Ek({tag:"div",attributes:{class:["ck","ck-widget__type-around__button",`ck-widget__type-around__button_${n}`],title:e[n]},children:[t.ownerDocument.importNode(Hy,true)]});t.appendChild(o.render())}}function Gy(t){const e=new Ek({tag:"div",attributes:{class:["ck","ck-widget__type-around__fake-caret"]}});t.appendChild(e.render())}function Uy(t,e){let n=e;for(const o of e.getAncestors({parentFirst:true})){if(o.childCount>1||t.isLimit(o)){break}n=o}return n}var $y=n(37);var Jy={injectType:"singletonStyleTag",attributes:{"data-cke":true}};Jy.insert="head";Jy.singleton=true;var Yy=wk()($y["a"],Jy);var Qy=$y["a"].locals||{};function Xy(t){const e=t.model;return(n,o)=>{const i=o.keyCode==td.arrowup;const r=o.keyCode==td.arrowdown;const s=o.shiftKey;const a=e.document.selection;if(!i&&!r){return}const c=r;if(s&&ox(a,c)){return}const l=Zy(t,a,c);if(!l||l.isCollapsed){return}if(nx(t,l,c)){e.change((t=>{const n=c?l.end:l.start;if(s){const o=e.createSelection(a.anchor);o.setFocus(n);t.setSelection(o)}else{t.setSelection(n)}}));n.stop();o.preventDefault();o.stopPropagation()}}}function Zy(t,e,n){const o=t.model;if(n){const t=e.isCollapsed?e.focus:e.getLastPosition();const n=tx(o,t,"forward");if(!n){return null}const i=o.createRange(t,n);const r=ex(o.schema,i,"backward");if(r&&t.isBefore(r)){return o.createRange(t,r)}return null}else{const t=e.isCollapsed?e.focus:e.getFirstPosition();const n=tx(o,t,"backward");if(!n){return null}const i=o.createRange(n,t);const r=ex(o.schema,i,"forward");if(r&&t.isAfter(r)){return o.createRange(r,t)}return null}}function tx(t,e,n){const o=t.schema;const i=t.createRangeIn(e.root);const r=n=="forward"?"elementStart":"elementEnd";for(const{previousPosition:t,item:s,type:a}of i.getWalker({startPosition:e,direction:n})){if(o.isLimit(s)&&!o.isInline(s)){return t}if(a==r&&o.isBlock(s)){return null}}return null}function ex(t,e,n){const o=n=="backward"?e.end:e.start;if(t.checkChild(o,"$text")){return o}for(const{nextPosition:o}of e.getWalker({direction:n})){if(t.checkChild(o,"$text")){return o}}}function nx(t,e,n){const o=t.model;const i=t.view.domConverter;if(n){const t=o.createSelection(e.start);o.modifySelection(t);if(!t.focus.isAtEnd&&!e.start.isEqual(t.focus)){e=o.createRange(t.focus,e.end)}}const r=t.mapper.toViewRange(e);const s=i.viewRangeToDom(r);const a=rf.getDomRangeRects(s);let c;for(const t of a){if(c===undefined){c=Math.round(t.bottom);continue}if(Math.round(t.top)>=c){return false}c=Math.max(c,Math.round(t.bottom))}return true}function ox(t,e){return!t.isCollapsed&&t.isBackward==e}class ix extends Kn{static get pluginName(){return"Widget"}static get requires(){return[qy,iy]}init(){const t=this.editor.editing.view;const e=t.document;this._previouslySelected=new Set;this.editor.editing.downcastDispatcher.on("selection",((t,e,n)=>{this._clearPreviouslySelectedWidgets(n.writer);const o=n.writer;const i=o.document.selection;const r=i.getSelectedElement();let s=null;for(const t of i.getRanges()){for(const e of t){const t=e.item;if(hy(t)&&!sx(t,s)){o.addClass(uy,t);this._previouslySelected.add(t);s=t;if(t==r){o.setSelection(i.getRanges(),{fake:true,label:ky(r)})}}}}}),{priority:"low"});t.addObserver(D_);this.listenTo(e,"mousedown",((...t)=>this._onMousedown(...t)));this.listenTo(e,"arrowKey",((...t)=>{this._handleSelectionChangeOnArrowKeyPress(...t)}),{context:[hy,"$text"]});this.listenTo(e,"arrowKey",((...t)=>{this._preventDefaultOnArrowKeyPress(...t)}),{context:"$root"});this.listenTo(e,"arrowKey",Xy(this.editor.editing),{context:"$text"});this.listenTo(e,"delete",((t,e)=>{if(this._handleDelete(e.direction=="forward")){e.preventDefault();t.stop()}}),{context:"$root"})}_onMousedown(t,e){const n=this.editor;const o=n.editing.view;const i=o.document;let r=e.target;if(rx(r)){if((Wl.isSafari||Wl.isGecko)&&e.domEvent.detail>=3){const t=n.editing.mapper;const o=r.is("attributeElement")?r.findAncestor((t=>!t.is("attributeElement"))):r;const i=t.toModelElement(o);e.preventDefault();this.editor.model.change((t=>{t.setSelection(i,"in")}))}return}if(!hy(r)){r=r.findAncestor(hy);if(!r){return}}if(Wl.isAndroid){e.preventDefault()}if(!i.isFocused){o.focus()}const s=n.editing.mapper.toModelElement(r);this._setSelectionOverElement(s)}_handleSelectionChangeOnArrowKeyPress(t,e){const n=e.keyCode;const o=this.editor.model;const i=o.schema;const r=o.document.selection;const s=r.getSelectedElement();const a=cd(n,this.editor.locale.contentLanguageDirection);if(s&&i.isObject(s)){const n=a?r.getLastPosition():r.getFirstPosition();const s=i.getNearestSelectionRange(n,a?"forward":"backward");if(s){o.change((t=>{t.setSelection(s)}));e.preventDefault();t.stop()}return}if(!r.isCollapsed){return}const c=this._getObjectElementNextToSelection(a);if(c&&i.isObject(c)){this._setSelectionOverElement(c);e.preventDefault();t.stop()}}_preventDefaultOnArrowKeyPress(t,e){const n=this.editor.model;const o=n.schema;const i=n.document.selection.getSelectedElement();if(i&&o.isObject(i)){e.preventDefault();t.stop()}}_handleDelete(t){if(this.editor.isReadOnly){return}const e=this.editor.model.document;const n=e.selection;if(!n.isCollapsed){return}const o=this._getObjectElementNextToSelection(t);if(o){this.editor.model.change((t=>{let e=n.anchor.parent;while(e.isEmpty){const n=e;e=n.parent;t.remove(n)}this._setSelectionOverElement(o)}));return true}}_setSelectionOverElement(t){this.editor.model.change((e=>{e.setSelection(e.createRangeOn(t))}))}_getObjectElementNextToSelection(t){const e=this.editor.model;const n=e.schema;const o=e.document.selection;const i=e.createSelection(o);e.modifySelection(i,{direction:t?"forward":"backward"});const r=t?i.focus.nodeBefore:i.focus.nodeAfter;if(!!r&&n.isObject(r)){return r}return null}_clearPreviouslySelectedWidgets(t){for(const e of this._previouslySelected){t.removeClass(uy,e)}this._previouslySelected.clear()}}function rx(t){while(t){if(t.is("editableElement")&&!t.is("rootElement")){return true}if(hy(t)){return false}t=t.parent}return false}function sx(t,e){if(!e){return false}return Array.from(t.getAncestors()).includes(e)}var ax="Expected a function";function cx(t,e,n){var o=true,i=true;if(typeof t!="function"){throw new TypeError(ax)}if(S(n)){o="leading"in n?!!n.leading:o;i="trailing"in n?!!n.trailing:i}return qh(t,e,{leading:o,maxWait:e,trailing:i})}var lx=cx;var dx=n(38);var ux={injectType:"singletonStyleTag",attributes:{"data-cke":true}};ux.insert="head";ux.singleton=true;var hx=wk()(dx["a"],ux);var fx=dx["a"].locals||{};class mx extends Kn{static get pluginName(){return"DragDrop"}static get requires(){return[$v,ix]}init(){const t=this.editor;const e=t.editing.view;this._draggedRange=null;this._draggingUid="";this._draggableElement=null;this._updateDropMarkerThrottled=lx((t=>this._updateDropMarker(t)),40);this._removeDropMarkerDelayed=_x((()=>this._removeDropMarker()),40);this._clearDraggableAttributesDelayed=_x((()=>this._clearDraggableAttributes()),40);e.addObserver(Kv);e.addObserver(D_);this._setupDragging();this._setupContentInsertionIntegration();this._setupClipboardInputIntegration();this._setupDropMarker();this._setupDraggableAttributeHandling();this.listenTo(t,"change:isReadOnly",((t,e,n)=>{if(n){this.forceDisabled("readOnlyMode")}else{this.clearForceDisabled("readOnlyMode")}}));this.on("change:isEnabled",((t,e,n)=>{if(!n){this._finalizeDragging(false)}}));if(Wl.isAndroid){this.forceDisabled("noAndroidSupport")}}destroy(){if(this._draggedRange){this._draggedRange.detach();this._draggedRange=null}this._updateDropMarkerThrottled.cancel();this._removeDropMarkerDelayed.cancel();this._clearDraggableAttributesDelayed.cancel();return super.destroy()}_setupDragging(){const t=this.editor;const e=t.model;const n=e.document;const o=t.editing.view;const i=o.document;this.listenTo(i,"dragstart",((o,r)=>{const s=n.selection;if(r.target&&r.target.is("rootElement")){r.preventDefault();return}const c=r.target?vx(r.target):null;if(c){const n=t.editing.mapper.toModelElement(c);this._draggedRange=om.fromRange(e.createRangeOn(n))}else if(!i.selection.isCollapsed){const t=i.selection.getSelectedElement();if(!t||!hy(t)){this._draggedRange=om.fromRange(s.getFirstRange())}}if(!this._draggedRange){r.preventDefault();return}this._draggingUid=a();r.dataTransfer.effectAllowed=this.isEnabled?"copyMove":"copy";r.dataTransfer.setData("application/ckeditor5-dragging-uid",this._draggingUid);const l=e.createSelection(this._draggedRange.toRange());const d=t.data.toView(e.getSelectedContent(l));i.fire("clipboardOutput",{dataTransfer:r.dataTransfer,content:d,method:o.name});if(!this.isEnabled){this._draggedRange.detach();this._draggedRange=null;this._draggingUid=""}}),{priority:"low"});this.listenTo(i,"dragend",((t,e)=>{this._finalizeDragging(!e.dataTransfer.isCanceled&&e.dataTransfer.dropEffect=="move")}),{priority:"low"});this.listenTo(i,"dragenter",(()=>{if(!this.isEnabled){return}o.focus()}));this.listenTo(i,"dragleave",(()=>{this._removeDropMarkerDelayed()}));this.listenTo(i,"dragging",((e,n)=>{if(!this.isEnabled){n.dataTransfer.dropEffect="none";return}this._removeDropMarkerDelayed.cancel();const o=gx(t,n.targetRanges,n.target);if(!this._draggedRange){n.dataTransfer.dropEffect="copy"}if(!Wl.isGecko){if(n.dataTransfer.effectAllowed=="copy"){n.dataTransfer.dropEffect="copy"}else if(["all","copyMove"].includes(n.dataTransfer.effectAllowed)){n.dataTransfer.dropEffect="move"}}if(o){this._updateDropMarkerThrottled(o)}}),{priority:"low"})}_setupClipboardInputIntegration(){const t=this.editor;const e=t.editing.view;const n=e.document;this.listenTo(n,"clipboardInput",((e,n)=>{if(n.method!="drop"){return}const o=gx(t,n.targetRanges,n.target);this._removeDropMarker();if(!o){this._finalizeDragging(false);e.stop();return}if(this._draggedRange&&this._draggingUid!=n.dataTransfer.getData("application/ckeditor5-dragging-uid")){this._draggedRange.detach();this._draggedRange=null;this._draggingUid=""}const i=Ax(n.dataTransfer)=="move";if(i&&this._draggedRange&&this._draggedRange.containsRange(o,true)){this._finalizeDragging(false);e.stop();return}n.targetRanges=[t.editing.mapper.toViewRange(o)]}),{priority:"high"})}_setupContentInsertionIntegration(){const t=this.editor.plugins.get($v);t.on("contentInsertion",((t,e)=>{if(!this.isEnabled||e.method!=="drop"){return}const n=e.targetRanges.map((t=>this.editor.editing.mapper.toModelRange(t)));this.editor.model.change((t=>t.setSelection(n)))}),{priority:"high"});t.on("contentInsertion",((t,e)=>{if(!this.isEnabled||e.method!=="drop"){return}const n=Ax(e.dataTransfer)=="move";const o=!e.resultRange||!e.resultRange.isCollapsed;this._finalizeDragging(o&&n)}),{priority:"lowest"})}_setupDraggableAttributeHandling(){const t=this.editor;const e=t.editing.view;const n=e.document;this.listenTo(n,"mousedown",((o,i)=>{if(Wl.isAndroid||!i){return}this._clearDraggableAttributesDelayed.cancel();let r=vx(i.target);if(Wl.isBlink&&!r&&!n.selection.isCollapsed){const t=n.selection.getSelectedElement();if(!t||!hy(t)){r=n.selection.editableElement}}if(r){e.change((t=>{t.setAttribute("draggable","true",r)}));this._draggableElement=t.editing.mapper.toModelElement(r)}}));this.listenTo(n,"mouseup",(()=>{if(!Wl.isAndroid){this._clearDraggableAttributesDelayed()}}))}_clearDraggableAttributes(){const t=this.editor.editing;t.view.change((e=>{if(this._draggableElement&&this._draggableElement.root.rootName!="$graveyard"){e.removeAttribute("draggable",t.mapper.toViewElement(this._draggableElement))}this._draggableElement=null}))}_setupDropMarker(){const t=this.editor;t.conversion.for("editingDowncast").markerToHighlight({model:"drop-target",view:{classes:["ck-clipboard-drop-target-range"]}});t.conversion.for("editingDowncast").markerToElement({model:"drop-target",view:(e,{writer:n})=>{const o=t.model.schema.checkChild(e.markerRange.start,"$text");if(!o){return}return n.createUIElement("span",{class:"ck ck-clipboard-drop-target-position"},(function(t){const e=this.toDomElement(t);e.innerHTML="⁠<span></span>⁠";return e}))}})}_updateDropMarker(t){const e=this.editor;const n=e.model.markers;e.model.change((e=>{if(n.has("drop-target")){if(!n.get("drop-target").getRange().isEqual(t)){e.updateMarker("drop-target",{range:t})}}else{e.addMarker("drop-target",{range:t,usingOperation:false,affectsData:false})}}))}_removeDropMarker(){const t=this.editor.model;this._removeDropMarkerDelayed.cancel();this._updateDropMarkerThrottled.cancel();if(t.markers.has("drop-target")){t.change((t=>{t.removeMarker("drop-target")}))}}_finalizeDragging(t){const e=this.editor;const n=e.model;this._removeDropMarker();this._clearDraggableAttributes();this._draggingUid="";if(!this._draggedRange){return}if(t&&this.isEnabled){n.deleteContent(n.createSelection(this._draggedRange),{doNotAutoparagraph:true})}this._draggedRange.detach();this._draggedRange=null}}function gx(t,e,n){const o=t.model;const i=t.editing.mapper;let r=null;const s=e?e[0].start:null;if(n.is("uiElement")){n=n.parent}r=px(t,n);if(r){return r}const a=Cx(t,n);const c=s?i.toModelPosition(s):null;if(!c){return bx(t,a)}r=kx(t,c,a);if(r){return r}r=o.schema.getNearestSelectionRange(c,Wl.isGecko?"forward":"backward");if(r){return r}return wx(t,c.parent)}function px(t,e){const n=t.model;const o=t.editing.mapper;if(hy(e)){return n.createRangeOn(o.toModelElement(e))}if(!e.is("editableElement")){const t=e.findAncestor((t=>hy(t)||t.is("editableElement")));if(hy(t)){return n.createRangeOn(o.toModelElement(t))}}return null}function bx(t,e){const n=t.model;const o=n.schema;const i=n.createPositionAt(e,0);return o.getNearestSelectionRange(i,"forward")}function kx(t,e,n){const o=t.model;if(!o.schema.checkChild(n,"$block")){return null}const i=o.createPositionAt(n,0);const r=e.path.slice(0,i.path.length);const s=o.createPositionFromPath(e.root,r);const a=s.nodeAfter;if(a&&o.schema.isObject(a)){return o.createRangeOn(a)}return null}function wx(t,e){const n=t.model;while(e){if(n.schema.isObject(e)){return n.createRangeOn(e)}e=e.parent}}function Cx(t,e){const n=t.editing.mapper;const o=t.editing.view;const i=n.toModelElement(e);if(i){return i}const r=o.createPositionBefore(e);const s=n.findMappedViewAncestor(r);return n.toModelElement(s)}function Ax(t){if(Wl.isGecko){return t.dropEffect}return["all","copyMove"].includes(t.effectAllowed)?"move":"copy"}function _x(t,e){let n;function o(...i){o.cancel();n=setTimeout((()=>t(...i)),e)}o.cancel=()=>{clearTimeout(n)};return o}function vx(t){if(t.is("editableElement")){return null}if(t.hasClass("ck-widget__selection-handle")){return t.findAncestor(hy)}if(hy(t)){return t}const e=t.findAncestor((t=>hy(t)||t.is("editableElement")));if(hy(e)){return e}return null}class yx extends Kn{static get pluginName(){return"PastePlainText"}static get requires(){return[$v]}init(){const t=this.editor;const e=t.model;const n=t.editing.view;const o=n.document;const i=e.document.selection;let r=false;n.addObserver(Kv);this.listenTo(o,"keydown",((t,e)=>{r=e.shiftKey}));t.plugins.get($v).on("contentInsertion",((t,n)=>{if(!r&&!xx(n.content,e.schema)){return}e.change((t=>{const o=Array.from(i.getAttributes()).filter((([t])=>e.schema.getAttributeProperties(t).isFormatting));if(!i.isCollapsed){e.deleteContent(i,{doNotAutoparagraph:true})}o.push(...i.getAttributes());const r=t.createRangeIn(n.content);for(const e of r.getItems()){if(e.is("$textProxy")){t.setAttributes(o,e)}}}))}))}}function xx(t,e){if(t.childCount>1){return false}const n=t.getChild(0);if(e.isObject(n)){return false}return[...n.getAttributeKeys()].length==0}class Ex extends Kn{static get pluginName(){return"Clipboard"}static get requires(){return[$v,mx,yx]}}class Dx extends jn{constructor(t){super(t);this._stack=[];this._createdBatches=new WeakSet;this.refresh();this.listenTo(t.data,"set",(()=>this.clearStack()))}refresh(){this.isEnabled=this._stack.length>0}addBatch(t){const e=this.editor.model.document.selection;const n={ranges:e.hasOwnRange?Array.from(e.getRanges()):[],isBackward:e.isBackward};this._stack.push({batch:t,selection:n});this.refresh()}clearStack(){this._stack=[];this.refresh()}_restoreSelection(t,e,n){const o=this.editor.model;const i=o.document;const r=[];const s=t.map((t=>t.getTransformedByOperations(n)));const a=s.flat();for(const t of s){const e=t.filter((t=>t.root!=i.graveyard)).filter((t=>!Bx(t,a)));if(!e.length){continue}Sx(e);r.push(e[0])}if(r.length){o.change((t=>{t.setSelection(r,{backward:e})}))}}_undo(t,e){const n=this.editor.model;const o=n.document;this._createdBatches.add(e);const i=t.operations.slice().filter((t=>t.isDocumentOperation));i.reverse();for(const t of i){const i=t.baseVersion+1;const r=Array.from(o.history.getOperations(i));const s=k_([t.getReversed()],r,{useRelations:true,document:this.editor.model.document,padWithNoOps:false,forceWeakRemove:true});const a=s.operationsA;for(const i of a){e.addOperation(i);n.applyOperation(i);o.history.setOperationAsUndone(t,i)}}}}function Sx(t){t.sort(((t,e)=>t.start.isBefore(e.start)?-1:1));for(let e=1;e<t.length;e++){const n=t[e-1];const o=n.getJoined(t[e],true);if(o){e--;t.splice(e,2,o)}}}function Bx(t,e){return e.some((e=>e!==t&&e.containsRange(t,true)))}class Tx extends Dx{execute(t=null){const e=t?this._stack.findIndex((e=>e.batch==t)):this._stack.length-1;const n=this._stack.splice(e,1)[0];const o=this.editor.model.createBatch("transparent");this.editor.model.enqueueChange(o,(()=>{this._undo(n.batch,o);const t=this.editor.model.document.history.getOperations(n.batch.baseVersion);this._restoreSelection(n.selection.ranges,n.selection.isBackward,t);this.fire("revert",n.batch,o)}));this.refresh()}}class Px extends Dx{execute(){const t=this._stack.pop();const e=this.editor.model.createBatch("transparent");this.editor.model.enqueueChange(e,(()=>{const n=t.batch.operations[t.batch.operations.length-1];const o=n.baseVersion+1;const i=this.editor.model.document.history.getOperations(o);this._restoreSelection(t.selection.ranges,t.selection.isBackward,i);this._undo(t.batch,e)}));this.refresh()}}class Ix extends Kn{static get pluginName(){return"UndoEditing"}constructor(t){super(t);this._batchRegistry=new WeakSet}init(){const t=this.editor;this._undoCommand=new Tx(t);this._redoCommand=new Px(t);t.commands.add("undo",this._undoCommand);t.commands.add("redo",this._redoCommand);this.listenTo(t.model,"applyOperation",((t,e)=>{const n=e[0];if(!n.isDocumentOperation){return}const o=n.batch;const i=this._redoCommand._createdBatches.has(o);const r=this._undoCommand._createdBatches.has(o);const s=this._batchRegistry.has(o);if(s||o.type=="transparent"&&!i&&!r){return}else{if(i){this._undoCommand.addBatch(o)}else if(!r){this._undoCommand.addBatch(o);this._redoCommand.clearStack()}}this._batchRegistry.add(o)}),{priority:"highest"});this.listenTo(this._undoCommand,"revert",((t,e,n)=>{this._redoCommand.addBatch(n)}));t.keystrokes.set("CTRL+Z","undo");t.keystrokes.set("CTRL+Y","redo");t.keystrokes.set("CTRL+SHIFT+Z","redo")}}var Rx='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m5.042 9.367 2.189 1.837a.75.75 0 0 1-.965 1.149l-3.788-3.18a.747.747 0 0 1-.21-.284.75.75 0 0 1 .17-.945L6.23 4.762a.75.75 0 1 1 .964 1.15L4.863 7.866h8.917A.75.75 0 0 1 14 7.9a4 4 0 1 1-1.477 7.718l.344-1.489a2.5 2.5 0 1 0 1.094-4.73l.008-.032H5.042z"/></svg>';var Fx='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m14.958 9.367-2.189 1.837a.75.75 0 0 0 .965 1.149l3.788-3.18a.747.747 0 0 0 .21-.284.75.75 0 0 0-.17-.945L13.77 4.762a.75.75 0 1 0-.964 1.15l2.331 1.955H6.22A.75.75 0 0 0 6 7.9a4 4 0 1 0 1.477 7.718l-.344-1.489A2.5 2.5 0 1 1 6.039 9.4l-.008-.032h8.927z"/></svg>';class zx extends Kn{static get pluginName(){return"UndoUI"}init(){const t=this.editor;const e=t.locale;const n=t.t;const o=e.uiLanguageDirection=="ltr"?Rx:Fx;const i=e.uiLanguageDirection=="ltr"?Fx:Rx;this._addButton("undo",n("Undo"),"CTRL+Z",o);this._addButton("redo",n("Redo"),"CTRL+Y",i)}_addButton(t,e,n,o){const i=this.editor;i.ui.componentFactory.add(t,(r=>{const s=i.commands.get(t);const a=new fw(r);a.set({label:e,icon:o,keystroke:n,tooltip:true});a.bind("isEnabled").to(s,"isEnabled");this.listenTo(a,"execute",(()=>{i.execute(t);i.editing.view.focus()}));return a}))}}class Ox extends Kn{static get requires(){return[Ix,zx]}static get pluginName(){return"Undo"}}class Nx extends Kn{static get requires(){return[IA]}static get pluginName(){return"WidgetToolbarRepository"}init(){const t=this.editor;if(t.plugins.has("BalloonToolbar")){const e=t.plugins.get("BalloonToolbar");this.listenTo(e,"show",(e=>{if(Lx(t.editing.view.document.selection)){e.stop()}}),{priority:"high"})}this._toolbarDefinitions=new Map;this._balloon=this.editor.plugins.get("ContextualBalloon");this.on("change:isEnabled",(()=>{this._updateToolbarsVisibility()}));this.listenTo(t.ui,"update",(()=>{this._updateToolbarsVisibility()}));this.listenTo(t.ui.focusTracker,"change:isFocused",(()=>{this._updateToolbarsVisibility()}),{priority:"low"})}destroy(){super.destroy();for(const t of this._toolbarDefinitions.values()){t.view.destroy()}}register(t,{ariaLabel:e,items:n,getRelatedElement:o,balloonClassName:i="ck-toolbar-container"}){if(!n.length){Object(u["b"])("widget-toolbar-no-items",{toolbarId:t});return}const r=this.editor;const s=r.t;const a=new sC(r.locale);a.ariaLabel=e||s("Widget toolbar");if(this._toolbarDefinitions.has(t)){throw new u["a"]("widget-toolbar-duplicated",this,{toolbarId:t})}a.fillFromConfig(n,r.ui.componentFactory);this._toolbarDefinitions.set(t,{view:a,getRelatedElement:o,balloonClassName:i})}_updateToolbarsVisibility(){let t=0;let e=null;let n=null;for(const o of this._toolbarDefinitions.values()){const i=o.getRelatedElement(this.editor.editing.view.document.selection);if(!this.isEnabled||!i){if(this._isToolbarInBalloon(o)){this._hideToolbar(o)}}else if(!this.editor.ui.focusTracker.isFocused){if(this._isToolbarVisible(o)){this._hideToolbar(o)}}else{const r=i.getAncestors().length;if(r>t){t=r;e=i;n=o}}}if(n){this._showToolbar(n,e)}}_hideToolbar(t){this._balloon.remove(t.view);this.stopListening(this._balloon,"change:visibleView")}_showToolbar(t,e){if(this._isToolbarVisible(t)){Mx(this.editor,e)}else if(!this._isToolbarInBalloon(t)){this._balloon.add({view:t.view,position:Vx(this.editor,e),balloonClassName:t.balloonClassName});this.listenTo(this._balloon,"change:visibleView",(()=>{for(const t of this._toolbarDefinitions.values()){if(this._isToolbarVisible(t)){const e=t.getRelatedElement(this.editor.editing.view.document.selection);Mx(this.editor,e)}}}))}}_isToolbarVisible(t){return this._balloon.visibleView===t.view}_isToolbarInBalloon(t){return this._balloon.hasView(t.view)}}function Mx(t,e){const n=t.plugins.get("ContextualBalloon");const o=Vx(t,e);n.updatePosition(o)}function Vx(t,e){const n=t.editing.view;const o=bA.defaultPositions;return{target:n.domConverter.mapViewToDom(e),positions:[o.northArrowSouth,o.northArrowSouthWest,o.northArrowSouthEast,o.southArrowNorth,o.southArrowNorthWest,o.southArrowNorthEast,vy]}}function Lx(t){const e=t.getSelectedElement();return!!(e&&hy(e))}class Hx{constructor(t){this.set("activeHandlePosition",null);this.set("proposedWidthPercents",null);this.set("proposedWidth",null);this.set("proposedHeight",null);this.set("proposedHandleHostWidth",null);this.set("proposedHandleHostHeight",null);this._options=t;this._referenceCoordinates=null}begin(t,e,n){const o=new rf(e);this.activeHandlePosition=Wx(t);this._referenceCoordinates=qx(e,Gx(this.activeHandlePosition));this.originalWidth=o.width;this.originalHeight=o.height;this.aspectRatio=o.width/o.height;const i=n.style.width;if(i&&i.match(/^\d+(\.\d*)?%$/)){this.originalWidthPercents=parseFloat(i)}else{this.originalWidthPercents=Kx(n,o)}}update(t){this.proposedWidth=t.width;this.proposedHeight=t.height;this.proposedWidthPercents=t.widthPercents;this.proposedHandleHostWidth=t.handleHostWidth;this.proposedHandleHostHeight=t.handleHostHeight}}Hn(Hx,Tn);function Kx(t,e){const n=t.parentElement;const o=parseFloat(n.ownerDocument.defaultView.getComputedStyle(n).width);return e.width/o*100}function qx(t,e){const n=new rf(t);const o=e.split("-");const i={x:o[1]=="right"?n.right:n.left,y:o[0]=="bottom"?n.bottom:n.top};i.x+=t.ownerDocument.defaultView.scrollX;i.y+=t.ownerDocument.defaultView.scrollY;return i}function jx(t){return`ck-widget__resizer__handle-${t}`}function Wx(t){const e=["top-left","top-right","bottom-right","bottom-left"];for(const n of e){if(t.classList.contains(jx(n))){return n}}}function Gx(t){const e=t.split("-");const n={top:"bottom",bottom:"top",left:"right",right:"left"};return`${n[e[0]]}-${n[e[1]]}`}class Ux{constructor(t){this._options=t;this._domResizerWrapper=null;this._viewResizerWrapper=null;this.set("isEnabled",true);this.decorate("begin");this.decorate("cancel");this.decorate("commit");this.decorate("updateSize");this.on("commit",(t=>{if(!this.state.proposedWidth&&!this.state.proposedWidthPercents){this._cleanup();t.stop()}}),{priority:"high"});this.on("change:isEnabled",(()=>{if(this.isEnabled){this.redraw()}}))}attach(){const t=this;const e=this._options.viewElement;const n=this._options.editor.editing.view;n.change((n=>{const o=n.createUIElement("div",{class:"ck ck-reset_all ck-widget__resizer"},(function(e){const n=this.toDomElement(e);t._appendHandles(n);t._appendSizeUI(n);t._domResizerWrapper=n;t.on("change:isEnabled",((t,e,o)=>{n.style.display=o?"":"none"}));n.style.display=t.isEnabled?"":"none";return n}));n.insert(n.createPositionAt(e,"end"),o);n.addClass("ck-widget_with-resizer",e);this._viewResizerWrapper=o}))}begin(t){this.state=new Hx(this._options);this._sizeUI.bindToState(this._options,this.state);this._initialViewWidth=this._options.viewElement.getStyle("width");this.state.begin(t,this._getHandleHost(),this._getResizeHost())}updateSize(t){const e=this._proposeNewSize(t);const n=this._options.editor.editing.view;n.change((t=>{const n=this._options.unit||"%";const o=(n==="%"?e.widthPercents:e.width)+n;t.setStyle("width",o,this._options.viewElement)}));const o=this._getHandleHost();const i=new rf(o);e.handleHostWidth=Math.round(i.width);e.handleHostHeight=Math.round(i.height);const r=new rf(o);e.width=Math.round(r.width);e.height=Math.round(r.height);this.redraw(i);this.state.update(e)}commit(){const t=this._options.unit||"%";const e=(t==="%"?this.state.proposedWidthPercents:this.state.proposedWidth)+t;this._options.editor.editing.view.change((()=>{this._cleanup();this._options.onCommit(e)}))}cancel(){this._cleanup()}destroy(){this.cancel()}redraw(t){const e=this._domResizerWrapper;if(!Qx(e)){return}const n=e.parentElement;const o=this._getHandleHost();const i=this._viewResizerWrapper;const r=[i.getStyle("width"),i.getStyle("height"),i.getStyle("left"),i.getStyle("top")];let s;if(n.isSameNode(o)){const e=t||new rf(o);s=[e.width+"px",e.height+"px",undefined,undefined]}else{s=[o.offsetWidth+"px",o.offsetHeight+"px",o.offsetLeft+"px",o.offsetTop+"px"]}if(Ia(r,s)!=="same"){this._options.editor.editing.view.change((t=>{t.setStyle({width:s[0],height:s[1],left:s[2],top:s[3]},i)}))}}containsHandle(t){return this._domResizerWrapper.contains(t)}static isResizeHandle(t){return t.classList.contains("ck-widget__resizer__handle")}_cleanup(){this._sizeUI.dismiss();this._sizeUI.isVisible=false;const t=this._options.editor.editing.view;t.change((t=>{t.setStyle("width",this._initialViewWidth,this._options.viewElement)}))}_proposeNewSize(t){const e=this.state;const n=Yx(t);const o=this._options.isCentered?this._options.isCentered(this):true;const i={x:e._referenceCoordinates.x-(n.x+e.originalWidth),y:n.y-e.originalHeight-e._referenceCoordinates.y};if(o&&e.activeHandlePosition.endsWith("-right")){i.x=n.x-(e._referenceCoordinates.x+e.originalWidth)}if(o){i.x*=2}const r={width:Math.abs(e.originalWidth+i.x),height:Math.abs(e.originalHeight+i.y)};r.dominant=r.width/e.aspectRatio>r.height?"width":"height";r.max=r[r.dominant];const s={width:r.width,height:r.height};if(r.dominant=="width"){s.height=s.width/e.aspectRatio}else{s.width=s.height*e.aspectRatio}return{width:Math.round(s.width),height:Math.round(s.height),widthPercents:Math.min(Math.round(e.originalWidthPercents/e.originalWidth*s.width*100)/100,100)}}_getResizeHost(){const t=this._domResizerWrapper.parentElement;return this._options.getResizeHost(t)}_getHandleHost(){const t=this._domResizerWrapper.parentElement;return this._options.getHandleHost(t)}_appendHandles(t){const e=["top-left","top-right","bottom-right","bottom-left"];for(const n of e){t.appendChild(new Ek({tag:"div",attributes:{class:`ck-widget__resizer__handle ${Jx(n)}`}}).render())}}_appendSizeUI(t){const e=new $x;e.render();this._sizeUI=e;t.appendChild(e.element)}}Hn(Ux,Tn);class $x extends yk{constructor(){super();const t=this.bindTemplate;this.setTemplate({tag:"div",attributes:{class:["ck","ck-size-view",t.to("activeHandlePosition",(t=>t?`ck-orientation-${t}`:""))],style:{display:t.if("isVisible","none",(t=>!t))}},children:[{text:t.to("label")}]})}bindToState(t,e){this.bind("isVisible").to(e,"proposedWidth",e,"proposedHeight",((t,e)=>t!==null&&e!==null));this.bind("label").to(e,"proposedHandleHostWidth",e,"proposedHandleHostHeight",e,"proposedWidthPercents",((e,n,o)=>{if(t.unit==="px"){return`${e}×${n}`}else{return`${o}%`}}));this.bind("activeHandlePosition").to(e)}dismiss(){this.unbind();this.isVisible=false}}function Jx(t){return`ck-widget__resizer__handle-${t}`}function Yx(t){return{x:t.pageX,y:t.pageY}}function Qx(t){return t&&t.ownerDocument&&t.ownerDocument.contains(t)}var Xx=n(39);var Zx={injectType:"singletonStyleTag",attributes:{"data-cke":true}};Zx.insert="head";Zx.singleton=true;var tE=wk()(Xx["a"],Zx);var eE=Xx["a"].locals||{};class nE extends Kn{static get pluginName(){return"WidgetResize"}init(){this.set("visibleResizer",null);this.set("_activeResizer",null);this._resizers=new Map;const t=ru.window.document;this.editor.model.schema.setAttributeProperties("width",{isFormatting:true});this.editor.editing.view.addObserver(D_);this._observer=Object.create(bu);this.listenTo(this.editor.editing.view.document,"mousedown",this._mouseDownListener.bind(this),{priority:"high"});this._observer.listenTo(t,"mousemove",this._mouseMoveListener.bind(this));this._observer.listenTo(t,"mouseup",this._mouseUpListener.bind(this));const e=()=>{if(this.visibleResizer){this.visibleResizer.redraw()}};const n=lx(e,200);this.on("change:visibleResizer",e);this.editor.ui.on("update",n);this._observer.listenTo(ru.window,"resize",n);const o=this.editor.editing.view.document.selection;o.on("change",(()=>{const t=o.getSelectedElement();this.visibleResizer=this.getResizerByViewElement(t)||null}))}destroy(){this._observer.stopListening();for(const t of this._resizers.values()){t.destroy()}}attachTo(t){const e=new Ux(t);const n=this.editor.plugins;e.attach();if(n.has("WidgetToolbarRepository")){const t=n.get("WidgetToolbarRepository");e.on("begin",(()=>{t.forceDisabled("resize")}),{priority:"lowest"});e.on("cancel",(()=>{t.clearForceDisabled("resize")}),{priority:"highest"});e.on("commit",(()=>{t.clearForceDisabled("resize")}),{priority:"highest"})}this._resizers.set(t.viewElement,e);const o=this.editor.editing.view.document.selection;const i=o.getSelectedElement();if(this.getResizerByViewElement(i)==e){this.visibleResizer=e}return e}getResizerByViewElement(t){return this._resizers.get(t)}_getResizerByHandle(t){for(const e of this._resizers.values()){if(e.containsHandle(t)){return e}}}_mouseDownListener(t,e){const n=e.domTarget;if(!Ux.isResizeHandle(n)){return}this._activeResizer=this._getResizerByHandle(n);if(this._activeResizer){this._activeResizer.begin(n);t.stop();e.preventDefault()}}_mouseMoveListener(t,e){if(this._activeResizer){this._activeResizer.updateSize(e)}}_mouseUpListener(){if(this._activeResizer){this._activeResizer.commit();this._activeResizer=null}}}Hn(nE,Tn);function oE(t,e,n){e.setCustomProperty("image",true,t);return fy(t,e,{label:o});function o(){const e=lE(t);const o=e.getAttribute("alt");return o?`${o} ${n}`:n}}function iE(t){return!!t.getCustomProperty("image")&&hy(t)}function rE(t){const e=t.getSelectedElement();if(e&&iE(e)){return e}return null}function sE(t){return!!t&&t.is("element","image")}function aE(t,e={},n=null){t.change((o=>{const i=o.createElement("image",e);const r=n||Cy(t.document.selection,t);t.insertContent(i,r);if(i.parent){o.setSelection(i,"on")}}))}function cE(t){const e=t.schema;const n=t.document.selection;return dE(n,e,t)&&!Ay(n,e)&&uE(n)}function lE(t){const e=[];for(const n of t.getChildren()){e.push(n);if(n.is("element")){e.push(...n.getChildren())}}return e.find((t=>t.is("element","img")))}function dE(t,e,n){const o=hE(t,n);return e.checkChild(o,"image")}function uE(t){return[...t.focus.getAncestors()].every((t=>!t.is("element","image")))}function hE(t,e){const n=Cy(t,e);const o=n.parent;if(o.isEmpty&&!o.is("element","$root")){return o.parent}return o}const fE=new RegExp(String(/^(http(s)?:\/\/)?[\w-]+\.[\w.~:/[\]@!$&'()*+,;=%-]+/.source+/\.(jpg|jpeg|png|gif|ico|webp|JPG|JPEG|PNG|GIF|ICO|WEBP)/.source+/(\?[\w.~:/[\]@!$&'()*+,;=%-]*)?/.source+/(#[\w.~:/[\]@!$&'()*+,;=%-]*)?$/.source));class mE extends Kn{static get requires(){return[Ex,Ox]}static get pluginName(){return"AutoImage"}constructor(t){super(t);this._timeoutId=null;this._positionToInsert=null}init(){const t=this.editor;const e=t.model.document;this.listenTo(t.plugins.get("ClipboardPipeline"),"inputTransformation",(()=>{const t=e.selection.getFirstRange();const n=qp.fromPosition(t.start);n.stickiness="toPrevious";const o=qp.fromPosition(t.end);o.stickiness="toNext";e.once("change:data",(()=>{this._embedImageBetweenPositions(n,o);n.detach();o.detach()}),{priority:"high"})}));t.commands.get("undo").on("execute",(()=>{if(this._timeoutId){ru.window.clearTimeout(this._timeoutId);this._positionToInsert.detach();this._timeoutId=null;this._positionToInsert=null}}),{priority:"high"})}_embedImageBetweenPositions(t,e){const n=this.editor;const o=new om(t,e);const i=o.getWalker({ignoreElementEnd:true});let r="";for(const t of i){if(t.item.is("$textProxy")){r+=t.item.data}}r=r.trim();if(!r.match(fE)){o.detach();return}this._positionToInsert=qp.fromPosition(t);this._timeoutId=ru.window.setTimeout((()=>{const t=n.commands.get("insertImage");if(!t.isEnabled){o.detach();return}n.model.change((t=>{this._timeoutId=null;t.remove(o);o.detach();let e;if(this._positionToInsert.root.rootName!=="$graveyard"){e=this._positionToInsert.toPosition()}aE(n.model,{src:r},e);this._positionToInsert.detach();this._positionToInsert=null}))}),100)}}class gE extends jn{constructor(t,e){super(t);this._buffer=new ey(t.model,e);this._batches=new WeakSet}get buffer(){return this._buffer}destroy(){super.destroy();this._buffer.destroy()}execute(t={}){const e=this.editor.model;const n=e.document;const o=t.text||"";const i=o.length;const r=t.range?e.createSelection(t.range):n.selection;const s=t.resultRange;e.enqueueChange(this._buffer.batch,(t=>{this._buffer.lock();this._batches.add(this._buffer.batch);e.deleteContent(r);if(o){e.insertContent(t.createText(o,n.selection.getAttributes()),r)}if(s){t.setSelection(s)}else if(!r.is("documentSelection")){t.setSelection(r)}this._buffer.unlock();this._buffer.input(i)}))}}function pE(t,e){const n=[];let o=0;let i;t.forEach((t=>{if(t=="equal"){r();o++}else if(t=="insert"){if(s("insert")){i.values.push(e[o])}else{r();i={type:"insert",index:o,values:[e[o]]}}o++}else{if(s("delete")){i.howMany++}else{r();i={type:"delete",index:o,howMany:1}}}}));r();return n;function r(){if(i){n.push(i);i=null}}function s(t){return i&&i.type==t}}function bE(t){if(t.length==0){return false}for(const e of t){if(e.type==="children"&&!kE(e)){return true}}return false}function kE(t){if(t.newChildren.length-t.oldChildren.length!=1){return}const e=Ud(t.oldChildren,t.newChildren,wE);const n=pE(e,t.newChildren);if(n.length>1){return}const o=n[0];if(!(!!o.values[0]&&o.values[0].is("$text"))){return}return o}function wE(t,e){if(!!t&&t.is("$text")&&!!e&&e.is("$text")){return t.data===e.data}else{return t===e}}function CE(t){t.editing.view.document.on("mutations",((e,n,o)=>{new AE(t).handle(n,o)}))}class AE{constructor(t){this.editor=t;this.editing=this.editor.editing}handle(t,e){if(bE(t)){this._handleContainerChildrenMutations(t,e)}else{for(const n of t){this._handleTextMutation(n,e);this._handleTextNodeInsertion(n)}}}_handleContainerChildrenMutations(t,e){const n=_E(t);if(!n){return}const o=this.editor.editing.view.domConverter;const i=o.mapViewToDom(n);const r=new du(this.editor.editing.view.document);const s=this.editor.data.toModel(r.domToView(i)).getChild(0);const a=this.editor.editing.mapper.toModelElement(n);if(!a){return}const c=Array.from(s.getChildren());const l=Array.from(a.getChildren());const d=c[c.length-1];const u=l[l.length-1];const h=d&&d.is("element","softBreak");const f=u&&!u.is("element","softBreak");if(h&&f){c.pop()}const m=this.editor.model.schema;if(!vE(c,m)||!vE(l,m)){return}const g=c.map((t=>t.is("$text")?t.data:"@")).join("").replace(/\u00A0/g," ");const p=l.map((t=>t.is("$text")?t.data:"@")).join("").replace(/\u00A0/g," ");if(p===g){return}const b=Ud(p,g);const{firstChangeAt:k,insertions:w,deletions:C}=yE(b);let A=null;if(e){A=this.editing.mapper.toModelRange(e.getFirstRange())}const _=g.substr(k,w);const v=this.editor.model.createRange(this.editor.model.createPositionAt(a,k),this.editor.model.createPositionAt(a,k+C));this.editor.execute("input",{text:_,range:v,resultRange:A})}_handleTextMutation(t,e){if(t.type!="text"){return}const n=t.newText.replace(/\u00A0/g," ");const o=t.oldText.replace(/\u00A0/g," ");if(o===n){return}const i=Ud(o,n);const{firstChangeAt:r,insertions:s,deletions:a}=yE(i);let c=null;if(e){c=this.editing.mapper.toModelRange(e.getFirstRange())}const l=this.editing.view.createPositionAt(t.node,r);const d=this.editing.mapper.toModelPosition(l);const u=this.editor.model.createRange(d,d.getShiftedBy(a));const h=n.substr(r,s);this.editor.execute("input",{text:h,range:u,resultRange:c})}_handleTextNodeInsertion(t){if(t.type!="children"){return}const e=kE(t);const n=this.editing.view.createPositionAt(t.node,e.index);const o=this.editing.mapper.toModelPosition(n);const i=e.values[0].data;this.editor.execute("input",{text:i.replace(/\u00A0/g," "),range:this.editor.model.createRange(o)})}}function _E(t){const e=t.map((t=>t.node)).reduce(((t,e)=>t.getCommonAncestor(e,{includeSelf:true})));if(!e){return}return e.getAncestors({includeSelf:true,parentFirst:true}).find((t=>t.is("containerElement")||t.is("rootElement")))}function vE(t,e){return t.every((t=>e.isInline(t)))}function yE(t){let e=null;let n=null;for(let o=0;o<t.length;o++){const i=t[o];if(i!="equal"){e=e===null?o:e;n=o}}let o=0;let i=0;for(let r=e;r<=n;r++){if(t[r]!="insert"){o++}if(t[r]!="delete"){i++}}return{insertions:i,deletions:o,firstChangeAt:e}}class xE extends Kn{static get pluginName(){return"Input"}init(){const t=this.editor;const e=new gE(t,t.config.get("typing.undoStep")||20);t.commands.add("input",e);Iy(t);CE(t)}isInput(t){const e=this.editor.commands.get("input");return e._batches.has(t)}}class EE extends Kn{static get requires(){return[xE,iy]}static get pluginName(){return"Typing"}}function DE(t,e){let n=t.start;const o=Array.from(t.getItems()).reduce(((t,o)=>{if(!(o.is("$text")||o.is("$textProxy"))){n=e.createPositionAfter(o);return""}return t+o.data}),"");return{text:o,range:e.createRange(n,t.end)}}class SE{constructor(t,e){this.model=t;this.testCallback=e;this.hasMatch=false;this.set("isEnabled",true);this.on("change:isEnabled",(()=>{if(this.isEnabled){this._startListening()}else{this.stopListening(t.document.selection);this.stopListening(t.document)}}));this._startListening()}_startListening(){const t=this.model;const e=t.document;this.listenTo(e.selection,"change:range",((t,{directChange:n})=>{if(!n){return}if(!e.selection.isCollapsed){if(this.hasMatch){this.fire("unmatched");this.hasMatch=false}return}this._evaluateTextBeforeSelection("selection")}));this.listenTo(e,"change:data",((t,e)=>{if(e.type=="transparent"){return}this._evaluateTextBeforeSelection("data",{batch:e})}))}_evaluateTextBeforeSelection(t,e={}){const n=this.model;const o=n.document;const i=o.selection;const r=n.createRange(n.createPositionAt(i.focus.parent,0),i.focus);const{text:s,range:a}=DE(r,n);const c=this.testCallback(s);if(!c&&this.hasMatch){this.fire("unmatched")}this.hasMatch=!!c;if(c){const n=Object.assign(e,{text:s,range:a});if(typeof c=="object"){Object.assign(n,c)}this.fire(`matched:${t}`,n)}}}Hn(SE,Tn);class BE extends Kn{static get pluginName(){return"TwoStepCaretMovement"}constructor(t){super(t);this.attributes=new Set;this._overrideUid=null}init(){const t=this.editor;const e=t.model;const n=t.editing.view;const o=t.locale;const i=e.document.selection;this.listenTo(n.document,"arrowKey",((t,e)=>{if(!i.isCollapsed){return}if(e.shiftKey||e.altKey||e.ctrlKey){return}const n=e.keyCode==td.arrowright;const r=e.keyCode==td.arrowleft;if(!n&&!r){return}const s=o.contentLanguageDirection;let a=false;if(s==="ltr"&&n||s==="rtl"&&r){a=this._handleForwardMovement(e)}else{a=this._handleBackwardMovement(e)}if(a===true){t.stop()}}),{context:"$text",priority:"highest"});this._isNextGravityRestorationSkipped=false;this.listenTo(i,"change:range",((t,e)=>{if(this._isNextGravityRestorationSkipped){this._isNextGravityRestorationSkipped=false;return}if(!this._isGravityOverridden){return}if(!e.directChange&&FE(i.getFirstPosition(),this.attributes)){return}this._restoreGravity()}))}registerAttribute(t){this.attributes.add(t)}_handleForwardMovement(t){const e=this.attributes;const n=this.editor.model;const o=n.document.selection;const i=o.getFirstPosition();if(this._isGravityOverridden){return false}if(i.isAtStart&&TE(o,e)){return false}if(FE(i,e)){IE(t);this._overrideGravity();return true}}_handleBackwardMovement(t){const e=this.attributes;const n=this.editor.model;const o=n.document.selection;const i=o.getFirstPosition();if(this._isGravityOverridden){IE(t);this._restoreGravity();PE(n,e,i);return true}else{if(i.isAtStart){if(TE(o,e)){IE(t);PE(n,e,i);return true}return false}if(RE(i,e)){if(i.isAtEnd&&!TE(o,e)&&FE(i,e)){IE(t);PE(n,e,i);return true}this._isNextGravityRestorationSkipped=true;this._overrideGravity();return false}}}get _isGravityOverridden(){return!!this._overrideUid}_overrideGravity(){this._overrideUid=this.editor.model.change((t=>t.overrideSelectionGravity()))}_restoreGravity(){this.editor.model.change((t=>{t.restoreSelectionGravity(this._overrideUid);this._overrideUid=null}))}}function TE(t,e){for(const n of e){if(t.hasAttribute(n)){return true}}return false}function PE(t,e,n){const o=n.nodeBefore;t.change((t=>{if(o){t.setSelectionAttribute(o.getAttributes())}else{t.removeSelectionAttribute(e)}}))}function IE(t){t.preventDefault()}function RE(t,e){const n=t.getShiftedBy(-1);return FE(n,e)}function FE(t,e){const{nodeBefore:n,nodeAfter:o}=t;for(const t of e){const e=n?n.getAttribute(t):undefined;const i=o?o.getAttribute(t):undefined;if(i!==e){return true}}return false}var zE=/[\\^$.*+?()[\]{}|]/g,OE=RegExp(zE.source);function NE(t){t=kc(t);return t&&OE.test(t)?t.replace(zE,"\\$&"):t}var ME=NE;const VE={copyright:{from:"(c)",to:"©"},registeredTrademark:{from:"(r)",to:"®"},trademark:{from:"(tm)",to:"™"},oneHalf:{from:"1/2",to:"½"},oneThird:{from:"1/3",to:"⅓"},twoThirds:{from:"2/3",to:"⅔"},oneForth:{from:"1/4",to:"¼"},threeQuarters:{from:"3/4",to:"¾"},lessThanOrEqual:{from:"<=",to:"≤"},greaterThanOrEqual:{from:">=",to:"≥"},notEqual:{from:"!=",to:"≠"},arrowLeft:{from:"<-",to:"←"},arrowRight:{from:"->",to:"→"},horizontalEllipsis:{from:"...",to:"…"},enDash:{from:/(^| )(--)( )$/,to:[null,"–",null]},emDash:{from:/(^| )(---)( )$/,to:[null,"—",null]},quotesPrimary:{from:GE('"'),to:[null,"“",null,"”"]},quotesSecondary:{from:GE("'"),to:[null,"‘",null,"’"]},quotesPrimaryEnGb:{from:GE("'"),to:[null,"‘",null,"’"]},quotesSecondaryEnGb:{from:GE('"'),to:[null,"“",null,"”"]},quotesPrimaryPl:{from:GE('"'),to:[null,"„",null,"”"]},quotesSecondaryPl:{from:GE("'"),to:[null,"‚",null,"’"]}};const LE={symbols:["copyright","registeredTrademark","trademark"],mathematical:["oneHalf","oneThird","twoThirds","oneForth","threeQuarters","lessThanOrEqual","greaterThanOrEqual","notEqual","arrowLeft","arrowRight"],typography:["horizontalEllipsis","enDash","emDash"],quotes:["quotesPrimary","quotesSecondary"]};const HE=["symbols","mathematical","typography","quotes"];class KE extends Kn{static get pluginName(){return"TextTransformation"}constructor(t){super(t);t.config.define("typing",{transformations:{include:HE}})}init(){const t=this.editor.model;const e=t.document.selection;e.on("change:range",(()=>{this.isEnabled=!e.anchor.parent.is("element","codeBlock")}));this._enableTransformationWatchers()}_enableTransformationWatchers(){const t=this.editor;const e=t.model;const n=t.plugins.get("Input");const o=UE(t.config.get("typing.transformations"));const i=t=>{for(const e of o){const n=e.from;const o=n.test(t);if(o){return{normalizedTransformation:e}}}};const r=(t,o)=>{if(!n.isInput(o.batch)){return}const{from:i,to:r}=o.normalizedTransformation;const s=i.exec(o.text);const a=r(s.slice(1));const c=o.range;let l=s.index;e.enqueueChange((t=>{for(let n=1;n<s.length;n++){const o=s[n];const i=a[n-1];if(i==null){l+=o.length;continue}const r=c.start.getShiftedBy(l);const d=e.createRange(r,r.getShiftedBy(o.length));const u=WE(r);e.insertContent(t.createText(i,u),d);l+=i.length}}))};const s=new SE(t.model,i);s.on("matched:data",r);s.bind("isEnabled").to(this)}}function qE(t){if(typeof t=="string"){return new RegExp(`(${ME(t)})$`)}return t}function jE(t){if(typeof t=="string"){return()=>[t]}else if(t instanceof Array){return()=>t}return t}function WE(t){const e=t.textNode?t.textNode:t.nodeAfter;return e.getAttributes()}function GE(t){return new RegExp(`(^|\\s)(${t})([^${t}]*)(${t})$`)}function UE(t){const e=t.extra||[];const n=t.remove||[];const o=t=>!n.includes(t);const i=t.include.concat(e).filter(o);return $E(i).filter(o).map((t=>VE[t]||t)).map((t=>({from:qE(t.from),to:jE(t.to)})))}function $E(t){const e=new Set;for(const n of t){if(LE[n]){for(const t of LE[n]){e.add(t)}}else{e.add(n)}}return Array.from(e)}function JE(t,e,n,o){return o.createRange(YE(t,e,n,true,o),YE(t,e,n,false,o))}function YE(t,e,n,o,i){let r=t.textNode||(o?t.nodeBefore:t.nodeAfter);let s=null;while(r&&r.getAttribute(e)==n){s=r;r=o?r.previousSibling:r.nextSibling}return s?i.createPositionAt(s,o?"before":"after"):t}function QE(t,e,n,o){const i=t.editing.view;const r=new Set;i.document.registerPostFixer((i=>{const s=t.model.document.selection;let a=false;if(s.hasAttribute(e)){const c=JE(s.getFirstPosition(),e,s.getAttribute(e),t.model);const l=t.editing.mapper.toViewRange(c);for(const t of l.getItems()){if(t.is("element",n)&&!t.hasClass(o)){i.addClass(o,t);r.add(t);a=true}}}return a}));t.conversion.for("editingDowncast").add((t=>{t.on("insert",e,{priority:"highest"});t.on("remove",e,{priority:"highest"});t.on("attribute",e,{priority:"highest"});t.on("selection",e,{priority:"highest"});function e(){i.change((t=>{for(const e of r.values()){t.removeClass(o,e);r.delete(e)}}))}}))}function XE(t,e,n){var o=t.length;n=n===undefined?o:n;return!e&&n>=o?t:Bc(t,e,n)}var ZE=XE;var tD="\\ud800-\\udfff",eD="\\u0300-\\u036f",nD="\\ufe20-\\ufe2f",oD="\\u20d0-\\u20ff",iD=eD+nD+oD,rD="\\ufe0e\\ufe0f";var sD="\\u200d";var aD=RegExp("["+sD+tD+iD+rD+"]");function cD(t){return aD.test(t)}var lD=cD;function dD(t){return t.split("")}var uD=dD;var hD="\\ud800-\\udfff",fD="\\u0300-\\u036f",mD="\\ufe20-\\ufe2f",gD="\\u20d0-\\u20ff",pD=fD+mD+gD,bD="\\ufe0e\\ufe0f";var kD="["+hD+"]",wD="["+pD+"]",CD="\\ud83c[\\udffb-\\udfff]",AD="(?:"+wD+"|"+CD+")",_D="[^"+hD+"]",vD="(?:\\ud83c[\\udde6-\\uddff]){2}",yD="[\\ud800-\\udbff][\\udc00-\\udfff]",xD="\\u200d";var ED=AD+"?",DD="["+bD+"]?",SD="(?:"+xD+"(?:"+[_D,vD,yD].join("|")+")"+DD+ED+")*",BD=DD+ED+SD,TD="(?:"+[_D+wD+"?",wD,vD,yD,kD].join("|")+")";var PD=RegExp(CD+"(?="+CD+")|"+TD+BD,"g");function ID(t){return t.match(PD)||[]}var RD=ID;function FD(t){return lD(t)?RD(t):uD(t)}var zD=FD;function OD(t){return function(e){e=kc(e);var n=lD(e)?zD(e):undefined;var o=n?n[0]:e.charAt(0);var i=n?ZE(n,1).join(""):e.slice(1);return o[t]()+i}}var ND=OD;var MD=ND("toUpperCase");var VD=MD;const LD=/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g;const HD=/^(?:(?:https?|ftps?|mailto):|[^a-z]|[a-z+.-]+(?:[^a-z+.:-]|$))/i;const KD=/^[\S]+@((?![-_])(?:[-\w\u00a1-\uffff]{0,63}[^-_]\.))+(?:[a-z\u00a1-\uffff]{2,})$/i;const qD=/^((\w+:(\/{2,})?)|(\W))/i;const jD="Ctrl+K";function WD(t){return t.is("attributeElement")&&!!t.getCustomProperty("link")}function GD(t,{writer:e}){const n=e.createAttributeElement("a",{href:t},{priority:5});e.setCustomProperty("link",true,n);return n}function UD(t){t=String(t);return $D(t)?t:"#"}function $D(t){const e=t.replace(LD,"");return e.match(HD)}function JD(t,e){const n={"Open in a new tab":t("Open in a new tab"),Downloadable:t("Downloadable")};e.forEach((t=>{if(t.label&&n[t.label]){t.label=n[t.label]}return t}));return e}function YD(t){const e=[];if(t){for(const[n,o]of Object.entries(t)){const t=Object.assign({},o,{id:`link${VD(n)}`});e.push(t)}}return e}function QD(t,e){if(!t){return false}return t.is("element","image")&&e.checkAttribute("image","linkHref")}function XD(t){return KD.test(t)}function ZD(t,e){const n=XD(t)?"mailto:":e;const o=!!n&&!qD.test(t);return t&&o?n+t:t}const tS=4;const eS=new RegExp("(^|\\s)"+"("+"("+"(?:(?:(?:https?|ftp):)?\\/\\/)"+"(?:\\S+(?::\\S*)?@)?"+"(?:"+"(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])"+"(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}"+"(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))"+"|"+"("+"((?!www\\.)|(www\\.))"+"(?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.)+"+"(?:[a-z\\u00a1-\\uffff]{2,63})"+")"+")"+"(?::\\d{2,5})?"+"(?:[/?#]\\S*)?"+")"+"|"+"("+"(www.|(\\S+@))"+"((?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.))+"+"(?:[a-z\\u00a1-\\uffff]{2,63})"+")"+")$","i");const nS=2;class oS extends Kn{static get pluginName(){return"AutoLink"}init(){const t=this.editor;const e=t.model.document.selection;e.on("change:range",(()=>{this.isEnabled=!e.anchor.parent.is("element","codeBlock")}));this._enableTypingHandling()}afterInit(){this._enableEnterHandling();this._enableShiftEnterHandling()}_enableTypingHandling(){const t=this.editor;const e=new SE(t.model,(t=>{if(!iS(t)){return}const e=rS(t.substr(0,t.length-1));if(e){return{url:e}}}));const n=t.plugins.get("Input");e.on("matched:data",((e,o)=>{const{batch:i,range:r,url:s}=o;if(!n.isInput(i)){return}const a=r.end.getShiftedBy(-1);const c=a.getShiftedBy(-s.length);const l=t.model.createRange(c,a);this._applyAutoLink(s,l)}));e.bind("isEnabled").to(this)}_enableEnterHandling(){const t=this.editor;const e=t.model;const n=t.commands.get("enter");if(!n){return}n.on("execute",(()=>{const t=e.document.selection.getFirstPosition();if(!t.parent.previousSibling){return}const n=e.createRangeIn(t.parent.previousSibling);this._checkAndApplyAutoLinkOnRange(n)}))}_enableShiftEnterHandling(){const t=this.editor;const e=t.model;const n=t.commands.get("shiftEnter");if(!n){return}n.on("execute",(()=>{const t=e.document.selection.getFirstPosition();const n=e.createRange(e.createPositionAt(t.parent,0),t.getShiftedBy(-1));this._checkAndApplyAutoLinkOnRange(n)}))}_checkAndApplyAutoLinkOnRange(t){const e=this.editor.model;const{text:n,range:o}=DE(t,e);const i=rS(n);if(i){const t=e.createRange(o.end.getShiftedBy(-i.length),o.end);this._applyAutoLink(i,t)}}_applyAutoLink(t,e){const n=this.editor.model;if(!this.isEnabled||!sS(e,n)){return}n.enqueueChange((n=>{const o=this.editor.config.get("link.defaultProtocol");const i=ZD(t,o);n.setAttribute("linkHref",i,e)}))}}function iS(t){return t.length>tS&&t[t.length-1]===" "&&t[t.length-2]!==" "}function rS(t){const e=eS.exec(t);return e?e[nS]:null}function sS(t,e){return e.schema.checkAttributeInSelection(e.createSelection(t),"linkHref")}class aS extends Kn{static get pluginName(){return"Autosave"}static get requires(){return[Lb]}constructor(t){super(t);const e=t.config.get("autosave")||{};const n=e.waitingTime||1e3;this.set("state","synchronized");this._debouncedSave=qh(this._save.bind(this),n);this._lastDocumentVersion=t.model.document.version;this._domEmitter=Object.create(bu);this._config=e}init(){const t=this.editor;const e=t.model.document;const n=t.t;this._pendingActions=t.plugins.get(Lb);this.listenTo(e,"change:data",(()=>{if(!this._saveCallbacks.length){return}if(this.state=="synchronized"){this._action=this._pendingActions.add(n("Saving changes"));this.state="waiting";this._debouncedSave()}else if(this.state=="waiting"){this._debouncedSave()}}));this.listenTo(t,"destroy",(()=>this._flush()),{priority:"highest"});this._domEmitter.listenTo(window,"beforeunload",((t,e)=>{if(this._pendingActions.hasAny){e.returnValue=this._pendingActions.first.message}}))}destroy(){this._domEmitter.stopListening();super.destroy()}_flush(){this._debouncedSave.flush()}_save(){const t=this.editor.model.document.version;if(t<this._lastDocumentVersion||this.editor.state==="initializing"){this._debouncedSave.cancel();return}this._lastDocumentVersion=t;this.state="saving";Promise.resolve().then((()=>Promise.all(this._saveCallbacks.map((t=>t(this.editor)))))).catch((t=>{this.state="error";this.state="saving";this._debouncedSave();throw t})).then((()=>{if(this.editor.model.document.version>this._lastDocumentVersion){this.state="waiting";this._debouncedSave()}else{this.state="synchronized";this._pendingActions.remove(this._action);this._action=null}}))}get _saveCallbacks(){const t=[];if(this.adapter&&this.adapter.save){t.push(this.adapter.save)}if(this._config.save){t.push(this._config.save)}return t}}Hn(aS,Tn);class cS extends jn{execute(){const t=this.editor.model;const e=t.document;t.change((n=>{dS(t,n,e.selection);this.fire("afterExecute",{writer:n})}))}refresh(){const t=this.editor.model;const e=t.document;this.isEnabled=lS(t.schema,e.selection)}}function lS(t,e){if(e.rangeCount>1){return false}const n=e.anchor;if(!n||!t.checkChild(n,"softBreak")){return false}const o=e.getFirstRange();const i=o.start.parent;const r=o.end.parent;if((hS(i,t)||hS(r,t))&&i!==r){return false}return true}function dS(t,e,n){const o=n.isCollapsed;const i=n.getFirstRange();const r=i.start.parent;const s=i.end.parent;const a=r==s;if(o){const o=Jv(t.schema,n.getAttributes());uS(t,e,i.end);e.removeSelectionAttribute(n.getAttributeKeys());e.setSelectionAttribute(o)}else{const o=!(i.start.isAtStart&&i.end.isAtEnd);t.deleteContent(n,{leaveUnmerged:o});if(a){uS(t,e,n.focus)}else{if(o){e.setSelection(s,0)}}}}function uS(t,e,n){const o=e.createElement("softBreak");t.insertContent(o,n);e.setSelection(o,"after")}function hS(t,e){if(t.is("rootElement")){return false}return e.isLimit(t)||hS(t.parent,e)}class fS extends Kn{static get pluginName(){return"ShiftEnter"}init(){const t=this.editor;const e=t.model.schema;const n=t.conversion;const o=t.editing.view;const i=o.document;e.register("softBreak",{allowWhere:"$text",isInline:true});n.for("upcast").elementToElement({model:"softBreak",view:"br"});n.for("downcast").elementToElement({model:"softBreak",view:(t,{writer:e})=>e.createEmptyElement("br")});o.addObserver(Zv);t.commands.add("shiftEnter",new cS(t));this.listenTo(i,"enter",((e,n)=>{n.preventDefault();if(!n.isSoft){return}t.execute("shiftEnter");o.scrollToTheSelection()}),{priority:"low"})}}class mS extends jn{refresh(){this.value=this._getValue();this.isEnabled=this._checkEnabled()}execute(t={}){const e=this.editor.model;const n=e.schema;const o=e.document.selection;const i=Array.from(o.getSelectedBlocks());const r=t.forceValue===undefined?!this.value:t.forceValue;e.change((t=>{if(!r){this._removeQuote(t,i.filter(gS))}else{const e=i.filter((t=>gS(t)||bS(n,t)));this._applyQuote(t,e)}}))}_getValue(){const t=this.editor.model.document.selection;const e=ff(t.getSelectedBlocks());return!!(e&&gS(e))}_checkEnabled(){if(this.value){return true}const t=this.editor.model.document.selection;const e=this.editor.model.schema;const n=ff(t.getSelectedBlocks());if(!n){return false}return bS(e,n)}_removeQuote(t,e){pS(t,e).reverse().forEach((e=>{if(e.start.isAtStart&&e.end.isAtEnd){t.unwrap(e.start.parent);return}if(e.start.isAtStart){const n=t.createPositionBefore(e.start.parent);t.move(e,n);return}if(!e.end.isAtEnd){t.split(e.end)}const n=t.createPositionAfter(e.end.parent);t.move(e,n)}))}_applyQuote(t,e){const n=[];pS(t,e).reverse().forEach((e=>{let o=gS(e.start);if(!o){o=t.createElement("blockQuote");t.wrap(e,o)}n.push(o)}));n.reverse().reduce(((e,n)=>{if(e.nextSibling==n){t.merge(t.createPositionAfter(e));return e}return n}))}}function gS(t){return t.parent.name=="blockQuote"?t.parent:null}function pS(t,e){let n;let o=0;const i=[];while(o<e.length){const r=e[o];const s=e[o+1];if(!n){n=t.createPositionBefore(r)}if(!s||r.nextSibling!=s){i.push(t.createRange(n,t.createPositionAfter(r)));n=null}o++}return i}function bS(t,e){const n=t.checkChild(e.parent,"blockQuote");const o=t.checkChild(["$root","blockQuote"],e);return n&&o}class kS extends Kn{static get pluginName(){return"BlockQuoteEditing"}static get requires(){return[ty,iy]}init(){const t=this.editor;const e=t.model.schema;t.commands.add("blockQuote",new mS(t));e.register("blockQuote",{allowWhere:"$block",allowContentOf:"$root"});e.addChildCheck(((t,e)=>{if(t.endsWith("blockQuote")&&e.name=="blockQuote"){return false}}));t.conversion.elementToElement({model:"blockQuote",view:"blockquote"});t.model.document.registerPostFixer((n=>{const o=t.model.document.differ.getChanges();for(const t of o){if(t.type=="insert"){const o=t.position.nodeAfter;if(!o){continue}if(o.is("element","blockQuote")&&o.isEmpty){n.remove(o);return true}else if(o.is("element","blockQuote")&&!e.checkChild(t.position,o)){n.unwrap(o);return true}else if(o.is("element")){const t=n.createRangeIn(o);for(const o of t.getItems()){if(o.is("element","blockQuote")&&!e.checkChild(n.createPositionBefore(o),o)){n.unwrap(o);return true}}}}else if(t.type=="remove"){const e=t.position.parent;if(e.is("element","blockQuote")&&e.isEmpty){n.remove(e);return true}}}return false}));const n=this.editor.editing.view.document;const o=t.model.document.selection;const i=t.commands.get("blockQuote");this.listenTo(n,"enter",((e,n)=>{if(!o.isCollapsed||!i.value){return}const r=o.getLastPosition().parent;if(r.isEmpty){t.execute("blockQuote");t.editing.view.scrollToTheSelection();n.preventDefault();e.stop()}}),{context:"blockquote"});this.listenTo(n,"delete",((e,n)=>{if(n.direction!="backward"||!o.isCollapsed||!i.value){return}const r=o.getLastPosition().parent;if(r.isEmpty&&!r.previousSibling){t.execute("blockQuote");t.editing.view.scrollToTheSelection();n.preventDefault();e.stop()}}),{context:"blockquote"})}}var wS=n(40);var CS={injectType:"singletonStyleTag",attributes:{"data-cke":true}};CS.insert="head";CS.singleton=true;var AS=wk()(wS["a"],CS);var _S=wS["a"].locals||{};class vS extends Kn{static get pluginName(){return"BlockQuoteUI"}init(){const t=this.editor;const e=t.t;t.ui.componentFactory.add("blockQuote",(n=>{const o=t.commands.get("blockQuote");const i=new fw(n);i.set({label:e("Block quote"),icon:hk.quote,tooltip:true,isToggleable:true});i.bind("isOn","isEnabled").to(o,"value","isEnabled");this.listenTo(i,"execute",(()=>{t.execute("blockQuote");t.editing.view.focus()}));return i}))}}class yS extends Kn{static get requires(){return[kS,vS]}static get pluginName(){return"BlockQuote"}}class xS extends jn{constructor(t,e){super(t);this.attributeKey=e}refresh(){const t=this.editor.model;const e=t.document;this.value=this._getValueFromFirstAllowedNode();this.isEnabled=t.schema.checkAttributeInSelection(e.selection,this.attributeKey)}execute(t={}){const e=this.editor.model;const n=e.document;const o=n.selection;const i=t.forceValue===undefined?!this.value:t.forceValue;e.change((t=>{if(o.isCollapsed){if(i){t.setSelectionAttribute(this.attributeKey,true)}else{t.removeSelectionAttribute(this.attributeKey)}}else{const n=e.schema.getValidRanges(o.getRanges(),this.attributeKey);for(const e of n){if(i){t.setAttribute(this.attributeKey,i,e)}else{t.removeAttribute(this.attributeKey,e)}}}}))}_getValueFromFirstAllowedNode(){const t=this.editor.model;const e=t.schema;const n=t.document.selection;if(n.isCollapsed){return n.hasAttribute(this.attributeKey)}for(const t of n.getRanges()){for(const n of t.getItems()){if(e.checkAttribute(n,this.attributeKey)){return n.hasAttribute(this.attributeKey)}}}return false}}const ES="bold";class DS extends Kn{static get pluginName(){return"BoldEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:ES});t.model.schema.setAttributeProperties(ES,{isFormatting:true,copyOnEnter:true});t.conversion.attributeToElement({model:ES,view:"strong",upcastAlso:["b",t=>{const e=t.getStyle("font-weight");if(!e){return null}if(e=="bold"||Number(e)>=600){return{name:true,styles:["font-weight"]}}}]});t.commands.add(ES,new xS(t,ES));t.keystrokes.set("CTRL+B",ES)}}var SS='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10.187 17H5.773c-.637 0-1.092-.138-1.364-.415-.273-.277-.409-.718-.409-1.323V4.738c0-.617.14-1.062.419-1.332.279-.27.73-.406 1.354-.406h4.68c.69 0 1.288.041 1.793.124.506.083.96.242 1.36.478.341.197.644.447.906.75a3.262 3.262 0 0 1 .808 2.162c0 1.401-.722 2.426-2.167 3.075C15.05 10.175 16 11.315 16 13.01a3.756 3.756 0 0 1-2.296 3.504 6.1 6.1 0 0 1-1.517.377c-.571.073-1.238.11-2 .11zm-.217-6.217H7v4.087h3.069c1.977 0 2.965-.69 2.965-2.072 0-.707-.256-1.22-.768-1.537-.512-.319-1.277-.478-2.296-.478zM7 5.13v3.619h2.606c.729 0 1.292-.067 1.69-.2a1.6 1.6 0 0 0 .91-.765c.165-.267.247-.566.247-.897 0-.707-.26-1.176-.778-1.409-.519-.232-1.31-.348-2.375-.348H7z"/></svg>';const BS="bold";class TS extends Kn{static get pluginName(){return"BoldUI"}init(){const t=this.editor;const e=t.t;t.ui.componentFactory.add(BS,(n=>{const o=t.commands.get(BS);const i=new fw(n);i.set({label:e("Bold"),icon:SS,keystroke:"CTRL+B",tooltip:true,isToggleable:true});i.bind("isOn","isEnabled").to(o,"value","isEnabled");this.listenTo(i,"execute",(()=>{t.execute(BS);t.editing.view.focus()}));return i}))}}class PS extends Kn{static get requires(){return[DS,TS]}static get pluginName(){return"Bold"}}class IS extends jn{execute(){const t=this.editor.model;const e=t.document.selection;let n=t.schema.getLimitElement(e);if(e.containsEntireContent(n)||!RS(t.schema,n)){do{n=n.parent;if(!n){return}}while(!RS(t.schema,n))}t.change((t=>{t.setSelection(n,"in")}))}}function RS(t,e){return t.isLimit(e)&&(t.checkChild(e,"$text")||t.checkChild(e,"paragraph"))}const FS=od("Ctrl+A");class zS extends Kn{static get pluginName(){return"SelectAllEditing"}init(){const t=this.editor;const e=t.editing.view;const n=e.document;t.commands.add("selectAll",new IS(t));this.listenTo(n,"keydown",((e,n)=>{if(nd(n)===FS){t.execute("selectAll");n.preventDefault()}}))}}var OS='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M.75 15.5a.75.75 0 0 1 .75.75V18l.008.09A.5.5 0 0 0 2 18.5h1.75a.75.75 0 1 1 0 1.5H1.5l-.144-.007a1.5 1.5 0 0 1-1.35-1.349L0 18.5v-2.25a.75.75 0 0 1 .75-.75zm18.5 0a.75.75 0 0 1 .75.75v2.25l-.007.144a1.5 1.5 0 0 1-1.349 1.35L18.5 20h-2.25a.75.75 0 1 1 0-1.5H18a.5.5 0 0 0 .492-.41L18.5 18v-1.75a.75.75 0 0 1 .75-.75zm-10.45 3c.11 0 .2.09.2.2v1.1a.2.2 0 0 1-.2.2H7.2a.2.2 0 0 1-.2-.2v-1.1c0-.11.09-.2.2-.2h1.6zm4 0c.11 0 .2.09.2.2v1.1a.2.2 0 0 1-.2.2h-1.6a.2.2 0 0 1-.2-.2v-1.1c0-.11.09-.2.2-.2h1.6zm.45-5.5a.75.75 0 1 1 0 1.5h-8.5a.75.75 0 1 1 0-1.5h8.5zM1.3 11c.11 0 .2.09.2.2v1.6a.2.2 0 0 1-.2.2H.2a.2.2 0 0 1-.2-.2v-1.6c0-.11.09-.2.2-.2h1.1zm18.5 0c.11 0 .2.09.2.2v1.6a.2.2 0 0 1-.2.2h-1.1a.2.2 0 0 1-.2-.2v-1.6c0-.11.09-.2.2-.2h1.1zm-4.55-2a.75.75 0 1 1 0 1.5H4.75a.75.75 0 1 1 0-1.5h10.5zM1.3 7c.11 0 .2.09.2.2v1.6a.2.2 0 0 1-.2.2H.2a.2.2 0 0 1-.2-.2V7.2c0-.11.09-.2.2-.2h1.1zm18.5 0c.11 0 .2.09.2.2v1.6a.2.2 0 0 1-.2.2h-1.1a.2.2 0 0 1-.2-.2V7.2c0-.11.09-.2.2-.2h1.1zm-4.55-2a.75.75 0 1 1 0 1.5h-2.5a.75.75 0 1 1 0-1.5h2.5zm-5 0a.75.75 0 1 1 0 1.5h-5.5a.75.75 0 0 1 0-1.5h5.5zm-6.5-5a.75.75 0 0 1 0 1.5H2a.5.5 0 0 0-.492.41L1.5 2v1.75a.75.75 0 0 1-1.5 0V1.5l.007-.144A1.5 1.5 0 0 1 1.356.006L1.5 0h2.25zM18.5 0l.144.007a1.5 1.5 0 0 1 1.35 1.349L20 1.5v2.25a.75.75 0 1 1-1.5 0V2l-.008-.09A.5.5 0 0 0 18 1.5h-1.75a.75.75 0 1 1 0-1.5h2.25zM8.8 0c.11 0 .2.09.2.2v1.1a.2.2 0 0 1-.2.2H7.2a.2.2 0 0 1-.2-.2V.2c0-.11.09-.2.2-.2h1.6zm4 0c.11 0 .2.09.2.2v1.1a.2.2 0 0 1-.2.2h-1.6a.2.2 0 0 1-.2-.2V.2c0-.11.09-.2.2-.2h1.6z"/></svg>';class NS extends Kn{static get pluginName(){return"SelectAllUI"}init(){const t=this.editor;t.ui.componentFactory.add("selectAll",(e=>{const n=t.commands.get("selectAll");const o=new fw(e);const i=e.t;o.set({label:i("Select all"),icon:OS,keystroke:"Ctrl+A",tooltip:true});o.bind("isOn","isEnabled").to(n,"value","isEnabled");this.listenTo(o,"execute",(()=>{t.execute("selectAll");t.editing.view.focus()}));return o}))}}class MS extends Kn{static get requires(){return[zS,NS]}static get pluginName(){return"SelectAll"}}class VS extends Kn{static get requires(){return[Ex,ty,MS,fS,EE,Ox]}static get pluginName(){return"Essentials"}}class LS extends jn{constructor(t,e){super(t);this.attributeKey=e}refresh(){const t=this.editor.model;const e=t.document;this.value=e.selection.getAttribute(this.attributeKey);this.isEnabled=t.schema.checkAttributeInSelection(e.selection,this.attributeKey)}execute(t={}){const e=this.editor.model;const n=e.document;const o=n.selection;const i=t.value;e.change((t=>{if(o.isCollapsed){if(i){t.setSelectionAttribute(this.attributeKey,i)}else{t.removeSelectionAttribute(this.attributeKey)}}else{const n=e.schema.getValidRanges(o.getRanges(),this.attributeKey);for(const e of n){if(i){t.setAttribute(this.attributeKey,i,e)}else{t.removeAttribute(this.attributeKey,e)}}}}))}}class HS extends ka{constructor(t){super(t);this.set("isEmpty",true);this.on("change",(()=>{this.set("isEmpty",this.length===0)}))}add(t,e){if(this.find((e=>e.color===t.color))){return}super.add(t,e)}hasColor(t){return!!this.find((e=>e.color===t))}}Hn(HS,Tn);var KS=n(41);var qS={injectType:"singletonStyleTag",attributes:{"data-cke":true}};qS.insert="head";qS.singleton=true;var jS=wk()(KS["a"],qS);var WS=KS["a"].locals||{};class GS extends yk{constructor(t,{colors:e,columns:n,removeButtonLabel:o,documentColorsLabel:i,documentColorsCount:r}){super(t);this.items=this.createCollection();this.colorDefinitions=e;this.focusTracker=new mf;this.keystrokes=new gf;this.set("selectedColor");this.removeButtonLabel=o;this.columns=n;this.documentColors=new HS;this.documentColorsCount=r;this._focusCycler=new yw({focusables:this.items,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"arrowup",focusNext:"arrowdown"}});this._documentColorsLabel=i;this.setTemplate({tag:"div",attributes:{class:["ck","ck-color-table"]},children:this.items});this.items.add(this._removeColorButton())}updateDocumentColors(t,e){const n=t.document;const o=this.documentColorsCount;this.documentColors.clear();for(const i of n.getRootNames()){const r=n.getRoot(i);const s=t.createRangeIn(r);for(const t of s.getItems()){if(t.is("$textProxy")&&t.hasAttribute(e)){this._addColorToDocumentColors(t.getAttribute(e));if(this.documentColors.length>=o){return}}}}}updateSelectedColors(){const t=this.documentColorsGrid;const e=this.staticColorsGrid;const n=this.selectedColor;e.selectedColor=n;if(t){t.selectedColor=n}}render(){super.render();for(const t of this.items){this.focusTracker.add(t.element)}this.keystrokes.listenTo(this.element)}appendGrids(){if(this.staticColorsGrid){return}this.staticColorsGrid=this._createStaticColorsGrid();this.items.add(this.staticColorsGrid);if(this.documentColorsCount){const t=Ek.bind(this.documentColors,this.documentColors);const e=new HC(this.locale);e.text=this._documentColorsLabel;e.extendTemplate({attributes:{class:["ck","ck-color-grid__label",t.if("isEmpty","ck-hidden")]}});this.items.add(e);this.documentColorsGrid=this._createDocumentColorsGrid();this.items.add(this.documentColorsGrid)}}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}_removeColorButton(){const t=new fw;t.set({withText:true,icon:hk.eraser,tooltip:true,label:this.removeButtonLabel});t.class="ck-color-table__remove-color";t.on("execute",(()=>{this.fire("execute",{value:null})}));return t}_createStaticColorsGrid(){const t=new Tw(this.locale,{colorDefinitions:this.colorDefinitions,columns:this.columns});t.delegate("execute").to(this);return t}_createDocumentColorsGrid(){const t=Ek.bind(this.documentColors,this.documentColors);const e=new Tw(this.locale,{columns:this.columns});e.delegate("execute").to(this);e.extendTemplate({attributes:{class:t.if("isEmpty","ck-hidden")}});e.items.bindTo(this.documentColors).using((t=>{const e=new vw;e.set({color:t.color,hasBorder:t.options&&t.options.hasBorder});if(t.label){e.set({label:t.label,tooltip:true})}e.on("execute",(()=>{this.fire("execute",{value:t.color})}));return e}));this.documentColors.on("change:isEmpty",((t,n,o)=>{if(o){e.selectedColor=null}}));return e}_addColorToDocumentColors(t){const e=this.colorDefinitions.find((e=>e.color===t));if(!e){this.documentColors.add({color:t,label:t,options:{hasBorder:false}})}else{this.documentColors.add(Object.assign({},e))}}}const US="fontSize";const $S="fontFamily";const JS="fontColor";const YS="fontBackgroundColor";function QS(t,e){const n={model:{key:t,values:[]},view:{},upcastAlso:{}};for(const t of e){n.model.values.push(t.model);n.view[t.model]=t.view;if(t.upcastAlso){n.upcastAlso[t.model]=t.upcastAlso}}return n}function XS(t){return e=>eB(e.getStyle(t))}function ZS(t){return(e,{writer:n})=>n.createAttributeElement("span",{style:`${t}:${e}`},{priority:7})}function tB({dropdownView:t,colors:e,columns:n,removeButtonLabel:o,documentColorsLabel:i,documentColorsCount:r}){const s=t.locale;const a=new GS(s,{colors:e,columns:n,removeButtonLabel:o,documentColorsLabel:i,documentColorsCount:r});t.colorTableView=a;t.panelView.children.add(a);a.delegate("execute").to(t,"execute");return a}function eB(t){return t.replace(/\s/g,"")}class nB extends LS{constructor(t){super(t,JS)}}class oB extends Kn{static get pluginName(){return"FontColorEditing"}constructor(t){super(t);t.config.define(JS,{colors:[{color:"hsl(0, 0%, 0%)",label:"Black"},{color:"hsl(0, 0%, 30%)",label:"Dim grey"},{color:"hsl(0, 0%, 60%)",label:"Grey"},{color:"hsl(0, 0%, 90%)",label:"Light grey"},{color:"hsl(0, 0%, 100%)",label:"White",hasBorder:true},{color:"hsl(0, 75%, 60%)",label:"Red"},{color:"hsl(30, 75%, 60%)",label:"Orange"},{color:"hsl(60, 75%, 60%)",label:"Yellow"},{color:"hsl(90, 75%, 60%)",label:"Light green"},{color:"hsl(120, 75%, 60%)",label:"Green"},{color:"hsl(150, 75%, 60%)",label:"Aquamarine"},{color:"hsl(180, 75%, 60%)",label:"Turquoise"},{color:"hsl(210, 75%, 60%)",label:"Light blue"},{color:"hsl(240, 75%, 60%)",label:"Blue"},{color:"hsl(270, 75%, 60%)",label:"Purple"}],columns:5});t.conversion.for("upcast").elementToAttribute({view:{name:"span",styles:{color:/[\s\S]+/}},model:{key:JS,value:XS("color")}});t.conversion.for("upcast").elementToAttribute({view:{name:"font",attributes:{color:/^#?\w+$/}},model:{key:JS,value:t=>t.getAttribute("color")}});t.conversion.for("downcast").attributeToElement({model:JS,view:ZS("color")});t.commands.add(JS,new nB(t));t.model.schema.extend("$text",{allowAttributes:JS});t.model.schema.setAttributeProperties(JS,{isFormatting:true,copyOnEnter:true})}}class iB extends Kn{constructor(t,{commandName:e,icon:n,componentName:o,dropdownLabel:i}){super(t);this.commandName=e;this.componentName=o;this.icon=n;this.dropdownLabel=i;this.columns=t.config.get(`${this.componentName}.columns`);this.colorTableView=undefined}init(){const t=this.editor;const e=t.locale;const n=e.t;const o=t.commands.get(this.commandName);const i=Cw(t.config.get(this.componentName).colors);const r=ww(e,i);const s=t.config.get(`${this.componentName}.documentColors`);t.ui.componentFactory.add(this.componentName,(e=>{const i=xC(e);this.colorTableView=tB({dropdownView:i,colors:r.map((t=>({label:t.label,color:t.model,options:{hasBorder:t.hasBorder}}))),columns:this.columns,removeButtonLabel:n("Remove color"),documentColorsLabel:s!==0?n("Document colors"):undefined,documentColorsCount:s===undefined?this.columns:s});this.colorTableView.bind("selectedColor").to(o,"value");i.buttonView.set({label:this.dropdownLabel,icon:this.icon,tooltip:true});i.extendTemplate({attributes:{class:"ck-color-ui-dropdown"}});i.bind("isEnabled").to(o);i.on("execute",((e,n)=>{t.execute(this.commandName,n);t.editing.view.focus()}));i.on("change:isOpen",((e,n,o)=>{i.colorTableView.appendGrids();if(o){if(s!==0){this.colorTableView.updateDocumentColors(t.model,this.componentName)}this.colorTableView.updateSelectedColors()}}));return i}))}}var rB='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M12.4 10.3 10 4.5l-2.4 5.8h4.8zm.5 1.2H7.1L5.7 15H4.2l5-12h1.6l5 12h-1.5L13 11.5zm3.1 7H4a1 1 0 0 1 0-2h12a1 1 0 0 1 0 2z"/></svg>';class sB extends iB{constructor(t){const e=t.locale.t;super(t,{commandName:JS,componentName:JS,icon:rB,dropdownLabel:e("Font Color")})}static get pluginName(){return"FontColorUI"}}class aB extends Kn{static get requires(){return[oB,sB]}static get pluginName(){return"FontColor"}}class cB extends LS{constructor(t){super(t,$S)}}function lB(t){return t.map(dB).filter((t=>!!t))}function dB(t){if(typeof t==="object"){return t}if(t==="default"){return{title:"Default",model:undefined}}if(typeof t!=="string"){return}return uB(t)}function uB(t){const e=t.replace(/"|'/g,"").split(",");const n=e[0];const o=e.map(hB).join(", ");return{title:n,model:o,view:{name:"span",styles:{"font-family":o},priority:7}}}function hB(t){t=t.trim();if(t.indexOf(" ")>0){t=`'${t}'`}return t}class fB extends Kn{static get pluginName(){return"FontFamilyEditing"}constructor(t){super(t);t.config.define($S,{options:["default","Arial, Helvetica, sans-serif","Courier New, Courier, monospace","Georgia, serif","Lucida Sans Unicode, Lucida Grande, sans-serif","Tahoma, Geneva, sans-serif","Times New Roman, Times, serif","Trebuchet MS, Helvetica, sans-serif","Verdana, Geneva, sans-serif"],supportAllValues:false})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:$S});t.model.schema.setAttributeProperties($S,{isFormatting:true,copyOnEnter:true});const e=lB(t.config.get("fontFamily.options")).filter((t=>t.model));const n=QS($S,e);if(t.config.get("fontFamily.supportAllValues")){this._prepareAnyValueConverters();this._prepareCompatibilityConverter()}else{t.conversion.attributeToElement(n)}t.commands.add($S,new cB(t))}_prepareAnyValueConverters(){const t=this.editor;t.conversion.for("downcast").attributeToElement({model:$S,view:(t,{writer:e})=>e.createAttributeElement("span",{style:"font-family:"+t},{priority:7})});t.conversion.for("upcast").elementToAttribute({model:{key:$S,value:t=>t.getStyle("font-family")},view:{name:"span",styles:{"font-family":/.*/}}})}_prepareCompatibilityConverter(){const t=this.editor;t.conversion.for("upcast").elementToAttribute({view:{name:"font",attributes:{face:/.*/}},model:{key:$S,value:t=>t.getAttribute("face")}})}}var mB='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M11.03 3h6.149a.75.75 0 1 1 0 1.5h-5.514L11.03 3zm1.27 3h4.879a.75.75 0 1 1 0 1.5h-4.244L12.3 6zm1.27 3h3.609a.75.75 0 1 1 0 1.5h-2.973L13.57 9zm-2.754 2.5L8.038 4.785 5.261 11.5h5.555zm.62 1.5H4.641l-1.666 4.028H1.312l5.789-14h1.875l5.789 14h-1.663L11.436 13z"/></svg>';class gB extends Kn{static get pluginName(){return"FontFamilyUI"}init(){const t=this.editor;const e=t.t;const n=this._getLocalizedOptions();const o=t.commands.get($S);t.ui.componentFactory.add($S,(i=>{const r=xC(i);DC(r,pB(n,o));r.buttonView.set({label:e("Font Family"),icon:mB,tooltip:true});r.extendTemplate({attributes:{class:"ck-font-family-dropdown"}});r.bind("isEnabled").to(o);this.listenTo(r,"execute",(e=>{t.execute(e.source.commandName,{value:e.source.commandParam});t.editing.view.focus()}));return r}))}_getLocalizedOptions(){const t=this.editor;const e=t.t;const n=lB(t.config.get($S).options);return n.map((t=>{if(t.title==="Default"){t.title=e("Default")}return t}))}}function pB(t,e){const n=new ka;for(const o of t){const t={type:"button",model:new dA({commandName:$S,commandParam:o.model,label:o.title,withText:true})};t.model.bind("isOn").to(e,"value",(t=>{if(t===o.model){return true}if(!t||!o.model){return false}return t.split(",")[0].replace(/'/g,"").toLowerCase()===o.model.toLowerCase()}));if(o.view&&o.view.styles){t.model.set("labelStyle",`font-family: ${o.view.styles["font-family"]}`)}n.add(t)}return n}class bB extends Kn{static get requires(){return[fB,gB]}static get pluginName(){return"FontFamily"}}class kB extends LS{constructor(t){super(t,US)}}function wB(t){return t.map((t=>AB(t))).filter((t=>!!t))}const CB={get tiny(){return{title:"Tiny",model:"tiny",view:{name:"span",classes:"text-tiny",priority:7}}},get small(){return{title:"Small",model:"small",view:{name:"span",classes:"text-small",priority:7}}},get big(){return{title:"Big",model:"big",view:{name:"span",classes:"text-big",priority:7}}},get huge(){return{title:"Huge",model:"huge",view:{name:"span",classes:"text-huge",priority:7}}}};function AB(t){if(xB(t)){return vB(t)}const e=yB(t);if(e){return vB(e)}if(t==="default"){return{model:undefined,title:"Default"}}if(EB(t)){return}return _B(t)}function _B(t){if(typeof t==="number"||typeof t==="string"){t={title:String(t),model:`${parseFloat(t)}px`}}t.view={name:"span",styles:{"font-size":t.model}};return vB(t)}function vB(t){if(!t.view.priority){t.view.priority=7}return t}function yB(t){return CB[t]||CB[t.model]}function xB(t){return typeof t==="object"&&t.title&&t.model&&t.view}function EB(t){let e;if(typeof t==="object"){if(!t.model){throw new u["a"]("font-size-invalid-definition",null,t)}else{e=parseFloat(t.model)}}else{e=parseFloat(t)}return isNaN(e)}const DB=["x-small","x-small","small","medium","large","x-large","xx-large","xxx-large"];class SB extends Kn{static get pluginName(){return"FontSizeEditing"}constructor(t){super(t);t.config.define(US,{options:["tiny","small","default","big","huge"],supportAllValues:false})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:US});t.model.schema.setAttributeProperties(US,{isFormatting:true,copyOnEnter:true});const e=t.config.get("fontSize.supportAllValues");const n=wB(this.editor.config.get("fontSize.options")).filter((t=>t.model));const o=QS(US,n);if(e){this._prepareAnyValueConverters(o);this._prepareCompatibilityConverter()}else{t.conversion.attributeToElement(o)}t.commands.add(US,new kB(t))}_prepareAnyValueConverters(t){const e=this.editor;const n=t.model.values.filter((t=>!V_(String(t))&&!H_(String(t))));if(n.length){throw new u["a"]("font-size-invalid-use-of-named-presets",null,{presets:n})}e.conversion.for("downcast").attributeToElement({model:US,view:(t,{writer:e})=>{if(!t){return}return e.createAttributeElement("span",{style:"font-size:"+t},{priority:7})}});e.conversion.for("upcast").elementToAttribute({model:{key:US,value:t=>t.getStyle("font-size")},view:{name:"span",styles:{"font-size":/.*/}}})}_prepareCompatibilityConverter(){const t=this.editor;t.conversion.for("upcast").elementToAttribute({view:{name:"font",attributes:{size:/^[+-]?\d{1,3}$/}},model:{key:US,value:t=>{const e=t.getAttribute("size");const n=e[0]==="-"||e[0]==="+";let o=parseInt(e,10);if(n){o=3+o}const i=DB.length-1;const r=Math.min(Math.max(o,0),i);return DB[r]}}})}}var BB='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M9.816 11.5 7.038 4.785 4.261 11.5h5.555zm.62 1.5H3.641l-1.666 4.028H.312l5.789-14h1.875l5.789 14h-1.663L10.436 13zm7.55 2.279.779-.779.707.707-2.265 2.265-2.193-2.265.707-.707.765.765V4.825c0-.042 0-.083.002-.123l-.77.77-.707-.707L17.207 2.5l2.265 2.265-.707.707-.782-.782c.002.043.003.089.003.135v10.454z"/></svg>';var TB=n(42);var PB={injectType:"singletonStyleTag",attributes:{"data-cke":true}};PB.insert="head";PB.singleton=true;var IB=wk()(TB["a"],PB);var RB=TB["a"].locals||{};class FB extends Kn{static get pluginName(){return"FontSizeUI"}init(){const t=this.editor;const e=t.t;const n=this._getLocalizedOptions();const o=t.commands.get(US);t.ui.componentFactory.add(US,(i=>{const r=xC(i);DC(r,zB(n,o));r.buttonView.set({label:e("Font Size"),icon:BB,tooltip:true});r.extendTemplate({attributes:{class:["ck-font-size-dropdown"]}});r.bind("isEnabled").to(o);this.listenTo(r,"execute",(e=>{t.execute(e.source.commandName,{value:e.source.commandParam});t.editing.view.focus()}));return r}))}_getLocalizedOptions(){const t=this.editor;const e=t.t;const n={Default:e("Default"),Tiny:e("Tiny"),Small:e("Small"),Big:e("Big"),Huge:e("Huge")};const o=wB(t.config.get(US).options);return o.map((t=>{const e=n[t.title];if(e&&e!=t.title){t=Object.assign({},t,{title:e})}return t}))}}function zB(t,e){const n=new ka;for(const o of t){const t={type:"button",model:new dA({commandName:US,commandParam:o.model,label:o.title,class:"ck-fontsize-option",withText:true})};if(o.view&&o.view.styles){t.model.set("labelStyle",`font-size:${o.view.styles["font-size"]}`)}if(o.view&&o.view.classes){t.model.set("class",`${t.model.class} ${o.view.classes}`)}t.model.bind("isOn").to(e,"value",(t=>t===o.model));n.add(t)}return n}class OB extends Kn{static get requires(){return[SB,FB]}static get pluginName(){return"FontSize"}}class NB extends jn{refresh(){const t=this.editor.model;const e=t.document;const n=ff(e.selection.getSelectedBlocks());this.value=!!n&&n.is("element","paragraph");this.isEnabled=!!n&&MB(n,t.schema)}execute(t={}){const e=this.editor.model;const n=e.document;e.change((o=>{const i=(t.selection||n.selection).getSelectedBlocks();for(const t of i){if(!t.is("element","paragraph")&&MB(t,e.schema)){o.rename(t,"paragraph")}}}))}}function MB(t,e){return e.checkChild(t.parent,"paragraph")&&!e.isObject(t)}class VB extends jn{execute(t){const e=this.editor.model;let n=t.position;e.change((t=>{const o=t.createElement("paragraph");if(!e.schema.checkChild(n.parent,o)){const i=e.schema.findAllowedParent(n,o);if(!i){return}n=t.split(n,i).position}e.insertContent(o,n);t.setSelection(o,"in")}))}}class LB extends Kn{static get pluginName(){return"Paragraph"}init(){const t=this.editor;const e=t.model;t.commands.add("paragraph",new NB(t));t.commands.add("insertParagraph",new VB(t));e.schema.register("paragraph",{inheritAllFrom:"$block"});t.conversion.elementToElement({model:"paragraph",view:"p"});t.conversion.for("upcast").elementToElement({model:(t,{writer:e})=>{if(!LB.paragraphLikeElements.has(t.name)){return null}if(t.isEmpty){return null}return e.createElement("paragraph")},view:/.+/,converterPriority:"low"})}}LB.paragraphLikeElements=new Set(["blockquote","dd","div","dt","h1","h2","h3","h4","h5","h6","li","p","td","th"]);var HB='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10.5 5.5H7v5h3.5a2.5 2.5 0 1 0 0-5zM5 3h6.5v.025a5 5 0 0 1 0 9.95V13H7v4a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z"/></svg>';class KB extends Kn{init(){const t=this.editor;const e=t.t;t.ui.componentFactory.add("paragraph",(n=>{const o=new fw(n);const i=t.commands.get("paragraph");o.label=e("Paragraph");o.icon=HB;o.tooltip=true;o.isToggleable=true;o.bind("isEnabled").to(i);o.bind("isOn").to(i,"value");o.on("execute",(()=>{t.execute("paragraph")}));return o}))}}class qB extends jn{constructor(t,e){super(t);this.modelElements=e}refresh(){const t=ff(this.editor.model.document.selection.getSelectedBlocks());this.value=!!t&&this.modelElements.includes(t.name)&&t.name;this.isEnabled=!!t&&this.modelElements.some((e=>jB(t,e,this.editor.model.schema)))}execute(t){const e=this.editor.model;const n=e.document;const o=t.value;e.change((t=>{const i=Array.from(n.selection.getSelectedBlocks()).filter((t=>jB(t,o,e.schema)));for(const e of i){if(!e.is("element",o)){t.rename(e,o)}}}))}}function jB(t,e,n){return n.checkChild(t.parent,e)&&!n.isObject(t)}const WB="paragraph";class GB extends Kn{static get pluginName(){return"HeadingEditing"}constructor(t){super(t);t.config.define("heading",{options:[{model:"paragraph",title:"Paragraph",class:"ck-heading_paragraph"},{model:"heading1",view:"h2",title:"Heading 1",class:"ck-heading_heading1"},{model:"heading2",view:"h3",title:"Heading 2",class:"ck-heading_heading2"},{model:"heading3",view:"h4",title:"Heading 3",class:"ck-heading_heading3"}]})}static get requires(){return[LB]}init(){const t=this.editor;const e=t.config.get("heading.options");const n=[];for(const o of e){if(o.model!==WB){t.model.schema.register(o.model,{inheritAllFrom:"$block"});t.conversion.elementToElement(o);n.push(o.model)}}this._addDefaultH1Conversion(t);t.commands.add("heading",new qB(t,n))}afterInit(){const t=this.editor;const e=t.commands.get("enter");const n=t.config.get("heading.options");if(e){this.listenTo(e,"afterExecute",((e,o)=>{const i=t.model.document.selection.getFirstPosition().parent;const r=n.some((t=>i.is("element",t.model)));if(r&&!i.is("element",WB)&&i.childCount===0){o.writer.rename(i,WB)}}))}}_addDefaultH1Conversion(t){t.conversion.for("upcast").elementToElement({model:"heading1",view:"h1",converterPriority:l.get("low")+1})}}function UB(t){const e=t.t;const n={Paragraph:e("Paragraph"),"Heading 1":e("Heading 1"),"Heading 2":e("Heading 2"),"Heading 3":e("Heading 3"),"Heading 4":e("Heading 4"),"Heading 5":e("Heading 5"),"Heading 6":e("Heading 6")};return t.config.get("heading.options").map((t=>{const e=n[t.title];if(e&&e!=t.title){t.title=e}return t}))}var $B=n(43);var JB={injectType:"singletonStyleTag",attributes:{"data-cke":true}};JB.insert="head";JB.singleton=true;var YB=wk()($B["a"],JB);var QB=$B["a"].locals||{};class XB extends Kn{static get pluginName(){return"HeadingUI"}init(){const t=this.editor;const e=t.t;const n=UB(t);const o=e("Choose heading");const i=e("Heading");t.ui.componentFactory.add("heading",(e=>{const r={};const s=new ka;const a=t.commands.get("heading");const c=t.commands.get("paragraph");const l=[a];for(const t of n){const e={type:"button",model:new dA({label:t.title,class:t.class,withText:true})};if(t.model==="paragraph"){e.model.bind("isOn").to(c,"value");e.model.set("commandName","paragraph");l.push(c)}else{e.model.bind("isOn").to(a,"value",(e=>e===t.model));e.model.set({commandName:"heading",commandValue:t.model})}s.add(e);r[t.model]=t.title}const d=xC(e);DC(d,s);d.buttonView.set({isOn:false,withText:true,tooltip:i});d.extendTemplate({attributes:{class:["ck-heading-dropdown"]}});d.bind("isEnabled").toMany(l,"isEnabled",((...t)=>t.some((t=>t))));d.buttonView.bind("label").to(a,"value",c,"value",((t,e)=>{const n=t||e&&"paragraph";return r[n]?r[n]:o}));this.listenTo(d,"execute",(e=>{t.execute(e.source.commandName,e.source.commandValue?{value:e.source.commandValue}:undefined);t.editing.view.focus()}));return d}))}}class ZB extends Kn{static get requires(){return[GB,XB]}static get pluginName(){return"Heading"}}class tT extends jn{refresh(){const t=this.editor.model;const e=t.document;this.value=e.selection.getAttribute("highlight");this.isEnabled=t.schema.checkAttributeInSelection(e.selection,"highlight")}execute(t={}){const e=this.editor.model;const n=e.document;const o=n.selection;const i=t.value;e.change((t=>{const n=e.schema.getValidRanges(o.getRanges(),"highlight");if(o.isCollapsed){const e=o.getFirstPosition();if(o.hasAttribute("highlight")){const n=t=>t.item.hasAttribute("highlight")&&t.item.getAttribute("highlight")===this.value;const o=e.getLastMatchingPosition(n,{direction:"backward"});const r=e.getLastMatchingPosition(n);const s=t.createRange(o,r);if(!i||this.value===i){t.removeAttribute("highlight",s);t.removeSelectionAttribute("highlight")}else{t.setAttribute("highlight",i,s);t.setSelectionAttribute("highlight",i)}}else if(i){t.setSelectionAttribute("highlight",i)}}else{for(const e of n){if(i){t.setAttribute("highlight",i,e)}else{t.removeAttribute("highlight",e)}}}}))}}class eT extends Kn{static get pluginName(){return"HighlightEditing"}constructor(t){super(t);t.config.define("highlight",{options:[{model:"yellowMarker",class:"marker-yellow",title:"Yellow marker",color:"var(--ck-highlight-marker-yellow)",type:"marker"},{model:"greenMarker",class:"marker-green",title:"Green marker",color:"var(--ck-highlight-marker-green)",type:"marker"},{model:"pinkMarker",class:"marker-pink",title:"Pink marker",color:"var(--ck-highlight-marker-pink)",type:"marker"},{model:"blueMarker",class:"marker-blue",title:"Blue marker",color:"var(--ck-highlight-marker-blue)",type:"marker"},{model:"redPen",class:"pen-red",title:"Red pen",color:"var(--ck-highlight-pen-red)",type:"pen"},{model:"greenPen",class:"pen-green",title:"Green pen",color:"var(--ck-highlight-pen-green)",type:"pen"}]})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"highlight"});const e=t.config.get("highlight.options");t.conversion.attributeToElement(nT(e));t.commands.add("highlight",new tT(t))}}function nT(t){const e={model:{key:"highlight",values:[]},view:{}};for(const n of t){e.model.values.push(n.model);e.view[n.model]={name:"mark",classes:n.class}}return e}var oT='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path class="ck-icon__fill" d="M10.798 1.59 3.002 12.875l1.895 1.852 2.521 1.402 6.997-12.194z"/><path d="m2.556 16.727.234-.348c-.297-.151-.462-.293-.498-.426-.036-.137.002-.416.115-.837.094-.25.15-.449.169-.595a4.495 4.495 0 0 0 0-.725c-.209-.621-.303-1.041-.284-1.26.02-.218.178-.506.475-.862l6.77-9.414c.539-.91 1.605-.85 3.199.18 1.594 1.032 2.188 1.928 1.784 2.686l-5.877 10.36c-.158.412-.333.673-.526.782-.193.108-.604.179-1.232.21-.362.131-.608.237-.738.318-.13.081-.305.238-.526.47-.293.265-.504.397-.632.397-.096 0-.27-.075-.524-.226l-.31.41-1.6-1.12zm-.279.415 1.575 1.103-.392.515H1.19l1.087-1.618zm8.1-13.656-4.953 6.9L8.75 12.57l4.247-7.574c.175-.25-.188-.647-1.092-1.192-.903-.546-1.412-.652-1.528-.32zM8.244 18.5 9.59 17h9.406v1.5H8.245z"/></svg>';var iT='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path class="ck-icon__fill" d="M10.126 2.268 2.002 13.874l1.895 1.852 2.521 1.402L14.47 5.481l-1.543-2.568-2.801-.645z"/><path d="m4.5 18.088-2.645-1.852-.04-2.95-.006-.005.006-.008v-.025l.011.008L8.73 2.97c.165-.233.356-.417.567-.557l-1.212.308L4.604 7.9l-.83-.558 3.694-5.495 2.708-.69 1.65 1.145.046.018.85-1.216 2.16 1.512-.856 1.222c.828.967 1.144 2.141.432 3.158L7.55 17.286l.006.005-3.055.797H4.5zm-.634.166-1.976.516-.026-1.918 2.002 1.402zM9.968 3.817l-.006-.004-6.123 9.184 3.277 2.294 6.108-9.162.005.003c.317-.452-.16-1.332-1.064-1.966-.891-.624-1.865-.776-2.197-.349zM8.245 18.5 9.59 17h9.406v1.5H8.245z"/></svg>';var rT=n(44);var sT={injectType:"singletonStyleTag",attributes:{"data-cke":true}};sT.insert="head";sT.singleton=true;var aT=wk()(rT["a"],sT);var cT=rT["a"].locals||{};class lT extends Kn{get localizedOptionTitles(){const t=this.editor.t;return{"Yellow marker":t("Yellow marker"),"Green marker":t("Green marker"),"Pink marker":t("Pink marker"),"Blue marker":t("Blue marker"),"Red pen":t("Red pen"),"Green pen":t("Green pen")}}static get pluginName(){return"HighlightUI"}init(){const t=this.editor.config.get("highlight.options");for(const e of t){this._addHighlighterButton(e)}this._addRemoveHighlightButton();this._addDropdown(t)}_addRemoveHighlightButton(){const t=this.editor.t;const e=this.editor.commands.get("highlight");this._addButton("removeHighlight",t("Remove highlight"),hk.eraser,null,(t=>{t.bind("isEnabled").to(e,"isEnabled")}))}_addHighlighterButton(t){const e=this.editor.commands.get("highlight");this._addButton("highlight:"+t.model,t.title,uT(t.type),t.model,n);function n(n){n.bind("isEnabled").to(e,"isEnabled");n.bind("isOn").to(e,"value",(e=>e===t.model));n.iconView.fillColor=t.color;n.isToggleable=true}}_addButton(t,e,n,o,i){const r=this.editor;r.ui.componentFactory.add(t,(t=>{const s=new fw(t);const a=this.localizedOptionTitles[e]?this.localizedOptionTitles[e]:e;s.set({label:a,icon:n,tooltip:true});s.on("execute",(()=>{r.execute("highlight",{value:o});r.editing.view.focus()}));i(s);return s}))}_addDropdown(t){const e=this.editor;const n=e.t;const o=e.ui.componentFactory;const i=t[0];const r=t.reduce(((t,e)=>{t[e.model]=e;return t}),{});o.add("highlight",(s=>{const a=e.commands.get("highlight");const c=xC(s,Nw);const l=c.buttonView;l.set({tooltip:n("Highlight"),lastExecuted:i.model,commandValue:i.model,isToggleable:true});l.bind("icon").to(a,"value",(t=>uT(u(t,"type"))));l.bind("color").to(a,"value",(t=>u(t,"color")));l.bind("commandValue").to(a,"value",(t=>u(t,"model")));l.bind("isOn").to(a,"value",(t=>!!t));l.delegate("execute").to(c);const d=t.map((t=>{const e=o.create("highlight:"+t.model);this.listenTo(e,"execute",(()=>c.buttonView.set({lastExecuted:t.model})));return e}));c.bind("isEnabled").toMany(d,"isEnabled",((...t)=>t.some((t=>t))));d.push(new Xw);d.push(o.create("removeHighlight"));EC(c,d);dT(c);c.toolbarView.ariaLabel=n("Text highlight toolbar");l.on("execute",(()=>{e.execute("highlight",{value:l.commandValue});e.editing.view.focus()}));function u(t,e){const n=!t||t===l.lastExecuted?l.lastExecuted:t;return r[n][e]}return c}))}}function dT(t){const e=t.buttonView.actionView;e.iconView.bind("fillColor").to(t.buttonView,"color")}function uT(t){return t==="marker"?oT:iT}class hT extends Kn{static get requires(){return[eT,lT]}static get pluginName(){return"Highlight"}}class fT extends jn{refresh(){this.isEnabled=mT(this.editor.model)}execute(){const t=this.editor.model;t.change((e=>{const n=e.createElement("horizontalLine");t.insertContent(n);let o=n.nextSibling;const i=o&&t.schema.checkChild(o,"$text");if(!i&&t.schema.checkChild(n.parent,"paragraph")){o=e.createElement("paragraph");t.insertContent(o,e.createPositionAfter(n))}if(o){e.setSelection(o,0)}}))}}function mT(t){const e=t.schema;const n=t.document.selection;return gT(n,e,t)&&!Ay(n,e)}function gT(t,e,n){const o=pT(t,n);return e.checkChild(o,"horizontalLine")}function pT(t,e){const n=Cy(t,e);const o=n.parent;if(o.isEmpty&&!o.is("element","$root")){return o.parent}return o}var bT=n(45);var kT={injectType:"singletonStyleTag",attributes:{"data-cke":true}};kT.insert="head";kT.singleton=true;var wT=wk()(bT["a"],kT);var CT=bT["a"].locals||{};class AT extends Kn{static get pluginName(){return"HorizontalLineEditing"}init(){const t=this.editor;const e=t.model.schema;const n=t.t;const o=t.conversion;e.register("horizontalLine",{isObject:true,allowWhere:"$block"});o.for("dataDowncast").elementToElement({model:"horizontalLine",view:(t,{writer:e})=>e.createEmptyElement("hr")});o.for("editingDowncast").elementToElement({model:"horizontalLine",view:(t,{writer:e})=>{const o=n("Horizontal line");const i=e.createContainerElement("div");const r=e.createEmptyElement("hr");e.addClass("ck-horizontal-line",i);e.setCustomProperty("hr",true,i);e.insert(e.createPositionAt(i,0),r);return _T(i,e,o)}});o.for("upcast").elementToElement({view:"hr",model:"horizontalLine"});t.commands.add("horizontalLine",new fT(t))}}function _T(t,e,n){e.setCustomProperty("horizontalLine",true,t);return fy(t,e,{label:n})}var vT='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 9h16v2H2z"/></svg>';class yT extends Kn{static get pluginName(){return"HorizontalLineUI"}init(){const t=this.editor;const e=t.t;t.ui.componentFactory.add("horizontalLine",(n=>{const o=t.commands.get("horizontalLine");const i=new fw(n);i.set({label:e("Horizontal line"),icon:vT,tooltip:true});i.bind("isEnabled").to(o,"isEnabled");this.listenTo(i,"execute",(()=>{t.execute("horizontalLine");t.editing.view.focus()}));return i}))}}class xT extends Kn{static get requires(){return[AT,yT,ix]}static get pluginName(){return"HorizontalLine"}}class ET extends jn{refresh(){this.isEnabled=DT(this.editor.model)}execute(){const t=this.editor.model;t.change((e=>{const n=e.createElement("rawHtml");t.insertContent(n);e.setSelection(n,"on")}))}}function DT(t){const e=t.schema;const n=t.document.selection;return ST(n,e,t)&&!Ay(n,e)}function ST(t,e,n){const o=BT(t,n);return e.checkChild(o,"rawHtml")}function BT(t,e){const n=Cy(t,e);const o=n.parent;if(o.isEmpty&&!o.is("element","$root")){return o.parent}return o}class TT extends jn{refresh(){const t=this.editor.model;const e=t.document.selection;const n=PT(e);this.isEnabled=!!n}execute(t){const e=this.editor.model;const n=e.document.selection;const o=PT(n);e.change((e=>{e.setAttribute("value",t,o)}))}}function PT(t){const e=t.getSelectedElement();if(e&&e.is("element","rawHtml")){return e}return null}var IT=n(46);var RT={injectType:"singletonStyleTag",attributes:{"data-cke":true}};RT.insert="head";RT.singleton=true;var FT=wk()(IT["a"],RT);var zT=IT["a"].locals||{};class OT extends Kn{static get pluginName(){return"HtmlEmbedEditing"}constructor(t){super(t);t.config.define("htmlEmbed",{showPreviews:false,sanitizeHtml:t=>{Object(u["b"])("html-embed-provide-sanitize-function");return{html:t,hasChanged:false}}})}init(){const t=this.editor;const e=t.model.schema;e.register("rawHtml",{isObject:true,allowWhere:"$block",allowAttributes:["value"]});t.commands.add("updateHtmlEmbed",new TT(t));t.commands.add("insertHtmlEmbed",new ET(t));this._setupConversion()}_setupConversion(){const t=this.editor;const e=t.t;const n=t.editing.view;const o=t.config.get("htmlEmbed");t.data.registerRawContentMatcher({name:"div",classes:"raw-html-embed"});t.conversion.for("upcast").elementToElement({view:{name:"div",classes:"raw-html-embed"},model:(t,{writer:e})=>e.createElement("rawHtml",{value:t.getCustomProperty("$rawContent")})});t.conversion.for("dataDowncast").elementToElement({model:"rawHtml",view:(t,{writer:e})=>e.createRawElement("div",{class:"raw-html-embed"},(function(e){e.innerHTML=t.getAttribute("value")||""}))});t.conversion.for("editingDowncast").elementToElement({triggerBy:{attributes:["value"]},model:"rawHtml",view:(r,{writer:s})=>{let a,c,l;const d=s.createContainerElement("div",{class:"raw-html-embed","data-html-embed-label":e("HTML snippet"),dir:t.locale.uiLanguageDirection});const u=s.createRawElement("div",{class:"raw-html-embed__content-wrapper"},(function(e){a=e;i({domElement:e,editor:t,state:c,props:l});a.addEventListener("mousedown",(()=>{if(c.isEditable){const e=t.model;const n=e.document.selection.getSelectedElement();if(n!==r){e.change((t=>t.setSelection(r,"on")))}}}),true)}));const h={makeEditable(){c=Object.assign({},c,{isEditable:true});i({domElement:a,editor:t,state:c,props:l});n.change((t=>{t.setAttribute("data-cke-ignore-events","true",u)}));a.querySelector("textarea").focus()},save(e){if(e!==c.getRawHtmlValue()){t.execute("updateHtmlEmbed",e);t.editing.view.focus()}else{this.cancel()}},cancel(){c=Object.assign({},c,{isEditable:false});i({domElement:a,editor:t,state:c,props:l});t.editing.view.focus();n.change((t=>{t.removeAttribute("data-cke-ignore-events",u)}))}};c={showPreviews:o.showPreviews,isEditable:false,getRawHtmlValue:()=>r.getAttribute("value")||""};l={sanitizeHtml:o.sanitizeHtml,textareaPlaceholder:e("Paste raw HTML here..."),onEditClick(){h.makeEditable()},onSaveClick(t){h.save(t)},onCancelClick(){h.cancel()}};s.insert(s.createPositionAt(d,0),u);s.setCustomProperty("rawHtmlApi",h,d);s.setCustomProperty("rawHtml",true,d);return fy(d,s,{widgetLabel:e("HTML snippet"),hasSelectionHandle:true})}});function i({domElement:t,editor:e,state:n,props:o}){t.textContent="";const i=t.ownerDocument;let c;if(n.isEditable){const e={isDisabled:false,placeholder:o.textareaPlaceholder};c=s({domDocument:i,state:n,props:e});t.append(c)}else if(n.showPreviews){const r={sanitizeHtml:o.sanitizeHtml};t.append(a({domDocument:i,state:n,props:r,editor:e}))}else{const e={isDisabled:true,placeholder:o.textareaPlaceholder};t.append(s({domDocument:i,state:n,props:e}))}const l={onEditClick:o.onEditClick,onSaveClick:()=>{o.onSaveClick(c.value)},onCancelClick:o.onCancelClick};t.prepend(r({editor:e,domDocument:i,state:n,props:l}))}function r({editor:t,domDocument:e,state:n,props:o}){const i=Zh(e,"div",{class:"raw-html-embed__buttons-wrapper"});const r=NT(t,"edit");const s=NT(t,"save");const a=NT(t,"cancel");if(n.isEditable){const t=s.cloneNode(true);const e=a.cloneNode(true);t.addEventListener("click",(t=>{t.preventDefault();o.onSaveClick()}));e.addEventListener("click",(t=>{t.preventDefault();o.onCancelClick()}));i.appendChild(t);i.appendChild(e)}else{const t=r.cloneNode(true);t.addEventListener("click",(t=>{t.preventDefault();o.onEditClick()}));i.appendChild(t)}return i}function s({domDocument:t,state:e,props:n}){const o=Zh(t,"textarea",{placeholder:n.placeholder,class:"ck ck-reset ck-input ck-input-text raw-html-embed__source"});o.disabled=n.isDisabled;o.value=e.getRawHtmlValue();return o}function a({domDocument:t,state:n,props:o,editor:i}){const r=o.sanitizeHtml(n.getRawHtmlValue());const s=n.getRawHtmlValue().length>0?e("No preview available"):e("Empty snippet content");const a=Zh(t,"div",{class:"ck ck-reset_all raw-html-embed__preview-placeholder"},s);const c=Zh(t,"div",{class:"raw-html-embed__preview-content",dir:i.locale.contentLanguageDirection});c.innerHTML=r.html;const l=Zh(t,"div",{class:"raw-html-embed__preview"},[a,c]);return l}}}function NT(t,e){const n=t.locale.t;const o=new fw(t.locale);const i=t.commands.get("updateHtmlEmbed");o.set({tooltipPosition:t.locale.uiLanguageDirection==="rtl"?"e":"w",icon:hk.pencil,tooltip:true});o.render();if(e==="edit"){o.set({icon:hk.pencil,label:n("Edit source"),class:"raw-html-embed__edit-button"})}else if(e==="save"){o.set({icon:hk.check,label:n("Save changes"),class:"raw-html-embed__save-button"});o.bind("isEnabled").to(i,"isEnabled")}else{o.set({icon:hk.cancel,label:n("Cancel"),class:"raw-html-embed__cancel-button"})}o.destroy();return o.element.cloneNode(true)}var MT='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M17 0a2 2 0 0 1 2 2v7a1 1 0 0 1 1 1v5a1 1 0 0 1-.883.993l-.118.006L19 17a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2l-.001-1.001-.116-.006A1 1 0 0 1 0 15v-5a1 1 0 0 1 .999-1L1 2a2 2 0 0 1 2-2h14zm.499 15.999h-15L2.5 17a.5.5 0 0 0 .5.5h14a.5.5 0 0 0 .5-.5l-.001-1.001zm-3.478-6.013-.014.014H14v.007l-1.525 1.525-1.46-1.46-.015.013V10h-1v5h1v-3.53l1.428 1.43.048.043.131-.129L14 11.421V15h1v-5h-.965l-.014-.014zM2 10H1v5h1v-2h2v2h1v-5H4v2H2v-2zm7 0H6v1h1v4h1v-4h1v-1zm8 0h-1v5h3v-1h-2v-4zm0-8.5H3a.5.5 0 0 0-.5.5l-.001 6.999h15L17.5 2a.5.5 0 0 0-.5-.5zM10 7v1H4V7h6zm3-2v1H4V5h9zm-3-2v1H4V3h6z"/></svg>';class VT extends Kn{static get pluginName(){return"HtmlEmbedUI"}init(){const t=this.editor;const e=t.t;t.ui.componentFactory.add("htmlEmbed",(n=>{const o=t.commands.get("insertHtmlEmbed");const i=new fw(n);i.set({label:e("Insert HTML"),icon:MT,tooltip:true});i.bind("isEnabled").to(o,"isEnabled");this.listenTo(i,"execute",(()=>{t.execute("insertHtmlEmbed");t.editing.view.focus();const e=t.editing.view.document.selection.getSelectedElement();e.getCustomProperty("rawHtmlApi").makeEditable()}));return i}))}}class LT extends Kn{static get requires(){return[OT,VT,ix]}static get pluginName(){return"HtmlEmbed"}}class HT extends Cu{observe(t){this.listenTo(t,"load",((t,e)=>{const n=e.target;if(this.checkShouldIgnoreEventFromTarget(n)){return}if(n.tagName=="IMG"){this._fireEvents(e)}}),{useCapture:true})}_fireEvents(t){if(this.isEnabled){this.document.fire("layoutChanged");this.document.fire("imageLoaded",t)}}}function KT(){return e=>{e.on("element:figure",t)};function t(t,e,n){if(!n.consumable.test(e.viewItem,{name:true,classes:"image"})){return}const o=lE(e.viewItem);if(!o||!o.hasAttribute("src")||!n.consumable.test(o,{name:true})){return}const i=n.convertItem(o,e.modelCursor);const r=ff(i.modelRange.getItems());if(!r){return}n.convertChildren(e.viewItem,r);n.updateConversionResult(r,e)}}function qT(){return e=>{e.on("attribute:srcset:image",t)};function t(t,e,n){if(!n.consumable.consume(e.item,t.name)){return}const o=n.writer;const i=n.mapper.toViewElement(e.item);const r=lE(i);if(e.attributeNewValue===null){const t=e.attributeOldValue;if(t.data){o.removeAttribute("srcset",r);o.removeAttribute("sizes",r);if(t.width){o.removeAttribute("width",r)}}}else{const t=e.attributeNewValue;if(t.data){o.setAttribute("srcset",t.data,r);o.setAttribute("sizes","100vw",r);if(t.width){o.setAttribute("width",t.width,r)}}}}}function jT(t){return n=>{n.on(`attribute:${t}:image`,e)};function e(t,e,n){if(!n.consumable.consume(e.item,t.name)){return}const o=n.writer;const i=n.mapper.toViewElement(e.item);const r=lE(i);o.setAttribute(e.attributeKey,e.attributeNewValue||"",r)}}class WT extends jn{refresh(){this.isEnabled=cE(this.editor.model)}execute(t){const e=this.editor.model;for(const n of Ca(t.source)){aE(e,{src:n})}}}class GT extends Kn{static get pluginName(){return"ImageEditing"}init(){const t=this.editor;const e=t.model.schema;const n=t.t;const o=t.conversion;t.editing.view.addObserver(HT);e.register("image",{isObject:true,isBlock:true,allowWhere:"$block",allowAttributes:["alt","src","srcset"]});o.for("dataDowncast").elementToElement({model:"image",view:(t,{writer:e})=>UT(e)});o.for("editingDowncast").elementToElement({model:"image",view:(t,{writer:e})=>oE(UT(e),e,n("image widget"))});o.for("downcast").add(jT("src")).add(jT("alt")).add(qT());o.for("upcast").elementToElement({view:{name:"img",attributes:{src:true}},model:(t,{writer:e})=>e.createElement("image",{src:t.getAttribute("src")})}).attributeToAttribute({view:{name:"img",key:"alt"},model:"alt"}).attributeToAttribute({view:{name:"img",key:"srcset"},model:{key:"srcset",value:t=>{const e={data:t.getAttribute("srcset")};if(t.hasAttribute("width")){e.width=t.getAttribute("width")}return e}}}).add(KT());const i=new WT(t);t.commands.add("insertImage",i);t.commands.add("imageInsert",i)}}function UT(t){const e=t.createEmptyElement("img");const n=t.createContainerElement("figure",{class:"image"});t.insert(t.createPositionAt(n,0),e);return n}class $T extends jn{refresh(){const t=this.editor.model.document.selection.getSelectedElement();this.isEnabled=sE(t);if(sE(t)&&t.hasAttribute("alt")){this.value=t.getAttribute("alt")}else{this.value=false}}execute(t){const e=this.editor.model;const n=e.document.selection.getSelectedElement();e.change((e=>{e.setAttribute("alt",t.newValue,n)}))}}class JT extends Kn{static get pluginName(){return"ImageTextAlternativeEditing"}init(){this.editor.commands.add("imageTextAlternative",new $T(this.editor))}}var YT=n(47);var QT={injectType:"singletonStyleTag",attributes:{"data-cke":true}};QT.insert="head";QT.singleton=true;var XT=wk()(YT["a"],QT);var ZT=YT["a"].locals||{};var tP=n(48);var eP={injectType:"singletonStyleTag",attributes:{"data-cke":true}};eP.insert="head";eP.singleton=true;var nP=wk()(tP["a"],eP);var oP=tP["a"].locals||{};class iP extends yk{constructor(t){super(t);const e=this.locale.t;this.focusTracker=new mf;this.keystrokes=new gf;this.labeledInput=this._createLabeledInputView();this.saveButtonView=this._createButton(e("Save"),hk.check,"ck-button-save");this.saveButtonView.type="submit";this.cancelButtonView=this._createButton(e("Cancel"),hk.cancel,"ck-button-cancel","cancel");this._focusables=new pk;this._focusCycler=new yw({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});this.setTemplate({tag:"form",attributes:{class:["ck","ck-text-alternative-form","ck-responsive-form"],tabindex:"-1"},children:[this.labeledInput,this.saveButtonView,this.cancelButtonView]});mk(this)}render(){super.render();this.keystrokes.listenTo(this.element);gk({view:this});[this.labeledInput,this.saveButtonView,this.cancelButtonView].forEach((t=>{this._focusables.add(t);this.focusTracker.add(t.element)}))}_createButton(t,e,n,o){const i=new fw(this.locale);i.set({label:t,icon:e,tooltip:true});i.extendTemplate({attributes:{class:n}});if(o){i.delegate("execute").to(this,o)}return i}_createLabeledInputView(){const t=this.locale.t;const e=new sA(this.locale,aA);e.label=t("Text alternative");return e}}function rP(t){const e=t.plugins.get("ContextualBalloon");if(rE(t.editing.view.document.selection)){const n=sP(t);e.updatePosition(n)}}function sP(t){const e=t.editing.view;const n=bA.defaultPositions;return{target:e.domConverter.viewToDom(e.document.selection.getSelectedElement()),positions:[n.northArrowSouth,n.northArrowSouthWest,n.northArrowSouthEast,n.southArrowNorth,n.southArrowNorthWest,n.southArrowNorthEast]}}class aP extends Kn{static get requires(){return[IA]}static get pluginName(){return"ImageTextAlternativeUI"}init(){this._createButton();this._createForm()}destroy(){super.destroy();this._form.destroy()}_createButton(){const t=this.editor;const e=t.t;t.ui.componentFactory.add("imageTextAlternative",(n=>{const o=t.commands.get("imageTextAlternative");const i=new fw(n);i.set({label:e("Change image text alternative"),icon:hk.lowVision,tooltip:true});i.bind("isEnabled").to(o,"isEnabled");this.listenTo(i,"execute",(()=>{this._showForm()}));return i}))}_createForm(){const t=this.editor;const e=t.editing.view;const n=e.document;this._balloon=this.editor.plugins.get("ContextualBalloon");this._form=new iP(t.locale);this._form.render();this.listenTo(this._form,"submit",(()=>{t.execute("imageTextAlternative",{newValue:this._form.labeledInput.fieldView.element.value});this._hideForm(true)}));this.listenTo(this._form,"cancel",(()=>{this._hideForm(true)}));this._form.keystrokes.set("Esc",((t,e)=>{this._hideForm(true);e()}));this.listenTo(t.ui,"update",(()=>{if(!rE(n.selection)){this._hideForm(true)}else if(this._isVisible){rP(t)}}));fk({emitter:this._form,activator:()=>this._isVisible,contextElements:[this._balloon.view.element],callback:()=>this._hideForm()})}_showForm(){if(this._isVisible){return}const t=this.editor;const e=t.commands.get("imageTextAlternative");const n=this._form.labeledInput;this._form.disableCssTransitions();if(!this._isInBalloon){this._balloon.add({view:this._form,position:sP(t)})}n.fieldView.value=n.fieldView.element.value=e.value||"";this._form.labeledInput.fieldView.select();this._form.enableCssTransitions()}_hideForm(t){if(!this._isInBalloon){return}if(this._form.focusTracker.isFocused){this._form.saveButtonView.focus()}this._balloon.remove(this._form);if(t){this.editor.editing.view.focus()}}get _isVisible(){return this._balloon.visibleView===this._form}get _isInBalloon(){return this._balloon.hasView(this._form)}}class cP extends Kn{static get requires(){return[JT,aP]}static get pluginName(){return"ImageTextAlternative"}}var lP=n(49);var dP={injectType:"singletonStyleTag",attributes:{"data-cke":true}};dP.insert="head";dP.singleton=true;var uP=wk()(lP["a"],dP);var hP=lP["a"].locals||{};class fP extends Kn{static get requires(){return[GT,ix,cP]}static get pluginName(){return"Image"}isImageWidget(t){return iE(t)}}function mP(t,e){return n=>{const o=n.createEditableElement("figcaption");n.setCustomProperty("imageCaption",true,o);r_({view:t,element:o,text:e});return wy(o,n)}}function gP(t){return!!t.getCustomProperty("imageCaption")}function pP(t){for(const e of t.getChildren()){if(!!e&&e.is("element","caption")){return e}}return null}function bP(t){const e=t.parent;if(t.name=="figcaption"&&e&&e.name=="figure"&&e.hasClass("image")){return{name:true}}return null}class kP extends Kn{static get pluginName(){return"ImageCaptionEditing"}init(){const t=this.editor;const e=t.editing.view;const n=t.model.schema;const o=t.data;const i=t.editing;const r=t.t;n.register("caption",{allowIn:"image",allowContentOf:"$block",isLimit:true});t.model.document.registerPostFixer((t=>this._insertMissingModelCaptionElement(t)));t.conversion.for("upcast").elementToElement({view:bP,model:"caption"});const s=t=>t.createContainerElement("figcaption");o.downcastDispatcher.on("insert:caption",wP(s,false));const a=mP(e,r("Enter image caption"));i.downcastDispatcher.on("insert:caption",wP(a));i.downcastDispatcher.on("insert",this._fixCaptionVisibility((t=>t.item)),{priority:"high"});i.downcastDispatcher.on("remove",this._fixCaptionVisibility((t=>t.position.parent)),{priority:"high"});e.document.registerPostFixer((t=>this._updateCaptionVisibility(t)))}_updateCaptionVisibility(t){const e=this.editor.editing.mapper;const n=this._lastSelectedCaption;let o;const i=this.editor.model.document.selection;const r=i.getSelectedElement();if(r&&r.is("element","image")){const t=pP(r);o=e.toViewElement(t)}const s=i.getFirstPosition();const a=AP(s.parent);if(a){o=e.toViewElement(a)}if(o&&!this.editor.isReadOnly){if(n){if(n===o){return vP(o,t)}else{_P(n,t);this._lastSelectedCaption=o;return vP(o,t)}}else{this._lastSelectedCaption=o;return vP(o,t)}}else{if(n){const e=_P(n,t);this._lastSelectedCaption=null;return e}else{return false}}}_fixCaptionVisibility(t){return(e,n,o)=>{const i=t(n);const r=AP(i);const s=this.editor.editing.mapper;const a=o.writer;if(r){const t=s.toViewElement(r);if(t){if(r.childCount){a.removeClass("ck-hidden",t)}else{a.addClass("ck-hidden",t)}}}}}_insertMissingModelCaptionElement(t){const e=this.editor.model;const n=e.document.differ.getChanges();const o=[];for(const t of n){if(t.type=="insert"&&t.name!="$text"){const n=t.position.nodeAfter;if(n.is("element","image")&&!pP(n)){o.push(n)}if(!n.is("element","image")&&n.childCount){for(const t of e.createRangeIn(n).getItems()){if(t.is("element","image")&&!pP(t)){o.push(t)}}}}}for(const e of o){t.appendElement("caption",e)}return!!o.length}}function wP(t,e=true){return(n,o,i)=>{const r=o.item;if(!r.childCount&&!e){return}if(sE(r.parent)){if(!i.consumable.consume(o.item,"insert")){return}const e=i.mapper.toViewElement(o.range.start.parent);const n=t(i.writer);const s=i.writer;if(!r.childCount){s.addClass("ck-hidden",n)}CP(n,o.item,e,i)}}}function CP(t,e,n,o){const i=o.writer.createPositionAt(n,"end");o.writer.insert(i,t);o.mapper.bindElements(e,t)}function AP(t){const e=t.getAncestors({includeSelf:true});const n=e.find((t=>t.name=="caption"));if(n&&n.parent&&n.parent.name=="image"){return n}return null}function _P(t,e){if(!t.childCount&&!t.hasClass("ck-hidden")){e.addClass("ck-hidden",t);return true}return false}function vP(t,e){if(t.hasClass("ck-hidden")){e.removeClass("ck-hidden",t);return true}return false}var yP=n(50);var xP={injectType:"singletonStyleTag",attributes:{"data-cke":true}};xP.insert="head";xP.singleton=true;var EP=wk()(yP["a"],xP);var DP=yP["a"].locals||{};class SP extends Kn{static get requires(){return[kP]}static get pluginName(){return"ImageCaption"}}class BP{constructor(){const t=new window.FileReader;this._reader=t;this._data=undefined;this.set("loaded",0);t.onprogress=t=>{this.loaded=t.loaded}}get error(){return this._reader.error}get data(){return this._data}read(t){const e=this._reader;this.total=t.size;return new Promise(((n,o)=>{e.onload=()=>{const t=e.result;this._data=t;n(t)};e.onerror=()=>{o("error")};e.onabort=()=>{o("aborted")};this._reader.readAsDataURL(t)}))}abort(){this._reader.abort()}}Hn(BP,Tn);class TP extends Kn{static get pluginName(){return"FileRepository"}static get requires(){return[Lb]}init(){this.loaders=new ka;this.loaders.on("add",(()=>this._updatePendingAction()));this.loaders.on("remove",(()=>this._updatePendingAction()));this._loadersMap=new Map;this._pendingAction=null;this.set("uploaded",0);this.set("uploadTotal",null);this.bind("uploadedPercent").to(this,"uploaded",this,"uploadTotal",((t,e)=>e?t/e*100:0))}getLoader(t){return this._loadersMap.get(t)||null}createLoader(t){if(!this.createUploadAdapter){Object(u["b"])("filerepository-no-upload-adapter");return null}const e=new PP(Promise.resolve(t),this.createUploadAdapter);this.loaders.add(e);this._loadersMap.set(t,e);if(t instanceof Promise){e.file.then((t=>{this._loadersMap.set(t,e)})).catch((()=>{}))}e.on("change:uploaded",(()=>{let t=0;for(const e of this.loaders){t+=e.uploaded}this.uploaded=t}));e.on("change:uploadTotal",(()=>{let t=0;for(const e of this.loaders){if(e.uploadTotal){t+=e.uploadTotal}}this.uploadTotal=t}));return e}destroyLoader(t){const e=t instanceof PP?t:this.getLoader(t);e._destroy();this.loaders.remove(e);this._loadersMap.forEach(((t,n)=>{if(t===e){this._loadersMap.delete(n)}}))}_updatePendingAction(){const t=this.editor.plugins.get(Lb);if(this.loaders.length){if(!this._pendingAction){const e=this.editor.t;const n=t=>`${e("Upload in progress")} ${parseInt(t)}%.`;this._pendingAction=t.add(n(this.uploadedPercent));this._pendingAction.bind("message").to(this,"uploadedPercent",n)}}else{t.remove(this._pendingAction);this._pendingAction=null}}}Hn(TP,Tn);class PP{constructor(t,e){this.id=a();this._filePromiseWrapper=this._createFilePromiseWrapper(t);this._adapter=e(this);this._reader=new BP;this.set("status","idle");this.set("uploaded",0);this.set("uploadTotal",null);this.bind("uploadedPercent").to(this,"uploaded",this,"uploadTotal",((t,e)=>e?t/e*100:0));this.set("uploadResponse",null)}get file(){if(!this._filePromiseWrapper){return Promise.resolve(null)}else{return this._filePromiseWrapper.promise.then((t=>this._filePromiseWrapper?t:null))}}get data(){return this._reader.data}read(){if(this.status!="idle"){throw new u["a"]("filerepository-read-wrong-status",this)}this.status="reading";return this.file.then((t=>this._reader.read(t))).then((t=>{if(this.status!=="reading"){throw this.status}this.status="idle";return t})).catch((t=>{if(t==="aborted"){this.status="aborted";throw"aborted"}this.status="error";throw this._reader.error?this._reader.error:t}))}upload(){if(this.status!="idle"){throw new u["a"]("filerepository-upload-wrong-status",this)}this.status="uploading";return this.file.then((()=>this._adapter.upload())).then((t=>{this.uploadResponse=t;this.status="idle";return t})).catch((t=>{if(this.status==="aborted"){throw"aborted"}this.status="error";throw t}))}abort(){const t=this.status;this.status="aborted";if(!this._filePromiseWrapper.isFulfilled){this._filePromiseWrapper.promise.catch((()=>{}));this._filePromiseWrapper.rejecter("aborted")}else if(t=="reading"){this._reader.abort()}else if(t=="uploading"&&this._adapter.abort){this._adapter.abort()}this._destroy()}_destroy(){this._filePromiseWrapper=undefined;this._reader=undefined;this._adapter=undefined;this.uploadResponse=undefined}_createFilePromiseWrapper(t){const e={};e.promise=new Promise(((n,o)=>{e.rejecter=o;e.isFulfilled=false;t.then((t=>{e.isFulfilled=true;n(t)})).catch((t=>{e.isFulfilled=true;o(t)}))}));return e}}Hn(PP,Tn);class IP extends yk{constructor(t){super(t);this.buttonView=new fw(t);this._fileInputView=new RP(t);this._fileInputView.bind("acceptedType").to(this);this._fileInputView.bind("allowMultipleFiles").to(this);this._fileInputView.delegate("done").to(this);this.setTemplate({tag:"span",attributes:{class:"ck-file-dialog-button"},children:[this.buttonView,this._fileInputView]});this.buttonView.on("execute",(()=>{this._fileInputView.open()}))}focus(){this.buttonView.focus()}}class RP extends yk{constructor(t){super(t);this.set("acceptedType");this.set("allowMultipleFiles",false);const e=this.bindTemplate;this.setTemplate({tag:"input",attributes:{class:["ck-hidden"],type:"file",tabindex:"-1",accept:e.to("acceptedType"),multiple:e.to("allowMultipleFiles")},on:{change:e.to((()=>{if(this.element&&this.element.files&&this.element.files.length){this.fire("done",this.element.files)}this.element.value=""}))}})}open(){this.element.click()}}class FP extends Kn{static get requires(){return[TP]}static get pluginName(){return"Base64UploadAdapter"}init(){this.editor.plugins.get(TP).createUploadAdapter=t=>new zP(t)}}class zP{constructor(t){this.loader=t}upload(){return new Promise(((t,e)=>{const n=this.reader=new window.FileReader;n.addEventListener("load",(()=>{t({default:n.result})}));n.addEventListener("error",(t=>{e(t)}));n.addEventListener("abort",(()=>{e()}));this.loader.file.then((t=>{n.readAsDataURL(t)}))}))}abort(){this.reader.abort()}}class OP extends Kn{static get requires(){return[TP]}static get pluginName(){return"SimpleUploadAdapter"}init(){const t=this.editor.config.get("simpleUpload");if(!t){return}if(!t.uploadUrl){Object(u["b"])("simple-upload-adapter-missing-uploadurl");return}this.editor.plugins.get(TP).createUploadAdapter=e=>new NP(e,t)}}class NP{constructor(t,e){this.loader=t;this.options=e}upload(){return this.loader.file.then((t=>new Promise(((e,n)=>{this._initRequest();this._initListeners(e,n,t);this._sendRequest(t)}))))}abort(){if(this.xhr){this.xhr.abort()}}_initRequest(){const t=this.xhr=new XMLHttpRequest;t.open("POST",this.options.uploadUrl,true);t.responseType="json"}_initListeners(t,e,n){const o=this.xhr;const i=this.loader;const r=`Couldn't upload file: ${n.name}.`;o.addEventListener("error",(()=>e(r)));o.addEventListener("abort",(()=>e()));o.addEventListener("load",(()=>{const n=o.response;if(!n||n.error){return e(n&&n.error&&n.error.message?n.error.message:r)}t(n.url?{default:n.url}:n.urls)}));if(o.upload){o.upload.addEventListener("progress",(t=>{if(t.lengthComputable){i.uploadTotal=t.total;i.uploaded=t.loaded}}))}}_sendRequest(t){const e=this.options.headers||{};const n=this.options.withCredentials||false;for(const t of Object.keys(e)){this.xhr.setRequestHeader(t,e[t])}this.xhr.withCredentials=n;const o=new FormData;o.append("upload",t);this.xhr.send(o)}}function MP(t){const e=t.map((t=>t.replace("+","\\+")));return new RegExp(`^image\\/(${e.join("|")})$`)}function VP(t){return new Promise(((e,n)=>{const o=t.getAttribute("src");fetch(o).then((t=>t.blob())).then((t=>{const n=HP(t,o);const i=n.replace("image/","");const r=`image.${i}`;const s=new File([t],r,{type:n});e(s)})).catch((t=>t&&t.name==="TypeError"?KP(o).then(e).catch(n):n(t)))}))}function LP(t){if(!t.is("element","img")||!t.getAttribute("src")){return false}return t.getAttribute("src").match(/^data:image\/\w+;base64,/g)||t.getAttribute("src").match(/^blob:/g)}function HP(t,e){if(t.type){return t.type}else if(e.match(/data:(image\/\w+);base64/)){return e.match(/data:(image\/\w+);base64/)[1].toLowerCase()}else{return"image/jpeg"}}function KP(t){return qP(t).then((e=>{const n=HP(e,t);const o=n.replace("image/","");const i=`image.${o}`;return new File([e],i,{type:n})}))}function qP(t){return new Promise(((e,n)=>{const o=ru.document.createElement("img");o.addEventListener("load",(()=>{const t=ru.document.createElement("canvas");t.width=o.width;t.height=o.height;const i=t.getContext("2d");i.drawImage(o,0,0);t.toBlob((t=>t?e(t):n()))}));o.addEventListener("error",(()=>n()));o.src=t}))}class jP extends Kn{static get pluginName(){return"ImageUploadUI"}init(){const t=this.editor;const e=t.t;const n=n=>{const o=new IP(n);const i=t.commands.get("uploadImage");const r=t.config.get("image.upload.types");const s=MP(r);o.set({acceptedType:r.map((t=>`image/${t}`)).join(","),allowMultipleFiles:true});o.buttonView.set({label:e("Insert image"),icon:hk.image,tooltip:true});o.buttonView.bind("isEnabled").to(i);o.on("done",((e,n)=>{const o=Array.from(n).filter((t=>s.test(t.type)));if(o.length){t.execute("uploadImage",{file:o})}}));return o};t.ui.componentFactory.add("uploadImage",n);t.ui.componentFactory.add("imageUpload",n)}}var WP='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 250"><rect rx="4"/></svg>';var GP=n(51);var UP={injectType:"singletonStyleTag",attributes:{"data-cke":true}};UP.insert="head";UP.singleton=true;var $P=wk()(GP["a"],UP);var JP=GP["a"].locals||{};var YP=n(52);var QP={injectType:"singletonStyleTag",attributes:{"data-cke":true}};QP.insert="head";QP.singleton=true;var XP=wk()(YP["a"],QP);var ZP=YP["a"].locals||{};var tI=n(53);var eI={injectType:"singletonStyleTag",attributes:{"data-cke":true}};eI.insert="head";eI.singleton=true;var nI=wk()(tI["a"],eI);var oI=tI["a"].locals||{};class iI extends Kn{static get pluginName(){return"ImageUploadProgress"}constructor(t){super(t);this.placeholder="data:image/svg+xml;utf8,"+encodeURIComponent(WP)}init(){const t=this.editor;t.editing.downcastDispatcher.on("attribute:uploadStatus:image",((...t)=>this.uploadStatusChange(...t)))}uploadStatusChange(t,e,n){const o=this.editor;const i=e.item;const r=i.getAttribute("uploadId");if(!n.consumable.consume(e.item,t.name)){return}const s=o.plugins.get(TP);const a=r?e.attributeNewValue:null;const c=this.placeholder;const l=o.editing.mapper.toViewElement(i);const d=n.writer;if(a=="reading"){rI(l,d);aI(c,l,d);return}if(a=="uploading"){const t=s.loaders.get(r);rI(l,d);if(!t){aI(c,l,d)}else{cI(l,d);lI(l,d,t,o.editing.view);pI(l,d,t)}return}if(a=="complete"&&s.loaders.get(r)){uI(l,d,o.editing.view)}dI(l,d);cI(l,d);sI(l,d)}}function rI(t,e){if(!t.hasClass("ck-appear")){e.addClass("ck-appear",t)}}function sI(t,e){e.removeClass("ck-appear",t)}function aI(t,e,n){if(!e.hasClass("ck-image-upload-placeholder")){n.addClass("ck-image-upload-placeholder",e)}const o=lE(e);if(o.getAttribute("src")!==t){n.setAttribute("src",t,o)}if(!mI(e,"placeholder")){n.insert(n.createPositionAfter(o),fI(n))}}function cI(t,e){if(t.hasClass("ck-image-upload-placeholder")){e.removeClass("ck-image-upload-placeholder",t)}gI(t,e,"placeholder")}function lI(t,e,n,o){const i=hI(e);e.insert(e.createPositionAt(t,"end"),i);n.on("change:uploadedPercent",((t,e,n)=>{o.change((t=>{t.setStyle("width",n+"%",i)}))}))}function dI(t,e){gI(t,e,"progressBar")}function uI(t,e,n){const o=e.createUIElement("div",{class:"ck-image-upload-complete-icon"});e.insert(e.createPositionAt(t,"end"),o);setTimeout((()=>{n.change((t=>t.remove(t.createRangeOn(o))))}),3e3)}function hI(t){const e=t.createUIElement("div",{class:"ck-progress-bar"});t.setCustomProperty("progressBar",true,e);return e}function fI(t){const e=t.createUIElement("div",{class:"ck-upload-placeholder-loader"});t.setCustomProperty("placeholder",true,e);return e}function mI(t,e){for(const n of t.getChildren()){if(n.getCustomProperty(e)){return n}}}function gI(t,e,n){const o=mI(t,n);if(o){e.remove(e.createRangeOn(o))}}function pI(t,e,n){if(n.data){const o=lE(t);e.setAttribute("src",n.data,o)}}class bI extends jn{refresh(){const t=this.editor.model.document.selection.getSelectedElement();const e=t&&t.name==="image"||false;this.isEnabled=cE(this.editor.model)||e}execute(t){const e=this.editor;const n=e.model;const o=e.plugins.get(TP);for(const e of Ca(t.file)){kI(n,o,e)}}}function kI(t,e,n){const o=e.createLoader(n);if(!o){return}aE(t,{uploadId:o.id})}class wI extends Kn{static get requires(){return[TP,lA,$v]}static get pluginName(){return"ImageUploadEditing"}constructor(t){super(t);t.config.define("image",{upload:{types:["jpeg","png","gif","bmp","webp","tiff"]}})}init(){const t=this.editor;const e=t.model.document;const n=t.model.schema;const o=t.conversion;const i=t.plugins.get(TP);const r=MP(t.config.get("image.upload.types"));n.extend("image",{allowAttributes:["uploadId","uploadStatus"]});const s=new bI(t);t.commands.add("uploadImage",s);t.commands.add("imageUpload",s);o.for("upcast").attributeToAttribute({view:{name:"img",key:"uploadId"},model:"uploadId"});this.listenTo(t.editing.view.document,"clipboardInput",((e,n)=>{if(CI(n.dataTransfer)){return}const o=Array.from(n.dataTransfer.files).filter((t=>{if(!t){return false}return r.test(t.type)}));if(!o.length){return}e.stop();t.model.change((e=>{if(n.targetRanges){e.setSelection(n.targetRanges.map((e=>t.editing.mapper.toModelRange(e))))}t.model.enqueueChange("default",(()=>{t.execute("uploadImage",{file:o})}))}))}));this.listenTo(t.plugins.get("ClipboardPipeline"),"inputTransformation",((e,n)=>{const o=Array.from(t.editing.view.createRangeIn(n.content)).filter((t=>LP(t.item)&&!t.item.getAttribute("uploadProcessed"))).map((t=>({promise:VP(t.item),imageElement:t.item})));if(!o.length){return}const r=new S_(t.editing.view.document);for(const t of o){r.setAttribute("uploadProcessed",true,t.imageElement);const e=i.createLoader(t.promise);if(e){r.setAttribute("src","",t.imageElement);r.setAttribute("uploadId",e.id,t.imageElement)}}}));t.editing.view.document.on("dragover",((t,e)=>{e.preventDefault()}));e.on("change",(()=>{const n=e.differ.getChanges({includeChangesInGraveyard:true});for(const e of n){if(e.type=="insert"&&e.name!="$text"){const n=e.position.nodeAfter;const o=e.position.root.rootName=="$graveyard";for(const e of AI(t,n)){const t=e.getAttribute("uploadId");if(!t){continue}const n=i.loaders.get(t);if(!n){continue}if(o){n.abort()}else if(n.status=="idle"){this._readAndUpload(n,e)}}}}}))}_readAndUpload(t,e){const n=this.editor;const o=n.model;const i=n.locale.t;const r=n.plugins.get(TP);const s=n.plugins.get(lA);o.enqueueChange("transparent",(t=>{t.setAttribute("uploadStatus","reading",e)}));return t.read().then((()=>{const i=t.upload();if(Wl.isSafari){const t=n.editing.mapper.toViewElement(e);const o=lE(t);n.editing.view.once("render",(()=>{if(!o.parent){return}const t=n.editing.view.domConverter.mapViewToDom(o.parent);if(!t){return}const e=t.style.display;t.style.display="none";t._ckHack=t.offsetHeight;t.style.display=e}))}o.enqueueChange("transparent",(t=>{t.setAttribute("uploadStatus","uploading",e)}));return i})).then((t=>{o.enqueueChange("transparent",(n=>{n.setAttributes({uploadStatus:"complete",src:t.default},e);this._parseAndSetSrcsetAttributeOnImage(t,e,n)}));a()})).catch((n=>{if(t.status!=="error"&&t.status!=="aborted"){throw n}if(t.status=="error"&&n){s.showWarning(n,{title:i("Upload failed"),namespace:"upload"})}a();o.enqueueChange("transparent",(t=>{t.remove(e)}))}));function a(){o.enqueueChange("transparent",(t=>{t.removeAttribute("uploadId",e);t.removeAttribute("uploadStatus",e)}));r.destroyLoader(t)}}_parseAndSetSrcsetAttributeOnImage(t,e,n){let o=0;const i=Object.keys(t).filter((t=>{const e=parseInt(t,10);if(!isNaN(e)){o=Math.max(o,e);return true}})).map((e=>`${t[e]} ${e}w`)).join(", ");if(i!=""){n.setAttribute("srcset",{data:i,width:o},e)}}}function CI(t){return Array.from(t.types).includes("text/html")&&t.getData("text/html")!==""}function AI(t,e){return Array.from(t.model.createRangeOn(e)).filter((t=>t.item.is("element","image"))).map((t=>t.item))}class _I extends Kn{static get pluginName(){return"ImageUpload"}static get requires(){return[wI,jP,iI]}}var vI=n(54);var yI={injectType:"singletonStyleTag",attributes:{"data-cke":true}};yI.insert="head";yI.singleton=true;var xI=wk()(vI["a"],yI);var EI=vI["a"].locals||{};class DI extends yk{constructor(t,e={}){super(t);const n=this.bindTemplate;this.set("class",e.class||null);this.children=this.createCollection();if(e.children){e.children.forEach((t=>this.children.add(t)))}this.set("_role",null);this.set("_ariaLabelledBy",null);if(e.labelView){this.set({_role:"group",_ariaLabelledBy:e.labelView.id})}this.setTemplate({tag:"div",attributes:{class:["ck","ck-form__row",n.to("class")],role:n.to("_role"),"aria-labelledby":n.to("_ariaLabelledBy")},children:this.children})}}var SI=n(55);var BI={injectType:"singletonStyleTag",attributes:{"data-cke":true}};BI.insert="head";BI.singleton=true;var TI=wk()(SI["a"],BI);var PI=SI["a"].locals||{};class II extends yk{constructor(t,e){super(t);const{insertButtonView:n,cancelButtonView:o}=this._createActionButtons(t);this.insertButtonView=n;this.cancelButtonView=o;this.dropdownView=this._createDropdownView(t);this.set("imageURLInputValue","");this.focusTracker=new mf;this.keystrokes=new gf;this._focusables=new pk;this._focusCycler=new yw({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});this.set("_integrations",new ka);if(e){for(const[t,n]of Object.entries(e)){if(t==="insertImageViaUrl"){n.fieldView.bind("value").to(this,"imageURLInputValue",(t=>t||""));n.fieldView.on("input",(()=>{this.imageURLInputValue=n.fieldView.element.value.trim()}))}n.name=t;this._integrations.add(n)}}this.setTemplate({tag:"form",attributes:{class:["ck","ck-image-insert-form"],tabindex:"-1"},children:[...this._integrations,new DI(t,{children:[this.insertButtonView,this.cancelButtonView],class:"ck-image-insert-form__action-row"})]})}render(){super.render();gk({view:this});const t=[...this._integrations,this.insertButtonView,this.cancelButtonView];t.forEach((t=>{this._focusables.add(t);this.focusTracker.add(t.element)}));this.keystrokes.listenTo(this.element);const e=t=>t.stopPropagation();this.keystrokes.set("arrowright",e);this.keystrokes.set("arrowleft",e);this.keystrokes.set("arrowup",e);this.keystrokes.set("arrowdown",e);this.listenTo(t[0].element,"selectstart",((t,e)=>{e.stopPropagation()}),{priority:"high"})}getIntegration(t){return this._integrations.find((e=>e.name===t))}_createDropdownView(t){const e=t.t;const n=xC(t,Nw);const o=n.buttonView;const i=n.panelView;o.set({label:e("Insert image"),icon:hk.image,tooltip:true});i.extendTemplate({attributes:{class:"ck-image-insert__panel"}});return n}_createActionButtons(t){const e=t.t;const n=new fw(t);const o=new fw(t);n.set({label:e("Insert"),icon:hk.check,class:"ck-button-save",type:"submit",withText:true,isEnabled:this.imageURLInputValue});o.set({label:e("Cancel"),icon:hk.cancel,class:"ck-button-cancel",withText:true});n.bind("isEnabled").to(this,"imageURLInputValue",(t=>!!t));n.delegate("execute").to(this,"submit");o.delegate("execute").to(this,"cancel");return{insertButtonView:n,cancelButtonView:o}}focus(){this._focusCycler.focusFirst()}}function RI(t){const e=t.config.get("image.insert.integrations");const n=t.plugins.get("ImageInsertUI");const o={insertImageViaUrl:FI(t.locale)};if(!e){return o}if(e.find((t=>t==="openCKFinder"))&&t.ui.componentFactory.has("ckfinder")){const e=t.ui.componentFactory.create("ckfinder");e.set({withText:true,class:"ck-image-insert__ck-finder-button"});e.delegate("execute").to(n,"cancel");o.openCKFinder=e}return e.reduce(((e,n)=>{if(o[n]){e[n]=o[n]}else if(t.ui.componentFactory.has(n)){e[n]=t.ui.componentFactory.create(n)}return e}),{})}function FI(t){const e=t.t;const n=new sA(t,aA);n.set({label:e("Insert image via URL")});n.fieldView.placeholder="https://example.com/image.png";return n}class zI extends Kn{static get pluginName(){return"ImageInsertUI"}init(){const t=this.editor;const e=t=>this._createDropdownView(t);t.ui.componentFactory.add("insertImage",e);t.ui.componentFactory.add("imageInsert",e)}_createDropdownView(t){const e=this.editor;const n=new II(t,RI(e));const o=e.commands.get("uploadImage");const i=n.dropdownView;const r=i.buttonView;r.actionView=e.ui.componentFactory.create("uploadImage");r.actionView.extendTemplate({attributes:{class:"ck ck-button ck-splitbutton__action"}});return this._setUpDropdown(i,n,o)}_setUpDropdown(t,e,n){const o=this.editor;const i=o.t;const r=e.insertButtonView;const s=e.getIntegration("insertImageViaUrl");const a=t.panelView;t.bind("isEnabled").to(n);t.buttonView.once("open",(()=>{a.children.add(e)}));t.on("change:isOpen",(()=>{const n=o.model.document.selection.getSelectedElement();if(t.isOpen){e.focus();if(sE(n)){e.imageURLInputValue=n.getAttribute("src");r.label=i("Update");s.label=i("Update image URL")}else{e.imageURLInputValue="";r.label=i("Insert");s.label=i("Insert image via URL")}}}),{priority:"low"});e.delegate("submit","cancel").to(t);this.delegate("cancel").to(t);t.on("submit",(()=>{l();c()}));t.on("cancel",(()=>{l()}));function c(){const t=o.model.document.selection.getSelectedElement();if(sE(t)){o.model.change((n=>{n.setAttribute("src",e.imageURLInputValue,t);n.removeAttribute("srcset",t);n.removeAttribute("sizes",t)}))}else{o.execute("insertImage",{source:e.imageURLInputValue})}}function l(){o.editing.view.focus();t.isOpen=false}return t}}class OI extends Kn{static get pluginName(){return"ImageInsert"}static get requires(){return[_I,zI]}}class NI extends jn{constructor(t,e){super(t);this.defaultStyle=false;this.styles=e.reduce(((t,e)=>{t[e.name]=e;if(e.isDefault){this.defaultStyle=e.name}return t}),{})}refresh(){const t=this.editor.model.document.selection.getSelectedElement();this.isEnabled=sE(t);if(!t){this.value=false}else if(t.hasAttribute("imageStyle")){const e=t.getAttribute("imageStyle");this.value=this.styles[e]?e:false}else{this.value=this.defaultStyle}}execute(t){const e=t.value;const n=this.editor.model;const o=n.document.selection.getSelectedElement();n.change((t=>{if(this.styles[e].isDefault){t.removeAttribute("imageStyle",o)}else{t.setAttribute("imageStyle",e,o)}}))}}function MI(t){return(e,n,o)=>{if(!o.consumable.consume(n.item,e.name)){return}const i=LI(n.attributeNewValue,t);const r=LI(n.attributeOldValue,t);const s=o.mapper.toViewElement(n.item);const a=o.writer;if(r){a.removeClass(r.className,s)}if(i){a.addClass(i.className,s)}}}function VI(t){const e=t.filter((t=>!t.isDefault));return(t,n,o)=>{if(!n.modelRange){return}const i=n.viewItem;const r=ff(n.modelRange.getItems());if(r&&!o.schema.checkAttribute(r,"imageStyle")){return}for(const t of e){if(o.consumable.consume(i,{classes:t.className})){o.writer.setAttribute("imageStyle",t.name,r)}}}}function LI(t,e){for(const n of e){if(n.name===t){return n}}}const HI={full:{name:"full",title:"Full size image",icon:hk.objectFullWidth,isDefault:true},side:{name:"side",title:"Side image",icon:hk.objectRight,className:"image-style-side"},alignLeft:{name:"alignLeft",title:"Left aligned image",icon:hk.objectLeft,className:"image-style-align-left"},alignCenter:{name:"alignCenter",title:"Centered image",icon:hk.objectCenter,className:"image-style-align-center"},alignRight:{name:"alignRight",title:"Right aligned image",icon:hk.objectRight,className:"image-style-align-right"}};const KI={full:hk.objectFullWidth,left:hk.objectLeft,right:hk.objectRight,center:hk.objectCenter};function qI(t=[]){return t.map(jI)}function jI(t){if(typeof t=="string"){const e=t;if(HI[e]){t=Object.assign({},HI[e])}else{Object(u["b"])("image-style-not-found",{name:e});t={name:e}}}else if(HI[t.name]){const e=HI[t.name];const n=Object.assign({},t);for(const o in e){if(!Object.prototype.hasOwnProperty.call(t,o)){n[o]=e[o]}}t=n}if(typeof t.icon=="string"&&KI[t.icon]){t.icon=KI[t.icon]}return t}class WI extends Kn{static get pluginName(){return"ImageStyleEditing"}init(){const t=this.editor;const e=t.model.schema;const n=t.data;const o=t.editing;t.config.define("image.styles",["full","side"]);const i=qI(t.config.get("image.styles"));e.extend("image",{allowAttributes:"imageStyle"});const r=MI(i);o.downcastDispatcher.on("attribute:imageStyle:image",r);n.downcastDispatcher.on("attribute:imageStyle:image",r);n.upcastDispatcher.on("element:figure",VI(i),{priority:"low"});t.commands.add("imageStyle",new NI(t,i))}}var GI=n(56);var UI={injectType:"singletonStyleTag",attributes:{"data-cke":true}};UI.insert="head";UI.singleton=true;var $I=wk()(GI["a"],UI);var JI=GI["a"].locals||{};class YI extends Kn{static get pluginName(){return"ImageStyleUI"}get localizedDefaultStylesTitles(){const t=this.editor.t;return{"Full size image":t("Full size image"),"Side image":t("Side image"),"Left aligned image":t("Left aligned image"),"Centered image":t("Centered image"),"Right aligned image":t("Right aligned image")}}init(){const t=this.editor;const e=t.config.get("image.styles");const n=QI(qI(e),this.localizedDefaultStylesTitles);for(const t of n){this._createButton(t)}}_createButton(t){const e=this.editor;const n=`imageStyle:${t.name}`;e.ui.componentFactory.add(n,(n=>{const o=e.commands.get("imageStyle");const i=new fw(n);i.set({label:t.title,icon:t.icon,tooltip:true,isToggleable:true});i.bind("isEnabled").to(o,"isEnabled");i.bind("isOn").to(o,"value",(e=>e===t.name));this.listenTo(i,"execute",(()=>{e.execute("imageStyle",{value:t.name});e.editing.view.focus()}));return i}))}}function QI(t,e){for(const n of t){if(e[n.title]){n.title=e[n.title]}}return t}class XI extends Kn{static get requires(){return[WI,YI]}static get pluginName(){return"ImageStyle"}}class ZI extends Kn{static get requires(){return[Nx]}static get pluginName(){return"ImageToolbar"}afterInit(){const t=this.editor;const e=t.t;const n=t.plugins.get(Nx);n.register("image",{ariaLabel:e("Image toolbar"),items:t.config.get("image.toolbar")||[],getRelatedElement:rE})}}const tR="italic";class eR extends Kn{static get pluginName(){return"ItalicEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:tR});t.model.schema.setAttributeProperties(tR,{isFormatting:true,copyOnEnter:true});t.conversion.attributeToElement({model:tR,view:"i",upcastAlso:["em",{styles:{"font-style":"italic"}}]});t.commands.add(tR,new xS(t,tR));t.keystrokes.set("CTRL+I",tR)}}var nR='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m9.586 14.633.021.004c-.036.335.095.655.393.962.082.083.173.15.274.201h1.474a.6.6 0 1 1 0 1.2H5.304a.6.6 0 0 1 0-1.2h1.15c.474-.07.809-.182 1.005-.334.157-.122.291-.32.404-.597l2.416-9.55a1.053 1.053 0 0 0-.281-.823 1.12 1.12 0 0 0-.442-.296H8.15a.6.6 0 0 1 0-1.2h6.443a.6.6 0 1 1 0 1.2h-1.195c-.376.056-.65.155-.823.296-.215.175-.423.439-.623.79l-2.366 9.347z"/></svg>';const oR="italic";class iR extends Kn{static get pluginName(){return"ItalicUI"}init(){const t=this.editor;const e=t.t;t.ui.componentFactory.add(oR,(n=>{const o=t.commands.get(oR);const i=new fw(n);i.set({label:e("Italic"),icon:nR,keystroke:"CTRL+I",tooltip:true,isToggleable:true});i.bind("isOn","isEnabled").to(o,"value","isEnabled");this.listenTo(i,"execute",(()=>{t.execute(oR);t.editing.view.focus()}));return i}))}}class rR extends Kn{static get requires(){return[eR,iR]}static get pluginName(){return"Italic"}}class sR{constructor(){this._definitions=new Set}get length(){return this._definitions.size}add(t){if(Array.isArray(t)){t.forEach((t=>this._definitions.add(t)))}else{this._definitions.add(t)}}getDispatcher(){return t=>{t.on("attribute:linkHref",((t,e,n)=>{if(!n.consumable.test(e.item,"attribute:linkHref")){return}const o=n.writer;const i=o.document.selection;for(const t of this._definitions){const r=o.createAttributeElement("a",t.attributes,{priority:5});o.setCustomProperty("link",true,r);if(t.callback(e.attributeNewValue)){if(e.item.is("selection")){o.wrap(i.getFirstRange(),r)}else{o.wrap(n.mapper.toViewRange(e.range),r)}}else{o.unwrap(n.mapper.toViewRange(e.range),r)}}}),{priority:"high"})}}getDispatcherForLinkedImage(){return t=>{t.on("attribute:linkHref:image",((t,e,n)=>{const o=n.mapper.toViewElement(e.item);const i=Array.from(o.getChildren()).find((t=>t.name==="a"));for(const t of this._definitions){const o=La(t.attributes);if(t.callback(e.attributeNewValue)){for(const[t,e]of o){if(t==="class"){n.writer.addClass(e,i)}else{n.writer.setAttribute(t,e,i)}}}else{for(const[t,e]of o){if(t==="class"){n.writer.removeClass(e,i)}else{n.writer.removeAttribute(t,i)}}}}}))}}}class aR extends jn{constructor(t){super(t);this.manualDecorators=new ka;this.automaticDecorators=new sR}restoreManualDecoratorStates(){for(const t of this.manualDecorators){t.value=this._getDecoratorStateFromModel(t.id)}}refresh(){const t=this.editor.model;const e=t.document;const n=ff(e.selection.getSelectedBlocks());if(QD(n,t.schema)){this.value=n.getAttribute("linkHref");this.isEnabled=t.schema.checkAttribute(n,"linkHref")}else{this.value=e.selection.getAttribute("linkHref");this.isEnabled=t.schema.checkAttributeInSelection(e.selection,"linkHref")}for(const t of this.manualDecorators){t.value=this._getDecoratorStateFromModel(t.id)}}execute(t,e={}){const n=this.editor.model;const o=n.document.selection;const i=[];const r=[];for(const t in e){if(e[t]){i.push(t)}else{r.push(t)}}n.change((e=>{if(o.isCollapsed){const s=o.getFirstPosition();if(o.hasAttribute("linkHref")){const a=JE(s,"linkHref",o.getAttribute("linkHref"),n);e.setAttribute("linkHref",t,a);i.forEach((t=>{e.setAttribute(t,true,a)}));r.forEach((t=>{e.removeAttribute(t,a)}));e.setSelection(e.createPositionAfter(a.end.nodeBefore))}else if(t!==""){const r=La(o.getAttributes());r.set("linkHref",t);i.forEach((t=>{r.set(t,true)}));const{end:a}=n.insertContent(e.createText(t,r),s);e.setSelection(a)}["linkHref",...i,...r].forEach((t=>{e.removeSelectionAttribute(t)}))}else{const s=n.schema.getValidRanges(o.getRanges(),"linkHref");const a=[];for(const t of o.getSelectedBlocks()){if(n.schema.checkAttribute(t,"linkHref")){a.push(e.createRangeOn(t))}}const c=a.slice();for(const t of s){if(this._isRangeToUpdate(t,a)){c.push(t)}}for(const n of c){e.setAttribute("linkHref",t,n);i.forEach((t=>{e.setAttribute(t,true,n)}));r.forEach((t=>{e.removeAttribute(t,n)}))}}}))}_getDecoratorStateFromModel(t){const e=this.editor.model;const n=e.document;const o=ff(n.selection.getSelectedBlocks());if(QD(o,e.schema)){return o.getAttribute(t)}return n.selection.getAttribute(t)}_isRangeToUpdate(t,e){for(const n of e){if(n.containsRange(t)){return false}}return true}}class cR extends jn{refresh(){const t=this.editor.model;const e=t.document;const n=ff(e.selection.getSelectedBlocks());if(QD(n,t.schema)){this.isEnabled=t.schema.checkAttribute(n,"linkHref")}else{this.isEnabled=t.schema.checkAttributeInSelection(e.selection,"linkHref")}}execute(){const t=this.editor;const e=this.editor.model;const n=e.document.selection;const o=t.commands.get("link");e.change((t=>{const i=n.isCollapsed?[JE(n.getFirstPosition(),"linkHref",n.getAttribute("linkHref"),e)]:e.schema.getValidRanges(n.getRanges(),"linkHref");for(const e of i){t.removeAttribute("linkHref",e);if(o){for(const n of o.manualDecorators){t.removeAttribute(n.id,e)}}}}))}}class lR{constructor({id:t,label:e,attributes:n,defaultValue:o}){this.id=t;this.set("value");this.defaultValue=o;this.label=e;this.attributes=n}}Hn(lR,Tn);var dR=n(57);var uR={injectType:"singletonStyleTag",attributes:{"data-cke":true}};uR.insert="head";uR.singleton=true;var hR=wk()(dR["a"],uR);var fR=dR["a"].locals||{};const mR="ck-link_selected";const gR="automatic";const pR="manual";const bR=/^(https?:)?\/\//;class kR extends Kn{static get pluginName(){return"LinkEditing"}static get requires(){return[BE,xE,$v]}constructor(t){super(t);t.config.define("link",{addTargetToExternalLinks:false})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"linkHref"});t.conversion.for("dataDowncast").attributeToElement({model:"linkHref",view:GD});t.conversion.for("editingDowncast").attributeToElement({model:"linkHref",view:(t,e)=>GD(UD(t),e)});t.conversion.for("upcast").elementToAttribute({view:{name:"a",attributes:{href:true}},model:{key:"linkHref",value:t=>t.getAttribute("href")}});t.commands.add("link",new aR(t));t.commands.add("unlink",new cR(t));const e=JD(t.t,YD(t.config.get("link.decorators")));this._enableAutomaticDecorators(e.filter((t=>t.mode===gR)));this._enableManualDecorators(e.filter((t=>t.mode===pR)));const n=t.plugins.get(BE);n.registerAttribute("linkHref");QE(t,"linkHref","a",mR);this._enableInsertContentSelectionAttributesFixer();this._enableClickingAfterLink();this._enableTypingOverLink();this._handleDeleteContentAfterLink()}_enableAutomaticDecorators(t){const e=this.editor;const n=e.commands.get("link");const o=n.automaticDecorators;if(e.config.get("link.addTargetToExternalLinks")){o.add({id:"linkIsExternal",mode:gR,callback:t=>bR.test(t),attributes:{target:"_blank",rel:"noopener noreferrer"}})}o.add(t);if(o.length){e.conversion.for("downcast").add(o.getDispatcher())}}_enableManualDecorators(t){if(!t.length){return}const e=this.editor;const n=e.commands.get("link");const o=n.manualDecorators;t.forEach((t=>{e.model.schema.extend("$text",{allowAttributes:t.id});o.add(new lR(t));e.conversion.for("downcast").attributeToElement({model:t.id,view:(e,{writer:n})=>{if(e){const e=o.get(t.id).attributes;const i=n.createAttributeElement("a",e,{priority:5});n.setCustomProperty("link",true,i);return i}}});e.conversion.for("upcast").elementToAttribute({view:{name:"a",attributes:o.get(t.id).attributes},model:{key:t.id}})}))}_enableInsertContentSelectionAttributesFixer(){const t=this.editor;const e=t.model;const n=e.document.selection;const o=t.commands.get("link");this.listenTo(e,"insertContent",(()=>{const t=n.anchor.nodeBefore;const i=n.anchor.nodeAfter;if(!n.hasAttribute("linkHref")){return}if(!t){return}if(!t.hasAttribute("linkHref")){return}if(i&&i.hasAttribute("linkHref")){return}e.change((t=>{wR(t,o.manualDecorators)}))}),{priority:"low"})}_enableClickingAfterLink(){const t=this.editor;const e=t.commands.get("link");t.editing.view.addObserver(D_);let n=false;this.listenTo(t.editing.view.document,"mousedown",(()=>{n=true}));this.listenTo(t.editing.view.document,"selectionChange",(()=>{if(!n){return}n=false;const o=t.model.document.selection;if(!o.isCollapsed){return}if(!o.hasAttribute("linkHref")){return}const i=o.getFirstPosition();const r=JE(i,"linkHref",o.getAttribute("linkHref"),t.model);if(i.isTouching(r.start)||i.isTouching(r.end)){t.model.change((t=>{wR(t,e.manualDecorators)}))}}))}_enableTypingOverLink(){const t=this.editor;const e=t.editing.view;let n;let o;this.listenTo(e.document,"delete",(()=>{o=true}),{priority:"high"});this.listenTo(t.model,"deleteContent",(()=>{const e=t.model.document.selection;if(e.isCollapsed){return}if(o){o=false;return}if(!AR(t)){return}if(CR(t.model)){n=e.getAttributes()}}),{priority:"high"});this.listenTo(t.model,"insertContent",((e,[i])=>{o=false;if(!AR(t)){return}if(!n){return}t.model.change((t=>{for(const[e,o]of n){t.setAttribute(e,o,i)}}));n=null}),{priority:"high"})}_handleDeleteContentAfterLink(){const t=this.editor;const e=t.model;const n=e.document.selection;const o=t.editing.view;const i=t.commands.get("link");let r=false;let s=false;this.listenTo(o.document,"delete",((t,e)=>{s=e.domEvent.keyCode===td.backspace}),{priority:"high"});this.listenTo(e,"deleteContent",(()=>{r=false;const t=n.getFirstPosition();const o=n.getAttribute("linkHref");if(!o){return}const i=JE(t,"linkHref",o,e);r=i.containsPosition(t)||i.end.isEqual(t)}),{priority:"high"});this.listenTo(e,"deleteContent",(()=>{if(!s){return}s=false;if(r){return}t.model.enqueueChange((t=>{wR(t,i.manualDecorators)}))}),{priority:"low"})}}function wR(t,e){t.removeSelectionAttribute("linkHref");for(const n of e){t.removeSelectionAttribute(n.id)}}function CR(t){const e=t.document.selection;const n=e.getFirstPosition();const o=e.getLastPosition();const i=n.nodeAfter;if(!i){return false}if(!i.is("$text")){return false}if(!i.hasAttribute("linkHref")){return false}const r=o.textNode||o.nodeBefore;if(i===r){return true}const s=JE(n,"linkHref",i.getAttribute("linkHref"),t);return s.containsRange(t.createRange(n,o),true)}function AR(t){const e=t.plugins.get("Input");return e.isInput(t.model.change((t=>t.batch)))}var _R=n(58);var vR={injectType:"singletonStyleTag",attributes:{"data-cke":true}};vR.insert="head";vR.singleton=true;var yR=wk()(_R["a"],vR);var xR=_R["a"].locals||{};class ER extends yk{constructor(t,e){super(t);const n=t.t;this.focusTracker=new mf;this.keystrokes=new gf;this.urlInputView=this._createUrlInput();this.saveButtonView=this._createButton(n("Save"),hk.check,"ck-button-save");this.saveButtonView.type="submit";this.cancelButtonView=this._createButton(n("Cancel"),hk.cancel,"ck-button-cancel","cancel");this._manualDecoratorSwitches=this._createManualDecoratorSwitches(e);this.children=this._createFormChildren(e.manualDecorators);this._focusables=new pk;this._focusCycler=new yw({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});const o=["ck","ck-link-form","ck-responsive-form"];if(e.manualDecorators.length){o.push("ck-link-form_layout-vertical","ck-vertical-form")}this.setTemplate({tag:"form",attributes:{class:o,tabindex:"-1"},children:this.children});mk(this)}getDecoratorSwitchesState(){return Array.from(this._manualDecoratorSwitches).reduce(((t,e)=>{t[e.name]=e.isOn;return t}),{})}render(){super.render();gk({view:this});const t=[this.urlInputView,...this._manualDecoratorSwitches,this.saveButtonView,this.cancelButtonView];t.forEach((t=>{this._focusables.add(t);this.focusTracker.add(t.element)}));this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}_createUrlInput(){const t=this.locale.t;const e=new sA(this.locale,aA);e.label=t("Link URL");return e}_createButton(t,e,n,o){const i=new fw(this.locale);i.set({label:t,icon:e,tooltip:true});i.extendTemplate({attributes:{class:n}});if(o){i.delegate("execute").to(this,o)}return i}_createManualDecoratorSwitches(t){const e=this.createCollection();for(const n of t.manualDecorators){const o=new kw(this.locale);o.set({name:n.id,label:n.label,withText:true});o.bind("isOn").toMany([n,t],"value",((t,e)=>e===undefined&&t===undefined?n.defaultValue:t));o.on("execute",(()=>{n.set("value",!o.isOn)}));e.add(o)}return e}_createFormChildren(t){const e=this.createCollection();e.add(this.urlInputView);if(t.length){const t=new yk;t.setTemplate({tag:"ul",children:this._manualDecoratorSwitches.map((t=>({tag:"li",children:[t],attributes:{class:["ck","ck-list__item"]}}))),attributes:{class:["ck","ck-reset","ck-list"]}});e.add(t)}e.add(this.saveButtonView);e.add(this.cancelButtonView);return e}}var DR=n(59);var SR={injectType:"singletonStyleTag",attributes:{"data-cke":true}};SR.insert="head";SR.singleton=true;var BR=wk()(DR["a"],SR);var TR=DR["a"].locals||{};var PR='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.077 15 .991-1.416a.75.75 0 1 1 1.229.86l-1.148 1.64a.748.748 0 0 1-.217.206 5.251 5.251 0 0 1-8.503-5.955.741.741 0 0 1 .12-.274l1.147-1.639a.75.75 0 1 1 1.228.86L4.933 10.7l.006.003a3.75 3.75 0 0 0 6.132 4.294l.006.004zm5.494-5.335a.748.748 0 0 1-.12.274l-1.147 1.639a.75.75 0 1 1-1.228-.86l.86-1.23a3.75 3.75 0 0 0-6.144-4.301l-.86 1.229a.75.75 0 0 1-1.229-.86l1.148-1.64a.748.748 0 0 1 .217-.206 5.251 5.251 0 0 1 8.503 5.955zm-4.563-2.532a.75.75 0 0 1 .184 1.045l-3.155 4.505a.75.75 0 1 1-1.229-.86l3.155-4.506a.75.75 0 0 1 1.045-.184zm4.919 10.562-1.414 1.414a.75.75 0 1 1-1.06-1.06l1.414-1.415-1.415-1.414a.75.75 0 0 1 1.061-1.06l1.414 1.414 1.414-1.415a.75.75 0 0 1 1.061 1.061l-1.414 1.414 1.414 1.415a.75.75 0 0 1-1.06 1.06l-1.415-1.414z"/></svg>';class IR extends yk{constructor(t){super(t);const e=t.t;this.focusTracker=new mf;this.keystrokes=new gf;this.previewButtonView=this._createPreviewButton();this.unlinkButtonView=this._createButton(e("Unlink"),PR,"unlink");this.editButtonView=this._createButton(e("Edit link"),hk.pencil,"edit");this.set("href");this._focusables=new pk;this._focusCycler=new yw({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});this.setTemplate({tag:"div",attributes:{class:["ck","ck-link-actions","ck-responsive-form"],tabindex:"-1"},children:[this.previewButtonView,this.editButtonView,this.unlinkButtonView]})}render(){super.render();const t=[this.previewButtonView,this.editButtonView,this.unlinkButtonView];t.forEach((t=>{this._focusables.add(t);this.focusTracker.add(t.element)}));this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}_createButton(t,e,n){const o=new fw(this.locale);o.set({label:t,icon:e,tooltip:true});o.delegate("execute").to(this,n);return o}_createPreviewButton(){const t=new fw(this.locale);const e=this.bindTemplate;const n=this.t;t.set({withText:true,tooltip:n("Open link in new tab")});t.extendTemplate({attributes:{class:["ck","ck-link-actions__preview"],href:e.to("href",(t=>t&&UD(t))),target:"_blank",rel:"noopener noreferrer"}});t.bind("label").to(this,"href",(t=>t||n("This link has no URL")));t.bind("isEnabled").to(this,"href",(t=>!!t));t.template.tag="a";t.template.eventListeners={};return t}}var RR='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.077 15 .991-1.416a.75.75 0 1 1 1.229.86l-1.148 1.64a.748.748 0 0 1-.217.206 5.251 5.251 0 0 1-8.503-5.955.741.741 0 0 1 .12-.274l1.147-1.639a.75.75 0 1 1 1.228.86L4.933 10.7l.006.003a3.75 3.75 0 0 0 6.132 4.294l.006.004zm5.494-5.335a.748.748 0 0 1-.12.274l-1.147 1.639a.75.75 0 1 1-1.228-.86l.86-1.23a3.75 3.75 0 0 0-6.144-4.301l-.86 1.229a.75.75 0 0 1-1.229-.86l1.148-1.64a.748.748 0 0 1 .217-.206 5.251 5.251 0 0 1 8.503 5.955zm-4.563-2.532a.75.75 0 0 1 .184 1.045l-3.155 4.505a.75.75 0 1 1-1.229-.86l3.155-4.506a.75.75 0 0 1 1.045-.184z"/></svg>';const FR="link-ui";class zR extends Kn{static get requires(){return[IA]}static get pluginName(){return"LinkUI"}init(){const t=this.editor;t.editing.view.addObserver(E_);this.actionsView=this._createActionsView();this.formView=this._createFormView();this._balloon=t.plugins.get(IA);this._createToolbarLinkButton();this._enableUserBalloonInteractions();t.conversion.for("editingDowncast").markerToHighlight({model:FR,view:{classes:["ck-fake-link-selection"]}});t.conversion.for("editingDowncast").markerToElement({model:FR,view:{name:"span",classes:["ck-fake-link-selection","ck-fake-link-selection_collapsed"]}})}destroy(){super.destroy();this.formView.destroy()}_createActionsView(){const t=this.editor;const e=new IR(t.locale);const n=t.commands.get("link");const o=t.commands.get("unlink");e.bind("href").to(n,"value");e.editButtonView.bind("isEnabled").to(n);e.unlinkButtonView.bind("isEnabled").to(o);this.listenTo(e,"edit",(()=>{this._addFormView()}));this.listenTo(e,"unlink",(()=>{t.execute("unlink");this._hideUI()}));e.keystrokes.set("Esc",((t,e)=>{this._hideUI();e()}));e.keystrokes.set(jD,((t,e)=>{this._addFormView();e()}));return e}_createFormView(){const t=this.editor;const e=t.commands.get("link");const n=t.config.get("link.defaultProtocol");const o=new ER(t.locale,e);o.urlInputView.fieldView.bind("value").to(e,"value");o.urlInputView.bind("isReadOnly").to(e,"isEnabled",(t=>!t));o.saveButtonView.bind("isEnabled").to(e);this.listenTo(o,"submit",(()=>{const{value:e}=o.urlInputView.fieldView.element;const i=ZD(e,n);t.execute("link",i,o.getDecoratorSwitchesState());this._closeFormView()}));this.listenTo(o,"cancel",(()=>{this._closeFormView()}));o.keystrokes.set("Esc",((t,e)=>{this._closeFormView();e()}));return o}_createToolbarLinkButton(){const t=this.editor;const e=t.commands.get("link");const n=t.t;t.keystrokes.set(jD,((t,n)=>{n();if(e.isEnabled){this._showUI(true)}}));t.ui.componentFactory.add("link",(t=>{const o=new fw(t);o.isEnabled=true;o.label=n("Link");o.icon=RR;o.keystroke=jD;o.tooltip=true;o.isToggleable=true;o.bind("isEnabled").to(e,"isEnabled");o.bind("isOn").to(e,"value",(t=>!!t));this.listenTo(o,"execute",(()=>this._showUI(true)));return o}))}_enableUserBalloonInteractions(){const t=this.editor.editing.view.document;this.listenTo(t,"click",(()=>{const t=this._getSelectedLinkElement();if(t){this._showUI()}}));this.editor.keystrokes.set("Tab",((t,e)=>{if(this._areActionsVisible&&!this.actionsView.focusTracker.isFocused){this.actionsView.focus();e()}}),{priority:"high"});this.editor.keystrokes.set("Esc",((t,e)=>{if(this._isUIVisible){this._hideUI();e()}}));fk({emitter:this.formView,activator:()=>this._isUIInPanel,contextElements:[this._balloon.view.element],callback:()=>this._hideUI()})}_addActionsView(){if(this._areActionsInPanel){return}this._balloon.add({view:this.actionsView,position:this._getBalloonPositionData()})}_addFormView(){if(this._isFormInPanel){return}const t=this.editor;const e=t.commands.get("link");this.formView.disableCssTransitions();this._balloon.add({view:this.formView,position:this._getBalloonPositionData()});if(this._balloon.visibleView===this.formView){this.formView.urlInputView.fieldView.select()}this.formView.enableCssTransitions();this.formView.urlInputView.fieldView.element.value=e.value||""}_closeFormView(){const t=this.editor.commands.get("link");t.restoreManualDecoratorStates();if(t.value!==undefined){this._removeFormView()}else{this._hideUI()}}_removeFormView(){if(this._isFormInPanel){this.formView.saveButtonView.focus();this._balloon.remove(this.formView);this.editor.editing.view.focus();this._hideFakeVisualSelection()}}_showUI(t=false){if(!this._getSelectedLinkElement()){this._showFakeVisualSelection();this._addActionsView();if(t){this._balloon.showStack("main")}this._addFormView()}else{if(this._areActionsVisible){this._addFormView()}else{this._addActionsView()}if(t){this._balloon.showStack("main")}}this._startUpdatingUI()}_hideUI(){if(!this._isUIInPanel){return}const t=this.editor;this.stopListening(t.ui,"update");this.stopListening(this._balloon,"change:visibleView");t.editing.view.focus();this._removeFormView();this._balloon.remove(this.actionsView);this._hideFakeVisualSelection()}_startUpdatingUI(){const t=this.editor;const e=t.editing.view.document;let n=this._getSelectedLinkElement();let o=r();const i=()=>{const t=this._getSelectedLinkElement();const e=r();if(n&&!t||!n&&e!==o){this._hideUI()}else if(this._isUIVisible){this._balloon.updatePosition(this._getBalloonPositionData())}n=t;o=e};function r(){return e.selection.focus.getAncestors().reverse().find((t=>t.is("element")))}this.listenTo(t.ui,"update",i);this.listenTo(this._balloon,"change:visibleView",i)}get _isFormInPanel(){return this._balloon.hasView(this.formView)}get _areActionsInPanel(){return this._balloon.hasView(this.actionsView)}get _areActionsVisible(){return this._balloon.visibleView===this.actionsView}get _isUIInPanel(){return this._isFormInPanel||this._areActionsInPanel}get _isUIVisible(){const t=this._balloon.visibleView;return t==this.formView||this._areActionsVisible}_getBalloonPositionData(){const t=this.editor.editing.view;const e=this.editor.model;const n=t.document;let o=null;if(e.markers.has(FR)){const e=Array.from(this.editor.editing.mapper.markerNameToElements(FR));const n=t.createRange(t.createPositionBefore(e[0]),t.createPositionAfter(e[e.length-1]));o=t.domConverter.viewRangeToDom(n)}else{const e=this._getSelectedLinkElement();const i=n.selection.getFirstRange();o=e?t.domConverter.mapViewToDom(e):t.domConverter.viewRangeToDom(i)}return{target:o}}_getSelectedLinkElement(){const t=this.editor.editing.view;const e=t.document.selection;if(e.isCollapsed){return OR(e.getFirstPosition())}else{const n=e.getFirstRange().getTrimmed();const o=OR(n.start);const i=OR(n.end);if(!o||o!=i){return null}if(t.createRangeIn(o).getTrimmed().isEqual(n)){return o}else{return null}}}_showFakeVisualSelection(){const t=this.editor.model;t.change((e=>{const n=t.document.selection.getFirstRange();if(t.markers.has(FR)){e.updateMarker(FR,{range:n})}else{if(n.start.isAtEnd){const o=n.start.getLastMatchingPosition((({item:e})=>!t.schema.isContent(e)),{boundaries:n});e.addMarker(FR,{usingOperation:false,affectsData:false,range:e.createRange(o,n.end)})}else{e.addMarker(FR,{usingOperation:false,affectsData:false,range:n})}}}))}_hideFakeVisualSelection(){const t=this.editor.model;if(t.markers.has(FR)){t.change((t=>{t.removeMarker(FR)}))}}}function OR(t){return t.getAncestors().find((t=>WD(t)))}class NR extends Kn{static get requires(){return[kR,zR,oS]}static get pluginName(){return"Link"}}class MR extends Kn{static get requires(){return["ImageEditing",kR]}static get pluginName(){return"LinkImageEditing"}init(){const t=this.editor;t.model.schema.extend("image",{allowAttributes:["linkHref"]});t.conversion.for("upcast").add(VR());t.conversion.for("editingDowncast").add(LR({attachIconIndicator:true}));t.conversion.for("dataDowncast").add(LR({attachIconIndicator:false}));this._enableAutomaticDecorators();this._enableManualDecorators()}_enableAutomaticDecorators(){const t=this.editor;const e=t.commands.get("link");const n=e.automaticDecorators;if(n.length){t.conversion.for("downcast").add(n.getDispatcherForLinkedImage())}}_enableManualDecorators(){const t=this.editor;const e=t.commands.get("link");const n=e.manualDecorators;for(const o of e.manualDecorators){t.model.schema.extend("image",{allowAttributes:o.id});t.conversion.for("downcast").add(HR(n,o));t.conversion.for("upcast").add(KR(n,o))}}}function VR(){return t=>{t.on("element:a",((t,e,n)=>{const o=e.viewItem;const i=qR(o);if(!i){return}const r={attributes:["href"]};if(!n.consumable.consume(o,r)){return}const s=o.getAttribute("href");if(!s){return}let a=e.modelCursor.parent;if(!a.is("element","image")){const t=n.convertItem(i,e.modelCursor);e.modelRange=t.modelRange;e.modelCursor=t.modelCursor;a=e.modelCursor.nodeBefore}if(a&&a.is("element","image")){n.writer.setAttribute("linkHref",s,a)}}),{priority:"high"})}}function LR(t){return e=>{e.on("attribute:linkHref:image",((e,n,o)=>{const i=o.mapper.toViewElement(n.item);const r=o.writer;const s=Array.from(i.getChildren()).find((t=>t.name==="a"));let a;if(t.attachIconIndicator){a=r.createUIElement("span",{class:"ck ck-link-image_icon"},(function(t){const e=this.toDomElement(t);e.innerHTML=RR;return e}))}if(s){if(n.attributeNewValue){r.setAttribute("href",n.attributeNewValue,s)}else{const t=Array.from(s.getChildren()).find((t=>t.name==="img"));r.move(r.createRangeOn(t),r.createPositionAt(i,0));r.remove(s)}}else{const t=r.createContainerElement("a",{href:n.attributeNewValue});r.insert(r.createPositionAt(i,0),t);r.move(r.createRangeOn(i.getChild(1)),r.createPositionAt(t,0));if(a){r.insert(r.createPositionAt(t,"end"),a)}}}))}}function HR(t,e){return n=>{n.on(`attribute:${e.id}:image`,((n,o,i)=>{const r=t.get(e.id).attributes;const s=i.mapper.toViewElement(o.item);const a=Array.from(s.getChildren()).find((t=>t.name==="a"));if(!a){return}for(const[t,e]of La(r)){i.writer.setAttribute(t,e,a)}}))}}function KR(t,e){return n=>{n.on("element:a",((n,o,i)=>{const r=o.viewItem;const s=qR(r);if(!s){return}const a={attributes:t.get(e.id).attributes};const c=new Ha(a);const l=c.match(r);if(!l){return}if(!i.consumable.consume(r,l.match)){return}const d=o.modelCursor.nodeBefore||o.modelCursor.parent;i.writer.setAttribute(e.id,true,d)}),{priority:"high"})}}function qR(t){return Array.from(t.getChildren()).find((t=>t.name==="img"))}class jR extends Kn{static get requires(){return[kR,zR,"Image"]}static get pluginName(){return"LinkImageUI"}init(){const t=this.editor;const e=t.editing.view.document;this.listenTo(e,"click",((n,o)=>{const i=WR(e.selection.getSelectedElement(),t.plugins.get("Image"));if(i){o.preventDefault()}}));this._createToolbarLinkImageButton()}_createToolbarLinkImageButton(){const t=this.editor;const e=t.t;t.ui.componentFactory.add("linkImage",(n=>{const o=new fw(n);const i=t.plugins.get("LinkUI");const r=t.commands.get("link");o.set({isEnabled:true,label:e("Link image"),icon:RR,keystroke:jD,tooltip:true,isToggleable:true});o.bind("isEnabled").to(r,"isEnabled");o.bind("isOn").to(r,"value",(t=>!!t));this.listenTo(o,"execute",(()=>{const e=WR(t.editing.view.document.selection.getSelectedElement(),t.plugins.get("Image"));if(e){i._addActionsView()}else{i._showUI(true)}}));return o}))}}function WR(t,e){const n=t&&e.isImageWidget(t);if(!n){return false}return t.getChild(0).is("element","a")}var GR=n(60);var UR={injectType:"singletonStyleTag",attributes:{"data-cke":true}};UR.insert="head";UR.singleton=true;var $R=wk()(GR["a"],UR);var JR=GR["a"].locals||{};class YR extends Kn{static get requires(){return[MR,jR]}static get pluginName(){return"LinkImage"}}class QR extends jn{constructor(t,e){super(t);this.type=e}refresh(){this.value=this._getValue();this.isEnabled=this._checkEnabled()}execute(){const t=this.editor.model;const e=t.document;const n=Array.from(e.selection.getSelectedBlocks()).filter((e=>ZR(e,t.schema)));const o=this.value===true;t.change((t=>{if(o){let e=n[n.length-1].nextSibling;let o=Number.POSITIVE_INFINITY;let i=[];while(e&&e.name=="listItem"&&e.getAttribute("listIndent")!==0){const t=e.getAttribute("listIndent");if(t<o){o=t}const n=t-o;i.push({element:e,listIndent:n});e=e.nextSibling}i=i.reverse();for(const e of i){t.setAttribute("listIndent",e.listIndent,e.element)}}if(!o){let t=Number.POSITIVE_INFINITY;for(const e of n){if(e.is("element","listItem")&&e.getAttribute("listIndent")<t){t=e.getAttribute("listIndent")}}t=t===0?1:t;XR(n,true,t);XR(n,false,t)}for(const e of n.reverse()){if(o&&e.name=="listItem"){t.rename(e,"paragraph")}else if(!o&&e.name!="listItem"){t.setAttributes({listType:this.type,listIndent:0},e);t.rename(e,"listItem")}else if(!o&&e.name=="listItem"&&e.getAttribute("listType")!=this.type){t.setAttribute("listType",this.type,e)}}this.fire("_executeCleanup",n)}))}_getValue(){const t=ff(this.editor.model.document.selection.getSelectedBlocks());return!!t&&t.is("element","listItem")&&t.getAttribute("listType")==this.type}_checkEnabled(){if(this.value){return true}const t=this.editor.model.document.selection;const e=this.editor.model.schema;const n=ff(t.getSelectedBlocks());if(!n){return false}return ZR(n,e)}}function XR(t,e,n){const o=e?t[0]:t[t.length-1];if(o.is("element","listItem")){let i=o[e?"previousSibling":"nextSibling"];let r=o.getAttribute("listIndent");while(i&&i.is("element","listItem")&&i.getAttribute("listIndent")>=n){if(r>i.getAttribute("listIndent")){r=i.getAttribute("listIndent")}if(i.getAttribute("listIndent")==r){t[e?"unshift":"push"](i)}i=i[e?"previousSibling":"nextSibling"]}}}function ZR(t,e){return e.checkChild(t.parent,"listItem")&&!e.isObject(t)}class tF extends jn{constructor(t,e){super(t);this._indentBy=e=="forward"?1:-1}refresh(){this.isEnabled=this._checkEnabled()}execute(){const t=this.editor.model;const e=t.document;let n=Array.from(e.selection.getSelectedBlocks());t.change((t=>{const e=n[n.length-1];let o=e.nextSibling;while(o&&o.name=="listItem"&&o.getAttribute("listIndent")>e.getAttribute("listIndent")){n.push(o);o=o.nextSibling}if(this._indentBy<0){n=n.reverse()}for(const e of n){const n=e.getAttribute("listIndent")+this._indentBy;if(n<0){t.rename(e,"paragraph")}else{t.setAttribute("listIndent",n,e)}}this.fire("_executeCleanup",n)}))}_checkEnabled(){const t=ff(this.editor.model.document.selection.getSelectedBlocks());if(!t||!t.is("element","listItem")){return false}if(this._indentBy>0){const e=t.getAttribute("listIndent");const n=t.getAttribute("listType");let o=t.previousSibling;while(o&&o.is("element","listItem")&&o.getAttribute("listIndent")>=e){if(o.getAttribute("listIndent")==e){return o.getAttribute("listType")==n}o=o.previousSibling}return false}return true}}function eF(t){const e=t.createContainerElement("li");e.getFillerOffset=dF;return e}function nF(t,e){const n=e.mapper;const o=e.writer;const i=t.getAttribute("listType")=="numbered"?"ol":"ul";const r=eF(o);const s=o.createContainerElement(i,null);o.insert(o.createPositionAt(s,0),r);n.bindElements(t,r);return r}function oF(t,e,n,o){const i=e.parent;const r=n.mapper;const s=n.writer;let a=r.toViewPosition(o.createPositionBefore(t));const c=sF(t.previousSibling,{sameIndent:true,smallerIndent:true,listIndent:t.getAttribute("listIndent")});const l=t.previousSibling;if(c&&c.getAttribute("listIndent")==t.getAttribute("listIndent")){const t=r.toViewElement(c);a=s.breakContainer(s.createPositionAfter(t))}else{if(l&&l.name=="listItem"){a=r.toViewPosition(o.createPositionAt(l,"end"));const t=r.findMappedViewAncestor(a);const e=cF(t);if(e){a=s.createPositionBefore(e)}else{a=s.createPositionAt(t,"end")}}else{a=r.toViewPosition(o.createPositionBefore(t))}}a=rF(a);s.insert(a,i);if(l&&l.name=="listItem"){const t=r.toViewElement(l);const n=s.createRange(s.createPositionAt(t,0),a);const o=n.getWalker({ignoreElementEnd:true});for(const t of o){if(t.item.is("element","li")){const n=s.breakContainer(s.createPositionBefore(t.item));const i=t.item.parent;const r=s.createPositionAt(e,"end");iF(s,r.nodeBefore,r.nodeAfter);s.move(s.createRangeOn(i),r);o.position=n}}}else{const n=i.nextSibling;if(n&&(n.is("element","ul")||n.is("element","ol"))){let o=null;for(const e of n.getChildren()){const n=r.toModelElement(e);if(n&&n.getAttribute("listIndent")>t.getAttribute("listIndent")){o=e}else{break}}if(o){s.breakContainer(s.createPositionAfter(o));s.move(s.createRangeOn(o.parent),s.createPositionAt(e,"end"))}}}iF(s,i,i.nextSibling);iF(s,i.previousSibling,i)}function iF(t,e,n){if(!e||!n||e.name!="ul"&&e.name!="ol"){return null}if(e.name!=n.name||e.getAttribute("class")!==n.getAttribute("class")){return null}return t.mergeContainers(t.createPositionAfter(e))}function rF(t){return t.getLastMatchingPosition((t=>t.item.is("uiElement")))}function sF(t,e){const n=!!e.sameIndent;const o=!!e.smallerIndent;const i=e.listIndent;let r=t;while(r&&r.name=="listItem"){const t=r.getAttribute("listIndent");if(n&&i==t||o&&i>t){return r}if(e.direction==="forward"){r=r.nextSibling}else{r=r.previousSibling}}return null}function aF(t,e,n,o){t.ui.componentFactory.add(e,(i=>{const r=t.commands.get(e);const s=new fw(i);s.set({label:n,icon:o,tooltip:true,isToggleable:true});s.bind("isOn","isEnabled").to(r,"value","isEnabled");s.on("execute",(()=>{t.execute(e);t.editing.view.focus()}));return s}))}function cF(t){for(const e of t.getChildren()){if(e.name=="ul"||e.name=="ol"){return e}}return null}function lF(t,e){const n=[];const o=t.parent;const i={ignoreElementEnd:true,startPosition:t,shallow:true,direction:e};const r=o.getAttribute("listIndent");const s=[...new Of(i)].filter((t=>t.item.is("element"))).map((t=>t.item));for(const t of s){if(!t.is("element","listItem")){break}if(t.getAttribute("listIndent")<r){break}if(t.getAttribute("listIndent")>r){continue}if(t.getAttribute("listType")!==o.getAttribute("listType")){break}if(t.getAttribute("listStyle")!==o.getAttribute("listStyle")){break}if(e==="backward"){n.unshift(t)}else{n.push(t)}}return n}function dF(){const t=!this.isEmpty&&(this.getChild(0).name=="ul"||this.getChild(0).name=="ol");if(this.isEmpty||t){return 0}return pl.call(this)}function uF(t){return(e,n,o)=>{const i=o.consumable;if(!i.test(n.item,"insert")||!i.test(n.item,"attribute:listType")||!i.test(n.item,"attribute:listIndent")){return}i.consume(n.item,"insert");i.consume(n.item,"attribute:listType");i.consume(n.item,"attribute:listIndent");const r=n.item;const s=nF(r,o);oF(r,s,o,t)}}function hF(t){return(e,n,o)=>{const i=o.mapper.toViewPosition(n.position);const r=i.getLastMatchingPosition((t=>!t.item.is("element","li")));const s=r.nodeAfter;const a=o.writer;a.breakContainer(a.createPositionBefore(s));a.breakContainer(a.createPositionAfter(s));const c=s.parent;const l=c.previousSibling;const d=a.createRangeOn(c);const u=a.remove(d);if(l&&l.nextSibling){iF(a,l,l.nextSibling)}const h=o.mapper.toModelElement(s);DF(h.getAttribute("listIndent")+1,n.position,d.start,s,o,t);for(const t of a.createRangeIn(u).getItems()){o.mapper.unbindViewElement(t)}e.stop()}}function fF(t,e,n){if(!n.consumable.consume(e.item,"attribute:listType")){return}const o=n.mapper.toViewElement(e.item);const i=n.writer;i.breakContainer(i.createPositionBefore(o));i.breakContainer(i.createPositionAfter(o));const r=o.parent;const s=e.attributeNewValue=="numbered"?"ol":"ul";i.rename(s,r)}function mF(t,e,n){const o=n.mapper.toViewElement(e.item);const i=o.parent;const r=n.writer;iF(r,i,i.nextSibling);iF(r,i.previousSibling,i);for(const t of e.item.getChildren()){n.consumable.consume(t,"insert")}}function gF(t){return(e,n,o)=>{if(!o.consumable.consume(n.item,"attribute:listIndent")){return}const i=o.mapper.toViewElement(n.item);const r=o.writer;r.breakContainer(r.createPositionBefore(i));r.breakContainer(r.createPositionAfter(i));const s=i.parent;const a=s.previousSibling;const c=r.createRangeOn(s);r.remove(c);if(a&&a.nextSibling){iF(r,a,a.nextSibling)}DF(n.attributeOldValue+1,n.range.start,c.start,i,o,t);oF(n.item,i,o,t);for(const t of n.item.getChildren()){o.consumable.consume(t,"insert")}}}function pF(t,e,n){if(e.item.name!="listItem"){let t=n.mapper.toViewPosition(e.range.start);const o=n.writer;const i=[];while(t.parent.name=="ul"||t.parent.name=="ol"){t=o.breakContainer(t);if(t.parent.name!="li"){break}const e=t;const n=o.createPositionAt(t.parent,"end");if(!e.isEqual(n)){const t=o.remove(o.createRange(e,n));i.push(t)}t=o.createPositionAfter(t.parent)}if(i.length>0){for(let e=0;e<i.length;e++){const n=t.nodeBefore;const r=o.insert(t,i[e]);t=r.end;if(e>0){const e=iF(o,n,n.nextSibling);if(e&&e.parent==n){t.offset--}}}iF(o,t.nodeBefore,t.nodeAfter)}}}function bF(t,e,n){const o=n.mapper.toViewPosition(e.position);const i=o.nodeBefore;const r=o.nodeAfter;iF(n.writer,i,r)}function kF(t,e,n){if(n.consumable.consume(e.viewItem,{name:true})){const t=n.writer;const o=t.createElement("listItem");const i=BF(e.viewItem);t.setAttribute("listIndent",i,o);const r=e.viewItem.parent&&e.viewItem.parent.name=="ol"?"numbered":"bulleted";t.setAttribute("listType",r,o);if(!n.safeInsert(o,e.modelCursor)){return}const s=xF(o,e.viewItem.getChildren(),n);e.modelRange=t.createRange(e.modelCursor,s);n.updateConversionResult(o,e)}}function wF(t,e,n){if(n.consumable.test(e.viewItem,{name:true})){const t=Array.from(e.viewItem.getChildren());for(const e of t){const t=!(e.is("element","li")||SF(e));if(t){e._remove()}}}}function CF(t,e,n){if(n.consumable.test(e.viewItem,{name:true})){if(e.viewItem.childCount===0){return}const t=[...e.viewItem.getChildren()];let n=false;let o=true;for(const e of t){if(n&&!SF(e)){e._remove()}if(e.is("$text")){if(o){e._data=e.data.trimStart()}if(!e.nextSibling||SF(e.nextSibling)){e._data=e.data.trimEnd()}}else if(SF(e)){n=true}o=false}}}function AF(t){return(e,n)=>{if(n.isPhantom){return}const o=n.modelPosition.nodeBefore;if(o&&o.is("element","listItem")){const e=n.mapper.toViewElement(o);const i=e.getAncestors().find(SF);const r=t.createPositionAt(e,0).getWalker();for(const t of r){if(t.type=="elementStart"&&t.item.is("element","li")){n.viewPosition=t.previousPosition;break}else if(t.type=="elementEnd"&&t.item==i){n.viewPosition=t.nextPosition;break}}}}}function _F(t){return(e,n)=>{const o=n.viewPosition;const i=o.parent;const r=n.mapper;if(i.name=="ul"||i.name=="ol"){if(!o.isAtEnd){const e=r.toModelElement(o.nodeAfter);n.modelPosition=t.createPositionBefore(e)}else{const e=r.toModelElement(o.nodeBefore);const i=r.getModelLength(o.nodeBefore);n.modelPosition=t.createPositionBefore(e).getShiftedBy(i)}e.stop()}else if(i.name=="li"&&o.nodeBefore&&(o.nodeBefore.name=="ul"||o.nodeBefore.name=="ol")){const s=r.toModelElement(i);let a=1;let c=o.nodeBefore;while(c&&SF(c)){a+=r.getModelLength(c);c=c.previousSibling}n.modelPosition=t.createPositionBefore(s).getShiftedBy(a);e.stop()}}}function vF(t,e){const n=t.document.differ.getChanges();const o=new Map;let i=false;for(const o of n){if(o.type=="insert"&&o.name=="listItem"){r(o.position)}else if(o.type=="insert"&&o.name!="listItem"){if(o.name!="$text"){const n=o.position.nodeAfter;if(n.hasAttribute("listIndent")){e.removeAttribute("listIndent",n);i=true}if(n.hasAttribute("listType")){e.removeAttribute("listType",n);i=true}if(n.hasAttribute("listStyle")){e.removeAttribute("listStyle",n);i=true}for(const e of Array.from(t.createRangeIn(n)).filter((t=>t.item.is("element","listItem")))){r(e.previousPosition)}}const n=o.position.getShiftedBy(o.length);r(n)}else if(o.type=="remove"&&o.name=="listItem"){r(o.position)}else if(o.type=="attribute"&&o.attributeKey=="listIndent"){r(o.range.start)}else if(o.type=="attribute"&&o.attributeKey=="listType"){r(o.range.start)}}for(const t of o.values()){s(t);a(t)}return i;function r(t){const e=t.nodeBefore;if(!e||!e.is("element","listItem")){const e=t.nodeAfter;if(e&&e.is("element","listItem")){o.set(e,e)}}else{let t=e;if(o.has(t)){return}for(let e=t.previousSibling;e&&e.is("element","listItem");e=t.previousSibling){t=e;if(o.has(t)){return}}o.set(e,t)}}function s(t){let n=0;let o=null;while(t&&t.is("element","listItem")){const r=t.getAttribute("listIndent");if(r>n){let s;if(o===null){o=r-n;s=n}else{if(o>r){o=r}s=r-o}e.setAttribute("listIndent",s,t);i=true}else{o=null;n=t.getAttribute("listIndent")+1}t=t.nextSibling}}function a(t){let n=[];let o=null;while(t&&t.is("element","listItem")){const r=t.getAttribute("listIndent");if(o&&o.getAttribute("listIndent")>r){n=n.slice(0,r+1)}if(r!=0){if(n[r]){const o=n[r];if(t.getAttribute("listType")!=o){e.setAttribute("listType",o,t);i=true}}else{n[r]=t.getAttribute("listType")}}o=t;t=t.nextSibling}}}function yF(t,[e,n]){let o=e.is("documentFragment")?e.getChild(0):e;let i;if(!n){i=this.document.selection}else{i=this.createSelection(n)}if(o&&o.is("element","listItem")){const t=i.getFirstPosition();let e=null;if(t.parent.is("element","listItem")){e=t.parent}else if(t.nodeBefore&&t.nodeBefore.is("element","listItem")){e=t.nodeBefore}if(e){const t=e.getAttribute("listIndent");if(t>0){while(o&&o.is("element","listItem")){o._setAttribute("listIndent",o.getAttribute("listIndent")+t);o=o.nextSibling}}}}}function xF(t,e,n){const{writer:o,schema:i}=n;let r=o.createPositionAfter(t);for(const s of e){if(s.name=="ul"||s.name=="ol"){r=n.convertItem(s,r).modelCursor}else{const e=n.convertItem(s,o.createPositionAt(t,"end"));const a=e.modelRange.start.nodeAfter;const c=a&&a.is("element")&&!i.checkChild(t,a.name);if(c){if(e.modelCursor.parent.is("element","listItem")){t=e.modelCursor.parent}else{t=EF(e.modelCursor)}r=o.createPositionAfter(t)}}}return r}function EF(t){const e=new Of({startPosition:t});let n;do{n=e.next()}while(!n.value.item.is("element","listItem"));return n.value.item}function DF(t,e,n,o,i,r){const s=sF(e.nodeBefore,{sameIndent:true,smallerIndent:true,listIndent:t,foo:"b"});const a=i.mapper;const c=i.writer;const l=s?s.getAttribute("listIndent"):null;let d;if(!s){d=n}else if(l==t){const t=a.toViewElement(s).parent;d=c.createPositionAfter(t)}else{const t=r.createPositionAt(s,"end");d=a.toViewPosition(t)}d=rF(d);for(const t of[...o.getChildren()]){if(SF(t)){d=c.move(c.createRangeOn(t),d).end;iF(c,t,t.nextSibling);iF(c,t.previousSibling,t)}}}function SF(t){return t.is("element","ol")||t.is("element","ul")}function BF(t){let e=0;let n=t.parent;while(n){if(n.is("element","li")){e++}else{const t=n.previousSibling;if(t&&t.is("element","li")){e++}}n=n.parent}return e}class TF extends Kn{static get pluginName(){return"ListEditing"}static get requires(){return[ty,iy]}init(){const t=this.editor;t.model.schema.register("listItem",{inheritAllFrom:"$block",allowAttributes:["listType","listIndent"]});const e=t.data;const n=t.editing;t.model.document.registerPostFixer((e=>vF(t.model,e)));n.mapper.registerViewToModelLength("li",PF);e.mapper.registerViewToModelLength("li",PF);n.mapper.on("modelToViewPosition",AF(n.view));n.mapper.on("viewToModelPosition",_F(t.model));e.mapper.on("modelToViewPosition",AF(n.view));t.conversion.for("editingDowncast").add((e=>{e.on("insert",pF,{priority:"high"});e.on("insert:listItem",uF(t.model));e.on("attribute:listType:listItem",fF,{priority:"high"});e.on("attribute:listType:listItem",mF,{priority:"low"});e.on("attribute:listIndent:listItem",gF(t.model));e.on("remove:listItem",hF(t.model));e.on("remove",bF,{priority:"low"})}));t.conversion.for("dataDowncast").add((e=>{e.on("insert",pF,{priority:"high"});e.on("insert:listItem",uF(t.model))}));t.conversion.for("upcast").add((t=>{t.on("element:ul",wF,{priority:"high"});t.on("element:ol",wF,{priority:"high"});t.on("element:li",CF,{priority:"high"});t.on("element:li",kF)}));t.model.on("insertContent",yF,{priority:"high"});t.commands.add("numberedList",new QR(t,"numbered"));t.commands.add("bulletedList",new QR(t,"bulleted"));t.commands.add("indentList",new tF(t,"forward"));t.commands.add("outdentList",new tF(t,"backward"));const o=n.view.document;this.listenTo(o,"enter",((t,e)=>{const n=this.editor.model.document;const o=n.selection.getLastPosition().parent;if(n.selection.isCollapsed&&o.name=="listItem"&&o.isEmpty){this.editor.execute("outdentList");e.preventDefault();t.stop()}}),{context:"li"});this.listenTo(o,"delete",((t,e)=>{if(e.direction!=="backward"){return}const n=this.editor.model.document.selection;if(!n.isCollapsed){return}const o=n.getFirstPosition();if(!o.isAtStart){return}const i=o.parent;if(i.name!=="listItem"){return}const r=i.previousSibling&&i.previousSibling.name==="listItem";if(r){return}this.editor.execute("outdentList");e.preventDefault();t.stop()}),{context:"li"});const i=t=>(e,n)=>{const o=this.editor.commands.get(t);if(o.isEnabled){this.editor.execute(t);n()}};t.keystrokes.set("Tab",i("indentList"));t.keystrokes.set("Shift+Tab",i("outdentList"))}afterInit(){const t=this.editor.commands;const e=t.get("indent");const n=t.get("outdent");if(e){e.registerChildCommand(t.get("indentList"))}if(n){n.registerChildCommand(t.get("outdentList"))}}}function PF(t){let e=1;for(const n of t.getChildren()){if(n.name=="ul"||n.name=="ol"){for(const t of n.getChildren()){e+=PF(t)}}}return e}var IF='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M7 5.75c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zM3.5 3v5H2V3.7H1v-1h2.5V3zM.343 17.857l2.59-3.257H2.92a.6.6 0 1 0-1.04 0H.302a2 2 0 1 1 3.995 0h-.001c-.048.405-.16.734-.333.988-.175.254-.59.692-1.244 1.312H4.3v1h-4l.043-.043zM7 14.75a.75.75 0 0 1 .75-.75h9.5a.75.75 0 1 1 0 1.5h-9.5a.75.75 0 0 1-.75-.75z"/></svg>';var RF='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M7 5.75c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zm-6 0C1 4.784 1.777 4 2.75 4c.966 0 1.75.777 1.75 1.75 0 .966-.777 1.75-1.75 1.75C1.784 7.5 1 6.723 1 5.75zm6 9c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zm-6 0c0-.966.777-1.75 1.75-1.75.966 0 1.75.777 1.75 1.75 0 .966-.777 1.75-1.75 1.75-.966 0-1.75-.777-1.75-1.75z"/></svg>';class FF extends Kn{static get pluginName(){return"ListUI"}init(){const t=this.editor.t;aF(this.editor,"numberedList",t("Numbered List"),IF);aF(this.editor,"bulletedList",t("Bulleted List"),RF)}}class zF extends Kn{static get requires(){return[TF,FF]}static get pluginName(){return"List"}}function OF(t,e){for(const n of t.getChildren()){if(n.is("element","b")&&n.getStyle("font-weight")==="normal"){const o=t.getChildIndex(n);e.remove(n);e.insertChild(o,n.getChildren(),t)}}}function NF(t,e){if(!t.childCount){return}const n=new S_(t.document);const o=VF(t,n);if(!o.length){return}let i=null;let r=1;o.forEach(((t,s)=>{const a=$F(o[s-1],t);const c=a?null:o[s-1];const l=YF(c,t);if(a){i=null;r=1}if(!i||l!==0){const o=LF(t,e);if(!i){i=jF(o,t.element,n)}else if(t.indent>r){const t=i.getChild(i.childCount-1);const e=t.getChild(t.childCount-1);i=jF(o,e,n);r+=1}else if(t.indent<r){const e=r-t.indent;i=QF(i,e);r=parseInt(t.indent)}if(t.indent<=r){if(!i.is("element",o.type)){i=n.rename(o.type,i)}}}const d=WF(t.element,n);n.appendChild(d,i)}))}function MF(t,e){for(const n of e.createRangeIn(t)){const t=n.item;if(t.is("element","li")){const n=t.getChild(0);if(n&&n.is("element","p")){e.unwrapElement(n)}}}}function VF(t,e){const n=e.createRangeIn(t);const o=new Ha({name:/^p|h\d+$/,styles:{"mso-list":/.*/}});const i=[];for(const t of n){if(t.type==="elementStart"&&o.match(t.item)){const e=GF(t.item);i.push({element:t.item,id:e.id,order:e.order,indent:e.indent})}}return i}function LF(t,e){const n=new RegExp(`@list l${t.id}:level${t.indent}\\s*({[^}]*)`,"gi");const o=/mso-level-number-format:([^;]{0,100});/gi;const i=n.exec(e);let r="decimal";let s="ol";if(i&&i[1]){const e=o.exec(i[1]);if(e&&e[1]){r=e[1].trim();s=r!=="bullet"&&r!=="image"?"ol":"ul"}if(r==="bullet"){const e=HF(t.element);if(e){r=e}}}return{type:s,style:qF(r)}}function HF(t){const e=KF(t);if(!e){return null}const n=e._data;if(n==="o"){return"circle"}else if(n==="·"){return"disc"}else if(n==="§"){return"square"}return null}function KF(t){if(t.getChild(0).is("$text")){return null}const e=t.getChild(0).getChild(0);if(e.is("$text")){return e}return e.getChild(0)}function qF(t){switch(t){case"arabic-leading-zero":return"decimal-leading-zero";case"alpha-upper":return"upper-alpha";case"alpha-lower":return"lower-alpha";case"roman-upper":return"upper-roman";case"roman-lower":return"lower-roman";case"circle":case"disc":case"square":return t;default:return null}}function jF(t,e,n){const o=e.parent;const i=n.createElement(t.type);const r=o.getChildIndex(e)+1;n.insertChild(r,i,o);if(t.style){n.setStyle("list-style-type",t.style,i)}return i}function WF(t,e){UF(t,e);return e.rename("li",t)}function GF(t){const e={};const n=t.getStyle("mso-list");if(n){const t=n.match(/(^|\s{1,100})l(\d+)/i);const o=n.match(/\s{0,100}lfo(\d+)/i);const i=n.match(/\s{0,100}level(\d+)/i);if(t&&o&&i){e.id=t[2];e.order=o[1];e.indent=i[1]}}return e}function UF(t,e){const n=new Ha({name:"span",styles:{"mso-list":"Ignore"}});const o=e.createRangeIn(t);for(const t of o){if(t.type==="elementStart"&&n.match(t.item)){e.remove(t.item)}}}function $F(t,e){if(!t){return true}if(t.id!==e.id){if(e.indent-t.indent===1){return false}return true}const n=e.element.previousSibling;if(!n){return true}return!JF(n)}function JF(t){return t.is("element","ol")||t.is("element","ul")}function YF(t,e){return t?e.indent-t.indent:e.indent-1}function QF(t,e){const n=t.getAncestors({parentFirst:true});let o=null;let i=0;for(const t of n){if(t.name==="ul"||t.name==="ol"){i++}if(i===e){o=t;break}}return o}const XF=/id=("|')docs-internal-guid-[-0-9a-f]+("|')/i;class ZF{constructor(t){this.document=t}isActive(t){return XF.test(t)}execute(t){const e=new S_(this.document);OF(t.content,e);MF(t.content,e)}}function tz(t){return nz(nz(t)).replace(/(<span\s+style=['"]mso-spacerun:yes['"]>[^\S\r\n]*?)[\r\n]+([^\S\r\n]*<\/span>)/g,"$1$2").replace(/<span\s+style=['"]mso-spacerun:yes['"]><\/span>/g,"").replace(/ <\//g," </").replace(/ <o:p><\/o:p>/g," <o:p></o:p>").replace(/<o:p>( |\u00A0)<\/o:p>/g,"").replace(/>([^\S\r\n]*[\r\n]\s*)</g,"><")}function ez(t){t.querySelectorAll("span[style*=spacerun]").forEach((t=>{const e=t.innerText.length||0;t.innerHTML=Array(e+1).join(" ").substr(0,e)}))}function nz(t){return t.replace(/<span(?: class="Apple-converted-space"|)>(\s+)<\/span>/g,((t,e)=>e.length===1?" ":Array(e.length+1).join(" ").substr(0,e.length)))}function oz(t,e){const n=new DOMParser;t=t.replace(/<!--\[if gte vml 1]>/g,"");const o=tz(sz(t));const i=n.parseFromString(o,"text/html");ez(i);const r=i.body.innerHTML;const s=iz(i,e);const a=rz(i);return{body:s,bodyString:r,styles:a.styles,stylesString:a.stylesString}}function iz(t,e){const n=new Ol(e);const o=new du(n,{blockFillerMode:"nbsp"});const i=t.createDocumentFragment();const r=t.body.childNodes;while(r.length>0){i.appendChild(r[0])}return o.domToView(i)}function rz(t){const e=[];const n=[];const o=Array.from(t.getElementsByTagName("style"));for(const t of o){if(t.sheet&&t.sheet.cssRules&&t.sheet.cssRules.length){e.push(t.sheet);n.push(t.innerHTML)}}return{styles:e,stylesString:n.join(" ")}}function sz(t){const e="</body>";const n="</html>";const o=t.indexOf(e);if(o<0){return t}const i=t.indexOf(n,o+e.length);return t.substring(0,o+e.length)+(i>=0?t.substring(i):"")}function az(t,e){if(!t.childCount){return}const n=new S_;const o=lz(t,n);dz(o,t,n);uz(t,n);const i=hz(t,n);if(i.length){mz(i,fz(e),n)}}function cz(t){return btoa(t.match(/\w{2}/g).map((t=>String.fromCharCode(parseInt(t,16)))).join(""))}function lz(t,e){const n=e.createRangeIn(t);const o=new Ha({name:/v:(.+)/});const i=[];for(const t of n){const e=t.item;const n=e.previousSibling&&e.previousSibling.name||null;if(o.match(e)&&e.getAttribute("o:gfxdata")&&n!=="v:shapetype"){i.push(t.item.getAttribute("id"))}}return i}function dz(t,e,n){const o=n.createRangeIn(e);const i=new Ha({name:"img"});const r=[];for(const e of o){if(i.match(e.item)){const n=e.item;const o=n.getAttribute("v:shapes")?n.getAttribute("v:shapes").split(" "):[];if(o.length&&o.every((e=>t.indexOf(e)>-1))){r.push(n)}else if(!n.getAttribute("src")){r.push(n)}}}for(const t of r){n.remove(t)}}function uz(t,e){const n=e.createRangeIn(t);const o=new Ha({name:/v:(.+)/});const i=[];for(const t of n){if(o.match(t.item)){i.push(t.item)}}for(const t of i){e.remove(t)}}function hz(t,e){const n=e.createRangeIn(t);const o=new Ha({name:"img"});const i=[];for(const t of n){if(o.match(t.item)){if(t.item.getAttribute("src").startsWith("file://")){i.push(t.item)}}}return i}function fz(t){if(!t){return[]}const e=/{\\pict[\s\S]+?\\bliptag-?\d+(\\blipupi-?\d+)?({\\\*\\blipuid\s?[\da-fA-F]+)?[\s}]*?/;const n=new RegExp("(?:("+e.source+"))([\\da-fA-F\\s]+)\\}","g");const o=t.match(n);const i=[];if(o){for(const t of o){let n=false;if(t.includes("\\pngblip")){n="image/png"}else if(t.includes("\\jpegblip")){n="image/jpeg"}if(n){i.push({hex:t.replace(e,"").replace(/[^\da-fA-F]/g,""),type:n})}}}return i}function mz(t,e,n){if(t.length===e.length){for(let o=0;o<t.length;o++){const i=`data:${e[o].type};base64,${cz(e[o].hex)}`;n.setAttribute("src",i,t[o])}}}const gz=/<meta\s*name="?generator"?\s*content="?microsoft\s*word\s*\d+"?\/?>/i;const pz=/xmlns:o="urn:schemas-microsoft-com/i;class bz{constructor(t){this.document=t}isActive(t){return gz.test(t)||pz.test(t)}execute(t){const{body:e,stylesString:n}=oz(t.dataTransfer.getData("text/html"),this.document.stylesProcessor);NF(e,n);az(e,t.dataTransfer.getData("text/rtf"));t.content=e}}class kz extends Kn{static get pluginName(){return"PasteFromOffice"}static get requires(){return[$v]}init(){const t=this.editor;const e=t.editing.view.document;const n=[];n.push(new bz(e));n.push(new ZF(e));t.plugins.get("ClipboardPipeline").on("inputTransformation",((t,e)=>{if(e.isTransformedWithPasteFromOffice){return}const o=e.dataTransfer.getData("text/html");const i=n.find((t=>t.isActive(o)));if(i){i.execute(e);e.isTransformedWithPasteFromOffice=true}}),{priority:"high"})}}function wz(t,e,n,o,i=1){if(e>i){o.setAttribute(t,e,n)}else{o.removeAttribute(t,n)}}function Cz(t,e,n={}){const o=t.createElement("tableCell",n);t.insertElement("paragraph",o);t.insert(o,e);return o}function Az(t,e){const n=e.parent.parent;const o=parseInt(n.getAttribute("headingColumns")||0);const{column:i}=t.getCellLocation(e);return!!o&&i<o}function _z(){return t=>{t.on("element:table",((t,e,n)=>{const o=e.viewItem;if(!n.consumable.test(o,{name:true})){return}const{rows:i,headingRows:r,headingColumns:s}=xz(o);const a={};if(s){a.headingColumns=s}if(r){a.headingRows=r}const c=n.writer.createElement("table",a);if(!n.safeInsert(c,e.modelCursor)){return}n.consumable.consume(o,{name:true});i.forEach((t=>n.convertItem(t,n.writer.createPositionAt(c,"end"))));if(c.isEmpty){const t=n.writer.createElement("tableRow");n.writer.insert(t,n.writer.createPositionAt(c,"end"));Cz(n.writer,n.writer.createPositionAt(t,"end"))}n.updateConversionResult(c,e)}))}}function vz(){return t=>{t.on("element:tr",((t,e)=>{if(e.viewItem.isEmpty&&e.modelCursor.index==0){t.stop()}}),{priority:"high"})}}function yz(t){return e=>{e.on(`element:${t}`,((t,e,n)=>{if(!e.modelRange){return}if(e.viewItem.isEmpty){const t=e.modelRange.start.nodeAfter;const o=n.writer.createPositionAt(t,0);n.writer.insertElement("paragraph",o)}}),{priority:"low"})}}function xz(t){const e={headingRows:0,headingColumns:0};const n=[];const o=[];let i;for(const r of Array.from(t.getChildren())){if(r.name==="tbody"||r.name==="thead"||r.name==="tfoot"){if(r.name==="thead"&&!i){i=r}const t=Array.from(r.getChildren()).filter((t=>t.is("element","tr")));for(const r of t){if(r.parent.name==="thead"&&r.parent===i){e.headingRows++;n.push(r)}else{o.push(r);const t=Ez(r,e,i);if(t>e.headingColumns){e.headingColumns=t}}}}}e.rows=[...n,...o];return e}function Ez(t){let e=0;let n=0;const o=Array.from(t.getChildren()).filter((t=>t.name==="th"||t.name==="td"));while(n<o.length&&o[n].name==="th"){const t=o[n];const i=parseInt(t.getAttribute("colspan")||1);e=e+i;n++}return e}class Dz{constructor(t,e={}){this._table=t;this._startRow=e.row!==undefined?e.row:e.startRow||0;this._endRow=e.row!==undefined?e.row:e.endRow;this._startColumn=e.column!==undefined?e.column:e.startColumn||0;this._endColumn=e.column!==undefined?e.column:e.endColumn;this._includeAllSlots=!!e.includeAllSlots;this._skipRows=new Set;this._row=0;this._column=0;this._cellIndex=0;this._spannedCells=new Map;this._nextCellAtColumn=-1}[Symbol.iterator](){return this}next(){const t=this._table.getChild(this._row);if(!t||this._isOverEndRow()){return{done:true}}if(this._isOverEndColumn()){return this._advanceToNextRow()}let e=null;const n=this._getSpanned();if(n){if(this._includeAllSlots&&!this._shouldSkipSlot()){e=this._formatOutValue(n.cell,n.row,n.column)}}else{const n=t.getChild(this._cellIndex);if(!n){return this._advanceToNextRow()}const o=parseInt(n.getAttribute("colspan")||1);const i=parseInt(n.getAttribute("rowspan")||1);if(o>1||i>1){this._recordSpans(n,i,o)}if(!this._shouldSkipSlot()){e=this._formatOutValue(n)}this._nextCellAtColumn=this._column+o}this._column++;if(this._column==this._nextCellAtColumn){this._cellIndex++}return e||this.next()}skipRow(t){this._skipRows.add(t)}_advanceToNextRow(){this._row++;this._column=0;this._cellIndex=0;this._nextCellAtColumn=-1;return this.next()}_isOverEndRow(){return this._endRow!==undefined&&this._row>this._endRow}_isOverEndColumn(){return this._endColumn!==undefined&&this._column>this._endColumn}_formatOutValue(t,e=this._row,n=this._column){return{done:false,value:new Sz(this,t,e,n)}}_shouldSkipSlot(){const t=this._skipRows.has(this._row);const e=this._row<this._startRow;const n=this._column<this._startColumn;const o=this._endColumn!==undefined&&this._column>this._endColumn;return t||e||n||o}_getSpanned(){const t=this._spannedCells.get(this._row);if(!t){return null}return t.get(this._column)||null}_recordSpans(t,e,n){const o={cell:t,row:this._row,column:this._column};for(let t=this._row;t<this._row+e;t++){for(let e=this._column;e<this._column+n;e++){if(t!=this._row||e!=this._column){this._markSpannedCell(t,e,o)}}}}_markSpannedCell(t,e,n){if(!this._spannedCells.has(t)){this._spannedCells.set(t,new Map)}const o=this._spannedCells.get(t);o.set(e,n)}}class Sz{constructor(t,e,n,o){this.cell=e;this.row=t._row;this.column=t._column;this.cellAnchorRow=n;this.cellAnchorColumn=o;this._cellIndex=t._cellIndex;this._table=t._table}get isAnchor(){return this.row===this.cellAnchorRow&&this.column===this.cellAnchorColumn}get cellWidth(){return parseInt(this.cell.getAttribute("colspan")||1)}get cellHeight(){return parseInt(this.cell.getAttribute("rowspan")||1)}getPositionBefore(){const t=this._table.root.document.model;return t.createPositionAt(this._table.getChild(this.row),this._cellIndex)}}function Bz(t={}){return e=>e.on("insert:table",((e,n,o)=>{const i=n.item;if(!o.consumable.consume(i,"insert")){return}o.consumable.consume(i,"attribute:headingRows:table");o.consumable.consume(i,"attribute:headingColumns:table");const r=t&&t.asWidget;const s=o.writer.createContainerElement("figure",{class:"table"});const a=o.writer.createContainerElement("table");o.writer.insert(o.writer.createPositionAt(s,0),a);let c;if(r){c=Oz(s,o.writer)}const l=new Dz(i);const d={headingRows:i.getAttribute("headingRows")||0,headingColumns:i.getAttribute("headingColumns")||0};const u=new Map;for(const e of l){const{row:n,cell:r}=e;const s=i.getChild(n);const c=u.get(n)||Lz(a,s,n,d,o);u.set(n,c);o.consumable.consume(r,"insert");const l=o.writer.createPositionAt(c,"end");Vz(e,d,l,o,t)}for(const t of i.getChildren()){const e=t.index;if(!u.has(e)){u.set(e,Lz(a,t,e,d,o))}}const h=o.mapper.toViewPosition(n.range.start);o.mapper.bindElements(i,r?c:s);o.writer.insert(h,r?c:s)}))}function Tz(){return t=>t.on("insert:tableRow",((t,e,n)=>{const o=e.item;if(!n.consumable.consume(o,"insert")){return}const i=o.parent;const r=n.mapper.toViewElement(i);const s=Uz(r);const a=i.getChildIndex(o);const c=new Dz(i,{row:a});const l={headingRows:i.getAttribute("headingRows")||0,headingColumns:i.getAttribute("headingColumns")||0};const d=new Map;for(const t of c){const e=d.get(a)||Lz(s,o,a,l,n);d.set(a,e);n.consumable.consume(t.cell,"insert");const i=n.writer.createPositionAt(e,"end");Vz(t,l,i,n,{asWidget:true})}}))}function Pz(){return t=>t.on("insert:tableCell",((t,e,n)=>{const o=e.item;if(!n.consumable.consume(o,"insert")){return}const i=o.parent;const r=i.parent;const s=r.getChildIndex(i);const a=new Dz(r,{row:s});const c={headingRows:r.getAttribute("headingRows")||0,headingColumns:r.getAttribute("headingColumns")||0};for(const t of a){if(t.cell===o){const e=n.mapper.toViewElement(i);const r=n.writer.createPositionAt(e,i.getChildIndex(o));Vz(t,c,r,n,{asWidget:true});return}}}))}function Iz(){return t=>t.on("attribute:headingColumns:table",((t,e,n)=>{const o=e.item;if(!n.consumable.consume(e.item,t.name)){return}const i={headingRows:o.getAttribute("headingRows")||0,headingColumns:o.getAttribute("headingColumns")||0};const r=e.attributeOldValue;const s=e.attributeNewValue;const a=(r>s?r:s)-1;for(const t of new Dz(o,{endColumn:a})){Mz(t,i,n)}}))}function Rz(){return t=>t.on("remove:tableRow",((t,e,n)=>{t.stop();const o=n.writer;const i=n.mapper;const r=i.toViewPosition(e.position).getLastMatchingPosition((t=>!t.item.is("element","tr")));const s=r.nodeAfter;const a=s.parent;const c=a.parent;const l=o.createRangeOn(s);const d=o.remove(l);for(const t of o.createRangeIn(d).getItems()){i.unbindViewElement(t)}Gz("thead",c,n);Gz("tbody",c,n)}),{priority:"higher"})}function Fz(t,e){const{writer:n}=e;if(!t.parent.is("element","tableCell")){return}if(zz(t)){return n.createContainerElement("span",{style:"display:inline-block"})}else{return n.createContainerElement("p")}}function zz(t){const e=t.parent;const n=e.childCount===1;return n&&!$z(t)}function Oz(t,e){e.setCustomProperty("table",true,t);return fy(t,e,{hasSelectionHandle:true})}function Nz(t,e,n){const o=n.writer;const i=n.mapper.toViewElement(t);const r=o.createEditableElement(e,i.getAttributes());const s=wy(r,o);py(s,o,((t,e,n)=>n.addClass(Ca(e.classes),t)),((t,e,n)=>n.removeClass(Ca(e.classes),t)));o.insert(o.createPositionAfter(i),s);o.move(o.createRangeIn(i),o.createPositionAt(s,0));o.remove(o.createRangeOn(i));n.mapper.unbindViewElement(i);n.mapper.bindElements(t,s)}function Mz(t,e,n){const{cell:o}=t;const i=Hz(t,e);const r=n.mapper.toViewElement(o);if(r&&r.name!==i){Nz(o,i,n)}}function Vz(t,e,n,o,i){const r=i&&i.asWidget;const s=Hz(t,e);const a=r?wy(o.writer.createEditableElement(s),o.writer):o.writer.createContainerElement(s);if(r){py(a,o.writer,((t,e,n)=>n.addClass(Ca(e.classes),t)),((t,e,n)=>n.removeClass(Ca(e.classes),t)))}const c=t.cell;const l=c.getChild(0);const d=c.childCount===1&&l.name==="paragraph";o.writer.insert(n,a);o.mapper.bindElements(c,a);if(!r&&d&&!$z(l)){const t=c.getChild(0);o.consumable.consume(t,"insert");o.mapper.bindElements(t,a)}}function Lz(t,e,n,o,i){i.consumable.consume(e,"insert");const r=e.isEmpty?i.writer.createEmptyElement("tr"):i.writer.createContainerElement("tr");i.mapper.bindElements(e,r);const s=o.headingRows;const a=qz(Kz(n,o),t,i);const c=s>0&&n>=s?n-s:n;const l=i.writer.createPositionAt(a,c);i.writer.insert(l,r);return r}function Hz(t,e){const{row:n,column:o}=t;const{headingColumns:i,headingRows:r}=e;const s=r&&r>n;if(s){return"th"}const a=i&&i>o;return a?"th":"td"}function Kz(t,e){return t<e.headingRows?"thead":"tbody"}function qz(t,e,n){const o=jz(t,e);return o?o:Wz(t,e,n)}function jz(t,e){for(const n of e.getChildren()){if(n.name==t){return n}}}function Wz(t,e,n){const o=n.writer.createContainerElement(t);const i=n.writer.createPositionAt(e,t=="tbody"?"end":0);n.writer.insert(i,o);return o}function Gz(t,e,n){const o=jz(t,e);if(o&&o.childCount===0){n.writer.remove(n.writer.createRangeOn(o))}}function Uz(t){for(const e of t.getChildren()){if(e.name==="table"){return e}}}function $z(t){return!![...t.getAttributeKeys()].length}class Jz extends jn{refresh(){const t=this.editor.model;const e=t.document.selection;const n=t.schema;this.isEnabled=Yz(e,n)&&!Ay(e,n)}execute(t={}){const e=this.editor.model;const n=e.document.selection;const o=this.editor.plugins.get("TableUtils");const i=Cy(n,e);e.change((n=>{const r=o.createTable(n,t);e.insertContent(r,i);n.setSelection(n.createPositionAt(r.getNodeByPath([0,0,0]),0))}))}}function Yz(t,e){const n=t.getFirstPosition().parent;const o=n===n.root?n:n.parent;return e.checkChild(o,"table")}function Qz(t){const e=[];for(const n of oO(t.getRanges())){const t=n.getContainedElement();if(t&&t.is("element","tableCell")){e.push(t)}}return e}function Xz(t){const e=[];for(const n of t.getRanges()){const t=n.start.findAncestor("tableCell");if(t){e.push(t)}}return e}function Zz(t){const e=Qz(t);if(e.length){return e}return Xz(t)}function tO(t){const e=t.map((t=>t.parent.index));return iO(e)}function eO(t){const e=t[0].findAncestor("table");const n=[...new Dz(e)];const o=n.filter((e=>t.includes(e.cell))).map((t=>t.column));return iO(o)}function nO(t,e){if(t.length<2||!aO(t)){return false}const n=new Set;const o=new Set;let i=0;for(const r of t){const{row:t,column:s}=e.getCellLocation(r);const a=parseInt(r.getAttribute("rowspan")||1);const c=parseInt(r.getAttribute("colspan")||1);n.add(t);o.add(s);if(a>1){n.add(t+a-1)}if(c>1){o.add(s+c-1)}i+=a*c}const r=sO(n,o);return r==i}function oO(t){return Array.from(t).sort(rO)}function iO(t){const e=t.sort(((t,e)=>t-e));const n=e[0];const o=e[e.length-1];return{first:n,last:o}}function rO(t,e){const n=t.start;const o=e.start;return n.isBefore(o)?-1:1}function sO(t,e){const n=Array.from(t.values());const o=Array.from(e.values());const i=Math.max(...n);const r=Math.min(...n);const s=Math.max(...o);const a=Math.min(...o);return(i-r+1)*(s-a+1)}function aO(t){const e=t[0].findAncestor("table");const n=tO(t);const o=parseInt(e.getAttribute("headingRows")||0);if(!cO(n,o)){return false}const i=parseInt(e.getAttribute("headingColumns")||0);const r=eO(t);return cO(r,i)}function cO({first:t,last:e},n){const o=t<n;const i=e<n;return o===i}class lO extends jn{constructor(t,e={}){super(t);this.order=e.order||"below"}refresh(){const t=this.editor.model.document.selection;const e=t.getFirstPosition().findAncestor("table");this.isEnabled=!!e}execute(){const t=this.editor;const e=t.model.document.selection;const n=t.plugins.get("TableUtils");const o=this.order==="above";const i=Zz(e);const r=tO(i);const s=o?r.first:r.last;const a=i[0].findAncestor("table");n.insertRows(a,{at:o?s:s+1,copyStructureFromAbove:!o})}}class dO extends jn{constructor(t,e={}){super(t);this.order=e.order||"right"}refresh(){const t=this.editor.model.document.selection;const e=t.getFirstPosition().findAncestor("table");this.isEnabled=!!e}execute(){const t=this.editor;const e=t.model.document.selection;const n=t.plugins.get("TableUtils");const o=this.order==="left";const i=Zz(e);const r=eO(i);const s=o?r.first:r.last;const a=i[0].findAncestor("table");n.insertColumns(a,{columns:1,at:o?s:s+1})}}class uO extends jn{constructor(t,e={}){super(t);this.direction=e.direction||"horizontally"}refresh(){const t=Zz(this.editor.model.document.selection);this.isEnabled=t.length===1}execute(){const t=Zz(this.editor.model.document.selection)[0];const e=this.direction==="horizontally";const n=this.editor.plugins.get("TableUtils");if(e){n.splitCellHorizontally(t,2)}else{n.splitCellVertically(t,2)}}}function hO(t,e,n){const{startRow:o,startColumn:i,endRow:r,endColumn:s}=e;const a=n.createElement("table");const c=r-o+1;for(let t=0;t<c;t++){n.insertElement("tableRow",a,"end")}const l=[...new Dz(t,{startRow:o,endRow:r,startColumn:i,endColumn:s,includeAllSlots:true})];for(const{row:t,column:e,cell:c,isAnchor:d,cellAnchorRow:u,cellAnchorColumn:h}of l){const l=t-o;const f=a.getChild(l);if(!d){if(u<o||h<i){Cz(n,n.createPositionAt(f,"end"))}}else{const o=n.cloneElement(c);n.append(o,f);bO(o,t,e,r,s,n)}}kO(a,t,o,i,n);return a}function fO(t,e,n=0){const o=[];const i=new Dz(t,{startRow:n,endRow:e-1});for(const t of i){const{row:n,cellHeight:i}=t;const r=n+i-1;if(n<e&&e<=r){o.push(t)}}return o}function mO(t,e,n){const o=t.parent;const i=o.parent;const r=o.index;const s=parseInt(t.getAttribute("rowspan"));const a=e-r;const c={};const l=s-a;if(l>1){c.rowspan=l}const d=parseInt(t.getAttribute("colspan")||1);if(d>1){c.colspan=d}const u=r;const h=u+a;const f=[...new Dz(i,{startRow:u,endRow:h,includeAllSlots:true})];let m=null;let g;for(const e of f){const{row:o,column:i,cell:r}=e;if(r===t&&g===undefined){g=i}if(g!==undefined&&g===i&&o===h){m=Cz(n,e.getPositionBefore(),c)}}wz("rowspan",a,t,n);return m}function gO(t,e){const n=[];const o=new Dz(t);for(const t of o){const{column:o,cellWidth:i}=t;const r=o+i-1;if(o<e&&e<=r){n.push(t)}}return n}function pO(t,e,n,o){const i=parseInt(t.getAttribute("colspan"));const r=n-e;const s={};const a=i-r;if(a>1){s.colspan=a}const c=parseInt(t.getAttribute("rowspan")||1);if(c>1){s.rowspan=c}const l=Cz(o,o.createPositionAfter(t),s);wz("colspan",r,t,o);return l}function bO(t,e,n,o,i,r){const s=parseInt(t.getAttribute("colspan")||1);const a=parseInt(t.getAttribute("rowspan")||1);const c=n+s-1;if(c>i){const e=i-n+1;wz("colspan",e,t,r,1)}const l=e+a-1;if(l>o){const n=o-e+1;wz("rowspan",n,t,r,1)}}function kO(t,e,n,o,i){const r=parseInt(e.getAttribute("headingRows")||0);if(r>0){const e=r-n;wz("headingRows",e,t,i,0)}const s=parseInt(e.getAttribute("headingColumns")||0);if(s>0){const e=s-o;wz("headingColumns",e,t,i,0)}}function wO(t,e){const n=e.getColumns(t);const o=new Array(n).fill(0);for(const{column:e}of new Dz(t)){o[e]++}const i=o.reduce(((t,e,n)=>e?t:[...t,n]),[]);if(i.length>0){const n=i[i.length-1];e.removeColumns(t,{at:n});return true}return false}function CO(t,e){const n=[];for(let e=0;e<t.childCount;e++){const o=t.getChild(e);if(o.isEmpty){n.push(e)}}if(n.length>0){const o=n[n.length-1];e.removeRows(t,{at:o});return true}return false}function AO(t,e){const n=wO(t,e);if(!n){CO(t,e)}}function _O(t,e){const n=Array.from(new Dz(t,{startColumn:e.firstColumn,endColumn:e.lastColumn,row:e.lastRow}));const o=n.every((({cellHeight:t})=>t===1));if(o){return e.lastRow}const i=n[0].cellHeight-1;return e.lastRow+i}function vO(t,e){const n=Array.from(new Dz(t,{startRow:e.firstRow,endRow:e.lastRow,column:e.lastColumn}));const o=n.every((({cellWidth:t})=>t===1));if(o){return e.lastColumn}const i=n[0].cellWidth-1;return e.lastColumn+i}class yO extends jn{constructor(t,e){super(t);this.direction=e.direction;this.isHorizontal=this.direction=="right"||this.direction=="left"}refresh(){const t=this._getMergeableCell();this.value=t;this.isEnabled=!!t}execute(){const t=this.editor.model;const e=t.document;const n=Xz(e.selection)[0];const o=this.value;const i=this.direction;t.change((t=>{const e=i=="right"||i=="down";const r=e?n:o;const s=e?o:n;const a=s.parent;DO(s,r,t);const c=this.isHorizontal?"colspan":"rowspan";const l=parseInt(n.getAttribute(c)||1);const d=parseInt(o.getAttribute(c)||1);t.setAttribute(c,l+d,r);t.setSelection(t.createRangeIn(r));const u=this.editor.plugins.get("TableUtils");const h=a.findAncestor("table");AO(h,u)}))}_getMergeableCell(){const t=this.editor.model;const e=t.document;const n=Xz(e.selection)[0];if(!n){return}const o=this.editor.plugins.get("TableUtils");const i=this.isHorizontal?xO(n,this.direction,o):EO(n,this.direction);if(!i){return}const r=this.isHorizontal?"rowspan":"colspan";const s=parseInt(n.getAttribute(r)||1);const a=parseInt(i.getAttribute(r)||1);if(a===s){return i}}}function xO(t,e,n){const o=t.parent;const i=o.parent;const r=e=="right"?t.nextSibling:t.previousSibling;const s=(i.getAttribute("headingColumns")||0)>0;if(!r){return}const a=e=="right"?t:r;const c=e=="right"?r:t;const{column:l}=n.getCellLocation(a);const{column:d}=n.getCellLocation(c);const u=parseInt(a.getAttribute("colspan")||1);const h=Az(n,a,i);const f=Az(n,c,i);if(s&&h!=f){return}const m=l+u===d;return m?r:undefined}function EO(t,e){const n=t.parent;const o=n.parent;const i=o.getChildIndex(n);if(e=="down"&&i===o.childCount-1||e=="up"&&i===0){return}const r=parseInt(t.getAttribute("rowspan")||1);const s=o.getAttribute("headingRows")||0;const a=e=="down"&&i+r===s;const c=e=="up"&&i===s;if(s&&(a||c)){return}const l=parseInt(t.getAttribute("rowspan")||1);const d=e=="down"?i+l:i;const u=[...new Dz(o,{endRow:d})];const h=u.find((e=>e.cell===t));const f=h.column;const m=u.find((({row:t,cellHeight:n,column:o})=>{if(o!==f){return false}if(e=="down"){return t===d}else{return d===t+n}}));return m&&m.cell}function DO(t,e,n){if(!SO(t)){if(SO(e)){n.remove(n.createRangeIn(e))}n.move(n.createRangeIn(t),n.createPositionAt(e,"end"))}n.remove(t)}function SO(t){return t.childCount==1&&t.getChild(0).is("element","paragraph")&&t.getChild(0).isEmpty}class BO extends jn{refresh(){const t=Zz(this.editor.model.document.selection);const e=t[0];if(e){const n=e.findAncestor("table");const o=this.editor.plugins.get("TableUtils").getRows(n);const i=o-1;const r=tO(t);const s=r.first===0&&r.last===i;this.isEnabled=!s}else{this.isEnabled=false}}execute(){const t=this.editor.model;const e=Zz(t.document.selection);const n=tO(e);const o=e[0];const i=o.findAncestor("table");const r=this.editor.plugins.get("TableUtils").getCellLocation(o).column;t.change((t=>{const e=n.last-n.first+1;this.editor.plugins.get("TableUtils").removeRows(i,{at:n.first,rows:e});const o=TO(i,n.first,r);t.setSelection(t.createPositionAt(o,0))}))}}function TO(t,e,n){const o=t.getChild(e)||t.getChild(t.childCount-1);let i=o.getChild(0);let r=0;for(const t of o.getChildren()){if(r>n){return i}i=t;r+=parseInt(t.getAttribute("colspan")||1)}return i}class PO extends jn{refresh(){const t=Zz(this.editor.model.document.selection);const e=t[0];if(e){const n=e.findAncestor("table");const o=this.editor.plugins.get("TableUtils").getColumns(n);const{first:i,last:r}=eO(t);this.isEnabled=r-i<o-1}else{this.isEnabled=false}}execute(){const[t,e]=RO(this.editor.model.document.selection);const n=t.parent.parent;const o=[...new Dz(n)];const i={first:o.find((e=>e.cell===t)).column,last:o.find((t=>t.cell===e)).column};const r=IO(o,t,e,i);this.editor.model.change((t=>{const e=i.last-i.first+1;this.editor.plugins.get("TableUtils").removeColumns(n,{at:i.first,columns:e});t.setSelection(t.createPositionAt(r,0))}))}}function IO(t,e,n,o){const i=parseInt(n.getAttribute("colspan")||1);if(i>1){return n}else if(e.previousSibling||n.nextSibling){return n.nextSibling||e.previousSibling}else{if(o.first){return t.reverse().find((({column:t})=>t<o.first)).cell}else{return t.reverse().find((({column:t})=>t>o.last)).cell}}}function RO(t){const e=Zz(t);const n=e[0];const o=e.pop();const i=[n,o];return n.isBefore(o)?i:i.reverse()}class FO extends jn{refresh(){const t=this.editor.model;const e=Zz(t.document.selection);const n=e.length>0;this.isEnabled=n;this.value=n&&e.every((t=>this._isInHeading(t,t.parent.parent)))}execute(t={}){if(t.forceValue===this.value){return}const e=this.editor.model;const n=Zz(e.document.selection);const o=n[0].findAncestor("table");const{first:i,last:r}=tO(n);const s=this.value?i:r+1;const a=o.getAttribute("headingRows")||0;e.change((t=>{if(s){const e=s>a?a:0;const n=fO(o,s,e);for(const{cell:e}of n){mO(e,s,t)}}wz("headingRows",s,o,t,0)}))}_isInHeading(t,e){const n=parseInt(e.getAttribute("headingRows")||0);return!!n&&t.parent.index<n}}class zO extends jn{refresh(){const t=this.editor.model;const e=Zz(t.document.selection);const n=this.editor.plugins.get("TableUtils");const o=e.length>0;this.isEnabled=o;this.value=o&&e.every((t=>Az(n,t)))}execute(t={}){if(t.forceValue===this.value){return}const e=this.editor.model;const n=Zz(e.document.selection);const o=n[0].findAncestor("table");const{first:i,last:r}=eO(n);const s=this.value?i:r+1;e.change((t=>{if(s){const e=gO(o,s);for(const{cell:n,column:o}of e){pO(n,o,s,t)}}wz("headingColumns",s,o,t,0)}))}}class OO extends Kn{static get pluginName(){return"TableUtils"}init(){this.decorate("insertColumns");this.decorate("insertRows")}getCellLocation(t){const e=t.parent;const n=e.parent;const o=n.getChildIndex(e);const i=new Dz(n,{row:o});for(const{cell:e,row:n,column:o}of i){if(e===t){return{row:n,column:o}}}}createTable(t,e){const n=t.createElement("table");const o=parseInt(e.rows)||2;const i=parseInt(e.columns)||2;NO(t,n,0,o,i);if(e.headingRows){wz("headingRows",e.headingRows,n,t,0)}if(e.headingColumns){wz("headingColumns",e.headingColumns,n,t,0)}return n}insertRows(t,e={}){const n=this.editor.model;const o=e.at||0;const i=e.rows||1;const r=e.copyStructureFromAbove!==undefined;const s=e.copyStructureFromAbove?o-1:o;const a=this.getRows(t);const c=this.getColumns(t);n.change((e=>{const n=t.getAttribute("headingRows")||0;if(n>o){wz("headingRows",n+i,t,e,0)}if(!r&&(o===0||o===a)){NO(e,t,o,i,c);return}const l=r?Math.max(o,s):o;const d=new Dz(t,{endRow:l});const u=new Array(c).fill(1);for(const{row:t,column:n,cellHeight:a,cellWidth:c,cell:l}of d){const d=t+a-1;const h=t<o&&o<=d;const f=t<=s&&s<=d;if(h){e.setAttribute("rowspan",a+i,l);u[n]=-c}else if(r&&f){u[n]=c}}for(let n=0;n<i;n++){const n=e.createElement("tableRow");e.insert(n,t,o);for(let t=0;t<u.length;t++){const o=u[t];const i=e.createPositionAt(n,"end");if(o>0){Cz(e,i,o>1?{colspan:o}:null)}t+=Math.abs(o)-1}}}))}insertColumns(t,e={}){const n=this.editor.model;const o=e.at||0;const i=e.columns||1;n.change((e=>{const n=t.getAttribute("headingColumns");if(o<n){e.setAttribute("headingColumns",n+i,t)}const r=this.getColumns(t);if(o===0||r===o){for(const n of t.getChildren()){MO(i,e,e.createPositionAt(n,o?"end":0))}return}const s=new Dz(t,{column:o,includeAllSlots:true});for(const t of s){const{row:n,cell:r,cellAnchorColumn:a,cellAnchorRow:c,cellWidth:l,cellHeight:d}=t;if(a<o){e.setAttribute("colspan",l+i,r);const t=c+d-1;for(let e=n;e<=t;e++){s.skipRow(e)}}else{MO(i,e,t.getPositionBefore())}}}))}removeRows(t,e){const n=this.editor.model;const o=e.rows||1;const i=e.at;const r=i+o-1;n.change((e=>{const{cellsToMove:n,cellsToTrim:o}=KO(t,i,r);if(n.size){const o=r+1;qO(t,o,n,e)}for(let n=r;n>=i;n--){e.remove(t.getChild(n))}for(const{rowspan:t,cell:n}of o){wz("rowspan",t,n,e)}HO(t,i,r,e);if(!wO(t,this)){CO(t,this)}}))}removeColumns(t,e){const n=this.editor.model;const o=e.at;const i=e.columns||1;const r=e.at+i-1;n.change((e=>{LO(t,{first:o,last:r},e);for(let n=r;n>=o;n--){for(const{cell:o,column:i,cellWidth:r}of[...new Dz(t)]){if(i<=n&&r>1&&i+r>n){wz("colspan",r-1,o,e)}else if(i===n){e.remove(o)}}}if(!CO(t,this)){wO(t,this)}}))}splitCellVertically(t,e=2){const n=this.editor.model;const o=t.parent;const i=o.parent;const r=parseInt(t.getAttribute("rowspan")||1);const s=parseInt(t.getAttribute("colspan")||1);n.change((n=>{if(s>1){const{newCellsSpan:o,updatedSpan:i}=VO(s,e);wz("colspan",i,t,n);const a={};if(o>1){a.colspan=o}if(r>1){a.rowspan=r}const c=s>e?e-1:s-1;MO(c,n,n.createPositionAfter(t),a)}if(s<e){const o=e-s;const a=[...new Dz(i)];const{column:c}=a.find((({cell:e})=>e===t));const l=a.filter((({cell:e,cellWidth:n,column:o})=>{const i=e!==t&&o===c;const r=o<c&&o+n>c;return i||r}));for(const{cell:t,cellWidth:e}of l){n.setAttribute("colspan",e+o,t)}const d={};if(r>1){d.rowspan=r}MO(o,n,n.createPositionAfter(t),d);const u=i.getAttribute("headingColumns")||0;if(u>c){wz("headingColumns",u+o,i,n)}}}))}splitCellHorizontally(t,e=2){const n=this.editor.model;const o=t.parent;const i=o.parent;const r=i.getChildIndex(o);const s=parseInt(t.getAttribute("rowspan")||1);const a=parseInt(t.getAttribute("colspan")||1);n.change((n=>{if(s>1){const o=[...new Dz(i,{startRow:r,endRow:r+s-1,includeAllSlots:true})];const{newCellsSpan:c,updatedSpan:l}=VO(s,e);wz("rowspan",l,t,n);const{column:d}=o.find((({cell:e})=>e===t));const u={};if(c>1){u.rowspan=c}if(a>1){u.colspan=a}for(const t of o){const{column:e,row:o}=t;const i=o>=r+l;const s=e===d;const a=(o+r+l)%c===0;if(i&&s&&a){MO(1,n,t.getPositionBefore(),u)}}}if(s<e){const o=e-s;const c=[...new Dz(i,{startRow:0,endRow:r})];for(const{cell:e,cellHeight:i,row:s}of c){if(e!==t&&s+i>r){const t=i+o;n.setAttribute("rowspan",t,e)}}const l={};if(a>1){l.colspan=a}NO(n,i,r+1,o,1,l);const d=i.getAttribute("headingRows")||0;if(d>r){wz("headingRows",d+o,i,n)}}}))}getColumns(t){const e=t.getChild(0);return[...e.getChildren()].reduce(((t,e)=>{const n=parseInt(e.getAttribute("colspan")||1);return t+n}),0)}getRows(t){return t.childCount}}function NO(t,e,n,o,i,r={}){for(let s=0;s<o;s++){const o=t.createElement("tableRow");t.insert(o,e,n);MO(i,t,t.createPositionAt(o,"end"),r)}}function MO(t,e,n,o={}){for(let i=0;i<t;i++){Cz(e,n,o)}}function VO(t,e){if(t<e){return{newCellsSpan:1,updatedSpan:1}}const n=Math.floor(t/e);const o=t-n*e+n;return{newCellsSpan:n,updatedSpan:o}}function LO(t,e,n){const o=t.getAttribute("headingColumns")||0;if(o&&e.first<o){const i=Math.min(o-1,e.last)-e.first+1;n.setAttribute("headingColumns",o-i,t)}}function HO(t,e,n,o){const i=t.getAttribute("headingRows")||0;if(e<i){const r=n<i?i-(n-e+1):e;wz("headingRows",r,t,o,0)}}function KO(t,e,n){const o=new Map;const i=[];for(const{row:r,column:s,cellHeight:a,cell:c}of new Dz(t,{endRow:n})){const t=r+a-1;const l=r>=e&&r<=n&&t>n;if(l){const t=n-r+1;const e=a-t;o.set(s,{cell:c,rowspan:e})}const d=r<e&&t>=e;if(d){let o;if(t>=n){o=n-e+1}else{o=t-e+1}i.push({cell:c,rowspan:a-o})}}return{cellsToMove:o,cellsToTrim:i}}function qO(t,e,n,o){const i=new Dz(t,{includeAllSlots:true,row:e});const r=[...i];const s=t.getChild(e);let a;for(const{column:t,cell:e,isAnchor:i}of r){if(n.has(t)){const{cell:e,rowspan:i}=n.get(t);const r=a?o.createPositionAfter(a):o.createPositionAt(s,0);o.move(o.createRangeOn(e),r);wz("rowspan",i,e,o);a=e}else if(i){a=e}}}class jO extends jn{refresh(){const t=Qz(this.editor.model.document.selection);this.isEnabled=nO(t,this.editor.plugins.get(OO))}execute(){const t=this.editor.model;const e=this.editor.plugins.get(OO);t.change((n=>{const o=Qz(t.document.selection);const i=o.shift();const{mergeWidth:r,mergeHeight:s}=UO(i,o,e);wz("colspan",r,i,n);wz("rowspan",s,i,n);for(const t of o){WO(t,i,n)}const a=i.findAncestor("table");AO(a,e);n.setSelection(i,"in")}))}}function WO(t,e,n){if(!GO(t)){if(GO(e)){n.remove(n.createRangeIn(e))}n.move(n.createRangeIn(t),n.createPositionAt(e,"end"))}n.remove(t)}function GO(t){return t.childCount==1&&t.getChild(0).is("element","paragraph")&&t.getChild(0).isEmpty}function UO(t,e,n){let o=0;let i=0;for(const t of e){const{row:e,column:r}=n.getCellLocation(t);o=$O(t,r,o,"colspan");i=$O(t,e,i,"rowspan")}const{row:r,column:s}=n.getCellLocation(t);const a=o-s;const c=i-r;return{mergeWidth:a,mergeHeight:c}}function $O(t,e,n,o){const i=parseInt(t.getAttribute(o)||1);return Math.max(n,e+i)}class JO extends jn{refresh(){const t=Zz(this.editor.model.document.selection);this.isEnabled=t.length>0}execute(){const t=this.editor.model;const e=Zz(t.document.selection);const n=tO(e);const o=e[0].findAncestor("table");const i=[];for(let e=n.first;e<=n.last;e++){for(const n of o.getChild(e).getChildren()){i.push(t.createRangeOn(n))}}t.change((t=>{t.setSelection(i)}))}}class YO extends jn{refresh(){const t=Zz(this.editor.model.document.selection);this.isEnabled=t.length>0}execute(){const t=this.editor.model;const e=Zz(t.document.selection);const n=e[0];const o=e.pop();const i=n.findAncestor("table");const r=this.editor.plugins.get("TableUtils");const s=r.getCellLocation(n);const a=r.getCellLocation(o);const c=Math.min(s.column,a.column);const l=Math.max(s.column,a.column);const d=[];for(const e of new Dz(i,{startColumn:c,endColumn:l})){d.push(t.createRangeOn(e.cell))}t.change((t=>{t.setSelection(d)}))}}function QO(t){t.document.registerPostFixer((e=>XO(e,t)))}function XO(t,e){const n=e.document.differ.getChanges();let o=false;const i=new Set;for(const e of n){let n;if(e.name=="table"&&e.type=="insert"){n=e.position.nodeAfter}if(e.name=="tableRow"||e.name=="tableCell"){n=e.position.findAncestor("table")}if(oN(e)){n=e.range.start.findAncestor("table")}if(n&&!i.has(n)){o=ZO(n,t)||o;o=tN(n,t)||o;i.add(n)}}return o}function ZO(t,e){let n=false;const o=eN(t);if(o.length){n=true;for(const t of o){wz("rowspan",t.rowspan,t.cell,e,1)}}return n}function tN(t,e){let n=false;const o=nN(t);const i=[];for(const[t,e]of o.entries()){if(!e){i.push(t)}}if(i.length){n=true;for(const n of i.reverse()){e.remove(t.getChild(n));o.splice(n,1)}}const r=o[0];const s=o.every((t=>t===r));if(!s){const i=o.reduce(((t,e)=>e>t?e:t),0);for(const[r,s]of o.entries()){const o=i-s;if(o){for(let n=0;n<o;n++){Cz(e,e.createPositionAt(t.getChild(r),"end"))}n=true}}}return n}function eN(t){const e=parseInt(t.getAttribute("headingRows")||0);const n=t.childCount;const o=[];for(const{row:i,cell:r,cellHeight:s}of new Dz(t)){if(s<2){continue}const t=i<e;const a=t?e:n;if(i+s>a){const t=a-i;o.push({cell:r,rowspan:t})}}return o}function nN(t){const e=new Array(t.childCount).fill(0);for(const{row:n}of new Dz(t,{includeAllSlots:true})){e[n]++}return e}function oN(t){const e=t.type==="attribute";const n=t.attributeKey;return e&&(n==="headingRows"||n==="colspan"||n==="rowspan")}function iN(t){t.document.registerPostFixer((e=>rN(e,t)))}function rN(t,e){const n=e.document.differ.getChanges();let o=false;for(const e of n){if(e.type=="insert"&&e.name=="table"){o=sN(e.position.nodeAfter,t)||o}if(e.type=="insert"&&e.name=="tableRow"){o=aN(e.position.nodeAfter,t)||o}if(e.type=="insert"&&e.name=="tableCell"){o=cN(e.position.nodeAfter,t)||o}if(lN(e)){o=cN(e.position.parent,t)||o}}return o}function sN(t,e){let n=false;for(const o of t.getChildren()){n=aN(o,e)||n}return n}function aN(t,e){let n=false;for(const o of t.getChildren()){n=cN(o,e)||n}return n}function cN(t,e){if(t.childCount==0){e.insertElement("paragraph",t);return true}const n=Array.from(t.getChildren()).filter((t=>t.is("$text")));for(const t of n){e.wrap(e.createRangeOn(t),"paragraph")}return!!n.length}function lN(t){if(!t.position||!t.position.parent.is("element","tableCell")){return false}return t.type=="insert"&&t.name=="$text"||t.type=="remove"}function dN(t,e){t.document.registerPostFixer((()=>uN(t.document.differ,e)))}function uN(t,e){const n=new Set;for(const e of t.getChanges()){const t=e.type=="attribute"?e.range.start.parent:e.position.parent;if(t.is("element","tableCell")){n.add(t)}}for(const o of n.values()){for(const n of[...o.getChildren()].filter((t=>hN(t,e)))){t.refreshItem(n)}}return false}function hN(t,e){if(!t.is("element","paragraph")){return false}const n=e.toViewElement(t);if(!n){return false}return zz(t)!==n.is("element","span")}function fN(t){t.document.registerPostFixer((()=>mN(t)))}function mN(t){const e=t.document.differ;const n=new Set;for(const t of e.getChanges()){if(t.type!="attribute"){continue}const e=t.range.start.nodeAfter;if(e&&e.is("element","table")&&t.attributeKey=="headingRows"){n.add(e)}}if(n.size){for(const t of n.values()){e.refreshItem(t)}return true}return false}var gN=n(61);var pN={injectType:"singletonStyleTag",attributes:{"data-cke":true}};pN.insert="head";pN.singleton=true;var bN=wk()(gN["a"],pN);var kN=gN["a"].locals||{};class wN extends Kn{static get pluginName(){return"TableEditing"}init(){const t=this.editor;const e=t.model;const n=e.schema;const o=t.conversion;n.register("table",{allowWhere:"$block",allowAttributes:["headingRows","headingColumns"],isObject:true,isBlock:true});n.register("tableRow",{allowIn:"table",isLimit:true});n.register("tableCell",{allowIn:"tableRow",allowAttributes:["colspan","rowspan"],isLimit:true,isSelectable:true});n.extend("$block",{allowIn:"tableCell"});n.addChildCheck(((t,e)=>{if(e.name=="table"&&Array.from(t.getNames()).includes("table")){return false}}));o.for("upcast").add(_z());o.for("editingDowncast").add(Bz({asWidget:true}));o.for("dataDowncast").add(Bz());o.for("upcast").elementToElement({model:"tableRow",view:"tr"});o.for("upcast").add(vz());o.for("editingDowncast").add(Tz());o.for("editingDowncast").add(Rz());o.for("upcast").elementToElement({model:"tableCell",view:"td"});o.for("upcast").elementToElement({model:"tableCell",view:"th"});o.for("upcast").add(yz("td"));o.for("upcast").add(yz("th"));o.for("editingDowncast").add(Pz());t.conversion.for("editingDowncast").elementToElement({model:"paragraph",view:Fz,converterPriority:"high"});o.attributeToAttribute({model:"colspan",view:"colspan"});o.attributeToAttribute({model:"rowspan",view:"rowspan"});o.for("editingDowncast").add(Iz());t.commands.add("insertTable",new Jz(t));t.commands.add("insertTableRowAbove",new lO(t,{order:"above"}));t.commands.add("insertTableRowBelow",new lO(t,{order:"below"}));t.commands.add("insertTableColumnLeft",new dO(t,{order:"left"}));t.commands.add("insertTableColumnRight",new dO(t,{order:"right"}));t.commands.add("removeTableRow",new BO(t));t.commands.add("removeTableColumn",new PO(t));t.commands.add("splitTableCellVertically",new uO(t,{direction:"vertically"}));t.commands.add("splitTableCellHorizontally",new uO(t,{direction:"horizontally"}));t.commands.add("mergeTableCells",new jO(t));t.commands.add("mergeTableCellRight",new yO(t,{direction:"right"}));t.commands.add("mergeTableCellLeft",new yO(t,{direction:"left"}));t.commands.add("mergeTableCellDown",new yO(t,{direction:"down"}));t.commands.add("mergeTableCellUp",new yO(t,{direction:"up"}));t.commands.add("setTableColumnHeader",new zO(t));t.commands.add("setTableRowHeader",new FO(t));t.commands.add("selectTableRow",new JO(t));t.commands.add("selectTableColumn",new YO(t));fN(e);QO(e);dN(e,t.editing.mapper);iN(e)}static get requires(){return[OO]}}var CN=n(62);var AN={injectType:"singletonStyleTag",attributes:{"data-cke":true}};AN.insert="head";AN.singleton=true;var _N=wk()(CN["a"],AN);var vN=CN["a"].locals||{};class yN extends yk{constructor(t){super(t);const e=this.bindTemplate;this.items=this._createGridCollection();this.set("rows",0);this.set("columns",0);this.bind("label").to(this,"columns",this,"rows",((t,e)=>`${e} × ${t}`));this.setTemplate({tag:"div",attributes:{class:["ck"]},children:[{tag:"div",attributes:{class:["ck-insert-table-dropdown__grid"]},on:{"mouseover@.ck-insert-table-dropdown-grid-box":e.to("boxover")},children:this.items},{tag:"div",attributes:{class:["ck-insert-table-dropdown__label"]},children:[{text:e.to("label")}]}],on:{mousedown:e.to((t=>{t.preventDefault()})),click:e.to((()=>{this.fire("execute")}))}});this.on("boxover",((t,e)=>{const{row:n,column:o}=e.target.dataset;this.set({rows:parseInt(n),columns:parseInt(o)})}));this.on("change:columns",(()=>{this._highlightGridBoxes()}));this.on("change:rows",(()=>{this._highlightGridBoxes()}))}focus(){}focusLast(){}_highlightGridBoxes(){const t=this.rows;const e=this.columns;this.items.map(((n,o)=>{const i=Math.floor(o/10);const r=o%10;const s=i<t&&r<e;n.set("isOn",s)}))}_createGridCollection(){const t=[];for(let e=0;e<100;e++){const n=Math.floor(e/10);const o=e%10;t.push(new xN(this.locale,n+1,o+1))}return this.createCollection(t)}}class xN extends yk{constructor(t,e,n){super(t);const o=this.bindTemplate;this.set("isOn",false);this.setTemplate({tag:"div",attributes:{class:["ck-insert-table-dropdown-grid-box",o.if("isOn","ck-on")],"data-row":e,"data-column":n}})}}var EN='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 6v3h4V6H3zm0 4v3h4v-3H3zm0 4v3h4v-3H3zm5 3h4v-3H8v3zm5 0h4v-3h-4v3zm4-4v-3h-4v3h4zm0-4V6h-4v3h4zm1.5 8a1.5 1.5 0 0 1-1.5 1.5H3A1.5 1.5 0 0 1 1.5 17V4c.222-.863 1.068-1.5 2-1.5h13c.932 0 1.778.637 2 1.5v13zM12 13v-3H8v3h4zm0-4V6H8v3h4z"/></svg>';var DN='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1zM2 2v16h16V2H2z" opacity=".6"/><path d="M18 7v1H2V7h16zm0 5v1H2v-1h16z" opacity=".6"/><path d="M14 1v18a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V1a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1zm-2 1H8v4h4V2zm0 6H8v4h4V8zm0 6H8v4h4v-4z"/></svg>';var SN='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1zM2 2v16h16V2H2z" opacity=".6"/><path d="M7 2h1v16H7V2zm5 0h1v16h-1V2z" opacity=".6"/><path d="M1 6h18a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1zm1 2v4h4V8H2zm6 0v4h4V8H8zm6 0v4h4V8h-4z"/></svg>';var BN='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1zM2 2v16h16V2H2z" opacity=".6"/><path d="M7 2h1v16H7V2zm5 0h1v7h-1V2zm6 5v1H2V7h16zM8 12v1H2v-1h6z" opacity=".6"/><path d="M7 7h12a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1zm1 2v9h10V9H8z"/></svg>';class TN extends Kn{static get pluginName(){return"TableUI"}init(){const t=this.editor;const e=this.editor.t;const n=t.locale.contentLanguageDirection;const o=n==="ltr";t.ui.componentFactory.add("insertTable",(n=>{const o=t.commands.get("insertTable");const i=xC(n);i.bind("isEnabled").to(o);i.buttonView.set({icon:EN,label:e("Insert table"),tooltip:true});let r;i.on("change:isOpen",(()=>{if(r){return}r=new yN(n);i.panelView.children.add(r);r.delegate("execute").to(i);i.buttonView.on("open",(()=>{r.rows=0;r.columns=0}));i.on("execute",(()=>{t.execute("insertTable",{rows:r.rows,columns:r.columns});t.editing.view.focus()}))}));return i}));t.ui.componentFactory.add("tableColumn",(t=>{const n=[{type:"switchbutton",model:{commandName:"setTableColumnHeader",label:e("Header column"),bindIsOn:true}},{type:"separator"},{type:"button",model:{commandName:o?"insertTableColumnLeft":"insertTableColumnRight",label:e("Insert column left")}},{type:"button",model:{commandName:o?"insertTableColumnRight":"insertTableColumnLeft",label:e("Insert column right")}},{type:"button",model:{commandName:"removeTableColumn",label:e("Delete column")}},{type:"button",model:{commandName:"selectTableColumn",label:e("Select column")}}];return this._prepareDropdown(e("Column"),DN,n,t)}));t.ui.componentFactory.add("tableRow",(t=>{const n=[{type:"switchbutton",model:{commandName:"setTableRowHeader",label:e("Header row"),bindIsOn:true}},{type:"separator"},{type:"button",model:{commandName:"insertTableRowAbove",label:e("Insert row above")}},{type:"button",model:{commandName:"insertTableRowBelow",label:e("Insert row below")}},{type:"button",model:{commandName:"removeTableRow",label:e("Delete row")}},{type:"button",model:{commandName:"selectTableRow",label:e("Select row")}}];return this._prepareDropdown(e("Row"),SN,n,t)}));t.ui.componentFactory.add("mergeTableCells",(t=>{const n=[{type:"button",model:{commandName:"mergeTableCellUp",label:e("Merge cell up")}},{type:"button",model:{commandName:o?"mergeTableCellRight":"mergeTableCellLeft",label:e("Merge cell right")}},{type:"button",model:{commandName:"mergeTableCellDown",label:e("Merge cell down")}},{type:"button",model:{commandName:o?"mergeTableCellLeft":"mergeTableCellRight",label:e("Merge cell left")}},{type:"separator"},{type:"button",model:{commandName:"splitTableCellVertically",label:e("Split cell vertically")}},{type:"button",model:{commandName:"splitTableCellHorizontally",label:e("Split cell horizontally")}}];return this._prepareMergeSplitButtonDropdown(e("Merge cells"),BN,n,t)}))}_prepareDropdown(t,e,n,o){const i=this.editor;const r=xC(o);const s=this._fillDropdownWithListOptions(r,n);r.buttonView.set({label:t,icon:e,tooltip:true});r.bind("isEnabled").toMany(s,"isEnabled",((...t)=>t.some((t=>t))));this.listenTo(r,"execute",(t=>{i.execute(t.source.commandName);i.editing.view.focus()}));return r}_prepareMergeSplitButtonDropdown(t,e,n,o){const i=this.editor;const r=xC(o,Nw);const s="mergeTableCells";this._fillDropdownWithListOptions(r,n);r.buttonView.set({label:t,icon:e,tooltip:true,isEnabled:true});this.listenTo(r.buttonView,"execute",(()=>{i.execute(s);i.editing.view.focus()}));this.listenTo(r,"execute",(t=>{i.execute(t.source.commandName);i.editing.view.focus()}));return r}_fillDropdownWithListOptions(t,e){const n=this.editor;const o=[];const i=new ka;for(const t of e){PN(t,n,o,i)}DC(t,i,n.ui.componentFactory);return o}}function PN(t,e,n,o){const i=t.model=new dA(t.model);const{commandName:r,bindIsOn:s}=t.model;if(t.type==="button"||t.type==="switchbutton"){const t=e.commands.get(r);n.push(t);i.set({commandName:r});i.bind("isEnabled").to(t);if(s){i.bind("isOn").to(t,"value")}}i.set({withText:true});o.add(t)}var IN=n(63);var RN={injectType:"singletonStyleTag",attributes:{"data-cke":true}};RN.insert="head";RN.singleton=true;var FN=wk()(IN["a"],RN);var zN=IN["a"].locals||{};class ON extends Kn{static get pluginName(){return"TableSelection"}static get requires(){return[OO]}init(){const t=this.editor;const e=t.model;this.listenTo(e,"deleteContent",((t,e)=>this._handleDeleteContent(t,e)),{priority:"high"});this._defineSelectionConverter();this._enablePluginDisabling()}getSelectedTableCells(){const t=this.editor.model.document.selection;const e=Qz(t);if(e.length==0){return null}return e}getSelectionAsFragment(){const t=this.getSelectedTableCells();if(!t){return null}return this.editor.model.change((e=>{const n=e.createDocumentFragment();const o=this.editor.plugins.get("TableUtils");const{first:i,last:r}=eO(t);const{first:s,last:a}=tO(t);const c=t[0].findAncestor("table");let l=a;let d=r;if(nO(t,o)){const t={firstColumn:i,lastColumn:r,firstRow:s,lastRow:a};l=_O(c,t);d=vO(c,t)}const u={startRow:s,startColumn:i,endRow:l,endColumn:d};const h=hO(c,u,e);e.insert(h,n,0);return n}))}setCellSelection(t,e){const n=this._getCellsToSelect(t,e);this.editor.model.change((t=>{t.setSelection(n.cells.map((e=>t.createRangeOn(e))),{backward:n.backward})}))}getFocusCell(){const t=this.editor.model.document.selection;const e=[...t.getRanges()].pop();const n=e.getContainedElement();if(n&&n.is("element","tableCell")){return n}return null}getAnchorCell(){const t=this.editor.model.document.selection;const e=ff(t.getRanges());const n=e.getContainedElement();if(n&&n.is("element","tableCell")){return n}return null}_defineSelectionConverter(){const t=this.editor;const e=new Set;t.conversion.for("editingDowncast").add((t=>t.on("selection",((t,o,i)=>{const r=i.writer;n(r);const s=this.getSelectedTableCells();if(!s){return}for(const t of s){const n=i.mapper.toViewElement(t);r.addClass("ck-editor__editable_selected",n);e.add(n)}const a=i.mapper.toViewElement(s[s.length-1]);r.setSelection(a,0)}),{priority:"lowest"})));function n(t){for(const n of e){t.removeClass("ck-editor__editable_selected",n)}e.clear()}}_enablePluginDisabling(){const t=this.editor;this.on("change:isEnabled",(()=>{if(!this.isEnabled){const e=this.getSelectedTableCells();if(!e){return}t.model.change((n=>{const o=n.createPositionAt(e[0],0);const i=t.model.schema.getNearestSelectionRange(o);n.setSelection(i)}))}}))}_handleDeleteContent(t,e){const[n,o]=e;const i=this.editor.model;const r=!o||o.direction=="backward";const s=Qz(n);if(!s.length){return}t.stop();i.change((t=>{const e=s[r?s.length-1:0];i.change((t=>{for(const e of s){i.deleteContent(t.createSelection(e,"in"))}}));const o=i.schema.getNearestSelectionRange(t.createPositionAt(e,0));if(n.is("documentSelection")){t.setSelection(o)}else{n.setTo(o)}}))}_getCellsToSelect(t,e){const n=this.editor.plugins.get("TableUtils");const o=n.getCellLocation(t);const i=n.getCellLocation(e);const r=Math.min(o.row,i.row);const s=Math.max(o.row,i.row);const a=Math.min(o.column,i.column);const c=Math.max(o.column,i.column);const l=new Array(s-r+1).fill(null).map((()=>[]));const d={startRow:r,endRow:s,startColumn:a,endColumn:c};for(const{row:e,cell:n}of new Dz(t.findAncestor("table"),d)){l[e-r].push(n)}const u=i.row<o.row;const h=i.column<o.column;if(u){l.reverse()}if(h){l.forEach((t=>t.reverse()))}return{cells:l.flat(),backward:u||h}}}class NN extends Kn{static get pluginName(){return"TableClipboard"}static get requires(){return[ON,OO]}init(){const t=this.editor;const e=t.editing.view.document;this.listenTo(e,"copy",((t,e)=>this._onCopyCut(t,e)));this.listenTo(e,"cut",((t,e)=>this._onCopyCut(t,e)));this.listenTo(t.model,"insertContent",((t,e)=>this._onInsertContent(t,...e)),{priority:"high"});this.decorate("_replaceTableSlotCell")}_onCopyCut(t,e){const n=this.editor.plugins.get(ON);if(!n.getSelectedTableCells()){return}if(t.name=="cut"&&this.editor.isReadOnly){return}e.preventDefault();t.stop();const o=this.editor.data;const i=this.editor.editing.view.document;const r=o.toView(n.getSelectionAsFragment());i.fire("clipboardOutput",{dataTransfer:e.dataTransfer,content:r,method:t.name})}_onInsertContent(t,e,n){if(n&&!n.is("documentSelection")){return}const o=this.editor.model;const i=this.editor.plugins.get(OO);let r=MN(e,o);if(!r){return}const s=Zz(o.document.selection);if(!s.length){AO(r,i);return}t.stop();o.change((t=>{const e={width:i.getColumns(r),height:i.getRows(r)};const n=VN(s,e,t,i);const o=n.lastRow-n.firstRow+1;const a=n.lastColumn-n.firstColumn+1;const c={startRow:0,startColumn:0,endRow:Math.min(o,e.height)-1,endColumn:Math.min(a,e.width)-1};r=hO(r,c,t);const l=s[0].findAncestor("table");const d=this._replaceSelectedCellsWithPasted(r,e,l,n,t);if(this.editor.plugins.get("TableSelection").isEnabled){const e=oO(d.map((e=>t.createRangeOn(e))));t.setSelection(e)}else{t.setSelection(d[0],0)}}))}_replaceSelectedCellsWithPasted(t,e,n,o,i){const{width:r,height:s}=e;const a=HN(t,r,s);const c=[...new Dz(n,{startRow:o.firstRow,endRow:o.lastRow,startColumn:o.firstColumn,endColumn:o.lastColumn,includeAllSlots:true})];const l=[];let d;for(const t of c){const{row:e,column:n}=t;if(n===o.firstColumn){d=t.getPositionBefore()}const c=e-o.firstRow;const u=n-o.firstColumn;const h=a[c%s][u%r];const f=h?i.cloneElement(h):null;const m=this._replaceTableSlotCell(t,f,d,i);if(!m){continue}bO(m,e,n,o.lastRow,o.lastColumn,i);l.push(m);d=i.createPositionAfter(m)}const u=parseInt(n.getAttribute("headingRows")||0);const h=parseInt(n.getAttribute("headingColumns")||0);const f=o.firstRow<u&&u<=o.lastRow;const m=o.firstColumn<h&&h<=o.lastColumn;if(f){const t={first:o.firstColumn,last:o.lastColumn};const e=qN(n,u,t,i,o.firstRow);l.push(...e)}if(m){const t={first:o.firstRow,last:o.lastRow};const e=jN(n,h,t,i);l.push(...e)}return l}_replaceTableSlotCell(t,e,n,o){const{cell:i,isAnchor:r}=t;if(r){o.remove(i)}if(!e){return null}o.insert(e,n);return e}}function MN(t,e){if(!t.is("documentFragment")&&!t.is("element")){return null}if(t.is("element","table")){return t}if(t.childCount==1&&t.getChild(0).is("element","table")){return t.getChild(0)}const n=e.createRangeIn(t);for(const t of n.getItems()){if(t.is("element","table")){const o=e.createRange(n.start,e.createPositionBefore(t));if(e.hasContent(o,{ignoreWhitespaces:true})){return null}const i=e.createRange(e.createPositionAfter(t),n.end);if(e.hasContent(i,{ignoreWhitespaces:true})){return null}return t}}return null}function VN(t,e,n,o){const i=t[0].findAncestor("table");const r=eO(t);const s=tO(t);const a={firstColumn:r.first,lastColumn:r.last,firstRow:s.first,lastRow:s.last};const c=t.length===1;if(c){a.lastRow+=e.height-1;a.lastColumn+=e.width-1;LN(i,a.lastRow+1,a.lastColumn+1,o)}if(c||!nO(t,o)){KN(i,a,n)}else{a.lastRow=_O(i,a);a.lastColumn=vO(i,a)}return a}function LN(t,e,n,o){const i=o.getColumns(t);const r=o.getRows(t);if(n>i){o.insertColumns(t,{at:i,columns:n-i})}if(e>r){o.insertRows(t,{at:r,rows:e-r})}}function HN(t,e,n){const o=new Array(n).fill(null).map((()=>new Array(e).fill(null)));for(const{column:e,row:n,cell:i}of new Dz(t)){o[n][e]=i}return o}function KN(t,e,n){const{firstRow:o,lastRow:i,firstColumn:r,lastColumn:s}=e;const a={first:o,last:i};const c={first:r,last:s};jN(t,r,a,n);jN(t,s+1,a,n);qN(t,o,c,n);qN(t,i+1,c,n,o)}function qN(t,e,n,o,i=0){if(e<1){return}const r=fO(t,e,i);const s=r.filter((({column:t,cellWidth:e})=>WN(t,e,n)));return s.map((({cell:t})=>mO(t,e,o)))}function jN(t,e,n,o){if(e<1){return}const i=gO(t,e);const r=i.filter((({row:t,cellHeight:e})=>WN(t,e,n)));return r.map((({cell:t,column:n})=>pO(t,n,e,o)))}function WN(t,e,n){const o=t+e-1;const{first:i,last:r}=n;const s=t>=i&&t<=r;const a=t<i&&o>=i;return s||a}class GN extends Kn{static get pluginName(){return"TableKeyboard"}static get requires(){return[ON]}init(){const t=this.editor.editing.view;const e=t.document;this.editor.keystrokes.set("Tab",((...t)=>this._handleTabOnSelectedTable(...t)),{priority:"low"});this.editor.keystrokes.set("Tab",this._getTabHandler(true),{priority:"low"});this.editor.keystrokes.set("Shift+Tab",this._getTabHandler(false),{priority:"low"});this.listenTo(e,"arrowKey",((...t)=>this._onArrowKey(...t)),{context:"table"})}_handleTabOnSelectedTable(t,e){const n=this.editor;const o=n.model.document.selection;const i=o.getSelectedElement();if(!i||!i.is("element","table")){return}e();n.model.change((t=>{t.setSelection(t.createRangeIn(i.getChild(0).getChild(0)))}))}_getTabHandler(t){const e=this.editor;return(n,o)=>{const i=e.model.document.selection;let r=Xz(i)[0];if(!r){r=this.editor.plugins.get("TableSelection").getFocusCell()}if(!r){return}o();const s=r.parent;const a=s.parent;const c=a.getChildIndex(s);const l=s.getChildIndex(r);const d=l===0;if(!t&&d&&c===0){e.model.change((t=>{t.setSelection(t.createRangeOn(a))}));return}const u=l===s.childCount-1;const h=c===a.childCount-1;if(t&&h&&u){e.execute("insertTableRowBelow");if(c===a.childCount-1){e.model.change((t=>{t.setSelection(t.createRangeOn(a))}));return}}let f;if(t&&u){const t=a.getChild(c+1);f=t.getChild(0)}else if(!t&&d){const t=a.getChild(c-1);f=t.getChild(t.childCount-1)}else{f=s.getChild(l+(t?1:-1))}e.model.change((t=>{t.setSelection(t.createRangeIn(f))}))}}_onArrowKey(t,e){const n=this.editor;const o=e.keyCode;const i=sd(o,n.locale.contentLanguageDirection);const r=this._handleArrowKeys(i,e.shiftKey);if(r){e.preventDefault();e.stopPropagation();t.stop()}}_handleArrowKeys(t,e){const n=this.editor.model;const o=n.document.selection;const i=["right","down"].includes(t);const r=Qz(o);if(r.length){let n;if(e){n=this.editor.plugins.get("TableSelection").getFocusCell()}else{n=i?r[r.length-1]:r[0]}this._navigateFromCellInDirection(n,t,e);return true}const s=o.focus.findAncestor("tableCell");if(!s){return false}if(e&&!o.isCollapsed&&o.isBackward==i){return false}if(this._isSelectionAtCellEdge(o,s,i)){this._navigateFromCellInDirection(s,t,e);return true}return false}_isSelectionAtCellEdge(t,e,n){const o=this.editor.model;const i=this.editor.model.schema;const r=n?t.getLastPosition():t.getFirstPosition();if(!i.getLimitElement(r).is("element","tableCell")){const t=o.createPositionAt(e,n?"end":0);return t.isTouching(r)}const s=o.createSelection(r);o.modifySelection(s,{direction:n?"forward":"backward"});return r.isEqual(s.focus)}_navigateFromCellInDirection(t,e,n=false){const o=this.editor.model;const i=t.findAncestor("table");const r=[...new Dz(i,{includeAllSlots:true})];const{row:s,column:a}=r[r.length-1];const c=r.find((({cell:e})=>e==t));let{row:l,column:d}=c;switch(e){case"left":d--;break;case"up":l--;break;case"right":d+=c.cellWidth;break;case"down":l+=c.cellHeight;break}const u=l<0||l>s;const h=d<0&&l<=0;const f=d>a&&l>=s;if(u||h||f){o.change((t=>{t.setSelection(t.createRangeOn(i))}));return}if(d<0){d=n?0:a;l--}else if(d>a){d=n?a:0;l++}const m=r.find((t=>t.row==l&&t.column==d)).cell;const g=["right","down"].includes(e);const p=this.editor.plugins.get("TableSelection");if(n&&p.isEnabled){const e=p.getAnchorCell()||t;p.setCellSelection(e,m)}else{const t=o.createPositionAt(m,g?0:"end");o.change((e=>{e.setSelection(t)}))}}}class UN extends _h{constructor(t){super(t);this.domEventType=["mousemove","mouseleave"]}onDomEvent(t){this.fire(t.type,t)}}class $N extends Kn{static get pluginName(){return"TableMouse"}static get requires(){return[ON]}init(){const t=this.editor;t.editing.view.addObserver(UN);this._enableShiftClickSelection();this._enableMouseDragSelection()}_enableShiftClickSelection(){const t=this.editor;let e=false;const n=t.plugins.get(ON);this.listenTo(t.editing.view.document,"mousedown",((o,i)=>{if(!this.isEnabled||!n.isEnabled){return}if(!i.domEvent.shiftKey){return}const r=n.getAnchorCell()||Xz(t.model.document.selection)[0];if(!r){return}const s=this._getModelTableCellFromDomEvent(i);if(s&&JN(r,s)){e=true;n.setCellSelection(r,s);i.preventDefault()}}));this.listenTo(t.editing.view.document,"mouseup",(()=>{e=false}));this.listenTo(t.editing.view.document,"selectionChange",(t=>{if(e){t.stop()}}),{priority:"highest"})}_enableMouseDragSelection(){const t=this.editor;let e,n;let o=false;let i=false;const r=t.plugins.get(ON);this.listenTo(t.editing.view.document,"mousedown",((t,n)=>{if(!this.isEnabled||!r.isEnabled){return}if(n.domEvent.shiftKey||n.domEvent.ctrlKey||n.domEvent.altKey){return}e=this._getModelTableCellFromDomEvent(n)}));this.listenTo(t.editing.view.document,"mousemove",((t,s)=>{if(!s.domEvent.buttons){return}if(!e){return}const a=this._getModelTableCellFromDomEvent(s);if(a&&JN(e,a)){n=a;if(!o&&n!=e){o=true}}if(!o){return}i=true;r.setCellSelection(e,n);s.preventDefault()}));this.listenTo(t.editing.view.document,"mouseup",(()=>{o=false;i=false;e=null;n=null}));this.listenTo(t.editing.view.document,"selectionChange",(t=>{if(i){t.stop()}}),{priority:"highest"})}_getModelTableCellFromDomEvent(t){const e=t.target;const n=this.editor.editing.view.createPositionAt(e,0);const o=this.editor.editing.mapper.toModelPosition(n);const i=o.parent;return i.findAncestor("tableCell",{includeSelf:true})}}function JN(t,e){return t.parent.parent==e.parent.parent}var YN=n(64);var QN={injectType:"singletonStyleTag",attributes:{"data-cke":true}};QN.insert="head";QN.singleton=true;var XN=wk()(YN["a"],QN);var ZN=YN["a"].locals||{};class tM extends Kn{static get requires(){return[wN,TN,ON,$N,GN,NN,ix]}static get pluginName(){return"Table"}}function eM(t,e,n,o){t.for("upcast").attributeToAttribute({view:{styles:{[o]:/[\s\S]+/}},model:{name:e,key:n,value:t=>t.getNormalizedStyle(o)}})}function nM(t,e){t.for("upcast").add((t=>t.on("element:"+e,((t,e,n)=>{if(!e.modelRange){return}const o=["border-top","border-right","border-bottom","border-left"].filter((t=>e.viewItem.hasStyle(t)));if(!o.length){return}const i={styles:o};if(!n.consumable.test(e.viewItem,i)){return}const r=[...e.modelRange.getItems({shallow:true})].pop();n.consumable.consume(e.viewItem,i);n.writer.setAttribute("borderStyle",e.viewItem.getNormalizedStyle("border-style"),r);n.writer.setAttribute("borderColor",e.viewItem.getNormalizedStyle("border-color"),r);n.writer.setAttribute("borderWidth",e.viewItem.getNormalizedStyle("border-width"),r)}))))}function oM(t,e,n,o){t.for("downcast").attributeToAttribute({model:{name:e,key:n},view:t=>({key:"style",value:{[o]:t}})})}function iM(t,e,n){t.for("downcast").add((t=>t.on(`attribute:${e}:table`,((t,e,o)=>{const{item:i,attributeNewValue:r}=e;const{mapper:s,writer:a}=o;if(!o.consumable.consume(e.item,t.name)){return}const c=[...s.toViewElement(i).getChildren()].find((t=>t.is("element","table")));if(r){a.setStyle(n,r,c)}else{a.removeStyle(n,c)}}))))}class rM extends jn{constructor(t,e){super(t);this.attributeName=e}refresh(){const t=this.editor;const e=t.model.document.selection;const n=e.getFirstPosition().findAncestor("table");this.isEnabled=!!n;this.value=this._getValue(n)}execute(t={}){const e=this.editor.model;const n=e.document.selection;const{value:o,batch:i}=t;const r=n.getFirstPosition().findAncestor("table");const s=this._getValueToSet(o);e.enqueueChange(i||"default",(t=>{if(s){t.setAttribute(this.attributeName,s,r)}else{t.removeAttribute(this.attributeName,r)}}))}_getValue(t){if(!t){return}return t.getAttribute(this.attributeName)}_getValueToSet(t){return t}}class sM extends rM{constructor(t){super(t,"backgroundColor")}}function aM(t){if(!t||!S(t)){return t}const{top:e,right:n,bottom:o,left:i}=t;if(e==n&&n==o&&o==i){return e}}function cM(t,e){const n=parseFloat(t);if(Number.isNaN(n)){return t}if(String(n)!==String(t)){return t}return`${n}${e}`}class lM extends rM{constructor(t){super(t,"borderColor")}_getValue(t){if(!t){return}return aM(t.getAttribute(this.attributeName))}}class dM extends rM{constructor(t){super(t,"borderStyle")}_getValue(t){if(!t){return}return aM(t.getAttribute(this.attributeName))}}class uM extends rM{constructor(t){super(t,"borderWidth")}_getValue(t){if(!t){return}return aM(t.getAttribute(this.attributeName))}_getValueToSet(t){return cM(t,"px")}}class hM extends rM{constructor(t){super(t,"width")}_getValueToSet(t){return cM(t,"px")}}class fM extends rM{constructor(t){super(t,"height")}_getValueToSet(t){return cM(t,"px")}}class mM extends rM{constructor(t){super(t,"alignment")}}const gM=/^(left|right)$/;class pM extends Kn{static get pluginName(){return"TablePropertiesEditing"}static get requires(){return[wN]}init(){const t=this.editor;const e=t.model.schema;const n=t.conversion;t.data.addStyleProcessorRules(ov);bM(e,n);t.commands.add("tableBorderColor",new lM(t));t.commands.add("tableBorderStyle",new dM(t));t.commands.add("tableBorderWidth",new uM(t));kM(e,n);t.commands.add("tableAlignment",new mM(t));CM(e,n,"width","width");t.commands.add("tableWidth",new hM(t));CM(e,n,"height","height");t.commands.add("tableHeight",new fM(t));t.data.addStyleProcessorRules(ev);wM(e,n,"backgroundColor","background-color");t.commands.add("tableBackgroundColor",new sM(t))}}function bM(t,e){t.extend("table",{allowAttributes:["borderWidth","borderColor","borderStyle"]});nM(e,"table");iM(e,"borderColor","border-color");iM(e,"borderStyle","border-style");iM(e,"borderWidth","border-width")}function kM(t,e){t.extend("table",{allowAttributes:["alignment"]});e.attributeToAttribute({model:{name:"table",key:"alignment",values:["left","right"]},view:{left:{key:"style",value:{float:"left"}},right:{key:"style",value:{float:"right"}}},converterPriority:"high"});e.for("upcast").attributeToAttribute({view:{attributes:{align:gM}},model:{name:"table",key:"alignment",value:t=>t.getAttribute("align")}})}function wM(t,e,n,o){t.extend("table",{allowAttributes:[n]});eM(e,"table",n,o);iM(e,n,o)}function CM(t,e,n,o){t.extend("table",{allowAttributes:[n]});eM(e,"table",n,o);oM(e,"table",n,o)}var AM=n(65);var _M={injectType:"singletonStyleTag",attributes:{"data-cke":true}};_M.insert="head";_M.singleton=true;var vM=wk()(AM["a"],_M);var yM=AM["a"].locals||{};class xM extends yk{constructor(t,e){super(t);const n=this.bindTemplate;this.set("value","");this.set("id");this.set("isReadOnly",false);this.set("hasError",false);this.set("isFocused",false);this.set("isEmpty",true);this.set("ariaDescribedById");this.options=e;this._dropdownView=this._createDropdownView(t);this._inputView=this._createInputTextView(t);this._stillTyping=false;this.setTemplate({tag:"div",attributes:{class:["ck","ck-input-color",n.if("hasError","ck-error")],id:n.to("id"),"aria-invalid":n.if("hasError",true),"aria-describedby":n.to("ariaDescribedById")},children:[this._dropdownView,this._inputView]});this.on("change:value",((t,e,n)=>this._setInputValue(n)))}focus(){this._inputView.focus()}_createDropdownView(){const t=this.locale;const e=t.t;const n=this.bindTemplate;const o=this._createColorGrid(t);const i=xC(t);const r=new yk;const s=this._createRemoveColorButton(t);r.setTemplate({tag:"span",attributes:{class:["ck","ck-input-color__button__preview"],style:{backgroundColor:n.to("value")}},children:[{tag:"span",attributes:{class:["ck","ck-input-color__button__preview__no-color-indicator",n.if("value","ck-hidden",(t=>t!=""))]}}]});i.buttonView.extendTemplate({attributes:{class:"ck-input-color__button"}});i.buttonView.children.add(r);i.buttonView.tooltip=e("Color picker");i.panelPosition=t.uiLanguageDirection==="rtl"?"se":"sw";i.panelView.children.add(s);i.panelView.children.add(o);i.bind("isEnabled").to(this,"isReadOnly",(t=>!t));return i}_createInputTextView(){const t=this.locale;const e=new tA(t);e.extendTemplate({on:{blur:e.bindTemplate.to("blur")}});e.value=this.value;e.bind("isReadOnly","hasError").to(this);this.bind("isFocused","isEmpty").to(e);e.on("input",(()=>{const t=e.element.value;const n=this.options.colorDefinitions.find((e=>t===e.label));this._stillTyping=true;this.value=n&&n.color||t}));e.on("blur",(()=>{this._stillTyping=false;this._setInputValue(e.element.value)}));e.delegate("input").to(this);return e}_createRemoveColorButton(){const t=this.locale;const e=t.t;const n=new fw(t);n.class="ck-input-color__remove-color";n.withText=true;n.icon=hk.eraser;n.label=e("Remove color");n.on("execute",(()=>{this.value="";this._dropdownView.isOpen=false;this.fire("input")}));return n}_createColorGrid(t){const e=new Tw(t,{colorDefinitions:this.options.colorDefinitions,columns:this.options.columns});e.on("execute",((t,e)=>{this.value=e.value;this._dropdownView.isOpen=false;this.fire("input")}));e.bind("selectedColor").to(this,"value");return e}_setInputValue(t){if(!this._stillTyping){const e=EM(t);const n=this.options.colorDefinitions.find((t=>e===EM(t.color)));if(n){this._inputView.value=n.label}else{this._inputView.value=t||""}}}}function EM(t){return t.replace(/([(,])\s+/g,"$1").replace(/^\s+|\s+(?=[),\s]|$)/g,"").replace(/,|\s/g," ")}const DM=t=>t==="";function SM(t){return{none:t("None"),solid:t("Solid"),dotted:t("Dotted"),dashed:t("Dashed"),double:t("Double"),groove:t("Groove"),ridge:t("Ridge"),inset:t("Inset"),outset:t("Outset")}}function BM(t){return t('The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".')}function TM(t){return t('The value is invalid. Try "10px" or "2em" or simply "2".')}function PM(t){t=t.trim();return DM(t)||z_(t)}function IM(t){t=t.trim();return DM(t)||MM(t)||V_(t)||H_(t)}function RM(t){t=t.trim();return DM(t)||MM(t)||V_(t)}function FM(t){const e=new ka;const n=SM(t.t);for(const o in n){const i={type:"button",model:new dA({_borderStyleValue:o==="none"?"":o,label:n[o],withText:true})};if(o==="none"){i.model.bind("isOn").to(t,"borderStyle",(t=>!t))}else{i.model.bind("isOn").to(t,"borderStyle",(t=>t===o))}e.add(i)}return e}function zM({view:t,icons:e,toolbar:n,labels:o,propertyName:i,nameToValue:r}){for(const s in o){const a=new fw(t.locale);a.set({label:o[s],icon:e[s],tooltip:o[s]});a.bind("isOn").to(t,i,(t=>t===r(s)));a.on("execute",(()=>{t[i]=r(s)}));n.items.add(a)}}const OM=[{color:"hsl(0, 0%, 0%)",label:"Black"},{color:"hsl(0, 0%, 30%)",label:"Dim grey"},{color:"hsl(0, 0%, 60%)",label:"Grey"},{color:"hsl(0, 0%, 90%)",label:"Light grey"},{color:"hsl(0, 0%, 100%)",label:"White",hasBorder:true},{color:"hsl(0, 75%, 60%)",label:"Red"},{color:"hsl(30, 75%, 60%)",label:"Orange"},{color:"hsl(60, 75%, 60%)",label:"Yellow"},{color:"hsl(90, 75%, 60%)",label:"Light green"},{color:"hsl(120, 75%, 60%)",label:"Green"},{color:"hsl(150, 75%, 60%)",label:"Aquamarine"},{color:"hsl(180, 75%, 60%)",label:"Turquoise"},{color:"hsl(210, 75%, 60%)",label:"Light blue"},{color:"hsl(240, 75%, 60%)",label:"Blue"},{color:"hsl(270, 75%, 60%)",label:"Purple"}];function NM(t){return(e,n,o)=>{const i=new xM(e.locale,{colorDefinitions:VM(t.colorConfig),columns:t.columns});i.set({id:n,ariaDescribedById:o});i.bind("isReadOnly").to(e,"isEnabled",(t=>!t));i.bind("hasError").to(e,"errorText",(t=>!!t));i.on("input",(()=>{e.errorText=null}));e.bind("isEmpty","isFocused").to(i);return i}}function MM(t){const e=parseFloat(t);return!Number.isNaN(e)&&t===String(e)}function VM(t){return t.map((t=>({color:t.model,label:t.label,options:{hasBorder:t.hasBorder}})))}var LM=n(66);var HM={injectType:"singletonStyleTag",attributes:{"data-cke":true}};HM.insert="head";HM.singleton=true;var KM=wk()(LM["a"],HM);var qM=LM["a"].locals||{};class jM extends yk{constructor(t,e={}){super(t);const n=this.bindTemplate;this.set("class",e.class||null);this.children=this.createCollection();if(e.children){e.children.forEach((t=>this.children.add(t)))}this.set("_role",null);this.set("_ariaLabelledBy",null);if(e.labelView){this.set({_role:"group",_ariaLabelledBy:e.labelView.id})}this.setTemplate({tag:"div",attributes:{class:["ck","ck-form__row",n.to("class")],role:n.to("_role"),"aria-labelledby":n.to("_ariaLabelledBy")},children:this.children})}}var WM=n(67);var GM={injectType:"singletonStyleTag",attributes:{"data-cke":true}};GM.insert="head";GM.singleton=true;var UM=wk()(WM["a"],GM);var $M=WM["a"].locals||{};var JM=n(68);var YM={injectType:"singletonStyleTag",attributes:{"data-cke":true}};YM.insert="head";YM.singleton=true;var QM=wk()(JM["a"],YM);var XM=JM["a"].locals||{};var ZM=n(69);var tV={injectType:"singletonStyleTag",attributes:{"data-cke":true}};tV.insert="head";tV.singleton=true;var eV=wk()(ZM["a"],tV);var nV=ZM["a"].locals||{};const oV={left:hk.objectLeft,center:hk.objectCenter,right:hk.objectRight};class iV extends yk{constructor(t,e){super(t);this.set({borderStyle:"",borderWidth:"",borderColor:"",backgroundColor:"",width:"",height:"",alignment:""});this.options=e;const{borderStyleDropdown:n,borderWidthInput:o,borderColorInput:i,borderRowLabel:r}=this._createBorderFields();const{backgroundRowLabel:s,backgroundInput:a}=this._createBackgroundFields();const{widthInput:c,operatorLabel:l,heightInput:d,dimensionsLabel:u}=this._createDimensionFields();const{alignmentToolbar:h,alignmentLabel:f}=this._createAlignmentFields();this.focusTracker=new mf;this.keystrokes=new gf;this.children=this.createCollection();this.borderStyleDropdown=n;this.borderWidthInput=o;this.borderColorInput=i;this.backgroundInput=a;this.widthInput=c;this.heightInput=d;this.alignmentToolbar=h;const{saveButtonView:m,cancelButtonView:g}=this._createActionButtons();this.saveButtonView=m;this.cancelButtonView=g;this._focusables=new pk;this._focusCycler=new yw({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});this.children.add(new JC(t,{label:this.t("Table properties")}));this.children.add(new jM(t,{labelView:r,children:[r,n,i,o],class:"ck-table-form__border-row"}));this.children.add(new jM(t,{labelView:s,children:[s,a],class:"ck-table-form__background-row"}));this.children.add(new jM(t,{children:[new jM(t,{labelView:u,children:[u,c,l,d],class:"ck-table-form__dimensions-row"}),new jM(t,{labelView:f,children:[f,h],class:"ck-table-properties-form__alignment-row"})]}));this.children.add(new jM(t,{children:[this.saveButtonView,this.cancelButtonView],class:"ck-table-form__action-row"}));this.setTemplate({tag:"form",attributes:{class:["ck","ck-form","ck-table-form","ck-table-properties-form"],tabindex:"-1"},children:this.children})}render(){super.render();gk({view:this});[this.borderStyleDropdown,this.borderColorInput,this.borderWidthInput,this.backgroundInput,this.widthInput,this.heightInput,this.alignmentToolbar,this.saveButtonView,this.cancelButtonView].forEach((t=>{this._focusables.add(t);this.focusTracker.add(t.element)}));this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}_createBorderFields(){const t=NM({colorConfig:this.options.borderColors,columns:5});const e=this.locale;const n=this.t;const o=new HC(e);o.text=n("Border");const i=SM(this.t);const r=new sA(e,cA);r.set({label:n("Style"),class:"ck-table-form__border-style"});r.fieldView.buttonView.set({isOn:false,withText:true,tooltip:n("Style")});r.fieldView.buttonView.bind("label").to(this,"borderStyle",(t=>i[t?t:"none"]));r.fieldView.on("execute",(t=>{this.borderStyle=t.source._borderStyleValue}));r.bind("isEmpty").to(this,"borderStyle",(t=>!t));DC(r.fieldView,FM(this));const s=new sA(e,aA);s.set({label:n("Width"),class:"ck-table-form__border-width"});s.fieldView.bind("value").to(this,"borderWidth");s.bind("isEnabled").to(this,"borderStyle",rV);s.fieldView.on("input",(()=>{this.borderWidth=s.fieldView.element.value}));const a=new sA(e,t);a.set({label:n("Color"),class:"ck-table-form__border-color"});a.fieldView.bind("value").to(this,"borderColor");a.bind("isEnabled").to(this,"borderStyle",rV);a.fieldView.on("input",(()=>{this.borderColor=a.fieldView.value}));this.on("change:borderStyle",((t,e,n)=>{if(!rV(n)){this.borderColor="";this.borderWidth=""}}));return{borderRowLabel:o,borderStyleDropdown:r,borderColorInput:a,borderWidthInput:s}}_createBackgroundFields(){const t=this.locale;const e=this.t;const n=new HC(t);n.text=e("Background");const o=NM({colorConfig:this.options.backgroundColors,columns:5});const i=new sA(t,o);i.set({label:e("Color"),class:"ck-table-properties-form__background"});i.fieldView.bind("value").to(this,"backgroundColor");i.fieldView.on("input",(()=>{this.backgroundColor=i.fieldView.value}));return{backgroundRowLabel:n,backgroundInput:i}}_createDimensionFields(){const t=this.locale;const e=this.t;const n=new HC(t);n.text=e("Dimensions");const o=new sA(t,aA);o.set({label:e("Width"),class:"ck-table-form__dimensions-row__width"});o.fieldView.bind("value").to(this,"width");o.fieldView.on("input",(()=>{this.width=o.fieldView.element.value}));const i=new yk(t);i.setTemplate({tag:"span",attributes:{class:["ck-table-form__dimension-operator"]},children:[{text:"×"}]});const r=new sA(t,aA);r.set({label:e("Height"),class:"ck-table-form__dimensions-row__height"});r.fieldView.bind("value").to(this,"height");r.fieldView.on("input",(()=>{this.height=r.fieldView.element.value}));return{dimensionsLabel:n,widthInput:o,operatorLabel:i,heightInput:r}}_createAlignmentFields(){const t=this.locale;const e=this.t;const n=new HC(t);n.text=e("Alignment");const o=new sC(t);o.set({isCompact:true,ariaLabel:e("Table alignment toolbar")});zM({view:this,icons:oV,toolbar:o,labels:this._alignmentLabels,propertyName:"alignment",nameToValue:t=>t==="center"?"":t});return{alignmentLabel:n,alignmentToolbar:o}}_createActionButtons(){const t=this.locale;const e=this.t;const n=new fw(t);const o=new fw(t);const i=[this.borderWidthInput,this.borderColorInput,this.backgroundInput,this.widthInput,this.heightInput];n.set({label:e("Save"),icon:hk.check,class:"ck-button-save",type:"submit",withText:true});n.bind("isEnabled").toMany(i,"errorText",((...t)=>t.every((t=>!t))));o.set({label:e("Cancel"),icon:hk.cancel,class:"ck-button-cancel",type:"cancel",withText:true});o.delegate("execute").to(this,"cancel");return{saveButtonView:n,cancelButtonView:o}}get _alignmentLabels(){const t=this.locale;const e=this.t;const n=e("Align table to the left");const o=e("Center table");const i=e("Align table to the right");if(t.uiLanguageDirection==="rtl"){return{right:i,center:o,left:n}}else{return{left:n,center:o,right:i}}}}function rV(t){return!!t}var sV='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M8 2v5h4V2h1v5h5v1h-5v4h.021l-.172.351-1.916.28-.151.027c-.287.063-.54.182-.755.341L8 13v5H7v-5H2v-1h5V8H2V7h5V2h1zm4 6H8v4h4V8z" opacity=".6"/><path d="m15.5 11.5 1.323 2.68 2.957.43-2.14 2.085.505 2.946L15.5 18.25l-2.645 1.39.505-2.945-2.14-2.086 2.957-.43L15.5 11.5zM17 1a2 2 0 0 1 2 2v9.475l-.85-.124-.857-1.736a2.048 2.048 0 0 0-.292-.44L17 3H3v14h7.808l.402.392L10.935 19H3a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h14z"/></svg>';function aV(t){const e=t.getSelectedElement();if(e&&lV(e)){return e}return null}function cV(t){const e=dV("table",t.getFirstPosition());if(e&&lV(e.parent)){return e.parent}return null}function lV(t){return!!t.getCustomProperty("table")&&hy(t)}function dV(t,e){let n=e.parent;while(n){if(n.name===t){return n}n=n.parent}}const uV=bA.defaultPositions;const hV=[uV.northArrowSouth,uV.northArrowSouthWest,uV.northArrowSouthEast,uV.southArrowNorth,uV.southArrowNorthWest,uV.southArrowNorthEast];const fV=[...hV,vy];function mV(t,e){const n=t.plugins.get("ContextualBalloon");if(cV(t.editing.view.document.selection)){let o;if(e==="cell"){o=pV(t)}else{o=gV(t)}n.updatePosition(o)}}function gV(t){const e=t.model.document.selection.getFirstPosition();const n=e.findAncestor("table");const o=t.editing.mapper.toViewElement(n);return{target:t.editing.view.domConverter.viewToDom(o),positions:fV}}function pV(t){const e=t.editing.mapper;const n=t.editing.view.domConverter;const o=t.model.document.selection;if(o.rangeCount>1){return{target:()=>kV(o.getRanges(),t),positions:hV}}const i=bV(o.getFirstPosition());const r=e.toViewElement(i);return{target:n.viewToDom(r),positions:hV}}function bV(t){const e=t.nodeAfter&&t.nodeAfter.is("element","tableCell");return e?t.nodeAfter:t.findAncestor("tableCell")}function kV(t,e){const n=e.editing.mapper;const o=e.editing.view.domConverter;const i=Array.from(t).map((t=>{const e=bV(t.start);const i=n.toViewElement(e);return new rf(o.viewToDom(i))}));return rf.getBoundingRect(i)}const wV=500;const CV={borderStyle:"tableBorderStyle",borderColor:"tableBorderColor",borderWidth:"tableBorderWidth",backgroundColor:"tableBackgroundColor",width:"tableWidth",height:"tableHeight",alignment:"tableAlignment"};class AV extends Kn{static get requires(){return[IA]}static get pluginName(){return"TablePropertiesUI"}constructor(t){super(t);t.config.define("table.tableProperties",{borderColors:OM,backgroundColors:OM})}init(){const t=this.editor;const e=t.t;this._balloon=t.plugins.get(IA);this.view=this._createPropertiesView();this._undoStepBatch=null;t.ui.componentFactory.add("tableProperties",(n=>{const o=new fw(n);o.set({label:e("Table properties"),icon:sV,tooltip:true});this.listenTo(o,"execute",(()=>this._showView()));const i=Object.values(CV).map((e=>t.commands.get(e)));o.bind("isEnabled").toMany(i,"isEnabled",((...t)=>t.some((t=>t))));return o}))}destroy(){super.destroy();this.view.destroy()}_createPropertiesView(){const t=this.editor;const e=t.config.get("table.tableProperties");const n=Cw(e.borderColors);const o=ww(t.locale,n);const i=Cw(e.backgroundColors);const r=ww(t.locale,i);const s=new iV(t.locale,{borderColors:o,backgroundColors:r});const a=t.t;s.render();this.listenTo(s,"submit",(()=>{this._hideView()}));this.listenTo(s,"cancel",(()=>{if(this._undoStepBatch.operations.length){t.execute("undo",this._undoStepBatch)}this._hideView()}));s.keystrokes.set("Esc",((t,e)=>{this._hideView();e()}));fk({emitter:s,activator:()=>this._isViewInBalloon,contextElements:[this._balloon.view.element],callback:()=>this._hideView()});const c=BM(a);const l=TM(a);s.on("change:borderStyle",this._getPropertyChangeCallback("tableBorderStyle"));s.on("change:borderColor",this._getValidatedPropertyChangeCallback({viewField:s.borderColorInput,commandName:"tableBorderColor",errorText:c,validator:PM}));s.on("change:borderWidth",this._getValidatedPropertyChangeCallback({viewField:s.borderWidthInput,commandName:"tableBorderWidth",errorText:l,validator:RM}));s.on("change:backgroundColor",this._getValidatedPropertyChangeCallback({viewField:s.backgroundInput,commandName:"tableBackgroundColor",errorText:c,validator:PM}));s.on("change:width",this._getValidatedPropertyChangeCallback({viewField:s.widthInput,commandName:"tableWidth",errorText:l,validator:IM}));s.on("change:height",this._getValidatedPropertyChangeCallback({viewField:s.heightInput,commandName:"tableHeight",errorText:l,validator:IM}));s.on("change:alignment",this._getPropertyChangeCallback("tableAlignment"));return s}_fillViewFormFromCommandValues(){const t=this.editor.commands;Object.entries(CV).map((([e,n])=>[e,t.get(n).value||""])).forEach((([t,e])=>this.view.set(t,e)))}_showView(){const t=this.editor;this.listenTo(t.ui,"update",(()=>{this._updateView()}));this._fillViewFormFromCommandValues();this._balloon.add({view:this.view,position:gV(t)});this._undoStepBatch=t.model.createBatch();this.view.focus()}_hideView(){const t=this.editor;this.stopListening(t.ui,"update");this.view.saveButtonView.focus();this._balloon.remove(this.view);this.editor.editing.view.focus()}_updateView(){const t=this.editor;const e=t.editing.view.document;if(!cV(e.selection)){this._hideView()}else if(this._isViewVisible){mV(t,"table")}}get _isViewVisible(){return this._balloon.visibleView===this.view}get _isViewInBalloon(){return this._balloon.hasView(this.view)}_getPropertyChangeCallback(t){return(e,n,o)=>{this.editor.execute(t,{value:o,batch:this._undoStepBatch})}}_getValidatedPropertyChangeCallback({commandName:t,viewField:e,validator:n,errorText:o}){const i=qh((()=>{e.errorText=o}),wV);return(o,r,s)=>{i.cancel();if(n(s)){this.editor.execute(t,{value:s,batch:this._undoStepBatch});e.errorText=null}else{i()}}}}class _V extends Kn{static get pluginName(){return"TableProperties"}static get requires(){return[pM,AV]}}class vV extends Kn{static get requires(){return[Nx]}static get pluginName(){return"TableToolbar"}afterInit(){const t=this.editor;const e=t.t;const n=t.plugins.get(Nx);const o=t.config.get("table.contentToolbar");const i=t.config.get("table.tableToolbar");if(o){n.register("tableContent",{ariaLabel:e("Table toolbar"),items:o,getRelatedElement:cV})}if(i){n.register("table",{ariaLabel:e("Table toolbar"),items:i,getRelatedElement:aV})}}}function yV(t,e){e=e||Da(t);return`${t}:${e}`}function xV(t){const[e,n]=t.split(":");return{languageCode:e,textDirection:n}}class EV extends jn{refresh(){const t=this.editor.model;const e=t.document;this.value=this._getValueFromFirstAllowedNode();this.isEnabled=t.schema.checkAttributeInSelection(e.selection,"language")}execute({languageCode:t,textDirection:e}={}){const n=this.editor.model;const o=n.document;const i=o.selection;const r=t?yV(t,e):false;n.change((t=>{if(i.isCollapsed){if(r){t.setSelectionAttribute("language",r)}else{t.removeSelectionAttribute("language")}}else{const e=n.schema.getValidRanges(i.getRanges(),"language");for(const n of e){if(r){t.setAttribute("language",r,n)}else{t.removeAttribute("language",n)}}}}))}_getValueFromFirstAllowedNode(){const t=this.editor.model;const e=t.schema;const n=t.document.selection;if(n.isCollapsed){return n.getAttribute("language")||false}for(const t of n.getRanges()){for(const n of t.getItems()){if(e.checkAttribute(n,"language")){return n.getAttribute("language")||false}}}return false}}class DV extends Kn{static get pluginName(){return"TextPartLanguageEditing"}constructor(t){super(t);t.config.define("language",{textPartLanguage:[{title:"Arabic",languageCode:"ar"},{title:"French",languageCode:"fr"},{title:"Spanish",languageCode:"es"}]})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"language"});t.model.schema.setAttributeProperties("language",{copyOnEnter:true});this._defineConverters();t.commands.add("textPartLanguage",new EV(t))}_defineConverters(){const t=this.editor.conversion;t.for("upcast").elementToAttribute({model:{key:"language",value:t=>{const e=t.getAttribute("lang");const n=t.getAttribute("dir");return yV(e,n)}},view:{name:"span",attributes:{lang:/[\s\S]+/}}});t.for("downcast").attributeToElement({model:"language",view:(t,{writer:e})=>{if(!t){return}const{languageCode:n,textDirection:o}=xV(t);return e.createAttributeElement("span",{lang:n,dir:o})}})}}var SV=n(70);var BV={injectType:"singletonStyleTag",attributes:{"data-cke":true}};BV.insert="head";BV.singleton=true;var TV=wk()(SV["a"],BV);var PV=SV["a"].locals||{};class IV extends Kn{static get pluginName(){return"TextPartLanguageUI"}init(){const t=this.editor;const e=t.t;const n=t.config.get("language.textPartLanguage");const o=e("Choose language");const i=e("Remove language");const r=e("Language");t.ui.componentFactory.add("textPartLanguage",(e=>{const s=new ka;const a={};const c=t.commands.get("textPartLanguage");for(const t of n){const e={type:"button",model:new dA({label:t.title,languageCode:t.languageCode,textDirection:t.textDirection,withText:true})};const n=yV(t.languageCode,t.textDirection);e.model.bind("isOn").to(c,"value",(t=>t===n));s.add(e);a[n]=t.title}s.add({type:"separator"});s.add({type:"button",model:new dA({label:i,languageCode:false,withText:true})});const l=xC(e);DC(l,s);l.buttonView.set({isOn:false,withText:true,tooltip:r});l.extendTemplate({attributes:{class:["ck-text-fragment-language-dropdown"]}});l.bind("isEnabled").to(c,"isEnabled");l.buttonView.bind("label").to(c,"value",(t=>a[t]||o));this.listenTo(l,"execute",(e=>{c.execute({languageCode:e.source.languageCode,textDirection:e.source.textDirection});t.editing.view.focus()}));return l}))}}class RV extends Kn{static get requires(){return[DV,IV]}static get pluginName(){return"TextPartLanguage"}}const FV="todoListChecked";class zV extends jn{constructor(t){super(t);this._selectedElements=[];this.on("execute",(()=>{this.refresh()}),{priority:"highest"})}refresh(){this._selectedElements=this._getSelectedItems();this.value=this._selectedElements.every((t=>!!t.getAttribute("todoListChecked")));this.isEnabled=!!this._selectedElements.length}_getSelectedItems(){const t=this.editor.model;const e=t.schema;const n=t.document.selection.getFirstRange();const o=n.start.parent;const i=[];if(e.checkAttribute(o,FV)){i.push(o)}for(const t of n.getItems()){if(e.checkAttribute(t,FV)&&!i.includes(t)){i.push(t)}}return i}execute(t={}){this.editor.model.change((e=>{for(const n of this._selectedElements){const o=t.forceValue===undefined?!this.value:t.forceValue;if(o){e.setAttribute(FV,true,n)}else{e.removeAttribute(FV,n)}}}))}}function OV(t,e){return(n,o,i)=>{const r=i.consumable;if(!r.test(o.item,"insert")||!r.test(o.item,"attribute:listType")||!r.test(o.item,"attribute:listIndent")){return}if(o.item.getAttribute("listType")!="todo"){return}const s=o.item;r.consume(s,"insert");r.consume(s,"attribute:listType");r.consume(s,"attribute:listIndent");r.consume(s,"attribute:todoListChecked");const a=i.writer;const c=nF(s,i);const l=!!s.getAttribute("todoListChecked");const d=KV(s,a,l,e);const u=a.createContainerElement("span",{class:"todo-list__label__description"});a.addClass("todo-list",c.parent);a.insert(a.createPositionAt(c,0),d);a.insert(a.createPositionAfter(d),u);oF(s,c,i,t)}}function NV(t){return(e,n,o)=>{const i=o.consumable;if(!i.test(n.item,"insert")||!i.test(n.item,"attribute:listType")||!i.test(n.item,"attribute:listIndent")){return}if(n.item.getAttribute("listType")!="todo"){return}const r=n.item;i.consume(r,"insert");i.consume(r,"attribute:listType");i.consume(r,"attribute:listIndent");i.consume(r,"attribute:todoListChecked");const s=o.writer;const a=nF(r,o);s.addClass("todo-list",a.parent);const c=s.createContainerElement("label",{class:"todo-list__label"});const l=s.createEmptyElement("input",{type:"checkbox",disabled:"disabled"});const d=s.createContainerElement("span",{class:"todo-list__label__description"});if(r.getAttribute("todoListChecked")){s.setAttribute("checked","checked",l)}s.insert(s.createPositionAt(a,0),c);s.insert(s.createPositionAt(c,0),l);s.insert(s.createPositionAfter(l),d);oF(r,a,o,t)}}function MV(t,e,n){const o=e.modelCursor;const i=o.parent;const r=e.viewItem;if(r.getAttribute("type")!="checkbox"||i.name!="listItem"||!o.isAtStart){return}if(!n.consumable.consume(r,{name:true})){return}const s=n.writer;s.setAttribute("listType","todo",i);if(e.viewItem.hasAttribute("checked")){s.setAttribute("todoListChecked",true,i)}e.modelRange=s.createRange(o)}function VV(t,e){return(n,o,i)=>{const r=i.mapper.toViewElement(o.item);const s=i.writer;const a=qV(r,e);if(o.attributeNewValue=="todo"){const e=!!o.item.getAttribute("todoListChecked");const n=KV(o.item,s,e,t);const i=s.createContainerElement("span",{class:"todo-list__label__description"});const a=s.createRangeIn(r);const c=cF(r);const l=rF(a.start);const d=c?s.createPositionBefore(c):a.end;const u=s.createRange(l,d);s.addClass("todo-list",r.parent);s.move(u,s.createPositionAt(i,0));s.insert(s.createPositionAt(r,0),n);s.insert(s.createPositionAfter(n),i)}else if(o.attributeOldValue=="todo"){const t=jV(r,e);s.removeClass("todo-list",r.parent);s.remove(a);s.move(s.createRangeIn(t),s.createPositionBefore(t));s.remove(t)}}}function LV(t){return(e,n,o)=>{if(n.item.getAttribute("listType")!="todo"){return}if(!o.consumable.consume(n.item,"attribute:todoListChecked")){return}const{mapper:i,writer:r}=o;const s=!!n.item.getAttribute("todoListChecked");const a=i.toViewElement(n.item);const c=a.getChild(0);const l=KV(n.item,r,s,t);r.insert(r.createPositionAfter(c),l);r.remove(c)}}function HV(t){return(e,n)=>{const o=n.modelPosition;const i=o.parent;if(!i.is("element","listItem")||i.getAttribute("listType")!="todo"){return}const r=n.mapper.toViewElement(i);const s=jV(r,t);if(s){n.viewPosition=n.mapper.findPositionIn(s,o.offset)}}}function KV(t,e,n,o){const i=e.createUIElement("label",{class:"todo-list__label",contenteditable:false},(function(e){const i=Zh(document,"input",{type:"checkbox"});if(n){i.setAttribute("checked","checked")}i.addEventListener("change",(()=>o(t)));const r=this.toDomElement(e);r.appendChild(i);return r}));return i}function qV(t,e){const n=e.createRangeIn(t);for(const t of n){if(t.item.is("uiElement","label")){return t.item}}}function jV(t,e){const n=e.createRangeIn(t);for(const t of n){if(t.item.is("containerElement","span")&&t.item.hasClass("todo-list__label__description")){return t.item}}}const WV=od("Ctrl+Enter");class GV extends Kn{static get pluginName(){return"TodoListEditing"}static get requires(){return[TF]}init(){const t=this.editor;const{editing:e,data:n,model:o}=t;o.schema.extend("listItem",{allowAttributes:["todoListChecked"]});o.schema.addAttributeCheck(((t,e)=>{const n=t.last;if(e=="todoListChecked"&&n.name=="listItem"&&n.getAttribute("listType")!="todo"){return false}}));t.commands.add("todoList",new QR(t,"todo"));const i=new zV(t);t.commands.add("checkTodoList",i);t.commands.add("todoListCheck",i);n.downcastDispatcher.on("insert:listItem",NV(o),{priority:"high"});n.upcastDispatcher.on("element:input",MV,{priority:"high"});e.downcastDispatcher.on("insert:listItem",OV(o,(t=>this._handleCheckmarkChange(t))),{priority:"high"});e.downcastDispatcher.on("attribute:listType:listItem",VV((t=>this._handleCheckmarkChange(t)),e.view));e.downcastDispatcher.on("attribute:todoListChecked:listItem",LV((t=>this._handleCheckmarkChange(t))));e.mapper.on("modelToViewPosition",HV(e.view));n.mapper.on("modelToViewPosition",HV(e.view));this.listenTo(e.view.document,"arrowKey",UV(o,t.locale),{context:"li"});this.listenTo(e.view.document,"keydown",((e,n)=>{if(nd(n)===WV){t.execute("checkTodoList");e.stop()}}),{priority:"high"});const r=new Set;this.listenTo(o,"applyOperation",((t,e)=>{const n=e[0];if(n.type=="rename"&&n.oldName=="listItem"){const t=n.position.nodeAfter;if(t.hasAttribute("todoListChecked")){r.add(t)}}else if(n.type=="changeAttribute"&&n.key=="listType"&&n.oldValue==="todo"){for(const t of n.range.getItems()){if(t.hasAttribute("todoListChecked")&&t.getAttribute("listType")!=="todo"){r.add(t)}}}}));o.document.registerPostFixer((t=>{let e=false;for(const n of r){t.removeAttribute("todoListChecked",n);e=true}r.clear();return e}))}_handleCheckmarkChange(t){const e=this.editor;const n=e.model;const o=Array.from(n.document.selection.getRanges());n.change((n=>{n.setSelection(t,"end");e.execute("checkTodoList");n.setSelection(o)}))}}function UV(t,e){return(n,o)=>{const i=sd(o.keyCode,e.contentLanguageDirection);if(i!="left"){return}const r=t.schema;const s=t.document.selection;if(!s.isCollapsed){return}const a=s.getFirstPosition();const c=a.parent;if(c.name==="listItem"&&c.getAttribute("listType")=="todo"&&a.isAtStart){const e=r.getNearestSelectionRange(t.createPositionBefore(c),"backward");if(e){t.change((t=>t.setSelection(e)))}o.preventDefault();o.stopPropagation();n.stop()}}}var $V='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m2.315 14.705 2.224-2.24a.689.689 0 0 1 .963 0 .664.664 0 0 1 0 .949L2.865 16.07a.682.682 0 0 1-.112.089.647.647 0 0 1-.852-.051L.688 14.886a.635.635 0 0 1 0-.903.647.647 0 0 1 .91 0l.717.722zm5.185.045a.75.75 0 0 1 .75-.75h9.5a.75.75 0 1 1 0 1.5h-9.5a.75.75 0 0 1-.75-.75zM2.329 5.745l2.21-2.226a.689.689 0 0 1 .963 0 .664.664 0 0 1 0 .95L2.865 7.125a.685.685 0 0 1-.496.196.644.644 0 0 1-.468-.187L.688 5.912a.635.635 0 0 1 0-.903.647.647 0 0 1 .91 0l.73.736zM7.5 5.75A.75.75 0 0 1 8.25 5h9.5a.75.75 0 1 1 0 1.5h-9.5a.75.75 0 0 1-.75-.75z"/></svg>';class JV extends Kn{static get pluginName(){return"TodoListUI"}init(){const t=this.editor.t;aF(this.editor,"todoList",t("To-do List"),$V)}}var YV=n(71);var QV={injectType:"singletonStyleTag",attributes:{"data-cke":true}};QV.insert="head";QV.singleton=true;var XV=wk()(YV["a"],QV);var ZV=YV["a"].locals||{};class tL extends Kn{static get requires(){return[GV,JV]}static get pluginName(){return"TodoList"}}const eL="underline";class nL extends Kn{static get pluginName(){return"UnderlineEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:eL});t.model.schema.setAttributeProperties(eL,{isFormatting:true,copyOnEnter:true});t.conversion.attributeToElement({model:eL,view:"u",upcastAlso:{styles:{"text-decoration":"underline"}}});t.commands.add(eL,new xS(t,eL));t.keystrokes.set("CTRL+U","underline")}}var oL='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 18v-1.5h14V18zm2.2-8V3.6c0-.4.4-.6.8-.6.3 0 .7.2.7.6v6.2c0 2 1.3 2.8 3.2 2.8 1.9 0 3.4-.9 3.4-2.9V3.6c0-.3.4-.5.8-.5.3 0 .7.2.7.5V10c0 2.7-2.2 4-4.9 4-2.6 0-4.7-1.2-4.7-4z"/></svg>';const iL="underline";class rL extends Kn{static get pluginName(){return"UnderlineUI"}init(){const t=this.editor;const e=t.t;t.ui.componentFactory.add(iL,(n=>{const o=t.commands.get(iL);const i=new fw(n);i.set({label:e("Underline"),icon:oL,keystroke:"CTRL+U",tooltip:true,isToggleable:true});i.bind("isOn","isEnabled").to(o,"value","isEnabled");this.listenTo(i,"execute",(()=>{t.execute(iL);t.editing.view.focus()}));return i}))}}class sL extends Kn{static get requires(){return[nL,rL]}static get pluginName(){return"Underline"}}class aL extends vv{}aL.builtinPlugins=[Vv,mE,oS,aS,yS,PS,VS,aB,bB,OB,ZB,hT,xT,LT,fP,SP,OI,XI,ZI,_I,rR,NR,YR,zF,LB,kz,OP,tM,_V,vV,RV,tL,sL];var cL=e["default"]=aL}])["default"]})); |
6 | //# sourceMappingURL=ckeditor.js.map \ No newline at end of file | 6 | //# sourceMappingURL=ckeditor.js.map \ No newline at end of file |
diff --git a/lib/ckeditor5/package.json b/lib/ckeditor5/package.json index 3bfd035..a15f06e 100644 --- a/lib/ckeditor5/package.json +++ b/lib/ckeditor5/package.json | |||
@@ -1,44 +1,44 @@ | |||
1 | { | 1 | { |
2 | "name": "ckeditor5-custom-build", | 2 | "name": "ckeditor5-custom-build", |
3 | "author": "CKSource", | 3 | "author": "CKSource", |
4 | "description": "A custom CKEditor 5 build made by the CKEditor 5 online builder.", | 4 | "description": "A custom CKEditor 5 build made by the CKEditor 5 online builder.", |
5 | "version": "0.0.1", | 5 | "version": "0.0.1", |
6 | "license": "SEE LICENSE IN LICENSE.md", | 6 | "license": "SEE LICENSE IN LICENSE.md", |
7 | "private": true, | 7 | "private": true, |
8 | "main": "./build/ckeditor.js", | 8 | "main": "./build/ckeditor.js", |
9 | "devDependencies": { | 9 | "devDependencies": { |
10 | "@ckeditor/ckeditor5-alignment": "^27.0.0", | 10 | "@ckeditor/ckeditor5-alignment": "^27.0.0", |
11 | "@ckeditor/ckeditor5-autosave": "^27.0.0", | 11 | "@ckeditor/ckeditor5-autosave": "^27.0.0", |
12 | "@ckeditor/ckeditor5-basic-styles": "^27.0.0", | 12 | "@ckeditor/ckeditor5-basic-styles": "^27.0.0", |
13 | "@ckeditor/ckeditor5-block-quote": "^27.0.0", | 13 | "@ckeditor/ckeditor5-block-quote": "^27.0.0", |
14 | "@ckeditor/ckeditor5-dev-utils": "^24.4.2", | 14 | "@ckeditor/ckeditor5-dev-utils": "^24.4.2", |
15 | "@ckeditor/ckeditor5-dev-webpack-plugin": "^24.4.2", | 15 | "@ckeditor/ckeditor5-dev-webpack-plugin": "^24.4.2", |
16 | "@ckeditor/ckeditor5-editor-classic": "^27.0.0", | 16 | "@ckeditor/ckeditor5-editor-classic": "^27.0.0", |
17 | "@ckeditor/ckeditor5-essentials": "^27.0.0", | 17 | "@ckeditor/ckeditor5-essentials": "^27.0.0", |
18 | "@ckeditor/ckeditor5-font": "^27.0.0", | 18 | "@ckeditor/ckeditor5-font": "^27.0.0", |
19 | "@ckeditor/ckeditor5-heading": "^27.0.0", | 19 | "@ckeditor/ckeditor5-heading": "^27.0.0", |
20 | "@ckeditor/ckeditor5-highlight": "^27.0.0", | 20 | "@ckeditor/ckeditor5-highlight": "^27.0.0", |
21 | "@ckeditor/ckeditor5-horizontal-line": "^27.0.0", | 21 | "@ckeditor/ckeditor5-horizontal-line": "^27.0.0", |
22 | "@ckeditor/ckeditor5-html-embed": "^27.0.0", | 22 | "@ckeditor/ckeditor5-html-embed": "^27.0.0", |
23 | "@ckeditor/ckeditor5-image": "^27.0.0", | 23 | "@ckeditor/ckeditor5-image": "^27.0.0", |
24 | "@ckeditor/ckeditor5-language": "^27.0.0", | 24 | "@ckeditor/ckeditor5-language": "^27.0.0", |
25 | "@ckeditor/ckeditor5-link": "^27.0.0", | 25 | "@ckeditor/ckeditor5-link": "^27.0.0", |
26 | "@ckeditor/ckeditor5-list": "^27.0.0", | 26 | "@ckeditor/ckeditor5-list": "^27.0.0", |
27 | "@ckeditor/ckeditor5-paragraph": "^27.0.0", | 27 | "@ckeditor/ckeditor5-paragraph": "^27.0.0", |
28 | "@ckeditor/ckeditor5-paste-from-office": "^27.0.0", | 28 | "@ckeditor/ckeditor5-paste-from-office": "^27.0.0", |
29 | "@ckeditor/ckeditor5-table": "^27.0.0", | 29 | "@ckeditor/ckeditor5-table": "^27.0.0", |
30 | "@ckeditor/ckeditor5-theme-lark": "^27.0.0", | 30 | "@ckeditor/ckeditor5-theme-lark": "^27.0.0", |
31 | "@ckeditor/ckeditor5-upload": "^27.0.0", | 31 | "@ckeditor/ckeditor5-upload": "^27.0.0", |
32 | "css-loader": "^5.2.0", | 32 | "css-loader": "^5.2.0", |
33 | "postcss": "^8.2.8", | 33 | "postcss": "^8.2.8", |
34 | "postcss-loader": "^4.2.0", | 34 | "postcss-loader": "^4.2.0", |
35 | "raw-loader": "^4.0.2", | 35 | "raw-loader": "^4.0.2", |
36 | "style-loader": "^2.0.0", | 36 | "style-loader": "^2.0.0", |
37 | "terser-webpack-plugin": "^4.2.3", | 37 | "terser-webpack-plugin": "^4.2.3", |
38 | "webpack": "^4.46.0", | 38 | "webpack": "^4.46.0", |
39 | "webpack-cli": "^4.5.0" | 39 | "webpack-cli": "^4.5.0" |
40 | }, | 40 | }, |
41 | "scripts": { | 41 | "scripts": { |
42 | "build": "webpack --mode production" | 42 | "build": "webpack --mode production" |
43 | } | 43 | } |
44 | } \ No newline at end of file | 44 | } \ No newline at end of file |
diff --git a/lib/ckeditor5/sample/index.html b/lib/ckeditor5/sample/index.html index 0193081..8f3ac18 100644 --- a/lib/ckeditor5/sample/index.html +++ b/lib/ckeditor5/sample/index.html | |||
@@ -1,164 +1,164 @@ | |||
1 | <!DOCTYPE html><!-- | 1 | <!DOCTYPE html><!-- |
2 | Copyright (c) 2014-2021, CKSource - Frederico Knabben. All rights reserved. | 2 | Copyright (c) 2014-2021, CKSource - Frederico Knabben. All rights reserved. |
3 | This file is licensed under the terms of the MIT License (see LICENSE.md). | 3 | This file is licensed under the terms of the MIT License (see LICENSE.md). |
4 | --> | 4 | --> |
5 | 5 | ||
6 | <html lang="en" dir="ltr"></html> | 6 | <html lang="en" dir="ltr"></html> |
7 | <head> | 7 | <head> |
8 | <title>CKEditor 5 ClassicEditor build</title> | 8 | <title>CKEditor 5 ClassicEditor build</title> |
9 | <meta charset="UTF-8"> | 9 | <meta charset="UTF-8"> |
10 | <meta name="viewport" content="width=device-width, initial-scale=1"> | 10 | <meta name="viewport" content="width=device-width, initial-scale=1"> |
11 | <link rel="icon" type="image/png" href="https://c.cksource.com/a/1/logos/ckeditor5.png"> | 11 | <link rel="icon" type="image/png" href="https://c.cksource.com/a/1/logos/ckeditor5.png"> |
12 | <link rel="stylesheet" type="text/css" href="styles.css"> | 12 | <link rel="stylesheet" type="text/css" href="styles.css"> |
13 | </head> | 13 | </head> |
14 | <body data-editor="ClassicEditor" data-collaboration="false"> | 14 | <body data-editor="ClassicEditor" data-collaboration="false"> |
15 | <header> | 15 | <header> |
16 | <div class="centered"> | 16 | <div class="centered"> |
17 | <h1><a href="https://ckeditor.com/ckeditor-5/" target="_blank" rel="noopener noreferrer"><img src="https://c.cksource.com/a/1/logos/ckeditor5.svg" alt="CKEditor 5 logo">CKEditor 5</a></h1> | 17 | <h1><a href="https://ckeditor.com/ckeditor-5/" target="_blank" rel="noopener noreferrer"><img src="https://c.cksource.com/a/1/logos/ckeditor5.svg" alt="CKEditor 5 logo">CKEditor 5</a></h1> |
18 | <nav> | 18 | <nav> |
19 | <ul> | 19 | <ul> |
20 | <li><a href="https://ckeditor.com/docs/ckeditor5/" target="_blank" rel="noopener noreferrer">Documentation</a></li> | 20 | <li><a href="https://ckeditor.com/docs/ckeditor5/" target="_blank" rel="noopener noreferrer">Documentation</a></li> |
21 | <li><a href="https://ckeditor.com/" target="_blank" rel="noopener noreferrer">Website</a></li> | 21 | <li><a href="https://ckeditor.com/" target="_blank" rel="noopener noreferrer">Website</a></li> |
22 | </ul> | 22 | </ul> |
23 | </nav> | 23 | </nav> |
24 | </div> | 24 | </div> |
25 | </header> | 25 | </header> |
26 | <main> | 26 | <main> |
27 | <div class="message"> | 27 | <div class="message"> |
28 | <div class="centered"> | 28 | <div class="centered"> |
29 | <h2>CKEditor 5 online builder demo - ClassicEditor build</h2> | 29 | <h2>CKEditor 5 online builder demo - ClassicEditor build</h2> |
30 | </div> | 30 | </div> |
31 | </div> | 31 | </div> |
32 | <div class="centered"> | 32 | <div class="centered"> |
33 | <div class="row row-editor"> | 33 | <div class="row row-editor"> |
34 | <div class="editor"> | 34 | <div class="editor"> |
35 | <h2>Bilingual Personality Disorder</h2> | 35 | <h2>Bilingual Personality Disorder</h2> |
36 | <figure class="image image-style-side"><img src="https://c.cksource.com/a/1/img/docs/sample-image-bilingual-personality-disorder.jpg"> | 36 | <figure class="image image-style-side"><img src="https://c.cksource.com/a/1/img/docs/sample-image-bilingual-personality-disorder.jpg"> |
37 | <figcaption>One language, one person.</figcaption> | 37 | <figcaption>One language, one person.</figcaption> |
38 | </figure> | 38 | </figure> |
39 | <p> | 39 | <p> |
40 | This may be the first time you hear about this made-up disorder but | 40 | This may be the first time you hear about this made-up disorder but |
41 | it actually isn’t so far from the truth. Even the studies that were conducted almost half a century show that | 41 | it actually isn’t so far from the truth. Even the studies that were conducted almost half a century show that |
42 | <strong>the language you speak has more effects on you than you realise</strong>. | 42 | <strong>the language you speak has more effects on you than you realise</strong>. |
43 | </p> | 43 | </p> |
44 | <p> | 44 | <p> |
45 | One of the very first experiments conducted on this topic dates back to 1964. | 45 | One of the very first experiments conducted on this topic dates back to 1964. |
46 | <a href="https://www.researchgate.net/publication/9440038_Language_and_TAT_content_in_bilinguals">In the experiment</a> | 46 | <a href="https://www.researchgate.net/publication/9440038_Language_and_TAT_content_in_bilinguals">In the experiment</a> |
47 | designed by linguist Ervin-Tripp who is an authority expert in psycholinguistic and sociolinguistic studies, | 47 | designed by linguist Ervin-Tripp who is an authority expert in psycholinguistic and sociolinguistic studies, |
48 | adults who are bilingual in English in French were showed series of pictures and were asked to create 3-minute stories. | 48 | adults who are bilingual in English in French were showed series of pictures and were asked to create 3-minute stories. |
49 | In the end participants emphasized drastically different dynamics for stories in English and French. | 49 | In the end participants emphasized drastically different dynamics for stories in English and French. |
50 | </p> | 50 | </p> |
51 | <p> | 51 | <p> |
52 | Another ground-breaking experiment which included bilingual Japanese women married to American men in San Francisco were | 52 | Another ground-breaking experiment which included bilingual Japanese women married to American men in San Francisco were |
53 | asked to complete sentences. The goal of the experiment was to investigate whether or not human feelings and thoughts | 53 | asked to complete sentences. The goal of the experiment was to investigate whether or not human feelings and thoughts |
54 | are expressed differently in <strong>different language mindsets</strong>. | 54 | are expressed differently in <strong>different language mindsets</strong>. |
55 | <Here>is a sample from the the experiment:</Here> | 55 | <Here>is a sample from the the experiment:</Here> |
56 | </p> | 56 | </p> |
57 | <table> | 57 | <table> |
58 | <thead> | 58 | <thead> |
59 | <tr> | 59 | <tr> |
60 | <th></th> | 60 | <th></th> |
61 | <th>English</th> | 61 | <th>English</th> |
62 | <th>Japanese</th> | 62 | <th>Japanese</th> |
63 | </tr> | 63 | </tr> |
64 | </thead> | 64 | </thead> |
65 | <tbody> | 65 | <tbody> |
66 | <tr> | 66 | <tr> |
67 | <td>Real friends should</td> | 67 | <td>Real friends should</td> |
68 | <td>Be very frank</td> | 68 | <td>Be very frank</td> |
69 | <td>Help each other</td> | 69 | <td>Help each other</td> |
70 | </tr> | 70 | </tr> |
71 | <tr> | 71 | <tr> |
72 | <td>I will probably become</td> | 72 | <td>I will probably become</td> |
73 | <td>A teacher</td> | 73 | <td>A teacher</td> |
74 | <td>A housewife</td> | 74 | <td>A housewife</td> |
75 | </tr> | 75 | </tr> |
76 | <tr> | 76 | <tr> |
77 | <td>When there is a conflict with family</td> | 77 | <td>When there is a conflict with family</td> |
78 | <td>I do what I want</td> | 78 | <td>I do what I want</td> |
79 | <td>It's a time of great unhappiness</td> | 79 | <td>It's a time of great unhappiness</td> |
80 | </tr> | 80 | </tr> |
81 | </tbody> | 81 | </tbody> |
82 | </table> | 82 | </table> |
83 | <p> | 83 | <p> |
84 | More recent <a href="https://books.google.pl/books?id=1LMhWGHGkRUC">studies</a> show, the language a person speaks affects | 84 | More recent <a href="https://books.google.pl/books?id=1LMhWGHGkRUC">studies</a> show, the language a person speaks affects |
85 | their cognition, behaviour, emotions and hence <strong>their personality</strong>. | 85 | their cognition, behaviour, emotions and hence <strong>their personality</strong>. |
86 | This shouldn’t come as a surprise | 86 | This shouldn’t come as a surprise |
87 | <a href="https://en.wikipedia.org/wiki/Lateralization_of_brain_function">since we already know</a> that different regions | 87 | <a href="https://en.wikipedia.org/wiki/Lateralization_of_brain_function">since we already know</a> that different regions |
88 | of the brain become more active depending on the person’s activity at hand. Since structure, information and especially | 88 | of the brain become more active depending on the person’s activity at hand. Since structure, information and especially |
89 | <strong>the culture</strong> of languages varies substantially and the language a person speaks is an essential element of daily life. | 89 | <strong>the culture</strong> of languages varies substantially and the language a person speaks is an essential element of daily life. |
90 | </p> | 90 | </p> |
91 | </div> | 91 | </div> |
92 | </div></div> | 92 | </div></div> |
93 | </div> | 93 | </div> |
94 | </main> | 94 | </main> |
95 | <footer> | 95 | <footer> |
96 | <p><a href="https://ckeditor.com/ckeditor-5/" target="_blank" rel="noopener">CKEditor 5</a> | 96 | <p><a href="https://ckeditor.com/ckeditor-5/" target="_blank" rel="noopener">CKEditor 5</a> |
97 | – Rich text editor of tomorrow, available today | 97 | – Rich text editor of tomorrow, available today |
98 | </p> | 98 | </p> |
99 | <p>Copyright © 2003-2021, | 99 | <p>Copyright © 2003-2021, |
100 | <a href="https://cksource.com/" target="_blank" rel="noopener">CKSource</a> | 100 | <a href="https://cksource.com/" target="_blank" rel="noopener">CKSource</a> |
101 | – Frederico Knabben. All rights reserved. | 101 | – Frederico Knabben. All rights reserved. |
102 | </p> | 102 | </p> |
103 | </footer> | 103 | </footer> |
104 | <script src="../build/ckeditor.js"></script> | 104 | <script src="../build/ckeditor.js"></script> |
105 | <script>ClassicEditor | 105 | <script>ClassicEditor |
106 | .create( document.querySelector( '.editor' ), { | 106 | .create( document.querySelector( '.editor' ), { |
107 | 107 | ||
108 | toolbar: { | 108 | toolbar: { |
109 | items: [ | 109 | items: [ |
110 | 'heading', | 110 | 'heading', |
111 | '|', | 111 | '|', |
112 | 'bold', | 112 | 'bold', |
113 | 'italic', | 113 | 'italic', |
114 | 'link', | 114 | 'link', |
115 | 'bulletedList', | 115 | 'bulletedList', |
116 | 'numberedList', | 116 | 'numberedList', |
117 | '|', | 117 | '|', |
118 | 'imageUpload', | 118 | 'imageUpload', |
119 | 'blockQuote', | 119 | 'blockQuote', |
120 | 'insertTable', | 120 | 'insertTable', |
121 | 'undo', | 121 | 'undo', |
122 | 'redo' | 122 | 'redo' |
123 | ] | 123 | ] |
124 | }, | 124 | }, |
125 | language: 'fr', | 125 | language: 'fr', |
126 | image: { | 126 | image: { |
127 | toolbar: [ | 127 | toolbar: [ |
128 | 'imageTextAlternative', | 128 | 'imageTextAlternative', |
129 | 'imageStyle:full', | 129 | 'imageStyle:full', |
130 | 'imageStyle:side', | 130 | 'imageStyle:side', |
131 | 'linkImage' | 131 | 'linkImage' |
132 | ] | 132 | ] |
133 | }, | 133 | }, |
134 | table: { | 134 | table: { |
135 | contentToolbar: [ | 135 | contentToolbar: [ |
136 | 'tableColumn', | 136 | 'tableColumn', |
137 | 'tableRow', | 137 | 'tableRow', |
138 | 'mergeTableCells', | 138 | 'mergeTableCells', |
139 | 'tableProperties' | 139 | 'tableProperties' |
140 | ] | 140 | ] |
141 | }, | 141 | }, |
142 | licenseKey: '', | 142 | licenseKey: '', |
143 | 143 | ||
144 | 144 | ||
145 | } ) | 145 | } ) |
146 | .then( editor => { | 146 | .then( editor => { |
147 | window.editor = editor; | 147 | window.editor = editor; |
148 | 148 | ||
149 | 149 | ||
150 | 150 | ||
151 | 151 | ||
152 | 152 | ||
153 | 153 | ||
154 | 154 | ||
155 | 155 | ||
156 | } ) | 156 | } ) |
157 | .catch( error => { | 157 | .catch( error => { |
158 | console.error( 'Oops, something went wrong!' ); | 158 | console.error( 'Oops, something went wrong!' ); |
159 | console.error( 'Please, report the following error on https://github.com/ckeditor/ckeditor5/issues with the build id and the error stack trace:' ); | 159 | console.error( 'Please, report the following error on https://github.com/ckeditor/ckeditor5/issues with the build id and the error stack trace:' ); |
160 | console.warn( 'Build id: aovpauzd25hi-dqoovaepm42n' ); | 160 | console.warn( 'Build id: aovpauzd25hi-dqoovaepm42n' ); |
161 | console.error( error ); | 161 | console.error( error ); |
162 | } ); | 162 | } ); |
163 | </script> | 163 | </script> |
164 | </body> \ No newline at end of file | 164 | </body> \ No newline at end of file |
diff --git a/lib/ckeditor5/sample/styles.css b/lib/ckeditor5/sample/styles.css index a882e34..218ca9d 100644 --- a/lib/ckeditor5/sample/styles.css +++ b/lib/ckeditor5/sample/styles.css | |||
@@ -1,465 +1,465 @@ | |||
1 | /** | 1 | /** |
2 | * @license Copyright (c) 2014-2021, CKSource - Frederico Knabben. All rights reserved. | 2 | * @license Copyright (c) 2014-2021, CKSource - Frederico Knabben. All rights reserved. |
3 | * This file is licensed under the terms of the MIT License (see LICENSE.md). | 3 | * This file is licensed under the terms of the MIT License (see LICENSE.md). |
4 | */ | 4 | */ |
5 | 5 | ||
6 | :root { | 6 | :root { |
7 | --ck-sample-base-spacing: 2em; | 7 | --ck-sample-base-spacing: 2em; |
8 | --ck-sample-color-white: #fff; | 8 | --ck-sample-color-white: #fff; |
9 | --ck-sample-color-green: #279863; | 9 | --ck-sample-color-green: #279863; |
10 | --ck-sample-color-blue: #1a9aef; | 10 | --ck-sample-color-blue: #1a9aef; |
11 | --ck-sample-container-width: 1285px; | 11 | --ck-sample-container-width: 1285px; |
12 | --ck-sample-sidebar-width: 350px; | 12 | --ck-sample-sidebar-width: 350px; |
13 | --ck-sample-editor-min-height: 400px; | 13 | --ck-sample-editor-min-height: 400px; |
14 | --ck-sample-editor-z-index: 10; | 14 | --ck-sample-editor-z-index: 10; |
15 | } | 15 | } |
16 | 16 | ||
17 | /* --------- EDITOR STYLES ---------------------------------------------------------------------------------------- */ | 17 | /* --------- EDITOR STYLES ---------------------------------------------------------------------------------------- */ |
18 | 18 | ||
19 | .editor__editable, | 19 | .editor__editable, |
20 | /* Classic build. */ | 20 | /* Classic build. */ |
21 | main .ck-editor[role='application'] .ck.ck-content, | 21 | main .ck-editor[role='application'] .ck.ck-content, |
22 | /* Decoupled document build. */ | 22 | /* Decoupled document build. */ |
23 | .ck.editor__editable[role='textbox'], | 23 | .ck.editor__editable[role='textbox'], |
24 | .ck.ck-editor__editable[role='textbox'], | 24 | .ck.ck-editor__editable[role='textbox'], |
25 | /* Inline & Balloon build. */ | 25 | /* Inline & Balloon build. */ |
26 | .ck.editor[role='textbox'] { | 26 | .ck.editor[role='textbox'] { |
27 | width: 100%; | 27 | width: 100%; |
28 | background: #fff; | 28 | background: #fff; |
29 | font-size: 1em; | 29 | font-size: 1em; |
30 | line-height: 1.6em; | 30 | line-height: 1.6em; |
31 | min-height: var(--ck-sample-editor-min-height); | 31 | min-height: var(--ck-sample-editor-min-height); |
32 | padding: 1.5em 2em; | 32 | padding: 1.5em 2em; |
33 | } | 33 | } |
34 | 34 | ||
35 | .ck.ck-editor__editable { | 35 | .ck.ck-editor__editable { |
36 | background: #fff; | 36 | background: #fff; |
37 | border: 1px solid hsl(0, 0%, 70%); | 37 | border: 1px solid hsl(0, 0%, 70%); |
38 | width: 100%; | 38 | width: 100%; |
39 | } | 39 | } |
40 | 40 | ||
41 | .ck.ck-editor { | 41 | .ck.ck-editor { |
42 | /* To enable toolbar wrapping. */ | 42 | /* To enable toolbar wrapping. */ |
43 | width: 100%; | 43 | width: 100%; |
44 | overflow-x: hidden; | 44 | overflow-x: hidden; |
45 | } | 45 | } |
46 | 46 | ||
47 | /* Because of sidebar `position: relative`, Edge is overriding the outline of a focused editor. */ | 47 | /* Because of sidebar `position: relative`, Edge is overriding the outline of a focused editor. */ |
48 | .ck.ck-editor__editable { | 48 | .ck.ck-editor__editable { |
49 | position: relative; | 49 | position: relative; |
50 | z-index: var(--ck-sample-editor-z-index); | 50 | z-index: var(--ck-sample-editor-z-index); |
51 | } | 51 | } |
52 | 52 | ||
53 | /* --------- DECOUPLED (DOCUMENT) BUILD. ---------------------------------------------*/ | 53 | /* --------- DECOUPLED (DOCUMENT) BUILD. ---------------------------------------------*/ |
54 | body[data-editor='DecoupledDocumentEditor'] .document-editor__toolbar { | 54 | body[data-editor='DecoupledDocumentEditor'] .document-editor__toolbar { |
55 | width: 100%; | 55 | width: 100%; |
56 | } | 56 | } |
57 | 57 | ||
58 | body[ data-editor='DecoupledDocumentEditor'] .collaboration-demo__editable, | 58 | body[ data-editor='DecoupledDocumentEditor'] .collaboration-demo__editable, |
59 | body[ data-editor='DecoupledDocumentEditor'] .row-editor .editor { | 59 | body[ data-editor='DecoupledDocumentEditor'] .row-editor .editor { |
60 | width: 18.5cm; | 60 | width: 18.5cm; |
61 | height: 100%; | 61 | height: 100%; |
62 | min-height: 26.25cm; | 62 | min-height: 26.25cm; |
63 | padding: 1.75cm 1.5cm; | 63 | padding: 1.75cm 1.5cm; |
64 | margin: 2.5rem; | 64 | margin: 2.5rem; |
65 | border: 1px hsl( 0, 0%, 82.7% ) solid; | 65 | border: 1px hsl( 0, 0%, 82.7% ) solid; |
66 | background-color: var(--ck-sample-color-white); | 66 | background-color: var(--ck-sample-color-white); |
67 | box-shadow: 0 0 5px hsla( 0, 0%, 0%, .1 ); | 67 | box-shadow: 0 0 5px hsla( 0, 0%, 0%, .1 ); |
68 | } | 68 | } |
69 | 69 | ||
70 | body[ data-editor='DecoupledDocumentEditor'] .row-editor { | 70 | body[ data-editor='DecoupledDocumentEditor'] .row-editor { |
71 | display: flex; | 71 | display: flex; |
72 | position: relative; | 72 | position: relative; |
73 | justify-content: center; | 73 | justify-content: center; |
74 | overflow-y: auto; | 74 | overflow-y: auto; |
75 | background-color: #f2f2f2; | 75 | background-color: #f2f2f2; |
76 | border: 1px solid hsl(0, 0%, 77%); | 76 | border: 1px solid hsl(0, 0%, 77%); |
77 | } | 77 | } |
78 | 78 | ||
79 | body[data-editor='DecoupledDocumentEditor'] .sidebar { | 79 | body[data-editor='DecoupledDocumentEditor'] .sidebar { |
80 | background: transparent; | 80 | background: transparent; |
81 | border: 0; | 81 | border: 0; |
82 | box-shadow: none; | 82 | box-shadow: none; |
83 | } | 83 | } |
84 | 84 | ||
85 | /* --------- COMMENTS & TRACK CHANGES FEATURE ---------------------------------------------------------------------- */ | 85 | /* --------- COMMENTS & TRACK CHANGES FEATURE ---------------------------------------------------------------------- */ |
86 | .sidebar { | 86 | .sidebar { |
87 | padding: 0 15px; | 87 | padding: 0 15px; |
88 | position: relative; | 88 | position: relative; |
89 | min-width: var(--ck-sample-sidebar-width); | 89 | min-width: var(--ck-sample-sidebar-width); |
90 | max-width: var(--ck-sample-sidebar-width); | 90 | max-width: var(--ck-sample-sidebar-width); |
91 | font-size: 20px; | 91 | font-size: 20px; |
92 | border: 1px solid hsl(0, 0%, 77%); | 92 | border: 1px solid hsl(0, 0%, 77%); |
93 | background: hsl(0, 0%, 98%); | 93 | background: hsl(0, 0%, 98%); |
94 | border-left: 0; | 94 | border-left: 0; |
95 | overflow: hidden; | 95 | overflow: hidden; |
96 | min-height: 100%; | 96 | min-height: 100%; |
97 | flex-grow: 1; | 97 | flex-grow: 1; |
98 | } | 98 | } |
99 | 99 | ||
100 | /* Do not inherit styles related to the editable editor content. See line 25.*/ | 100 | /* Do not inherit styles related to the editable editor content. See line 25.*/ |
101 | .sidebar .ck-content[role='textbox'], | 101 | .sidebar .ck-content[role='textbox'], |
102 | .ck.ck-annotation-wrapper .ck-content[role='textbox'] { | 102 | .ck.ck-annotation-wrapper .ck-content[role='textbox'] { |
103 | min-height: unset; | 103 | min-height: unset; |
104 | width: unset; | 104 | width: unset; |
105 | padding: 0; | 105 | padding: 0; |
106 | background: transparent; | 106 | background: transparent; |
107 | } | 107 | } |
108 | 108 | ||
109 | .sidebar.narrow { | 109 | .sidebar.narrow { |
110 | min-width: 60px; | 110 | min-width: 60px; |
111 | flex-grow: 0; | 111 | flex-grow: 0; |
112 | } | 112 | } |
113 | 113 | ||
114 | .sidebar.hidden { | 114 | .sidebar.hidden { |
115 | display: none !important; | 115 | display: none !important; |
116 | } | 116 | } |
117 | 117 | ||
118 | #sidebar-display-toggle { | 118 | #sidebar-display-toggle { |
119 | position: absolute; | 119 | position: absolute; |
120 | z-index: 1; | 120 | z-index: 1; |
121 | width: 30px; | 121 | width: 30px; |
122 | height: 30px; | 122 | height: 30px; |
123 | text-align: center; | 123 | text-align: center; |
124 | left: 15px; | 124 | left: 15px; |
125 | top: 30px; | 125 | top: 30px; |
126 | border: 0; | 126 | border: 0; |
127 | padding: 0; | 127 | padding: 0; |
128 | color: hsl( 0, 0%, 50% ); | 128 | color: hsl( 0, 0%, 50% ); |
129 | transition: 250ms ease color; | 129 | transition: 250ms ease color; |
130 | background-color: transparent; | 130 | background-color: transparent; |
131 | } | 131 | } |
132 | 132 | ||
133 | #sidebar-display-toggle:hover { | 133 | #sidebar-display-toggle:hover { |
134 | color: hsl( 0, 0%, 30% ); | 134 | color: hsl( 0, 0%, 30% ); |
135 | cursor: pointer; | 135 | cursor: pointer; |
136 | } | 136 | } |
137 | 137 | ||
138 | #sidebar-display-toggle:focus, | 138 | #sidebar-display-toggle:focus, |
139 | #sidebar-display-toggle:active { | 139 | #sidebar-display-toggle:active { |
140 | outline: none; | 140 | outline: none; |
141 | border: 1px solid #a9d29d; | 141 | border: 1px solid #a9d29d; |
142 | } | 142 | } |
143 | 143 | ||
144 | #sidebar-display-toggle svg { | 144 | #sidebar-display-toggle svg { |
145 | fill: currentColor; | 145 | fill: currentColor; |
146 | } | 146 | } |
147 | 147 | ||
148 | /* --------- COLLABORATION FEATURES (USERS) ------------------------------------------------------------------------ */ | 148 | /* --------- COLLABORATION FEATURES (USERS) ------------------------------------------------------------------------ */ |
149 | .row-presence { | 149 | .row-presence { |
150 | width: 100%; | 150 | width: 100%; |
151 | border: 1px solid hsl(0, 0%, 77%); | 151 | border: 1px solid hsl(0, 0%, 77%); |
152 | border-bottom: 0; | 152 | border-bottom: 0; |
153 | background: hsl(0, 0%, 98%); | 153 | background: hsl(0, 0%, 98%); |
154 | padding: var(--ck-spacing-small); | 154 | padding: var(--ck-spacing-small); |
155 | 155 | ||
156 | /* Make `border-bottom` as `box-shadow` to not overlap with the editor border. */ | 156 | /* Make `border-bottom` as `box-shadow` to not overlap with the editor border. */ |
157 | box-shadow: 0 1px 0 0 hsl(0, 0%, 77%); | 157 | box-shadow: 0 1px 0 0 hsl(0, 0%, 77%); |
158 | 158 | ||
159 | /* Make `z-index` bigger than `.editor` to properly display tooltips. */ | 159 | /* Make `z-index` bigger than `.editor` to properly display tooltips. */ |
160 | z-index: 20; | 160 | z-index: 20; |
161 | } | 161 | } |
162 | 162 | ||
163 | .ck.ck-presence-list { | 163 | .ck.ck-presence-list { |
164 | flex: 1; | 164 | flex: 1; |
165 | padding: 1.25rem .75rem; | 165 | padding: 1.25rem .75rem; |
166 | } | 166 | } |
167 | 167 | ||
168 | .presence .ck.ck-presence-list__counter { | 168 | .presence .ck.ck-presence-list__counter { |
169 | order: 2; | 169 | order: 2; |
170 | margin-left: var(--ck-spacing-large) | 170 | margin-left: var(--ck-spacing-large) |
171 | } | 171 | } |
172 | 172 | ||
173 | /* --------- REAL TIME COLLABORATION FEATURES (SHARE TOPBAR CONTAINER) --------------------------------------------- */ | 173 | /* --------- REAL TIME COLLABORATION FEATURES (SHARE TOPBAR CONTAINER) --------------------------------------------- */ |
174 | .collaboration-demo__row { | 174 | .collaboration-demo__row { |
175 | display: flex; | 175 | display: flex; |
176 | position: relative; | 176 | position: relative; |
177 | justify-content: center; | 177 | justify-content: center; |
178 | overflow-y: auto; | 178 | overflow-y: auto; |
179 | background-color: #f2f2f2; | 179 | background-color: #f2f2f2; |
180 | border: 1px solid hsl(0, 0%, 77%); | 180 | border: 1px solid hsl(0, 0%, 77%); |
181 | } | 181 | } |
182 | 182 | ||
183 | body[ data-editor='InlineEditor'] .collaboration-demo__row { | 183 | body[ data-editor='InlineEditor'] .collaboration-demo__row { |
184 | border: 0; | 184 | border: 0; |
185 | } | 185 | } |
186 | 186 | ||
187 | .collaboration-demo__container { | 187 | .collaboration-demo__container { |
188 | max-width: var(--ck-sample-container-width); | 188 | max-width: var(--ck-sample-container-width); |
189 | margin: 0 auto; | 189 | margin: 0 auto; |
190 | padding: 1.25rem; | 190 | padding: 1.25rem; |
191 | } | 191 | } |
192 | 192 | ||
193 | .presence, .collaboration-demo__row { | 193 | .presence, .collaboration-demo__row { |
194 | transition: .2s opacity; | 194 | transition: .2s opacity; |
195 | } | 195 | } |
196 | 196 | ||
197 | .collaboration-demo__topbar { | 197 | .collaboration-demo__topbar { |
198 | background: #fff; | 198 | background: #fff; |
199 | border: 1px solid var(--ck-color-toolbar-border); | 199 | border: 1px solid var(--ck-color-toolbar-border); |
200 | display: flex; | 200 | display: flex; |
201 | justify-content: space-between; | 201 | justify-content: space-between; |
202 | align-items: center; | 202 | align-items: center; |
203 | border-bottom: 0; | 203 | border-bottom: 0; |
204 | border-radius: 4px 4px 0 0; | 204 | border-radius: 4px 4px 0 0; |
205 | } | 205 | } |
206 | 206 | ||
207 | .collaboration-demo__topbar .btn { | 207 | .collaboration-demo__topbar .btn { |
208 | margin-right: 1em; | 208 | margin-right: 1em; |
209 | outline-offset: 2px; | 209 | outline-offset: 2px; |
210 | outline-width: 2px; | 210 | outline-width: 2px; |
211 | background-color: var( --ck-sample-color-blue ); | 211 | background-color: var( --ck-sample-color-blue ); |
212 | } | 212 | } |
213 | 213 | ||
214 | .collaboration-demo__topbar .btn:focus, | 214 | .collaboration-demo__topbar .btn:focus, |
215 | .collaboration-demo__topbar .btn:hover { | 215 | .collaboration-demo__topbar .btn:hover { |
216 | border-color: var( --ck-sample-color-blue ); | 216 | border-color: var( --ck-sample-color-blue ); |
217 | } | 217 | } |
218 | 218 | ||
219 | .collaboration-demo__share { | 219 | .collaboration-demo__share { |
220 | display: flex; | 220 | display: flex; |
221 | align-items: center; | 221 | align-items: center; |
222 | padding: 1.25rem .75rem | 222 | padding: 1.25rem .75rem |
223 | } | 223 | } |
224 | 224 | ||
225 | .collaboration-demo__share-description p { | 225 | .collaboration-demo__share-description p { |
226 | margin: 0; | 226 | margin: 0; |
227 | font-weight: bold; | 227 | font-weight: bold; |
228 | font-size: 0.9em; | 228 | font-size: 0.9em; |
229 | } | 229 | } |
230 | 230 | ||
231 | .collaboration-demo__share input { | 231 | .collaboration-demo__share input { |
232 | height: auto; | 232 | height: auto; |
233 | font-size: 0.9em; | 233 | font-size: 0.9em; |
234 | min-width: 220px; | 234 | min-width: 220px; |
235 | margin: 0 10px; | 235 | margin: 0 10px; |
236 | border-radius: 4px; | 236 | border-radius: 4px; |
237 | border: 1px solid var(--ck-color-toolbar-border) | 237 | border: 1px solid var(--ck-color-toolbar-border) |
238 | } | 238 | } |
239 | 239 | ||
240 | .collaboration-demo__share button, | 240 | .collaboration-demo__share button, |
241 | .collaboration-demo__share input { | 241 | .collaboration-demo__share input { |
242 | height: 40px; | 242 | height: 40px; |
243 | padding: 5px 10px; | 243 | padding: 5px 10px; |
244 | } | 244 | } |
245 | 245 | ||
246 | .collaboration-demo__share button { | 246 | .collaboration-demo__share button { |
247 | position: relative; | 247 | position: relative; |
248 | } | 248 | } |
249 | 249 | ||
250 | .collaboration-demo__share button:focus { | 250 | .collaboration-demo__share button:focus { |
251 | outline: none; | 251 | outline: none; |
252 | } | 252 | } |
253 | 253 | ||
254 | .collaboration-demo__share button[data-tooltip]::before, | 254 | .collaboration-demo__share button[data-tooltip]::before, |
255 | .collaboration-demo__share button[data-tooltip]::after { | 255 | .collaboration-demo__share button[data-tooltip]::after { |
256 | position: absolute; | 256 | position: absolute; |
257 | visibility: hidden; | 257 | visibility: hidden; |
258 | opacity: 0; | 258 | opacity: 0; |
259 | pointer-events: none; | 259 | pointer-events: none; |
260 | transition: all .15s cubic-bezier(.5,1,.25,1); | 260 | transition: all .15s cubic-bezier(.5,1,.25,1); |
261 | z-index: 1; | 261 | z-index: 1; |
262 | } | 262 | } |
263 | 263 | ||
264 | .collaboration-demo__share button[data-tooltip]::before { | 264 | .collaboration-demo__share button[data-tooltip]::before { |
265 | content: attr(data-tooltip); | 265 | content: attr(data-tooltip); |
266 | padding: 5px 15px; | 266 | padding: 5px 15px; |
267 | border-radius: 3px; | 267 | border-radius: 3px; |
268 | background: #111; | 268 | background: #111; |
269 | color: #fff; | 269 | color: #fff; |
270 | text-align: center; | 270 | text-align: center; |
271 | font-size: 11px; | 271 | font-size: 11px; |
272 | top: 100%; | 272 | top: 100%; |
273 | left: 50%; | 273 | left: 50%; |
274 | margin-top: 5px; | 274 | margin-top: 5px; |
275 | transform: translateX(-50%); | 275 | transform: translateX(-50%); |
276 | } | 276 | } |
277 | 277 | ||
278 | .collaboration-demo__share button[data-tooltip]::after { | 278 | .collaboration-demo__share button[data-tooltip]::after { |
279 | content: ''; | 279 | content: ''; |
280 | border: 5px solid transparent; | 280 | border: 5px solid transparent; |
281 | width: 0; | 281 | width: 0; |
282 | font-size: 0; | 282 | font-size: 0; |
283 | line-height: 0; | 283 | line-height: 0; |
284 | top: 100%; | 284 | top: 100%; |
285 | left: 50%; | 285 | left: 50%; |
286 | transform: translateX(-50%); | 286 | transform: translateX(-50%); |
287 | border-bottom: 5px solid #111; | 287 | border-bottom: 5px solid #111; |
288 | border-top: none; | 288 | border-top: none; |
289 | } | 289 | } |
290 | 290 | ||
291 | .collaboration-demo__share button[data-tooltip]:hover:before, | 291 | .collaboration-demo__share button[data-tooltip]:hover:before, |
292 | .collaboration-demo__share button[data-tooltip]:hover:after { | 292 | .collaboration-demo__share button[data-tooltip]:hover:after { |
293 | visibility: visible; | 293 | visibility: visible; |
294 | opacity: 1; | 294 | opacity: 1; |
295 | } | 295 | } |
296 | 296 | ||
297 | .collaboration-demo--ready { | 297 | .collaboration-demo--ready { |
298 | overflow: visible; | 298 | overflow: visible; |
299 | height: auto; | 299 | height: auto; |
300 | } | 300 | } |
301 | 301 | ||
302 | .collaboration-demo--ready .presence, | 302 | .collaboration-demo--ready .presence, |
303 | .collaboration-demo--ready .collaboration-demo__row { | 303 | .collaboration-demo--ready .collaboration-demo__row { |
304 | opacity: 1; | 304 | opacity: 1; |
305 | } | 305 | } |
306 | 306 | ||
307 | /* --------- PAGINATION FEATURE ------------------------------------------------------------------------------------ */ | 307 | /* --------- PAGINATION FEATURE ------------------------------------------------------------------------------------ */ |
308 | 308 | ||
309 | /* Pagination view line must be stacked at least at the same level as the editor, | 309 | /* Pagination view line must be stacked at least at the same level as the editor, |
310 | otherwise it will be hidden underneath. */ | 310 | otherwise it will be hidden underneath. */ |
311 | .ck.ck-pagination-view-line { | 311 | .ck.ck-pagination-view-line { |
312 | z-index: var(--ck-sample-editor-z-index); | 312 | z-index: var(--ck-sample-editor-z-index); |
313 | } | 313 | } |
314 | 314 | ||
315 | /* --------- SAMPLE GENERIC STYLES (not related to CKEditor) ------------------------------------------------------- */ | 315 | /* --------- SAMPLE GENERIC STYLES (not related to CKEditor) ------------------------------------------------------- */ |
316 | body, html { | 316 | body, html { |
317 | padding: 0; | 317 | padding: 0; |
318 | margin: 0; | 318 | margin: 0; |
319 | 319 | ||
320 | font-family: sans-serif, Arial, Verdana, "Trebuchet MS", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; | 320 | font-family: sans-serif, Arial, Verdana, "Trebuchet MS", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; |
321 | font-size: 16px; | 321 | font-size: 16px; |
322 | line-height: 1.5; | 322 | line-height: 1.5; |
323 | } | 323 | } |
324 | 324 | ||
325 | body { | 325 | body { |
326 | height: 100%; | 326 | height: 100%; |
327 | color: #2D3A4A; | 327 | color: #2D3A4A; |
328 | } | 328 | } |
329 | 329 | ||
330 | body * { | 330 | body * { |
331 | box-sizing: border-box; | 331 | box-sizing: border-box; |
332 | } | 332 | } |
333 | 333 | ||
334 | a { | 334 | a { |
335 | color: #38A5EE; | 335 | color: #38A5EE; |
336 | } | 336 | } |
337 | 337 | ||
338 | header .centered { | 338 | header .centered { |
339 | display: flex; | 339 | display: flex; |
340 | flex-flow: row nowrap; | 340 | flex-flow: row nowrap; |
341 | justify-content: space-between; | 341 | justify-content: space-between; |
342 | align-items: center; | 342 | align-items: center; |
343 | min-height: 8em; | 343 | min-height: 8em; |
344 | } | 344 | } |
345 | 345 | ||
346 | header h1 a { | 346 | header h1 a { |
347 | font-size: 20px; | 347 | font-size: 20px; |
348 | display: flex; | 348 | display: flex; |
349 | align-items: center; | 349 | align-items: center; |
350 | color: #2D3A4A; | 350 | color: #2D3A4A; |
351 | text-decoration: none; | 351 | text-decoration: none; |
352 | } | 352 | } |
353 | 353 | ||
354 | header h1 img { | 354 | header h1 img { |
355 | display: block; | 355 | display: block; |
356 | height: 64px; | 356 | height: 64px; |
357 | } | 357 | } |
358 | 358 | ||
359 | header nav ul { | 359 | header nav ul { |
360 | margin: 0; | 360 | margin: 0; |
361 | padding: 0; | 361 | padding: 0; |
362 | list-style-type: none; | 362 | list-style-type: none; |
363 | } | 363 | } |
364 | 364 | ||
365 | header nav ul li { | 365 | header nav ul li { |
366 | display: inline-block; | 366 | display: inline-block; |
367 | } | 367 | } |
368 | 368 | ||
369 | header nav ul li + li { | 369 | header nav ul li + li { |
370 | margin-left: 1em; | 370 | margin-left: 1em; |
371 | } | 371 | } |
372 | 372 | ||
373 | header nav ul li a { | 373 | header nav ul li a { |
374 | font-weight: bold; | 374 | font-weight: bold; |
375 | text-decoration: none; | 375 | text-decoration: none; |
376 | color: #2D3A4A; | 376 | color: #2D3A4A; |
377 | } | 377 | } |
378 | 378 | ||
379 | header nav ul li a:hover { | 379 | header nav ul li a:hover { |
380 | text-decoration: underline; | 380 | text-decoration: underline; |
381 | } | 381 | } |
382 | 382 | ||
383 | main .message { | 383 | main .message { |
384 | padding: 0 0 var(--ck-sample-base-spacing); | 384 | padding: 0 0 var(--ck-sample-base-spacing); |
385 | background: var(--ck-sample-color-green); | 385 | background: var(--ck-sample-color-green); |
386 | color: var(--ck-sample-color-white); | 386 | color: var(--ck-sample-color-white); |
387 | } | 387 | } |
388 | 388 | ||
389 | main .message::after { | 389 | main .message::after { |
390 | content: ""; | 390 | content: ""; |
391 | z-index: -1; | 391 | z-index: -1; |
392 | display: block; | 392 | display: block; |
393 | height: 10em; | 393 | height: 10em; |
394 | width: 100%; | 394 | width: 100%; |
395 | background: var(--ck-sample-color-green); | 395 | background: var(--ck-sample-color-green); |
396 | position: absolute; | 396 | position: absolute; |
397 | left: 0; | 397 | left: 0; |
398 | } | 398 | } |
399 | 399 | ||
400 | main .message h2 { | 400 | main .message h2 { |
401 | position: relative; | 401 | position: relative; |
402 | padding-top: 1em; | 402 | padding-top: 1em; |
403 | font-size: 2em; | 403 | font-size: 2em; |
404 | } | 404 | } |
405 | 405 | ||
406 | .centered { | 406 | .centered { |
407 | /* Hide overlapping comments. */ | 407 | /* Hide overlapping comments. */ |
408 | overflow: hidden; | 408 | overflow: hidden; |
409 | max-width: var(--ck-sample-container-width); | 409 | max-width: var(--ck-sample-container-width); |
410 | margin: 0 auto; | 410 | margin: 0 auto; |
411 | padding: 0 var(--ck-sample-base-spacing); | 411 | padding: 0 var(--ck-sample-base-spacing); |
412 | } | 412 | } |
413 | 413 | ||
414 | .row { | 414 | .row { |
415 | display: flex; | 415 | display: flex; |
416 | position: relative; | 416 | position: relative; |
417 | } | 417 | } |
418 | 418 | ||
419 | .btn { | 419 | .btn { |
420 | cursor: pointer; | 420 | cursor: pointer; |
421 | padding: 8px 16px; | 421 | padding: 8px 16px; |
422 | font-size: 1rem; | 422 | font-size: 1rem; |
423 | user-select: none; | 423 | user-select: none; |
424 | border-radius: 4px; | 424 | border-radius: 4px; |
425 | transition: color .2s ease-in-out,background-color .2s ease-in-out,border-color .2s ease-in-out,opacity .2s ease-in-out; | 425 | transition: color .2s ease-in-out,background-color .2s ease-in-out,border-color .2s ease-in-out,opacity .2s ease-in-out; |
426 | background-color: var(--ck-sample-color-button-blue); | 426 | background-color: var(--ck-sample-color-button-blue); |
427 | border-color: var(--ck-sample-color-button-blue); | 427 | border-color: var(--ck-sample-color-button-blue); |
428 | color: var(--ck-sample-color-white); | 428 | color: var(--ck-sample-color-white); |
429 | display: inline-block; | 429 | display: inline-block; |
430 | } | 430 | } |
431 | 431 | ||
432 | .btn--tiny { | 432 | .btn--tiny { |
433 | padding: 6px 12px; | 433 | padding: 6px 12px; |
434 | font-size: .8rem; | 434 | font-size: .8rem; |
435 | } | 435 | } |
436 | 436 | ||
437 | footer { | 437 | footer { |
438 | margin: calc(2*var(--ck-sample-base-spacing)) var(--ck-sample-base-spacing); | 438 | margin: calc(2*var(--ck-sample-base-spacing)) var(--ck-sample-base-spacing); |
439 | font-size: .8em; | 439 | font-size: .8em; |
440 | text-align: center; | 440 | text-align: center; |
441 | color: rgba(0,0,0,.4); | 441 | color: rgba(0,0,0,.4); |
442 | } | 442 | } |
443 | 443 | ||
444 | /* --------- RWD --------------------------------------------------------------------------------------------------- */ | 444 | /* --------- RWD --------------------------------------------------------------------------------------------------- */ |
445 | @media screen and ( max-width: 800px ) { | 445 | @media screen and ( max-width: 800px ) { |
446 | :root { | 446 | :root { |
447 | --ck-sample-base-spacing: 1em; | 447 | --ck-sample-base-spacing: 1em; |
448 | } | 448 | } |
449 | 449 | ||
450 | header h1 { | 450 | header h1 { |
451 | width: 100%; | 451 | width: 100%; |
452 | } | 452 | } |
453 | 453 | ||
454 | header h1 img { | 454 | header h1 img { |
455 | height: 40px; | 455 | height: 40px; |
456 | } | 456 | } |
457 | 457 | ||
458 | header nav ul { | 458 | header nav ul { |
459 | text-align: right; | 459 | text-align: right; |
460 | } | 460 | } |
461 | 461 | ||
462 | main .message h2 { | 462 | main .message h2 { |
463 | font-size: 1.5em; | 463 | font-size: 1.5em; |
464 | } | 464 | } |
465 | } | 465 | } |
diff --git a/lib/ckeditor5/src/ckeditor.js b/lib/ckeditor5/src/ckeditor.js index 8180b81..f71bb7b 100644 --- a/lib/ckeditor5/src/ckeditor.js +++ b/lib/ckeditor5/src/ckeditor.js | |||
@@ -1,79 +1,79 @@ | |||
1 | /** | 1 | /** |
2 | * @license Copyright (c) 2014-2021, CKSource - Frederico Knabben. All rights reserved. | 2 | * @license Copyright (c) 2014-2021, CKSource - Frederico Knabben. All rights reserved. |
3 | * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license | 3 | * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license |
4 | */ | 4 | */ |
5 | import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor.js'; | 5 | import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor.js'; |
6 | import Alignment from '@ckeditor/ckeditor5-alignment/src/alignment.js'; | 6 | import Alignment from '@ckeditor/ckeditor5-alignment/src/alignment.js'; |
7 | import AutoImage from '@ckeditor/ckeditor5-image/src/autoimage.js'; | 7 | import AutoImage from '@ckeditor/ckeditor5-image/src/autoimage.js'; |
8 | import Autolink from '@ckeditor/ckeditor5-link/src/autolink.js'; | 8 | import Autolink from '@ckeditor/ckeditor5-link/src/autolink.js'; |
9 | import Autosave from '@ckeditor/ckeditor5-autosave/src/autosave.js'; | 9 | import Autosave from '@ckeditor/ckeditor5-autosave/src/autosave.js'; |
10 | import BlockQuote from '@ckeditor/ckeditor5-block-quote/src/blockquote.js'; | 10 | import BlockQuote from '@ckeditor/ckeditor5-block-quote/src/blockquote.js'; |
11 | import Bold from '@ckeditor/ckeditor5-basic-styles/src/bold.js'; | 11 | import Bold from '@ckeditor/ckeditor5-basic-styles/src/bold.js'; |
12 | import Essentials from '@ckeditor/ckeditor5-essentials/src/essentials.js'; | 12 | import Essentials from '@ckeditor/ckeditor5-essentials/src/essentials.js'; |
13 | import FontColor from '@ckeditor/ckeditor5-font/src/fontcolor.js'; | 13 | import FontColor from '@ckeditor/ckeditor5-font/src/fontcolor.js'; |
14 | import FontFamily from '@ckeditor/ckeditor5-font/src/fontfamily.js'; | 14 | import FontFamily from '@ckeditor/ckeditor5-font/src/fontfamily.js'; |
15 | import FontSize from '@ckeditor/ckeditor5-font/src/fontsize.js'; | 15 | import FontSize from '@ckeditor/ckeditor5-font/src/fontsize.js'; |
16 | import Heading from '@ckeditor/ckeditor5-heading/src/heading.js'; | 16 | import Heading from '@ckeditor/ckeditor5-heading/src/heading.js'; |
17 | import Highlight from '@ckeditor/ckeditor5-highlight/src/highlight.js'; | 17 | import Highlight from '@ckeditor/ckeditor5-highlight/src/highlight.js'; |
18 | import HorizontalLine from '@ckeditor/ckeditor5-horizontal-line/src/horizontalline.js'; | 18 | import HorizontalLine from '@ckeditor/ckeditor5-horizontal-line/src/horizontalline.js'; |
19 | import HtmlEmbed from '@ckeditor/ckeditor5-html-embed/src/htmlembed.js'; | 19 | import HtmlEmbed from '@ckeditor/ckeditor5-html-embed/src/htmlembed.js'; |
20 | import Image from '@ckeditor/ckeditor5-image/src/image.js'; | 20 | import Image from '@ckeditor/ckeditor5-image/src/image.js'; |
21 | import ImageCaption from '@ckeditor/ckeditor5-image/src/imagecaption.js'; | 21 | import ImageCaption from '@ckeditor/ckeditor5-image/src/imagecaption.js'; |
22 | import ImageInsert from '@ckeditor/ckeditor5-image/src/imageinsert.js'; | 22 | import ImageInsert from '@ckeditor/ckeditor5-image/src/imageinsert.js'; |
23 | import ImageStyle from '@ckeditor/ckeditor5-image/src/imagestyle.js'; | 23 | import ImageStyle from '@ckeditor/ckeditor5-image/src/imagestyle.js'; |
24 | import ImageToolbar from '@ckeditor/ckeditor5-image/src/imagetoolbar.js'; | 24 | import ImageToolbar from '@ckeditor/ckeditor5-image/src/imagetoolbar.js'; |
25 | import ImageUpload from '@ckeditor/ckeditor5-image/src/imageupload.js'; | 25 | import ImageUpload from '@ckeditor/ckeditor5-image/src/imageupload.js'; |
26 | import Italic from '@ckeditor/ckeditor5-basic-styles/src/italic.js'; | 26 | import Italic from '@ckeditor/ckeditor5-basic-styles/src/italic.js'; |
27 | import Link from '@ckeditor/ckeditor5-link/src/link.js'; | 27 | import Link from '@ckeditor/ckeditor5-link/src/link.js'; |
28 | import LinkImage from '@ckeditor/ckeditor5-link/src/linkimage.js'; | 28 | import LinkImage from '@ckeditor/ckeditor5-link/src/linkimage.js'; |
29 | import List from '@ckeditor/ckeditor5-list/src/list.js'; | 29 | import List from '@ckeditor/ckeditor5-list/src/list.js'; |
30 | import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph.js'; | 30 | import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph.js'; |
31 | import PasteFromOffice from '@ckeditor/ckeditor5-paste-from-office/src/pastefromoffice'; | 31 | import PasteFromOffice from '@ckeditor/ckeditor5-paste-from-office/src/pastefromoffice'; |
32 | import SimpleUploadAdapter from '@ckeditor/ckeditor5-upload/src/adapters/simpleuploadadapter.js'; | 32 | import SimpleUploadAdapter from '@ckeditor/ckeditor5-upload/src/adapters/simpleuploadadapter.js'; |
33 | import Table from '@ckeditor/ckeditor5-table/src/table.js'; | 33 | import Table from '@ckeditor/ckeditor5-table/src/table.js'; |
34 | import TableProperties from '@ckeditor/ckeditor5-table/src/tableproperties'; | 34 | import TableProperties from '@ckeditor/ckeditor5-table/src/tableproperties'; |
35 | import TableToolbar from '@ckeditor/ckeditor5-table/src/tabletoolbar.js'; | 35 | import TableToolbar from '@ckeditor/ckeditor5-table/src/tabletoolbar.js'; |
36 | import TextPartLanguage from '@ckeditor/ckeditor5-language/src/textpartlanguage.js'; | 36 | import TextPartLanguage from '@ckeditor/ckeditor5-language/src/textpartlanguage.js'; |
37 | import TodoList from '@ckeditor/ckeditor5-list/src/todolist'; | 37 | import TodoList from '@ckeditor/ckeditor5-list/src/todolist'; |
38 | import Underline from '@ckeditor/ckeditor5-basic-styles/src/underline.js'; | 38 | import Underline from '@ckeditor/ckeditor5-basic-styles/src/underline.js'; |
39 | 39 | ||
40 | class Editor extends ClassicEditor {} | 40 | class Editor extends ClassicEditor {} |
41 | 41 | ||
42 | // Plugins to include in the build. | 42 | // Plugins to include in the build. |
43 | Editor.builtinPlugins = [ | 43 | Editor.builtinPlugins = [ |
44 | Alignment, | 44 | Alignment, |
45 | AutoImage, | 45 | AutoImage, |
46 | Autolink, | 46 | Autolink, |
47 | Autosave, | 47 | Autosave, |
48 | BlockQuote, | 48 | BlockQuote, |
49 | Bold, | 49 | Bold, |
50 | Essentials, | 50 | Essentials, |
51 | FontColor, | 51 | FontColor, |
52 | FontFamily, | 52 | FontFamily, |
53 | FontSize, | 53 | FontSize, |
54 | Heading, | 54 | Heading, |
55 | Highlight, | 55 | Highlight, |
56 | HorizontalLine, | 56 | HorizontalLine, |
57 | HtmlEmbed, | 57 | HtmlEmbed, |
58 | Image, | 58 | Image, |
59 | ImageCaption, | 59 | ImageCaption, |
60 | ImageInsert, | 60 | ImageInsert, |
61 | ImageStyle, | 61 | ImageStyle, |
62 | ImageToolbar, | 62 | ImageToolbar, |
63 | ImageUpload, | 63 | ImageUpload, |
64 | Italic, | 64 | Italic, |
65 | Link, | 65 | Link, |
66 | LinkImage, | 66 | LinkImage, |
67 | List, | 67 | List, |
68 | Paragraph, | 68 | Paragraph, |
69 | PasteFromOffice, | 69 | PasteFromOffice, |
70 | SimpleUploadAdapter, | 70 | SimpleUploadAdapter, |
71 | Table, | 71 | Table, |
72 | TableProperties, | 72 | TableProperties, |
73 | TableToolbar, | 73 | TableToolbar, |
74 | TextPartLanguage, | 74 | TextPartLanguage, |
75 | TodoList, | 75 | TodoList, |
76 | Underline | 76 | Underline |
77 | ]; | 77 | ]; |
78 | 78 | ||
79 | export default Editor; | 79 | export default Editor; |
diff --git a/lib/ckeditor5/webpack.config.js b/lib/ckeditor5/webpack.config.js index 4c7efd3..4a69362 100644 --- a/lib/ckeditor5/webpack.config.js +++ b/lib/ckeditor5/webpack.config.js | |||
@@ -1,96 +1,96 @@ | |||
1 | /** | 1 | /** |
2 | * @license Copyright (c) 2014-2021, CKSource - Frederico Knabben. All rights reserved. | 2 | * @license Copyright (c) 2014-2021, CKSource - Frederico Knabben. All rights reserved. |
3 | * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license | 3 | * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license |
4 | */ | 4 | */ |
5 | 5 | ||
6 | 'use strict'; | 6 | 'use strict'; |
7 | 7 | ||
8 | /* eslint-env node */ | 8 | /* eslint-env node */ |
9 | 9 | ||
10 | const path = require( 'path' ); | 10 | const path = require( 'path' ); |
11 | const webpack = require( 'webpack' ); | 11 | const webpack = require( 'webpack' ); |
12 | const { bundler, styles } = require( '@ckeditor/ckeditor5-dev-utils' ); | 12 | const { bundler, styles } = require( '@ckeditor/ckeditor5-dev-utils' ); |
13 | const CKEditorWebpackPlugin = require( '@ckeditor/ckeditor5-dev-webpack-plugin' ); | 13 | const CKEditorWebpackPlugin = require( '@ckeditor/ckeditor5-dev-webpack-plugin' ); |
14 | const TerserWebpackPlugin = require( 'terser-webpack-plugin' ); | 14 | const TerserWebpackPlugin = require( 'terser-webpack-plugin' ); |
15 | 15 | ||
16 | module.exports = { | 16 | module.exports = { |
17 | devtool: 'source-map', | 17 | devtool: 'source-map', |
18 | performance: { hints: false }, | 18 | performance: { hints: false }, |
19 | 19 | ||
20 | entry: path.resolve( __dirname, 'src', 'ckeditor.js' ), | 20 | entry: path.resolve( __dirname, 'src', 'ckeditor.js' ), |
21 | 21 | ||
22 | output: { | 22 | output: { |
23 | // The name under which the editor will be exported. | 23 | // The name under which the editor will be exported. |
24 | library: 'ClassicEditor', | 24 | library: 'ClassicEditor', |
25 | 25 | ||
26 | path: path.resolve( __dirname, 'build' ), | 26 | path: path.resolve( __dirname, 'build' ), |
27 | filename: 'ckeditor.js', | 27 | filename: 'ckeditor.js', |
28 | libraryTarget: 'umd', | 28 | libraryTarget: 'umd', |
29 | libraryExport: 'default' | 29 | libraryExport: 'default' |
30 | }, | 30 | }, |
31 | 31 | ||
32 | optimization: { | 32 | optimization: { |
33 | minimizer: [ | 33 | minimizer: [ |
34 | new TerserWebpackPlugin( { | 34 | new TerserWebpackPlugin( { |
35 | sourceMap: true, | 35 | sourceMap: true, |
36 | terserOptions: { | 36 | terserOptions: { |
37 | output: { | 37 | output: { |
38 | // Preserve CKEditor 5 license comments. | 38 | // Preserve CKEditor 5 license comments. |
39 | comments: /^!/ | 39 | comments: /^!/ |
40 | } | 40 | } |
41 | }, | 41 | }, |
42 | extractComments: false | 42 | extractComments: false |
43 | } ) | 43 | } ) |
44 | ] | 44 | ] |
45 | }, | 45 | }, |
46 | 46 | ||
47 | plugins: [ | 47 | plugins: [ |
48 | new CKEditorWebpackPlugin( { | 48 | new CKEditorWebpackPlugin( { |
49 | // UI language. Language codes follow the https://en.wikipedia.org/wiki/ISO_639-1 format. | 49 | // UI language. Language codes follow the https://en.wikipedia.org/wiki/ISO_639-1 format. |
50 | // When changing the built-in language, remember to also change it in the editor's configuration (src/ckeditor.js). | 50 | // When changing the built-in language, remember to also change it in the editor's configuration (src/ckeditor.js). |
51 | language: 'fr', | 51 | language: 'fr', |
52 | additionalLanguages: 'all' | 52 | additionalLanguages: 'all' |
53 | } ), | 53 | } ), |
54 | new webpack.BannerPlugin( { | 54 | new webpack.BannerPlugin( { |
55 | banner: bundler.getLicenseBanner(), | 55 | banner: bundler.getLicenseBanner(), |
56 | raw: true | 56 | raw: true |
57 | } ) | 57 | } ) |
58 | ], | 58 | ], |
59 | 59 | ||
60 | module: { | 60 | module: { |
61 | rules: [ | 61 | rules: [ |
62 | { | 62 | { |
63 | test: /\.svg$/, | 63 | test: /\.svg$/, |
64 | use: [ 'raw-loader' ] | 64 | use: [ 'raw-loader' ] |
65 | }, | 65 | }, |
66 | { | 66 | { |
67 | test: /\.css$/, | 67 | test: /\.css$/, |
68 | use: [ | 68 | use: [ |
69 | { | 69 | { |
70 | loader: 'style-loader', | 70 | loader: 'style-loader', |
71 | options: { | 71 | options: { |
72 | injectType: 'singletonStyleTag', | 72 | injectType: 'singletonStyleTag', |
73 | attributes: { | 73 | attributes: { |
74 | 'data-cke': true | 74 | 'data-cke': true |
75 | } | 75 | } |
76 | } | 76 | } |
77 | }, | 77 | }, |
78 | { | 78 | { |
79 | loader: 'css-loader' | 79 | loader: 'css-loader' |
80 | }, | 80 | }, |
81 | { | 81 | { |
82 | loader: 'postcss-loader', | 82 | loader: 'postcss-loader', |
83 | options: { | 83 | options: { |
84 | postcssOptions: styles.getPostCssConfig( { | 84 | postcssOptions: styles.getPostCssConfig( { |
85 | themeImporter: { | 85 | themeImporter: { |
86 | themePath: require.resolve( '@ckeditor/ckeditor5-theme-lark' ) | 86 | themePath: require.resolve( '@ckeditor/ckeditor5-theme-lark' ) |
87 | }, | 87 | }, |
88 | minify: true | 88 | minify: true |
89 | } ) | 89 | } ) |
90 | } | 90 | } |
91 | }, | 91 | }, |
92 | ] | 92 | ] |
93 | } | 93 | } |
94 | ] | 94 | ] |
95 | } | 95 | } |
96 | }; | 96 | }; |
diff --git a/lib/htmlawed/htmLawed.php b/lib/htmlawed/htmLawed.php index b384d98..a370d76 100755 --- a/lib/htmlawed/htmLawed.php +++ b/lib/htmlawed/htmLawed.php | |||
@@ -1,729 +1,729 @@ | |||
1 | <?php | 1 | <?php |
2 | 2 | ||
3 | /* | 3 | /* |
4 | htmLawed 1.2.5, 24 September 2019 | 4 | htmLawed 1.2.5, 24 September 2019 |
5 | Copyright Santosh Patnaik | 5 | Copyright Santosh Patnaik |
6 | Dual licensed with LGPL 3 and GPL 2+ | 6 | Dual licensed with LGPL 3 and GPL 2+ |
7 | A PHP Labware internal utility - www.bioinformatics.org/phplabware/internal_utilities/htmLawed | 7 | A PHP Labware internal utility - www.bioinformatics.org/phplabware/internal_utilities/htmLawed |
8 | 8 | ||
9 | See htmLawed_README.txt/htm | 9 | See htmLawed_README.txt/htm |
10 | */ | 10 | */ |
11 | 11 | ||
12 | function htmLawed($t, $C=1, $S=array()){ | 12 | function htmLawed($t, $C=1, $S=array()){ |
13 | $C = is_array($C) ? $C : array(); | 13 | $C = is_array($C) ? $C : array(); |
14 | if(!empty($C['valid_xhtml'])){ | 14 | if(!empty($C['valid_xhtml'])){ |
15 | $C['elements'] = empty($C['elements']) ? '*-acronym-big-center-dir-font-isindex-s-strike-tt' : $C['elements']; | 15 | $C['elements'] = empty($C['elements']) ? '*-acronym-big-center-dir-font-isindex-s-strike-tt' : $C['elements']; |
16 | $C['make_tag_strict'] = isset($C['make_tag_strict']) ? $C['make_tag_strict'] : 2; | 16 | $C['make_tag_strict'] = isset($C['make_tag_strict']) ? $C['make_tag_strict'] : 2; |
17 | $C['xml:lang'] = isset($C['xml:lang']) ? $C['xml:lang'] : 2; | 17 | $C['xml:lang'] = isset($C['xml:lang']) ? $C['xml:lang'] : 2; |
18 | } | 18 | } |
19 | // config eles | 19 | // config eles |
20 | $e = array('a'=>1, 'abbr'=>1, 'acronym'=>1, 'address'=>1, 'applet'=>1, 'area'=>1, 'article'=>1, 'aside'=>1, 'audio'=>1, 'b'=>1, 'bdi'=>1, 'bdo'=>1, 'big'=>1, 'blockquote'=>1, 'br'=>1, 'button'=>1, 'canvas'=>1, 'caption'=>1, 'center'=>1, 'cite'=>1, 'code'=>1, 'col'=>1, 'colgroup'=>1, 'command'=>1, 'data'=>1, 'datalist'=>1, 'dd'=>1, 'del'=>1, 'details'=>1, 'dfn'=>1, 'dir'=>1, 'div'=>1, 'dl'=>1, 'dt'=>1, 'em'=>1, 'embed'=>1, 'fieldset'=>1, 'figcaption'=>1, 'figure'=>1, 'font'=>1, 'footer'=>1, 'form'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'header'=>1, 'hgroup'=>1, 'hr'=>1, 'i'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'ins'=>1, 'isindex'=>1, 'kbd'=>1, 'keygen'=>1, 'label'=>1, 'legend'=>1, 'li'=>1, 'link'=>1, 'main'=>1, 'map'=>1, 'mark'=>1, 'menu'=>1, 'meta'=>1, 'meter'=>1, 'nav'=>1, 'noscript'=>1, 'object'=>1, 'ol'=>1, 'optgroup'=>1, 'option'=>1, 'output'=>1, 'p'=>1, 'param'=>1, 'pre'=>1, 'progress'=>1, 'q'=>1, 'rb'=>1, 'rbc'=>1, 'rp'=>1, 'rt'=>1, 'rtc'=>1, 'ruby'=>1, 's'=>1, 'samp'=>1, 'script'=>1, 'section'=>1, 'select'=>1, 'small'=>1, 'source'=>1, 'span'=>1, 'strike'=>1, 'strong'=>1, 'style'=>1, 'sub'=>1, 'summary'=>1, 'sup'=>1, 'table'=>1, 'tbody'=>1, 'td'=>1, 'textarea'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'time'=>1, 'tr'=>1, 'track'=>1, 'tt'=>1, 'u'=>1, 'ul'=>1, 'var'=>1, 'video'=>1, 'wbr'=>1); // 118 incl. deprecated & some Ruby | 20 | $e = array('a'=>1, 'abbr'=>1, 'acronym'=>1, 'address'=>1, 'applet'=>1, 'area'=>1, 'article'=>1, 'aside'=>1, 'audio'=>1, 'b'=>1, 'bdi'=>1, 'bdo'=>1, 'big'=>1, 'blockquote'=>1, 'br'=>1, 'button'=>1, 'canvas'=>1, 'caption'=>1, 'center'=>1, 'cite'=>1, 'code'=>1, 'col'=>1, 'colgroup'=>1, 'command'=>1, 'data'=>1, 'datalist'=>1, 'dd'=>1, 'del'=>1, 'details'=>1, 'dfn'=>1, 'dir'=>1, 'div'=>1, 'dl'=>1, 'dt'=>1, 'em'=>1, 'embed'=>1, 'fieldset'=>1, 'figcaption'=>1, 'figure'=>1, 'font'=>1, 'footer'=>1, 'form'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'header'=>1, 'hgroup'=>1, 'hr'=>1, 'i'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'ins'=>1, 'isindex'=>1, 'kbd'=>1, 'keygen'=>1, 'label'=>1, 'legend'=>1, 'li'=>1, 'link'=>1, 'main'=>1, 'map'=>1, 'mark'=>1, 'menu'=>1, 'meta'=>1, 'meter'=>1, 'nav'=>1, 'noscript'=>1, 'object'=>1, 'ol'=>1, 'optgroup'=>1, 'option'=>1, 'output'=>1, 'p'=>1, 'param'=>1, 'pre'=>1, 'progress'=>1, 'q'=>1, 'rb'=>1, 'rbc'=>1, 'rp'=>1, 'rt'=>1, 'rtc'=>1, 'ruby'=>1, 's'=>1, 'samp'=>1, 'script'=>1, 'section'=>1, 'select'=>1, 'small'=>1, 'source'=>1, 'span'=>1, 'strike'=>1, 'strong'=>1, 'style'=>1, 'sub'=>1, 'summary'=>1, 'sup'=>1, 'table'=>1, 'tbody'=>1, 'td'=>1, 'textarea'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'time'=>1, 'tr'=>1, 'track'=>1, 'tt'=>1, 'u'=>1, 'ul'=>1, 'var'=>1, 'video'=>1, 'wbr'=>1); // 118 incl. deprecated & some Ruby |
21 | 21 | ||
22 | if(!empty($C['safe'])){ | 22 | if(!empty($C['safe'])){ |
23 | unset($e['applet'], $e['audio'], $e['canvas'], $e['embed'], $e['iframe'], $e['object'], $e['script'], $e['video']); | 23 | unset($e['applet'], $e['audio'], $e['canvas'], $e['embed'], $e['iframe'], $e['object'], $e['script'], $e['video']); |
24 | } | 24 | } |
25 | $x = !empty($C['elements']) ? str_replace(array("\n", "\r", "\t", ' '), '', $C['elements']) : '*'; | 25 | $x = !empty($C['elements']) ? str_replace(array("\n", "\r", "\t", ' '), '', $C['elements']) : '*'; |
26 | if($x == '-*'){$e = array();} | 26 | if($x == '-*'){$e = array();} |
27 | elseif(strpos($x, '*') === false){$e = array_flip(explode(',', $x));} | 27 | elseif(strpos($x, '*') === false){$e = array_flip(explode(',', $x));} |
28 | else{ | 28 | else{ |
29 | if(isset($x[1])){ | 29 | if(isset($x[1])){ |
30 | preg_match_all('`(?:^|-|\+)[^\-+]+?(?=-|\+|$)`', $x, $m, PREG_SET_ORDER); | 30 | preg_match_all('`(?:^|-|\+)[^\-+]+?(?=-|\+|$)`', $x, $m, PREG_SET_ORDER); |
31 | for($i=count($m); --$i>=0;){$m[$i] = $m[$i][0];} | 31 | for($i=count($m); --$i>=0;){$m[$i] = $m[$i][0];} |
32 | foreach($m as $v){ | 32 | foreach($m as $v){ |
33 | if($v[0] == '+'){$e[substr($v, 1)] = 1;} | 33 | if($v[0] == '+'){$e[substr($v, 1)] = 1;} |
34 | if($v[0] == '-' && isset($e[($v = substr($v, 1))]) && !in_array('+'. $v, $m)){unset($e[$v]);} | 34 | if($v[0] == '-' && isset($e[($v = substr($v, 1))]) && !in_array('+'. $v, $m)){unset($e[$v]);} |
35 | } | 35 | } |
36 | } | 36 | } |
37 | } | 37 | } |
38 | $C['elements'] =& $e; | 38 | $C['elements'] =& $e; |
39 | // config attrs | 39 | // config attrs |
40 | $x = !empty($C['deny_attribute']) ? strtolower(str_replace(array("\n", "\r", "\t", ' '), '', $C['deny_attribute'])) : ''; | 40 | $x = !empty($C['deny_attribute']) ? strtolower(str_replace(array("\n", "\r", "\t", ' '), '', $C['deny_attribute'])) : ''; |
41 | $x = array_flip((isset($x[0]) && $x[0] == '*') ? str_replace('/', 'data-', explode('-', str_replace('data-', '/', $x))) : explode(',', $x. (!empty($C['safe']) ? ',on*' : ''))); | 41 | $x = array_flip((isset($x[0]) && $x[0] == '*') ? str_replace('/', 'data-', explode('-', str_replace('data-', '/', $x))) : explode(',', $x. (!empty($C['safe']) ? ',on*' : ''))); |
42 | $C['deny_attribute'] = $x; | 42 | $C['deny_attribute'] = $x; |
43 | // config URLs | 43 | // config URLs |
44 | $x = (isset($C['schemes'][2]) && strpos($C['schemes'], ':')) ? strtolower($C['schemes']) : 'href: aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, tel, telnet'. (empty($C['safe']) ? ', app, javascript; *: data, javascript, ' : '; *:'). 'file, http, https'; | 44 | $x = (isset($C['schemes'][2]) && strpos($C['schemes'], ':')) ? strtolower($C['schemes']) : 'href: aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, tel, telnet'. (empty($C['safe']) ? ', app, javascript; *: data, javascript, ' : '; *:'). 'file, http, https'; |
45 | $C['schemes'] = array(); | 45 | $C['schemes'] = array(); |
46 | foreach(explode(';', trim(str_replace(array(' ', "\t", "\r", "\n"), '', $x), ';')) as $v){ | 46 | foreach(explode(';', trim(str_replace(array(' ', "\t", "\r", "\n"), '', $x), ';')) as $v){ |
47 | $x = $x2 = null; list($x, $x2) = explode(':', $v, 2); | 47 | $x = $x2 = null; list($x, $x2) = explode(':', $v, 2); |
48 | if($x2){$C['schemes'][$x] = array_flip(explode(',', $x2));} | 48 | if($x2){$C['schemes'][$x] = array_flip(explode(',', $x2));} |
49 | } | 49 | } |
50 | if(!isset($C['schemes']['*'])){ | 50 | if(!isset($C['schemes']['*'])){ |
51 | $C['schemes']['*'] = array('file'=>1, 'http'=>1, 'https'=>1); | 51 | $C['schemes']['*'] = array('file'=>1, 'http'=>1, 'https'=>1); |
52 | if(empty($C['safe'])){$C['schemes']['*'] += array('data'=>1, 'javascript'=>1);} | 52 | if(empty($C['safe'])){$C['schemes']['*'] += array('data'=>1, 'javascript'=>1);} |
53 | } | 53 | } |
54 | if(!empty($C['safe']) && empty($C['schemes']['style'])){$C['schemes']['style'] = array('!'=>1);} | 54 | if(!empty($C['safe']) && empty($C['schemes']['style'])){$C['schemes']['style'] = array('!'=>1);} |
55 | $C['abs_url'] = isset($C['abs_url']) ? $C['abs_url'] : 0; | 55 | $C['abs_url'] = isset($C['abs_url']) ? $C['abs_url'] : 0; |
56 | if(!isset($C['base_url']) or !preg_match('`^[a-zA-Z\d.+\-]+://[^/]+/(.+?/)?$`', $C['base_url'])){ | 56 | if(!isset($C['base_url']) or !preg_match('`^[a-zA-Z\d.+\-]+://[^/]+/(.+?/)?$`', $C['base_url'])){ |
57 | $C['base_url'] = $C['abs_url'] = 0; | 57 | $C['base_url'] = $C['abs_url'] = 0; |
58 | } | 58 | } |
59 | // config rest | 59 | // config rest |
60 | $C['and_mark'] = empty($C['and_mark']) ? 0 : 1; | 60 | $C['and_mark'] = empty($C['and_mark']) ? 0 : 1; |
61 | $C['anti_link_spam'] = (isset($C['anti_link_spam']) && is_array($C['anti_link_spam']) && count($C['anti_link_spam']) == 2 && (empty($C['anti_link_spam'][0]) or hl_regex($C['anti_link_spam'][0])) && (empty($C['anti_link_spam'][1]) or hl_regex($C['anti_link_spam'][1]))) ? $C['anti_link_spam'] : 0; | 61 | $C['anti_link_spam'] = (isset($C['anti_link_spam']) && is_array($C['anti_link_spam']) && count($C['anti_link_spam']) == 2 && (empty($C['anti_link_spam'][0]) or hl_regex($C['anti_link_spam'][0])) && (empty($C['anti_link_spam'][1]) or hl_regex($C['anti_link_spam'][1]))) ? $C['anti_link_spam'] : 0; |
62 | $C['anti_mail_spam'] = isset($C['anti_mail_spam']) ? $C['anti_mail_spam'] : 0; | 62 | $C['anti_mail_spam'] = isset($C['anti_mail_spam']) ? $C['anti_mail_spam'] : 0; |
63 | $C['balance'] = isset($C['balance']) ? (bool)$C['balance'] : 1; | 63 | $C['balance'] = isset($C['balance']) ? (bool)$C['balance'] : 1; |
64 | $C['cdata'] = isset($C['cdata']) ? $C['cdata'] : (empty($C['safe']) ? 3 : 0); | 64 | $C['cdata'] = isset($C['cdata']) ? $C['cdata'] : (empty($C['safe']) ? 3 : 0); |
65 | $C['clean_ms_char'] = empty($C['clean_ms_char']) ? 0 : $C['clean_ms_char']; | 65 | $C['clean_ms_char'] = empty($C['clean_ms_char']) ? 0 : $C['clean_ms_char']; |
66 | $C['comment'] = isset($C['comment']) ? $C['comment'] : (empty($C['safe']) ? 3 : 0); | 66 | $C['comment'] = isset($C['comment']) ? $C['comment'] : (empty($C['safe']) ? 3 : 0); |
67 | $C['css_expression'] = empty($C['css_expression']) ? 0 : 1; | 67 | $C['css_expression'] = empty($C['css_expression']) ? 0 : 1; |
68 | $C['direct_list_nest'] = empty($C['direct_list_nest']) ? 0 : 1; | 68 | $C['direct_list_nest'] = empty($C['direct_list_nest']) ? 0 : 1; |
69 | $C['hexdec_entity'] = isset($C['hexdec_entity']) ? $C['hexdec_entity'] : 1; | 69 | $C['hexdec_entity'] = isset($C['hexdec_entity']) ? $C['hexdec_entity'] : 1; |
70 | $C['hook'] = (!empty($C['hook']) && function_exists($C['hook'])) ? $C['hook'] : 0; | 70 | $C['hook'] = (!empty($C['hook']) && function_exists($C['hook'])) ? $C['hook'] : 0; |
71 | $C['hook_tag'] = (!empty($C['hook_tag']) && function_exists($C['hook_tag'])) ? $C['hook_tag'] : 0; | 71 | $C['hook_tag'] = (!empty($C['hook_tag']) && function_exists($C['hook_tag'])) ? $C['hook_tag'] : 0; |
72 | $C['keep_bad'] = isset($C['keep_bad']) ? $C['keep_bad'] : 6; | 72 | $C['keep_bad'] = isset($C['keep_bad']) ? $C['keep_bad'] : 6; |
73 | $C['lc_std_val'] = isset($C['lc_std_val']) ? (bool)$C['lc_std_val'] : 1; | 73 | $C['lc_std_val'] = isset($C['lc_std_val']) ? (bool)$C['lc_std_val'] : 1; |
74 | $C['make_tag_strict'] = isset($C['make_tag_strict']) ? $C['make_tag_strict'] : 1; | 74 | $C['make_tag_strict'] = isset($C['make_tag_strict']) ? $C['make_tag_strict'] : 1; |
75 | $C['named_entity'] = isset($C['named_entity']) ? (bool)$C['named_entity'] : 1; | 75 | $C['named_entity'] = isset($C['named_entity']) ? (bool)$C['named_entity'] : 1; |
76 | $C['no_deprecated_attr'] = isset($C['no_deprecated_attr']) ? $C['no_deprecated_attr'] : 1; | 76 | $C['no_deprecated_attr'] = isset($C['no_deprecated_attr']) ? $C['no_deprecated_attr'] : 1; |
77 | $C['parent'] = isset($C['parent'][0]) ? strtolower($C['parent']) : 'body'; | 77 | $C['parent'] = isset($C['parent'][0]) ? strtolower($C['parent']) : 'body'; |
78 | $C['show_setting'] = !empty($C['show_setting']) ? $C['show_setting'] : 0; | 78 | $C['show_setting'] = !empty($C['show_setting']) ? $C['show_setting'] : 0; |
79 | $C['style_pass'] = empty($C['style_pass']) ? 0 : 1; | 79 | $C['style_pass'] = empty($C['style_pass']) ? 0 : 1; |
80 | $C['tidy'] = empty($C['tidy']) ? 0 : $C['tidy']; | 80 | $C['tidy'] = empty($C['tidy']) ? 0 : $C['tidy']; |
81 | $C['unique_ids'] = isset($C['unique_ids']) && (!preg_match('`\W`', $C['unique_ids'])) ? $C['unique_ids'] : 1; | 81 | $C['unique_ids'] = isset($C['unique_ids']) && (!preg_match('`\W`', $C['unique_ids'])) ? $C['unique_ids'] : 1; |
82 | $C['xml:lang'] = isset($C['xml:lang']) ? $C['xml:lang'] : 0; | 82 | $C['xml:lang'] = isset($C['xml:lang']) ? $C['xml:lang'] : 0; |
83 | 83 | ||
84 | if(isset($GLOBALS['C'])){$reC = $GLOBALS['C'];} | 84 | if(isset($GLOBALS['C'])){$reC = $GLOBALS['C'];} |
85 | $GLOBALS['C'] = $C; | 85 | $GLOBALS['C'] = $C; |
86 | $S = is_array($S) ? $S : hl_spec($S); | 86 | $S = is_array($S) ? $S : hl_spec($S); |
87 | if(isset($GLOBALS['S'])){$reS = $GLOBALS['S'];} | 87 | if(isset($GLOBALS['S'])){$reS = $GLOBALS['S'];} |
88 | $GLOBALS['S'] = $S; | 88 | $GLOBALS['S'] = $S; |
89 | 89 | ||
90 | $t = preg_replace('`[\x00-\x08\x0b-\x0c\x0e-\x1f]`', '', $t); | 90 | $t = preg_replace('`[\x00-\x08\x0b-\x0c\x0e-\x1f]`', '', $t); |
91 | if($C['clean_ms_char']){ | 91 | if($C['clean_ms_char']){ |
92 | $x = array("\x7f"=>'', "\x80"=>'€', "\x81"=>'', "\x83"=>'ƒ', "\x85"=>'…', "\x86"=>'†', "\x87"=>'‡', "\x88"=>'ˆ', "\x89"=>'‰', "\x8a"=>'Š', "\x8b"=>'‹', "\x8c"=>'Œ', "\x8d"=>'', "\x8e"=>'Ž', "\x8f"=>'', "\x90"=>'', "\x95"=>'•', "\x96"=>'–', "\x97"=>'—', "\x98"=>'˜', "\x99"=>'™', "\x9a"=>'š', "\x9b"=>'›', "\x9c"=>'œ', "\x9d"=>'', "\x9e"=>'ž', "\x9f"=>'Ÿ'); | 92 | $x = array("\x7f"=>'', "\x80"=>'€', "\x81"=>'', "\x83"=>'ƒ', "\x85"=>'…', "\x86"=>'†', "\x87"=>'‡', "\x88"=>'ˆ', "\x89"=>'‰', "\x8a"=>'Š', "\x8b"=>'‹', "\x8c"=>'Œ', "\x8d"=>'', "\x8e"=>'Ž', "\x8f"=>'', "\x90"=>'', "\x95"=>'•', "\x96"=>'–', "\x97"=>'—', "\x98"=>'˜', "\x99"=>'™', "\x9a"=>'š', "\x9b"=>'›', "\x9c"=>'œ', "\x9d"=>'', "\x9e"=>'ž', "\x9f"=>'Ÿ'); |
93 | $x = $x + ($C['clean_ms_char'] == 1 ? array("\x82"=>'‚', "\x84"=>'„', "\x91"=>'‘', "\x92"=>'’', "\x93"=>'“', "\x94"=>'”') : array("\x82"=>'\'', "\x84"=>'"', "\x91"=>'\'', "\x92"=>'\'', "\x93"=>'"', "\x94"=>'"')); | 93 | $x = $x + ($C['clean_ms_char'] == 1 ? array("\x82"=>'‚', "\x84"=>'„', "\x91"=>'‘', "\x92"=>'’', "\x93"=>'“', "\x94"=>'”') : array("\x82"=>'\'', "\x84"=>'"', "\x91"=>'\'', "\x92"=>'\'', "\x93"=>'"', "\x94"=>'"')); |
94 | $t = strtr($t, $x); | 94 | $t = strtr($t, $x); |
95 | } | 95 | } |
96 | if($C['cdata'] or $C['comment']){$t = preg_replace_callback('`<!(?:(?:--.*?--)|(?:\[CDATA\[.*?\]\]))>`sm', 'hl_cmtcd', $t);} | 96 | if($C['cdata'] or $C['comment']){$t = preg_replace_callback('`<!(?:(?:--.*?--)|(?:\[CDATA\[.*?\]\]))>`sm', 'hl_cmtcd', $t);} |
97 | $t = preg_replace_callback('`&([a-zA-Z][a-zA-Z0-9]{1,30}|#(?:[0-9]{1,8}|[Xx][0-9A-Fa-f]{1,7}));`', 'hl_ent', str_replace('&', '&', $t)); | 97 | $t = preg_replace_callback('`&([a-zA-Z][a-zA-Z0-9]{1,30}|#(?:[0-9]{1,8}|[Xx][0-9A-Fa-f]{1,7}));`', 'hl_ent', str_replace('&', '&', $t)); |
98 | if($C['unique_ids'] && !isset($GLOBALS['hl_Ids'])){$GLOBALS['hl_Ids'] = array();} | 98 | if($C['unique_ids'] && !isset($GLOBALS['hl_Ids'])){$GLOBALS['hl_Ids'] = array();} |
99 | if($C['hook']){$t = $C['hook']($t, $C, $S);} | 99 | if($C['hook']){$t = $C['hook']($t, $C, $S);} |
100 | if($C['show_setting'] && preg_match('`^[a-z][a-z0-9_]*$`i', $C['show_setting'])){ | 100 | if($C['show_setting'] && preg_match('`^[a-z][a-z0-9_]*$`i', $C['show_setting'])){ |
101 | $GLOBALS[$C['show_setting']] = array('config'=>$C, 'spec'=>$S, 'time'=>microtime()); | 101 | $GLOBALS[$C['show_setting']] = array('config'=>$C, 'spec'=>$S, 'time'=>microtime()); |
102 | } | 102 | } |
103 | // main | 103 | // main |
104 | $t = preg_replace_callback('`<(?:(?:\s|$)|(?:[^>]*(?:>|$)))|>`m', 'hl_tag', $t); | 104 | $t = preg_replace_callback('`<(?:(?:\s|$)|(?:[^>]*(?:>|$)))|>`m', 'hl_tag', $t); |
105 | $t = $C['balance'] ? hl_bal($t, $C['keep_bad'], $C['parent']) : $t; | 105 | $t = $C['balance'] ? hl_bal($t, $C['keep_bad'], $C['parent']) : $t; |
106 | $t = (($C['cdata'] or $C['comment']) && strpos($t, "\x01") !== false) ? str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05"), array('', '', '&', '<', '>'), $t) : $t; | 106 | $t = (($C['cdata'] or $C['comment']) && strpos($t, "\x01") !== false) ? str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05"), array('', '', '&', '<', '>'), $t) : $t; |
107 | $t = $C['tidy'] ? hl_tidy($t, $C['tidy'], $C['parent']) : $t; | 107 | $t = $C['tidy'] ? hl_tidy($t, $C['tidy'], $C['parent']) : $t; |
108 | unset($C, $e); | 108 | unset($C, $e); |
109 | if(isset($reC)){$GLOBALS['C'] = $reC;} | 109 | if(isset($reC)){$GLOBALS['C'] = $reC;} |
110 | if(isset($reS)){$GLOBALS['S'] = $reS;} | 110 | if(isset($reS)){$GLOBALS['S'] = $reS;} |
111 | return $t; | 111 | return $t; |
112 | } | 112 | } |
113 | 113 | ||
114 | function hl_attrval($a, $t, $p){ | 114 | function hl_attrval($a, $t, $p){ |
115 | // check attr val against $S | 115 | // check attr val against $S |
116 | static $ma = array('accesskey', 'class', 'itemtype', 'rel'); | 116 | static $ma = array('accesskey', 'class', 'itemtype', 'rel'); |
117 | $s = in_array($a, $ma) ? ' ' : ($a == 'srcset' ? ',': ''); | 117 | $s = in_array($a, $ma) ? ' ' : ($a == 'srcset' ? ',': ''); |
118 | $r = array(); | 118 | $r = array(); |
119 | $t = !empty($s) ? explode($s, $t) : array($t); | 119 | $t = !empty($s) ? explode($s, $t) : array($t); |
120 | foreach($t as $tk=>$tv){ | 120 | foreach($t as $tk=>$tv){ |
121 | $o = 1; $tv = trim($tv); $l = strlen($tv); | 121 | $o = 1; $tv = trim($tv); $l = strlen($tv); |
122 | foreach($p as $k=>$v){ | 122 | foreach($p as $k=>$v){ |
123 | if(!$l){continue;} | 123 | if(!$l){continue;} |
124 | switch($k){ | 124 | switch($k){ |
125 | case 'maxlen': if($l > $v){$o = 0;} | 125 | case 'maxlen': if($l > $v){$o = 0;} |
126 | break; case 'minlen': if($l < $v){$o = 0;} | 126 | break; case 'minlen': if($l < $v){$o = 0;} |
127 | break; case 'maxval': if((float)($tv) > $v){$o = 0;} | 127 | break; case 'maxval': if((float)($tv) > $v){$o = 0;} |
128 | break; case 'minval': if((float)($tv) < $v){$o = 0;} | 128 | break; case 'minval': if((float)($tv) < $v){$o = 0;} |
129 | break; case 'match': if(!preg_match($v, $tv)){$o = 0;} | 129 | break; case 'match': if(!preg_match($v, $tv)){$o = 0;} |
130 | break; case 'nomatch': if(preg_match($v, $tv)){$o = 0;} | 130 | break; case 'nomatch': if(preg_match($v, $tv)){$o = 0;} |
131 | break; case 'oneof': | 131 | break; case 'oneof': |
132 | $m = 0; | 132 | $m = 0; |
133 | foreach(explode('|', $v) as $n){if($tv == $n){$m = 1; break;}} | 133 | foreach(explode('|', $v) as $n){if($tv == $n){$m = 1; break;}} |
134 | $o = $m; | 134 | $o = $m; |
135 | break; case 'noneof': | 135 | break; case 'noneof': |
136 | $m = 1; | 136 | $m = 1; |
137 | foreach(explode('|', $v) as $n){if($tv == $n){$m = 0; break;}} | 137 | foreach(explode('|', $v) as $n){if($tv == $n){$m = 0; break;}} |
138 | $o = $m; | 138 | $o = $m; |
139 | break; default: | 139 | break; default: |
140 | break; | 140 | break; |
141 | } | 141 | } |
142 | if(!$o){break;} | 142 | if(!$o){break;} |
143 | } | 143 | } |
144 | if($o){$r[] = $tv;} | 144 | if($o){$r[] = $tv;} |
145 | } | 145 | } |
146 | if($s == ','){$s = ', ';} | 146 | if($s == ','){$s = ', ';} |
147 | $r = implode($s, $r); | 147 | $r = implode($s, $r); |
148 | return (isset($r[0]) ? $r : (isset($p['default']) ? $p['default'] : 0)); | 148 | return (isset($r[0]) ? $r : (isset($p['default']) ? $p['default'] : 0)); |
149 | } | 149 | } |
150 | 150 | ||
151 | function hl_bal($t, $do=1, $in='div'){ | 151 | function hl_bal($t, $do=1, $in='div'){ |
152 | // balance tags | 152 | // balance tags |
153 | // by content | 153 | // by content |
154 | $cB = array('blockquote'=>1, 'form'=>1, 'map'=>1, 'noscript'=>1); // Block | 154 | $cB = array('blockquote'=>1, 'form'=>1, 'map'=>1, 'noscript'=>1); // Block |
155 | $cE = array('area'=>1, 'br'=>1, 'col'=>1, 'command'=>1, 'embed'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'isindex'=>1, 'keygen'=>1, 'link'=>1, 'meta'=>1, 'param'=>1, 'source'=>1, 'track'=>1, 'wbr'=>1); // Empty | 155 | $cE = array('area'=>1, 'br'=>1, 'col'=>1, 'command'=>1, 'embed'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'isindex'=>1, 'keygen'=>1, 'link'=>1, 'meta'=>1, 'param'=>1, 'source'=>1, 'track'=>1, 'wbr'=>1); // Empty |
156 | $cF = array('a'=>1, 'article'=>1, 'aside'=>1, 'audio'=>1, 'button'=>1, 'canvas'=>1, 'del'=>1, 'details'=>1, 'div'=>1, 'dd'=>1, 'fieldset'=>1, 'figure'=>1, 'footer'=>1, 'header'=>1, 'iframe'=>1, 'ins'=>1, 'li'=>1, 'main'=>1, 'menu'=>1, 'nav'=>1, 'noscript'=>1, 'object'=>1, 'section'=>1, 'style'=>1, 'td'=>1, 'th'=>1, 'video'=>1); // Flow; later context-wise dynamic move of ins & del to $cI | 156 | $cF = array('a'=>1, 'article'=>1, 'aside'=>1, 'audio'=>1, 'button'=>1, 'canvas'=>1, 'del'=>1, 'details'=>1, 'div'=>1, 'dd'=>1, 'fieldset'=>1, 'figure'=>1, 'footer'=>1, 'header'=>1, 'iframe'=>1, 'ins'=>1, 'li'=>1, 'main'=>1, 'menu'=>1, 'nav'=>1, 'noscript'=>1, 'object'=>1, 'section'=>1, 'style'=>1, 'td'=>1, 'th'=>1, 'video'=>1); // Flow; later context-wise dynamic move of ins & del to $cI |
157 | $cI = array('abbr'=>1, 'acronym'=>1, 'address'=>1, 'b'=>1, 'bdi'=>1, 'bdo'=>1, 'big'=>1, 'caption'=>1, 'cite'=>1, 'code'=>1, 'data'=>1, 'datalist'=>1, 'dfn'=>1, 'dt'=>1, 'em'=>1, 'figcaption'=>1, 'font'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'hgroup'=>1, 'i'=>1, 'kbd'=>1, 'label'=>1, 'legend'=>1, 'mark'=>1, 'meter'=>1, 'output'=>1, 'p'=>1, 'pre'=>1, 'progress'=>1, 'q'=>1, 'rb'=>1, 'rt'=>1, 's'=>1, 'samp'=>1, 'small'=>1, 'span'=>1, 'strike'=>1, 'strong'=>1, 'sub'=>1, 'summary'=>1, 'sup'=>1, 'time'=>1, 'tt'=>1, 'u'=>1, 'var'=>1); // Inline | 157 | $cI = array('abbr'=>1, 'acronym'=>1, 'address'=>1, 'b'=>1, 'bdi'=>1, 'bdo'=>1, 'big'=>1, 'caption'=>1, 'cite'=>1, 'code'=>1, 'data'=>1, 'datalist'=>1, 'dfn'=>1, 'dt'=>1, 'em'=>1, 'figcaption'=>1, 'font'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'hgroup'=>1, 'i'=>1, 'kbd'=>1, 'label'=>1, 'legend'=>1, 'mark'=>1, 'meter'=>1, 'output'=>1, 'p'=>1, 'pre'=>1, 'progress'=>1, 'q'=>1, 'rb'=>1, 'rt'=>1, 's'=>1, 'samp'=>1, 'small'=>1, 'span'=>1, 'strike'=>1, 'strong'=>1, 'sub'=>1, 'summary'=>1, 'sup'=>1, 'time'=>1, 'tt'=>1, 'u'=>1, 'var'=>1); // Inline |
158 | $cN = array('a'=>array('a'=>1, 'address'=>1, 'button'=>1, 'details'=>1, 'embed'=>1, 'keygen'=>1, 'label'=>1, 'select'=>1, 'textarea'=>1), 'address'=>array('address'=>1, 'article'=>1, 'aside'=>1, 'header'=>1, 'keygen'=>1, 'footer'=>1, 'nav'=>1, 'section'=>1), 'button'=>array('a'=>1, 'address'=>1, 'button'=>1, 'details'=>1, 'embed'=>1, 'fieldset'=>1, 'form'=>1, 'iframe'=>1, 'input'=>1, 'keygen'=>1, 'label'=>1, 'select'=>1, 'textarea'=>1), 'fieldset'=>array('fieldset'=>1), 'footer'=>array('header'=>1, 'footer'=>1), 'form'=>array('form'=>1), 'header'=>array('header'=>1, 'footer'=>1), 'label'=>array('label'=>1), 'main'=>array('main'=>1), 'meter'=>array('meter'=>1), 'noscript'=>array('script'=>1), 'pre'=>array('big'=>1, 'font'=>1, 'img'=>1, 'object'=>1, 'script'=>1, 'small'=>1, 'sub'=>1, 'sup'=>1), 'progress'=>array('progress'=>1), 'rb'=>array('ruby'=>1), 'rt'=>array('ruby'=>1), 'time'=>array('time'=>1), ); // Illegal | 158 | $cN = array('a'=>array('a'=>1, 'address'=>1, 'button'=>1, 'details'=>1, 'embed'=>1, 'keygen'=>1, 'label'=>1, 'select'=>1, 'textarea'=>1), 'address'=>array('address'=>1, 'article'=>1, 'aside'=>1, 'header'=>1, 'keygen'=>1, 'footer'=>1, 'nav'=>1, 'section'=>1), 'button'=>array('a'=>1, 'address'=>1, 'button'=>1, 'details'=>1, 'embed'=>1, 'fieldset'=>1, 'form'=>1, 'iframe'=>1, 'input'=>1, 'keygen'=>1, 'label'=>1, 'select'=>1, 'textarea'=>1), 'fieldset'=>array('fieldset'=>1), 'footer'=>array('header'=>1, 'footer'=>1), 'form'=>array('form'=>1), 'header'=>array('header'=>1, 'footer'=>1), 'label'=>array('label'=>1), 'main'=>array('main'=>1), 'meter'=>array('meter'=>1), 'noscript'=>array('script'=>1), 'pre'=>array('big'=>1, 'font'=>1, 'img'=>1, 'object'=>1, 'script'=>1, 'small'=>1, 'sub'=>1, 'sup'=>1), 'progress'=>array('progress'=>1), 'rb'=>array('ruby'=>1), 'rt'=>array('ruby'=>1), 'time'=>array('time'=>1), ); // Illegal |
159 | $cN2 = array_keys($cN); | 159 | $cN2 = array_keys($cN); |
160 | $cS = array('colgroup'=>array('col'=>1), 'datalist'=>array('option'=>1), 'dir'=>array('li'=>1), 'dl'=>array('dd'=>1, 'dt'=>1), 'hgroup'=>array('h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1), 'menu'=>array('li'=>1), 'ol'=>array('li'=>1), 'optgroup'=>array('option'=>1), 'option'=>array('#pcdata'=>1), 'rbc'=>array('rb'=>1), 'rp'=>array('#pcdata'=>1), 'rtc'=>array('rt'=>1), 'ruby'=>array('rb'=>1, 'rbc'=>1, 'rp'=>1, 'rt'=>1, 'rtc'=>1), 'select'=>array('optgroup'=>1, 'option'=>1), 'script'=>array('#pcdata'=>1), 'table'=>array('caption'=>1, 'col'=>1, 'colgroup'=>1, 'tfoot'=>1, 'tbody'=>1, 'tr'=>1, 'thead'=>1), 'tbody'=>array('tr'=>1), 'tfoot'=>array('tr'=>1), 'textarea'=>array('#pcdata'=>1), 'thead'=>array('tr'=>1), 'tr'=>array('td'=>1, 'th'=>1), 'ul'=>array('li'=>1)); // Specific - immediate parent-child | 160 | $cS = array('colgroup'=>array('col'=>1), 'datalist'=>array('option'=>1), 'dir'=>array('li'=>1), 'dl'=>array('dd'=>1, 'dt'=>1), 'hgroup'=>array('h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1), 'menu'=>array('li'=>1), 'ol'=>array('li'=>1), 'optgroup'=>array('option'=>1), 'option'=>array('#pcdata'=>1), 'rbc'=>array('rb'=>1), 'rp'=>array('#pcdata'=>1), 'rtc'=>array('rt'=>1), 'ruby'=>array('rb'=>1, 'rbc'=>1, 'rp'=>1, 'rt'=>1, 'rtc'=>1), 'select'=>array('optgroup'=>1, 'option'=>1), 'script'=>array('#pcdata'=>1), 'table'=>array('caption'=>1, 'col'=>1, 'colgroup'=>1, 'tfoot'=>1, 'tbody'=>1, 'tr'=>1, 'thead'=>1), 'tbody'=>array('tr'=>1), 'tfoot'=>array('tr'=>1), 'textarea'=>array('#pcdata'=>1), 'thead'=>array('tr'=>1), 'tr'=>array('td'=>1, 'th'=>1), 'ul'=>array('li'=>1)); // Specific - immediate parent-child |
161 | if($GLOBALS['C']['direct_list_nest']){$cS['ol'] = $cS['ul'] = $cS['menu'] += array('menu'=>1, 'ol'=>1, 'ul'=>1);} | 161 | if($GLOBALS['C']['direct_list_nest']){$cS['ol'] = $cS['ul'] = $cS['menu'] += array('menu'=>1, 'ol'=>1, 'ul'=>1);} |
162 | $cO = array('address'=>array('p'=>1), 'applet'=>array('param'=>1), 'audio'=>array('source'=>1, 'track'=>1), 'blockquote'=>array('script'=>1), 'details'=>array('summary'=>1), 'fieldset'=>array('legend'=>1, '#pcdata'=>1), 'figure'=>array('figcaption'=>1),'form'=>array('script'=>1), 'map'=>array('area'=>1), 'object'=>array('param'=>1, 'embed'=>1), 'video'=>array('source'=>1, 'track'=>1)); // Other | 162 | $cO = array('address'=>array('p'=>1), 'applet'=>array('param'=>1), 'audio'=>array('source'=>1, 'track'=>1), 'blockquote'=>array('script'=>1), 'details'=>array('summary'=>1), 'fieldset'=>array('legend'=>1, '#pcdata'=>1), 'figure'=>array('figcaption'=>1),'form'=>array('script'=>1), 'map'=>array('area'=>1), 'object'=>array('param'=>1, 'embed'=>1), 'video'=>array('source'=>1, 'track'=>1)); // Other |
163 | $cT = array('colgroup'=>1, 'dd'=>1, 'dt'=>1, 'li'=>1, 'option'=>1, 'p'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1); // Omitable closing | 163 | $cT = array('colgroup'=>1, 'dd'=>1, 'dt'=>1, 'li'=>1, 'option'=>1, 'p'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1); // Omitable closing |
164 | // block/inline type; a/ins/del both type; #pcdata: text | 164 | // block/inline type; a/ins/del both type; #pcdata: text |
165 | $eB = array('a'=>1, 'address'=>1, 'article'=>1, 'aside'=>1, 'blockquote'=>1, 'center'=>1, 'del'=>1, 'details'=>1, 'dir'=>1, 'dl'=>1, 'div'=>1, 'fieldset'=>1, 'figure'=>1, 'footer'=>1, 'form'=>1, 'ins'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'header'=>1, 'hr'=>1, 'isindex'=>1, 'main'=>1, 'menu'=>1, 'nav'=>1, 'noscript'=>1, 'ol'=>1, 'p'=>1, 'pre'=>1, 'section'=>1, 'style'=>1, 'table'=>1, 'ul'=>1); | 165 | $eB = array('a'=>1, 'address'=>1, 'article'=>1, 'aside'=>1, 'blockquote'=>1, 'center'=>1, 'del'=>1, 'details'=>1, 'dir'=>1, 'dl'=>1, 'div'=>1, 'fieldset'=>1, 'figure'=>1, 'footer'=>1, 'form'=>1, 'ins'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'header'=>1, 'hr'=>1, 'isindex'=>1, 'main'=>1, 'menu'=>1, 'nav'=>1, 'noscript'=>1, 'ol'=>1, 'p'=>1, 'pre'=>1, 'section'=>1, 'style'=>1, 'table'=>1, 'ul'=>1); |
166 | $eI = array('#pcdata'=>1, 'a'=>1, 'abbr'=>1, 'acronym'=>1, 'applet'=>1, 'audio'=>1, 'b'=>1, 'bdi'=>1, 'bdo'=>1, 'big'=>1, 'br'=>1, 'button'=>1, 'canvas'=>1, 'cite'=>1, 'code'=>1, 'command'=>1, 'data'=>1, 'datalist'=>1, 'del'=>1, 'dfn'=>1, 'em'=>1, 'embed'=>1, 'figcaption'=>1, 'font'=>1, 'i'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'ins'=>1, 'kbd'=>1, 'label'=>1, 'link'=>1, 'map'=>1, 'mark'=>1, 'meta'=>1, 'meter'=>1, 'object'=>1, 'output'=>1, 'progress'=>1, 'q'=>1, 'ruby'=>1, 's'=>1, 'samp'=>1, 'select'=>1, 'script'=>1, 'small'=>1, 'span'=>1, 'strike'=>1, 'strong'=>1, 'sub'=>1, 'summary'=>1, 'sup'=>1, 'textarea'=>1, 'time'=>1, 'tt'=>1, 'u'=>1, 'var'=>1, 'video'=>1, 'wbr'=>1); | 166 | $eI = array('#pcdata'=>1, 'a'=>1, 'abbr'=>1, 'acronym'=>1, 'applet'=>1, 'audio'=>1, 'b'=>1, 'bdi'=>1, 'bdo'=>1, 'big'=>1, 'br'=>1, 'button'=>1, 'canvas'=>1, 'cite'=>1, 'code'=>1, 'command'=>1, 'data'=>1, 'datalist'=>1, 'del'=>1, 'dfn'=>1, 'em'=>1, 'embed'=>1, 'figcaption'=>1, 'font'=>1, 'i'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'ins'=>1, 'kbd'=>1, 'label'=>1, 'link'=>1, 'map'=>1, 'mark'=>1, 'meta'=>1, 'meter'=>1, 'object'=>1, 'output'=>1, 'progress'=>1, 'q'=>1, 'ruby'=>1, 's'=>1, 'samp'=>1, 'select'=>1, 'script'=>1, 'small'=>1, 'span'=>1, 'strike'=>1, 'strong'=>1, 'sub'=>1, 'summary'=>1, 'sup'=>1, 'textarea'=>1, 'time'=>1, 'tt'=>1, 'u'=>1, 'var'=>1, 'video'=>1, 'wbr'=>1); |
167 | $eN = array('a'=>1, 'address'=>1, 'article'=>1, 'aside'=>1, 'big'=>1, 'button'=>1, 'details'=>1, 'embed'=>1, 'fieldset'=>1, 'font'=>1, 'footer'=>1, 'form'=>1, 'header'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'keygen'=>1, 'label'=>1, 'meter'=>1, 'nav'=>1, 'object'=>1, 'progress'=>1, 'ruby'=>1, 'script'=>1, 'select'=>1, 'small'=>1, 'sub'=>1, 'sup'=>1, 'textarea'=>1, 'time'=>1); // Exclude from specific ele; $cN values | 167 | $eN = array('a'=>1, 'address'=>1, 'article'=>1, 'aside'=>1, 'big'=>1, 'button'=>1, 'details'=>1, 'embed'=>1, 'fieldset'=>1, 'font'=>1, 'footer'=>1, 'form'=>1, 'header'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'keygen'=>1, 'label'=>1, 'meter'=>1, 'nav'=>1, 'object'=>1, 'progress'=>1, 'ruby'=>1, 'script'=>1, 'select'=>1, 'small'=>1, 'sub'=>1, 'sup'=>1, 'textarea'=>1, 'time'=>1); // Exclude from specific ele; $cN values |
168 | $eO = array('area'=>1, 'caption'=>1, 'col'=>1, 'colgroup'=>1, 'command'=>1, 'dd'=>1, 'dt'=>1, 'hgroup'=>1, 'keygen'=>1, 'legend'=>1, 'li'=>1, 'optgroup'=>1, 'option'=>1, 'param'=>1, 'rb'=>1, 'rbc'=>1, 'rp'=>1, 'rt'=>1, 'rtc'=>1, 'script'=>1, 'source'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'thead'=>1, 'th'=>1, 'tr'=>1, 'track'=>1); // Missing in $eB & $eI | 168 | $eO = array('area'=>1, 'caption'=>1, 'col'=>1, 'colgroup'=>1, 'command'=>1, 'dd'=>1, 'dt'=>1, 'hgroup'=>1, 'keygen'=>1, 'legend'=>1, 'li'=>1, 'optgroup'=>1, 'option'=>1, 'param'=>1, 'rb'=>1, 'rbc'=>1, 'rp'=>1, 'rt'=>1, 'rtc'=>1, 'script'=>1, 'source'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'thead'=>1, 'th'=>1, 'tr'=>1, 'track'=>1); // Missing in $eB & $eI |
169 | $eF = $eB + $eI; | 169 | $eF = $eB + $eI; |
170 | 170 | ||
171 | // $in sets allowed child | 171 | // $in sets allowed child |
172 | $in = ((isset($eF[$in]) && $in != '#pcdata') or isset($eO[$in])) ? $in : 'div'; | 172 | $in = ((isset($eF[$in]) && $in != '#pcdata') or isset($eO[$in])) ? $in : 'div'; |
173 | if(isset($cE[$in])){ | 173 | if(isset($cE[$in])){ |
174 | return (!$do ? '' : str_replace(array('<', '>'), array('<', '>'), $t)); | 174 | return (!$do ? '' : str_replace(array('<', '>'), array('<', '>'), $t)); |
175 | } | 175 | } |
176 | if(isset($cS[$in])){$inOk = $cS[$in];} | 176 | if(isset($cS[$in])){$inOk = $cS[$in];} |
177 | elseif(isset($cI[$in])){$inOk = $eI; $cI['del'] = 1; $cI['ins'] = 1;} | 177 | elseif(isset($cI[$in])){$inOk = $eI; $cI['del'] = 1; $cI['ins'] = 1;} |
178 | elseif(isset($cF[$in])){$inOk = $eF; unset($cI['del'], $cI['ins']);} | 178 | elseif(isset($cF[$in])){$inOk = $eF; unset($cI['del'], $cI['ins']);} |
179 | elseif(isset($cB[$in])){$inOk = $eB; unset($cI['del'], $cI['ins']);} | 179 | elseif(isset($cB[$in])){$inOk = $eB; unset($cI['del'], $cI['ins']);} |
180 | if(isset($cO[$in])){$inOk = $inOk + $cO[$in];} | 180 | if(isset($cO[$in])){$inOk = $inOk + $cO[$in];} |
181 | if(isset($cN[$in])){$inOk = array_diff_assoc($inOk, $cN[$in]);} | 181 | if(isset($cN[$in])){$inOk = array_diff_assoc($inOk, $cN[$in]);} |
182 | 182 | ||
183 | $t = explode('<', $t); | 183 | $t = explode('<', $t); |
184 | $ok = $q = array(); // $q seq list of open non-empty ele | 184 | $ok = $q = array(); // $q seq list of open non-empty ele |
185 | ob_start(); | 185 | ob_start(); |
186 | 186 | ||
187 | for($i=-1, $ci=count($t); ++$i<$ci;){ | 187 | for($i=-1, $ci=count($t); ++$i<$ci;){ |
188 | // allowed $ok in parent $p | 188 | // allowed $ok in parent $p |
189 | if($ql = count($q)){ | 189 | if($ql = count($q)){ |
190 | $p = array_pop($q); | 190 | $p = array_pop($q); |
191 | $q[] = $p; | 191 | $q[] = $p; |
192 | if(isset($cS[$p])){$ok = $cS[$p];} | 192 | if(isset($cS[$p])){$ok = $cS[$p];} |
193 | elseif(isset($cI[$p])){$ok = $eI; $cI['del'] = 1; $cI['ins'] = 1;} | 193 | elseif(isset($cI[$p])){$ok = $eI; $cI['del'] = 1; $cI['ins'] = 1;} |
194 | elseif(isset($cF[$p])){$ok = $eF; unset($cI['del'], $cI['ins']);} | 194 | elseif(isset($cF[$p])){$ok = $eF; unset($cI['del'], $cI['ins']);} |
195 | elseif(isset($cB[$p])){$ok = $eB; unset($cI['del'], $cI['ins']);} | 195 | elseif(isset($cB[$p])){$ok = $eB; unset($cI['del'], $cI['ins']);} |
196 | if(isset($cO[$p])){$ok = $ok + $cO[$p];} | 196 | if(isset($cO[$p])){$ok = $ok + $cO[$p];} |
197 | if(isset($cN[$p])){$ok = array_diff_assoc($ok, $cN[$p]);} | 197 | if(isset($cN[$p])){$ok = array_diff_assoc($ok, $cN[$p]);} |
198 | }else{$ok = $inOk; unset($cI['del'], $cI['ins']);} | 198 | }else{$ok = $inOk; unset($cI['del'], $cI['ins']);} |
199 | // bad tags, & ele content | 199 | // bad tags, & ele content |
200 | if(isset($e) && ($do == 1 or (isset($ok['#pcdata']) && ($do == 3 or $do == 5)))){ | 200 | if(isset($e) && ($do == 1 or (isset($ok['#pcdata']) && ($do == 3 or $do == 5)))){ |
201 | echo '<', $s, $e, $a, '>'; | 201 | echo '<', $s, $e, $a, '>'; |
202 | } | 202 | } |
203 | if(isset($x[0])){ | 203 | if(isset($x[0])){ |
204 | if(strlen(trim($x)) && (($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql))){ | 204 | if(strlen(trim($x)) && (($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql))){ |
205 | echo '<div>', $x, '</div>'; | 205 | echo '<div>', $x, '</div>'; |
206 | } | 206 | } |
207 | elseif($do < 3 or isset($ok['#pcdata'])){echo $x;} | 207 | elseif($do < 3 or isset($ok['#pcdata'])){echo $x;} |
208 | elseif(strpos($x, "\x02\x04")){ | 208 | elseif(strpos($x, "\x02\x04")){ |
209 | foreach(preg_split('`(\x01\x02[^\x01\x02]+\x02\x01)`', $x, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $v){ | 209 | foreach(preg_split('`(\x01\x02[^\x01\x02]+\x02\x01)`', $x, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $v){ |
210 | echo (substr($v, 0, 2) == "\x01\x02" ? $v : ($do > 4 ? preg_replace('`\S`', '', $v) : '')); | 210 | echo (substr($v, 0, 2) == "\x01\x02" ? $v : ($do > 4 ? preg_replace('`\S`', '', $v) : '')); |
211 | } | 211 | } |
212 | }elseif($do > 4){echo preg_replace('`\S`', '', $x);} | 212 | }elseif($do > 4){echo preg_replace('`\S`', '', $x);} |
213 | } | 213 | } |
214 | // get markup | 214 | // get markup |
215 | if(!preg_match('`^(/?)([a-z1-6]+)([^>]*)>(.*)`sm', $t[$i], $r)){$x = $t[$i]; continue;} | 215 | if(!preg_match('`^(/?)([a-z1-6]+)([^>]*)>(.*)`sm', $t[$i], $r)){$x = $t[$i]; continue;} |
216 | $s = null; $e = null; $a = null; $x = null; list($all, $s, $e, $a, $x) = $r; | 216 | $s = null; $e = null; $a = null; $x = null; list($all, $s, $e, $a, $x) = $r; |
217 | // close tag | 217 | // close tag |
218 | if($s){ | 218 | if($s){ |
219 | if(isset($cE[$e]) or !in_array($e, $q)){continue;} // Empty/unopen | 219 | if(isset($cE[$e]) or !in_array($e, $q)){continue;} // Empty/unopen |
220 | if($p == $e){array_pop($q); echo '</', $e, '>'; unset($e); continue;} // Last open | 220 | if($p == $e){array_pop($q); echo '</', $e, '>'; unset($e); continue;} // Last open |
221 | $add = ''; // Nesting - close open tags that need to be | 221 | $add = ''; // Nesting - close open tags that need to be |
222 | for($j=-1, $cj=count($q); ++$j<$cj;){ | 222 | for($j=-1, $cj=count($q); ++$j<$cj;){ |
223 | if(($d = array_pop($q)) == $e){break;} | 223 | if(($d = array_pop($q)) == $e){break;} |
224 | else{$add .= "</{$d}>";} | 224 | else{$add .= "</{$d}>";} |
225 | } | 225 | } |
226 | echo $add, '</', $e, '>'; unset($e); continue; | 226 | echo $add, '</', $e, '>'; unset($e); continue; |
227 | } | 227 | } |
228 | // open tag | 228 | // open tag |
229 | // $cB ele needs $eB ele as child | 229 | // $cB ele needs $eB ele as child |
230 | if(isset($cB[$e]) && strlen(trim($x))){ | 230 | if(isset($cB[$e]) && strlen(trim($x))){ |
231 | $t[$i] = "{$e}{$a}>"; | 231 | $t[$i] = "{$e}{$a}>"; |
232 | array_splice($t, $i+1, 0, 'div>'. $x); unset($e, $x); ++$ci; --$i; continue; | 232 | array_splice($t, $i+1, 0, 'div>'. $x); unset($e, $x); ++$ci; --$i; continue; |
233 | } | 233 | } |
234 | if((($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql)) && !isset($eB[$e]) && !isset($ok[$e])){ | 234 | if((($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql)) && !isset($eB[$e]) && !isset($ok[$e])){ |
235 | array_splice($t, $i, 0, 'div>'); unset($e, $x); ++$ci; --$i; continue; | 235 | array_splice($t, $i, 0, 'div>'); unset($e, $x); ++$ci; --$i; continue; |
236 | } | 236 | } |
237 | // if no open ele, $in = parent; mostly immediate parent-child relation should hold | 237 | // if no open ele, $in = parent; mostly immediate parent-child relation should hold |
238 | if(!$ql or !isset($eN[$e]) or !array_intersect($q, $cN2)){ | 238 | if(!$ql or !isset($eN[$e]) or !array_intersect($q, $cN2)){ |
239 | if(!isset($ok[$e])){ | 239 | if(!isset($ok[$e])){ |
240 | if($ql && isset($cT[$p])){echo '</', array_pop($q), '>'; unset($e, $x); --$i;} | 240 | if($ql && isset($cT[$p])){echo '</', array_pop($q), '>'; unset($e, $x); --$i;} |
241 | continue; | 241 | continue; |
242 | } | 242 | } |
243 | if(!isset($cE[$e])){$q[] = $e;} | 243 | if(!isset($cE[$e])){$q[] = $e;} |
244 | echo '<', $e, $a, '>'; unset($e); continue; | 244 | echo '<', $e, $a, '>'; unset($e); continue; |
245 | } | 245 | } |
246 | // specific parent-child | 246 | // specific parent-child |
247 | if(isset($cS[$p][$e])){ | 247 | if(isset($cS[$p][$e])){ |
248 | if(!isset($cE[$e])){$q[] = $e;} | 248 | if(!isset($cE[$e])){$q[] = $e;} |
249 | echo '<', $e, $a, '>'; unset($e); continue; | 249 | echo '<', $e, $a, '>'; unset($e); continue; |
250 | } | 250 | } |
251 | // nesting | 251 | // nesting |
252 | $add = ''; | 252 | $add = ''; |
253 | $q2 = array(); | 253 | $q2 = array(); |
254 | for($k=-1, $kc=count($q); ++$k<$kc;){ | 254 | for($k=-1, $kc=count($q); ++$k<$kc;){ |
255 | $d = $q[$k]; | 255 | $d = $q[$k]; |
256 | $ok2 = array(); | 256 | $ok2 = array(); |
257 | if(isset($cS[$d])){$q2[] = $d; continue;} | 257 | if(isset($cS[$d])){$q2[] = $d; continue;} |
258 | $ok2 = isset($cI[$d]) ? $eI : $eF; | 258 | $ok2 = isset($cI[$d]) ? $eI : $eF; |
259 | if(isset($cO[$d])){$ok2 = $ok2 + $cO[$d];} | 259 | if(isset($cO[$d])){$ok2 = $ok2 + $cO[$d];} |
260 | if(isset($cN[$d])){$ok2 = array_diff_assoc($ok2, $cN[$d]);} | 260 | if(isset($cN[$d])){$ok2 = array_diff_assoc($ok2, $cN[$d]);} |
261 | if(!isset($ok2[$e])){ | 261 | if(!isset($ok2[$e])){ |
262 | if(!$k && !isset($inOk[$e])){continue 2;} | 262 | if(!$k && !isset($inOk[$e])){continue 2;} |
263 | $add = "</{$d}>"; | 263 | $add = "</{$d}>"; |
264 | for(;++$k<$kc;){$add = "</{$q[$k]}>{$add}";} | 264 | for(;++$k<$kc;){$add = "</{$q[$k]}>{$add}";} |
265 | break; | 265 | break; |
266 | } | 266 | } |
267 | else{$q2[] = $d;} | 267 | else{$q2[] = $d;} |
268 | } | 268 | } |
269 | $q = $q2; | 269 | $q = $q2; |
270 | if(!isset($cE[$e])){$q[] = $e;} | 270 | if(!isset($cE[$e])){$q[] = $e;} |
271 | echo $add, '<', $e, $a, '>'; unset($e); continue; | 271 | echo $add, '<', $e, $a, '>'; unset($e); continue; |
272 | } | 272 | } |
273 | 273 | ||
274 | // end | 274 | // end |
275 | if($ql = count($q)){ | 275 | if($ql = count($q)){ |
276 | $p = array_pop($q); | 276 | $p = array_pop($q); |
277 | $q[] = $p; | 277 | $q[] = $p; |
278 | if(isset($cS[$p])){$ok = $cS[$p];} | 278 | if(isset($cS[$p])){$ok = $cS[$p];} |
279 | elseif(isset($cI[$p])){$ok = $eI; $cI['del'] = 1; $cI['ins'] = 1;} | 279 | elseif(isset($cI[$p])){$ok = $eI; $cI['del'] = 1; $cI['ins'] = 1;} |
280 | elseif(isset($cF[$p])){$ok = $eF; unset($cI['del'], $cI['ins']);} | 280 | elseif(isset($cF[$p])){$ok = $eF; unset($cI['del'], $cI['ins']);} |
281 | elseif(isset($cB[$p])){$ok = $eB; unset($cI['del'], $cI['ins']);} | 281 | elseif(isset($cB[$p])){$ok = $eB; unset($cI['del'], $cI['ins']);} |
282 | if(isset($cO[$p])){$ok = $ok + $cO[$p];} | 282 | if(isset($cO[$p])){$ok = $ok + $cO[$p];} |
283 | if(isset($cN[$p])){$ok = array_diff_assoc($ok, $cN[$p]);} | 283 | if(isset($cN[$p])){$ok = array_diff_assoc($ok, $cN[$p]);} |
284 | }else{$ok = $inOk; unset($cI['del'], $cI['ins']);} | 284 | }else{$ok = $inOk; unset($cI['del'], $cI['ins']);} |
285 | if(isset($e) && ($do == 1 or (isset($ok['#pcdata']) && ($do == 3 or $do == 5)))){ | 285 | if(isset($e) && ($do == 1 or (isset($ok['#pcdata']) && ($do == 3 or $do == 5)))){ |
286 | echo '<', $s, $e, $a, '>'; | 286 | echo '<', $s, $e, $a, '>'; |
287 | } | 287 | } |
288 | if(isset($x[0])){ | 288 | if(isset($x[0])){ |
289 | if(strlen(trim($x)) && (($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql))){ | 289 | if(strlen(trim($x)) && (($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql))){ |
290 | echo '<div>', $x, '</div>'; | 290 | echo '<div>', $x, '</div>'; |
291 | } | 291 | } |
292 | elseif($do < 3 or isset($ok['#pcdata'])){echo $x;} | 292 | elseif($do < 3 or isset($ok['#pcdata'])){echo $x;} |
293 | elseif(strpos($x, "\x02\x04")){ | 293 | elseif(strpos($x, "\x02\x04")){ |
294 | foreach(preg_split('`(\x01\x02[^\x01\x02]+\x02\x01)`', $x, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $v){ | 294 | foreach(preg_split('`(\x01\x02[^\x01\x02]+\x02\x01)`', $x, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $v){ |
295 | echo (substr($v, 0, 2) == "\x01\x02" ? $v : ($do > 4 ? preg_replace('`\S`', '', $v) : '')); | 295 | echo (substr($v, 0, 2) == "\x01\x02" ? $v : ($do > 4 ? preg_replace('`\S`', '', $v) : '')); |
296 | } | 296 | } |
297 | }elseif($do > 4){echo preg_replace('`\S`', '', $x);} | 297 | }elseif($do > 4){echo preg_replace('`\S`', '', $x);} |
298 | } | 298 | } |
299 | while(!empty($q) && ($e = array_pop($q))){echo '</', $e, '>';} | 299 | while(!empty($q) && ($e = array_pop($q))){echo '</', $e, '>';} |
300 | $o = ob_get_contents(); | 300 | $o = ob_get_contents(); |
301 | ob_end_clean(); | 301 | ob_end_clean(); |
302 | return $o; | 302 | return $o; |
303 | } | 303 | } |
304 | 304 | ||
305 | function hl_cmtcd($t){ | 305 | function hl_cmtcd($t){ |
306 | // comment/CDATA sec handler | 306 | // comment/CDATA sec handler |
307 | $t = $t[0]; | 307 | $t = $t[0]; |
308 | global $C; | 308 | global $C; |
309 | if(!($v = $C[$n = $t[3] == '-' ? 'comment' : 'cdata'])){return $t;} | 309 | if(!($v = $C[$n = $t[3] == '-' ? 'comment' : 'cdata'])){return $t;} |
310 | if($v == 1){return '';} | 310 | if($v == 1){return '';} |
311 | if($n == 'comment' && $v < 4){ | 311 | if($n == 'comment' && $v < 4){ |
312 | if(substr(($t = preg_replace('`--+`', '-', substr($t, 4, -3))), -1) != ' '){$t .= ' ';} | 312 | if(substr(($t = preg_replace('`--+`', '-', substr($t, 4, -3))), -1) != ' '){$t .= ' ';} |
313 | } | 313 | } |
314 | else{$t = substr($t, 1, -1);} | 314 | else{$t = substr($t, 1, -1);} |
315 | $t = $v == 2 ? str_replace(array('&', '<', '>'), array('&', '<', '>'), $t) : $t; | 315 | $t = $v == 2 ? str_replace(array('&', '<', '>'), array('&', '<', '>'), $t) : $t; |
316 | return str_replace(array('&', '<', '>'), array("\x03", "\x04", "\x05"), ($n == 'comment' ? "\x01\x02\x04!--$t--\x05\x02\x01" : "\x01\x01\x04$t\x05\x01\x01")); | 316 | return str_replace(array('&', '<', '>'), array("\x03", "\x04", "\x05"), ($n == 'comment' ? "\x01\x02\x04!--$t--\x05\x02\x01" : "\x01\x01\x04$t\x05\x01\x01")); |
317 | } | 317 | } |
318 | 318 | ||
319 | function hl_ent($t){ | 319 | function hl_ent($t){ |
320 | // entitity handler | 320 | // entitity handler |
321 | global $C; | 321 | global $C; |
322 | $t = $t[1]; | 322 | $t = $t[1]; |
323 | static $U = array('quot'=>1,'amp'=>1,'lt'=>1,'gt'=>1); | 323 | static $U = array('quot'=>1,'amp'=>1,'lt'=>1,'gt'=>1); |
324 | static $N = array('fnof'=>'402', 'Alpha'=>'913', 'Beta'=>'914', 'Gamma'=>'915', 'Delta'=>'916', 'Epsilon'=>'917', 'Zeta'=>'918', 'Eta'=>'919', 'Theta'=>'920', 'Iota'=>'921', 'Kappa'=>'922', 'Lambda'=>'923', 'Mu'=>'924', 'Nu'=>'925', 'Xi'=>'926', 'Omicron'=>'927', 'Pi'=>'928', 'Rho'=>'929', 'Sigma'=>'931', 'Tau'=>'932', 'Upsilon'=>'933', 'Phi'=>'934', 'Chi'=>'935', 'Psi'=>'936', 'Omega'=>'937', 'alpha'=>'945', 'beta'=>'946', 'gamma'=>'947', 'delta'=>'948', 'epsilon'=>'949', 'zeta'=>'950', 'eta'=>'951', 'theta'=>'952', 'iota'=>'953', 'kappa'=>'954', 'lambda'=>'955', 'mu'=>'956', 'nu'=>'957', 'xi'=>'958', 'omicron'=>'959', 'pi'=>'960', 'rho'=>'961', 'sigmaf'=>'962', 'sigma'=>'963', 'tau'=>'964', 'upsilon'=>'965', 'phi'=>'966', 'chi'=>'967', 'psi'=>'968', 'omega'=>'969', 'thetasym'=>'977', 'upsih'=>'978', 'piv'=>'982', 'bull'=>'8226', 'hellip'=>'8230', 'prime'=>'8242', 'Prime'=>'8243', 'oline'=>'8254', 'frasl'=>'8260', 'weierp'=>'8472', 'image'=>'8465', 'real'=>'8476', 'trade'=>'8482', 'alefsym'=>'8501', 'larr'=>'8592', 'uarr'=>'8593', 'rarr'=>'8594', 'darr'=>'8595', 'harr'=>'8596', 'crarr'=>'8629', 'lArr'=>'8656', 'uArr'=>'8657', 'rArr'=>'8658', 'dArr'=>'8659', 'hArr'=>'8660', 'forall'=>'8704', 'part'=>'8706', 'exist'=>'8707', 'empty'=>'8709', 'nabla'=>'8711', 'isin'=>'8712', 'notin'=>'8713', 'ni'=>'8715', 'prod'=>'8719', 'sum'=>'8721', 'minus'=>'8722', 'lowast'=>'8727', 'radic'=>'8730', 'prop'=>'8733', 'infin'=>'8734', 'ang'=>'8736', 'and'=>'8743', 'or'=>'8744', 'cap'=>'8745', 'cup'=>'8746', 'int'=>'8747', 'there4'=>'8756', 'sim'=>'8764', 'cong'=>'8773', 'asymp'=>'8776', 'ne'=>'8800', 'equiv'=>'8801', 'le'=>'8804', 'ge'=>'8805', 'sub'=>'8834', 'sup'=>'8835', 'nsub'=>'8836', 'sube'=>'8838', 'supe'=>'8839', 'oplus'=>'8853', 'otimes'=>'8855', 'perp'=>'8869', 'sdot'=>'8901', 'lceil'=>'8968', 'rceil'=>'8969', 'lfloor'=>'8970', 'rfloor'=>'8971', 'lang'=>'9001', 'rang'=>'9002', 'loz'=>'9674', 'spades'=>'9824', 'clubs'=>'9827', 'hearts'=>'9829', 'diams'=>'9830', 'apos'=>'39', 'OElig'=>'338', 'oelig'=>'339', 'Scaron'=>'352', 'scaron'=>'353', 'Yuml'=>'376', 'circ'=>'710', 'tilde'=>'732', 'ensp'=>'8194', 'emsp'=>'8195', 'thinsp'=>'8201', 'zwnj'=>'8204', 'zwj'=>'8205', 'lrm'=>'8206', 'rlm'=>'8207', 'ndash'=>'8211', 'mdash'=>'8212', 'lsquo'=>'8216', 'rsquo'=>'8217', 'sbquo'=>'8218', 'ldquo'=>'8220', 'rdquo'=>'8221', 'bdquo'=>'8222', 'dagger'=>'8224', 'Dagger'=>'8225', 'permil'=>'8240', 'lsaquo'=>'8249', 'rsaquo'=>'8250', 'euro'=>'8364', 'nbsp'=>'160', 'iexcl'=>'161', 'cent'=>'162', 'pound'=>'163', 'curren'=>'164', 'yen'=>'165', 'brvbar'=>'166', 'sect'=>'167', 'uml'=>'168', 'copy'=>'169', 'ordf'=>'170', 'laquo'=>'171', 'not'=>'172', 'shy'=>'173', 'reg'=>'174', 'macr'=>'175', 'deg'=>'176', 'plusmn'=>'177', 'sup2'=>'178', 'sup3'=>'179', 'acute'=>'180', 'micro'=>'181', 'para'=>'182', 'middot'=>'183', 'cedil'=>'184', 'sup1'=>'185', 'ordm'=>'186', 'raquo'=>'187', 'frac14'=>'188', 'frac12'=>'189', 'frac34'=>'190', 'iquest'=>'191', 'Agrave'=>'192', 'Aacute'=>'193', 'Acirc'=>'194', 'Atilde'=>'195', 'Auml'=>'196', 'Aring'=>'197', 'AElig'=>'198', 'Ccedil'=>'199', 'Egrave'=>'200', 'Eacute'=>'201', 'Ecirc'=>'202', 'Euml'=>'203', 'Igrave'=>'204', 'Iacute'=>'205', 'Icirc'=>'206', 'Iuml'=>'207', 'ETH'=>'208', 'Ntilde'=>'209', 'Ograve'=>'210', 'Oacute'=>'211', 'Ocirc'=>'212', 'Otilde'=>'213', 'Ouml'=>'214', 'times'=>'215', 'Oslash'=>'216', 'Ugrave'=>'217', 'Uacute'=>'218', 'Ucirc'=>'219', 'Uuml'=>'220', 'Yacute'=>'221', 'THORN'=>'222', 'szlig'=>'223', 'agrave'=>'224', 'aacute'=>'225', 'acirc'=>'226', 'atilde'=>'227', 'auml'=>'228', 'aring'=>'229', 'aelig'=>'230', 'ccedil'=>'231', 'egrave'=>'232', 'eacute'=>'233', 'ecirc'=>'234', 'euml'=>'235', 'igrave'=>'236', 'iacute'=>'237', 'icirc'=>'238', 'iuml'=>'239', 'eth'=>'240', 'ntilde'=>'241', 'ograve'=>'242', 'oacute'=>'243', 'ocirc'=>'244', 'otilde'=>'245', 'ouml'=>'246', 'divide'=>'247', 'oslash'=>'248', 'ugrave'=>'249', 'uacute'=>'250', 'ucirc'=>'251', 'uuml'=>'252', 'yacute'=>'253', 'thorn'=>'254', 'yuml'=>'255'); | 324 | static $N = array('fnof'=>'402', 'Alpha'=>'913', 'Beta'=>'914', 'Gamma'=>'915', 'Delta'=>'916', 'Epsilon'=>'917', 'Zeta'=>'918', 'Eta'=>'919', 'Theta'=>'920', 'Iota'=>'921', 'Kappa'=>'922', 'Lambda'=>'923', 'Mu'=>'924', 'Nu'=>'925', 'Xi'=>'926', 'Omicron'=>'927', 'Pi'=>'928', 'Rho'=>'929', 'Sigma'=>'931', 'Tau'=>'932', 'Upsilon'=>'933', 'Phi'=>'934', 'Chi'=>'935', 'Psi'=>'936', 'Omega'=>'937', 'alpha'=>'945', 'beta'=>'946', 'gamma'=>'947', 'delta'=>'948', 'epsilon'=>'949', 'zeta'=>'950', 'eta'=>'951', 'theta'=>'952', 'iota'=>'953', 'kappa'=>'954', 'lambda'=>'955', 'mu'=>'956', 'nu'=>'957', 'xi'=>'958', 'omicron'=>'959', 'pi'=>'960', 'rho'=>'961', 'sigmaf'=>'962', 'sigma'=>'963', 'tau'=>'964', 'upsilon'=>'965', 'phi'=>'966', 'chi'=>'967', 'psi'=>'968', 'omega'=>'969', 'thetasym'=>'977', 'upsih'=>'978', 'piv'=>'982', 'bull'=>'8226', 'hellip'=>'8230', 'prime'=>'8242', 'Prime'=>'8243', 'oline'=>'8254', 'frasl'=>'8260', 'weierp'=>'8472', 'image'=>'8465', 'real'=>'8476', 'trade'=>'8482', 'alefsym'=>'8501', 'larr'=>'8592', 'uarr'=>'8593', 'rarr'=>'8594', 'darr'=>'8595', 'harr'=>'8596', 'crarr'=>'8629', 'lArr'=>'8656', 'uArr'=>'8657', 'rArr'=>'8658', 'dArr'=>'8659', 'hArr'=>'8660', 'forall'=>'8704', 'part'=>'8706', 'exist'=>'8707', 'empty'=>'8709', 'nabla'=>'8711', 'isin'=>'8712', 'notin'=>'8713', 'ni'=>'8715', 'prod'=>'8719', 'sum'=>'8721', 'minus'=>'8722', 'lowast'=>'8727', 'radic'=>'8730', 'prop'=>'8733', 'infin'=>'8734', 'ang'=>'8736', 'and'=>'8743', 'or'=>'8744', 'cap'=>'8745', 'cup'=>'8746', 'int'=>'8747', 'there4'=>'8756', 'sim'=>'8764', 'cong'=>'8773', 'asymp'=>'8776', 'ne'=>'8800', 'equiv'=>'8801', 'le'=>'8804', 'ge'=>'8805', 'sub'=>'8834', 'sup'=>'8835', 'nsub'=>'8836', 'sube'=>'8838', 'supe'=>'8839', 'oplus'=>'8853', 'otimes'=>'8855', 'perp'=>'8869', 'sdot'=>'8901', 'lceil'=>'8968', 'rceil'=>'8969', 'lfloor'=>'8970', 'rfloor'=>'8971', 'lang'=>'9001', 'rang'=>'9002', 'loz'=>'9674', 'spades'=>'9824', 'clubs'=>'9827', 'hearts'=>'9829', 'diams'=>'9830', 'apos'=>'39', 'OElig'=>'338', 'oelig'=>'339', 'Scaron'=>'352', 'scaron'=>'353', 'Yuml'=>'376', 'circ'=>'710', 'tilde'=>'732', 'ensp'=>'8194', 'emsp'=>'8195', 'thinsp'=>'8201', 'zwnj'=>'8204', 'zwj'=>'8205', 'lrm'=>'8206', 'rlm'=>'8207', 'ndash'=>'8211', 'mdash'=>'8212', 'lsquo'=>'8216', 'rsquo'=>'8217', 'sbquo'=>'8218', 'ldquo'=>'8220', 'rdquo'=>'8221', 'bdquo'=>'8222', 'dagger'=>'8224', 'Dagger'=>'8225', 'permil'=>'8240', 'lsaquo'=>'8249', 'rsaquo'=>'8250', 'euro'=>'8364', 'nbsp'=>'160', 'iexcl'=>'161', 'cent'=>'162', 'pound'=>'163', 'curren'=>'164', 'yen'=>'165', 'brvbar'=>'166', 'sect'=>'167', 'uml'=>'168', 'copy'=>'169', 'ordf'=>'170', 'laquo'=>'171', 'not'=>'172', 'shy'=>'173', 'reg'=>'174', 'macr'=>'175', 'deg'=>'176', 'plusmn'=>'177', 'sup2'=>'178', 'sup3'=>'179', 'acute'=>'180', 'micro'=>'181', 'para'=>'182', 'middot'=>'183', 'cedil'=>'184', 'sup1'=>'185', 'ordm'=>'186', 'raquo'=>'187', 'frac14'=>'188', 'frac12'=>'189', 'frac34'=>'190', 'iquest'=>'191', 'Agrave'=>'192', 'Aacute'=>'193', 'Acirc'=>'194', 'Atilde'=>'195', 'Auml'=>'196', 'Aring'=>'197', 'AElig'=>'198', 'Ccedil'=>'199', 'Egrave'=>'200', 'Eacute'=>'201', 'Ecirc'=>'202', 'Euml'=>'203', 'Igrave'=>'204', 'Iacute'=>'205', 'Icirc'=>'206', 'Iuml'=>'207', 'ETH'=>'208', 'Ntilde'=>'209', 'Ograve'=>'210', 'Oacute'=>'211', 'Ocirc'=>'212', 'Otilde'=>'213', 'Ouml'=>'214', 'times'=>'215', 'Oslash'=>'216', 'Ugrave'=>'217', 'Uacute'=>'218', 'Ucirc'=>'219', 'Uuml'=>'220', 'Yacute'=>'221', 'THORN'=>'222', 'szlig'=>'223', 'agrave'=>'224', 'aacute'=>'225', 'acirc'=>'226', 'atilde'=>'227', 'auml'=>'228', 'aring'=>'229', 'aelig'=>'230', 'ccedil'=>'231', 'egrave'=>'232', 'eacute'=>'233', 'ecirc'=>'234', 'euml'=>'235', 'igrave'=>'236', 'iacute'=>'237', 'icirc'=>'238', 'iuml'=>'239', 'eth'=>'240', 'ntilde'=>'241', 'ograve'=>'242', 'oacute'=>'243', 'ocirc'=>'244', 'otilde'=>'245', 'ouml'=>'246', 'divide'=>'247', 'oslash'=>'248', 'ugrave'=>'249', 'uacute'=>'250', 'ucirc'=>'251', 'uuml'=>'252', 'yacute'=>'253', 'thorn'=>'254', 'yuml'=>'255'); |
325 | if($t[0] != '#'){ | 325 | if($t[0] != '#'){ |
326 | return ($C['and_mark'] ? "\x06" : '&'). (isset($U[$t]) ? $t : (isset($N[$t]) ? (!$C['named_entity'] ? '#'. ($C['hexdec_entity'] > 1 ? 'x'. dechex($N[$t]) : $N[$t]) : $t) : 'amp;'. $t)). ';'; | 326 | return ($C['and_mark'] ? "\x06" : '&'). (isset($U[$t]) ? $t : (isset($N[$t]) ? (!$C['named_entity'] ? '#'. ($C['hexdec_entity'] > 1 ? 'x'. dechex($N[$t]) : $N[$t]) : $t) : 'amp;'. $t)). ';'; |
327 | } | 327 | } |
328 | if(($n = ctype_digit($t = substr($t, 1)) ? intval($t) : hexdec(substr($t, 1))) < 9 or ($n > 13 && $n < 32) or $n == 11 or $n == 12 or ($n > 126 && $n < 160 && $n != 133) or ($n > 55295 && ($n < 57344 or ($n > 64975 && $n < 64992) or $n == 65534 or $n == 65535 or $n > 1114111))){ | 328 | if(($n = ctype_digit($t = substr($t, 1)) ? intval($t) : hexdec(substr($t, 1))) < 9 or ($n > 13 && $n < 32) or $n == 11 or $n == 12 or ($n > 126 && $n < 160 && $n != 133) or ($n > 55295 && ($n < 57344 or ($n > 64975 && $n < 64992) or $n == 65534 or $n == 65535 or $n > 1114111))){ |
329 | return ($C['and_mark'] ? "\x06" : '&'). "amp;#{$t};"; | 329 | return ($C['and_mark'] ? "\x06" : '&'). "amp;#{$t};"; |
330 | } | 330 | } |
331 | return ($C['and_mark'] ? "\x06" : '&'). '#'. (((ctype_digit($t) && $C['hexdec_entity'] < 2) or !$C['hexdec_entity']) ? $n : 'x'. dechex($n)). ';'; | 331 | return ($C['and_mark'] ? "\x06" : '&'). '#'. (((ctype_digit($t) && $C['hexdec_entity'] < 2) or !$C['hexdec_entity']) ? $n : 'x'. dechex($n)). ';'; |
332 | } | 332 | } |
333 | 333 | ||
334 | function hl_prot($p, $c=null){ | 334 | function hl_prot($p, $c=null){ |
335 | // check URL scheme | 335 | // check URL scheme |
336 | global $C; | 336 | global $C; |
337 | $b = $a = ''; | 337 | $b = $a = ''; |
338 | if($c == null){$c = 'style'; $b = $p[1]; $a = $p[3]; $p = trim($p[2]);} | 338 | if($c == null){$c = 'style'; $b = $p[1]; $a = $p[3]; $p = trim($p[2]);} |
339 | $c = isset($C['schemes'][$c]) ? $C['schemes'][$c] : $C['schemes']['*']; | 339 | $c = isset($C['schemes'][$c]) ? $C['schemes'][$c] : $C['schemes']['*']; |
340 | static $d = 'denied:'; | 340 | static $d = 'denied:'; |
341 | if(isset($c['!']) && substr($p, 0, 7) != $d){$p = "$d$p";} | 341 | if(isset($c['!']) && substr($p, 0, 7) != $d){$p = "$d$p";} |
342 | if(isset($c['*']) or !strcspn($p, '#?;') or (substr($p, 0, 7) == $d)){return "{$b}{$p}{$a}";} // All ok, frag, query, param | 342 | if(isset($c['*']) or !strcspn($p, '#?;') or (substr($p, 0, 7) == $d)){return "{$b}{$p}{$a}";} // All ok, frag, query, param |
343 | if(preg_match('`^([^:?[@!$()*,=/\'\]]+?)(:|&#(58|x3a);|%3a|\\\\0{0,4}3a).`i', $p, $m) && !isset($c[strtolower($m[1])])){ // Denied prot | 343 | if(preg_match('`^([^:?[@!$()*,=/\'\]]+?)(:|&#(58|x3a);|%3a|\\\\0{0,4}3a).`i', $p, $m) && !isset($c[strtolower($m[1])])){ // Denied prot |
344 | return "{$b}{$d}{$p}{$a}"; | 344 | return "{$b}{$d}{$p}{$a}"; |
345 | } | 345 | } |
346 | if($C['abs_url']){ | 346 | if($C['abs_url']){ |
347 | if($C['abs_url'] == -1 && strpos($p, $C['base_url']) === 0){ // Make url rel | 347 | if($C['abs_url'] == -1 && strpos($p, $C['base_url']) === 0){ // Make url rel |
348 | $p = substr($p, strlen($C['base_url'])); | 348 | $p = substr($p, strlen($C['base_url'])); |
349 | }elseif(empty($m[1])){ // Make URL abs | 349 | }elseif(empty($m[1])){ // Make URL abs |
350 | if(substr($p, 0, 2) == '//'){$p = substr($C['base_url'], 0, strpos($C['base_url'], ':')+1). $p;} | 350 | if(substr($p, 0, 2) == '//'){$p = substr($C['base_url'], 0, strpos($C['base_url'], ':')+1). $p;} |
351 | elseif($p[0] == '/'){$p = preg_replace('`(^.+?://[^/]+)(.*)`', '$1', $C['base_url']). $p;} | 351 | elseif($p[0] == '/'){$p = preg_replace('`(^.+?://[^/]+)(.*)`', '$1', $C['base_url']). $p;} |
352 | elseif(strcspn($p, './')){$p = $C['base_url']. $p;} | 352 | elseif(strcspn($p, './')){$p = $C['base_url']. $p;} |
353 | else{ | 353 | else{ |
354 | preg_match('`^([a-zA-Z\d\-+.]+://[^/]+)(.*)`', $C['base_url'], $m); | 354 | preg_match('`^([a-zA-Z\d\-+.]+://[^/]+)(.*)`', $C['base_url'], $m); |
355 | $p = preg_replace('`(?<=/)\./`', '', $m[2]. $p); | 355 | $p = preg_replace('`(?<=/)\./`', '', $m[2]. $p); |
356 | while(preg_match('`(?<=/)([^/]{3,}|[^/.]+?|\.[^/.]|[^/.]\.)/\.\./`', $p)){ | 356 | while(preg_match('`(?<=/)([^/]{3,}|[^/.]+?|\.[^/.]|[^/.]\.)/\.\./`', $p)){ |
357 | $p = preg_replace('`(?<=/)([^/]{3,}|[^/.]+?|\.[^/.]|[^/.]\.)/\.\./`', '', $p); | 357 | $p = preg_replace('`(?<=/)([^/]{3,}|[^/.]+?|\.[^/.]|[^/.]\.)/\.\./`', '', $p); |
358 | } | 358 | } |
359 | $p = $m[1]. $p; | 359 | $p = $m[1]. $p; |
360 | } | 360 | } |
361 | } | 361 | } |
362 | } | 362 | } |
363 | return "{$b}{$p}{$a}"; | 363 | return "{$b}{$p}{$a}"; |
364 | } | 364 | } |
365 | 365 | ||
366 | function hl_regex($p){ | 366 | function hl_regex($p){ |
367 | // check regex | 367 | // check regex |
368 | if(empty($p)){return 0;} | 368 | if(empty($p)){return 0;} |
369 | if($v = function_exists('error_clear_last') && function_exists('error_get_last')){error_clear_last();} | 369 | if($v = function_exists('error_clear_last') && function_exists('error_get_last')){error_clear_last();} |
370 | else{ | 370 | else{ |
371 | if($t = ini_get('track_errors')){$o = isset($php_errormsg) ? $php_errormsg : null;} | 371 | if($t = ini_get('track_errors')){$o = isset($php_errormsg) ? $php_errormsg : null;} |
372 | else{ini_set('track_errors', 1);} | 372 | else{ini_set('track_errors', 1);} |
373 | unset($php_errormsg); | 373 | unset($php_errormsg); |
374 | } | 374 | } |
375 | if(($d = ini_get('display_errors'))){ini_set('display_errors', 0);} | 375 | if(($d = ini_get('display_errors'))){ini_set('display_errors', 0);} |
376 | preg_match($p, ''); | 376 | preg_match($p, ''); |
377 | if($v){$r = error_get_last() == null ? 1 : 0; } | 377 | if($v){$r = error_get_last() == null ? 1 : 0; } |
378 | else{ | 378 | else{ |
379 | $r = isset($php_errormsg) ? 0 : 1; | 379 | $r = isset($php_errormsg) ? 0 : 1; |
380 | if($t){$php_errormsg = isset($o) ? $o : null;} | 380 | if($t){$php_errormsg = isset($o) ? $o : null;} |
381 | else{ini_set('track_errors', 0);} | 381 | else{ini_set('track_errors', 0);} |
382 | } | 382 | } |
383 | if($d){ini_set('display_errors', 1);} | 383 | if($d){ini_set('display_errors', 1);} |
384 | return $r; | 384 | return $r; |
385 | } | 385 | } |
386 | 386 | ||
387 | function hl_spec($t){ | 387 | function hl_spec($t){ |
388 | // final $spec | 388 | // final $spec |
389 | $s = array(); | 389 | $s = array(); |
390 | if(!function_exists('hl_aux1')){function hl_aux1($m){ | 390 | if(!function_exists('hl_aux1')){function hl_aux1($m){ |
391 | return substr(str_replace(array(";", "|", "~", " ", ",", "/", "(", ")", '`"'), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08", '"'), $m[0]), 1, -1); | 391 | return substr(str_replace(array(";", "|", "~", " ", ",", "/", "(", ")", '`"'), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08", '"'), $m[0]), 1, -1); |
392 | }} | 392 | }} |
393 | $t = str_replace(array("\t", "\r", "\n", ' '), '', preg_replace_callback('/"(?>(`.|[^"])*)"/sm', 'hl_aux1', trim($t))); | 393 | $t = str_replace(array("\t", "\r", "\n", ' '), '', preg_replace_callback('/"(?>(`.|[^"])*)"/sm', 'hl_aux1', trim($t))); |
394 | for($i = count(($t = explode(';', $t))); --$i>=0;){ | 394 | for($i = count(($t = explode(';', $t))); --$i>=0;){ |
395 | $w = $t[$i]; | 395 | $w = $t[$i]; |
396 | if(empty($w) or ($e = strpos($w, '=')) === false or !strlen(($a = substr($w, $e+1)))){continue;} | 396 | if(empty($w) or ($e = strpos($w, '=')) === false or !strlen(($a = substr($w, $e+1)))){continue;} |
397 | $y = $n = array(); | 397 | $y = $n = array(); |
398 | foreach(explode(',', $a) as $v){ | 398 | foreach(explode(',', $a) as $v){ |
399 | if(!preg_match('`^([a-z:\-\*]+)(?:\((.*?)\))?`i', $v, $m)){continue;} | 399 | if(!preg_match('`^([a-z:\-\*]+)(?:\((.*?)\))?`i', $v, $m)){continue;} |
400 | if(($x = strtolower($m[1])) == '-*'){$n['*'] = 1; continue;} | 400 | if(($x = strtolower($m[1])) == '-*'){$n['*'] = 1; continue;} |
401 | if($x[0] == '-'){$n[substr($x, 1)] = 1; continue;} | 401 | if($x[0] == '-'){$n[substr($x, 1)] = 1; continue;} |
402 | if(!isset($m[2])){$y[$x] = 1; continue;} | 402 | if(!isset($m[2])){$y[$x] = 1; continue;} |
403 | foreach(explode('/', $m[2]) as $m){ | 403 | foreach(explode('/', $m[2]) as $m){ |
404 | if(empty($m) or ($p = strpos($m, '=')) == 0 or $p < 5){$y[$x] = 1; continue;} | 404 | if(empty($m) or ($p = strpos($m, '=')) == 0 or $p < 5){$y[$x] = 1; continue;} |
405 | $y[$x][strtolower(substr($m, 0, $p))] = str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08"), array(";", "|", "~", " ", ",", "/", "(", ")"), substr($m, $p+1)); | 405 | $y[$x][strtolower(substr($m, 0, $p))] = str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08"), array(";", "|", "~", " ", ",", "/", "(", ")"), substr($m, $p+1)); |
406 | } | 406 | } |
407 | if(isset($y[$x]['match']) && !hl_regex($y[$x]['match'])){unset($y[$x]['match']);} | 407 | if(isset($y[$x]['match']) && !hl_regex($y[$x]['match'])){unset($y[$x]['match']);} |
408 | if(isset($y[$x]['nomatch']) && !hl_regex($y[$x]['nomatch'])){unset($y[$x]['nomatch']);} | 408 | if(isset($y[$x]['nomatch']) && !hl_regex($y[$x]['nomatch'])){unset($y[$x]['nomatch']);} |
409 | } | 409 | } |
410 | if(!count($y) && !count($n)){continue;} | 410 | if(!count($y) && !count($n)){continue;} |
411 | foreach(explode(',', substr($w, 0, $e)) as $v){ | 411 | foreach(explode(',', substr($w, 0, $e)) as $v){ |
412 | if(!strlen(($v = strtolower($v)))){continue;} | 412 | if(!strlen(($v = strtolower($v)))){continue;} |
413 | if(count($y)){if(!isset($s[$v])){$s[$v] = $y;} else{$s[$v] = array_merge($s[$v], $y);}} | 413 | if(count($y)){if(!isset($s[$v])){$s[$v] = $y;} else{$s[$v] = array_merge($s[$v], $y);}} |
414 | if(count($n)){if(!isset($s[$v]['n'])){$s[$v]['n'] = $n;} else{$s[$v]['n'] = array_merge($s[$v]['n'], $n);}} | 414 | if(count($n)){if(!isset($s[$v]['n'])){$s[$v]['n'] = $n;} else{$s[$v]['n'] = array_merge($s[$v]['n'], $n);}} |
415 | } | 415 | } |
416 | } | 416 | } |
417 | return $s; | 417 | return $s; |
418 | } | 418 | } |
419 | 419 | ||
420 | function hl_tag($t){ | 420 | function hl_tag($t){ |
421 | // tag/attribute handler | 421 | // tag/attribute handler |
422 | global $C; | 422 | global $C; |
423 | $t = $t[0]; | 423 | $t = $t[0]; |
424 | // invalid < > | 424 | // invalid < > |
425 | if($t == '< '){return '< ';} | 425 | if($t == '< '){return '< ';} |
426 | if($t == '>'){return '>';} | 426 | if($t == '>'){return '>';} |
427 | if(!preg_match('`^<(/?)([a-zA-Z][a-zA-Z1-6]*)([^>]*?)\s?>$`m', $t, $m)){ | 427 | if(!preg_match('`^<(/?)([a-zA-Z][a-zA-Z1-6]*)([^>]*?)\s?>$`m', $t, $m)){ |
428 | return str_replace(array('<', '>'), array('<', '>'), $t); | 428 | return str_replace(array('<', '>'), array('<', '>'), $t); |
429 | }elseif(!isset($C['elements'][($e = strtolower($m[2]))])){ | 429 | }elseif(!isset($C['elements'][($e = strtolower($m[2]))])){ |
430 | return (($C['keep_bad']%2) ? str_replace(array('<', '>'), array('<', '>'), $t) : ''); | 430 | return (($C['keep_bad']%2) ? str_replace(array('<', '>'), array('<', '>'), $t) : ''); |
431 | } | 431 | } |
432 | // attr string | 432 | // attr string |
433 | $a = str_replace(array("\n", "\r", "\t"), ' ', trim($m[3])); | 433 | $a = str_replace(array("\n", "\r", "\t"), ' ', trim($m[3])); |
434 | // tag transform | 434 | // tag transform |
435 | static $eD = array('acronym'=>1, 'applet'=>1, 'big'=>1, 'center'=>1, 'dir'=>1, 'font'=>1, 'isindex'=>1, 's'=>1, 'strike'=>1, 'tt'=>1); // Deprecated | 435 | static $eD = array('acronym'=>1, 'applet'=>1, 'big'=>1, 'center'=>1, 'dir'=>1, 'font'=>1, 'isindex'=>1, 's'=>1, 'strike'=>1, 'tt'=>1); // Deprecated |
436 | if($C['make_tag_strict'] && isset($eD[$e])){ | 436 | if($C['make_tag_strict'] && isset($eD[$e])){ |
437 | $trt = hl_tag2($e, $a, $C['make_tag_strict']); | 437 | $trt = hl_tag2($e, $a, $C['make_tag_strict']); |
438 | if(!$e){return (($C['keep_bad']%2) ? str_replace(array('<', '>'), array('<', '>'), $t) : '');} | 438 | if(!$e){return (($C['keep_bad']%2) ? str_replace(array('<', '>'), array('<', '>'), $t) : '');} |
439 | } | 439 | } |
440 | // close tag | 440 | // close tag |
441 | static $eE = array('area'=>1, 'br'=>1, 'col'=>1, 'command'=>1, 'embed'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'isindex'=>1, 'keygen'=>1, 'link'=>1, 'meta'=>1, 'param'=>1, 'source'=>1, 'track'=>1, 'wbr'=>1); // Empty ele | 441 | static $eE = array('area'=>1, 'br'=>1, 'col'=>1, 'command'=>1, 'embed'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'isindex'=>1, 'keygen'=>1, 'link'=>1, 'meta'=>1, 'param'=>1, 'source'=>1, 'track'=>1, 'wbr'=>1); // Empty ele |
442 | if(!empty($m[1])){ | 442 | if(!empty($m[1])){ |
443 | return (!isset($eE[$e]) ? (empty($C['hook_tag']) ? "</$e>" : $C['hook_tag']($e)) : (($C['keep_bad'])%2 ? str_replace(array('<', '>'), array('<', '>'), $t) : '')); | 443 | return (!isset($eE[$e]) ? (empty($C['hook_tag']) ? "</$e>" : $C['hook_tag']($e)) : (($C['keep_bad'])%2 ? str_replace(array('<', '>'), array('<', '>'), $t) : '')); |
444 | } | 444 | } |
445 | 445 | ||
446 | // open tag & attr | 446 | // open tag & attr |
447 | static $aN = array('abbr'=>array('td'=>1, 'th'=>1), 'accept'=>array('form'=>1, 'input'=>1), 'accept-charset'=>array('form'=>1), 'action'=>array('form'=>1), 'align'=>array('applet'=>1, 'caption'=>1, 'col'=>1, 'colgroup'=>1, 'div'=>1, 'embed'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'hr'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'legend'=>1, 'object'=>1, 'p'=>1, 'table'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1), 'allowfullscreen'=>array('iframe'=>1), 'alt'=>array('applet'=>1, 'area'=>1, 'img'=>1, 'input'=>1), 'archive'=>array('applet'=>1, 'object'=>1), 'async'=>array('script'=>1), 'autocomplete'=>array('form'=>1, 'input'=>1), 'autofocus'=>array('button'=>1, 'input'=>1, 'keygen'=>1, 'select'=>1, 'textarea'=>1), 'autoplay'=>array('audio'=>1, 'video'=>1), 'axis'=>array('td'=>1, 'th'=>1), 'bgcolor'=>array('embed'=>1, 'table'=>1, 'td'=>1, 'th'=>1, 'tr'=>1), 'border'=>array('img'=>1, 'object'=>1, 'table'=>1), 'bordercolor'=>array('table'=>1, 'td'=>1, 'tr'=>1), 'cellpadding'=>array('table'=>1), 'cellspacing'=>array('table'=>1), 'challenge'=>array('keygen'=>1), 'char'=>array('col'=>1, 'colgroup'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1), 'charoff'=>array('col'=>1, 'colgroup'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1), 'charset'=>array('a'=>1, 'script'=>1), 'checked'=>array('command'=>1, 'input'=>1), 'cite'=>array('blockquote'=>1, 'del'=>1, 'ins'=>1, 'q'=>1), 'classid'=>array('object'=>1), 'clear'=>array('br'=>1), 'code'=>array('applet'=>1), 'codebase'=>array('applet'=>1, 'object'=>1), 'codetype'=>array('object'=>1), 'color'=>array('font'=>1), 'cols'=>array('textarea'=>1), 'colspan'=>array('td'=>1, 'th'=>1), 'compact'=>array('dir'=>1, 'dl'=>1, 'menu'=>1, 'ol'=>1, 'ul'=>1), 'content'=>array('meta'=>1), 'controls'=>array('audio'=>1, 'video'=>1), 'coords'=>array('a'=>1, 'area'=>1), 'crossorigin'=>array('img'=>1), 'data'=>array('object'=>1), 'datetime'=>array('del'=>1, 'ins'=>1, 'time'=>1), 'declare'=>array('object'=>1), 'default'=>array('track'=>1), 'defer'=>array('script'=>1), 'dirname'=>array('input'=>1, 'textarea'=>1), 'disabled'=>array('button'=>1, 'command'=>1, 'fieldset'=>1, 'input'=>1, 'keygen'=>1, 'optgroup'=>1, 'option'=>1, 'select'=>1, 'textarea'=>1), 'download'=>array('a'=>1), 'enctype'=>array('form'=>1), 'face'=>array('font'=>1), 'flashvars'=>array('embed'=>1), 'for'=>array('label'=>1, 'output'=>1), 'form'=>array('button'=>1, 'fieldset'=>1, 'input'=>1, 'keygen'=>1, 'label'=>1, 'object'=>1, 'output'=>1, 'select'=>1, 'textarea'=>1), 'formaction'=>array('button'=>1, 'input'=>1), 'formenctype'=>array('button'=>1, 'input'=>1), 'formmethod'=>array('button'=>1, 'input'=>1), 'formnovalidate'=>array('button'=>1, 'input'=>1), 'formtarget'=>array('button'=>1, 'input'=>1), 'frame'=>array('table'=>1), 'frameborder'=>array('iframe'=>1), 'headers'=>array('td'=>1, 'th'=>1), 'height'=>array('applet'=>1, 'canvas'=>1, 'embed'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'object'=>1, 'td'=>1, 'th'=>1, 'video'=>1), 'high'=>array('meter'=>1), 'href'=>array('a'=>1, 'area'=>1, 'link'=>1), 'hreflang'=>array('a'=>1, 'area'=>1, 'link'=>1), 'hspace'=>array('applet'=>1, 'embed'=>1, 'img'=>1, 'object'=>1), 'icon'=>array('command'=>1), 'ismap'=>array('img'=>1, 'input'=>1), 'keyparams'=>array('keygen'=>1), 'keytype'=>array('keygen'=>1), 'kind'=>array('track'=>1), 'label'=>array('command'=>1, 'menu'=>1, 'option'=>1, 'optgroup'=>1, 'track'=>1), 'language'=>array('script'=>1), 'list'=>array('input'=>1), 'longdesc'=>array('img'=>1, 'iframe'=>1), 'loop'=>array('audio'=>1, 'video'=>1), 'low'=>array('meter'=>1), 'marginheight'=>array('iframe'=>1), 'marginwidth'=>array('iframe'=>1), 'max'=>array('input'=>1, 'meter'=>1, 'progress'=>1), 'maxlength'=>array('input'=>1, 'textarea'=>1), 'media'=>array('a'=>1, 'area'=>1, 'link'=>1, 'source'=>1, 'style'=>1), 'mediagroup'=>array('audio'=>1, 'video'=>1), 'method'=>array('form'=>1), 'min'=>array('input'=>1, 'meter'=>1), 'model'=>array('embed'=>1), 'multiple'=>array('input'=>1, 'select'=>1), 'muted'=>array('audio'=>1, 'video'=>1), 'name'=>array('a'=>1, 'applet'=>1, 'button'=>1, 'embed'=>1, 'fieldset'=>1, 'form'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'keygen'=>1, 'map'=>1, 'object'=>1, 'output'=>1, 'param'=>1, 'select'=>1, 'textarea'=>1), 'nohref'=>array('area'=>1), 'noshade'=>array('hr'=>1), 'novalidate'=>array('form'=>1), 'nowrap'=>array('td'=>1, 'th'=>1), 'object'=>array('applet'=>1), 'open'=>array('details'=>1), 'optimum'=>array('meter'=>1), 'pattern'=>array('input'=>1), 'ping'=>array('a'=>1, 'area'=>1), 'placeholder'=>array('input'=>1, 'textarea'=>1), 'pluginspage'=>array('embed'=>1), 'pluginurl'=>array('embed'=>1), 'poster'=>array('video'=>1), 'pqg'=>array('keygen'=>1), 'preload'=>array('audio'=>1, 'video'=>1), 'prompt'=>array('isindex'=>1), 'pubdate'=>array('time'=>1), 'radiogroup'=>array('command'=>1), 'readonly'=>array('input'=>1, 'textarea'=>1), 'rel'=>array('a'=>1, 'area'=>1, 'link'=>1), 'required'=>array('input'=>1, 'select'=>1, 'textarea'=>1), 'rev'=>array('a'=>1), 'reversed'=>array('ol'=>1), 'rows'=>array('textarea'=>1), 'rowspan'=>array('td'=>1, 'th'=>1), 'rules'=>array('table'=>1), 'sandbox'=>array('iframe'=>1), 'scope'=>array('td'=>1, 'th'=>1), 'scoped'=>array('style'=>1), 'scrolling'=>array('iframe'=>1), 'seamless'=>array('iframe'=>1), 'selected'=>array('option'=>1), 'shape'=>array('a'=>1, 'area'=>1), 'size'=>array('font'=>1, 'hr'=>1, 'input'=>1, 'select'=>1), 'sizes'=>array('link'=>1), 'span'=>array('col'=>1, 'colgroup'=>1), 'src'=>array('audio'=>1, 'embed'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'script'=>1, 'source'=>1, 'track'=>1, 'video'=>1), 'srcdoc'=>array('iframe'=>1), 'srclang'=>array('track'=>1), 'srcset'=>array('img'=>1), 'standby'=>array('object'=>1), 'start'=>array('ol'=>1), 'step'=>array('input'=>1), 'summary'=>array('table'=>1), 'target'=>array('a'=>1, 'area'=>1, 'form'=>1), 'type'=>array('a'=>1, 'area'=>1, 'button'=>1, 'command'=>1, 'embed'=>1, 'input'=>1, 'li'=>1, 'link'=>1, 'menu'=>1, 'object'=>1, 'ol'=>1, 'param'=>1, 'script'=>1, 'source'=>1, 'style'=>1, 'ul'=>1), 'typemustmatch'=>array('object'=>1), 'usemap'=>array('img'=>1, 'input'=>1, 'object'=>1), 'valign'=>array('col'=>1, 'colgroup'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1), 'value'=>array('button'=>1, 'data'=>1, 'input'=>1, 'li'=>1, 'meter'=>1, 'option'=>1, 'param'=>1, 'progress'=>1), 'valuetype'=>array('param'=>1), 'vspace'=>array('applet'=>1, 'embed'=>1, 'img'=>1, 'object'=>1), 'width'=>array('applet'=>1, 'canvas'=>1, 'col'=>1, 'colgroup'=>1, 'embed'=>1, 'hr'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'object'=>1, 'pre'=>1, 'table'=>1, 'td'=>1, 'th'=>1, 'video'=>1), 'wmode'=>array('embed'=>1), 'wrap'=>array('textarea'=>1)); // Ele-specific | 447 | static $aN = array('abbr'=>array('td'=>1, 'th'=>1), 'accept'=>array('form'=>1, 'input'=>1), 'accept-charset'=>array('form'=>1), 'action'=>array('form'=>1), 'align'=>array('applet'=>1, 'caption'=>1, 'col'=>1, 'colgroup'=>1, 'div'=>1, 'embed'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'hr'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'legend'=>1, 'object'=>1, 'p'=>1, 'table'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1), 'allowfullscreen'=>array('iframe'=>1), 'alt'=>array('applet'=>1, 'area'=>1, 'img'=>1, 'input'=>1), 'archive'=>array('applet'=>1, 'object'=>1), 'async'=>array('script'=>1), 'autocomplete'=>array('form'=>1, 'input'=>1), 'autofocus'=>array('button'=>1, 'input'=>1, 'keygen'=>1, 'select'=>1, 'textarea'=>1), 'autoplay'=>array('audio'=>1, 'video'=>1), 'axis'=>array('td'=>1, 'th'=>1), 'bgcolor'=>array('embed'=>1, 'table'=>1, 'td'=>1, 'th'=>1, 'tr'=>1), 'border'=>array('img'=>1, 'object'=>1, 'table'=>1), 'bordercolor'=>array('table'=>1, 'td'=>1, 'tr'=>1), 'cellpadding'=>array('table'=>1), 'cellspacing'=>array('table'=>1), 'challenge'=>array('keygen'=>1), 'char'=>array('col'=>1, 'colgroup'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1), 'charoff'=>array('col'=>1, 'colgroup'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1), 'charset'=>array('a'=>1, 'script'=>1), 'checked'=>array('command'=>1, 'input'=>1), 'cite'=>array('blockquote'=>1, 'del'=>1, 'ins'=>1, 'q'=>1), 'classid'=>array('object'=>1), 'clear'=>array('br'=>1), 'code'=>array('applet'=>1), 'codebase'=>array('applet'=>1, 'object'=>1), 'codetype'=>array('object'=>1), 'color'=>array('font'=>1), 'cols'=>array('textarea'=>1), 'colspan'=>array('td'=>1, 'th'=>1), 'compact'=>array('dir'=>1, 'dl'=>1, 'menu'=>1, 'ol'=>1, 'ul'=>1), 'content'=>array('meta'=>1), 'controls'=>array('audio'=>1, 'video'=>1), 'coords'=>array('a'=>1, 'area'=>1), 'crossorigin'=>array('img'=>1), 'data'=>array('object'=>1), 'datetime'=>array('del'=>1, 'ins'=>1, 'time'=>1), 'declare'=>array('object'=>1), 'default'=>array('track'=>1), 'defer'=>array('script'=>1), 'dirname'=>array('input'=>1, 'textarea'=>1), 'disabled'=>array('button'=>1, 'command'=>1, 'fieldset'=>1, 'input'=>1, 'keygen'=>1, 'optgroup'=>1, 'option'=>1, 'select'=>1, 'textarea'=>1), 'download'=>array('a'=>1), 'enctype'=>array('form'=>1), 'face'=>array('font'=>1), 'flashvars'=>array('embed'=>1), 'for'=>array('label'=>1, 'output'=>1), 'form'=>array('button'=>1, 'fieldset'=>1, 'input'=>1, 'keygen'=>1, 'label'=>1, 'object'=>1, 'output'=>1, 'select'=>1, 'textarea'=>1), 'formaction'=>array('button'=>1, 'input'=>1), 'formenctype'=>array('button'=>1, 'input'=>1), 'formmethod'=>array('button'=>1, 'input'=>1), 'formnovalidate'=>array('button'=>1, 'input'=>1), 'formtarget'=>array('button'=>1, 'input'=>1), 'frame'=>array('table'=>1), 'frameborder'=>array('iframe'=>1), 'headers'=>array('td'=>1, 'th'=>1), 'height'=>array('applet'=>1, 'canvas'=>1, 'embed'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'object'=>1, 'td'=>1, 'th'=>1, 'video'=>1), 'high'=>array('meter'=>1), 'href'=>array('a'=>1, 'area'=>1, 'link'=>1), 'hreflang'=>array('a'=>1, 'area'=>1, 'link'=>1), 'hspace'=>array('applet'=>1, 'embed'=>1, 'img'=>1, 'object'=>1), 'icon'=>array('command'=>1), 'ismap'=>array('img'=>1, 'input'=>1), 'keyparams'=>array('keygen'=>1), 'keytype'=>array('keygen'=>1), 'kind'=>array('track'=>1), 'label'=>array('command'=>1, 'menu'=>1, 'option'=>1, 'optgroup'=>1, 'track'=>1), 'language'=>array('script'=>1), 'list'=>array('input'=>1), 'longdesc'=>array('img'=>1, 'iframe'=>1), 'loop'=>array('audio'=>1, 'video'=>1), 'low'=>array('meter'=>1), 'marginheight'=>array('iframe'=>1), 'marginwidth'=>array('iframe'=>1), 'max'=>array('input'=>1, 'meter'=>1, 'progress'=>1), 'maxlength'=>array('input'=>1, 'textarea'=>1), 'media'=>array('a'=>1, 'area'=>1, 'link'=>1, 'source'=>1, 'style'=>1), 'mediagroup'=>array('audio'=>1, 'video'=>1), 'method'=>array('form'=>1), 'min'=>array('input'=>1, 'meter'=>1), 'model'=>array('embed'=>1), 'multiple'=>array('input'=>1, 'select'=>1), 'muted'=>array('audio'=>1, 'video'=>1), 'name'=>array('a'=>1, 'applet'=>1, 'button'=>1, 'embed'=>1, 'fieldset'=>1, 'form'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'keygen'=>1, 'map'=>1, 'object'=>1, 'output'=>1, 'param'=>1, 'select'=>1, 'textarea'=>1), 'nohref'=>array('area'=>1), 'noshade'=>array('hr'=>1), 'novalidate'=>array('form'=>1), 'nowrap'=>array('td'=>1, 'th'=>1), 'object'=>array('applet'=>1), 'open'=>array('details'=>1), 'optimum'=>array('meter'=>1), 'pattern'=>array('input'=>1), 'ping'=>array('a'=>1, 'area'=>1), 'placeholder'=>array('input'=>1, 'textarea'=>1), 'pluginspage'=>array('embed'=>1), 'pluginurl'=>array('embed'=>1), 'poster'=>array('video'=>1), 'pqg'=>array('keygen'=>1), 'preload'=>array('audio'=>1, 'video'=>1), 'prompt'=>array('isindex'=>1), 'pubdate'=>array('time'=>1), 'radiogroup'=>array('command'=>1), 'readonly'=>array('input'=>1, 'textarea'=>1), 'rel'=>array('a'=>1, 'area'=>1, 'link'=>1), 'required'=>array('input'=>1, 'select'=>1, 'textarea'=>1), 'rev'=>array('a'=>1), 'reversed'=>array('ol'=>1), 'rows'=>array('textarea'=>1), 'rowspan'=>array('td'=>1, 'th'=>1), 'rules'=>array('table'=>1), 'sandbox'=>array('iframe'=>1), 'scope'=>array('td'=>1, 'th'=>1), 'scoped'=>array('style'=>1), 'scrolling'=>array('iframe'=>1), 'seamless'=>array('iframe'=>1), 'selected'=>array('option'=>1), 'shape'=>array('a'=>1, 'area'=>1), 'size'=>array('font'=>1, 'hr'=>1, 'input'=>1, 'select'=>1), 'sizes'=>array('link'=>1), 'span'=>array('col'=>1, 'colgroup'=>1), 'src'=>array('audio'=>1, 'embed'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'script'=>1, 'source'=>1, 'track'=>1, 'video'=>1), 'srcdoc'=>array('iframe'=>1), 'srclang'=>array('track'=>1), 'srcset'=>array('img'=>1), 'standby'=>array('object'=>1), 'start'=>array('ol'=>1), 'step'=>array('input'=>1), 'summary'=>array('table'=>1), 'target'=>array('a'=>1, 'area'=>1, 'form'=>1), 'type'=>array('a'=>1, 'area'=>1, 'button'=>1, 'command'=>1, 'embed'=>1, 'input'=>1, 'li'=>1, 'link'=>1, 'menu'=>1, 'object'=>1, 'ol'=>1, 'param'=>1, 'script'=>1, 'source'=>1, 'style'=>1, 'ul'=>1), 'typemustmatch'=>array('object'=>1), 'usemap'=>array('img'=>1, 'input'=>1, 'object'=>1), 'valign'=>array('col'=>1, 'colgroup'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1), 'value'=>array('button'=>1, 'data'=>1, 'input'=>1, 'li'=>1, 'meter'=>1, 'option'=>1, 'param'=>1, 'progress'=>1), 'valuetype'=>array('param'=>1), 'vspace'=>array('applet'=>1, 'embed'=>1, 'img'=>1, 'object'=>1), 'width'=>array('applet'=>1, 'canvas'=>1, 'col'=>1, 'colgroup'=>1, 'embed'=>1, 'hr'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'object'=>1, 'pre'=>1, 'table'=>1, 'td'=>1, 'th'=>1, 'video'=>1), 'wmode'=>array('embed'=>1), 'wrap'=>array('textarea'=>1)); // Ele-specific |
448 | static $aNA = array('aria-activedescendant'=>1, 'aria-atomic'=>1, 'aria-autocomplete'=>1, 'aria-busy'=>1, 'aria-checked'=>1, 'aria-controls'=>1, 'aria-describedby'=>1, 'aria-disabled'=>1, 'aria-dropeffect'=>1, 'aria-expanded'=>1, 'aria-flowto'=>1, 'aria-grabbed'=>1, 'aria-haspopup'=>1, 'aria-hidden'=>1, 'aria-invalid'=>1, 'aria-label'=>1, 'aria-labelledby'=>1, 'aria-level'=>1, 'aria-live'=>1, 'aria-multiline'=>1, 'aria-multiselectable'=>1, 'aria-orientation'=>1, 'aria-owns'=>1, 'aria-posinset'=>1, 'aria-pressed'=>1, 'aria-readonly'=>1, 'aria-relevant'=>1, 'aria-required'=>1, 'aria-selected'=>1, 'aria-setsize'=>1, 'aria-sort'=>1, 'aria-valuemax'=>1, 'aria-valuemin'=>1, 'aria-valuenow'=>1, 'aria-valuetext'=>1); // ARIA | 448 | static $aNA = array('aria-activedescendant'=>1, 'aria-atomic'=>1, 'aria-autocomplete'=>1, 'aria-busy'=>1, 'aria-checked'=>1, 'aria-controls'=>1, 'aria-describedby'=>1, 'aria-disabled'=>1, 'aria-dropeffect'=>1, 'aria-expanded'=>1, 'aria-flowto'=>1, 'aria-grabbed'=>1, 'aria-haspopup'=>1, 'aria-hidden'=>1, 'aria-invalid'=>1, 'aria-label'=>1, 'aria-labelledby'=>1, 'aria-level'=>1, 'aria-live'=>1, 'aria-multiline'=>1, 'aria-multiselectable'=>1, 'aria-orientation'=>1, 'aria-owns'=>1, 'aria-posinset'=>1, 'aria-pressed'=>1, 'aria-readonly'=>1, 'aria-relevant'=>1, 'aria-required'=>1, 'aria-selected'=>1, 'aria-setsize'=>1, 'aria-sort'=>1, 'aria-valuemax'=>1, 'aria-valuemin'=>1, 'aria-valuenow'=>1, 'aria-valuetext'=>1); // ARIA |
449 | static $aNE = array('allowfullscreen'=>1, 'checkbox'=>1, 'checked'=>1, 'command'=>1, 'compact'=>1, 'declare'=>1, 'defer'=>1, 'default'=>1, 'disabled'=>1, 'hidden'=>1, 'inert'=>1, 'ismap'=>1, 'itemscope'=>1, 'multiple'=>1, 'nohref'=>1, 'noresize'=>1, 'noshade'=>1, 'nowrap'=>1, 'open'=>1, 'radio'=>1, 'readonly'=>1, 'required'=>1, 'reversed'=>1, 'selected'=>1); // Empty | 449 | static $aNE = array('allowfullscreen'=>1, 'checkbox'=>1, 'checked'=>1, 'command'=>1, 'compact'=>1, 'declare'=>1, 'defer'=>1, 'default'=>1, 'disabled'=>1, 'hidden'=>1, 'inert'=>1, 'ismap'=>1, 'itemscope'=>1, 'multiple'=>1, 'nohref'=>1, 'noresize'=>1, 'noshade'=>1, 'nowrap'=>1, 'open'=>1, 'radio'=>1, 'readonly'=>1, 'required'=>1, 'reversed'=>1, 'selected'=>1); // Empty |
450 | static $aNO = array('onabort'=>1, 'onblur'=>1, 'oncanplay'=>1, 'oncanplaythrough'=>1, 'onchange'=>1, 'onclick'=>1, 'oncontextmenu'=>1, 'oncopy'=>1, 'oncuechange'=>1, 'oncut'=>1, 'ondblclick'=>1, 'ondrag'=>1, 'ondragend'=>1, 'ondragenter'=>1, 'ondragleave'=>1, 'ondragover'=>1, 'ondragstart'=>1, 'ondrop'=>1, 'ondurationchange'=>1, 'onemptied'=>1, 'onended'=>1, 'onerror'=>1, 'onfocus'=>1, 'onformchange'=>1, 'onforminput'=>1, 'oninput'=>1, 'oninvalid'=>1, 'onkeydown'=>1, 'onkeypress'=>1, 'onkeyup'=>1, 'onload'=>1, 'onloadeddata'=>1, 'onloadedmetadata'=>1, 'onloadstart'=>1, 'onlostpointercapture'=>1, 'onmousedown'=>1, 'onmousemove'=>1, 'onmouseout'=>1, 'onmouseover'=>1, 'onmouseup'=>1, 'onmousewheel'=>1, 'onpaste'=>1, 'onpause'=>1, 'onplay'=>1, 'onplaying'=>1, 'onpointercancel'=>1, 'ongotpointercapture'=>1, 'onpointerdown'=>1, 'onpointerenter'=>1, 'onpointerleave'=>1, 'onpointermove'=>1, 'onpointerout'=>1, 'onpointerover'=>1, 'onpointerup'=>1, 'onprogress'=>1, 'onratechange'=>1, 'onreadystatechange'=>1, 'onreset'=>1, 'onsearch'=>1, 'onscroll'=>1, 'onseeked'=>1, 'onseeking'=>1, 'onselect'=>1, 'onshow'=>1, 'onstalled'=>1, 'onsubmit'=>1, 'onsuspend'=>1, 'ontimeupdate'=>1, 'ontoggle'=>1, 'ontouchcancel'=>1, 'ontouchend'=>1, 'ontouchmove'=>1, 'ontouchstart'=>1, 'onvolumechange'=>1, 'onwaiting'=>1, 'onwheel'=>1); // Event | 450 | static $aNO = array('onabort'=>1, 'onblur'=>1, 'oncanplay'=>1, 'oncanplaythrough'=>1, 'onchange'=>1, 'onclick'=>1, 'oncontextmenu'=>1, 'oncopy'=>1, 'oncuechange'=>1, 'oncut'=>1, 'ondblclick'=>1, 'ondrag'=>1, 'ondragend'=>1, 'ondragenter'=>1, 'ondragleave'=>1, 'ondragover'=>1, 'ondragstart'=>1, 'ondrop'=>1, 'ondurationchange'=>1, 'onemptied'=>1, 'onended'=>1, 'onerror'=>1, 'onfocus'=>1, 'onformchange'=>1, 'onforminput'=>1, 'oninput'=>1, 'oninvalid'=>1, 'onkeydown'=>1, 'onkeypress'=>1, 'onkeyup'=>1, 'onload'=>1, 'onloadeddata'=>1, 'onloadedmetadata'=>1, 'onloadstart'=>1, 'onlostpointercapture'=>1, 'onmousedown'=>1, 'onmousemove'=>1, 'onmouseout'=>1, 'onmouseover'=>1, 'onmouseup'=>1, 'onmousewheel'=>1, 'onpaste'=>1, 'onpause'=>1, 'onplay'=>1, 'onplaying'=>1, 'onpointercancel'=>1, 'ongotpointercapture'=>1, 'onpointerdown'=>1, 'onpointerenter'=>1, 'onpointerleave'=>1, 'onpointermove'=>1, 'onpointerout'=>1, 'onpointerover'=>1, 'onpointerup'=>1, 'onprogress'=>1, 'onratechange'=>1, 'onreadystatechange'=>1, 'onreset'=>1, 'onsearch'=>1, 'onscroll'=>1, 'onseeked'=>1, 'onseeking'=>1, 'onselect'=>1, 'onshow'=>1, 'onstalled'=>1, 'onsubmit'=>1, 'onsuspend'=>1, 'ontimeupdate'=>1, 'ontoggle'=>1, 'ontouchcancel'=>1, 'ontouchend'=>1, 'ontouchmove'=>1, 'ontouchstart'=>1, 'onvolumechange'=>1, 'onwaiting'=>1, 'onwheel'=>1); // Event |
451 | static $aNP = array('action'=>1, 'cite'=>1, 'classid'=>1, 'codebase'=>1, 'data'=>1, 'href'=>1, 'itemtype'=>1, 'longdesc'=>1, 'model'=>1, 'pluginspage'=>1, 'pluginurl'=>1, 'src'=>1, 'srcset'=>1, 'usemap'=>1); // Need scheme check; excludes style, on* | 451 | static $aNP = array('action'=>1, 'cite'=>1, 'classid'=>1, 'codebase'=>1, 'data'=>1, 'href'=>1, 'itemtype'=>1, 'longdesc'=>1, 'model'=>1, 'pluginspage'=>1, 'pluginurl'=>1, 'src'=>1, 'srcset'=>1, 'usemap'=>1); // Need scheme check; excludes style, on* |
452 | static $aNU = array('accesskey'=>1, 'class'=>1, 'contenteditable'=>1, 'contextmenu'=>1, 'dir'=>1, 'draggable'=>1, 'dropzone'=>1, 'hidden'=>1, 'id'=>1, 'inert'=>1, 'itemid'=>1, 'itemprop'=>1, 'itemref'=>1, 'itemscope'=>1, 'itemtype'=>1, 'lang'=>1, 'role'=>1, 'spellcheck'=>1, 'style'=>1, 'tabindex'=>1, 'title'=>1, 'translate'=>1, 'xmlns'=>1, 'xml:base'=>1, 'xml:lang'=>1, 'xml:space'=>1); // Univ; excludes on*, aria* | 452 | static $aNU = array('accesskey'=>1, 'class'=>1, 'contenteditable'=>1, 'contextmenu'=>1, 'dir'=>1, 'draggable'=>1, 'dropzone'=>1, 'hidden'=>1, 'id'=>1, 'inert'=>1, 'itemid'=>1, 'itemprop'=>1, 'itemref'=>1, 'itemscope'=>1, 'itemtype'=>1, 'lang'=>1, 'role'=>1, 'spellcheck'=>1, 'style'=>1, 'tabindex'=>1, 'title'=>1, 'translate'=>1, 'xmlns'=>1, 'xml:base'=>1, 'xml:lang'=>1, 'xml:space'=>1); // Univ; excludes on*, aria* |
453 | 453 | ||
454 | if($C['lc_std_val']){ | 454 | if($C['lc_std_val']){ |
455 | // predef attr vals for $eAL & $aNE ele | 455 | // predef attr vals for $eAL & $aNE ele |
456 | static $aNL = array('all'=>1, 'auto'=>1, 'baseline'=>1, 'bottom'=>1, 'button'=>1, 'captions'=>1, 'center'=>1, 'chapters'=>1, 'char'=>1, 'checkbox'=>1, 'circle'=>1, 'col'=>1, 'colgroup'=>1, 'color'=>1, 'cols'=>1, 'data'=>1, 'date'=>1, 'datetime'=>1, 'datetime-local'=>1, 'default'=>1, 'descriptions'=>1, 'email'=>1, 'file'=>1, 'get'=>1, 'groups'=>1, 'hidden'=>1, 'image'=>1, 'justify'=>1, 'left'=>1, 'ltr'=>1, 'metadata'=>1, 'middle'=>1, 'month'=>1, 'none'=>1, 'number'=>1, 'object'=>1, 'password'=>1, 'poly'=>1, 'post'=>1, 'preserve'=>1, 'radio'=>1, 'range'=>1, 'rect'=>1, 'ref'=>1, 'reset'=>1, 'right'=>1, 'row'=>1, 'rowgroup'=>1, 'rows'=>1, 'rtl'=>1, 'search'=>1, 'submit'=>1, 'subtitles'=>1, 'tel'=>1, 'text'=>1, 'time'=>1, 'top'=>1, 'url'=>1, 'week'=>1); | 456 | static $aNL = array('all'=>1, 'auto'=>1, 'baseline'=>1, 'bottom'=>1, 'button'=>1, 'captions'=>1, 'center'=>1, 'chapters'=>1, 'char'=>1, 'checkbox'=>1, 'circle'=>1, 'col'=>1, 'colgroup'=>1, 'color'=>1, 'cols'=>1, 'data'=>1, 'date'=>1, 'datetime'=>1, 'datetime-local'=>1, 'default'=>1, 'descriptions'=>1, 'email'=>1, 'file'=>1, 'get'=>1, 'groups'=>1, 'hidden'=>1, 'image'=>1, 'justify'=>1, 'left'=>1, 'ltr'=>1, 'metadata'=>1, 'middle'=>1, 'month'=>1, 'none'=>1, 'number'=>1, 'object'=>1, 'password'=>1, 'poly'=>1, 'post'=>1, 'preserve'=>1, 'radio'=>1, 'range'=>1, 'rect'=>1, 'ref'=>1, 'reset'=>1, 'right'=>1, 'row'=>1, 'rowgroup'=>1, 'rows'=>1, 'rtl'=>1, 'search'=>1, 'submit'=>1, 'subtitles'=>1, 'tel'=>1, 'text'=>1, 'time'=>1, 'top'=>1, 'url'=>1, 'week'=>1); |
457 | static $eAL = array('a'=>1, 'area'=>1, 'bdo'=>1, 'button'=>1, 'col'=>1, 'fieldset'=>1, 'form'=>1, 'img'=>1, 'input'=>1, 'object'=>1, 'ol'=>1, 'optgroup'=>1, 'option'=>1, 'param'=>1, 'script'=>1, 'select'=>1, 'table'=>1, 'td'=>1, 'textarea'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1, 'track'=>1, 'xml:space'=>1); | 457 | static $eAL = array('a'=>1, 'area'=>1, 'bdo'=>1, 'button'=>1, 'col'=>1, 'fieldset'=>1, 'form'=>1, 'img'=>1, 'input'=>1, 'object'=>1, 'ol'=>1, 'optgroup'=>1, 'option'=>1, 'param'=>1, 'script'=>1, 'select'=>1, 'table'=>1, 'td'=>1, 'textarea'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1, 'track'=>1, 'xml:space'=>1); |
458 | $lcase = isset($eAL[$e]) ? 1 : 0; | 458 | $lcase = isset($eAL[$e]) ? 1 : 0; |
459 | } | 459 | } |
460 | 460 | ||
461 | $depTr = 0; | 461 | $depTr = 0; |
462 | if($C['no_deprecated_attr']){ | 462 | if($C['no_deprecated_attr']){ |
463 | // depr attr:applicable ele | 463 | // depr attr:applicable ele |
464 | static $aND = array('align'=>array('caption'=>1, 'div'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'legend'=>1, 'object'=>1, 'p'=>1, 'table'=>1), 'bgcolor'=>array('table'=>1, 'td'=>1, 'th'=>1, 'tr'=>1), 'border'=>array('object'=>1), 'bordercolor'=>array('table'=>1, 'td'=>1, 'tr'=>1), 'cellspacing'=>array('table'=>1), 'clear'=>array('br'=>1), 'compact'=>array('dl'=>1, 'ol'=>1, 'ul'=>1), 'height'=>array('td'=>1, 'th'=>1), 'hspace'=>array('img'=>1, 'object'=>1), 'language'=>array('script'=>1), 'name'=>array('a'=>1, 'form'=>1, 'iframe'=>1, 'img'=>1, 'map'=>1), 'noshade'=>array('hr'=>1), 'nowrap'=>array('td'=>1, 'th'=>1), 'size'=>array('hr'=>1), 'vspace'=>array('img'=>1, 'object'=>1), 'width'=>array('hr'=>1, 'pre'=>1, 'table'=>1, 'td'=>1, 'th'=>1)); | 464 | static $aND = array('align'=>array('caption'=>1, 'div'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'legend'=>1, 'object'=>1, 'p'=>1, 'table'=>1), 'bgcolor'=>array('table'=>1, 'td'=>1, 'th'=>1, 'tr'=>1), 'border'=>array('object'=>1), 'bordercolor'=>array('table'=>1, 'td'=>1, 'tr'=>1), 'cellspacing'=>array('table'=>1), 'clear'=>array('br'=>1), 'compact'=>array('dl'=>1, 'ol'=>1, 'ul'=>1), 'height'=>array('td'=>1, 'th'=>1), 'hspace'=>array('img'=>1, 'object'=>1), 'language'=>array('script'=>1), 'name'=>array('a'=>1, 'form'=>1, 'iframe'=>1, 'img'=>1, 'map'=>1), 'noshade'=>array('hr'=>1), 'nowrap'=>array('td'=>1, 'th'=>1), 'size'=>array('hr'=>1), 'vspace'=>array('img'=>1, 'object'=>1), 'width'=>array('hr'=>1, 'pre'=>1, 'table'=>1, 'td'=>1, 'th'=>1)); |
465 | static $eAD = array('a'=>1, 'br'=>1, 'caption'=>1, 'div'=>1, 'dl'=>1, 'form'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'hr'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'legend'=>1, 'map'=>1, 'object'=>1, 'ol'=>1, 'p'=>1, 'pre'=>1, 'script'=>1, 'table'=>1, 'td'=>1, 'th'=>1, 'tr'=>1, 'ul'=>1); | 465 | static $eAD = array('a'=>1, 'br'=>1, 'caption'=>1, 'div'=>1, 'dl'=>1, 'form'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'hr'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'legend'=>1, 'map'=>1, 'object'=>1, 'ol'=>1, 'p'=>1, 'pre'=>1, 'script'=>1, 'table'=>1, 'td'=>1, 'th'=>1, 'tr'=>1, 'ul'=>1); |
466 | $depTr = isset($eAD[$e]) ? 1 : 0; | 466 | $depTr = isset($eAD[$e]) ? 1 : 0; |
467 | } | 467 | } |
468 | 468 | ||
469 | // attr name-vals | 469 | // attr name-vals |
470 | if(strpos($a, "\x01") !== false){$a = preg_replace('`\x01[^\x01]*\x01`', '', $a);} // No comment/CDATA sec | 470 | if(strpos($a, "\x01") !== false){$a = preg_replace('`\x01[^\x01]*\x01`', '', $a);} // No comment/CDATA sec |
471 | $mode = 0; $a = trim($a, ' /'); $aA = array(); | 471 | $mode = 0; $a = trim($a, ' /'); $aA = array(); |
472 | while(strlen($a)){ | 472 | while(strlen($a)){ |
473 | $w = 0; | 473 | $w = 0; |
474 | switch($mode){ | 474 | switch($mode){ |
475 | case 0: // Name | 475 | case 0: // Name |
476 | if(preg_match('`^[a-zA-Z][^\s=/]+`', $a, $m)){ | 476 | if(preg_match('`^[a-zA-Z][^\s=/]+`', $a, $m)){ |
477 | $nm = strtolower($m[0]); | 477 | $nm = strtolower($m[0]); |
478 | $w = $mode = 1; $a = ltrim(substr_replace($a, '', 0, strlen($m[0]))); | 478 | $w = $mode = 1; $a = ltrim(substr_replace($a, '', 0, strlen($m[0]))); |
479 | } | 479 | } |
480 | break; case 1: | 480 | break; case 1: |
481 | if($a[0] == '='){ // = | 481 | if($a[0] == '='){ // = |
482 | $w = 1; $mode = 2; $a = ltrim($a, '= '); | 482 | $w = 1; $mode = 2; $a = ltrim($a, '= '); |
483 | }else{ // No val | 483 | }else{ // No val |
484 | $w = 1; $mode = 0; $a = ltrim($a); | 484 | $w = 1; $mode = 0; $a = ltrim($a); |
485 | $aA[$nm] = ''; | 485 | $aA[$nm] = ''; |
486 | } | 486 | } |
487 | break; case 2: // Val | 487 | break; case 2: // Val |
488 | if(preg_match('`^((?:"[^"]*")|(?:\'[^\']*\')|(?:\s*[^\s"\']+))(.*)`', $a, $m)){ | 488 | if(preg_match('`^((?:"[^"]*")|(?:\'[^\']*\')|(?:\s*[^\s"\']+))(.*)`', $a, $m)){ |
489 | $a = ltrim($m[2]); $m = $m[1]; $w = 1; $mode = 0; | 489 | $a = ltrim($m[2]); $m = $m[1]; $w = 1; $mode = 0; |
490 | $aA[$nm] = trim(str_replace('<', '<', ($m[0] == '"' or $m[0] == '\'') ? substr($m, 1, -1) : $m)); | 490 | $aA[$nm] = trim(str_replace('<', '<', ($m[0] == '"' or $m[0] == '\'') ? substr($m, 1, -1) : $m)); |
491 | } | 491 | } |
492 | break; | 492 | break; |
493 | } | 493 | } |
494 | if($w == 0){ // Parse errs, deal with space, " & ' | 494 | if($w == 0){ // Parse errs, deal with space, " & ' |
495 | $a = preg_replace('`^(?:"[^"]*("|$)|\'[^\']*(\'|$)|\S)*\s*`', '', $a); | 495 | $a = preg_replace('`^(?:"[^"]*("|$)|\'[^\']*(\'|$)|\S)*\s*`', '', $a); |
496 | $mode = 0; | 496 | $mode = 0; |
497 | } | 497 | } |
498 | } | 498 | } |
499 | if($mode == 1){$aA[$nm] = '';} | 499 | if($mode == 1){$aA[$nm] = '';} |
500 | 500 | ||
501 | // clean attrs | 501 | // clean attrs |
502 | global $S; | 502 | global $S; |
503 | $rl = isset($S[$e]) ? $S[$e] : array(); | 503 | $rl = isset($S[$e]) ? $S[$e] : array(); |
504 | $a = array(); $nfr = 0; $d = $C['deny_attribute']; | 504 | $a = array(); $nfr = 0; $d = $C['deny_attribute']; |
505 | foreach($aA as $k=>$v){ | 505 | foreach($aA as $k=>$v){ |
506 | if(((isset($d['*']) ? isset($d[$k]) : !isset($d[$k])) && (isset($aN[$k][$e]) or isset($aNU[$k]) or (isset($aNO[$k]) && !isset($d['on*'])) or (isset($aNA[$k]) && !isset($d['aria*'])) or (!isset($d['data*']) && preg_match('`data-((?!xml)[^:]+$)`', $k))) && !isset($rl['n'][$k]) && !isset($rl['n']['*'])) or isset($rl[$k])){ | 506 | if(((isset($d['*']) ? isset($d[$k]) : !isset($d[$k])) && (isset($aN[$k][$e]) or isset($aNU[$k]) or (isset($aNO[$k]) && !isset($d['on*'])) or (isset($aNA[$k]) && !isset($d['aria*'])) or (!isset($d['data*']) && preg_match('`data-((?!xml)[^:]+$)`', $k))) && !isset($rl['n'][$k]) && !isset($rl['n']['*'])) or isset($rl[$k])){ |
507 | if(isset($aNE[$k])){$v = $k;} | 507 | if(isset($aNE[$k])){$v = $k;} |
508 | elseif(!empty($lcase) && (($e != 'button' or $e != 'input') or $k == 'type')){ // Rather loose but ?not cause issues | 508 | elseif(!empty($lcase) && (($e != 'button' or $e != 'input') or $k == 'type')){ // Rather loose but ?not cause issues |
509 | $v = (isset($aNL[($v2 = strtolower($v))])) ? $v2 : $v; | 509 | $v = (isset($aNL[($v2 = strtolower($v))])) ? $v2 : $v; |
510 | } | 510 | } |
511 | if($k == 'style' && !$C['style_pass']){ | 511 | if($k == 'style' && !$C['style_pass']){ |
512 | if(false !== strpos($v, '&#')){ | 512 | if(false !== strpos($v, '&#')){ |
513 | static $sC = array(' '=>' ', ' '=>' ', 'E'=>'e', 'E'=>'e', 'e'=>'e', 'e'=>'e', 'X'=>'x', 'X'=>'x', 'x'=>'x', 'x'=>'x', 'P'=>'p', 'P'=>'p', 'p'=>'p', 'p'=>'p', 'S'=>'s', 'S'=>'s', 's'=>'s', 's'=>'s', 'I'=>'i', 'I'=>'i', 'i'=>'i', 'i'=>'i', 'O'=>'o', 'O'=>'o', 'o'=>'o', 'o'=>'o', 'N'=>'n', 'N'=>'n', 'n'=>'n', 'n'=>'n', 'U'=>'u', 'U'=>'u', 'u'=>'u', 'u'=>'u', 'R'=>'r', 'R'=>'r', 'r'=>'r', 'r'=>'r', 'L'=>'l', 'L'=>'l', 'l'=>'l', 'l'=>'l', '('=>'(', '('=>'(', ')'=>')', ')'=>')', ' '=>':', ' '=>':', '"'=>'"', '"'=>'"', '''=>"'", '''=>"'", '/'=>'/', '/'=>'/', '*'=>'*', '*'=>'*', '\'=>'\\', '\'=>'\\'); | 513 | static $sC = array(' '=>' ', ' '=>' ', 'E'=>'e', 'E'=>'e', 'e'=>'e', 'e'=>'e', 'X'=>'x', 'X'=>'x', 'x'=>'x', 'x'=>'x', 'P'=>'p', 'P'=>'p', 'p'=>'p', 'p'=>'p', 'S'=>'s', 'S'=>'s', 's'=>'s', 's'=>'s', 'I'=>'i', 'I'=>'i', 'i'=>'i', 'i'=>'i', 'O'=>'o', 'O'=>'o', 'o'=>'o', 'o'=>'o', 'N'=>'n', 'N'=>'n', 'n'=>'n', 'n'=>'n', 'U'=>'u', 'U'=>'u', 'u'=>'u', 'u'=>'u', 'R'=>'r', 'R'=>'r', 'r'=>'r', 'r'=>'r', 'L'=>'l', 'L'=>'l', 'l'=>'l', 'l'=>'l', '('=>'(', '('=>'(', ')'=>')', ')'=>')', ' '=>':', ' '=>':', '"'=>'"', '"'=>'"', '''=>"'", '''=>"'", '/'=>'/', '/'=>'/', '*'=>'*', '*'=>'*', '\'=>'\\', '\'=>'\\'); |
514 | $v = strtr($v, $sC); | 514 | $v = strtr($v, $sC); |
515 | } | 515 | } |
516 | $v = preg_replace_callback('`(url(?:\()(?: )*(?:\'|"|&(?:quot|apos);)?)(.+?)((?:\'|"|&(?:quot|apos);)?(?: )*(?:\)))`iS', 'hl_prot', $v); | 516 | $v = preg_replace_callback('`(url(?:\()(?: )*(?:\'|"|&(?:quot|apos);)?)(.+?)((?:\'|"|&(?:quot|apos);)?(?: )*(?:\)))`iS', 'hl_prot', $v); |
517 | $v = !$C['css_expression'] ? preg_replace('`expression`i', ' ', preg_replace('`\\\\\S|(/|(%2f))(\*|(%2a))`i', ' ', $v)) : $v; | 517 | $v = !$C['css_expression'] ? preg_replace('`expression`i', ' ', preg_replace('`\\\\\S|(/|(%2f))(\*|(%2a))`i', ' ', $v)) : $v; |
518 | }elseif(isset($aNP[$k]) or isset($aNO[$k])){ | 518 | }elseif(isset($aNP[$k]) or isset($aNO[$k])){ |
519 | $v = str_replace("", ' ', (strpos($v, '&') !== false ? str_replace(array('­', '­', '­'), ' ', $v) : $v)); # double-quoted char: soft-hyphen; appears here as "" or hyphen or something else depending on viewing software | 519 | $v = str_replace("", ' ', (strpos($v, '&') !== false ? str_replace(array('­', '­', '­'), ' ', $v) : $v)); # double-quoted char: soft-hyphen; appears here as "" or hyphen or something else depending on viewing software |
520 | if($k == 'srcset'){ | 520 | if($k == 'srcset'){ |
521 | $v2 = ''; | 521 | $v2 = ''; |
522 | foreach(explode(',', $v) as $k1=>$v1){ | 522 | foreach(explode(',', $v) as $k1=>$v1){ |
523 | $v1 = explode(' ', ltrim($v1), 2); | 523 | $v1 = explode(' ', ltrim($v1), 2); |
524 | $k1 = isset($v1[1]) ? trim($v1[1]) : ''; | 524 | $k1 = isset($v1[1]) ? trim($v1[1]) : ''; |
525 | $v1 = trim($v1[0]); | 525 | $v1 = trim($v1[0]); |
526 | if(isset($v1[0])){$v2 .= hl_prot($v1, $k). (empty($k1) ? '' : ' '. $k1). ', ';} | 526 | if(isset($v1[0])){$v2 .= hl_prot($v1, $k). (empty($k1) ? '' : ' '. $k1). ', ';} |
527 | } | 527 | } |
528 | $v = trim($v2, ', '); | 528 | $v = trim($v2, ', '); |
529 | } | 529 | } |
530 | if($k == 'itemtype'){ | 530 | if($k == 'itemtype'){ |
531 | $v2 = ''; | 531 | $v2 = ''; |
532 | foreach(explode(' ', $v) as $v1){ | 532 | foreach(explode(' ', $v) as $v1){ |
533 | if(isset($v1[0])){$v2 .= hl_prot($v1, $k). ' ';} | 533 | if(isset($v1[0])){$v2 .= hl_prot($v1, $k). ' ';} |
534 | } | 534 | } |
535 | $v = trim($v2, ' '); | 535 | $v = trim($v2, ' '); |
536 | } | 536 | } |
537 | else{$v = hl_prot($v, $k);} | 537 | else{$v = hl_prot($v, $k);} |
538 | if($k == 'href'){ // X-spam | 538 | if($k == 'href'){ // X-spam |
539 | if($C['anti_mail_spam'] && strpos($v, 'mailto:') === 0){ | 539 | if($C['anti_mail_spam'] && strpos($v, 'mailto:') === 0){ |
540 | $v = str_replace('@', htmlspecialchars($C['anti_mail_spam']), $v); | 540 | $v = str_replace('@', htmlspecialchars($C['anti_mail_spam']), $v); |
541 | }elseif($C['anti_link_spam']){ | 541 | }elseif($C['anti_link_spam']){ |
542 | $r1 = $C['anti_link_spam'][1]; | 542 | $r1 = $C['anti_link_spam'][1]; |
543 | if(!empty($r1) && preg_match($r1, $v)){continue;} | 543 | if(!empty($r1) && preg_match($r1, $v)){continue;} |
544 | $r0 = $C['anti_link_spam'][0]; | 544 | $r0 = $C['anti_link_spam'][0]; |
545 | if(!empty($r0) && preg_match($r0, $v)){ | 545 | if(!empty($r0) && preg_match($r0, $v)){ |
546 | if(isset($a['rel'])){ | 546 | if(isset($a['rel'])){ |
547 | if(!preg_match('`\bnofollow\b`i', $a['rel'])){$a['rel'] .= ' nofollow';} | 547 | if(!preg_match('`\bnofollow\b`i', $a['rel'])){$a['rel'] .= ' nofollow';} |
548 | }elseif(isset($aA['rel'])){ | 548 | }elseif(isset($aA['rel'])){ |
549 | if(!preg_match('`\bnofollow\b`i', $aA['rel'])){$nfr = 1;} | 549 | if(!preg_match('`\bnofollow\b`i', $aA['rel'])){$nfr = 1;} |
550 | }else{$a['rel'] = 'nofollow';} | 550 | }else{$a['rel'] = 'nofollow';} |
551 | } | 551 | } |
552 | } | 552 | } |
553 | } | 553 | } |
554 | } | 554 | } |
555 | if(isset($rl[$k]) && is_array($rl[$k]) && ($v = hl_attrval($k, $v, $rl[$k])) === 0){continue;} | 555 | if(isset($rl[$k]) && is_array($rl[$k]) && ($v = hl_attrval($k, $v, $rl[$k])) === 0){continue;} |
556 | $a[$k] = str_replace('"', '"', $v); | 556 | $a[$k] = str_replace('"', '"', $v); |
557 | } | 557 | } |
558 | } | 558 | } |
559 | if($nfr){$a['rel'] = isset($a['rel']) ? $a['rel']. ' nofollow' : 'nofollow';} | 559 | if($nfr){$a['rel'] = isset($a['rel']) ? $a['rel']. ' nofollow' : 'nofollow';} |
560 | 560 | ||
561 | // rqd attr | 561 | // rqd attr |
562 | static $eAR = array('area'=>array('alt'=>'area'), 'bdo'=>array('dir'=>'ltr'), 'command'=>array('label'=>''), 'form'=>array('action'=>''), 'img'=>array('src'=>'', 'alt'=>'image'), 'map'=>array('name'=>''), 'optgroup'=>array('label'=>''), 'param'=>array('name'=>''), 'style'=>array('scoped'=>''), 'textarea'=>array('rows'=>'10', 'cols'=>'50')); | 562 | static $eAR = array('area'=>array('alt'=>'area'), 'bdo'=>array('dir'=>'ltr'), 'command'=>array('label'=>''), 'form'=>array('action'=>''), 'img'=>array('src'=>'', 'alt'=>'image'), 'map'=>array('name'=>''), 'optgroup'=>array('label'=>''), 'param'=>array('name'=>''), 'style'=>array('scoped'=>''), 'textarea'=>array('rows'=>'10', 'cols'=>'50')); |
563 | if(isset($eAR[$e])){ | 563 | if(isset($eAR[$e])){ |
564 | foreach($eAR[$e] as $k=>$v){ | 564 | foreach($eAR[$e] as $k=>$v){ |
565 | if(!isset($a[$k])){$a[$k] = isset($v[0]) ? $v : $k;} | 565 | if(!isset($a[$k])){$a[$k] = isset($v[0]) ? $v : $k;} |
566 | } | 566 | } |
567 | } | 567 | } |
568 | 568 | ||
569 | // depr attr | 569 | // depr attr |
570 | if($depTr){ | 570 | if($depTr){ |
571 | $c = array(); | 571 | $c = array(); |
572 | foreach($a as $k=>$v){ | 572 | foreach($a as $k=>$v){ |
573 | if($k == 'style' or !isset($aND[$k][$e])){continue;} | 573 | if($k == 'style' or !isset($aND[$k][$e])){continue;} |
574 | $v = str_replace(array('\\', ':', ';', '&#'), '', $v); | 574 | $v = str_replace(array('\\', ':', ';', '&#'), '', $v); |
575 | if($k == 'align'){ | 575 | if($k == 'align'){ |
576 | unset($a['align']); | 576 | unset($a['align']); |
577 | if($e == 'img' && ($v == 'left' or $v == 'right')){$c[] = 'float: '. $v;} | 577 | if($e == 'img' && ($v == 'left' or $v == 'right')){$c[] = 'float: '. $v;} |
578 | elseif(($e == 'div' or $e == 'table') && $v == 'center'){$c[] = 'margin: auto';} | 578 | elseif(($e == 'div' or $e == 'table') && $v == 'center'){$c[] = 'margin: auto';} |
579 | else{$c[] = 'text-align: '. $v;} | 579 | else{$c[] = 'text-align: '. $v;} |
580 | }elseif($k == 'bgcolor'){ | 580 | }elseif($k == 'bgcolor'){ |
581 | unset($a['bgcolor']); | 581 | unset($a['bgcolor']); |
582 | $c[] = 'background-color: '. $v; | 582 | $c[] = 'background-color: '. $v; |
583 | }elseif($k == 'border'){ | 583 | }elseif($k == 'border'){ |
584 | unset($a['border']); $c[] = "border: {$v}px"; | 584 | unset($a['border']); $c[] = "border: {$v}px"; |
585 | }elseif($k == 'bordercolor'){ | 585 | }elseif($k == 'bordercolor'){ |
586 | unset($a['bordercolor']); $c[] = 'border-color: '. $v; | 586 | unset($a['bordercolor']); $c[] = 'border-color: '. $v; |
587 | }elseif($k == 'cellspacing'){ | 587 | }elseif($k == 'cellspacing'){ |
588 | unset($a['cellspacing']); $c[] = "border-spacing: {$v}px"; | 588 | unset($a['cellspacing']); $c[] = "border-spacing: {$v}px"; |
589 | }elseif($k == 'clear'){ | 589 | }elseif($k == 'clear'){ |
590 | unset($a['clear']); $c[] = 'clear: '. ($v != 'all' ? $v : 'both'); | 590 | unset($a['clear']); $c[] = 'clear: '. ($v != 'all' ? $v : 'both'); |
591 | }elseif($k == 'compact'){ | 591 | }elseif($k == 'compact'){ |
592 | unset($a['compact']); $c[] = 'font-size: 85%'; | 592 | unset($a['compact']); $c[] = 'font-size: 85%'; |
593 | }elseif($k == 'height' or $k == 'width'){ | 593 | }elseif($k == 'height' or $k == 'width'){ |
594 | unset($a[$k]); $c[] = $k. ': '. ($v[0] != '*' ? $v. (ctype_digit($v) ? 'px' : '') : 'auto'); | 594 | unset($a[$k]); $c[] = $k. ': '. ($v[0] != '*' ? $v. (ctype_digit($v) ? 'px' : '') : 'auto'); |
595 | }elseif($k == 'hspace'){ | 595 | }elseif($k == 'hspace'){ |
596 | unset($a['hspace']); $c[] = "margin-left: {$v}px; margin-right: {$v}px"; | 596 | unset($a['hspace']); $c[] = "margin-left: {$v}px; margin-right: {$v}px"; |
597 | }elseif($k == 'language' && !isset($a['type'])){ | 597 | }elseif($k == 'language' && !isset($a['type'])){ |
598 | unset($a['language']); | 598 | unset($a['language']); |
599 | $a['type'] = 'text/'. strtolower($v); | 599 | $a['type'] = 'text/'. strtolower($v); |
600 | }elseif($k == 'name'){ | 600 | }elseif($k == 'name'){ |
601 | if($C['no_deprecated_attr'] == 2 or ($e != 'a' && $e != 'map')){unset($a['name']);} | 601 | if($C['no_deprecated_attr'] == 2 or ($e != 'a' && $e != 'map')){unset($a['name']);} |
602 | if(!isset($a['id']) && !preg_match('`\W`', $v)){$a['id'] = $v;} | 602 | if(!isset($a['id']) && !preg_match('`\W`', $v)){$a['id'] = $v;} |
603 | }elseif($k == 'noshade'){ | 603 | }elseif($k == 'noshade'){ |
604 | unset($a['noshade']); $c[] = 'border-style: none; border: 0; background-color: gray; color: gray'; | 604 | unset($a['noshade']); $c[] = 'border-style: none; border: 0; background-color: gray; color: gray'; |
605 | }elseif($k == 'nowrap'){ | 605 | }elseif($k == 'nowrap'){ |
606 | unset($a['nowrap']); $c[] = 'white-space: nowrap'; | 606 | unset($a['nowrap']); $c[] = 'white-space: nowrap'; |
607 | }elseif($k == 'size'){ | 607 | }elseif($k == 'size'){ |
608 | unset($a['size']); $c[] = 'size: '. $v. 'px'; | 608 | unset($a['size']); $c[] = 'size: '. $v. 'px'; |
609 | }elseif($k == 'vspace'){ | 609 | }elseif($k == 'vspace'){ |
610 | unset($a['vspace']); $c[] = "margin-top: {$v}px; margin-bottom: {$v}px"; | 610 | unset($a['vspace']); $c[] = "margin-top: {$v}px; margin-bottom: {$v}px"; |
611 | } | 611 | } |
612 | } | 612 | } |
613 | if(count($c)){ | 613 | if(count($c)){ |
614 | $c = implode('; ', $c); | 614 | $c = implode('; ', $c); |
615 | $a['style'] = isset($a['style']) ? rtrim($a['style'], ' ;'). '; '. $c. ';': $c. ';'; | 615 | $a['style'] = isset($a['style']) ? rtrim($a['style'], ' ;'). '; '. $c. ';': $c. ';'; |
616 | } | 616 | } |
617 | } | 617 | } |
618 | // unique ID | 618 | // unique ID |
619 | if($C['unique_ids'] && isset($a['id'])){ | 619 | if($C['unique_ids'] && isset($a['id'])){ |
620 | if(preg_match('`\s`', ($id = $a['id'])) or (isset($GLOBALS['hl_Ids'][$id]) && $C['unique_ids'] == 1)){unset($a['id']); | 620 | if(preg_match('`\s`', ($id = $a['id'])) or (isset($GLOBALS['hl_Ids'][$id]) && $C['unique_ids'] == 1)){unset($a['id']); |
621 | }else{ | 621 | }else{ |
622 | while(isset($GLOBALS['hl_Ids'][$id])){$id = $C['unique_ids']. $id;} | 622 | while(isset($GLOBALS['hl_Ids'][$id])){$id = $C['unique_ids']. $id;} |
623 | $GLOBALS['hl_Ids'][($a['id'] = $id)] = 1; | 623 | $GLOBALS['hl_Ids'][($a['id'] = $id)] = 1; |
624 | } | 624 | } |
625 | } | 625 | } |
626 | // xml:lang | 626 | // xml:lang |
627 | if($C['xml:lang'] && isset($a['lang'])){ | 627 | if($C['xml:lang'] && isset($a['lang'])){ |
628 | $a['xml:lang'] = isset($a['xml:lang']) ? $a['xml:lang'] : $a['lang']; | 628 | $a['xml:lang'] = isset($a['xml:lang']) ? $a['xml:lang'] : $a['lang']; |
629 | if($C['xml:lang'] == 2){unset($a['lang']);} | 629 | if($C['xml:lang'] == 2){unset($a['lang']);} |
630 | } | 630 | } |
631 | // for transformed tag | 631 | // for transformed tag |
632 | if(!empty($trt)){ | 632 | if(!empty($trt)){ |
633 | $a['style'] = isset($a['style']) ? rtrim($a['style'], ' ;'). '; '. $trt : $trt; | 633 | $a['style'] = isset($a['style']) ? rtrim($a['style'], ' ;'). '; '. $trt : $trt; |
634 | } | 634 | } |
635 | // return with empty ele / | 635 | // return with empty ele / |
636 | if(empty($C['hook_tag'])){ | 636 | if(empty($C['hook_tag'])){ |
637 | $aA = ''; | 637 | $aA = ''; |
638 | foreach($a as $k=>$v){$aA .= " {$k}=\"{$v}\"";} | 638 | foreach($a as $k=>$v){$aA .= " {$k}=\"{$v}\"";} |
639 | return "<{$e}{$aA}". (isset($eE[$e]) ? ' /' : ''). '>'; | 639 | return "<{$e}{$aA}". (isset($eE[$e]) ? ' /' : ''). '>'; |
640 | } | 640 | } |
641 | else{return $C['hook_tag']($e, $a);} | 641 | else{return $C['hook_tag']($e, $a);} |
642 | } | 642 | } |
643 | 643 | ||
644 | function hl_tag2(&$e, &$a, $t=1){ | 644 | function hl_tag2(&$e, &$a, $t=1){ |
645 | // transform tag | 645 | // transform tag |
646 | if($e == 'big'){$e = 'span'; return 'font-size: larger;';} | 646 | if($e == 'big'){$e = 'span'; return 'font-size: larger;';} |
647 | if($e == 's' or $e == 'strike'){$e = 'span'; return 'text-decoration: line-through;';} | 647 | if($e == 's' or $e == 'strike'){$e = 'span'; return 'text-decoration: line-through;';} |
648 | if($e == 'tt'){$e = 'code'; return '';} | 648 | if($e == 'tt'){$e = 'code'; return '';} |
649 | if($e == 'center'){$e = 'div'; return 'text-align: center;';} | 649 | if($e == 'center'){$e = 'div'; return 'text-align: center;';} |
650 | static $fs = array('0'=>'xx-small', '1'=>'xx-small', '2'=>'small', '3'=>'medium', '4'=>'large', '5'=>'x-large', '6'=>'xx-large', '7'=>'300%', '-1'=>'smaller', '-2'=>'60%', '+1'=>'larger', '+2'=>'150%', '+3'=>'200%', '+4'=>'300%'); | 650 | static $fs = array('0'=>'xx-small', '1'=>'xx-small', '2'=>'small', '3'=>'medium', '4'=>'large', '5'=>'x-large', '6'=>'xx-large', '7'=>'300%', '-1'=>'smaller', '-2'=>'60%', '+1'=>'larger', '+2'=>'150%', '+3'=>'200%', '+4'=>'300%'); |
651 | if($e == 'font'){ | 651 | if($e == 'font'){ |
652 | $a2 = ''; | 652 | $a2 = ''; |
653 | while(preg_match('`(^|\s)(color|size)\s*=\s*(\'|")?(.+?)(\\3|\s|$)`i', $a, $m)){ | 653 | while(preg_match('`(^|\s)(color|size)\s*=\s*(\'|")?(.+?)(\\3|\s|$)`i', $a, $m)){ |
654 | $a = str_replace($m[0], ' ', $a); | 654 | $a = str_replace($m[0], ' ', $a); |
655 | $a2 .= strtolower($m[2]) == 'color' ? (' color: '. str_replace(array('"', ';', ':'), '\'', trim($m[4])). ';') : (isset($fs[($m = trim($m[4]))]) ? (' font-size: '. $fs[$m]. ';') : ''); | 655 | $a2 .= strtolower($m[2]) == 'color' ? (' color: '. str_replace(array('"', ';', ':'), '\'', trim($m[4])). ';') : (isset($fs[($m = trim($m[4]))]) ? (' font-size: '. $fs[$m]. ';') : ''); |
656 | } | 656 | } |
657 | while(preg_match('`(^|\s)face\s*=\s*(\'|")?([^=]+?)\\2`i', $a, $m) or preg_match('`(^|\s)face\s*=(\s*)(\S+)`i', $a, $m)){ | 657 | while(preg_match('`(^|\s)face\s*=\s*(\'|")?([^=]+?)\\2`i', $a, $m) or preg_match('`(^|\s)face\s*=(\s*)(\S+)`i', $a, $m)){ |
658 | $a = str_replace($m[0], ' ', $a); | 658 | $a = str_replace($m[0], ' ', $a); |
659 | $a2 .= ' font-family: '. str_replace(array('"', ';', ':'), '\'', trim($m[3])). ';'; | 659 | $a2 .= ' font-family: '. str_replace(array('"', ';', ':'), '\'', trim($m[3])). ';'; |
660 | } | 660 | } |
661 | $e = 'span'; return ltrim(str_replace('<', '', $a2)); | 661 | $e = 'span'; return ltrim(str_replace('<', '', $a2)); |
662 | } | 662 | } |
663 | if($e == 'acronym'){$e = 'abbr'; return '';} | 663 | if($e == 'acronym'){$e = 'abbr'; return '';} |
664 | if($e == 'dir'){$e = 'ul'; return '';} | 664 | if($e == 'dir'){$e = 'ul'; return '';} |
665 | if($t == 2){$e = 0; return 0;} | 665 | if($t == 2){$e = 0; return 0;} |
666 | return ''; | 666 | return ''; |
667 | } | 667 | } |
668 | 668 | ||
669 | function hl_tidy($t, $w, $p){ | 669 | function hl_tidy($t, $w, $p){ |
670 | // tidy/compact HTM | 670 | // tidy/compact HTM |
671 | if(strpos(' pre,script,textarea', "$p,")){return $t;} | 671 | if(strpos(' pre,script,textarea', "$p,")){return $t;} |
672 | if(!function_exists('hl_aux2')){function hl_aux2($m){ | 672 | if(!function_exists('hl_aux2')){function hl_aux2($m){ |
673 | return $m[1]. str_replace(array("<", ">", "\n", "\r", "\t", ' '), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), $m[3]). $m[4]; | 673 | return $m[1]. str_replace(array("<", ">", "\n", "\r", "\t", ' '), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), $m[3]). $m[4]; |
674 | }} | 674 | }} |
675 | $t = preg_replace(array('`(<\w[^>]*(?<!/)>)\s+`', '`\s+`', '`(<\w[^>]*(?<!/)>) `'), array(' $1', ' ', '$1'), preg_replace_callback(array('`(<(!\[CDATA\[))(.+?)(\]\]>)`sm', '`(<(!--))(.+?)(-->)`sm', '`(<(pre|script|textarea)[^>]*?>)(.+?)(</\2>)`sm'), 'hl_aux2', $t)); | 675 | $t = preg_replace(array('`(<\w[^>]*(?<!/)>)\s+`', '`\s+`', '`(<\w[^>]*(?<!/)>) `'), array(' $1', ' ', '$1'), preg_replace_callback(array('`(<(!\[CDATA\[))(.+?)(\]\]>)`sm', '`(<(!--))(.+?)(-->)`sm', '`(<(pre|script|textarea)[^>]*?>)(.+?)(</\2>)`sm'), 'hl_aux2', $t)); |
676 | if(($w = strtolower($w)) == -1){ | 676 | if(($w = strtolower($w)) == -1){ |
677 | return str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), array('<', '>', "\n", "\r", "\t", ' '), $t); | 677 | return str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), array('<', '>', "\n", "\r", "\t", ' '), $t); |
678 | } | 678 | } |
679 | $s = strpos(" $w", 't') ? "\t" : ' '; | 679 | $s = strpos(" $w", 't') ? "\t" : ' '; |
680 | $s = preg_match('`\d`', $w, $m) ? str_repeat($s, $m[0]) : str_repeat($s, ($s == "\t" ? 1 : 2)); | 680 | $s = preg_match('`\d`', $w, $m) ? str_repeat($s, $m[0]) : str_repeat($s, ($s == "\t" ? 1 : 2)); |
681 | $N = preg_match('`[ts]([1-9])`', $w, $m) ? $m[1] : 0; | 681 | $N = preg_match('`[ts]([1-9])`', $w, $m) ? $m[1] : 0; |
682 | $a = array('br'=>1); | 682 | $a = array('br'=>1); |
683 | $b = array('button'=>1, 'command'=>1, 'input'=>1, 'option'=>1, 'param'=>1, 'track'=>1); | 683 | $b = array('button'=>1, 'command'=>1, 'input'=>1, 'option'=>1, 'param'=>1, 'track'=>1); |
684 | $c = array('audio'=>1, 'canvas'=>1, 'caption'=>1, 'dd'=>1, 'dt'=>1, 'figcaption'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'isindex'=>1, 'label'=>1, 'legend'=>1, 'li'=>1, 'object'=>1, 'p'=>1, 'pre'=>1, 'style'=>1, 'summary'=>1, 'td'=>1, 'textarea'=>1, 'th'=>1, 'video'=>1); | 684 | $c = array('audio'=>1, 'canvas'=>1, 'caption'=>1, 'dd'=>1, 'dt'=>1, 'figcaption'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'isindex'=>1, 'label'=>1, 'legend'=>1, 'li'=>1, 'object'=>1, 'p'=>1, 'pre'=>1, 'style'=>1, 'summary'=>1, 'td'=>1, 'textarea'=>1, 'th'=>1, 'video'=>1); |
685 | $d = array('address'=>1, 'article'=>1, 'aside'=>1, 'blockquote'=>1, 'center'=>1, 'colgroup'=>1, 'datalist'=>1, 'details'=>1, 'dir'=>1, 'div'=>1, 'dl'=>1, 'fieldset'=>1, 'figure'=>1, 'footer'=>1, 'form'=>1, 'header'=>1, 'hgroup'=>1, 'hr'=>1, 'iframe'=>1, 'main'=>1, 'map'=>1, 'menu'=>1, 'nav'=>1, 'noscript'=>1, 'ol'=>1, 'optgroup'=>1, 'rbc'=>1, 'rtc'=>1, 'ruby'=>1, 'script'=>1, 'section'=>1, 'select'=>1, 'table'=>1, 'tbody'=>1, 'tfoot'=>1, 'thead'=>1, 'tr'=>1, 'ul'=>1); | 685 | $d = array('address'=>1, 'article'=>1, 'aside'=>1, 'blockquote'=>1, 'center'=>1, 'colgroup'=>1, 'datalist'=>1, 'details'=>1, 'dir'=>1, 'div'=>1, 'dl'=>1, 'fieldset'=>1, 'figure'=>1, 'footer'=>1, 'form'=>1, 'header'=>1, 'hgroup'=>1, 'hr'=>1, 'iframe'=>1, 'main'=>1, 'map'=>1, 'menu'=>1, 'nav'=>1, 'noscript'=>1, 'ol'=>1, 'optgroup'=>1, 'rbc'=>1, 'rtc'=>1, 'ruby'=>1, 'script'=>1, 'section'=>1, 'select'=>1, 'table'=>1, 'tbody'=>1, 'tfoot'=>1, 'thead'=>1, 'tr'=>1, 'ul'=>1); |
686 | $T = explode('<', $t); | 686 | $T = explode('<', $t); |
687 | $X = 1; | 687 | $X = 1; |
688 | while($X){ | 688 | while($X){ |
689 | $n = $N; | 689 | $n = $N; |
690 | $t = $T; | 690 | $t = $T; |
691 | ob_start(); | 691 | ob_start(); |
692 | if(isset($d[$p])){echo str_repeat($s, ++$n);} | 692 | if(isset($d[$p])){echo str_repeat($s, ++$n);} |
693 | echo ltrim(array_shift($t)); | 693 | echo ltrim(array_shift($t)); |
694 | for($i=-1, $j=count($t); ++$i<$j;){ | 694 | for($i=-1, $j=count($t); ++$i<$j;){ |
695 | $r = ''; list($e, $r) = explode('>', $t[$i]); | 695 | $r = ''; list($e, $r) = explode('>', $t[$i]); |
696 | $x = $e[0] == '/' ? 0 : (substr($e, -1) == '/' ? 1 : ($e[0] != '!' ? 2 : -1)); | 696 | $x = $e[0] == '/' ? 0 : (substr($e, -1) == '/' ? 1 : ($e[0] != '!' ? 2 : -1)); |
697 | $y = !$x ? ltrim($e, '/') : ($x > 0 ? substr($e, 0, strcspn($e, ' ')) : 0); | 697 | $y = !$x ? ltrim($e, '/') : ($x > 0 ? substr($e, 0, strcspn($e, ' ')) : 0); |
698 | $e = "<$e>"; | 698 | $e = "<$e>"; |
699 | if(isset($d[$y])){ | 699 | if(isset($d[$y])){ |
700 | if(!$x){ | 700 | if(!$x){ |
701 | if($n){echo "\n", str_repeat($s, --$n), "$e\n", str_repeat($s, $n);} | 701 | if($n){echo "\n", str_repeat($s, --$n), "$e\n", str_repeat($s, $n);} |
702 | else{++$N; ob_end_clean(); continue 2;} | 702 | else{++$N; ob_end_clean(); continue 2;} |
703 | } | 703 | } |
704 | else{echo "\n", str_repeat($s, $n), "$e\n", str_repeat($s, ($x != 1 ? ++$n : $n));} | 704 | else{echo "\n", str_repeat($s, $n), "$e\n", str_repeat($s, ($x != 1 ? ++$n : $n));} |
705 | echo $r; continue; | 705 | echo $r; continue; |
706 | } | 706 | } |
707 | $f = "\n". str_repeat($s, $n); | 707 | $f = "\n". str_repeat($s, $n); |
708 | if(isset($c[$y])){ | 708 | if(isset($c[$y])){ |
709 | if(!$x){echo $e, $f, $r;} | 709 | if(!$x){echo $e, $f, $r;} |
710 | else{echo $f, $e, $r;} | 710 | else{echo $f, $e, $r;} |
711 | }elseif(isset($b[$y])){echo $f, $e, $r; | 711 | }elseif(isset($b[$y])){echo $f, $e, $r; |
712 | }elseif(isset($a[$y])){echo $e, $f, $r; | 712 | }elseif(isset($a[$y])){echo $e, $f, $r; |
713 | }elseif(!$y){echo $f, $e, $f, $r; | 713 | }elseif(!$y){echo $f, $e, $f, $r; |
714 | }else{echo $e, $r;} | 714 | }else{echo $e, $r;} |
715 | } | 715 | } |
716 | $X = 0; | 716 | $X = 0; |
717 | } | 717 | } |
718 | $t = str_replace(array("\n ", " \n"), "\n", preg_replace('`[\n]\s*?[\n]+`', "\n", ob_get_contents())); | 718 | $t = str_replace(array("\n ", " \n"), "\n", preg_replace('`[\n]\s*?[\n]+`', "\n", ob_get_contents())); |
719 | ob_end_clean(); | 719 | ob_end_clean(); |
720 | if(($l = strpos(" $w", 'r') ? (strpos(" $w", 'n') ? "\r\n" : "\r") : 0)){ | 720 | if(($l = strpos(" $w", 'r') ? (strpos(" $w", 'n') ? "\r\n" : "\r") : 0)){ |
721 | $t = str_replace("\n", $l, $t); | 721 | $t = str_replace("\n", $l, $t); |
722 | } | 722 | } |
723 | return str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), array('<', '>', "\n", "\r", "\t", ' '), $t); | 723 | return str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), array('<', '>', "\n", "\r", "\t", ' '), $t); |
724 | } | 724 | } |
725 | 725 | ||
726 | function hl_version(){ | 726 | function hl_version(){ |
727 | // version | 727 | // version |
728 | return '1.2.5'; | 728 | return '1.2.5'; |
729 | } | 729 | } |
diff --git a/lib/htmlawed/htmLawedTest.php b/lib/htmlawed/htmLawedTest.php index 6475bc8..dfbfb27 100755 --- a/lib/htmlawed/htmLawedTest.php +++ b/lib/htmlawed/htmLawedTest.php | |||
@@ -1,677 +1,677 @@ | |||
1 | <?php | 1 | <?php |
2 | 2 | ||
3 | /* | 3 | /* |
4 | htmLawedTest.php, 17 May 2017 | 4 | htmLawedTest.php, 17 May 2017 |
5 | To test htmLawed | 5 | To test htmLawed |
6 | Copyright Santosh Patnaik | 6 | Copyright Santosh Patnaik |
7 | Dual licensed with LGPL 3 and GPL 2+ | 7 | Dual licensed with LGPL 3 and GPL 2+ |
8 | A PHP Labware internal utility - www.bioinformatics.org/phplabware/internal_utilities/htmLawed | 8 | A PHP Labware internal utility - www.bioinformatics.org/phplabware/internal_utilities/htmLawed |
9 | 9 | ||
10 | Test htmLawed; user provides text input; input and processed input are shown as highlighted code and rendered HTML; also shown are execution time and peak memory usage | 10 | Test htmLawed; user provides text input; input and processed input are shown as highlighted code and rendered HTML; also shown are execution time and peak memory usage |
11 | */ | 11 | */ |
12 | 12 | ||
13 | // config | 13 | // config |
14 | $_errs = 0; // display PHP errors | 14 | $_errs = 0; // display PHP errors |
15 | $_limit = 12000; // input character limit | 15 | $_limit = 12000; // input character limit |
16 | $_hlimit = 2000; // input character limit for showing hexdumps | 16 | $_hlimit = 2000; // input character limit for showing hexdumps |
17 | $_hilite = 1; // 0 turns off slow Javascript-based code-highlighting, e.g., if $_limit is high | 17 | $_hilite = 1; // 0 turns off slow Javascript-based code-highlighting, e.g., if $_limit is high |
18 | $_w3c_validate = 1; // 1 to show buttons to send input/output to w3c validator | 18 | $_w3c_validate = 1; // 1 to show buttons to send input/output to w3c validator |
19 | $_sid = 'sid'; // session name; alphanum. | 19 | $_sid = 'sid'; // session name; alphanum. |
20 | $_slife = 30; // session life in min. | 20 | $_slife = 30; // session life in min. |
21 | 21 | ||
22 | // errors | 22 | // errors |
23 | error_reporting(E_ALL | (defined('E_STRICT') ? E_STRICT : 0)); | 23 | error_reporting(E_ALL | (defined('E_STRICT') ? E_STRICT : 0)); |
24 | ini_set('display_errors', $_errs); | 24 | ini_set('display_errors', $_errs); |
25 | 25 | ||
26 | // session | 26 | // session |
27 | session_name($_sid); | 27 | session_name($_sid); |
28 | session_cache_limiter('private'); | 28 | session_cache_limiter('private'); |
29 | session_cache_expire($_slife); | 29 | session_cache_expire($_slife); |
30 | ini_set('session.gc_maxlifetime', $_slife * 60); | 30 | ini_set('session.gc_maxlifetime', $_slife * 60); |
31 | ini_set('session.use_only_cookies', 1); | 31 | ini_set('session.use_only_cookies', 1); |
32 | ini_set('session.cookie_lifetime', 0); | 32 | ini_set('session.cookie_lifetime', 0); |
33 | session_start(); | 33 | session_start(); |
34 | if(!isset($_SESSION['token'])){ | 34 | if(!isset($_SESSION['token'])){ |
35 | $_SESSION['token'] = md5(uniqid(rand(), 1)); | 35 | $_SESSION['token'] = md5(uniqid(rand(), 1)); |
36 | } | 36 | } |
37 | 37 | ||
38 | // slashes | 38 | // slashes |
39 | if(get_magic_quotes_gpc()){ | 39 | if(get_magic_quotes_gpc()){ |
40 | foreach($_POST as $k => $v){ | 40 | foreach($_POST as $k => $v){ |
41 | $_POST[$k] = stripslashes($v); | 41 | $_POST[$k] = stripslashes($v); |
42 | } | 42 | } |
43 | ini_set('magic_quotes_gpc', 0); | 43 | ini_set('magic_quotes_gpc', 0); |
44 | } | 44 | } |
45 | if(get_magic_quotes_runtime()){ | 45 | if(get_magic_quotes_runtime()){ |
46 | set_magic_quotes_runtime(0); | 46 | set_magic_quotes_runtime(0); |
47 | } | 47 | } |
48 | 48 | ||
49 | $_POST['enc'] = (isset($_POST['enc']) and preg_match('`^[-\w]+$`', $_POST['enc'])) ? $_POST['enc'] : 'utf-8'; | 49 | $_POST['enc'] = (isset($_POST['enc']) and preg_match('`^[-\w]+$`', $_POST['enc'])) ? $_POST['enc'] : 'utf-8'; |
50 | 50 | ||
51 | // token for anti-CSRF | 51 | // token for anti-CSRF |
52 | if(count($_POST)){ | 52 | if(count($_POST)){ |
53 | if((empty($_GET['pre']) and ((!empty($_POST['token']) and !empty($_SESSION['token']) and $_POST['token'] != $_SESSION['token']) or empty($_POST[$_sid]) or $_POST[$_sid] != session_id() or empty($_COOKIE[$_sid]) or $_COOKIE[$_sid] != session_id())) or ($_POST[$_sid] != session_id())){ | 53 | if((empty($_GET['pre']) and ((!empty($_POST['token']) and !empty($_SESSION['token']) and $_POST['token'] != $_SESSION['token']) or empty($_POST[$_sid]) or $_POST[$_sid] != session_id() or empty($_COOKIE[$_sid]) or $_COOKIE[$_sid] != session_id())) or ($_POST[$_sid] != session_id())){ |
54 | $_POST = array('enc'=>'utf-8'); | 54 | $_POST = array('enc'=>'utf-8'); |
55 | } | 55 | } |
56 | } | 56 | } |
57 | if(empty($_GET['pre'])){ | 57 | if(empty($_GET['pre'])){ |
58 | $_SESSION['token'] = md5(uniqid(rand(), 1)); | 58 | $_SESSION['token'] = md5(uniqid(rand(), 1)); |
59 | $token = $_SESSION['token']; | 59 | $token = $_SESSION['token']; |
60 | session_regenerate_id(1); | 60 | session_regenerate_id(1); |
61 | } | 61 | } |
62 | 62 | ||
63 | // compress | 63 | // compress |
64 | if(function_exists('gzencode') && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && preg_match('`gzip|deflate`i', $_SERVER['HTTP_ACCEPT_ENCODING']) && !ini_get('zlib.output_compression')){ | 64 | if(function_exists('gzencode') && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && preg_match('`gzip|deflate`i', $_SERVER['HTTP_ACCEPT_ENCODING']) && !ini_get('zlib.output_compression')){ |
65 | ob_start('ob_gzhandler'); | 65 | ob_start('ob_gzhandler'); |
66 | } | 66 | } |
67 | 67 | ||
68 | // HTM for unprocessed | 68 | // HTM for unprocessed |
69 | if(isset($_POST['inputH'])){ | 69 | if(isset($_POST['inputH'])){ |
70 | echo '<html><head><title>htmLawed test: HTML view of unprocessed input</title></head><body style="margin:0; padding: 0;"><p style="background-color: black; color: white; padding: 2px;"> Rendering of raw/unprocessed input without an HTML doctype or charset declaration <small><a style="color: white; text-decoration: none;" href="1" onclick="javascript:window.close(this); return false;">close window</a> | <a style="color: white; text-decoration: none;" href="htmLawedTest.php" onclick="javascript: window.open(\'htmLawedTest.php\', \'hlmain\'); window.close(this); return false;">htmLawed test page</a></small></p><div>', $_POST['inputH'], '</div></body></html>'; | 70 | echo '<html><head><title>htmLawed test: HTML view of unprocessed input</title></head><body style="margin:0; padding: 0;"><p style="background-color: black; color: white; padding: 2px;"> Rendering of raw/unprocessed input without an HTML doctype or charset declaration <small><a style="color: white; text-decoration: none;" href="1" onclick="javascript:window.close(this); return false;">close window</a> | <a style="color: white; text-decoration: none;" href="htmLawedTest.php" onclick="javascript: window.open(\'htmLawedTest.php\', \'hlmain\'); window.close(this); return false;">htmLawed test page</a></small></p><div>', $_POST['inputH'], '</div></body></html>'; |
71 | exit; | 71 | exit; |
72 | } | 72 | } |
73 | 73 | ||
74 | // HTM for processed | 74 | // HTM for processed |
75 | if(isset($_POST['outputH'])){ | 75 | if(isset($_POST['outputH'])){ |
76 | echo '<html><head><title>htmLawed test: HTML view of unprocessed input</title></head><body style="margin:0; padding: 0;"><p style="background-color: black; color: white; padding: 2px;"> Rendering of filtered/processed input without an HTML doctype or charset declaration <small><a style="color: white; text-decoration: none;" href="1" onclick="javascript:window.close(this); return false;">close window</a> | <a style="color: white; text-decoration: none;" href="htmLawedTest.php" onclick="javascript: window.open(\'htmLawedTest.php\', \'hlmain\'); window.close(this); return false;">htmLawed test page</a></small></p><div>', $_POST['outputH'], '</div></body></html>'; | 76 | echo '<html><head><title>htmLawed test: HTML view of unprocessed input</title></head><body style="margin:0; padding: 0;"><p style="background-color: black; color: white; padding: 2px;"> Rendering of filtered/processed input without an HTML doctype or charset declaration <small><a style="color: white; text-decoration: none;" href="1" onclick="javascript:window.close(this); return false;">close window</a> | <a style="color: white; text-decoration: none;" href="htmLawedTest.php" onclick="javascript: window.open(\'htmLawedTest.php\', \'hlmain\'); window.close(this); return false;">htmLawed test page</a></small></p><div>', $_POST['outputH'], '</div></body></html>'; |
77 | exit; | 77 | exit; |
78 | } | 78 | } |
79 | 79 | ||
80 | // main | 80 | // main |
81 | $_POST['text'] = isset($_POST['text']) ? $_POST['text'] : 'text to process; < '. $_limit. ' characters'. ($_hlimit ? ' (for binary hexdump view, < '. $_hlimit. ')' : ''); | 81 | $_POST['text'] = isset($_POST['text']) ? $_POST['text'] : 'text to process; < '. $_limit. ' characters'. ($_hlimit ? ' (for binary hexdump view, < '. $_hlimit. ')' : ''); |
82 | $do = (!empty($_POST[$_sid]) && isset($_POST['text'][0]) && !isset($_POST['text'][$_limit])) ? 1 : 0; | 82 | $do = (!empty($_POST[$_sid]) && isset($_POST['text'][0]) && !isset($_POST['text'][$_limit])) ? 1 : 0; |
83 | $limit_exceeded = isset($_POST['text'][$_limit]) ? 1 : 0; | 83 | $limit_exceeded = isset($_POST['text'][$_limit]) ? 1 : 0; |
84 | $pre_mem = memory_get_usage(); | 84 | $pre_mem = memory_get_usage(); |
85 | $validation = (!empty($_POST[$_sid]) and isset($_POST['w3c_validate'][0])) ? 1 : 0; | 85 | $validation = (!empty($_POST[$_sid]) and isset($_POST['w3c_validate'][0])) ? 1 : 0; |
86 | include './htmLawed.php'; | 86 | include './htmLawed.php'; |
87 | 87 | ||
88 | function format($t){ | 88 | function format($t){ |
89 | $t = "\n". str_replace(array("\t", "\r\n", "\r", '&', '<', '>', "\n"), array(' ', "\n", "\n", '&', '<', '>', "<span class=\"newline\">¬</span><br />\n"), $t); | 89 | $t = "\n". str_replace(array("\t", "\r\n", "\r", '&', '<', '>', "\n"), array(' ', "\n", "\n", '&', '<', '>', "<span class=\"newline\">¬</span><br />\n"), $t); |
90 | return str_replace(array('<br />', "\n ", ' '), array("\n<br />\n", "\n ", ' '), $t); | 90 | return str_replace(array('<br />', "\n ", ' '), array("\n<br />\n", "\n ", ' '), $t); |
91 | } | 91 | } |
92 | 92 | ||
93 | function hexdump($d){ | 93 | function hexdump($d){ |
94 | // Mainly by Aidan Lister <aidan@php.net>, Peter Waller <iridum@php.net> | 94 | // Mainly by Aidan Lister <aidan@php.net>, Peter Waller <iridum@php.net> |
95 | $hexi = ''; | 95 | $hexi = ''; |
96 | $ascii = ''; | 96 | $ascii = ''; |
97 | ob_start(); | 97 | ob_start(); |
98 | echo '<pre>'; | 98 | echo '<pre>'; |
99 | $offset = 0; | 99 | $offset = 0; |
100 | $len = strlen($d); | 100 | $len = strlen($d); |
101 | for($i=$j=0; $i<$len; $i++) | 101 | for($i=$j=0; $i<$len; $i++) |
102 | { | 102 | { |
103 | // Convert to hexidecimal | 103 | // Convert to hexidecimal |
104 | $hexi .= sprintf("%02X ", ord($d[$i])); | 104 | $hexi .= sprintf("%02X ", ord($d[$i])); |
105 | // Replace non-viewable bytes with '.' | 105 | // Replace non-viewable bytes with '.' |
106 | if(ord($d[$i]) >= 32){ | 106 | if(ord($d[$i]) >= 32){ |
107 | $ascii .= htmlspecialchars($d[$i]); | 107 | $ascii .= htmlspecialchars($d[$i]); |
108 | }else{ | 108 | }else{ |
109 | $ascii .= '.'; | 109 | $ascii .= '.'; |
110 | } | 110 | } |
111 | // Add extra column spacing | 111 | // Add extra column spacing |
112 | if($j == 7){ | 112 | if($j == 7){ |
113 | $hexi .= ' '; | 113 | $hexi .= ' '; |
114 | $ascii .= ' '; | 114 | $ascii .= ' '; |
115 | } | 115 | } |
116 | // Add row | 116 | // Add row |
117 | if(++$j == 16 || $i == $len-1){ | 117 | if(++$j == 16 || $i == $len-1){ |
118 | // Join the hexi / ascii output | 118 | // Join the hexi / ascii output |
119 | echo sprintf("%04X %-49s %s", $offset, $hexi, $ascii); | 119 | echo sprintf("%04X %-49s %s", $offset, $hexi, $ascii); |
120 | // Reset vars | 120 | // Reset vars |
121 | $hexi = $ascii = ''; | 121 | $hexi = $ascii = ''; |
122 | $offset += 16; | 122 | $offset += 16; |
123 | $j = 0; | 123 | $j = 0; |
124 | // Add newline | 124 | // Add newline |
125 | if ($i !== $len-1){ | 125 | if ($i !== $len-1){ |
126 | echo "\n"; | 126 | echo "\n"; |
127 | } | 127 | } |
128 | } | 128 | } |
129 | } | 129 | } |
130 | echo '</pre>'; | 130 | echo '</pre>'; |
131 | $o = ob_get_contents(); | 131 | $o = ob_get_contents(); |
132 | ob_end_clean(); | 132 | ob_end_clean(); |
133 | return $o; | 133 | return $o; |
134 | } | 134 | } |
135 | ?> | 135 | ?> |
136 | 136 | ||
137 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" | 137 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" |
138 | "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | 138 | "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
139 | <html lang="en" xml:lang="en"> | 139 | <html lang="en" xml:lang="en"> |
140 | <head> | 140 | <head> |
141 | <meta http-equiv="content-type" content="text/html; charset=utf-8" /> | 141 | <meta http-equiv="content-type" content="text/html; charset=utf-8" /> |
142 | <meta name="description" content="htmLawed <?php echo hl_version();?> test page" /> | 142 | <meta name="description" content="htmLawed <?php echo hl_version();?> test page" /> |
143 | <style type="text/css"><!--/*--><![CDATA[/*><!--*/ | 143 | <style type="text/css"><!--/*--><![CDATA[/*><!--*/ |
144 | a, a.resizer{text-decoration:none;} | 144 | a, a.resizer{text-decoration:none;} |
145 | a:hover, a.resizer:hover{color:red;} | 145 | a:hover, a.resizer:hover{color:red;} |
146 | a.resizer{color:green; float:right;} | 146 | a.resizer{color:green; float:right;} |
147 | body{background-color:#efefef;} | 147 | body{background-color:#efefef;} |
148 | body, button, div, html, input, p{font-size:13px; font-family:'Lucida grande', Verdana, Arial, Helvetica, sans-serif;} | 148 | body, button, div, html, input, p{font-size:13px; font-family:'Lucida grande', Verdana, Arial, Helvetica, sans-serif;} |
149 | button, input{font-size: 85%;} | 149 | button, input{font-size: 85%;} |
150 | div.help{border-top: 1px dotted gray; margin-top: 15px; padding-top: 15px; color:#999999;} | 150 | div.help{border-top: 1px dotted gray; margin-top: 15px; padding-top: 15px; color:#999999;} |
151 | #inputC, #inputD, #inputF, #inputR, #outputD, #outputF, #outputR, #settingF, #diff{display:block;} | 151 | #inputC, #inputD, #inputF, #inputR, #outputD, #outputF, #outputR, #settingF, #diff{display:block;} |
152 | #inputC, #settingF{background-color:white; border:1px gray solid; padding:3px;} | 152 | #inputC, #settingF{background-color:white; border:1px gray solid; padding:3px;} |
153 | #inputC li{margin: 0; padding: 0;} | 153 | #inputC li{margin: 0; padding: 0;} |
154 | #inputC ul{margin: 0; padding: 0; margin-left: 14px;} | 154 | #inputC ul{margin: 0; padding: 0; margin-left: 14px;} |
155 | #inputC input{margin: 0; margin-left: 2px; margin-right: 2px; padding: 1px; vertical-align: middle;} | 155 | #inputC input{margin: 0; margin-left: 2px; margin-right: 2px; padding: 1px; vertical-align: middle;} |
156 | #inputD{overflow:auto; background-color:#ffff99; border:1px #cc9966 solid; padding:3px;} | 156 | #inputD{overflow:auto; background-color:#ffff99; border:1px #cc9966 solid; padding:3px;} |
157 | #inputR{overflow:auto; background-color:#ffffcc; border:1px #ffcc99 solid; padding:3px;} | 157 | #inputR{overflow:auto; background-color:#ffffcc; border:1px #ffcc99 solid; padding:3px;} |
158 | #inputC, #settingF, #inputD, #inputR, #outputD, #outputR, #diff, textarea{font-size:100%; font-family:'Bitstream vera sans mono', 'courier new', 'courier', monospace;} | 158 | #inputC, #settingF, #inputD, #inputR, #outputD, #outputR, #diff, textarea{font-size:100%; font-family:'Bitstream vera sans mono', 'courier new', 'courier', monospace;} |
159 | #outputD{overflow:auto; background-color: #99ffcc; border:1px #66cc99 solid; padding:3px;} | 159 | #outputD{overflow:auto; background-color: #99ffcc; border:1px #66cc99 solid; padding:3px;} |
160 | #diff{overflow:auto; background-color: white; border:1px #dcdcdc solid; padding:3px;} | 160 | #diff{overflow:auto; background-color: white; border:1px #dcdcdc solid; padding:3px;} |
161 | #outputR{overflow:auto; background-color: #ccffcc; border:1px #99cc99 solid; padding:3px;} | 161 | #outputR{overflow:auto; background-color: #ccffcc; border:1px #99cc99 solid; padding:3px;} |
162 | span.cmtcdata{color: orange;} | 162 | span.cmtcdata{color: orange;} |
163 | span.ctag{color:red;} | 163 | span.ctag{color:red;} |
164 | span.ent{border-bottom:1px dotted #999999;} | 164 | span.ent{border-bottom:1px dotted #999999;} |
165 | span.etag{color:purple;} | 165 | span.etag{color:purple;} |
166 | span.help{color:#999999;} | 166 | span.help{color:#999999;} |
167 | span.newline{color:#dcdcdc;} | 167 | span.newline{color:#dcdcdc;} |
168 | span.notice{color:green;} | 168 | span.notice{color:green;} |
169 | span.otag{color:blue;} | 169 | span.otag{color:blue;} |
170 | #topmost{margin:auto; width:98%;} | 170 | #topmost{margin:auto; width:98%;} |
171 | /*]]>*/--></style> | 171 | /*]]>*/--></style> |
172 | <script type="text/javascript"><!--//--><![CDATA[//><!-- | 172 | <script type="text/javascript"><!--//--><![CDATA[//><!-- |
173 | window.name = 'hlmain'; | 173 | window.name = 'hlmain'; |
174 | function hl(i){ | 174 | function hl(i){ |
175 | <?php if(!$_hilite){echo 'return;'; }?> | 175 | <?php if(!$_hilite){echo 'return;'; }?> |
176 | var e = document.getElementById(i); | 176 | var e = document.getElementById(i); |
177 | if(!e){return;} | 177 | if(!e){return;} |
178 | run(e, '</[a-z1-6]+>', 'ctag'); | 178 | run(e, '</[a-z1-6]+>', 'ctag'); |
179 | run(e, '<[a-z]+(?:[^>]*)/>', 'etag'); | 179 | run(e, '<[a-z]+(?:[^>]*)/>', 'etag'); |
180 | run(e, '<[a-z1-6]+(?:[^>]*)>', 'otag'); | 180 | run(e, '<[a-z1-6]+(?:[^>]*)>', 'otag'); |
181 | run(e, '&[#a-z0-9]+;', 'ent'); | 181 | run(e, '&[#a-z0-9]+;', 'ent'); |
182 | run(e, '<!(?:(?:--(?:.|\n)*?--)|(?:\\[CDATA\\[(?:.|\n)*?\\]\\]))>', 'cmtcdata'); | 182 | run(e, '<!(?:(?:--(?:.|\n)*?--)|(?:\\[CDATA\\[(?:.|\n)*?\\]\\]))>', 'cmtcdata'); |
183 | } | 183 | } |
184 | function sndProc(){ | 184 | function sndProc(){ |
185 | var f = document.getElementById('testform'); | 185 | var f = document.getElementById('testform'); |
186 | if(!f){return;} | 186 | if(!f){return;} |
187 | var e = document.createElement('input'); | 187 | var e = document.createElement('input'); |
188 | e.type = 'hidden'; | 188 | e.type = 'hidden'; |
189 | e.name = '<?php echo htmlspecialchars($_sid); ?>'; | 189 | e.name = '<?php echo htmlspecialchars($_sid); ?>'; |
190 | e.id = '<?php echo htmlspecialchars($_sid); ?>'; | 190 | e.id = '<?php echo htmlspecialchars($_sid); ?>'; |
191 | e.value = readCookie('<?php echo htmlspecialchars($_sid); ?>'); | 191 | e.value = readCookie('<?php echo htmlspecialchars($_sid); ?>'); |
192 | f.appendChild(e); | 192 | f.appendChild(e); |
193 | f.submit(); | 193 | f.submit(); |
194 | } | 194 | } |
195 | function readCookie(n){ | 195 | function readCookie(n){ |
196 | var ne = n + '='; | 196 | var ne = n + '='; |
197 | var ca = document.cookie.split(';'); | 197 | var ca = document.cookie.split(';'); |
198 | for(var i=0;i < ca.length;i++){ | 198 | for(var i=0;i < ca.length;i++){ |
199 | var c = ca[i]; | 199 | var c = ca[i]; |
200 | while(c.charAt(0)==' '){ | 200 | while(c.charAt(0)==' '){ |
201 | c = c.substring(1,c.length); | 201 | c = c.substring(1,c.length); |
202 | } | 202 | } |
203 | if(c.indexOf(ne) == 0){ | 203 | if(c.indexOf(ne) == 0){ |
204 | return c.substring(ne.length,c.length); | 204 | return c.substring(ne.length,c.length); |
205 | } | 205 | } |
206 | } | 206 | } |
207 | return null; | 207 | return null; |
208 | } | 208 | } |
209 | function run(e, q, c){ | 209 | function run(e, q, c){ |
210 | var q = new RegExp(q); | 210 | var q = new RegExp(q); |
211 | if(e.firstChild == null){ | 211 | if(e.firstChild == null){ |
212 | var m = q.exec(e.data); | 212 | var m = q.exec(e.data); |
213 | if(m){ | 213 | if(m){ |
214 | var v = m[0]; | 214 | var v = m[0]; |
215 | var k2 = e.splitText(m.index); | 215 | var k2 = e.splitText(m.index); |
216 | var k3 = k2.splitText(v.length); | 216 | var k3 = k2.splitText(v.length); |
217 | var s = e.ownerDocument.createElement('span'); | 217 | var s = e.ownerDocument.createElement('span'); |
218 | e.parentNode.replaceChild(s, k2); | 218 | e.parentNode.replaceChild(s, k2); |
219 | s.className = c; s.appendChild(k2); | 219 | s.className = c; s.appendChild(k2); |
220 | } | 220 | } |
221 | } | 221 | } |
222 | for(var k = e.firstChild; k != null; k = k.nextSibling){ | 222 | for(var k = e.firstChild; k != null; k = k.nextSibling){ |
223 | if(k.nodeType == 3){ | 223 | if(k.nodeType == 3){ |
224 | var m = q.exec(k.data); | 224 | var m = q.exec(k.data); |
225 | if(m){ | 225 | if(m){ |
226 | var v = m[0]; | 226 | var v = m[0]; |
227 | var k2 = k.splitText(m.index); | 227 | var k2 = k.splitText(m.index); |
228 | var k3 = k2.splitText(v.length); | 228 | var k3 = k2.splitText(v.length); |
229 | var s = k.ownerDocument.createElement('span'); | 229 | var s = k.ownerDocument.createElement('span'); |
230 | k.parentNode.replaceChild(s, k2); | 230 | k.parentNode.replaceChild(s, k2); |
231 | s.className = c; s.appendChild(k2); | 231 | s.className = c; s.appendChild(k2); |
232 | } | 232 | } |
233 | } | 233 | } |
234 | else if(c == 'ent' && k.nodeType == 1){ | 234 | else if(c == 'ent' && k.nodeType == 1){ |
235 | var d = k.firstChild; | 235 | var d = k.firstChild; |
236 | if(d){ | 236 | if(d){ |
237 | var m = q.exec(d.data); | 237 | var m = q.exec(d.data); |
238 | if(m){ | 238 | if(m){ |
239 | var v = m[0]; | 239 | var v = m[0]; |
240 | var d2 = d.splitText(m.index); | 240 | var d2 = d.splitText(m.index); |
241 | var d3 = d2.splitText(v.length); | 241 | var d3 = d2.splitText(v.length); |
242 | var s = d.ownerDocument.createElement('span'); | 242 | var s = d.ownerDocument.createElement('span'); |
243 | d.parentNode.replaceChild(s, d2); | 243 | d.parentNode.replaceChild(s, d2); |
244 | s.className = c; s.appendChild(d2); | 244 | s.className = c; s.appendChild(d2); |
245 | } | 245 | } |
246 | } | 246 | } |
247 | } | 247 | } |
248 | } | 248 | } |
249 | } | 249 | } |
250 | function toggle(i){ | 250 | function toggle(i){ |
251 | var e = document.getElementById(i); | 251 | var e = document.getElementById(i); |
252 | if(!e){return;} | 252 | if(!e){return;} |
253 | if(e.style){ | 253 | if(e.style){ |
254 | var a = e.style.display; | 254 | var a = e.style.display; |
255 | if(a == 'block'){e.style.display = 'none'; return;} | 255 | if(a == 'block'){e.style.display = 'none'; return;} |
256 | if(a == 'none'){e.style.display = 'block';} | 256 | if(a == 'none'){e.style.display = 'block';} |
257 | else{e.style.display = 'none';} | 257 | else{e.style.display = 'none';} |
258 | return; | 258 | return; |
259 | } | 259 | } |
260 | var a = e.visibility; | 260 | var a = e.visibility; |
261 | if(a == 'hidden'){e.visibility = 'show'; return;} | 261 | if(a == 'hidden'){e.visibility = 'show'; return;} |
262 | if(a == 'show'){e.visibility = 'hidden';} | 262 | if(a == 'show'){e.visibility = 'hidden';} |
263 | } | 263 | } |
264 | function sndProc2(){ | 264 | function sndProc2(){ |
265 | var i = document.getElementById('text2'); | 265 | var i = document.getElementById('text2'); |
266 | if(!i){return;} | 266 | if(!i){return;} |
267 | i = i.value; | 267 | i = i.value; |
268 | var w = window.open('htmLawedTest.php?pre=1', 'hlposthtm'); | 268 | var w = window.open('htmLawedTest.php?pre=1', 'hlposthtm'); |
269 | var f = document.createElement('form'); | 269 | var f = document.createElement('form'); |
270 | f.enctype = 'application/x-www-form-urlencoded'; | 270 | f.enctype = 'application/x-www-form-urlencoded'; |
271 | f.method = 'post'; | 271 | f.method = 'post'; |
272 | f.acceptCharset = '<?php echo htmlspecialchars($_POST['enc']); ?>'; | 272 | f.acceptCharset = '<?php echo htmlspecialchars($_POST['enc']); ?>'; |
273 | if(f.style){f.style.display = 'none';} | 273 | if(f.style){f.style.display = 'none';} |
274 | else{f.visibility = 'hidden';} | 274 | else{f.visibility = 'hidden';} |
275 | f.innerHTML = '<p style="display:none;"><input style="display:none;" type="hidden" name="token" id="token" value="<?php echo $token; ?>" /><input style="display:none;" type="hidden" name="<?php echo htmlspecialchars($_sid); ?>" id="<?php echo htmlspecialchars($_sid); ?>" value="' + readCookie('<?php echo htmlspecialchars($_sid); ?>') + '" /></p>'; | 275 | f.innerHTML = '<p style="display:none;"><input style="display:none;" type="hidden" name="token" id="token" value="<?php echo $token; ?>" /><input style="display:none;" type="hidden" name="<?php echo htmlspecialchars($_sid); ?>" id="<?php echo htmlspecialchars($_sid); ?>" value="' + readCookie('<?php echo htmlspecialchars($_sid); ?>') + '" /></p>'; |
276 | f.action = 'htmLawedTest.php?pre=1'; | 276 | f.action = 'htmLawedTest.php?pre=1'; |
277 | f.target = 'hlposthtm'; | 277 | f.target = 'hlposthtm'; |
278 | f.method = 'post'; | 278 | f.method = 'post'; |
279 | var t = document.createElement('textarea'); | 279 | var t = document.createElement('textarea'); |
280 | t.name = 'outputH'; | 280 | t.name = 'outputH'; |
281 | t.value = i; | 281 | t.value = i; |
282 | f.appendChild(t); | 282 | f.appendChild(t); |
283 | var b = document.getElementsByTagName('body')[0]; | 283 | var b = document.getElementsByTagName('body')[0]; |
284 | b.appendChild(f); | 284 | b.appendChild(f); |
285 | f.submit(); | 285 | f.submit(); |
286 | w.focus; | 286 | w.focus; |
287 | } | 287 | } |
288 | function sndUnproc(){ | 288 | function sndUnproc(){ |
289 | var i = document.getElementById('text'); | 289 | var i = document.getElementById('text'); |
290 | if(!i){return;} | 290 | if(!i){return;} |
291 | i = i.value; | 291 | i = i.value; |
292 | var w = window.open('htmLawedTest.php?pre=1', 'hlprehtm'); | 292 | var w = window.open('htmLawedTest.php?pre=1', 'hlprehtm'); |
293 | var f = document.createElement('form'); | 293 | var f = document.createElement('form'); |
294 | f.enctype = 'application/x-www-form-urlencoded'; | 294 | f.enctype = 'application/x-www-form-urlencoded'; |
295 | f.method = 'post'; | 295 | f.method = 'post'; |
296 | f.acceptCharset = '<?php echo htmlspecialchars($_POST['enc']); ?>'; | 296 | f.acceptCharset = '<?php echo htmlspecialchars($_POST['enc']); ?>'; |
297 | if(f.style){f.style.display = 'none';} | 297 | if(f.style){f.style.display = 'none';} |
298 | else{f.visibility = 'hidden';} | 298 | else{f.visibility = 'hidden';} |
299 | f.innerHTML = '<p style="display:none;"><input style="display:none;" type="hidden" name="token" id="token" value="<?php echo $token; ?>" /><input style="display:none;" type="hidden" name="<?php echo htmlspecialchars($_sid); ?>" id="<?php echo htmlspecialchars($_sid); ?>" value="' + readCookie('<?php echo htmlspecialchars($_sid); ?>') + '" /></p>'; | 299 | f.innerHTML = '<p style="display:none;"><input style="display:none;" type="hidden" name="token" id="token" value="<?php echo $token; ?>" /><input style="display:none;" type="hidden" name="<?php echo htmlspecialchars($_sid); ?>" id="<?php echo htmlspecialchars($_sid); ?>" value="' + readCookie('<?php echo htmlspecialchars($_sid); ?>') + '" /></p>'; |
300 | f.action = 'htmLawedTest.php?pre=1'; | 300 | f.action = 'htmLawedTest.php?pre=1'; |
301 | f.target = 'hlprehtm'; | 301 | f.target = 'hlprehtm'; |
302 | f.method = 'post'; | 302 | f.method = 'post'; |
303 | var t = document.createElement('textarea'); | 303 | var t = document.createElement('textarea'); |
304 | t.name = 'inputH'; | 304 | t.name = 'inputH'; |
305 | t.value = i; | 305 | t.value = i; |
306 | f.appendChild(t); | 306 | f.appendChild(t); |
307 | var b = document.getElementsByTagName('body')[0]; | 307 | var b = document.getElementsByTagName('body')[0]; |
308 | b.appendChild(f); | 308 | b.appendChild(f); |
309 | f.submit(); | 309 | f.submit(); |
310 | w.focus; | 310 | w.focus; |
311 | } | 311 | } |
312 | function sndValidn(id, type){ | 312 | function sndValidn(id, type){ |
313 | var i = document.getElementById(id); | 313 | var i = document.getElementById(id); |
314 | if(!i){return;} | 314 | if(!i){return;} |
315 | i = i.value; | 315 | i = i.value; |
316 | var w = window.open('http://validator.w3.org/check', 'validate'+id+type); | 316 | var w = window.open('http://validator.w3.org/check', 'validate'+id+type); |
317 | var f = document.createElement('form'); | 317 | var f = document.createElement('form'); |
318 | f.enctype = 'application/x-www-form-urlencoded'; | 318 | f.enctype = 'application/x-www-form-urlencoded'; |
319 | f.method = 'post'; | 319 | f.method = 'post'; |
320 | f.acceptCharset = '<?php echo htmlspecialchars($_POST['enc']); ?>'; | 320 | f.acceptCharset = '<?php echo htmlspecialchars($_POST['enc']); ?>'; |
321 | if(f.style){f.style.display = 'none';} | 321 | if(f.style){f.style.display = 'none';} |
322 | else{f.visibility = 'hidden';} | 322 | else{f.visibility = 'hidden';} |
323 | f.innerHTML = '<p style="display:none;"><input style="display:none;" type="hidden" name="prefill" id="prefill" value="1" /><input style="display:none;" type="hidden" name="prefill_doctype" id="prefill_doctype" value="'+ type+ '" /><input style="display:none;" type="hidden" name="group" id="group" value="1" /><input type="hidden" name="ss" id="ss" value="1" /></p>'; | 323 | f.innerHTML = '<p style="display:none;"><input style="display:none;" type="hidden" name="prefill" id="prefill" value="1" /><input style="display:none;" type="hidden" name="prefill_doctype" id="prefill_doctype" value="'+ type+ '" /><input style="display:none;" type="hidden" name="group" id="group" value="1" /><input type="hidden" name="ss" id="ss" value="1" /></p>'; |
324 | f.action = 'http://validator.w3.org/check'; | 324 | f.action = 'http://validator.w3.org/check'; |
325 | f.target = 'validate'+id+type; | 325 | f.target = 'validate'+id+type; |
326 | var t = document.createElement('textarea'); | 326 | var t = document.createElement('textarea'); |
327 | t.name = 'fragment'; | 327 | t.name = 'fragment'; |
328 | t.value = i; | 328 | t.value = i; |
329 | f.appendChild(t); | 329 | f.appendChild(t); |
330 | var b = document.getElementsByTagName('body')[0]; | 330 | var b = document.getElementsByTagName('body')[0]; |
331 | b.appendChild(f); | 331 | b.appendChild(f); |
332 | f.submit(); | 332 | f.submit(); |
333 | w.focus; | 333 | w.focus; |
334 | } | 334 | } |
335 | tRs = { | 335 | tRs = { |
336 | formEl: null, | 336 | formEl: null, |
337 | resizeClass: 'textarea', | 337 | resizeClass: 'textarea', |
338 | adEv: function(t,ev,fn){ | 338 | adEv: function(t,ev,fn){ |
339 | if(typeof document.addEventListener != 'undefined'){ | 339 | if(typeof document.addEventListener != 'undefined'){ |
340 | t.addEventListener(ev,fn,false); | 340 | t.addEventListener(ev,fn,false); |
341 | }else{ | 341 | }else{ |
342 | t.attachEvent('on' + ev, fn); | 342 | t.attachEvent('on' + ev, fn); |
343 | } | 343 | } |
344 | }, | 344 | }, |
345 | rmEv: function(t,ev,fn){ | 345 | rmEv: function(t,ev,fn){ |
346 | if(typeof document.removeEventListener != 'undefined'){ | 346 | if(typeof document.removeEventListener != 'undefined'){ |
347 | t.removeEventListener(ev,fn,false); | 347 | t.removeEventListener(ev,fn,false); |
348 | }else | 348 | }else |
349 | { | 349 | { |
350 | t.detachEvent('on' + ev, fn); | 350 | t.detachEvent('on' + ev, fn); |
351 | } | 351 | } |
352 | }, | 352 | }, |
353 | adBtn: function(){ | 353 | adBtn: function(){ |
354 | var textareas = document.getElementsByTagName('textarea'); | 354 | var textareas = document.getElementsByTagName('textarea'); |
355 | for(var i = 0; i < textareas.length; i++){ | 355 | for(var i = 0; i < textareas.length; i++){ |
356 | var txtclass=textareas[i].className; | 356 | var txtclass=textareas[i].className; |
357 | if(txtclass.substring(0,tRs.resizeClass.length)==tRs.resizeClass || | 357 | if(txtclass.substring(0,tRs.resizeClass.length)==tRs.resizeClass || |
358 | txtclass.substring(txtclass.length -tRs.resizeClass.length)==tRs.resizeClass){ | 358 | txtclass.substring(txtclass.length -tRs.resizeClass.length)==tRs.resizeClass){ |
359 | var a = document.createElement('a'); | 359 | var a = document.createElement('a'); |
360 | a.appendChild(document.createTextNode("\u2195")); | 360 | a.appendChild(document.createTextNode("\u2195")); |
361 | a.style.cursor = 'n-resize'; | 361 | a.style.cursor = 'n-resize'; |
362 | a.className= 'resizer'; | 362 | a.className= 'resizer'; |
363 | a.title = 'click-drag to resize textarea' | 363 | a.title = 'click-drag to resize textarea' |
364 | tRs.adEv(a, 'mousedown', tRs.initResize); | 364 | tRs.adEv(a, 'mousedown', tRs.initResize); |
365 | textareas[i].parentNode.appendChild(a); | 365 | textareas[i].parentNode.appendChild(a); |
366 | } | 366 | } |
367 | } | 367 | } |
368 | }, | 368 | }, |
369 | initResize: function(event){ | 369 | initResize: function(event){ |
370 | if(typeof event == 'undefined'){ | 370 | if(typeof event == 'undefined'){ |
371 | event = window.event; | 371 | event = window.event; |
372 | } | 372 | } |
373 | if(event.srcElement){ | 373 | if(event.srcElement){ |
374 | var target = event.srcElement.previousSibling; | 374 | var target = event.srcElement.previousSibling; |
375 | }else{ | 375 | }else{ |
376 | var target = event.target.previousSibling; | 376 | var target = event.target.previousSibling; |
377 | } | 377 | } |
378 | if(target.nodeName.toLowerCase() == 'textarea' || (target.nodeName.toLowerCase() == 'input' && target.type == 'text')){ | 378 | if(target.nodeName.toLowerCase() == 'textarea' || (target.nodeName.toLowerCase() == 'input' && target.type == 'text')){ |
379 | tRs.formEl = target; | 379 | tRs.formEl = target; |
380 | tRs.formEl.startHeight = tRs.formEl.clientHeight; | 380 | tRs.formEl.startHeight = tRs.formEl.clientHeight; |
381 | tRs.formEl.startY = event.clientY; | 381 | tRs.formEl.startY = event.clientY; |
382 | tRs.adEv(document, 'mousemove', tRs.resize); | 382 | tRs.adEv(document, 'mousemove', tRs.resize); |
383 | tRs.adEv(document, 'mouseup', tRs.stopResize); | 383 | tRs.adEv(document, 'mouseup', tRs.stopResize); |
384 | tRs.formEl.parentNode.style.cursor = 'n-resize'; | 384 | tRs.formEl.parentNode.style.cursor = 'n-resize'; |
385 | tRs.formEl.style.cursor = 'n-resize'; | 385 | tRs.formEl.style.cursor = 'n-resize'; |
386 | try{ | 386 | try{ |
387 | event.preventDefault(); | 387 | event.preventDefault(); |
388 | }catch(e){ | 388 | }catch(e){ |
389 | } | 389 | } |
390 | } | 390 | } |
391 | }, | 391 | }, |
392 | resize: function(event){ | 392 | resize: function(event){ |
393 | if(typeof event == 'undefined'){ | 393 | if(typeof event == 'undefined'){ |
394 | event = window.event; | 394 | event = window.event; |
395 | } | 395 | } |
396 | if(tRs.formEl.nodeName.toLowerCase() == 'textarea'){ | 396 | if(tRs.formEl.nodeName.toLowerCase() == 'textarea'){ |
397 | tRs.formEl.style.height = event.clientY - tRs.formEl.startY + tRs.formEl.startHeight + 'px'; | 397 | tRs.formEl.style.height = event.clientY - tRs.formEl.startY + tRs.formEl.startHeight + 'px'; |
398 | } | 398 | } |
399 | }, | 399 | }, |
400 | stopResize: function(event){ | 400 | stopResize: function(event){ |
401 | tRs.rmEv(document, 'mousedown', tRs.initResize); | 401 | tRs.rmEv(document, 'mousedown', tRs.initResize); |
402 | tRs.rmEv(document, 'mousemove', tRs.resize); | 402 | tRs.rmEv(document, 'mousemove', tRs.resize); |
403 | tRs.formEl.style.cursor = 'text'; | 403 | tRs.formEl.style.cursor = 'text'; |
404 | tRs.formEl.parentNode.style.cursor = 'auto'; | 404 | tRs.formEl.parentNode.style.cursor = 'auto'; |
405 | return false; | 405 | return false; |
406 | } | 406 | } |
407 | }; | 407 | }; |
408 | tRs.adEv(window, 'load', tRs.adBtn); | 408 | tRs.adEv(window, 'load', tRs.adBtn); |
409 | // Diff Match and Patch javascript code by Neil Fraser; Apache license 2.0; http://code.google.com/p/google-diff-match-patch/ | 409 | // Diff Match and Patch javascript code by Neil Fraser; Apache license 2.0; http://code.google.com/p/google-diff-match-patch/ |
410 | (function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=0.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=0.5;this.Patch_Margin=4;this.Match_MaxBits=32} | 410 | (function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=0.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=0.5;this.Patch_Margin=4;this.Match_MaxBits=32} |
411 | diff_match_patch.prototype.diff_main=function(a,b,c,d){"undefined"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error("Null input. (diff_main)");if(a==b)return a?[[0,a]]:[];"undefined"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b),c=a.substring(0,f),a=a.substring(f),b=b.substring(f),f=this.diff_commonSuffix(a,b),g=a.substring(a.length-f),a=a.substring(0,a.length-f),b=b.substring(0,b.length-f),a=this.diff_compute_(a, | 411 | diff_match_patch.prototype.diff_main=function(a,b,c,d){"undefined"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error("Null input. (diff_main)");if(a==b)return a?[[0,a]]:[];"undefined"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b),c=a.substring(0,f),a=a.substring(f),b=b.substring(f),f=this.diff_commonSuffix(a,b),g=a.substring(a.length-f),a=a.substring(0,a.length-f),b=b.substring(0,b.length-f),a=this.diff_compute_(a, |
412 | b,e,d);c&&a.unshift([0,c]);g&&a.push([0,g]);this.diff_cleanupMerge(a);return a}; | 412 | b,e,d);c&&a.unshift([0,c]);g&&a.push([0,g]);this.diff_cleanupMerge(a);return a}; |
413 | diff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[1,b]];if(!b)return[[-1,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);if(-1!=g)return c=[[1,e.substring(0,g)],[0,f],[1,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=-1),c;if(1==f.length)return[[-1,a],[1,b]];return(e=this.diff_halfMatch_(a,b))?(f=e[0],a=e[1],g=e[2],b=e[3],e=e[4],f=this.diff_main(f,g,c,d),c=this.diff_main(a,b,c,d),f.concat([[0,e]],c)):c&&100<a.length&&100<b.length?this.diff_lineMode_(a, | 413 | diff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[1,b]];if(!b)return[[-1,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);if(-1!=g)return c=[[1,e.substring(0,g)],[0,f],[1,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=-1),c;if(1==f.length)return[[-1,a],[1,b]];return(e=this.diff_halfMatch_(a,b))?(f=e[0],a=e[1],g=e[2],b=e[3],e=e[4],f=this.diff_main(f,g,c,d),c=this.diff_main(a,b,c,d),f.concat([[0,e]],c)):c&&100<a.length&&100<b.length?this.diff_lineMode_(a, |
414 | b,d):this.diff_bisect_(a,b,d)}; | 414 | b,d):this.diff_bisect_(a,b,d)}; |
415 | diff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b),a=d.chars1,b=d.chars2,d=d.lineArray,a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([0,""]);for(var e=d=b=0,f="",g="";b<a.length;){switch(a[b][0]){case 1:e++;g+=a[b][1];break;case -1:d++;f+=a[b][1];break;case 0:if(1<=d&&1<=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0<=e;e--)a.splice(b,0,d[e]);b+=d.length}d=e=0;g=f=""}b++}a.pop();return a}; | 415 | diff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b),a=d.chars1,b=d.chars2,d=d.lineArray,a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([0,""]);for(var e=d=b=0,f="",g="";b<a.length;){switch(a[b][0]){case 1:e++;g+=a[b][1];break;case -1:d++;f+=a[b][1];break;case 0:if(1<=d&&1<=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0<=e;e--)a.splice(b,0,d[e]);b+=d.length}d=e=0;g=f=""}b++}a.pop();return a}; |
416 | diff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=f,h=2*f,j=Array(h),i=Array(h),k=0;k<h;k++)j[k]=-1,i[k]=-1;j[g+1]=0;i[g+1]=0;for(var k=d-e,p=0!=k%2,q=0,s=0,o=0,v=0,u=0;u<f&&!((new Date).getTime()>c);u++){for(var n=-u+q;n<=u-s;n+=2){var l=g+n,m;m=n==-u||n!=u&&j[l-1]<j[l+1]?j[l+1]:j[l-1]+1;for(var r=m-n;m<d&&r<e&&a.charAt(m)==b.charAt(r);)m++,r++;j[l]=m;if(m>d)s+=2;else if(r>e)q+=2;else if(p&&(l=g+k-n,0<=l&&l<h&&-1!=i[l])){var t=d-i[l];if(m>= | 416 | diff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=f,h=2*f,j=Array(h),i=Array(h),k=0;k<h;k++)j[k]=-1,i[k]=-1;j[g+1]=0;i[g+1]=0;for(var k=d-e,p=0!=k%2,q=0,s=0,o=0,v=0,u=0;u<f&&!((new Date).getTime()>c);u++){for(var n=-u+q;n<=u-s;n+=2){var l=g+n,m;m=n==-u||n!=u&&j[l-1]<j[l+1]?j[l+1]:j[l-1]+1;for(var r=m-n;m<d&&r<e&&a.charAt(m)==b.charAt(r);)m++,r++;j[l]=m;if(m>d)s+=2;else if(r>e)q+=2;else if(p&&(l=g+k-n,0<=l&&l<h&&-1!=i[l])){var t=d-i[l];if(m>= |
417 | t)return this.diff_bisectSplit_(a,b,m,r,c)}}for(n=-u+o;n<=u-v;n+=2){l=g+n;t=n==-u||n!=u&&i[l-1]<i[l+1]?i[l+1]:i[l-1]+1;for(m=t-n;t<d&&m<e&&a.charAt(d-t-1)==b.charAt(e-m-1);)t++,m++;i[l]=t;if(t>d)v+=2;else if(m>e)o+=2;else if(!p&&(l=g+k-n,0<=l&&l<h&&-1!=j[l]&&(m=j[l],r=g+m-l,t=d-t,m>=t)))return this.diff_bisectSplit_(a,b,m,r,c)}}return[[-1,a],[1,b]]}; | 417 | t)return this.diff_bisectSplit_(a,b,m,r,c)}}for(n=-u+o;n<=u-v;n+=2){l=g+n;t=n==-u||n!=u&&i[l-1]<i[l+1]?i[l+1]:i[l-1]+1;for(m=t-n;t<d&&m<e&&a.charAt(d-t-1)==b.charAt(e-m-1);)t++,m++;i[l]=t;if(t>d)v+=2;else if(m>e)o+=2;else if(!p&&(l=g+k-n,0<=l&&l<h&&-1!=j[l]&&(m=j[l],r=g+m-l,t=d-t,m>=t)))return this.diff_bisectSplit_(a,b,m,r,c)}}return[[-1,a],[1,b]]}; |
418 | diff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d),a=a.substring(c),b=b.substring(d),f=this.diff_main(f,g,!1,e),e=this.diff_main(a,b,!1,e);return f.concat(e)}; | 418 | diff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d),a=a.substring(c),b=b.substring(d),f=this.diff_main(f,g,!1,e),e=this.diff_main(a,b,!1,e);return f.concat(e)}; |
419 | diff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b="",c=0,f=-1,g=d.length;f<a.length-1;){f=a.indexOf("\n",c);-1==f&&(f=a.length-1);var q=a.substring(c,f+1),c=f+1;(e.hasOwnProperty?e.hasOwnProperty(q):void 0!==e[q])?b+=String.fromCharCode(e[q]):(b+=String.fromCharCode(g),e[q]=g,d[g++]=q)}return b}var d=[],e={};d[0]="";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}}; | 419 | diff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b="",c=0,f=-1,g=d.length;f<a.length-1;){f=a.indexOf("\n",c);-1==f&&(f=a.length-1);var q=a.substring(c,f+1),c=f+1;(e.hasOwnProperty?e.hasOwnProperty(q):void 0!==e[q])?b+=String.fromCharCode(e[q]):(b+=String.fromCharCode(g),e[q]=g,d[g++]=q)}return b}var d=[],e={};d[0]="";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}}; |
420 | diff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c<a.length;c++){for(var d=a[c][1],e=[],f=0;f<d.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join("")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e}; | 420 | diff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c<a.length;c++){for(var d=a[c][1],e=[],f=0;f<d.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join("")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e}; |
421 | diff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e}; | 421 | diff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e}; |
422 | diff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c<d&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;for(var d=0,e=1;;){var f=a.substring(c-e),f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}}; | 422 | diff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c<d&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;for(var d=0,e=1;;){var f=a.substring(c-e),f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}}; |
423 | diff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g="",h,j,n,l;-1!=(e=b.indexOf(d,e+1));){var m=f.diff_commonPrefix(a.substring(c),b.substring(e)),r=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length<r+m&&(g=b.substring(e-r,e)+b.substring(e,e+m),h=a.substring(0,c-r),j=a.substring(c+m),n=b.substring(0,e-r),l=b.substring(e+m))}return 2*g.length>=a.length?[h,j,n,l,g]:null}if(0>=this.Diff_Timeout)return null; | 423 | diff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g="",h,j,n,l;-1!=(e=b.indexOf(d,e+1));){var m=f.diff_commonPrefix(a.substring(c),b.substring(e)),r=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length<r+m&&(g=b.substring(e-r,e)+b.substring(e,e+m),h=a.substring(0,c-r),j=a.substring(c+m),n=b.substring(0,e-r),l=b.substring(e+m))}return 2*g.length>=a.length?[h,j,n,l,g]:null}if(0>=this.Diff_Timeout)return null; |
424 | var d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length<d.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4)),d=c(d,e,Math.ceil(d.length/2)),h;if(!g&&!d)return null;h=d?g?g[4].length>d[4].length?g:d:d:g;var j;a.length>b.length?(g=h[0],d=h[1],e=h[2],j=h[3]):(e=h[0],j=h[1],g=h[2],d=h[3]);h=h[4];return[g,d,e,j,h]}; | 424 | var d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length<d.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4)),d=c(d,e,Math.ceil(d.length/2)),h;if(!g&&!d)return null;h=d?g?g[4].length>d[4].length?g:d:d:g;var j;a.length>b.length?(g=h[0],d=h[1],e=h[2],j=h[3]):(e=h[0],j=h[1],g=h[2],d=h[3]);h=h[4];return[g,d,e,j,h]}; |
425 | diff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,j=0,i=0;f<a.length;)0==a[f][0]?(c[d++]=f,g=j,h=i,i=j=0,e=a[f][1]):(1==a[f][0]?j+=a[f][1].length:i+=a[f][1].length,e&&e.length<=Math.max(g,h)&&e.length<=Math.max(j,i)&&(a.splice(c[d-1],0,[-1,e]),a[c[d-1]+1][0]=1,d--,d--,f=0<d?c[d-1]:-1,i=j=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f<a.length;){if(-1==a[f-1][0]&&1==a[f][0]){b=a[f-1][1];c=a[f][1]; | 425 | diff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,j=0,i=0;f<a.length;)0==a[f][0]?(c[d++]=f,g=j,h=i,i=j=0,e=a[f][1]):(1==a[f][0]?j+=a[f][1].length:i+=a[f][1].length,e&&e.length<=Math.max(g,h)&&e.length<=Math.max(j,i)&&(a.splice(c[d-1],0,[-1,e]),a[c[d-1]+1][0]=1,d--,d--,f=0<d?c[d-1]:-1,i=j=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f<a.length;){if(-1==a[f-1][0]&&1==a[f][0]){b=a[f-1][1];c=a[f][1]; |
426 | d=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[0,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[0,b.substring(0,e)]),a[f-1][0]=1,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=-1,a[f+1][1]=b.substring(e),f++;f++}f++}}; | 426 | d=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[0,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[0,b.substring(0,e)]),a[f-1][0]=1,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=-1,a[f+1][1]=b.substring(e),f++;f++}f++}}; |
427 | diff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_),c=g&&c.match(diff_match_patch.linebreakRegex_),d=h&&d.match(diff_match_patch.linebreakRegex_),i=c&&a.match(diff_match_patch.blanklineEndRegex_),j=d&&b.match(diff_match_patch.blanklineStartRegex_); | 427 | diff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_),c=g&&c.match(diff_match_patch.linebreakRegex_),d=h&&d.match(diff_match_patch.linebreakRegex_),i=c&&a.match(diff_match_patch.blanklineEndRegex_),j=d&&b.match(diff_match_patch.blanklineStartRegex_); |
428 | return i||j?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c<a.length-1;){if(0==a[c-1][0]&&0==a[c+1][0]){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g)var h=e.substring(e.length-g),d=d.substring(0,d.length-g),e=h+e.substring(0,e.length-g),f=h+f;for(var g=d,h=e,j=f,i=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){var d=d+e.charAt(0),e=e.substring(1)+f.charAt(0),f=f.substring(1),k=b(d,e)+b(e,f);k>=i&&(i=k,g=d,h=e,j=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-1,1),c--),a[c][1]= | 428 | return i||j?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c<a.length-1;){if(0==a[c-1][0]&&0==a[c+1][0]){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g)var h=e.substring(e.length-g),d=d.substring(0,d.length-g),e=h+e.substring(0,e.length-g),f=h+f;for(var g=d,h=e,j=f,i=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){var d=d+e.charAt(0),e=e.substring(1)+f.charAt(0),f=f.substring(1),k=b(d,e)+b(e,f);k>=i&&(i=k,g=d,h=e,j=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-1,1),c--),a[c][1]= |
429 | h,j?a[c+1][1]=j:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\s/;diff_match_patch.linebreakRegex_=/[\r\n]/;diff_match_patch.blanklineEndRegex_=/\n\r?\n$/;diff_match_patch.blanklineStartRegex_=/^\r?\n\r?\n/; | 429 | h,j?a[c+1][1]=j:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\s/;diff_match_patch.linebreakRegex_=/[\r\n]/;diff_match_patch.blanklineEndRegex_=/\n\r?\n$/;diff_match_patch.blanklineStartRegex_=/^\r?\n\r?\n/; |
430 | diff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,j=!1,i=!1;f<a.length;){if(0==a[f][0])a[f][1].length<this.Diff_EditCost&&(j||i)?(c[d++]=f,g=j,h=i,e=a[f][1]):(d=0,e=null),j=i=!1;else if(-1==a[f][0]?i=!0:j=!0,e&&(g&&h&&j&&i||e.length<this.Diff_EditCost/2&&3==g+h+j+i))a.splice(c[d-1],0,[-1,e]),a[c[d-1]+1][0]=1,d--,e=null,g&&h?(j=i=!0,d=0):(d--,f=0<d?c[d-1]:-1,j=i=!1),b=!0;f++}b&&this.diff_cleanupMerge(a)}; | 430 | diff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,j=!1,i=!1;f<a.length;){if(0==a[f][0])a[f][1].length<this.Diff_EditCost&&(j||i)?(c[d++]=f,g=j,h=i,e=a[f][1]):(d=0,e=null),j=i=!1;else if(-1==a[f][0]?i=!0:j=!0,e&&(g&&h&&j&&i||e.length<this.Diff_EditCost/2&&3==g+h+j+i))a.splice(c[d-1],0,[-1,e]),a[c[d-1]+1][0]=1,d--,e=null,g&&h?(j=i=!0,d=0):(d--,f=0<d?c[d-1]:-1,j=i=!1),b=!0;f++}b&&this.diff_cleanupMerge(a)}; |
431 | diff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([0,""]);for(var b=0,c=0,d=0,e="",f="",g;b<a.length;)switch(a[b][0]){case 1:d++;f+=a[b][1];b++;break;case -1:c++;e+=a[b][1];b++;break;case 0:1<c+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0<b-c-d&&0==a[b-c-d-1][0]?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[0,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-g)+a[b][1],f=f.substring(0,f.length- | 431 | diff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([0,""]);for(var b=0,c=0,d=0,e="",f="",g;b<a.length;)switch(a[b][0]){case 1:d++;f+=a[b][1];b++;break;case -1:c++;e+=a[b][1];b++;break;case 0:1<c+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0<b-c-d&&0==a[b-c-d-1][0]?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[0,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-g)+a[b][1],f=f.substring(0,f.length- |
432 | g),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[1,f]):0===d?a.splice(b-c,c+d,[-1,e]):a.splice(b-c-d,c+d,[-1,e],[1,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&0==a[b-1][0]?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=""}""===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b<a.length-1;)0==a[b-1][0]&&0==a[b+1][0]&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,a[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0, | 432 | g),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[1,f]):0===d?a.splice(b-c,c+d,[-1,e]):a.splice(b-c-d,c+d,[-1,e],[1,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&0==a[b-1][0]?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=""}""===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b<a.length-1;)0==a[b-1][0]&&0==a[b+1][0]&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,a[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0, |
433 | a[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};diff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g<a.length;g++){1!==a[g][0]&&(c+=a[g][1].length);-1!==a[g][0]&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&-1===a[g][0]?f:f+(b-e)}; | 433 | a[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};diff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g<a.length;g++){1!==a[g][0]&&(c+=a[g][1].length);-1!==a[g][0]&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&-1===a[g][0]?f:f+(b-e)}; |
434 | diff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/</g,e=/>/g,f=/\n/g,g=0;g<a.length;g++){var h=a[g][0],j=a[g][1],j=j.replace(c,"&").replace(d,"<").replace(e,">").replace(f,"<span style=\"color: #dcdcdc;\">¬</span><br>");switch(h){case 1:b[g]='<ins style="background:#ccffcc; text-decoration: none;">'+j+"</ins>";break;case -1:b[g]='<del style="background:#ffffcc; text-decoration: line-through; color: orange;">'+j+"</del>";break;case 0:b[g]="<span>"+j+"</span>"}}return b.join("")}; | 434 | diff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/</g,e=/>/g,f=/\n/g,g=0;g<a.length;g++){var h=a[g][0],j=a[g][1],j=j.replace(c,"&").replace(d,"<").replace(e,">").replace(f,"<span style=\"color: #dcdcdc;\">¬</span><br>");switch(h){case 1:b[g]='<ins style="background:#ccffcc; text-decoration: none;">'+j+"</ins>";break;case -1:b[g]='<del style="background:#ffffcc; text-decoration: line-through; color: orange;">'+j+"</del>";break;case 0:b[g]="<span>"+j+"</span>"}}return b.join("")}; |
435 | diff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c<a.length;c++)1!==a[c][0]&&(b[c]=a[c][1]);return b.join("")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c<a.length;c++)-1!==a[c][0]&&(b[c]=a[c][1]);return b.join("")};diff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e<a.length;e++){var f=a[e][0],g=a[e][1];switch(f){case 1:c+=g.length;break;case -1:d+=g.length;break;case 0:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)}; | 435 | diff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c<a.length;c++)1!==a[c][0]&&(b[c]=a[c][1]);return b.join("")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c<a.length;c++)-1!==a[c][0]&&(b[c]=a[c][1]);return b.join("")};diff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e<a.length;e++){var f=a[e][0],g=a[e][1];switch(f){case 1:c+=g.length;break;case -1:d+=g.length;break;case 0:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)}; |
436 | diff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c<a.length;c++)switch(a[c][0]){case 1:b[c]="+"+encodeURI(a[c][1]);break;case -1:b[c]="-"+a[c][1].length;break;case 0:b[c]="="+a[c][1].length}return b.join("\t").replace(/%20/g," ")}; | 436 | diff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c<a.length;c++)switch(a[c][0]){case 1:b[c]="+"+encodeURI(a[c][1]);break;case -1:b[c]="-"+a[c][1].length;break;case 0:b[c]="="+a[c][1].length}return b.join("\t").replace(/%20/g," ")}; |
437 | diff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\t/g),g=0;g<f.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case "+":try{c[d++]=[1,decodeURI(h)]}catch(j){throw Error("Illegal escape in diff_fromDelta: "+h);}break;case "-":case "=":var i=parseInt(h,10);if(isNaN(i)||0>i)throw Error("Invalid number in diff_fromDelta: "+h);h=a.substring(e,e+=i);"="==f[g].charAt(0)?c[d++]=[0,h]:c[d++]=[-1,h];break;default:if(f[g])throw Error("Invalid diff operation in diff_fromDelta: "+ | 437 | diff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\t/g),g=0;g<f.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case "+":try{c[d++]=[1,decodeURI(h)]}catch(j){throw Error("Illegal escape in diff_fromDelta: "+h);}break;case "-":case "=":var i=parseInt(h,10);if(isNaN(i)||0>i)throw Error("Invalid number in diff_fromDelta: "+h);h=a.substring(e,e+=i);"="==f[g].charAt(0)?c[d++]=[0,h]:c[d++]=[-1,h];break;default:if(f[g])throw Error("Invalid diff operation in diff_fromDelta: "+ |
438 | f[g]);}}if(e!=a.length)throw Error("Delta length ("+e+") does not equal source text length ("+a.length+").");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error("Null input. (match_main)");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1}; | 438 | f[g]);}}if(e!=a.length)throw Error("Delta length ("+e+") does not equal source text length ("+a.length+").");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error("Null input. (match_main)");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1}; |
439 | diff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return!f.Match_Distance?g?1:e:e+g/f.Match_Distance}if(b.length>this.Match_MaxBits)throw Error("Pattern too long for this browser.");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));for(var j=1<<b.length-1,h=-1,i,k,p=b.length+a.length,q,s=0;s<b.length;s++){i=0;for(k=p;i<k;)d(s,c+ | 439 | diff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return!f.Match_Distance?g?1:e:e+g/f.Match_Distance}if(b.length>this.Match_MaxBits)throw Error("Pattern too long for this browser.");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));for(var j=1<<b.length-1,h=-1,i,k,p=b.length+a.length,q,s=0;s<b.length;s++){i=0;for(k=p;i<k;)d(s,c+ |
440 | k)<=g?i=k:p=k,k=Math.floor((p-i)/2+i);p=k;i=Math.max(1,c-k+1);var o=Math.min(c+k,a.length)+b.length;k=Array(o+2);for(k[o+1]=(1<<s)-1;o>=i;o--){var v=e[a.charAt(o-1)];k[o]=0===s?(k[o+1]<<1|1)&v:(k[o+1]<<1|1)&v|(q[o+1]|q[o])<<1|1|q[o+1];if(k[o]&j&&(v=d(s,o-1),v<=g))if(g=v,h=o-1,h>c)i=Math.max(1,2*c-h);else break}if(d(s+1,c)>g)break;q=k}return h}; | 440 | k)<=g?i=k:p=k,k=Math.floor((p-i)/2+i);p=k;i=Math.max(1,c-k+1);var o=Math.min(c+k,a.length)+b.length;k=Array(o+2);for(k[o+1]=(1<<s)-1;o>=i;o--){var v=e[a.charAt(o-1)];k[o]=0===s?(k[o+1]<<1|1)&v:(k[o+1]<<1|1)&v|(q[o+1]|q[o])<<1|1|q[o+1];if(k[o]&j&&(v=d(s,o-1),v<=g))if(g=v,h=o-1,h>c)i=Math.max(1,2*c-h);else break}if(d(s+1,c)>g)break;q=k}return h}; |
441 | diff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c<a.length;c++)b[a.charAt(c)]=0;for(c=0;c<a.length;c++)b[a.charAt(c)]|=1<<a.length-c-1;return b}; | 441 | diff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c<a.length;c++)b[a.charAt(c)]=0;for(c=0;c<a.length;c++)b[a.charAt(c)]|=1<<a.length-c-1;return b}; |
442 | diff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([0,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([0,d]);a.start1-=c.length;a.start2-=c.length;a.length1+= | 442 | diff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([0,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([0,d]);a.start1-=c.length;a.start2-=c.length;a.length1+= |
443 | c.length+d.length;a.length2+=c.length+d.length}}; | 443 | c.length+d.length;a.length2+=c.length+d.length}}; |
444 | diff_match_patch.prototype.patch_make=function(a,b,c){var d;if("string"==typeof a&&"string"==typeof b&&"undefined"==typeof c)d=a,b=this.diff_main(d,b,!0),2<b.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b));else if(a&&"object"==typeof a&&"undefined"==typeof b&&"undefined"==typeof c)b=a,d=this.diff_text1(b);else if("string"==typeof a&&b&&"object"==typeof b&&"undefined"==typeof c)d=a;else if("string"==typeof a&&"string"==typeof b&&c&&"object"==typeof c)d=a,b=c;else throw Error("Unknown call format to patch_make."); | 444 | diff_match_patch.prototype.patch_make=function(a,b,c){var d;if("string"==typeof a&&"string"==typeof b&&"undefined"==typeof c)d=a,b=this.diff_main(d,b,!0),2<b.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b));else if(a&&"object"==typeof a&&"undefined"==typeof b&&"undefined"==typeof c)b=a,d=this.diff_text1(b);else if("string"==typeof a&&b&&"object"==typeof b&&"undefined"==typeof c)d=a;else if("string"==typeof a&&"string"==typeof b&&c&&"object"==typeof c)d=a,b=c;else throw Error("Unknown call format to patch_make."); |
445 | if(0===b.length)return[];for(var c=[],a=new diff_match_patch.patch_obj,e=0,f=0,g=0,h=d,j=0;j<b.length;j++){var i=b[j][0],k=b[j][1];if(!e&&0!==i)a.start1=f,a.start2=g;switch(i){case 1:a.diffs[e++]=b[j];a.length2+=k.length;d=d.substring(0,g)+k+d.substring(g);break;case -1:a.length1+=k.length;a.diffs[e++]=b[j];d=d.substring(0,g)+d.substring(g+k.length);break;case 0:k.length<=2*this.Patch_Margin&&e&&b.length!=j+1?(a.diffs[e++]=b[j],a.length1+=k.length,a.length2+=k.length):k.length>=2*this.Patch_Margin&& | 445 | if(0===b.length)return[];for(var c=[],a=new diff_match_patch.patch_obj,e=0,f=0,g=0,h=d,j=0;j<b.length;j++){var i=b[j][0],k=b[j][1];if(!e&&0!==i)a.start1=f,a.start2=g;switch(i){case 1:a.diffs[e++]=b[j];a.length2+=k.length;d=d.substring(0,g)+k+d.substring(g);break;case -1:a.length1+=k.length;a.diffs[e++]=b[j];d=d.substring(0,g)+d.substring(g+k.length);break;case 0:k.length<=2*this.Patch_Margin&&e&&b.length!=j+1?(a.diffs[e++]=b[j],a.length1+=k.length,a.length2+=k.length):k.length>=2*this.Patch_Margin&& |
446 | e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}1!==i&&(f+=k.length);-1!==i&&(g+=k.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};diff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f<d.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b}; | 446 | e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}1!==i&&(f+=k.length);-1!==i&&(g+=k.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};diff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f<d.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b}; |
447 | diff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];var a=this.patch_deepCopy(a),c=this.patch_addPadding(a),b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f<a.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),j,i=-1;if(h.length>this.Match_MaxBits){if(j=this.match_main(b,h.substring(0,this.Match_MaxBits),g),-1!=j&&(i=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==i||j>=i))j=-1}else j=this.match_main(b,h,g); | 447 | diff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];var a=this.patch_deepCopy(a),c=this.patch_addPadding(a),b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f<a.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),j,i=-1;if(h.length>this.Match_MaxBits){if(j=this.match_main(b,h.substring(0,this.Match_MaxBits),g),-1!=j&&(i=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==i||j>=i))j=-1}else j=this.match_main(b,h,g); |
448 | if(-1==j)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=j-g,g=-1==i?b.substring(j,j+h.length):b.substring(j,i+this.Match_MaxBits),h==g)b=b.substring(0,j)+this.diff_text2(a[f].diffs)+b.substring(j+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);for(var h=0,k,i=0;i<a[f].diffs.length;i++){var p=a[f].diffs[i];0!==p[0]&&(k=this.diff_xIndex(g,h));1===p[0]?b=b.substring(0, | 448 | if(-1==j)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=j-g,g=-1==i?b.substring(j,j+h.length):b.substring(j,i+this.Match_MaxBits),h==g)b=b.substring(0,j)+this.diff_text2(a[f].diffs)+b.substring(j+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);for(var h=0,k,i=0;i<a[f].diffs.length;i++){var p=a[f].diffs[i];0!==p[0]&&(k=this.diff_xIndex(g,h));1===p[0]?b=b.substring(0, |
449 | j+k)+p[1]+b.substring(j+k):-1===p[0]&&(b=b.substring(0,j+k)+b.substring(j+this.diff_xIndex(g,h+p[1].length)));-1!==p[0]&&(h+=p[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]}; | 449 | j+k)+p[1]+b.substring(j+k):-1===p[0]&&(b=b.substring(0,j+k)+b.substring(j+this.diff_xIndex(g,h+p[1].length)));-1!==p[0]&&(h+=p[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]}; |
450 | diff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c="",d=1;d<=b;d++)c+=String.fromCharCode(d);for(d=0;d<a.length;d++)a[d].start1+=b,a[d].start2+=b;var d=a[0],e=d.diffs;if(0==e.length||0!=e[0][0])e.unshift([0,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||0!=e[e.length-1][0]?(e.push([0, | 450 | diff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c="",d=1;d<=b;d++)c+=String.fromCharCode(d);for(d=0;d<a.length;d++)a[d].start1+=b,a[d].start2+=b;var d=a[0],e=d.diffs;if(0==e.length||0!=e[0][0])e.unshift([0,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||0!=e[e.length-1][0]?(e.push([0, |
451 | c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c}; | 451 | c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c}; |
452 | diff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c<a.length;c++)if(!(a[c].length1<=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g="";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,j=!0;h.start1=e-g.length;h.start2=f-g.length;if(""!==g)h.length1=h.length2=g.length,h.diffs.push([0,g]);for(;0!==d.diffs.length&&h.length1<b-this.Patch_Margin;){var g=d.diffs[0][0],i=d.diffs[0][1];1===g?(h.length2+=i.length,f+=i.length,h.diffs.push(d.diffs.shift()), | 452 | diff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c<a.length;c++)if(!(a[c].length1<=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g="";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,j=!0;h.start1=e-g.length;h.start2=f-g.length;if(""!==g)h.length1=h.length2=g.length,h.diffs.push([0,g]);for(;0!==d.diffs.length&&h.length1<b-this.Patch_Margin;){var g=d.diffs[0][0],i=d.diffs[0][1];1===g?(h.length2+=i.length,f+=i.length,h.diffs.push(d.diffs.shift()), |
453 | j=!1):-1===g&&1==h.diffs.length&&0==h.diffs[0][0]&&i.length>2*b?(h.length1+=i.length,e+=i.length,j=!1,h.diffs.push([g,i]),d.diffs.shift()):(i=i.substring(0,b-h.length1-this.Patch_Margin),h.length1+=i.length,e+=i.length,0===g?(h.length2+=i.length,f+=i.length):j=!1,h.diffs.push([g,i]),i==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(i.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);i=this.diff_text1(d.diffs).substring(0,this.Patch_Margin);""!==i&& | 453 | j=!1):-1===g&&1==h.diffs.length&&0==h.diffs[0][0]&&i.length>2*b?(h.length1+=i.length,e+=i.length,j=!1,h.diffs.push([g,i]),d.diffs.shift()):(i=i.substring(0,b-h.length1-this.Patch_Margin),h.length1+=i.length,e+=i.length,0===g?(h.length2+=i.length,f+=i.length):j=!1,h.diffs.push([g,i]),i==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(i.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);i=this.diff_text1(d.diffs).substring(0,this.Patch_Margin);""!==i&& |
454 | (h.length1+=i.length,h.length2+=i.length,0!==h.diffs.length&&0===h.diffs[h.diffs.length-1][0]?h.diffs[h.diffs.length-1][1]+=i:h.diffs.push([0,i]));j||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=a[c];return b.join("")}; | 454 | (h.length1+=i.length,h.length2+=i.length,0!==h.diffs.length&&0===h.diffs[h.diffs.length-1][0]?h.diffs[h.diffs.length-1][1]+=i:h.diffs.push([0,i]));j||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=a[c];return b.join("")}; |
455 | diff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;for(var a=a.split("\n"),c=0,d=/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/;c<a.length;){var e=a[c].match(d);if(!e)throw Error("Invalid patch string: "+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);""===e[2]?(f.start1--,f.length1=1):"0"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);""===e[4]?(f.start2--,f.length2=1):"0"==e[4]?f.length2=0:(f.start2--,f.length2= | 455 | diff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;for(var a=a.split("\n"),c=0,d=/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/;c<a.length;){var e=a[c].match(d);if(!e)throw Error("Invalid patch string: "+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);""===e[2]?(f.start1--,f.length1=1):"0"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);""===e[4]?(f.start2--,f.length2=1):"0"==e[4]?f.length2=0:(f.start2--,f.length2= |
456 | parseInt(e[4],10));for(c++;c<a.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error("Illegal escape in patch_fromText: "+g);}if("-"==e)f.diffs.push([-1,g]);else if("+"==e)f.diffs.push([1,g]);else if(" "==e)f.diffs.push([0,g]);else if("@"==e)break;else if(""!==e)throw Error('Invalid patch mode "'+e+'" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0}; | 456 | parseInt(e[4],10));for(c++;c<a.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error("Illegal escape in patch_fromText: "+g);}if("-"==e)f.diffs.push([-1,g]);else if("+"==e)f.diffs.push([1,g]);else if(" "==e)f.diffs.push([0,g]);else if("@"==e)break;else if(""!==e)throw Error('Invalid patch mode "'+e+'" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0}; |
457 | diff_match_patch.patch_obj.prototype.toString=function(){var a,b;a=0===this.length1?this.start1+",0":1==this.length1?this.start1+1:this.start1+1+","+this.length1;b=0===this.length2?this.start2+",0":1==this.length2?this.start2+1:this.start2+1+","+this.length2;a=["@@ -"+a+" +"+b+" @@\n"];var c;for(b=0;b<this.diffs.length;b++){switch(this.diffs[b][0]){case 1:c="+";break;case -1:c="-";break;case 0:c=" "}a[b+1]=c+encodeURI(this.diffs[b][1])+"\n"}return a.join("").replace(/%20/g," ")}; | 457 | diff_match_patch.patch_obj.prototype.toString=function(){var a,b;a=0===this.length1?this.start1+",0":1==this.length1?this.start1+1:this.start1+1+","+this.length1;b=0===this.length2?this.start2+",0":1==this.length2?this.start2+1:this.start2+1+","+this.length2;a=["@@ -"+a+" +"+b+" @@\n"];var c;for(b=0;b<this.diffs.length;b++){switch(this.diffs[b][0]){case 1:c="+";break;case -1:c="-";break;case 0:c=" "}a[b+1]=c+encodeURI(this.diffs[b][1])+"\n"}return a.join("").replace(/%20/g," ")}; |
458 | this.diff_match_patch=diff_match_patch;this.DIFF_DELETE=-1;this.DIFF_INSERT=1;this.DIFF_EQUAL=0;})() | 458 | this.diff_match_patch=diff_match_patch;this.DIFF_DELETE=-1;this.DIFF_INSERT=1;this.DIFF_EQUAL=0;})() |
459 | var dmp = new diff_match_patch(); function diffLaunch(){var text1 = document.getElementById('text').value; var text2 = document.getElementById('text2').value; dmp.Diff_Timeout = 0; dmp.Diff_EditCost = 4; var d = dmp.diff_main(text1, text2); var ds = dmp.diff_prettyHtml(d); document.getElementById('diff').innerHTML = ds; | 459 | var dmp = new diff_match_patch(); function diffLaunch(){var text1 = document.getElementById('text').value; var text2 = document.getElementById('text2').value; dmp.Diff_Timeout = 0; dmp.Diff_EditCost = 4; var d = dmp.diff_main(text1, text2); var ds = dmp.diff_prettyHtml(d); document.getElementById('diff').innerHTML = ds; |
460 | } | 460 | } |
461 | //--><!]]></script> | 461 | //--><!]]></script> |
462 | <title>htmLawed (<?php echo hl_version();?>) test</title> | 462 | <title>htmLawed (<?php echo hl_version();?>) test</title> |
463 | </head> | 463 | </head> |
464 | <body> | 464 | <body> |
465 | <div id="topmost"> | 465 | <div id="topmost"> |
466 | 466 | ||
467 | <h5 style="float: left; display: inline; margin-top: 0; margin-bottom: 5px;"><a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/index.php" title="htmLawed home">HTM<big><big>L</big></big>AWED</a> <?php echo hl_version();?> <a href="htmLawedTest.php" title="test home">TEST</a></h5> | 467 | <h5 style="float: left; display: inline; margin-top: 0; margin-bottom: 5px;"><a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/index.php" title="htmLawed home">HTM<big><big>L</big></big>AWED</a> <?php echo hl_version();?> <a href="htmLawedTest.php" title="test home">TEST</a></h5> |
468 | <span style="float: right;" class="help"><a href="htmLawed_README.htm"><span class="notice">htm</span></a> / <a href="htmLawed_README.txt"><span class="notice">txt</span></a> documentation</span><br style="clear:both;" /> | 468 | <span style="float: right;" class="help"><a href="htmLawed_README.htm"><span class="notice">htm</span></a> / <a href="htmLawed_README.txt"><span class="notice">txt</span></a> documentation</span><br style="clear:both;" /> |
469 | 469 | ||
470 | <a href="htmLawedTest.php" title="[toggle visibility] type or copy-paste" onclick="javascript:toggle('inputF'); return false;"><span class="notice">Input »</span> <span class="help" title="limit lower with multibyte characters<?php echo (($_hlimit < $_limit && $_hlimit)? '; limit is '. $_hlimit. ' for viewing binaries' : ''); ?>"><small>(max. <?php echo htmlspecialchars($_limit);?> chars)</small></span></a> | 470 | <a href="htmLawedTest.php" title="[toggle visibility] type or copy-paste" onclick="javascript:toggle('inputF'); return false;"><span class="notice">Input »</span> <span class="help" title="limit lower with multibyte characters<?php echo (($_hlimit < $_limit && $_hlimit)? '; limit is '. $_hlimit. ' for viewing binaries' : ''); ?>"><small>(max. <?php echo htmlspecialchars($_limit);?> chars)</small></span></a> |
471 | 471 | ||
472 | <form id="testform" name="testform" action="htmLawedTest.php" method="post" accept-charset="<?php echo htmlspecialchars($_POST['enc']); ?>" style="padding:0; margin: 0; display:inline;"> | 472 | <form id="testform" name="testform" action="htmLawedTest.php" method="post" accept-charset="<?php echo htmlspecialchars($_POST['enc']); ?>" style="padding:0; margin: 0; display:inline;"> |
473 | 473 | ||
474 | <div id="inputF" style="display: block;"> | 474 | <div id="inputF" style="display: block;"> |
475 | 475 | ||
476 | <input type="hidden" name="token" id="token" value="<?php echo $token; ?>" /> | 476 | <input type="hidden" name="token" id="token" value="<?php echo $token; ?>" /> |
477 | <div><textarea id="text" class="textarea" name="text" rows="5" cols="100" style="width: 100%;"><?php echo htmlspecialchars($_POST['text']);?></textarea></div> | 477 | <div><textarea id="text" class="textarea" name="text" rows="5" cols="100" style="width: 100%;"><?php echo htmlspecialchars($_POST['text']);?></textarea></div> |
478 | <input type="submit" id="submitF" name="submitF" value="Process" style="float:left;" title="filter using htmLawed" onclick="javascript: sndProc(); return false;" onkeypress="javascript: sndProc(); return false;" /> | 478 | <input type="submit" id="submitF" name="submitF" value="Process" style="float:left;" title="filter using htmLawed" onclick="javascript: sndProc(); return false;" onkeypress="javascript: sndProc(); return false;" /> |
479 | 479 | ||
480 | <?php | 480 | <?php |
481 | if($do){ | 481 | if($do){ |
482 | if($validation){ | 482 | if($validation){ |
483 | echo '<input type="hidden" value="1" name="w3c_validate" id="w3c_validate" />'; | 483 | echo '<input type="hidden" value="1" name="w3c_validate" id="w3c_validate" />'; |
484 | } | 484 | } |
485 | ?> | 485 | ?> |
486 | 486 | ||
487 | <button type="button" title="Raw input rendered as web-page without a doctype or charset declaration" style="float: right;" onclick="javascript: sndUnproc(); return false;" onkeypress="javascript: sndUnproc(); return false;">Render in webpage</button> | 487 | <button type="button" title="Raw input rendered as web-page without a doctype or charset declaration" style="float: right;" onclick="javascript: sndUnproc(); return false;" onkeypress="javascript: sndUnproc(); return false;">Render in webpage</button> |
488 | <button type="button" onclick="javascript:document.getElementById('text').focus();document.getElementById('text').select()" title="select all to copy" style="float:right;">Select all</button> | 488 | <button type="button" onclick="javascript:document.getElementById('text').focus();document.getElementById('text').select()" title="select all to copy" style="float:right;">Select all</button> |
489 | 489 | ||
490 | <?php | 490 | <?php |
491 | if($_w3c_validate && $validation){ | 491 | if($_w3c_validate && $validation){ |
492 | ?> | 492 | ?> |
493 | 493 | ||
494 | <button type="button" title="HTML 4.01 W3C online validation" style="float: right;" onclick="javascript: sndValidn('text', 'html401'); return false;" onkeypress="javascript: sndValidn('text', 'html401'); return false;">Check HTML</button> | 494 | <button type="button" title="HTML 4.01 W3C online validation" style="float: right;" onclick="javascript: sndValidn('text', 'html401'); return false;" onkeypress="javascript: sndValidn('text', 'html401'); return false;">Check HTML</button> |
495 | <button type="button" title="XHTML 1.1 W3C online validation" style="float: right;" onclick="javascript: sndValidn('text', 'xhtml110'); return false;" onkeypress="javascript: sndValidn('text', 'xhtml110'); return false;">Check XHTML</button> | 495 | <button type="button" title="XHTML 1.1 W3C online validation" style="float: right;" onclick="javascript: sndValidn('text', 'xhtml110'); return false;" onkeypress="javascript: sndValidn('text', 'xhtml110'); return false;">Check XHTML</button> |
496 | 496 | ||
497 | <?php | 497 | <?php |
498 | } | 498 | } |
499 | } | 499 | } |
500 | else{ | 500 | else{ |
501 | if($_w3c_validate){ | 501 | if($_w3c_validate){ |
502 | echo '<span style="float: right;" class="help" title="for direct submission of input or output code to W3C validator for (X)HTML validation"><span style="font-size: 85%;"> Validator tools: </span><input type="checkbox" value="1" name="w3c_validate" id="w3c_validate" style="vertical-align: middle;"', ($validation ? ' checked="checked"' : ''), ' /></span>'; | 502 | echo '<span style="float: right;" class="help" title="for direct submission of input or output code to W3C validator for (X)HTML validation"><span style="font-size: 85%;"> Validator tools: </span><input type="checkbox" value="1" name="w3c_validate" id="w3c_validate" style="vertical-align: middle;"', ($validation ? ' checked="checked"' : ''), ' /></span>'; |
503 | } | 503 | } |
504 | } | 504 | } |
505 | ?> | 505 | ?> |
506 | 506 | ||
507 | <span style="float:right;" class="help" title="IANA-recognized name of the input character-set; can be multiple ;- or space-separated values; may not work in some browsers"><span style="font-size: 85%;">Encoding: </span><input type="text" size="8" id="enc" name="enc" style="vertical-align: middle;" value="<?php echo htmlspecialchars($_POST['enc']); ?>" /></span> | 507 | <span style="float:right;" class="help" title="IANA-recognized name of the input character-set; can be multiple ;- or space-separated values; may not work in some browsers"><span style="font-size: 85%;">Encoding: </span><input type="text" size="8" id="enc" name="enc" style="vertical-align: middle;" value="<?php echo htmlspecialchars($_POST['enc']); ?>" /></span> |
508 | 508 | ||
509 | </div> | 509 | </div> |
510 | <br style="clear:both;" /> | 510 | <br style="clear:both;" /> |
511 | 511 | ||
512 | <?php | 512 | <?php |
513 | if($limit_exceeded){ | 513 | if($limit_exceeded){ |
514 | echo '<br /><strong>Input text is too long!</strong><br />'; | 514 | echo '<br /><strong>Input text is too long!</strong><br />'; |
515 | } | 515 | } |
516 | ?> | 516 | ?> |
517 | 517 | ||
518 | <br /> | 518 | <br /> |
519 | 519 | ||
520 | <a href="htmLawedTest.php" title="[toggle visibility] htmLawed configuration" onclick="javascript:toggle('inputC'); return false;"><span class="notice">Settings »</span></a> | 520 | <a href="htmLawedTest.php" title="[toggle visibility] htmLawed configuration" onclick="javascript:toggle('inputC'); return false;"><span class="notice">Settings »</span></a> |
521 | 521 | ||
522 | <div id="inputC" style="display: none;"> | 522 | <div id="inputC" style="display: none;"> |
523 | <table summary="none"> | 523 | <table summary="none"> |
524 | <tr> | 524 | <tr> |
525 | <td><span class="help" title="$config argument">Config:</span></td> | 525 | <td><span class="help" title="$config argument">Config:</span></td> |
526 | <td><ul> | 526 | <td><ul> |
527 | 527 | ||
528 | <?php | 528 | <?php |
529 | $cfg = array( | 529 | $cfg = array( |
530 | 'abs_url'=>array('3', '0', 'absolute/relative URL conversion', '-1'), | 530 | 'abs_url'=>array('3', '0', 'absolute/relative URL conversion', '-1'), |
531 | 'and_mark'=>array('2', '0', 'mark original <em>&</em> chars', '0', 'd'=>1), // 'd' to disable | 531 | 'and_mark'=>array('2', '0', 'mark original <em>&</em> chars', '0', 'd'=>1), // 'd' to disable |
532 | 'anti_link_spam'=>array('1', '0', 'modify <em>href</em> values as an anti-link spam measure', '0', array(array('30', '1', '', 'regex for extra <em>rel</em>'), array('30', '2', '', 'regex for no <em>href</em>'))), | 532 | 'anti_link_spam'=>array('1', '0', 'modify <em>href</em> values as an anti-link spam measure', '0', array(array('30', '1', '', 'regex for extra <em>rel</em>'), array('30', '2', '', 'regex for no <em>href</em>'))), |
533 | 'anti_mail_spam'=>array('1', '0', 'replace <em>@</em> in <em>mailto:</em> URLs', '0', '8', 'NO@SPAM', 'replacement'), | 533 | 'anti_mail_spam'=>array('1', '0', 'replace <em>@</em> in <em>mailto:</em> URLs', '0', '8', 'NO@SPAM', 'replacement'), |
534 | 'balance'=>array('2', '1', 'fix nestings and balance tags', '0'), | 534 | 'balance'=>array('2', '1', 'fix nestings and balance tags', '0'), |
535 | 'base_url'=>array('', '', 'base URL', '25'), | 535 | 'base_url'=>array('', '', 'base URL', '25'), |
536 | 'cdata'=>array('4', 'nil', 'allow <em>CDATA</em> sections', 'nil'), | 536 | 'cdata'=>array('4', 'nil', 'allow <em>CDATA</em> sections', 'nil'), |
537 | 'clean_ms_char'=>array('3', '0', 'replace bad characters introduced by Microsoft apps. like <em>Word</em>', '0'), | 537 | 'clean_ms_char'=>array('3', '0', 'replace bad characters introduced by Microsoft apps. like <em>Word</em>', '0'), |
538 | 'comment'=>array('4', 'nil', 'allow HTML comments', 'nil'), | 538 | 'comment'=>array('4', 'nil', 'allow HTML comments', 'nil'), |
539 | 'css_expression'=>array('2', 'nil', 'allow dynamic expressions in CSS style properties', 'nil'), | 539 | 'css_expression'=>array('2', 'nil', 'allow dynamic expressions in CSS style properties', 'nil'), |
540 | 'deny_attribute'=>array('1', '0', 'denied attributes', '0', '50', '', 'these'), | 540 | 'deny_attribute'=>array('1', '0', 'denied attributes', '0', '50', '', 'these'), |
541 | 'direct_list_nest'=>array('2', 'nil', 'allow direct nesting of a list within another without requiring it to be a list item', 'nil'), | 541 | 'direct_list_nest'=>array('2', 'nil', 'allow direct nesting of a list within another without requiring it to be a list item', 'nil'), |
542 | 'elements'=>array('', '', 'allowed elements', '50'), | 542 | 'elements'=>array('', '', 'allowed elements', '50'), |
543 | 'hexdec_entity'=>array('3', '1', 'convert hexadecimal numeric entities to decimal ones, or vice versa', '0'), | 543 | 'hexdec_entity'=>array('3', '1', 'convert hexadecimal numeric entities to decimal ones, or vice versa', '0'), |
544 | 'hook'=>array('', '', 'name of hook function', '25'), | 544 | 'hook'=>array('', '', 'name of hook function', '25'), |
545 | 'hook_tag'=>array('', '', 'name of custom function to further check attribute values', '25'), | 545 | 'hook_tag'=>array('', '', 'name of custom function to further check attribute values', '25'), |
546 | 'keep_bad'=>array('7', '6', 'keep, or remove <em>bad</em> tag content', '0'), | 546 | 'keep_bad'=>array('7', '6', 'keep, or remove <em>bad</em> tag content', '0'), |
547 | 'lc_std_val'=>array('2', '1', 'lower-case std. attribute values like <em>radio</em>', '0'), | 547 | 'lc_std_val'=>array('2', '1', 'lower-case std. attribute values like <em>radio</em>', '0'), |
548 | 'make_tag_strict'=>array('3', 'nil', 'transform deprecated elements', 'nil'), | 548 | 'make_tag_strict'=>array('3', 'nil', 'transform deprecated elements', 'nil'), |
549 | 'named_entity'=>array('2', '1', 'allow named entities, or convert numeric ones', '0'), | 549 | 'named_entity'=>array('2', '1', 'allow named entities, or convert numeric ones', '0'), |
550 | 'no_deprecated_attr'=>array('3', '1', 'allow deprecated attributes, or transform them', '0'), | 550 | 'no_deprecated_attr'=>array('3', '1', 'allow deprecated attributes, or transform them', '0'), |
551 | 'parent'=>array('', 'div', 'name of parent element', '25'), | 551 | 'parent'=>array('', 'div', 'name of parent element', '25'), |
552 | 'safe'=>array('2', '0', 'for most <em>safe</em> HTML', '0'), | 552 | 'safe'=>array('2', '0', 'for most <em>safe</em> HTML', '0'), |
553 | 'schemes'=>array('', 'href: aim, app, feed, file, ftp, gopher, http, https, irc, javascript, mailto, news, nntp, sftp, ssh, telnet, tel; *:data, file, http, https, javascript', 'allowed URL protocols', '50'), | 553 | 'schemes'=>array('', 'href: aim, app, feed, file, ftp, gopher, http, https, irc, javascript, mailto, news, nntp, sftp, ssh, telnet, tel; *:data, file, http, https, javascript', 'allowed URL protocols', '50'), |
554 | 'show_setting'=>array('', 'htmLawed_setting', 'variable name to record <em>finalized</em> htmLawed settings', '25', 'd'=>1), | 554 | 'show_setting'=>array('', 'htmLawed_setting', 'variable name to record <em>finalized</em> htmLawed settings', '25', 'd'=>1), |
555 | 'style_pass'=>array('2', 'nil', 'do not look at <em>style</em> attribute values', 'nil'), | 555 | 'style_pass'=>array('2', 'nil', 'do not look at <em>style</em> attribute values', 'nil'), |
556 | 'tidy'=>array('3', '0', 'beautify/compact', '-1', '8', '1t1', 'format'), | 556 | 'tidy'=>array('3', '0', 'beautify/compact', '-1', '8', '1t1', 'format'), |
557 | 'unique_ids'=>array('2', '1', 'unique <em>id</em> values', '0', '8', 'my_', 'prefix'), | 557 | 'unique_ids'=>array('2', '1', 'unique <em>id</em> values', '0', '8', 'my_', 'prefix'), |
558 | 'valid_xhtml'=>array('2', 'nil', 'auto-set various parameters for most valid XHTML', 'nil'), | 558 | 'valid_xhtml'=>array('2', 'nil', 'auto-set various parameters for most valid XHTML', 'nil'), |
559 | 'xml:lang'=>array('3', 'nil', 'auto-add <em>xml:lang</em> attribute', '0'), | 559 | 'xml:lang'=>array('3', 'nil', 'auto-add <em>xml:lang</em> attribute', '0'), |
560 | ); | 560 | ); |
561 | foreach($cfg as $k=>$v){ | 561 | foreach($cfg as $k=>$v){ |
562 | echo '<li>', $k, ': '; | 562 | echo '<li>', $k, ': '; |
563 | if(!empty($v[0])){ // input radio | 563 | if(!empty($v[0])){ // input radio |
564 | $j = $v[3]; | 564 | $j = $v[3]; |
565 | for($i = $j-1; ++$i < $v[0]+$v[3];++$j){ | 565 | for($i = $j-1; ++$i < $v[0]+$v[3];++$j){ |
566 | echo '<input type="radio" name="h', $k, '" value="', $i, '"', (!isset($_POST['h'. $k]) ? ($v[1] == $i ? ' checked="checked"' : '') : ($_POST['h'. $k] == $i ? ' checked="checked"' : '')), (isset($v['d']) ? ' disabled="disabled"' : ''), ' />', $i, ' '; | 566 | echo '<input type="radio" name="h', $k, '" value="', $i, '"', (!isset($_POST['h'. $k]) ? ($v[1] == $i ? ' checked="checked"' : '') : ($_POST['h'. $k] == $i ? ' checked="checked"' : '')), (isset($v['d']) ? ' disabled="disabled"' : ''), ' />', $i, ' '; |
567 | } | 567 | } |
568 | if($v[1] == 'nil'){ | 568 | if($v[1] == 'nil'){ |
569 | echo '<input type="radio" name="h', $k, '" value="nil"', ((!isset($_POST['h'. $k]) or $_POST['h'. $k] == 'nil') ? ' checked="checked"' : ''), (isset($v['d']) ? ' disabled="disabled"' : ''), ' />not set '; | 569 | echo '<input type="radio" name="h', $k, '" value="nil"', ((!isset($_POST['h'. $k]) or $_POST['h'. $k] == 'nil') ? ' checked="checked"' : ''), (isset($v['d']) ? ' disabled="disabled"' : ''), ' />not set '; |
570 | } | 570 | } |
571 | if(!empty($v[4])){ // + input text box | 571 | if(!empty($v[4])){ // + input text box |
572 | echo '<input type="radio" name="h', $k, '" value="', $j, '"', (((isset($_POST['h'. $k]) && $_POST['h'. $k] == $j) or (!isset($_POST['h'. $k]) && $j == $v[1])) ? ' checked="checked"' : ''), (isset($v['d']) ? ' disabled="disabled"' : ''), ' />'; | 572 | echo '<input type="radio" name="h', $k, '" value="', $j, '"', (((isset($_POST['h'. $k]) && $_POST['h'. $k] == $j) or (!isset($_POST['h'. $k]) && $j == $v[1])) ? ' checked="checked"' : ''), (isset($v['d']) ? ' disabled="disabled"' : ''), ' />'; |
573 | if(!is_array($v[4])){ | 573 | if(!is_array($v[4])){ |
574 | echo $v[6], ': <input type="text" size="', $v[4], '" name="h', $k. $j, '" value="', htmlspecialchars(isset($_POST['h'. $k. $j][0]) ? $_POST['h'. $k. $j] : $v[5]), '"', (isset($v['d']) ? ' disabled="disabled"' : ''), ' />'; | 574 | echo $v[6], ': <input type="text" size="', $v[4], '" name="h', $k. $j, '" value="', htmlspecialchars(isset($_POST['h'. $k. $j][0]) ? $_POST['h'. $k. $j] : $v[5]), '"', (isset($v['d']) ? ' disabled="disabled"' : ''), ' />'; |
575 | } | 575 | } |
576 | else{ | 576 | else{ |
577 | foreach($v[4] as $z){ | 577 | foreach($v[4] as $z){ |
578 | echo ' ', $z[3], ': <input type="text" size="', $z[0], '" name="h', $k. $j. $z[1], '" value="', htmlspecialchars(isset($_POST['h'. $k. $j. $z[1]][0]) ? $_POST['h'. $k. $j. $z[1]] : $z[2]), '"', (isset($v['d']) ? ' disabled="disabled"' : ''), ' />'; | 578 | echo ' ', $z[3], ': <input type="text" size="', $z[0], '" name="h', $k. $j. $z[1], '" value="', htmlspecialchars(isset($_POST['h'. $k. $j. $z[1]][0]) ? $_POST['h'. $k. $j. $z[1]] : $z[2]), '"', (isset($v['d']) ? ' disabled="disabled"' : ''), ' />'; |
579 | } | 579 | } |
580 | } | 580 | } |
581 | } | 581 | } |
582 | } | 582 | } |
583 | elseif(ctype_digit($v[3])){ // input text | 583 | elseif(ctype_digit($v[3])){ // input text |
584 | echo '<input type="text" size="', $v[3], '" name="h', $k, '" value="', htmlspecialchars(isset($_POST['h'. $k][0]) ? $_POST['h'. $k] : $v[1]), '"', (isset($v['d']) ? ' disabled="disabled"' : ''), ' />'; | 584 | echo '<input type="text" size="', $v[3], '" name="h', $k, '" value="', htmlspecialchars(isset($_POST['h'. $k][0]) ? $_POST['h'. $k] : $v[1]), '"', (isset($v['d']) ? ' disabled="disabled"' : ''), ' />'; |
585 | } | 585 | } |
586 | else{} // text-area | 586 | else{} // text-area |
587 | echo ' <span class="help">', $v[2], '</span></li>'; | 587 | echo ' <span class="help">', $v[2], '</span></li>'; |
588 | } | 588 | } |
589 | echo '</ul></td></tr><tr><td><span style="vertical-align: top;" class="help" title="$spec argument: element-specific attribute rules">Spec:</span></td><td><textarea name="spec" id="spec" cols="70" rows="3" style="width:80%;">', htmlspecialchars((isset($_POST['spec']) ? $_POST['spec'] : '')), '</textarea></td></tr></table>'; | 589 | echo '</ul></td></tr><tr><td><span style="vertical-align: top;" class="help" title="$spec argument: element-specific attribute rules">Spec:</span></td><td><textarea name="spec" id="spec" cols="70" rows="3" style="width:80%;">', htmlspecialchars((isset($_POST['spec']) ? $_POST['spec'] : '')), '</textarea></td></tr></table>'; |
590 | ?> | 590 | ?> |
591 | 591 | ||
592 | </div> | 592 | </div> |
593 | </form> | 593 | </form> |
594 | 594 | ||
595 | <?php | 595 | <?php |
596 | if($do){ | 596 | if($do){ |
597 | $cfg = array(); | 597 | $cfg = array(); |
598 | foreach($_POST as $k=>$v){ | 598 | foreach($_POST as $k=>$v){ |
599 | if($k[0] == 'h' && $v != 'nil'){ | 599 | if($k[0] == 'h' && $v != 'nil'){ |
600 | $cfg[substr($k, 1)] = $v; | 600 | $cfg[substr($k, 1)] = $v; |
601 | } | 601 | } |
602 | } | 602 | } |
603 | 603 | ||
604 | if(isset($cfg['anti_link_spam']) && $cfg['anti_link_spam'] && (!empty($cfg['anti_link_spam11']) or !empty($cfg['anti_link_spam12']))){ | 604 | if(isset($cfg['anti_link_spam']) && $cfg['anti_link_spam'] && (!empty($cfg['anti_link_spam11']) or !empty($cfg['anti_link_spam12']))){ |
605 | $cfg['anti_link_spam'] = array($cfg['anti_link_spam11'], $cfg['anti_link_spam12']); | 605 | $cfg['anti_link_spam'] = array($cfg['anti_link_spam11'], $cfg['anti_link_spam12']); |
606 | } | 606 | } |
607 | unset($cfg['anti_link_spam11'], $cfg['anti_link_spam12']); | 607 | unset($cfg['anti_link_spam11'], $cfg['anti_link_spam12']); |
608 | if(isset($cfg['anti_mail_spam']) && $cfg['anti_mail_spam'] == 1){ | 608 | if(isset($cfg['anti_mail_spam']) && $cfg['anti_mail_spam'] == 1){ |
609 | $cfg['anti_mail_spam'] = isset($cfg['anti_mail_spam1'][0]) ? $cfg['anti_mail_spam1'] : 0; | 609 | $cfg['anti_mail_spam'] = isset($cfg['anti_mail_spam1'][0]) ? $cfg['anti_mail_spam1'] : 0; |
610 | } | 610 | } |
611 | unset($cfg['anti_mail_spam11']); | 611 | unset($cfg['anti_mail_spam11']); |
612 | if(isset($cfg['deny_attribute']) && $cfg['deny_attribute'] == 1){ | 612 | if(isset($cfg['deny_attribute']) && $cfg['deny_attribute'] == 1){ |
613 | $cfg['deny_attribute'] = isset($cfg['deny_attribute1'][0]) ? $cfg['deny_attribute1'] : 0; | 613 | $cfg['deny_attribute'] = isset($cfg['deny_attribute1'][0]) ? $cfg['deny_attribute1'] : 0; |
614 | } | 614 | } |
615 | unset($cfg['deny_attribute1']); | 615 | unset($cfg['deny_attribute1']); |
616 | if(isset($cfg['tidy']) && $cfg['tidy'] == 2){ | 616 | if(isset($cfg['tidy']) && $cfg['tidy'] == 2){ |
617 | $cfg['tidy'] = isset($cfg['tidy2'][0]) ? $cfg['tidy2'] : 0; | 617 | $cfg['tidy'] = isset($cfg['tidy2'][0]) ? $cfg['tidy2'] : 0; |
618 | } | 618 | } |
619 | unset($cfg['tidy2']); | 619 | unset($cfg['tidy2']); |
620 | if(isset($cfg['unique_ids']) && $cfg['unique_ids'] == 2){ | 620 | if(isset($cfg['unique_ids']) && $cfg['unique_ids'] == 2){ |
621 | $cfg['unique_ids'] = isset($cfg['unique_ids2'][0]) ? $cfg['unique_ids2'] : 1; | 621 | $cfg['unique_ids'] = isset($cfg['unique_ids2'][0]) ? $cfg['unique_ids2'] : 1; |
622 | } | 622 | } |
623 | unset($cfg['unique_ids2']); | 623 | unset($cfg['unique_ids2']); |
624 | unset($cfg['and_mark']); // disabling and_mark | 624 | unset($cfg['and_mark']); // disabling and_mark |
625 | 625 | ||
626 | $cfg['show_setting'] = 'hlcfg'; | 626 | $cfg['show_setting'] = 'hlcfg'; |
627 | $st = microtime(); | 627 | $st = microtime(); |
628 | $out = htmLawed($_POST['text'], $cfg, $_POST['spec']); | 628 | $out = htmLawed($_POST['text'], $cfg, $_POST['spec']); |
629 | $et = microtime(); | 629 | $et = microtime(); |
630 | echo '<br /><a href="htmLawedTest.php" title="[toggle visibility] syntax-highlighted" onclick="javascript:toggle(\'inputR\'); return false;"><span class="notice">Input code »</span></a> <span class="help" title="tags estimated as half of total > and < chars; values may be inaccurate for non-ASCII text"><small><big>', strlen($_POST['text']), '</big> chars, ~<big>', ($tag = round((substr_count($_POST['text'], '>') + substr_count($_POST['text'], '<'))/2)), '</big> tag', ($tag > 1 ? 's' : ''), '</small> </span><div id="inputR" style="display: none;">', format($_POST['text']), '</div><script type="text/javascript">hl(\'inputR\');</script>', (!isset($_POST['text'][$_hlimit]) ? ' <a href="htmLawedTest.php" title="[toggle visibility] hexdump; non-viewable characters like line-returns are shown as dots" onclick="javascript:toggle(\'inputD\'); return false;"><span class="notice">Input binary » </span></a><div id="inputD" style="display: none;">'. hexdump($_POST['text']). '</div>' : ''), ' <a href="htmLawedTest.php" title="[toggle visibility] finalized internal settings as interpreted by htmLawed; for developers" onclick="javascript:toggle(\'settingF\'); return false;"><span class="notice">Finalized internal settings » </span></a> <div id="settingF" style="display: none;">$config: ', str_replace(array(' ', "\t", ' '), array(' ', ' ', ' '), nl2br(htmlspecialchars(print_r($GLOBALS['hlcfg']['config'], true)))), '<br />$spec: ', str_replace(array(' ', "\t", ' '), array(' ', ' ', ' '), nl2br(htmlspecialchars(print_r($GLOBALS['hlcfg']['spec'], true)))), '</div><script type="text/javascript">hl(\'settingF\');</script>', '<br /><a href="htmLawedTest.php" title="[toggle visibility] suitable for copy-paste" onclick="javascript:toggle(\'outputF\'); return false;"><span class="notice">Output »</span></a> <span class="help" title="approx., server-specific value excluding the \'include()\' call"><small>htmLawed processing time <big>', number_format(((substr($et,0,9)) + (substr($et,-10)) - (substr($st,0,9)) - (substr($st,-10))),4), '</big> s</small></span>', (($mem = memory_get_peak_usage()) !== false ? '<span class="help"><small>, peak memory usage <big>'. round(($mem-$pre_mem)/1048576, 2). '</big> <small>MB</small>' : ''), '</small></span><div id="outputF" style="display: block;"><div><textarea id="text2" class="textarea" name="text2" rows="5" cols="100" style="width: 100%;">', htmlspecialchars($out), '</textarea></div><button type="button" title="Filtered input rendered as web-page without a doctype or charset declaration" style="float: right;" onclick="javascript: sndProc2(); return false;" onkeypress="javascript: sndProc2(); return false;">Render in webpage</button><button type="button" onclick="javascript:document.getElementById(\'text2\').focus();document.getElementById(\'text2\').select()" title="select all to copy" style="float:right;">Select all</button>'; | 630 | echo '<br /><a href="htmLawedTest.php" title="[toggle visibility] syntax-highlighted" onclick="javascript:toggle(\'inputR\'); return false;"><span class="notice">Input code »</span></a> <span class="help" title="tags estimated as half of total > and < chars; values may be inaccurate for non-ASCII text"><small><big>', strlen($_POST['text']), '</big> chars, ~<big>', ($tag = round((substr_count($_POST['text'], '>') + substr_count($_POST['text'], '<'))/2)), '</big> tag', ($tag > 1 ? 's' : ''), '</small> </span><div id="inputR" style="display: none;">', format($_POST['text']), '</div><script type="text/javascript">hl(\'inputR\');</script>', (!isset($_POST['text'][$_hlimit]) ? ' <a href="htmLawedTest.php" title="[toggle visibility] hexdump; non-viewable characters like line-returns are shown as dots" onclick="javascript:toggle(\'inputD\'); return false;"><span class="notice">Input binary » </span></a><div id="inputD" style="display: none;">'. hexdump($_POST['text']). '</div>' : ''), ' <a href="htmLawedTest.php" title="[toggle visibility] finalized internal settings as interpreted by htmLawed; for developers" onclick="javascript:toggle(\'settingF\'); return false;"><span class="notice">Finalized internal settings » </span></a> <div id="settingF" style="display: none;">$config: ', str_replace(array(' ', "\t", ' '), array(' ', ' ', ' '), nl2br(htmlspecialchars(print_r($GLOBALS['hlcfg']['config'], true)))), '<br />$spec: ', str_replace(array(' ', "\t", ' '), array(' ', ' ', ' '), nl2br(htmlspecialchars(print_r($GLOBALS['hlcfg']['spec'], true)))), '</div><script type="text/javascript">hl(\'settingF\');</script>', '<br /><a href="htmLawedTest.php" title="[toggle visibility] suitable for copy-paste" onclick="javascript:toggle(\'outputF\'); return false;"><span class="notice">Output »</span></a> <span class="help" title="approx., server-specific value excluding the \'include()\' call"><small>htmLawed processing time <big>', number_format(((substr($et,0,9)) + (substr($et,-10)) - (substr($st,0,9)) - (substr($st,-10))),4), '</big> s</small></span>', (($mem = memory_get_peak_usage()) !== false ? '<span class="help"><small>, peak memory usage <big>'. round(($mem-$pre_mem)/1048576, 2). '</big> <small>MB</small>' : ''), '</small></span><div id="outputF" style="display: block;"><div><textarea id="text2" class="textarea" name="text2" rows="5" cols="100" style="width: 100%;">', htmlspecialchars($out), '</textarea></div><button type="button" title="Filtered input rendered as web-page without a doctype or charset declaration" style="float: right;" onclick="javascript: sndProc2(); return false;" onkeypress="javascript: sndProc2(); return false;">Render in webpage</button><button type="button" onclick="javascript:document.getElementById(\'text2\').focus();document.getElementById(\'text2\').select()" title="select all to copy" style="float:right;">Select all</button>'; |
631 | if($_w3c_validate && $validation) | 631 | if($_w3c_validate && $validation) |
632 | { | 632 | { |
633 | ?> | 633 | ?> |
634 | 634 | ||
635 | <button type="button" title="HTML 4.01 W3C online validation" style="float: right;" onclick="javascript: sndValidn('text2', 'html401'); return false;" onkeypress="javascript: sndValidn('text2', 'html401'); return false;">Check HTML</button> | 635 | <button type="button" title="HTML 4.01 W3C online validation" style="float: right;" onclick="javascript: sndValidn('text2', 'html401'); return false;" onkeypress="javascript: sndValidn('text2', 'html401'); return false;">Check HTML</button> |
636 | <button type="button" title="XHTML 1.1 W3C online validation" style="float: right;" onclick="javascript: sndValidn('text2', 'xhtml110'); return false;" onkeypress="javascript: sndValidn('text2', 'xhtml110'); return false;">Check XHTML</button> | 636 | <button type="button" title="XHTML 1.1 W3C online validation" style="float: right;" onclick="javascript: sndValidn('text2', 'xhtml110'); return false;" onkeypress="javascript: sndValidn('text2', 'xhtml110'); return false;">Check XHTML</button> |
637 | 637 | ||
638 | <?php | 638 | <?php |
639 | } | 639 | } |
640 | echo '</div><br /><a href="htmLawedTest.php" title="[toggle visibility] syntax-highlighted" onclick="javascript:toggle(\'outputR\'); return false;"><span class="notice">Output code »</span></a><div id="outputR" style="display: block;">', format($out), '</div><script type="text/javascript">hl(\'outputR\');</script>', (!isset($_POST['text'][$_hlimit]) ? ' <a href="htmLawedTest.php" title="[toggle visibility] hexdump; non-viewable characters like line-returns are shown as dots" onclick="javascript:toggle(\'outputD\'); return false;"><span class="notice">Output binary »</span></a><div id="outputD" style="display: none;">'. hexdump($out). '</div>' : ''), ' <a href="htmLawedTest.php" title="[toggle visibility] inline output-input diff; might not be perfectly accurate, semantically or otherwise " onclick="javascript:toggle(\'diff\'); diffLaunch(); return false;"><span class="notice">Diff »</span></a> <div id="diff" style="display: none;"></div><br /><a href="htmLawedTest.php" title="[toggle visibility] XHTML 1 Transitional doctype" onclick="javascript:toggle(\'outputH\'); return false;">'; | 640 | echo '</div><br /><a href="htmLawedTest.php" title="[toggle visibility] syntax-highlighted" onclick="javascript:toggle(\'outputR\'); return false;"><span class="notice">Output code »</span></a><div id="outputR" style="display: block;">', format($out), '</div><script type="text/javascript">hl(\'outputR\');</script>', (!isset($_POST['text'][$_hlimit]) ? ' <a href="htmLawedTest.php" title="[toggle visibility] hexdump; non-viewable characters like line-returns are shown as dots" onclick="javascript:toggle(\'outputD\'); return false;"><span class="notice">Output binary »</span></a><div id="outputD" style="display: none;">'. hexdump($out). '</div>' : ''), ' <a href="htmLawedTest.php" title="[toggle visibility] inline output-input diff; might not be perfectly accurate, semantically or otherwise " onclick="javascript:toggle(\'diff\'); diffLaunch(); return false;"><span class="notice">Diff »</span></a> <div id="diff" style="display: none;"></div><br /><a href="htmLawedTest.php" title="[toggle visibility] XHTML 1 Transitional doctype" onclick="javascript:toggle(\'outputH\'); return false;">'; |
641 | } | 641 | } |
642 | else{ | 642 | else{ |
643 | ?> | 643 | ?> |
644 | 644 | ||
645 | <br /> | 645 | <br /> |
646 | 646 | ||
647 | <div class="help">Use with a Javascript- and cookie-enabled, relatively new version of a common browser. | 647 | <div class="help">Use with a Javascript- and cookie-enabled, relatively new version of a common browser. |
648 | 648 | ||
649 | <?php echo (file_exists('./htmLawed_TESTCASE.txt') ? '<br /><br />You can use text from <a href="htmLawed_TESTCASE.txt"><span class="notice">this collection of test-cases</span></a> in the input. Set the character encoding of the browser to Unicode/utf-8 before copying.' : ''); ?> | 649 | <?php echo (file_exists('./htmLawed_TESTCASE.txt') ? '<br /><br />You can use text from <a href="htmLawed_TESTCASE.txt"><span class="notice">this collection of test-cases</span></a> in the input. Set the character encoding of the browser to Unicode/utf-8 before copying.' : ''); ?> |
650 | 650 | ||
651 | <br /><br />For anti-XSS tests, try the <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/htmLawedSafeModeTest.php"><span class="notice">special test-page</span></a> or see <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/rsnake/RSnakeXSSTest.htm"><span class="notice">these results</span></a>. | 651 | <br /><br />For anti-XSS tests, try the <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/htmLawedSafeModeTest.php"><span class="notice">special test-page</span></a> or see <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/rsnake/RSnakeXSSTest.htm"><span class="notice">these results</span></a>. |
652 | 652 | ||
653 | <br /><br /><small>Change <em>Encoding</em> to reflect the character encoding of the input text. Even then, it may not work or some characters may not display properly because of variable browser support and because of the form interface. Developers can write some PHP code to capture the filtered input to a file if this is important. | 653 | <br /><br /><small>Change <em>Encoding</em> to reflect the character encoding of the input text. Even then, it may not work or some characters may not display properly because of variable browser support and because of the form interface. Developers can write some PHP code to capture the filtered input to a file if this is important. |
654 | <br /><br />Refer to the htmLawed documentation (<a href="htmLawed_README.htm"><span class="notice">htm</span></a>/<a href="htmLawed_README.txt"><span class="notice">txt</span></a>) for details about <em>Settings</em>, and htmLawed's behavior and limitations. For <em>Settings</em>, incorrectly-specified values like regular expressions are silently ignored. One or more settings form-fields may have been disabled. Some characters are not allowed in the <em>Spec</em> field. | 654 | <br /><br />Refer to the htmLawed documentation (<a href="htmLawed_README.htm"><span class="notice">htm</span></a>/<a href="htmLawed_README.txt"><span class="notice">txt</span></a>) for details about <em>Settings</em>, and htmLawed's behavior and limitations. For <em>Settings</em>, incorrectly-specified values like regular expressions are silently ignored. One or more settings form-fields may have been disabled. Some characters are not allowed in the <em>Spec</em> field. |
655 | 655 | ||
656 | 656 | ||
657 | <br /><br />Hovering the mouse over some of the text can provide additional information in some browsers.</small> | 657 | <br /><br />Hovering the mouse over some of the text can provide additional information in some browsers.</small> |
658 | 658 | ||
659 | <?php | 659 | <?php |
660 | if($_w3c_validate){ | 660 | if($_w3c_validate){ |
661 | ?> | 661 | ?> |
662 | 662 | ||
663 | <small><br /><br />Because of character-encoding issues, the W3C validator (anyway not perfect) may reject validation requests or invalidate otherwise-valid code, esp. if text was copy-pasted in the input box. Local applications like the <em>HTML Validator</em> Firefox browser add-on may be useful in such cases.</small> | 663 | <small><br /><br />Because of character-encoding issues, the W3C validator (anyway not perfect) may reject validation requests or invalidate otherwise-valid code, esp. if text was copy-pasted in the input box. Local applications like the <em>HTML Validator</em> Firefox browser add-on may be useful in such cases.</small> |
664 | 664 | ||
665 | <?php | 665 | <?php |
666 | } | 666 | } |
667 | ?> | 667 | ?> |
668 | 668 | ||
669 | </div> | 669 | </div> |
670 | 670 | ||
671 | <?php | 671 | <?php |
672 | } | 672 | } |
673 | ?> | 673 | ?> |
674 | 674 | ||
675 | </div> | 675 | </div> |
676 | </body> | 676 | </body> |
677 | </html> | 677 | </html> |
diff --git a/lib/htmlawed/htmLawed_README.htm b/lib/htmlawed/htmLawed_README.htm index 42e4860..a63513b 100644 --- a/lib/htmlawed/htmLawed_README.htm +++ b/lib/htmlawed/htmLawed_README.htm | |||
@@ -1,2289 +1,2289 @@ | |||
1 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | 1 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
2 | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> | 2 | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> |
3 | <head> | 3 | <head> |
4 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | 4 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
5 | <meta http-equiv="Content-Language" content="en" /> | 5 | <meta http-equiv="Content-Language" content="en" /> |
6 | <meta name="description" content="htmLawed PHP software is a free, open-source, customizable HTML input purifier and filter - htmLawed_README.txt - presented with rTxt2htm, a PHP Labware utility" /> | 6 | <meta name="description" content="htmLawed PHP software is a free, open-source, customizable HTML input purifier and filter - htmLawed_README.txt - presented with rTxt2htm, a PHP Labware utility" /> |
7 | <meta name="keywords" content="htmLawed, HTM, HTML, HTML5, HTML 5, XHTML, XHTML5, HTML Tidy, converter, filter, formatter, purifier, sanitizer, XSS, input, PHP, software, code, script, security, cross-site scripting, hack, sanitize, remove, standards, tags, attributes, elements, Aria, Ruby, data attributes, tidy, indent, auto-indent, prettify, pretty print, htmLawed_README.txt, rTxt2htm, PHP Labware" /> | 7 | <meta name="keywords" content="htmLawed, HTM, HTML, HTML5, HTML 5, XHTML, XHTML5, HTML Tidy, converter, filter, formatter, purifier, sanitizer, XSS, input, PHP, software, code, script, security, cross-site scripting, hack, sanitize, remove, standards, tags, attributes, elements, Aria, Ruby, data attributes, tidy, indent, auto-indent, prettify, pretty print, htmLawed_README.txt, rTxt2htm, PHP Labware" /> |
8 | <style type="text/css" media="all"> | 8 | <style type="text/css" media="all"> |
9 | <!--/*--><![CDATA[/*><!--*/ | 9 | <!--/*--><![CDATA[/*><!--*/ |
10 | a {text-decoration:none; color: blue;} | 10 | a {text-decoration:none; color: blue;} |
11 | a:hover {color: red;} | 11 | a:hover {color: red;} |
12 | a:visited {color: blue;} | 12 | a:visited {color: blue;} |
13 | body {margin: 0; padding: 0;} | 13 | body {margin: 0; padding: 0;} |
14 | body, div, html, p {font-family: Georgia, 'Times new roman', Times;} | 14 | body, div, html, p {font-family: Georgia, 'Times new roman', Times;} |
15 | code.code {font-family: 'Bitstream vera sans mono', 'Courier New', 'Courier', monospace;} | 15 | code.code {font-family: 'Bitstream vera sans mono', 'Courier New', 'Courier', monospace;} |
16 | div.comment {padding: 5px; color: #999999; font-size: 80%;} | 16 | div.comment {padding: 5px; color: #999999; font-size: 80%;} |
17 | div.comment a {color: #6699cc;} | 17 | div.comment a {color: #6699cc;} |
18 | div#body {width: 70%; margin: 5px; padding: 5px;} /* holds non-toc content */ | 18 | div#body {width: 70%; margin: 5px; padding: 5px;} /* holds non-toc content */ |
19 | div#toc {position: fixed; top: 5px; left: 73%; z-index: 2; margin-top: 5px; margin-left: 5px; border: 1px solid gray; padding: 5px; background-color: #ededed; width: 23%; overflow: auto; max-height:94%; font-size: 90%;} /* holds content table (toc) */ | 19 | div#toc {position: fixed; top: 5px; left: 73%; z-index: 2; margin-top: 5px; margin-left: 5px; border: 1px solid gray; padding: 5px; background-color: #ededed; width: 23%; overflow: auto; max-height:94%; font-size: 90%;} /* holds content table (toc) */ |
20 | div#top {font-size: 14px; margin: 5px; padding: 5px;} /* holds all content */ | 20 | div#top {font-size: 14px; margin: 5px; padding: 5px;} /* holds all content */ |
21 | div.monospace {overflow: auto; font-family: 'Bitstream vera sans mono', 'Courier New', 'Courier', monospace;} | 21 | div.monospace {overflow: auto; font-family: 'Bitstream vera sans mono', 'Courier New', 'Courier', monospace;} |
22 | div.sub-section {padding-left: 15px;} | 22 | div.sub-section {padding-left: 15px;} |
23 | div.sub-sub-section {padding-left: 30px;} | 23 | div.sub-sub-section {padding-left: 30px;} |
24 | h1 {font-size: 22px; margin-top: 5px; margin-bottom: 5px;} | 24 | h1 {font-size: 22px; margin-top: 5px; margin-bottom: 5px;} |
25 | h2 {font-size: 20px; float: left; margin-top: 15px; margin-bottom: 5px;} | 25 | h2 {font-size: 20px; float: left; margin-top: 15px; margin-bottom: 5px;} |
26 | h3 {font-size: 18px; float: left; margin-top: 15px; margin-bottom: 5px;} | 26 | h3 {font-size: 18px; float: left; margin-top: 15px; margin-bottom: 5px;} |
27 | h4 {font-size: 16px; float: left; margin-top: 15px; margin-bottom: 5px;} | 27 | h4 {font-size: 16px; float: left; margin-top: 15px; margin-bottom: 5px;} |
28 | hr {margin-top: 15px; margin-bottom: 5px;} | 28 | hr {margin-top: 15px; margin-bottom: 5px;} |
29 | input, textarea {font-family: 'Bitstream vera sans mono', 'Courier New', 'Courier', monospace;} | 29 | input, textarea {font-family: 'Bitstream vera sans mono', 'Courier New', 'Courier', monospace;} |
30 | p.subtle {color: gray; padding: 0; padding-top: 10px; margin: 0;} | 30 | p.subtle {color: gray; padding: 0; padding-top: 10px; margin: 0;} |
31 | p.subtle a, p.subtle a:visited {color: #6699cc;} | 31 | p.subtle a, p.subtle a:visited {color: #6699cc;} |
32 | span.item-no {color: black;} | 32 | span.item-no {color: black;} |
33 | span.subtle {color: gray; margin: 0; padding:0;} | 33 | span.subtle {color: gray; margin: 0; padding:0;} |
34 | span.subtle a, span.subtle a:visited {color: #6699cc;} | 34 | span.subtle a, span.subtle a:visited {color: #6699cc;} |
35 | span.term {font-family: 'Bitstream vera sans mono', 'Courier New', 'Courier', monospace;} | 35 | span.term {font-family: 'Bitstream vera sans mono', 'Courier New', 'Courier', monospace;} |
36 | span.toc-item {color: black;} | 36 | span.toc-item {color: black;} |
37 | span.totop {float: right; margin-top: 15px; margin-bottom: 5px;} | 37 | span.totop {float: right; margin-top: 15px; margin-bottom: 5px;} |
38 | span.totop a, span.totop a:visited {color: #6699cc;} | 38 | span.totop a, span.totop a:visited {color: #6699cc;} |
39 | @media screen { /* fixes for old IE */ | 39 | @media screen { /* fixes for old IE */ |
40 | * html, * html body {overflow-y: auto!important; height: 100%; margin: 0; padding: 0;} | 40 | * html, * html body {overflow-y: auto!important; height: 100%; margin: 0; padding: 0;} |
41 | * html div#body {height: 100%; overflow-y: auto; position: relative;} | 41 | * html div#body {height: 100%; overflow-y: auto; position: relative;} |
42 | * html div#toc {position: absolute;} | 42 | * html div#toc {position: absolute;} |
43 | } | 43 | } |
44 | /*]]>*/--> | 44 | /*]]>*/--> |
45 | </style> | 45 | </style> |
46 | <title>htmLawed documentation | htmLawed PHP software is a free, open-source, customizable HTML input purifier and filter</title> | 46 | <title>htmLawed documentation | htmLawed PHP software is a free, open-source, customizable HTML input purifier and filter</title> |
47 | </head> | 47 | </head> |
48 | <body> | 48 | <body> |
49 | <div id="top"> | 49 | <div id="top"> |
50 | <h1><a id="peak" name="peak"></a>htmLawed documentation</h1> | 50 | <h1><a id="peak" name="peak"></a>htmLawed documentation</h1> |
51 | 51 | ||
52 | <div id="toc"><span class="toc-item"><a href="#s1"><span class="item-no">1</span>  About htmLawed</a></span><br /> | 52 | <div id="toc"><span class="toc-item"><a href="#s1"><span class="item-no">1</span>  About htmLawed</a></span><br /> |
53 |   <span class="toc-item"><a href="#s1.1"><span class="item-no">1.1</span>  Example uses</a></span><br /> | 53 |   <span class="toc-item"><a href="#s1.1"><span class="item-no">1.1</span>  Example uses</a></span><br /> |
54 |   <span class="toc-item"><a href="#s1.2"><span class="item-no">1.2</span>  Features</a></span><br /> | 54 |   <span class="toc-item"><a href="#s1.2"><span class="item-no">1.2</span>  Features</a></span><br /> |
55 |   <span class="toc-item"><a href="#s1.3"><span class="item-no">1.3</span>  History</a></span><br /> | 55 |   <span class="toc-item"><a href="#s1.3"><span class="item-no">1.3</span>  History</a></span><br /> |
56 |   <span class="toc-item"><a href="#s1.4"><span class="item-no">1.4</span>  License & copyright</a></span><br /> | 56 |   <span class="toc-item"><a href="#s1.4"><span class="item-no">1.4</span>  License & copyright</a></span><br /> |
57 |   <span class="toc-item"><a href="#s1.5"><span class="item-no">1.5</span>  Terms used here</a></span><br /> | 57 |   <span class="toc-item"><a href="#s1.5"><span class="item-no">1.5</span>  Terms used here</a></span><br /> |
58 |   <span class="toc-item"><a href="#s1.6"><span class="item-no">1.6</span>  Availability</a></span><br /> | 58 |   <span class="toc-item"><a href="#s1.6"><span class="item-no">1.6</span>  Availability</a></span><br /> |
59 | <span class="toc-item"><a href="#s2"><span class="item-no">2</span>  Usage</a></span><br /> | 59 | <span class="toc-item"><a href="#s2"><span class="item-no">2</span>  Usage</a></span><br /> |
60 |   <span class="toc-item"><a href="#s2.1"><span class="item-no">2.1</span>  Simple</a></span><br /> | 60 |   <span class="toc-item"><a href="#s2.1"><span class="item-no">2.1</span>  Simple</a></span><br /> |
61 |   <span class="toc-item"><a href="#s2.2"><span class="item-no">2.2</span>  Configuring htmLawed using the <span class="term">$config</span> argument</a></span><br /> | 61 |   <span class="toc-item"><a href="#s2.2"><span class="item-no">2.2</span>  Configuring htmLawed using the <span class="term">$config</span> argument</a></span><br /> |
62 |   <span class="toc-item"><a href="#s2.3"><span class="item-no">2.3</span>  Extra HTML specifications using the <span class="term">$spec</span> argument</a></span><br /> | 62 |   <span class="toc-item"><a href="#s2.3"><span class="item-no">2.3</span>  Extra HTML specifications using the <span class="term">$spec</span> argument</a></span><br /> |
63 |   <span class="toc-item"><a href="#s2.4"><span class="item-no">2.4</span>  Performance time & memory usage</a></span><br /> | 63 |   <span class="toc-item"><a href="#s2.4"><span class="item-no">2.4</span>  Performance time & memory usage</a></span><br /> |
64 |   <span class="toc-item"><a href="#s2.5"><span class="item-no">2.5</span>  Some security risks to keep in mind</a></span><br /> | 64 |   <span class="toc-item"><a href="#s2.5"><span class="item-no">2.5</span>  Some security risks to keep in mind</a></span><br /> |
65 |   <span class="toc-item"><a href="#s2.6"><span class="item-no">2.6</span>  Use with <span class="term">kses()</span> code</a></span><br /> | 65 |   <span class="toc-item"><a href="#s2.6"><span class="item-no">2.6</span>  Use with <span class="term">kses()</span> code</a></span><br /> |
66 |   <span class="toc-item"><a href="#s2.7"><span class="item-no">2.7</span>  Tolerance for ill-written HTML</a></span><br /> | 66 |   <span class="toc-item"><a href="#s2.7"><span class="item-no">2.7</span>  Tolerance for ill-written HTML</a></span><br /> |
67 |   <span class="toc-item"><a href="#s2.8"><span class="item-no">2.8</span>  Limitations & work-arounds</a></span><br /> | 67 |   <span class="toc-item"><a href="#s2.8"><span class="item-no">2.8</span>  Limitations & work-arounds</a></span><br /> |
68 |   <span class="toc-item"><a href="#s2.9"><span class="item-no">2.9</span>  Examples of usage</a></span><br /> | 68 |   <span class="toc-item"><a href="#s2.9"><span class="item-no">2.9</span>  Examples of usage</a></span><br /> |
69 | <span class="toc-item"><a href="#s3"><span class="item-no">3</span>  Details</a></span><br /> | 69 | <span class="toc-item"><a href="#s3"><span class="item-no">3</span>  Details</a></span><br /> |
70 |   <span class="toc-item"><a href="#s3.1"><span class="item-no">3.1</span>  Invalid/dangerous characters</a></span><br /> | 70 |   <span class="toc-item"><a href="#s3.1"><span class="item-no">3.1</span>  Invalid/dangerous characters</a></span><br /> |
71 |   <span class="toc-item"><a href="#s3.2"><span class="item-no">3.2</span>  Character references/entities</a></span><br /> | 71 |   <span class="toc-item"><a href="#s3.2"><span class="item-no">3.2</span>  Character references/entities</a></span><br /> |
72 |   <span class="toc-item"><a href="#s3.3"><span class="item-no">3.3</span>  HTML elements</a></span><br /> | 72 |   <span class="toc-item"><a href="#s3.3"><span class="item-no">3.3</span>  HTML elements</a></span><br /> |
73 |     <span class="toc-item"><a href="#s3.3.1"><span class="item-no">3.3.1</span>  HTML comments & <span class="term">CDATA</span> sections</a></span><br /> | 73 |     <span class="toc-item"><a href="#s3.3.1"><span class="item-no">3.3.1</span>  HTML comments & <span class="term">CDATA</span> sections</a></span><br /> |
74 |     <span class="toc-item"><a href="#s3.3.2"><span class="item-no">3.3.2</span>  Tag-transformation for better compliance with standards</a></span><br /> | 74 |     <span class="toc-item"><a href="#s3.3.2"><span class="item-no">3.3.2</span>  Tag-transformation for better compliance with standards</a></span><br /> |
75 |     <span class="toc-item"><a href="#s3.3.3"><span class="item-no">3.3.3</span>  Tag balancing & proper nesting</a></span><br /> | 75 |     <span class="toc-item"><a href="#s3.3.3"><span class="item-no">3.3.3</span>  Tag balancing & proper nesting</a></span><br /> |
76 |     <span class="toc-item"><a href="#s3.3.4"><span class="item-no">3.3.4</span>  Elements requiring child elements</a></span><br /> | 76 |     <span class="toc-item"><a href="#s3.3.4"><span class="item-no">3.3.4</span>  Elements requiring child elements</a></span><br /> |
77 |     <span class="toc-item"><a href="#s3.3.5"><span class="item-no">3.3.5</span>  Beautify or compact HTML</a></span><br /> | 77 |     <span class="toc-item"><a href="#s3.3.5"><span class="item-no">3.3.5</span>  Beautify or compact HTML</a></span><br /> |
78 |   <span class="toc-item"><a href="#s3.4"><span class="item-no">3.4</span>  Attributes</a></span><br /> | 78 |   <span class="toc-item"><a href="#s3.4"><span class="item-no">3.4</span>  Attributes</a></span><br /> |
79 |     <span class="toc-item"><a href="#s3.4.1"><span class="item-no">3.4.1</span>  Auto-addition of XHTML-required attributes</a></span><br /> | 79 |     <span class="toc-item"><a href="#s3.4.1"><span class="item-no">3.4.1</span>  Auto-addition of XHTML-required attributes</a></span><br /> |
80 |     <span class="toc-item"><a href="#s3.4.2"><span class="item-no">3.4.2</span>  Duplicate/invalid <span class="term">id</span> values</a></span><br /> | 80 |     <span class="toc-item"><a href="#s3.4.2"><span class="item-no">3.4.2</span>  Duplicate/invalid <span class="term">id</span> values</a></span><br /> |
81 |     <span class="toc-item"><a href="#s3.4.3"><span class="item-no">3.4.3</span>  URL schemes & scripts in attribute values</a></span><br /> | 81 |     <span class="toc-item"><a href="#s3.4.3"><span class="item-no">3.4.3</span>  URL schemes & scripts in attribute values</a></span><br /> |
82 |     <span class="toc-item"><a href="#s3.4.4"><span class="item-no">3.4.4</span>  Absolute & relative URLs</a></span><br /> | 82 |     <span class="toc-item"><a href="#s3.4.4"><span class="item-no">3.4.4</span>  Absolute & relative URLs</a></span><br /> |
83 |     <span class="toc-item"><a href="#s3.4.5"><span class="item-no">3.4.5</span>  Lower-cased, standard attribute values</a></span><br /> | 83 |     <span class="toc-item"><a href="#s3.4.5"><span class="item-no">3.4.5</span>  Lower-cased, standard attribute values</a></span><br /> |
84 |     <span class="toc-item"><a href="#s3.4.6"><span class="item-no">3.4.6</span>  Transformation of deprecated attributes</a></span><br /> | 84 |     <span class="toc-item"><a href="#s3.4.6"><span class="item-no">3.4.6</span>  Transformation of deprecated attributes</a></span><br /> |
85 |     <span class="toc-item"><a href="#s3.4.7"><span class="item-no">3.4.7</span>  Anti-spam & <span class="term">href</span></a></span><br /> | 85 |     <span class="toc-item"><a href="#s3.4.7"><span class="item-no">3.4.7</span>  Anti-spam & <span class="term">href</span></a></span><br /> |
86 |     <span class="toc-item"><a href="#s3.4.8"><span class="item-no">3.4.8</span>  Inline style properties</a></span><br /> | 86 |     <span class="toc-item"><a href="#s3.4.8"><span class="item-no">3.4.8</span>  Inline style properties</a></span><br /> |
87 |     <span class="toc-item"><a href="#s3.4.9"><span class="item-no">3.4.9</span>  Hook function for tag content</a></span><br /> | 87 |     <span class="toc-item"><a href="#s3.4.9"><span class="item-no">3.4.9</span>  Hook function for tag content</a></span><br /> |
88 |   <span class="toc-item"><a href="#s3.5"><span class="item-no">3.5</span>  Simple configuration directive for most valid XHTML</a></span><br /> | 88 |   <span class="toc-item"><a href="#s3.5"><span class="item-no">3.5</span>  Simple configuration directive for most valid XHTML</a></span><br /> |
89 |   <span class="toc-item"><a href="#s3.6"><span class="item-no">3.6</span>  Simple configuration directive for most <em>safe</em> HTML</a></span><br /> | 89 |   <span class="toc-item"><a href="#s3.6"><span class="item-no">3.6</span>  Simple configuration directive for most <em>safe</em> HTML</a></span><br /> |
90 |   <span class="toc-item"><a href="#s3.7"><span class="item-no">3.7</span>  Using a hook function</a></span><br /> | 90 |   <span class="toc-item"><a href="#s3.7"><span class="item-no">3.7</span>  Using a hook function</a></span><br /> |
91 |   <span class="toc-item"><a href="#s3.8"><span class="item-no">3.8</span>  Obtaining <em>finalized</em> parameter values</a></span><br /> | 91 |   <span class="toc-item"><a href="#s3.8"><span class="item-no">3.8</span>  Obtaining <em>finalized</em> parameter values</a></span><br /> |
92 |   <span class="toc-item"><a href="#s3.9"><span class="item-no">3.9</span>  Retaining non-HTML tags in input with mixed markup</a></span><br /> | 92 |   <span class="toc-item"><a href="#s3.9"><span class="item-no">3.9</span>  Retaining non-HTML tags in input with mixed markup</a></span><br /> |
93 | <span class="toc-item"><a href="#s4"><span class="item-no">4</span>  Other</a></span><br /> | 93 | <span class="toc-item"><a href="#s4"><span class="item-no">4</span>  Other</a></span><br /> |
94 |   <span class="toc-item"><a href="#s4.1"><span class="item-no">4.1</span>  Support</a></span><br /> | 94 |   <span class="toc-item"><a href="#s4.1"><span class="item-no">4.1</span>  Support</a></span><br /> |
95 |   <span class="toc-item"><a href="#s4.2"><span class="item-no">4.2</span>  Known issues</a></span><br /> | 95 |   <span class="toc-item"><a href="#s4.2"><span class="item-no">4.2</span>  Known issues</a></span><br /> |
96 |   <span class="toc-item"><a href="#s4.3"><span class="item-no">4.3</span>  Change-log</a></span><br /> | 96 |   <span class="toc-item"><a href="#s4.3"><span class="item-no">4.3</span>  Change-log</a></span><br /> |
97 |   <span class="toc-item"><a href="#s4.4"><span class="item-no">4.4</span>  Testing</a></span><br /> | 97 |   <span class="toc-item"><a href="#s4.4"><span class="item-no">4.4</span>  Testing</a></span><br /> |
98 |   <span class="toc-item"><a href="#s4.5"><span class="item-no">4.5</span>  Upgrade, & old versions</a></span><br /> | 98 |   <span class="toc-item"><a href="#s4.5"><span class="item-no">4.5</span>  Upgrade, & old versions</a></span><br /> |
99 |   <span class="toc-item"><a href="#s4.6"><span class="item-no">4.6</span>  Comparison with <span class="term">HTMLPurifier</span></a></span><br /> | 99 |   <span class="toc-item"><a href="#s4.6"><span class="item-no">4.6</span>  Comparison with <span class="term">HTMLPurifier</span></a></span><br /> |
100 |   <span class="toc-item"><a href="#s4.7"><span class="item-no">4.7</span>  Use through application plug-ins/modules</a></span><br /> | 100 |   <span class="toc-item"><a href="#s4.7"><span class="item-no">4.7</span>  Use through application plug-ins/modules</a></span><br /> |
101 |   <span class="toc-item"><a href="#s4.8"><span class="item-no">4.8</span>  Use in non-PHP applications</a></span><br /> | 101 |   <span class="toc-item"><a href="#s4.8"><span class="item-no">4.8</span>  Use in non-PHP applications</a></span><br /> |
102 |   <span class="toc-item"><a href="#s4.9"><span class="item-no">4.9</span>  Donate</a></span><br /> | 102 |   <span class="toc-item"><a href="#s4.9"><span class="item-no">4.9</span>  Donate</a></span><br /> |
103 |   <span class="toc-item"><a href="#s4.10"><span class="item-no">4.10</span>  Acknowledgements</a></span><br /> | 103 |   <span class="toc-item"><a href="#s4.10"><span class="item-no">4.10</span>  Acknowledgements</a></span><br /> |
104 | <span class="toc-item"><a href="#s5"><span class="item-no">5</span>  Appendices</a></span><br /> | 104 | <span class="toc-item"><a href="#s5"><span class="item-no">5</span>  Appendices</a></span><br /> |
105 |   <span class="toc-item"><a href="#s5.1"><span class="item-no">5.1</span>  Characters discouraged in HTML</a></span><br /> | 105 |   <span class="toc-item"><a href="#s5.1"><span class="item-no">5.1</span>  Characters discouraged in HTML</a></span><br /> |
106 |   <span class="toc-item"><a href="#s5.2"><span class="item-no">5.2</span>  Valid attribute-element combinations</a></span><br /> | 106 |   <span class="toc-item"><a href="#s5.2"><span class="item-no">5.2</span>  Valid attribute-element combinations</a></span><br /> |
107 |   <span class="toc-item"><a href="#s5.3"><span class="item-no">5.3</span>  CSS 2.1 properties accepting URLs</a></span><br /> | 107 |   <span class="toc-item"><a href="#s5.3"><span class="item-no">5.3</span>  CSS 2.1 properties accepting URLs</a></span><br /> |
108 |   <span class="toc-item"><a href="#s5.4"><span class="item-no">5.4</span>  Microsoft Windows 1252 character replacements</a></span><br /> | 108 |   <span class="toc-item"><a href="#s5.4"><span class="item-no">5.4</span>  Microsoft Windows 1252 character replacements</a></span><br /> |
109 |   <span class="toc-item"><a href="#s5.5"><span class="item-no">5.5</span>  URL format</a></span><br /> | 109 |   <span class="toc-item"><a href="#s5.5"><span class="item-no">5.5</span>  URL format</a></span><br /> |
110 |   <span class="toc-item"><a href="#s5.6"><span class="item-no">5.6</span>  Brief on htmLawed code</a></span></div><!-- ended div toc --> | 110 |   <span class="toc-item"><a href="#s5.6"><span class="item-no">5.6</span>  Brief on htmLawed code</a></span></div><!-- ended div toc --> |
111 | 111 | ||
112 | <div id="body"> | 112 | <div id="body"> |
113 | <br /> | 113 | <br /> |
114 | <div class="comment">htmLawed_README.txt, 24 September 2019<br /> | 114 | <div class="comment">htmLawed_README.txt, 24 September 2019<br /> |
115 | htmLawed 1.2.5, 24 September 2019<br /> | 115 | htmLawed 1.2.5, 24 September 2019<br /> |
116 | Copyright Santosh Patnaik<br /> | 116 | Copyright Santosh Patnaik<br /> |
117 | Dual licensed with LGPL 3 and GPL 2+<br /> | 117 | Dual licensed with LGPL 3 and GPL 2+<br /> |
118 | A PHP Labware internal utility - <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed">http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed</a> </div> | 118 | A PHP Labware internal utility - <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed">http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed</a> </div> |
119 | <br /> | 119 | <br /> |
120 | 120 | ||
121 | <div class="section"><h2> | 121 | <div class="section"><h2> |
122 | <a name="s1" id="s1"></a><span class="item-no">1</span>  About htmLawed | 122 | <a name="s1" id="s1"></a><span class="item-no">1</span>  About htmLawed |
123 | </h2><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 123 | </h2><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
124 | <br /> | 124 | <br /> |
125 |   htmLawed is a PHP script to process text with HTML markup to make it more compliant with HTML standards and with administrative policies. It works by making HTML well-formed with balanced and properly nested tags, neutralizing code that introduces a security vulnerability or is used for cross-site scripting (XSS) attacks, allowing only specified HTML tags and attributes, and so on. Such <em>lawing in</em> of HTML code ensures that it is in accordance with the aesthetics, safety and usability requirements set by administrators.<br /> | 125 |   htmLawed is a PHP script to process text with HTML markup to make it more compliant with HTML standards and with administrative policies. It works by making HTML well-formed with balanced and properly nested tags, neutralizing code that introduces a security vulnerability or is used for cross-site scripting (XSS) attacks, allowing only specified HTML tags and attributes, and so on. Such <em>lawing in</em> of HTML code ensures that it is in accordance with the aesthetics, safety and usability requirements set by administrators.<br /> |
126 | <br /> | 126 | <br /> |
127 |   htmLawed is highly customizable, and fast with low memory usage. Its free and open-source code is in one small file. It does not require extensions or libraries, and works in older versions of PHP as well. It is a good alternative to the HTML <a href="http://tidy.sourceforge.net">Tidy</a> application.<br /> | 127 |   htmLawed is highly customizable, and fast with low memory usage. Its free and open-source code is in one small file. It does not require extensions or libraries, and works in older versions of PHP as well. It is a good alternative to the HTML <a href="http://tidy.sourceforge.net">Tidy</a> application.<br /> |
128 | 128 | ||
129 | <div class="sub-section"><h3> | 129 | <div class="sub-section"><h3> |
130 | <a name="s1.1" id="s1.1"></a><span class="item-no">1.1</span>  Example uses | 130 | <a name="s1.1" id="s1.1"></a><span class="item-no">1.1</span>  Example uses |
131 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 131 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
132 | <br /> | 132 | <br /> |
133 |   *  Filtering of text submitted as comments on blogs to allow only certain HTML elements<br /> | 133 |   *  Filtering of text submitted as comments on blogs to allow only certain HTML elements<br /> |
134 | <br /> | 134 | <br /> |
135 |   *  Making RSS newsfeed items standard-compliant: often one uses an excerpt from an HTML document for the content, and with unbalanced tags, non-numerical entities, etc., such excerpts may not be XML-compliant<br /> | 135 |   *  Making RSS newsfeed items standard-compliant: often one uses an excerpt from an HTML document for the content, and with unbalanced tags, non-numerical entities, etc., such excerpts may not be XML-compliant<br /> |
136 | <br /> | 136 | <br /> |
137 |   *  Beautifying or pretty-printing HTML code<br /> | 137 |   *  Beautifying or pretty-printing HTML code<br /> |
138 | <br /> | 138 | <br /> |
139 |   *  Text processing for stricter XML standard-compliance: e.g., to have lowercased <span class="term">x</span> in hexadecimal numeric entities becomes necessary if an HTML document with MathML content needs to be served as <span class="term">application/xml</span><br /> | 139 |   *  Text processing for stricter XML standard-compliance: e.g., to have lowercased <span class="term">x</span> in hexadecimal numeric entities becomes necessary if an HTML document with MathML content needs to be served as <span class="term">application/xml</span><br /> |
140 | <br /> | 140 | <br /> |
141 |   *  Scraping text from web-pages<br /> | 141 |   *  Scraping text from web-pages<br /> |
142 | <br /> | 142 | <br /> |
143 |   *  Transforming an HTML element to another<br /> | 143 |   *  Transforming an HTML element to another<br /> |
144 | 144 | ||
145 | </div> | 145 | </div> |
146 | <div class="sub-section"><h3> | 146 | <div class="sub-section"><h3> |
147 | <a name="s1.2" id="s1.2"></a><span class="item-no">1.2</span>  Features | 147 | <a name="s1.2" id="s1.2"></a><span class="item-no">1.2</span>  Features |
148 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 148 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
149 | <br /> | 149 | <br /> |
150 |   Key: <span class="term">*</span> security feature, <span class="term">^</span> standard compliance, <span class="term">~</span> requires setting right options<br /> | 150 |   Key: <span class="term">*</span> security feature, <span class="term">^</span> standard compliance, <span class="term">~</span> requires setting right options<br /> |
151 | <br /> | 151 | <br /> |
152 |   htmLawed:<br /> | 152 |   htmLawed:<br /> |
153 | <br /> | 153 | <br /> |
154 |   *  makes input more <strong>secure</strong> and <strong>standard-compliant</strong> for HTML as well as generic <strong>XML</strong> documents  ^<br /> | 154 |   *  makes input more <strong>secure</strong> and <strong>standard-compliant</strong> for HTML as well as generic <strong>XML</strong> documents  ^<br /> |
155 |   *  supports markup for <strong>HTML 5</strong> and <strong>microdata, ARIA, Ruby, custom attributes</strong>, etc.  ^<br /> | 155 |   *  supports markup for <strong>HTML 5</strong> and <strong>microdata, ARIA, Ruby, custom attributes</strong>, etc.  ^<br /> |
156 |   *  can <strong>beautify</strong> or <strong>compact</strong> HTML  ~<br /> | 156 |   *  can <strong>beautify</strong> or <strong>compact</strong> HTML  ~<br /> |
157 |   *  works with input of almost any <strong>character encoding</strong> and does not affect it<br /> | 157 |   *  works with input of almost any <strong>character encoding</strong> and does not affect it<br /> |
158 |   *  has good <strong>tolerance for ill-written HTML</strong><br /> | 158 |   *  has good <strong>tolerance for ill-written HTML</strong><br /> |
159 | <br /> | 159 | <br /> |
160 |   *  can enforce <strong>restricted use of elements</strong>  *~<br /> | 160 |   *  can enforce <strong>restricted use of elements</strong>  *~<br /> |
161 |   *  ensures proper closure of empty elements like <span class="term">img</span>  ^<br /> | 161 |   *  ensures proper closure of empty elements like <span class="term">img</span>  ^<br /> |
162 |   *  <strong>transforms deprecated elements</strong> like <span class="term">font</span>  ^~<br /> | 162 |   *  <strong>transforms deprecated elements</strong> like <span class="term">font</span>  ^~<br /> |
163 |   *  can permit HTML <strong>comments</strong> and <strong>CDATA</strong> sections  ^~<br /> | 163 |   *  can permit HTML <strong>comments</strong> and <strong>CDATA</strong> sections  ^~<br /> |
164 |   *  can permit all elements, including <span class="term">script</span>, <span class="term">object</span> and <span class="term">form</span>  ~<br /> | 164 |   *  can permit all elements, including <span class="term">script</span>, <span class="term">object</span> and <span class="term">form</span>  ~<br /> |
165 | <br /> | 165 | <br /> |
166 |   *  can <strong>restrict attributes by element</strong>  ^~<br /> | 166 |   *  can <strong>restrict attributes by element</strong>  ^~<br /> |
167 |   *  removes <strong>invalid attributes</strong>  ^<br /> | 167 |   *  removes <strong>invalid attributes</strong>  ^<br /> |
168 |   *  lower-cases element and attribute names  ^<br /> | 168 |   *  lower-cases element and attribute names  ^<br /> |
169 |   *  provides <strong>required attributes</strong>, like <span class="term">alt</span> for <span class="term">image</span>  ^<br /> | 169 |   *  provides <strong>required attributes</strong>, like <span class="term">alt</span> for <span class="term">image</span>  ^<br /> |
170 |   *  <strong>transforms deprecated attributes</strong>  ^~<br /> | 170 |   *  <strong>transforms deprecated attributes</strong>  ^~<br /> |
171 |   *  ensures attributes are <strong>declared only once</strong>  ^<br /> | 171 |   *  ensures attributes are <strong>declared only once</strong>  ^<br /> |
172 |   *  permits <strong>custom</strong>, non-standard attributes as well as custom rules for standard attributes  ~<br /> | 172 |   *  permits <strong>custom</strong>, non-standard attributes as well as custom rules for standard attributes  ~<br /> |
173 | <br /> | 173 | <br /> |
174 |   *  declares value for <em>empty</em> (<em>minimized</em> or <em>boolean</em>) attributes like <span class="term">checked</span>  ^<br /> | 174 |   *  declares value for <em>empty</em> (<em>minimized</em> or <em>boolean</em>) attributes like <span class="term">checked</span>  ^<br /> |
175 |   *  checks for potentially dangerous attribute values  *~<br /> | 175 |   *  checks for potentially dangerous attribute values  *~<br /> |
176 |   *  ensures <strong>unique</strong> <span class="term">id</span> attribute values  ^~<br /> | 176 |   *  ensures <strong>unique</strong> <span class="term">id</span> attribute values  ^~<br /> |
177 |   *  <strong>double-quotes</strong> attribute values  ^<br /> | 177 |   *  <strong>double-quotes</strong> attribute values  ^<br /> |
178 |   *  lower-cases <strong>standard attribute values</strong> like <span class="term">password</span>  ^<br /> | 178 |   *  lower-cases <strong>standard attribute values</strong> like <span class="term">password</span>  ^<br /> |
179 | <br /> | 179 | <br /> |
180 |   *  can restrict <strong>URL protocol/scheme by attribute</strong>  *~<br /> | 180 |   *  can restrict <strong>URL protocol/scheme by attribute</strong>  *~<br /> |
181 |   *  can disable <strong>dynamic expressions</strong> in <span class="term">style</span> values  *~<br /> | 181 |   *  can disable <strong>dynamic expressions</strong> in <span class="term">style</span> values  *~<br /> |
182 | <br /> | 182 | <br /> |
183 |   *  neutralizes invalid named <strong>character entities</strong>  ^<br /> | 183 |   *  neutralizes invalid named <strong>character entities</strong>  ^<br /> |
184 |   *  converts hexadecimal numeric entities to decimal ones, or vice versa  ^~<br /> | 184 |   *  converts hexadecimal numeric entities to decimal ones, or vice versa  ^~<br /> |
185 |   *  converts named entities to numeric ones for generic XML use  ^~<br /> | 185 |   *  converts named entities to numeric ones for generic XML use  ^~<br /> |
186 | <br /> | 186 | <br /> |
187 |   *  removes <strong>null</strong> characters  *<br /> | 187 |   *  removes <strong>null</strong> characters  *<br /> |
188 |   *  neutralizes potentially dangerous proprietary Netscape <strong>Javascript entities</strong>  *<br /> | 188 |   *  neutralizes potentially dangerous proprietary Netscape <strong>Javascript entities</strong>  *<br /> |
189 |   *  replaces potentially dangerous <strong>soft-hyphen</strong> character in URL-accepting attribute values with spaces  *<br /> | 189 |   *  replaces potentially dangerous <strong>soft-hyphen</strong> character in URL-accepting attribute values with spaces  *<br /> |
190 | <br /> | 190 | <br /> |
191 |   *  removes common <strong>invalid characters</strong> not allowed in HTML or XML  ^<br /> | 191 |   *  removes common <strong>invalid characters</strong> not allowed in HTML or XML  ^<br /> |
192 |   *  replaces <strong>characters from Microsoft applications</strong> like <span class="term">Word</span> that are discouraged in HTML or XML  ^~<br /> | 192 |   *  replaces <strong>characters from Microsoft applications</strong> like <span class="term">Word</span> that are discouraged in HTML or XML  ^~<br /> |
193 |   *  neutralize entities for characters invalid or discouraged in HTML or XML  ^<br /> | 193 |   *  neutralize entities for characters invalid or discouraged in HTML or XML  ^<br /> |
194 |   *  appropriately neutralize <span class="term"><</span>, <span class="term">&</span>, <span class="term">"</span>, and <span class="term">></span> characters  ^*<br /> | 194 |   *  appropriately neutralize <span class="term"><</span>, <span class="term">&</span>, <span class="term">"</span>, and <span class="term">></span> characters  ^*<br /> |
195 | <br /> | 195 | <br /> |
196 |   *  understands improperly spaced tag content (e.g., spread over more than a line) and properly spaces them<br /> | 196 |   *  understands improperly spaced tag content (e.g., spread over more than a line) and properly spaces them<br /> |
197 |   *  attempts to <strong>balance tags</strong> for well-formedness  ^~<br /> | 197 |   *  attempts to <strong>balance tags</strong> for well-formedness  ^~<br /> |
198 |   *  understands when <strong>omitable closing tags</strong> like <span class="term"></p></span> are missing  ^~<br /> | 198 |   *  understands when <strong>omitable closing tags</strong> like <span class="term"></p></span> are missing  ^~<br /> |
199 |   *  attempts to permit only <strong>validly nested tags</strong>  ^~<br /> | 199 |   *  attempts to permit only <strong>validly nested tags</strong>  ^~<br /> |
200 |   *  can <strong>either remove or neutralize bad content</strong> ^~<br /> | 200 |   *  can <strong>either remove or neutralize bad content</strong> ^~<br /> |
201 |   *  attempts to <strong>rectify common errors of plain-text misplacement</strong> (e.g., directly inside <span class="term">blockquote</span>) ^~<br /> | 201 |   *  attempts to <strong>rectify common errors of plain-text misplacement</strong> (e.g., directly inside <span class="term">blockquote</span>) ^~<br /> |
202 | <br /> | 202 | <br /> |
203 |   *  has optional <strong>anti-spam</strong> measures such as addition of <span class="term">rel="nofollow"</span> and link-disabling  ~<br /> | 203 |   *  has optional <strong>anti-spam</strong> measures such as addition of <span class="term">rel="nofollow"</span> and link-disabling  ~<br /> |
204 |   *  optionally makes <strong>relative URLs absolute</strong>, and vice versa  ~<br /> | 204 |   *  optionally makes <strong>relative URLs absolute</strong>, and vice versa  ~<br /> |
205 | <br /> | 205 | <br /> |
206 |   *  optionally marks <span class="term">&</span> to identify the entities for <span class="term">&</span>, <span class="term"><</span> and <span class="term">></span> introduced by it  ~<br /> | 206 |   *  optionally marks <span class="term">&</span> to identify the entities for <span class="term">&</span>, <span class="term"><</span> and <span class="term">></span> introduced by it  ~<br /> |
207 | <br /> | 207 | <br /> |
208 |   *  allows deployment of powerful <strong>hook functions</strong> to <strong>inject</strong> HTML, <strong>consolidate</strong> <span class="term">style</span> attributes to <span class="term">class</span>, finely check attribute values, etc.  ~<br /> | 208 |   *  allows deployment of powerful <strong>hook functions</strong> to <strong>inject</strong> HTML, <strong>consolidate</strong> <span class="term">style</span> attributes to <span class="term">class</span>, finely check attribute values, etc.  ~<br /> |
209 | 209 | ||
210 | </div> | 210 | </div> |
211 | <div class="sub-section"><h3> | 211 | <div class="sub-section"><h3> |
212 | <a name="s1.3" id="s1.3"></a><span class="item-no">1.3</span>  History | 212 | <a name="s1.3" id="s1.3"></a><span class="item-no">1.3</span>  History |
213 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 213 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
214 | <br /> | 214 | <br /> |
215 |   htmLawed was created in 2007 for use with <span class="term">LabWiki</span>, a wiki software developed at PHP Labware, as a suitable software could not be found. Existing PHP software like <span class="term">Kses</span> and <span class="term">HTMLPurifier</span> were deemed inadequate, slow, resource-intensive, or dependent on an extension or external application like <span class="term">HTML Tidy</span>. The core logic of htmLawed, that of identifying HTML elements and attributes, was based on the <span class="term">Kses</span> (version 0.2.2) HTML filter software of Ulf Harnhammar (it can still be used with code that uses <span class="term">Kses</span>; see <a href="#s2.6">section 2.6</a>.). Support for HTML version 5 was added in May 2013 in a beta and in February 2017 in a production release.<br /> | 215 |   htmLawed was created in 2007 for use with <span class="term">LabWiki</span>, a wiki software developed at PHP Labware, as a suitable software could not be found. Existing PHP software like <span class="term">Kses</span> and <span class="term">HTMLPurifier</span> were deemed inadequate, slow, resource-intensive, or dependent on an extension or external application like <span class="term">HTML Tidy</span>. The core logic of htmLawed, that of identifying HTML elements and attributes, was based on the <span class="term">Kses</span> (version 0.2.2) HTML filter software of Ulf Harnhammar (it can still be used with code that uses <span class="term">Kses</span>; see <a href="#s2.6">section 2.6</a>.). Support for HTML version 5 was added in May 2013 in a beta and in February 2017 in a production release.<br /> |
216 | <br /> | 216 | <br /> |
217 |   See <a href="#s4.3">section 4.3</a> for a detailed log of changes in htmLawed over the years, and <a href="#s4.10">section 4.10</a> for acknowledgements.<br /> | 217 |   See <a href="#s4.3">section 4.3</a> for a detailed log of changes in htmLawed over the years, and <a href="#s4.10">section 4.10</a> for acknowledgements.<br /> |
218 | 218 | ||
219 | </div> | 219 | </div> |
220 | <div class="sub-section"><h3> | 220 | <div class="sub-section"><h3> |
221 | <a name="s1.4" id="s1.4"></a><span class="item-no">1.4</span>  License & copyright | 221 | <a name="s1.4" id="s1.4"></a><span class="item-no">1.4</span>  License & copyright |
222 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 222 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
223 | <br /> | 223 | <br /> |
224 |   htmLawed is free and open-source software, copyrighted by Santosh Patnaik, MD, PhD, and dual-licensed with LGPL version <a href="http://www.gnu.org/licenses/lgpl-3.0.txt">3</a>, and GPL version <a href="http://www.gnu.org/licenses/gpl-2.0.txt">2</a> (or later) licenses.<br /> | 224 |   htmLawed is free and open-source software, copyrighted by Santosh Patnaik, MD, PhD, and dual-licensed with LGPL version <a href="http://www.gnu.org/licenses/lgpl-3.0.txt">3</a>, and GPL version <a href="http://www.gnu.org/licenses/gpl-2.0.txt">2</a> (or later) licenses.<br /> |
225 | 225 | ||
226 | </div> | 226 | </div> |
227 | <div class="sub-section"><h3> | 227 | <div class="sub-section"><h3> |
228 | <a name="s1.5" id="s1.5"></a><span class="item-no">1.5</span>  Terms used here | 228 | <a name="s1.5" id="s1.5"></a><span class="item-no">1.5</span>  Terms used here |
229 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 229 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
230 | <br /> | 230 | <br /> |
231 |   In this document, only HTML body-level elements are considered. htmLawed does not have support for head-level elements, <span class="term">body</span>, and the frame-level elements, <span class="term">frameset</span>, <span class="term">frame</span> and <span class="term">noframes</span>, and these elements are ignored here.<br /> | 231 |   In this document, only HTML body-level elements are considered. htmLawed does not have support for head-level elements, <span class="term">body</span>, and the frame-level elements, <span class="term">frameset</span>, <span class="term">frame</span> and <span class="term">noframes</span>, and these elements are ignored here.<br /> |
232 | <br /> | 232 | <br /> |
233 |   *  <em>administrator</em> - or admin; person setting up the code that utilizes htmLawed; also, <em>user</em><br /> | 233 |   *  <em>administrator</em> - or admin; person setting up the code that utilizes htmLawed; also, <em>user</em><br /> |
234 |   *  <em>attributes</em> - name-value pairs like <span class="term">href="http://x.com"</span> in opening tags<br /> | 234 |   *  <em>attributes</em> - name-value pairs like <span class="term">href="http://x.com"</span> in opening tags<br /> |
235 |   *  <em>author</em> - see <em>writer</em><br /> | 235 |   *  <em>author</em> - see <em>writer</em><br /> |
236 |   *  <em>character</em> - atomic unit of text; internally represented by a numeric <em>code-point</em> as specified by the <em>encoding</em> or <em>charset</em> in use<br /> | 236 |   *  <em>character</em> - atomic unit of text; internally represented by a numeric <em>code-point</em> as specified by the <em>encoding</em> or <em>charset</em> in use<br /> |
237 |   *  <em>entity</em> - markup like <span class="term">&gt;</span> and <span class="term">&#160;</span> used to refer to a character<br /> | 237 |   *  <em>entity</em> - markup like <span class="term">&gt;</span> and <span class="term">&#160;</span> used to refer to a character<br /> |
238 |   *  <em>element</em> - HTML element like <span class="term">a</span> and <span class="term">img</span><br /> | 238 |   *  <em>element</em> - HTML element like <span class="term">a</span> and <span class="term">img</span><br /> |
239 |   *  <em>element content</em> -  content between the opening and closing tags of an element, like <span class="term">click</span> of the <span class="term"><a href="x">click</a></span> element<br /> | 239 |   *  <em>element content</em> -  content between the opening and closing tags of an element, like <span class="term">click</span> of the <span class="term"><a href="x">click</a></span> element<br /> |
240 |   *  <em>HTML</em> - implies XHTML unless specified otherwise<br /> | 240 |   *  <em>HTML</em> - implies XHTML unless specified otherwise<br /> |
241 |   *  <em>HTML body</em> - content in the <em>body</em> container of an HTML document<br /> | 241 |   *  <em>HTML body</em> - content in the <em>body</em> container of an HTML document<br /> |
242 |   *  <em>input</em> - text given to htmLawed to process<br /> | 242 |   *  <em>input</em> - text given to htmLawed to process<br /> |
243 |   *  <em>legal</em> – standard-compliant; also, <em>valid</em><br /> | 243 |   *  <em>legal</em> – standard-compliant; also, <em>valid</em><br /> |
244 |   *  <em>processing</em> - involves filtering, correction, etc., of input<br /> | 244 |   *  <em>processing</em> - involves filtering, correction, etc., of input<br /> |
245 |   *  <em>safe</em> - absence or reduction of certain characters and HTML elements and attributes in HTML of text that can otherwise potentially, and circumstantially, expose text readers to security vulnerabilities like cross-site scripting attacks (XSS)<br /> | 245 |   *  <em>safe</em> - absence or reduction of certain characters and HTML elements and attributes in HTML of text that can otherwise potentially, and circumstantially, expose text readers to security vulnerabilities like cross-site scripting attacks (XSS)<br /> |
246 |   *  <em>scheme</em> - a URL protocol like <span class="term">http</span> and <span class="term">ftp</span><br /> | 246 |   *  <em>scheme</em> - a URL protocol like <span class="term">http</span> and <span class="term">ftp</span><br /> |
247 |   *  <em>specification</em> - detailed description including rules that define HTML<br /> | 247 |   *  <em>specification</em> - detailed description including rules that define HTML<br /> |
248 |   *  <em>standard</em> – widely accepted specification<br /> | 248 |   *  <em>standard</em> – widely accepted specification<br /> |
249 |   *  <em>style property</em> - terms like <span class="term">border</span> and <span class="term">height</span> for which declarations are made in values for the <span class="term">style</span> attribute of elements<br /> | 249 |   *  <em>style property</em> - terms like <span class="term">border</span> and <span class="term">height</span> for which declarations are made in values for the <span class="term">style</span> attribute of elements<br /> |
250 |   *  <em>tag</em> - markers like <span class="term"><a href="x"></span> and <span class="term"></a></span> delineating element content; the opening tag can contain attributes<br /> | 250 |   *  <em>tag</em> - markers like <span class="term"><a href="x"></span> and <span class="term"></a></span> delineating element content; the opening tag can contain attributes<br /> |
251 |   *  <em>tag content</em> - consists of tag markers <span class="term"><</span> and <span class="term">></span>, element names like <span class="term">div</span>, and possibly attributes<br /> | 251 |   *  <em>tag content</em> - consists of tag markers <span class="term"><</span> and <span class="term">></span>, element names like <span class="term">div</span>, and possibly attributes<br /> |
252 |   *  <em>user</em> - administrator<br /> | 252 |   *  <em>user</em> - administrator<br /> |
253 |   *  <em>valid</em> - see <em>legal</em><br /> | 253 |   *  <em>valid</em> - see <em>legal</em><br /> |
254 |   *  <em>writer</em> - end-user like a blog commenter providing the input that is to be processed; also, <em>author</em><br /> | 254 |   *  <em>writer</em> - end-user like a blog commenter providing the input that is to be processed; also, <em>author</em><br /> |
255 |   *  <em>XHTML</em> - XML-compliant HTML; parsing rules for XHTML are more strict than for regular HTML<br /> | 255 |   *  <em>XHTML</em> - XML-compliant HTML; parsing rules for XHTML are more strict than for regular HTML<br /> |
256 | 256 | ||
257 | </div> | 257 | </div> |
258 | <div class="sub-section"><h3> | 258 | <div class="sub-section"><h3> |
259 | <a name="s1.6" id="s1.6"></a><span class="item-no">1.6</span>  Availability | 259 | <a name="s1.6" id="s1.6"></a><span class="item-no">1.6</span>  Availability |
260 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 260 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
261 | <br /> | 261 | <br /> |
262 |   htmLawed can be downloaded for free at its <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed">website</a>. Besides the <span class="term">htmLawed.php</span> file, the download has the htmLawed documentation (this document) in plain <a href="htmLawed_README.txt">text</a> and <a href="htmLawed_README.htm">HTML</a> formats, a script for <a href="htmLawedTest.php">testing</a>, and a text file for <a href="htmLawed_TESTCASE.txt">test-cases</a>. htmLawed is also available as a PHP class (OOP code) at its website.<br /> | 262 |   htmLawed can be downloaded for free at its <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed">website</a>. Besides the <span class="term">htmLawed.php</span> file, the download has the htmLawed documentation (this document) in plain <a href="htmLawed_README.txt">text</a> and <a href="htmLawed_README.htm">HTML</a> formats, a script for <a href="htmLawedTest.php">testing</a>, and a text file for <a href="htmLawed_TESTCASE.txt">test-cases</a>. htmLawed is also available as a PHP class (OOP code) at its website.<br /> |
263 | 263 | ||
264 | </div> | 264 | </div> |
265 | </div> | 265 | </div> |
266 | <div class="section"><h2> | 266 | <div class="section"><h2> |
267 | <a name="s2" id="s2"></a><span class="item-no">2</span>  Usage | 267 | <a name="s2" id="s2"></a><span class="item-no">2</span>  Usage |
268 | </h2><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 268 | </h2><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
269 | <br /> | 269 | <br /> |
270 |   htmLawed works in PHP version 4.4 or higher. Either <span class="term">include()</span> the <span class="term">htmLawed.php</span> file, or copy-paste the entire code.<br /> | 270 |   htmLawed works in PHP version 4.4 or higher. Either <span class="term">include()</span> the <span class="term">htmLawed.php</span> file, or copy-paste the entire code.<br /> |
271 | <br /> | 271 | <br /> |
272 |   To use with PHP 4.3, have the following code included:<br /> | 272 |   To use with PHP 4.3, have the following code included:<br /> |
273 | <br /> | 273 | <br /> |
274 | 274 | ||
275 | <code class="code">    if(!function_exists('ctype_digit')){</code> | 275 | <code class="code">    if(!function_exists('ctype_digit')){</code> |
276 | <br /> | 276 | <br /> |
277 | 277 | ||
278 | <code class="code">     function ctype_digit($var){</code> | 278 | <code class="code">     function ctype_digit($var){</code> |
279 | <br /> | 279 | <br /> |
280 | 280 | ||
281 | <code class="code">      return ((int) $var == $var);</code> | 281 | <code class="code">      return ((int) $var == $var);</code> |
282 | <br /> | 282 | <br /> |
283 | 283 | ||
284 | <code class="code">     }</code> | 284 | <code class="code">     }</code> |
285 | <br /> | 285 | <br /> |
286 | 286 | ||
287 | <code class="code">    }</code> | 287 | <code class="code">    }</code> |
288 | <br /> | 288 | <br /> |
289 | 289 | ||
290 | <div class="sub-section"><h3> | 290 | <div class="sub-section"><h3> |
291 | <a name="s2.1" id="s2.1"></a><span class="item-no">2.1</span>  Simple | 291 | <a name="s2.1" id="s2.1"></a><span class="item-no">2.1</span>  Simple |
292 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 292 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
293 | <br /> | 293 | <br /> |
294 |   The input text to be processed, <span class="term">$text</span>, is passed as an argument of type string; <span class="term">htmLawed()</span> returns the processed string:<br /> | 294 |   The input text to be processed, <span class="term">$text</span>, is passed as an argument of type string; <span class="term">htmLawed()</span> returns the processed string:<br /> |
295 | <br /> | 295 | <br /> |
296 | 296 | ||
297 | <code class="code">    $processed = htmLawed($text);</code> | 297 | <code class="code">    $processed = htmLawed($text);</code> |
298 | <br /> | 298 | <br /> |
299 | <br /> | 299 | <br /> |
300 |   With the <span class="term">htmLawed class</span> (<a href="#s1.6">section 1.6</a>), usage is:<br /> | 300 |   With the <span class="term">htmLawed class</span> (<a href="#s1.6">section 1.6</a>), usage is:<br /> |
301 | <br /> | 301 | <br /> |
302 | 302 | ||
303 | <code class="code">    $processed = htmLawed::hl($text);</code> | 303 | <code class="code">    $processed = htmLawed::hl($text);</code> |
304 | <br /> | 304 | <br /> |
305 | <br /> | 305 | <br /> |
306 |   <strong>Notes</strong>: (1) If input is from a <span class="term">$_GET</span> or <span class="term">$_POST</span> value, and <span class="term">magic quotes</span> are enabled on the PHP setup, run <span class="term">stripslashes()</span> on the input before passing to htmLawed. (2) htmLawed does not have support for head-level elements, <span class="term">body</span>, and the frame-level elements, <span class="term">frameset</span>, <span class="term">frame</span> and <span class="term">noframes</span>.<br /> | 306 |   <strong>Notes</strong>: (1) If input is from a <span class="term">$_GET</span> or <span class="term">$_POST</span> value, and <span class="term">magic quotes</span> are enabled on the PHP setup, run <span class="term">stripslashes()</span> on the input before passing to htmLawed. (2) htmLawed does not have support for head-level elements, <span class="term">body</span>, and the frame-level elements, <span class="term">frameset</span>, <span class="term">frame</span> and <span class="term">noframes</span>.<br /> |
307 | <br /> | 307 | <br /> |
308 |   By default, htmLawed will process the text allowing all valid HTML elements/tags and commonly used URL schemes and CSS style properties. It will allow Javascript code, <span class="term">CDATA</span> sections and HTML comments, balance tags, and ensure proper nesting of elements. Such actions can be configured using two other optional arguments -- <span class="term">$config</span> and <span class="term">$spec</span>:<br /> | 308 |   By default, htmLawed will process the text allowing all valid HTML elements/tags and commonly used URL schemes and CSS style properties. It will allow Javascript code, <span class="term">CDATA</span> sections and HTML comments, balance tags, and ensure proper nesting of elements. Such actions can be configured using two other optional arguments -- <span class="term">$config</span> and <span class="term">$spec</span>:<br /> |
309 | <br /> | 309 | <br /> |
310 | 310 | ||
311 | <code class="code">    $processed = htmLawed($text, $config, $spec);</code> | 311 | <code class="code">    $processed = htmLawed($text, $config, $spec);</code> |
312 | <br /> | 312 | <br /> |
313 | <br /> | 313 | <br /> |
314 |   The <span class="term">$config</span> and <span class="term">$spec</span> arguments are detailed below. Some examples are shown in <a href="#s2.9">section 2.9</a>. For maximum protection against <span class="term">XSS</span> and other security vulnerabilities, consider using the <span class="term">safe</span> parameter; see <a href="#s3.6">section 3.6</a>.<br /> | 314 |   The <span class="term">$config</span> and <span class="term">$spec</span> arguments are detailed below. Some examples are shown in <a href="#s2.9">section 2.9</a>. For maximum protection against <span class="term">XSS</span> and other security vulnerabilities, consider using the <span class="term">safe</span> parameter; see <a href="#s3.6">section 3.6</a>.<br /> |
315 | 315 | ||
316 | </div> | 316 | </div> |
317 | <div class="sub-section"><h3> | 317 | <div class="sub-section"><h3> |
318 | <a name="s2.2" id="s2.2"></a><span class="item-no">2.2</span>  Configuring htmLawed using the <span class="term">$config</span> argument | 318 | <a name="s2.2" id="s2.2"></a><span class="item-no">2.2</span>  Configuring htmLawed using the <span class="term">$config</span> argument |
319 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 319 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
320 | <br /> | 320 | <br /> |
321 |   <span class="term">$config</span> instructs htmLawed on how to tackle certain tasks. When <span class="term">$config</span> is not specified, or not set as an array (e.g., <span class="term">$config = 1</span>), htmLawed will take default actions. One or many of the task-action or parameter-value pairs can be specified in <span class="term">$config</span> as array key-value pairs. If a parameter is not specified, htmLawed will use the default value for it, indicated further below. In PHP code, parameter values that are integers should not be quoted and should be used as numeric types (unless meant as string/text). Thus, for instance:<br /> | 321 |   <span class="term">$config</span> instructs htmLawed on how to tackle certain tasks. When <span class="term">$config</span> is not specified, or not set as an array (e.g., <span class="term">$config = 1</span>), htmLawed will take default actions. One or many of the task-action or parameter-value pairs can be specified in <span class="term">$config</span> as array key-value pairs. If a parameter is not specified, htmLawed will use the default value for it, indicated further below. In PHP code, parameter values that are integers should not be quoted and should be used as numeric types (unless meant as string/text). Thus, for instance:<br /> |
322 | <br /> | 322 | <br /> |
323 | 323 | ||
324 | <code class="code">    $config = array('comment'=>0, 'cdata'=>1, 'elements'=>'a, b, strong');</code> | 324 | <code class="code">    $config = array('comment'=>0, 'cdata'=>1, 'elements'=>'a, b, strong');</code> |
325 | <br /> | 325 | <br /> |
326 | 326 | ||
327 | <code class="code">    $processed = htmLawed($text, $config);</code> | 327 | <code class="code">    $processed = htmLawed($text, $config);</code> |
328 | <br /> | 328 | <br /> |
329 | <br /> | 329 | <br /> |
330 |   Below are the various parameters that can be specified in <span class="term">$config</span>.<br /> | 330 |   Below are the various parameters that can be specified in <span class="term">$config</span>.<br /> |
331 | <br /> | 331 | <br /> |
332 |   Key: <span class="term">*</span> default, <span class="term">^</span> different from htmLawed versions below 1.2, <span class="term">~</span> different default when <span class="term">valid_xhtml</span> is set to <span class="term">1</span> (see <a href="#s3.5">section 3.5</a>), <span class="term">"</span> different default when <span class="term">safe</span> is set to <span class="term">1</span> (see <a href="#s3.6">section 3.6</a>)<br /> | 332 |   Key: <span class="term">*</span> default, <span class="term">^</span> different from htmLawed versions below 1.2, <span class="term">~</span> different default when <span class="term">valid_xhtml</span> is set to <span class="term">1</span> (see <a href="#s3.5">section 3.5</a>), <span class="term">"</span> different default when <span class="term">safe</span> is set to <span class="term">1</span> (see <a href="#s3.6">section 3.6</a>)<br /> |
333 | <br /> | 333 | <br /> |
334 |   <strong>abs_url</strong><br /> | 334 |   <strong>abs_url</strong><br /> |
335 |   Make URLs absolute or relative; <span class="term">$config["base_url"]</span> needs to be set; see <a href="#s3.4.4">section 3.4.4</a><br /> | 335 |   Make URLs absolute or relative; <span class="term">$config["base_url"]</span> needs to be set; see <a href="#s3.4.4">section 3.4.4</a><br /> |
336 | <br /> | 336 | <br /> |
337 |   <span class="term">-1</span> - make relative<br /> | 337 |   <span class="term">-1</span> - make relative<br /> |
338 |   <span class="term">0</span> - no action  *<br /> | 338 |   <span class="term">0</span> - no action  *<br /> |
339 |   <span class="term">1</span> - make absolute<br /> | 339 |   <span class="term">1</span> - make absolute<br /> |
340 | <br /> | 340 | <br /> |
341 |   <strong>and_mark</strong><br /> | 341 |   <strong>and_mark</strong><br /> |
342 |   Mark <span class="term">&</span> characters in the original input; see <a href="#s3.2">section 3.2</a><br /> | 342 |   Mark <span class="term">&</span> characters in the original input; see <a href="#s3.2">section 3.2</a><br /> |
343 | <br /> | 343 | <br /> |
344 |   <strong>anti_link_spam</strong><br /> | 344 |   <strong>anti_link_spam</strong><br /> |
345 |   Anti-link-spam measure; see <a href="#s3.4.7">section 3.4.7</a><br /> | 345 |   Anti-link-spam measure; see <a href="#s3.4.7">section 3.4.7</a><br /> |
346 | <br /> | 346 | <br /> |
347 |   <span class="term">0</span> - no measure taken  *<br /> | 347 |   <span class="term">0</span> - no measure taken  *<br /> |
348 |   <em>array("regex1", "regex2")</em> - will ensure a <span class="term">rel</span> attribute with <span class="term">nofollow</span> in its value in case the <span class="term">href</span> attribute value matches the regular expression pattern <span class="term">regex1</span>, and/or will remove <span class="term">href</span> if its value matches the regular expression pattern <span class="term">regex2</span>. E.g., <span class="term">array("/./", "/://\W*(?!(abc\.com|xyz\.org))/")</span>; see <a href="#s3.4.7">section 3.4.7</a> for more.<br /> | 348 |   <em>array("regex1", "regex2")</em> - will ensure a <span class="term">rel</span> attribute with <span class="term">nofollow</span> in its value in case the <span class="term">href</span> attribute value matches the regular expression pattern <span class="term">regex1</span>, and/or will remove <span class="term">href</span> if its value matches the regular expression pattern <span class="term">regex2</span>. E.g., <span class="term">array("/./", "/://\W*(?!(abc\.com|xyz\.org))/")</span>; see <a href="#s3.4.7">section 3.4.7</a> for more.<br /> |
349 | <br /> | 349 | <br /> |
350 |   <strong>anti_mail_spam</strong><br /> | 350 |   <strong>anti_mail_spam</strong><br /> |
351 |   Anti-mail-spam measure; see <a href="#s3.4.7">section 3.4.7</a><br /> | 351 |   Anti-mail-spam measure; see <a href="#s3.4.7">section 3.4.7</a><br /> |
352 | <br /> | 352 | <br /> |
353 |   <span class="term">0</span> - no measure taken  *<br /> | 353 |   <span class="term">0</span> - no measure taken  *<br /> |
354 |   <em>word</em> - <span class="term">@</span> in mail address in <span class="term">href</span> attribute value is replaced with specified <em>word</em><br /> | 354 |   <em>word</em> - <span class="term">@</span> in mail address in <span class="term">href</span> attribute value is replaced with specified <em>word</em><br /> |
355 | <br /> | 355 | <br /> |
356 |   <strong>balance</strong><br /> | 356 |   <strong>balance</strong><br /> |
357 |   Balance tags for well-formedness and proper nesting; see <a href="#s3.3.3">section 3.3.3</a><br /> | 357 |   Balance tags for well-formedness and proper nesting; see <a href="#s3.3.3">section 3.3.3</a><br /> |
358 | <br /> | 358 | <br /> |
359 |   <span class="term">0</span> - no<br /> | 359 |   <span class="term">0</span> - no<br /> |
360 |   <span class="term">1</span> - yes  *<br /> | 360 |   <span class="term">1</span> - yes  *<br /> |
361 | <br /> | 361 | <br /> |
362 |   <strong>base_url</strong><br /> | 362 |   <strong>base_url</strong><br /> |
363 |   Base URL value that needs to be set if <span class="term">$config["abs_url"]</span> is not <span class="term">0</span>; see <a href="#s3.4.4">section 3.4.4</a><br /> | 363 |   Base URL value that needs to be set if <span class="term">$config["abs_url"]</span> is not <span class="term">0</span>; see <a href="#s3.4.4">section 3.4.4</a><br /> |
364 | <br /> | 364 | <br /> |
365 |   <strong>cdata</strong><br /> | 365 |   <strong>cdata</strong><br /> |
366 |   Handling of <span class="term">CDATA</span> sections; see <a href="#s3.3.1">section 3.3.1</a><br /> | 366 |   Handling of <span class="term">CDATA</span> sections; see <a href="#s3.3.1">section 3.3.1</a><br /> |
367 | <br /> | 367 | <br /> |
368 |   <span class="term">0</span> - don't consider <span class="term">CDATA</span> sections as markup and proceed as if plain text  "<br /> | 368 |   <span class="term">0</span> - don't consider <span class="term">CDATA</span> sections as markup and proceed as if plain text  "<br /> |
369 |   <span class="term">1</span> - remove<br /> | 369 |   <span class="term">1</span> - remove<br /> |
370 |   <span class="term">2</span> - allow, but neutralize any <span class="term"><</span>, <span class="term">></span>, and <span class="term">&</span> inside by converting them to named entities<br /> | 370 |   <span class="term">2</span> - allow, but neutralize any <span class="term"><</span>, <span class="term">></span>, and <span class="term">&</span> inside by converting them to named entities<br /> |
371 |   <span class="term">3</span> - allow  *<br /> | 371 |   <span class="term">3</span> - allow  *<br /> |
372 | <br /> | 372 | <br /> |
373 |   <strong>clean_ms_char</strong><br /> | 373 |   <strong>clean_ms_char</strong><br /> |
374 |   Replace <em>discouraged</em> characters introduced by Microsoft Word, etc.; see <a href="#s3.1">section 3.1</a><br /> | 374 |   Replace <em>discouraged</em> characters introduced by Microsoft Word, etc.; see <a href="#s3.1">section 3.1</a><br /> |
375 | <br /> | 375 | <br /> |
376 |   <span class="term">0</span> - no  *<br /> | 376 |   <span class="term">0</span> - no  *<br /> |
377 |   <span class="term">1</span> - yes<br /> | 377 |   <span class="term">1</span> - yes<br /> |
378 |   <span class="term">2</span> - yes, but replace special single & double quotes with ordinary ones<br /> | 378 |   <span class="term">2</span> - yes, but replace special single & double quotes with ordinary ones<br /> |
379 | <br /> | 379 | <br /> |
380 |   <strong>comment</strong><br /> | 380 |   <strong>comment</strong><br /> |
381 |   Handling of HTML comments; see <a href="#s3.3.1">section 3.3.1</a><br /> | 381 |   Handling of HTML comments; see <a href="#s3.3.1">section 3.3.1</a><br /> |
382 | <br /> | 382 | <br /> |
383 |   <span class="term">0</span> - don't consider comments as markup and proceed as if plain text  "<br /> | 383 |   <span class="term">0</span> - don't consider comments as markup and proceed as if plain text  "<br /> |
384 |   <span class="term">1</span> - remove<br /> | 384 |   <span class="term">1</span> - remove<br /> |
385 |   <span class="term">2</span> - allow, but neutralize any <span class="term"><</span>, <span class="term">></span>, and <span class="term">&</span> inside by converting to named entities<br /> | 385 |   <span class="term">2</span> - allow, but neutralize any <span class="term"><</span>, <span class="term">></span>, and <span class="term">&</span> inside by converting to named entities<br /> |
386 |   <span class="term">3</span> - allow  *<br /> | 386 |   <span class="term">3</span> - allow  *<br /> |
387 | <br /> | 387 | <br /> |
388 |   <strong>css_expression</strong><br /> | 388 |   <strong>css_expression</strong><br /> |
389 |   Allow dynamic CSS expression by not removing the expression from CSS property values in <span class="term">style</span> attributes; see <a href="#s3.4.8">section 3.4.8</a><br /> | 389 |   Allow dynamic CSS expression by not removing the expression from CSS property values in <span class="term">style</span> attributes; see <a href="#s3.4.8">section 3.4.8</a><br /> |
390 | <br /> | 390 | <br /> |
391 |   <span class="term">0</span> - remove  *<br /> | 391 |   <span class="term">0</span> - remove  *<br /> |
392 |   <span class="term">1</span> - allow<br /> | 392 |   <span class="term">1</span> - allow<br /> |
393 | <br /> | 393 | <br /> |
394 |   <strong>deny_attribute</strong><br /> | 394 |   <strong>deny_attribute</strong><br /> |
395 |   Denied HTML attributes; see <a href="#s3.4">section 3.4</a><br /> | 395 |   Denied HTML attributes; see <a href="#s3.4">section 3.4</a><br /> |
396 | <br /> | 396 | <br /> |
397 |   <span class="term">0</span> - none  *<br /> | 397 |   <span class="term">0</span> - none  *<br /> |
398 |   <em>string</em> - dictated by values in <em>string</em><br /> | 398 |   <em>string</em> - dictated by values in <em>string</em><br /> |
399 |   <span class="term">on*</span> - on* event attributes like <span class="term">onfocus</span> not allowed  "<br /> | 399 |   <span class="term">on*</span> - on* event attributes like <span class="term">onfocus</span> not allowed  "<br /> |
400 | <br /> | 400 | <br /> |
401 |   <strong>direct_nest_list</strong><br /> | 401 |   <strong>direct_nest_list</strong><br /> |
402 |   Allow direct nesting of a list within another without requiring it to be a list item; see <a href="#s3.3.4">section 3.3.4</a><br /> | 402 |   Allow direct nesting of a list within another without requiring it to be a list item; see <a href="#s3.3.4">section 3.3.4</a><br /> |
403 | <br /> | 403 | <br /> |
404 |   <span class="term">0</span> - no  *<br /> | 404 |   <span class="term">0</span> - no  *<br /> |
405 |   <span class="term">1</span> - yes<br /> | 405 |   <span class="term">1</span> - yes<br /> |
406 | <br /> | 406 | <br /> |
407 |   <strong>elements</strong><br /> | 407 |   <strong>elements</strong><br /> |
408 |   Allowed HTML elements; see <a href="#s3.3">section 3.3</a><br /> | 408 |   Allowed HTML elements; see <a href="#s3.3">section 3.3</a><br /> |
409 | <br /> | 409 | <br /> |
410 |   <em>all</em> - *^<br /> | 410 |   <em>all</em> - *^<br /> |
411 |   <span class="term">* -acronym -big -center -dir -font -isindex -s -strike -tt</span> -  ~^<br /> | 411 |   <span class="term">* -acronym -big -center -dir -font -isindex -s -strike -tt</span> -  ~^<br /> |
412 |   <em>applet, audio, canvas, embed, iframe, object, script, and video elements not allowed</em> -  "^<br /> | 412 |   <em>applet, audio, canvas, embed, iframe, object, script, and video elements not allowed</em> -  "^<br /> |
413 | <br /> | 413 | <br /> |
414 |   <strong>hexdec_entity</strong><br /> | 414 |   <strong>hexdec_entity</strong><br /> |
415 |   Allow hexadecimal numeric entities and do not convert to the more widely accepted decimal ones, or convert decimal to hexadecimal ones; see <a href="#s3.2">section 3.2</a><br /> | 415 |   Allow hexadecimal numeric entities and do not convert to the more widely accepted decimal ones, or convert decimal to hexadecimal ones; see <a href="#s3.2">section 3.2</a><br /> |
416 | <br /> | 416 | <br /> |
417 |   <span class="term">0</span> - no<br /> | 417 |   <span class="term">0</span> - no<br /> |
418 |   <span class="term">1</span> - yes  *<br /> | 418 |   <span class="term">1</span> - yes  *<br /> |
419 |   <span class="term">2</span> - convert decimal to hexadecimal ones<br /> | 419 |   <span class="term">2</span> - convert decimal to hexadecimal ones<br /> |
420 | <br /> | 420 | <br /> |
421 |   <strong>hook</strong><br /> | 421 |   <strong>hook</strong><br /> |
422 |   Name of an optional hook function to alter the input string, <span class="term">$config</span> or <span class="term">$spec</span> before htmLawed enters the main phase of its work; see <a href="#s3.7">section 3.7</a><br /> | 422 |   Name of an optional hook function to alter the input string, <span class="term">$config</span> or <span class="term">$spec</span> before htmLawed enters the main phase of its work; see <a href="#s3.7">section 3.7</a><br /> |
423 | <br /> | 423 | <br /> |
424 |   <span class="term">0</span> - no hook function  *<br /> | 424 |   <span class="term">0</span> - no hook function  *<br /> |
425 |   <em>name</em> - <em>name</em> is name of the hook function<br /> | 425 |   <em>name</em> - <em>name</em> is name of the hook function<br /> |
426 | <br /> | 426 | <br /> |
427 |   <strong>hook_tag</strong><br /> | 427 |   <strong>hook_tag</strong><br /> |
428 |   Name of an optional hook function to alter tag content finalized by htmLawed; see <a href="#s3.4.9">section 3.4.9</a><br /> | 428 |   Name of an optional hook function to alter tag content finalized by htmLawed; see <a href="#s3.4.9">section 3.4.9</a><br /> |
429 | <br /> | 429 | <br /> |
430 |   <span class="term">0</span> - no hook function  *<br /> | 430 |   <span class="term">0</span> - no hook function  *<br /> |
431 |   <em>name</em> - <em>name</em> is name of the hook function<br /> | 431 |   <em>name</em> - <em>name</em> is name of the hook function<br /> |
432 | <br /> | 432 | <br /> |
433 |   <strong>keep_bad</strong><br /> | 433 |   <strong>keep_bad</strong><br /> |
434 |   Neutralize <em>bad</em> tags by converting their <span class="term"><</span> and <span class="term">></span> characters to entities, or remove them; see <a href="#s3.3.3">section 3.3.3</a><br /> | 434 |   Neutralize <em>bad</em> tags by converting their <span class="term"><</span> and <span class="term">></span> characters to entities, or remove them; see <a href="#s3.3.3">section 3.3.3</a><br /> |
435 | <br /> | 435 | <br /> |
436 |   <span class="term">0</span> - remove<br /> | 436 |   <span class="term">0</span> - remove<br /> |
437 |   <span class="term">1</span> - neutralize both tags and element content<br /> | 437 |   <span class="term">1</span> - neutralize both tags and element content<br /> |
438 |   <span class="term">2</span> - remove tags but neutralize element content<br /> | 438 |   <span class="term">2</span> - remove tags but neutralize element content<br /> |
439 |   <span class="term">3</span> and <span class="term">4</span> - like <span class="term">1</span> and <span class="term">2</span> but remove if text (<span class="term">pcdata</span>) is invalid in parent element<br /> | 439 |   <span class="term">3</span> and <span class="term">4</span> - like <span class="term">1</span> and <span class="term">2</span> but remove if text (<span class="term">pcdata</span>) is invalid in parent element<br /> |
440 |   <span class="term">5</span> and <span class="term">6</span> * -  like <span class="term">3</span> and <span class="term">4</span> but line-breaks, tabs and spaces are left<br /> | 440 |   <span class="term">5</span> and <span class="term">6</span> * -  like <span class="term">3</span> and <span class="term">4</span> but line-breaks, tabs and spaces are left<br /> |
441 | <br /> | 441 | <br /> |
442 |   <strong>lc_std_val</strong><br /> | 442 |   <strong>lc_std_val</strong><br /> |
443 |   For XHTML compliance, predefined, standard attribute values, like <span class="term">get</span> for the <span class="term">method</span> attribute of <span class="term">form</span>, must be lowercased; see <a href="#s3.4.5">section 3.4.5</a><br /> | 443 |   For XHTML compliance, predefined, standard attribute values, like <span class="term">get</span> for the <span class="term">method</span> attribute of <span class="term">form</span>, must be lowercased; see <a href="#s3.4.5">section 3.4.5</a><br /> |
444 | <br /> | 444 | <br /> |
445 |   <span class="term">0</span> - no<br /> | 445 |   <span class="term">0</span> - no<br /> |
446 |   <span class="term">1</span> - yes  *<br /> | 446 |   <span class="term">1</span> - yes  *<br /> |
447 | <br /> | 447 | <br /> |
448 |   <strong>make_tag_strict</strong><br /> | 448 |   <strong>make_tag_strict</strong><br /> |
449 |   Transform or remove these deprecated HTML elements, even if they are allowed by the admin: acronym, applet, big, center, dir, font, isindex, s, strike, tt; see <a href="#s3.3.2">section 3.3.2</a><br /> | 449 |   Transform or remove these deprecated HTML elements, even if they are allowed by the admin: acronym, applet, big, center, dir, font, isindex, s, strike, tt; see <a href="#s3.3.2">section 3.3.2</a><br /> |
450 | <br /> | 450 | <br /> |
451 |   <span class="term">0</span> - no<br /> | 451 |   <span class="term">0</span> - no<br /> |
452 |   <span class="term">1</span> - yes, but leave <span class="term">applet</span> and <span class="term">isindex</span> that currently cannot be transformed  *^<br /> | 452 |   <span class="term">1</span> - yes, but leave <span class="term">applet</span> and <span class="term">isindex</span> that currently cannot be transformed  *^<br /> |
453 |   <span class="term">2</span> - yes, removing <span class="term">applet</span> and <span class="term">isindex</span> elements and their contents (nested elements remain)  ~^<br /> | 453 |   <span class="term">2</span> - yes, removing <span class="term">applet</span> and <span class="term">isindex</span> elements and their contents (nested elements remain)  ~^<br /> |
454 | <br /> | 454 | <br /> |
455 |   <strong>named_entity</strong><br /> | 455 |   <strong>named_entity</strong><br /> |
456 |   Allow non-universal named HTML entities, or convert to numeric ones; see <a href="#s3.2">section 3.2</a><br /> | 456 |   Allow non-universal named HTML entities, or convert to numeric ones; see <a href="#s3.2">section 3.2</a><br /> |
457 | <br /> | 457 | <br /> |
458 |   <span class="term">0</span> - convert<br /> | 458 |   <span class="term">0</span> - convert<br /> |
459 |   <span class="term">1</span> - allow  *<br /> | 459 |   <span class="term">1</span> - allow  *<br /> |
460 | <br /> | 460 | <br /> |
461 |   <strong>no_deprecated_attr</strong><br /> | 461 |   <strong>no_deprecated_attr</strong><br /> |
462 |   Allow deprecated attributes or transform them; see <a href="#s3.4.6">section 3.4.6</a><br /> | 462 |   Allow deprecated attributes or transform them; see <a href="#s3.4.6">section 3.4.6</a><br /> |
463 | <br /> | 463 | <br /> |
464 |   <span class="term">0</span> - allow<br /> | 464 |   <span class="term">0</span> - allow<br /> |
465 |   <span class="term">1</span> - transform, but <span class="term">name</span> attributes for <span class="term">a</span> and <span class="term">map</span> are retained  *<br /> | 465 |   <span class="term">1</span> - transform, but <span class="term">name</span> attributes for <span class="term">a</span> and <span class="term">map</span> are retained  *<br /> |
466 |   <span class="term">2</span> - transform<br /> | 466 |   <span class="term">2</span> - transform<br /> |
467 | <br /> | 467 | <br /> |
468 |   <strong>parent</strong><br /> | 468 |   <strong>parent</strong><br /> |
469 |   Name of the parent element, possibly imagined, that will hold the input; see <a href="#s3.3">section 3.3</a><br /> | 469 |   Name of the parent element, possibly imagined, that will hold the input; see <a href="#s3.3">section 3.3</a><br /> |
470 | <br /> | 470 | <br /> |
471 |   <strong>safe</strong><br /> | 471 |   <strong>safe</strong><br /> |
472 |   Magic parameter to make input the most secure against vulnerabilities like XSS without needing to specify other relevant <span class="term">$config</span> parameters; see <a href="#s3.6">section 3.6</a><br /> | 472 |   Magic parameter to make input the most secure against vulnerabilities like XSS without needing to specify other relevant <span class="term">$config</span> parameters; see <a href="#s3.6">section 3.6</a><br /> |
473 | <br /> | 473 | <br /> |
474 |   <span class="term">0</span> - no  *<br /> | 474 |   <span class="term">0</span> - no  *<br /> |
475 |   <span class="term">1</span> - will auto-adjust other relevant <span class="term">$config</span> parameters (indicated by <span class="term">"</span> in this list)  ^<br /> | 475 |   <span class="term">1</span> - will auto-adjust other relevant <span class="term">$config</span> parameters (indicated by <span class="term">"</span> in this list)  ^<br /> |
476 | <br /> | 476 | <br /> |
477 |   <strong>schemes</strong><br /> | 477 |   <strong>schemes</strong><br /> |
478 |   Array of attribute-specific, comma-separated, lower-cased list of schemes (protocols) allowed in attributes accepting URLs (or <span class="term">!</span> to <em>deny</em> any URL); <span class="term">*</span> covers all unspecified attributes; see <a href="#s3.4.3">section 3.4.3</a><br /> | 478 |   Array of attribute-specific, comma-separated, lower-cased list of schemes (protocols) allowed in attributes accepting URLs (or <span class="term">!</span> to <em>deny</em> any URL); <span class="term">*</span> covers all unspecified attributes; see <a href="#s3.4.3">section 3.4.3</a><br /> |
479 | <br /> | 479 | <br /> |
480 |   <span class="term">href: aim, app, feed, file, ftp, gopher, http, https, javascript, irc, mailto, news, nntp, sftp, ssh, tel, telnet; *:data, file, http, https, javascript</span>  *^<br /> | 480 |   <span class="term">href: aim, app, feed, file, ftp, gopher, http, https, javascript, irc, mailto, news, nntp, sftp, ssh, tel, telnet; *:data, file, http, https, javascript</span>  *^<br /> |
481 |   <span class="term">href: aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, tel, telnet; style: !; *:file, http, https</span>  "<br /> | 481 |   <span class="term">href: aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, tel, telnet; style: !; *:file, http, https</span>  "<br /> |
482 | <br /> | 482 | <br /> |
483 |   <strong>show_setting</strong><br /> | 483 |   <strong>show_setting</strong><br /> |
484 |   Name of a PHP variable to assign the <em>finalized</em> <span class="term">$config</span> and <span class="term">$spec</span> values; see <a href="#s3.8">section 3.8</a><br /> | 484 |   Name of a PHP variable to assign the <em>finalized</em> <span class="term">$config</span> and <span class="term">$spec</span> values; see <a href="#s3.8">section 3.8</a><br /> |
485 | <br /> | 485 | <br /> |
486 |   <strong>style_pass</strong><br /> | 486 |   <strong>style_pass</strong><br /> |
487 |   Ignore <span class="term">style</span> attribute values, letting them through without any alteration<br /> | 487 |   Ignore <span class="term">style</span> attribute values, letting them through without any alteration<br /> |
488 | <br /> | 488 | <br /> |
489 |   <span class="term">0</span> - no *<br /> | 489 |   <span class="term">0</span> - no *<br /> |
490 |   <span class="term">1</span> - htmLawed will let through any <span class="term">style</span> value; see <a href="#s3.4.8">section 3.4.8</a><br /> | 490 |   <span class="term">1</span> - htmLawed will let through any <span class="term">style</span> value; see <a href="#s3.4.8">section 3.4.8</a><br /> |
491 | <br /> | 491 | <br /> |
492 |   <strong>tidy</strong><br /> | 492 |   <strong>tidy</strong><br /> |
493 |   Beautify or compact HTML code; see <a href="#s3.3.5">section 3.3.5</a><br /> | 493 |   Beautify or compact HTML code; see <a href="#s3.3.5">section 3.3.5</a><br /> |
494 | <br /> | 494 | <br /> |
495 |   <span class="term">-1</span> - compact<br /> | 495 |   <span class="term">-1</span> - compact<br /> |
496 |   <span class="term">0</span> - no  *<br /> | 496 |   <span class="term">0</span> - no  *<br /> |
497 |   <span class="term">1</span> or <em>string</em> - beautify (custom format specified by <span class="term">string</span>)<br /> | 497 |   <span class="term">1</span> or <em>string</em> - beautify (custom format specified by <span class="term">string</span>)<br /> |
498 | <br /> | 498 | <br /> |
499 |   <strong>unique_ids</strong><br /> | 499 |   <strong>unique_ids</strong><br /> |
500 |   <span class="term">id</span> attribute value checks; see <a href="#s3.4.2">section 3.4.2</a><br /> | 500 |   <span class="term">id</span> attribute value checks; see <a href="#s3.4.2">section 3.4.2</a><br /> |
501 | <br /> | 501 | <br /> |
502 |   <span class="term">0</span> - no<br /> | 502 |   <span class="term">0</span> - no<br /> |
503 |   <span class="term">1</span> - remove duplicate and/or invalid ones  *<br /> | 503 |   <span class="term">1</span> - remove duplicate and/or invalid ones  *<br /> |
504 |   <em>word</em> - remove invalid ones and replace duplicate ones with new and unique ones based on the <em>word</em>; the admin-specified <em>word</em> cannot contain a space character<br /> | 504 |   <em>word</em> - remove invalid ones and replace duplicate ones with new and unique ones based on the <em>word</em>; the admin-specified <em>word</em> cannot contain a space character<br /> |
505 | <br /> | 505 | <br /> |
506 |   <strong>valid_xhtml</strong><br /> | 506 |   <strong>valid_xhtml</strong><br /> |
507 |   Magic parameter to make input the most valid XHTML without needing to specify other relevant <span class="term">$config</span> parameters; see <a href="#s3.5">section 3.5</a><br /> | 507 |   Magic parameter to make input the most valid XHTML without needing to specify other relevant <span class="term">$config</span> parameters; see <a href="#s3.5">section 3.5</a><br /> |
508 | <br /> | 508 | <br /> |
509 |   <span class="term">0</span> - no  *<br /> | 509 |   <span class="term">0</span> - no  *<br /> |
510 |   <span class="term">1</span> - will auto-adjust other relevant <span class="term">$config</span> parameters (indicated by <span class="term">~</span> in this list)<br /> | 510 |   <span class="term">1</span> - will auto-adjust other relevant <span class="term">$config</span> parameters (indicated by <span class="term">~</span> in this list)<br /> |
511 | <br /> | 511 | <br /> |
512 |   <strong>xml:lang</strong><br /> | 512 |   <strong>xml:lang</strong><br /> |
513 |   Auto-add <span class="term">xml:lang</span> attribute; see <a href="#s3.4.1">section 3.4.1</a><br /> | 513 |   Auto-add <span class="term">xml:lang</span> attribute; see <a href="#s3.4.1">section 3.4.1</a><br /> |
514 | <br /> | 514 | <br /> |
515 |   <span class="term">0</span> - no  *<br /> | 515 |   <span class="term">0</span> - no  *<br /> |
516 |   <span class="term">1</span> - add if <span class="term">lang</span> attribute is present<br /> | 516 |   <span class="term">1</span> - add if <span class="term">lang</span> attribute is present<br /> |
517 |   <span class="term">2</span> - add if <span class="term">lang</span> attribute is present, and remove <span class="term">lang</span>  ~<br /> | 517 |   <span class="term">2</span> - add if <span class="term">lang</span> attribute is present, and remove <span class="term">lang</span>  ~<br /> |
518 | 518 | ||
519 | </div> | 519 | </div> |
520 | <div class="sub-section"><h3> | 520 | <div class="sub-section"><h3> |
521 | <a name="s2.3" id="s2.3"></a><span class="item-no">2.3</span>  Extra HTML specifications using the $spec parameter | 521 | <a name="s2.3" id="s2.3"></a><span class="item-no">2.3</span>  Extra HTML specifications using the $spec parameter |
522 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 522 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
523 | <br /> | 523 | <br /> |
524 |   The <span class="term">$spec</span> argument of htmLawed can be used to disallow an otherwise legal attribute for an element, or to restrict the attribute's values. This can also be helpful as a security measure (e.g., in certain versions of browsers, certain values can cause buffer overflows and denial of service attacks), or in enforcing admin policies. <span class="term">$spec</span> is specified as a string of text containing one or more <em>rules</em>, with multiple rules separated from each other by a semi-colon (<span class="term">;</span>). E.g.,<br /> | 524 |   The <span class="term">$spec</span> argument of htmLawed can be used to disallow an otherwise legal attribute for an element, or to restrict the attribute's values. This can also be helpful as a security measure (e.g., in certain versions of browsers, certain values can cause buffer overflows and denial of service attacks), or in enforcing admin policies. <span class="term">$spec</span> is specified as a string of text containing one or more <em>rules</em>, with multiple rules separated from each other by a semi-colon (<span class="term">;</span>). E.g.,<br /> |
525 | <br /> | 525 | <br /> |
526 | 526 | ||
527 | <code class="code">    $spec = 'i=-*; td, tr=style, id, -*; a=id(match="/[a-z][a-z\d.:\-`"]*/i"/minval=2), href(maxlen=100/minlen=34); img=-width,-alt';</code> | 527 | <code class="code">    $spec = 'i=-*; td, tr=style, id, -*; a=id(match="/[a-z][a-z\d.:\-`"]*/i"/minval=2), href(maxlen=100/minlen=34); img=-width,-alt';</code> |
528 | <br /> | 528 | <br /> |
529 | 529 | ||
530 | <code class="code">    $processed = htmLawed($text, $config, $spec);</code> | 530 | <code class="code">    $processed = htmLawed($text, $config, $spec);</code> |
531 | <br /> | 531 | <br /> |
532 | <br /> | 532 | <br /> |
533 |   Or,<br /> | 533 |   Or,<br /> |
534 | <br /> | 534 | <br /> |
535 | 535 | ||
536 | <code class="code">    $processed = htmLawed($text, $config, 'i=-*; td, tr=style, id, -*; a=id(match="/[a-z][a-z\d.:\-`"]*/i"/minval=2), href(maxlen=100/minlen=34); img=-width,-alt');</code> | 536 | <code class="code">    $processed = htmLawed($text, $config, 'i=-*; td, tr=style, id, -*; a=id(match="/[a-z][a-z\d.:\-`"]*/i"/minval=2), href(maxlen=100/minlen=34); img=-width,-alt');</code> |
537 | <br /> | 537 | <br /> |
538 | <br /> | 538 | <br /> |
539 |   A rule begins with an HTML <strong>element</strong> name(s) (<em>rule-element</em>), for which the rule applies, followed by an equal-to (=) sign. A rule-element may represent multiple elements if comma (,)-separated element names are used. E.g., <span class="term">th,td,tr=</span>.<br /> | 539 |   A rule begins with an HTML <strong>element</strong> name(s) (<em>rule-element</em>), for which the rule applies, followed by an equal-to (=) sign. A rule-element may represent multiple elements if comma (,)-separated element names are used. E.g., <span class="term">th,td,tr=</span>.<br /> |
540 | <br /> | 540 | <br /> |
541 |   Rest of the rule consists of comma-separated HTML <strong>attribute names</strong>. A minus (-) character before an attribute means that the attribute is not permitted inside the rule-element. E.g., <span class="term">-width</span>. To deny all attributes, <span class="term">-*</span> can be used.<br /> | 541 |   Rest of the rule consists of comma-separated HTML <strong>attribute names</strong>. A minus (-) character before an attribute means that the attribute is not permitted inside the rule-element. E.g., <span class="term">-width</span>. To deny all attributes, <span class="term">-*</span> can be used.<br /> |
542 | <br /> | 542 | <br /> |
543 |   Following shows examples of rule excerpts with rule-element <span class="term">a</span> and the attributes that are being permitted:<br /> | 543 |   Following shows examples of rule excerpts with rule-element <span class="term">a</span> and the attributes that are being permitted:<br /> |
544 | <br /> | 544 | <br /> |
545 |   *  <span class="term">a=</span> - all<br /> | 545 |   *  <span class="term">a=</span> - all<br /> |
546 |   *  <span class="term">a=id</span> - all<br /> | 546 |   *  <span class="term">a=id</span> - all<br /> |
547 |   *  <span class="term">a=href, title, -id, -onclick</span> - all except <span class="term">id</span> and <span class="term">onclick</span><br /> | 547 |   *  <span class="term">a=href, title, -id, -onclick</span> - all except <span class="term">id</span> and <span class="term">onclick</span><br /> |
548 |   *  <span class="term">a=*, id, -id</span> - all except <span class="term">id</span><br /> | 548 |   *  <span class="term">a=*, id, -id</span> - all except <span class="term">id</span><br /> |
549 |   *  <span class="term">a=-*</span> - none<br /> | 549 |   *  <span class="term">a=-*</span> - none<br /> |
550 |   *  <span class="term">a=-*, href, title</span> - none except <span class="term">href</span> and <span class="term">title</span><br /> | 550 |   *  <span class="term">a=-*, href, title</span> - none except <span class="term">href</span> and <span class="term">title</span><br /> |
551 |   *  <span class="term">a=-*, -id, href, title</span> - none except <span class="term">href</span> and <span class="term">title</span><br /> | 551 |   *  <span class="term">a=-*, -id, href, title</span> - none except <span class="term">href</span> and <span class="term">title</span><br /> |
552 | <br /> | 552 | <br /> |
553 |   Rules regarding <strong>attribute values</strong> are optionally specified inside round brackets after attribute names in solidus (/)-separated <em>parameter = value</em> pairs. E.g., <span class="term">title(maxlen=30/minlen=5)</span>. None or one or more of the following parameters may be specified:<br /> | 553 |   Rules regarding <strong>attribute values</strong> are optionally specified inside round brackets after attribute names in solidus (/)-separated <em>parameter = value</em> pairs. E.g., <span class="term">title(maxlen=30/minlen=5)</span>. None or one or more of the following parameters may be specified:<br /> |
554 | <br /> | 554 | <br /> |
555 |   *  <span class="term">oneof</span> - one or more choices separated by <span class="term">|</span> that the value should match; if only one choice is provided, then the value must match that choice; matching is case-sensitive<br /> | 555 |   *  <span class="term">oneof</span> - one or more choices separated by <span class="term">|</span> that the value should match; if only one choice is provided, then the value must match that choice; matching is case-sensitive<br /> |
556 | <br /> | 556 | <br /> |
557 |   *  <span class="term">noneof</span> - one or more choices separated by <span class="term">|</span> that the value should not match; matching is case-sensitive<br /> | 557 |   *  <span class="term">noneof</span> - one or more choices separated by <span class="term">|</span> that the value should not match; matching is case-sensitive<br /> |
558 | <br /> | 558 | <br /> |
559 |   *  <span class="term">maxlen</span> and <span class="term">minlen</span> - upper and lower limits for the number of characters in the attribute value; specified in numbers<br /> | 559 |   *  <span class="term">maxlen</span> and <span class="term">minlen</span> - upper and lower limits for the number of characters in the attribute value; specified in numbers<br /> |
560 | <br /> | 560 | <br /> |
561 |   *  <span class="term">maxval</span> and <span class="term">minval</span> - upper and lower limits for the numerical value specified in the attribute value; specified in numbers<br /> | 561 |   *  <span class="term">maxval</span> and <span class="term">minval</span> - upper and lower limits for the numerical value specified in the attribute value; specified in numbers<br /> |
562 | <br /> | 562 | <br /> |
563 |   *  <span class="term">match</span> and <span class="term">nomatch</span> - pattern that the attribute value should or should not match; specified as PHP/PCRE-compatible regular expressions with delimiters and possibly modifiers (e.g., to specify case-sensitivity for matching)<br /> | 563 |   *  <span class="term">match</span> and <span class="term">nomatch</span> - pattern that the attribute value should or should not match; specified as PHP/PCRE-compatible regular expressions with delimiters and possibly modifiers (e.g., to specify case-sensitivity for matching)<br /> |
564 | <br /> | 564 | <br /> |
565 |   *  <span class="term">default</span> - a value to force on the attribute if the value provided by the writer does not fit any of the specified parameters<br /> | 565 |   *  <span class="term">default</span> - a value to force on the attribute if the value provided by the writer does not fit any of the specified parameters<br /> |
566 | <br /> | 566 | <br /> |
567 |   If <span class="term">default</span> is not set and the attribute value does not satisfy any of the specified parameters, then the attribute is removed. The <span class="term">default</span> value can also be used to force all attribute declarations to take the same value (by getting the values declared illegal by setting, e.g., <span class="term">maxlen</span> to <span class="term">-1</span>).<br /> | 567 |   If <span class="term">default</span> is not set and the attribute value does not satisfy any of the specified parameters, then the attribute is removed. The <span class="term">default</span> value can also be used to force all attribute declarations to take the same value (by getting the values declared illegal by setting, e.g., <span class="term">maxlen</span> to <span class="term">-1</span>).<br /> |
568 | <br /> | 568 | <br /> |
569 |   Examples with <em>input</em> <span class="term"><input title="WIDTH" value="10em" /><input title="length" value="5" class="ic1 ic2" /></span> are shown below.<br /> | 569 |   Examples with <em>input</em> <span class="term"><input title="WIDTH" value="10em" /><input title="length" value="5" class="ic1 ic2" /></span> are shown below.<br /> |
570 | <br /> | 570 | <br /> |
571 |   <em>Rule</em>: <span class="term">input=title(maxlen=60/minlen=6), value</span><br /> | 571 |   <em>Rule</em>: <span class="term">input=title(maxlen=60/minlen=6), value</span><br /> |
572 |   <em>Output</em>: <span class="term"><input value="10em" /><input title="length" value="5" class="ic1 ic2" /></span><br /> | 572 |   <em>Output</em>: <span class="term"><input value="10em" /><input title="length" value="5" class="ic1 ic2" /></span><br /> |
573 | <br /> | 573 | <br /> |
574 |   <em>Rule</em>: <span class="term">input=title(), value(maxval=8/default=6)</span><br /> | 574 |   <em>Rule</em>: <span class="term">input=title(), value(maxval=8/default=6)</span><br /> |
575 |   <em>Output</em>: <span class="term"><input title="WIDTH" value="6" /><input title="length" value="5" class="ic1 ic2" /></span><br /> | 575 |   <em>Output</em>: <span class="term"><input title="WIDTH" value="6" /><input title="length" value="5" class="ic1 ic2" /></span><br /> |
576 | <br /> | 576 | <br /> |
577 |   <em>Rule</em>: <span class="term">input=title(nomatch=%w.d%i), value(match=%em%/default=6em)</span><br /> | 577 |   <em>Rule</em>: <span class="term">input=title(nomatch=%w.d%i), value(match=%em%/default=6em)</span><br /> |
578 |   <em>Output</em>: <span class="term"><input value="10em" /><input title="length" value="6em" class="ic1 ic2" /></span><br /> | 578 |   <em>Output</em>: <span class="term"><input value="10em" /><input title="length" value="6em" class="ic1 ic2" /></span><br /> |
579 | <br /> | 579 | <br /> |
580 |   <em>Rule</em>: <span class="term">input=class(noneof=ic2|ic3/oneof=ic1|ic4), title(oneof=height|depth/default=depth), value(noneof=5|6)</span><br /> | 580 |   <em>Rule</em>: <span class="term">input=class(noneof=ic2|ic3/oneof=ic1|ic4), title(oneof=height|depth/default=depth), value(noneof=5|6)</span><br /> |
581 |   <em>Output</em>: <span class="term"><input title="depth" value="10em" /><input title="depth" class="ic1" /></span><br /> | 581 |   <em>Output</em>: <span class="term"><input title="depth" value="10em" /><input title="depth" class="ic1" /></span><br /> |
582 | <br /> | 582 | <br /> |
583 |   <strong>Special characters</strong>: The characters <span class="term">;</span>, <span class="term">,</span>, <span class="term">/</span>, <span class="term">(</span>, <span class="term">)</span>, <span class="term">|</span>, <span class="term">~</span> and space have special meanings in the rules. Words in the rules that use such characters, or the characters themselves, should be <em>escaped</em> by enclosing in pairs of double-quotes (<span class="term">"</span>). A back-tick (<span class="term">`</span>) can be used to escape a literal <span class="term">"</span>. An example rule illustrating this is <span class="term">input=value(maxlen=30/match="/^\w/"/default="your `"ID`"")</span>.<br /> | 583 |   <strong>Special characters</strong>: The characters <span class="term">;</span>, <span class="term">,</span>, <span class="term">/</span>, <span class="term">(</span>, <span class="term">)</span>, <span class="term">|</span>, <span class="term">~</span> and space have special meanings in the rules. Words in the rules that use such characters, or the characters themselves, should be <em>escaped</em> by enclosing in pairs of double-quotes (<span class="term">"</span>). A back-tick (<span class="term">`</span>) can be used to escape a literal <span class="term">"</span>. An example rule illustrating this is <span class="term">input=value(maxlen=30/match="/^\w/"/default="your `"ID`"")</span>.<br /> |
584 | <br /> | 584 | <br /> |
585 |   <strong>Attributes that accept multiple values</strong>: If an attribute is <span class="term">accesskey</span>, <span class="term">class</span>, <span class="term">itemtype</span> or <span class="term">rel</span>, which can have multiple, space-separated values, or <span class="term">srcset</span>, which can have multiple, comma-separated values, htmLawed will parse the attribute value for such multiple values and will individually test each of them.<br /> | 585 |   <strong>Attributes that accept multiple values</strong>: If an attribute is <span class="term">accesskey</span>, <span class="term">class</span>, <span class="term">itemtype</span> or <span class="term">rel</span>, which can have multiple, space-separated values, or <span class="term">srcset</span>, which can have multiple, comma-separated values, htmLawed will parse the attribute value for such multiple values and will individually test each of them.<br /> |
586 | <br /> | 586 | <br /> |
587 |   <strong>Note</strong>: To deny an attribute for all elements for which it is legal, <span class="term">$config["deny_attribute"]</span> (see <a href="#s3.4">section 3.4</a>) can be used instead of <span class="term">$spec</span>. Also, attributes can be allowed element-specifically through <span class="term">$spec</span> while being denied globally through <span class="term">$config["deny_attribute"]</span>. The <span class="term">hook_tag</span> parameter (<a href="#s3.4.9">section 3.4.9</a>) can also be possibly used to implement a functionality like that achieved using <span class="term">$spec</span> functionality.<br /> | 587 |   <strong>Note</strong>: To deny an attribute for all elements for which it is legal, <span class="term">$config["deny_attribute"]</span> (see <a href="#s3.4">section 3.4</a>) can be used instead of <span class="term">$spec</span>. Also, attributes can be allowed element-specifically through <span class="term">$spec</span> while being denied globally through <span class="term">$config["deny_attribute"]</span>. The <span class="term">hook_tag</span> parameter (<a href="#s3.4.9">section 3.4.9</a>) can also be possibly used to implement a functionality like that achieved using <span class="term">$spec</span> functionality.<br /> |
588 | <br /> | 588 | <br /> |
589 |   <strong>Note</strong>: Attributes' specifications for an element may be set through multiple rules. In case of conflict, the attribute specification in the first rule will get precedence.<br /> | 589 |   <strong>Note</strong>: Attributes' specifications for an element may be set through multiple rules. In case of conflict, the attribute specification in the first rule will get precedence.<br /> |
590 | <br /> | 590 | <br /> |
591 |   <span class="term">$spec</span> can also be used to permit custom, non-standard attributes as well as custom rules for standard attributes. Thus, the following value of <span class="term">$spec</span> will permit the custom uses of the standard <span class="term">rel</span> attribute in <span class="term">input</span> (not permitted as per standards) and of a non-standard attribute, <span class="term">vFlag</span>, in <span class="term">img</span>.<br /> | 591 |   <span class="term">$spec</span> can also be used to permit custom, non-standard attributes as well as custom rules for standard attributes. Thus, the following value of <span class="term">$spec</span> will permit the custom uses of the standard <span class="term">rel</span> attribute in <span class="term">input</span> (not permitted as per standards) and of a non-standard attribute, <span class="term">vFlag</span>, in <span class="term">img</span>.<br /> |
592 | <br /> | 592 | <br /> |
593 | 593 | ||
594 | <code class="code">    $spec = 'img=vFlag; input=rel'</code> | 594 | <code class="code">    $spec = 'img=vFlag; input=rel'</code> |
595 | <br /> | 595 | <br /> |
596 | <br /> | 596 | <br /> |
597 |   The attribute names must begin with an alphabet and cannot have space, equal-to (=) and solidus (/) characters.<br /> | 597 |   The attribute names must begin with an alphabet and cannot have space, equal-to (=) and solidus (/) characters.<br /> |
598 | 598 | ||
599 | </div> | 599 | </div> |
600 | <div class="sub-section"><h3> | 600 | <div class="sub-section"><h3> |
601 | <a name="s2.4" id="s2.4"></a><span class="item-no">2.4</span>  Performance time & memory usage | 601 | <a name="s2.4" id="s2.4"></a><span class="item-no">2.4</span>  Performance time & memory usage |
602 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 602 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
603 | <br /> | 603 | <br /> |
604 |   The time and memory consumed during text processing by htmLawed depends on its configuration, the size of the input, and the amount, nestedness and well-formedness of the HTML markup within the input. In particular, tag balancing and beautification each can increase the processing time by about a quarter.<br /> | 604 |   The time and memory consumed during text processing by htmLawed depends on its configuration, the size of the input, and the amount, nestedness and well-formedness of the HTML markup within the input. In particular, tag balancing and beautification each can increase the processing time by about a quarter.<br /> |
605 | <br /> | 605 | <br /> |
606 |   The htmLawed <a href="htmLawedTest.php">demo</a> can be used to evaluate the performance and effects of different types of input and <span class="term">$config</span>.<br /> | 606 |   The htmLawed <a href="htmLawedTest.php">demo</a> can be used to evaluate the performance and effects of different types of input and <span class="term">$config</span>.<br /> |
607 | 607 | ||
608 | </div> | 608 | </div> |
609 | <div class="sub-section"><h3> | 609 | <div class="sub-section"><h3> |
610 | <a name="s2.5" id="s2.5"></a><span class="item-no">2.5</span>  Some security risks to keep in mind | 610 | <a name="s2.5" id="s2.5"></a><span class="item-no">2.5</span>  Some security risks to keep in mind |
611 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 611 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
612 | <br /> | 612 | <br /> |
613 |   When setting the parameters/arguments (like those to allow certain HTML elements) for use with htmLawed, one should bear in mind that the setting may let through potentially <em>dangerous</em> HTML code which is meant to steal user-data, deface a website, render a page non-functional, etc. Unless end-users, either people or software, supplying the content are completely trusted, security issues arising from the degree of HTML usage permitted through htmLawed's setting should be considered. For example, following increase security risks:<br /> | 613 |   When setting the parameters/arguments (like those to allow certain HTML elements) for use with htmLawed, one should bear in mind that the setting may let through potentially <em>dangerous</em> HTML code which is meant to steal user-data, deface a website, render a page non-functional, etc. Unless end-users, either people or software, supplying the content are completely trusted, security issues arising from the degree of HTML usage permitted through htmLawed's setting should be considered. For example, following increase security risks:<br /> |
614 | <br /> | 614 | <br /> |
615 |   *  Allowing <span class="term">script</span>, <span class="term">applet</span>, <span class="term">embed</span>, <span class="term">iframe</span>, <span class="term">canvas</span>, <span class="term">audio</span>, <span class="term">video</span> or <span class="term">object</span> elements, or certain of their attributes like <span class="term">allowscriptaccess</span><br /> | 615 |   *  Allowing <span class="term">script</span>, <span class="term">applet</span>, <span class="term">embed</span>, <span class="term">iframe</span>, <span class="term">canvas</span>, <span class="term">audio</span>, <span class="term">video</span> or <span class="term">object</span> elements, or certain of their attributes like <span class="term">allowscriptaccess</span><br /> |
616 | <br /> | 616 | <br /> |
617 |   *  Allowing HTML comments (some Internet Explorer versions are vulnerable with, e.g., <span class="term"><!--[if gte IE 4]><script>alert("xss");</script><![endif]--></span><br /> | 617 |   *  Allowing HTML comments (some Internet Explorer versions are vulnerable with, e.g., <span class="term"><!--[if gte IE 4]><script>alert("xss");</script><![endif]--></span><br /> |
618 | <br /> | 618 | <br /> |
619 |   *  Allowing dynamic CSS expressions (some Internet Explorer versions are vulnerable)<br /> | 619 |   *  Allowing dynamic CSS expressions (some Internet Explorer versions are vulnerable)<br /> |
620 | <br /> | 620 | <br /> |
621 |   *  Allowing the <span class="term">style</span> attribute<br /> | 621 |   *  Allowing the <span class="term">style</span> attribute<br /> |
622 | <br /> | 622 | <br /> |
623 |   To remove <em>unsecure</em> HTML, code-developers using htmLawed must set <span class="term">$config</span> appropriately. E.g., <span class="term">$config["elements"] = "* -script"</span> to deny the <span class="term">script</span> element (<a href="#s3.3">section 3.3</a>), <span class="term">$config["safe"] = 1</span> to auto-configure ceratin htmLawed parameters for maximizing security (<a href="#s3.6">section 3.6</a>), etc.<br /> | 623 |   To remove <em>unsecure</em> HTML, code-developers using htmLawed must set <span class="term">$config</span> appropriately. E.g., <span class="term">$config["elements"] = "* -script"</span> to deny the <span class="term">script</span> element (<a href="#s3.3">section 3.3</a>), <span class="term">$config["safe"] = 1</span> to auto-configure ceratin htmLawed parameters for maximizing security (<a href="#s3.6">section 3.6</a>), etc.<br /> |
624 | <br /> | 624 | <br /> |
625 |   Permitting the <span class="term">*style*</span> attribute brings in risks of <em>click-jacking</em>, <em>phishing</em>, web-page overlays, etc., <em>even</em> when the <span class="term">safe</span> parameter is enabled (see <a href="#s3.6">section 3.6</a>). Except for URLs and a few other things like CSS dynamic expressions, htmLawed currently does not check every CSS style property. It does provide ways for the code-developer implementing htmLawed to do such checks through htmLawed's <span class="term">$spec</span> argument, and through the <span class="term">hook_tag</span> parameter (see <a href="#s3.4.8">section 3.4.8</a> for more). Disallowing <span class="term">style</span> completely and relying on CSS classes and stylesheet files is recommended.<br /> | 625 |   Permitting the <span class="term">*style*</span> attribute brings in risks of <em>click-jacking</em>, <em>phishing</em>, web-page overlays, etc., <em>even</em> when the <span class="term">safe</span> parameter is enabled (see <a href="#s3.6">section 3.6</a>). Except for URLs and a few other things like CSS dynamic expressions, htmLawed currently does not check every CSS style property. It does provide ways for the code-developer implementing htmLawed to do such checks through htmLawed's <span class="term">$spec</span> argument, and through the <span class="term">hook_tag</span> parameter (see <a href="#s3.4.8">section 3.4.8</a> for more). Disallowing <span class="term">style</span> completely and relying on CSS classes and stylesheet files is recommended.<br /> |
626 | <br /> | 626 | <br /> |
627 |   htmLawed does not check or correct the character <strong>encoding</strong> of the input it receives. In conjunction with permissive circumstances, such as when the character encoding is left undefined through HTTP headers or HTML <span class="term">meta</span> tags, this can allow for an exploit (like Google's <em>UTF-7/XSS</em> vulnerability of the past).<br /> | 627 |   htmLawed does not check or correct the character <strong>encoding</strong> of the input it receives. In conjunction with permissive circumstances, such as when the character encoding is left undefined through HTTP headers or HTML <span class="term">meta</span> tags, this can allow for an exploit (like Google's <em>UTF-7/XSS</em> vulnerability of the past).<br /> |
628 | <br /> | 628 | <br /> |
629 |   Ocassionally, though very rarely, the default settings with which htmLawed runs may change between different versions of htmLawed. Admins should keep this in mind when upgrading htmLawed. Important changes in htmLawed's default behavior in new releases of the software are noted in <a href="#s4.5">section 4.5</a> on upgrades.<br /> | 629 |   Ocassionally, though very rarely, the default settings with which htmLawed runs may change between different versions of htmLawed. Admins should keep this in mind when upgrading htmLawed. Important changes in htmLawed's default behavior in new releases of the software are noted in <a href="#s4.5">section 4.5</a> on upgrades.<br /> |
630 | 630 | ||
631 | </div> | 631 | </div> |
632 | <div class="sub-section"><h3> | 632 | <div class="sub-section"><h3> |
633 | <a name="s2.6" id="s2.6"></a><span class="item-no">2.6</span>  Use with <span class="term">kses()</span> code | 633 | <a name="s2.6" id="s2.6"></a><span class="item-no">2.6</span>  Use with <span class="term">kses()</span> code |
634 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 634 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
635 | <br /> | 635 | <br /> |
636 |   The <span class="term">Kses</span> PHP script for HTML filtering is used by many applications (like <span class="term">WordPress</span>, as in year 2012). It is possible to have such applications use htmLawed instead, since it is compatible with code that calls the <span class="term">kses()</span> function declared in the <span class="term">Kses</span> file (usually named <span class="term">kses.php</span>). E.g., application code like this will continue to work after replacing <span class="term">Kses</span> with htmLawed:<br /> | 636 |   The <span class="term">Kses</span> PHP script for HTML filtering is used by many applications (like <span class="term">WordPress</span>, as in year 2012). It is possible to have such applications use htmLawed instead, since it is compatible with code that calls the <span class="term">kses()</span> function declared in the <span class="term">Kses</span> file (usually named <span class="term">kses.php</span>). E.g., application code like this will continue to work after replacing <span class="term">Kses</span> with htmLawed:<br /> |
637 | <br /> | 637 | <br /> |
638 | 638 | ||
639 | <code class="code">    $comment_filtered = kses($comment_input, array('a'=>array(), 'b'=>array(), 'i'=>array()));</code> | 639 | <code class="code">    $comment_filtered = kses($comment_input, array('a'=>array(), 'b'=>array(), 'i'=>array()));</code> |
640 | <br /> | 640 | <br /> |
641 | <br /> | 641 | <br /> |
642 |   If the application uses a <span class="term">Kses</span> file that has the <span class="term">kses()</span> function declared, then, to have the application use htmLawed instead of <span class="term">Kses</span>, rename <span class="term">htmLawed.php</span> (to <span class="term">kses.php</span>, e.g.) and replace the <span class="term">Kses</span> file (or just replace the code in the <span class="term">Kses</span> file with the htmLawed code). If the <span class="term">kses()</span> function in the <span class="term">Kses</span> file had been renamed by the application developer (e.g., in <span class="term">WordPress</span>, it is named <span class="term">wp_kses()</span>), then appropriately rename the <span class="term">kses()</span> function in the htmLawed code. Then, add the following code (which was a part of htmLawed prior to version 1.2):<br /> | 642 |   If the application uses a <span class="term">Kses</span> file that has the <span class="term">kses()</span> function declared, then, to have the application use htmLawed instead of <span class="term">Kses</span>, rename <span class="term">htmLawed.php</span> (to <span class="term">kses.php</span>, e.g.) and replace the <span class="term">Kses</span> file (or just replace the code in the <span class="term">Kses</span> file with the htmLawed code). If the <span class="term">kses()</span> function in the <span class="term">Kses</span> file had been renamed by the application developer (e.g., in <span class="term">WordPress</span>, it is named <span class="term">wp_kses()</span>), then appropriately rename the <span class="term">kses()</span> function in the htmLawed code. Then, add the following code (which was a part of htmLawed prior to version 1.2):<br /> |
643 | <br /> | 643 | <br /> |
644 | 644 | ||
645 | <code class="code">    // kses compatibility</code> | 645 | <code class="code">    // kses compatibility</code> |
646 | <br /> | 646 | <br /> |
647 | 647 | ||
648 | <code class="code">    function kses($t, $h, $p=array('http', 'https', 'ftp', 'news', 'nntp', 'telnet', 'gopher', 'mailto')){</code> | 648 | <code class="code">    function kses($t, $h, $p=array('http', 'https', 'ftp', 'news', 'nntp', 'telnet', 'gopher', 'mailto')){</code> |
649 | <br /> | 649 | <br /> |
650 | 650 | ||
651 | <code class="code">     foreach($h as $k=>$v){</code> | 651 | <code class="code">     foreach($h as $k=>$v){</code> |
652 | <br /> | 652 | <br /> |
653 | 653 | ||
654 | <code class="code">      $h[$k]['n']['*'] = 1;</code> | 654 | <code class="code">      $h[$k]['n']['*'] = 1;</code> |
655 | <br /> | 655 | <br /> |
656 | 656 | ||
657 | <code class="code">     }</code> | 657 | <code class="code">     }</code> |
658 | <br /> | 658 | <br /> |
659 | 659 | ||
660 | <code class="code">     $C['cdata'] = $C['comment'] = $C['make_tag_strict'] = $C['no_deprecated_attr'] = $C['unique_ids'] = 0;</code> | 660 | <code class="code">     $C['cdata'] = $C['comment'] = $C['make_tag_strict'] = $C['no_deprecated_attr'] = $C['unique_ids'] = 0;</code> |
661 | <br /> | 661 | <br /> |
662 | 662 | ||
663 | <code class="code">     $C['keep_bad'] = 1;</code> | 663 | <code class="code">     $C['keep_bad'] = 1;</code> |
664 | <br /> | 664 | <br /> |
665 | 665 | ||
666 | <code class="code">     $C['elements'] = count($h) ? strtolower(implode(',', array_keys($h))) : '-*';</code> | 666 | <code class="code">     $C['elements'] = count($h) ? strtolower(implode(',', array_keys($h))) : '-*';</code> |
667 | <br /> | 667 | <br /> |
668 | 668 | ||
669 | <code class="code">     $C['hook'] = 'kses_hook';</code> | 669 | <code class="code">     $C['hook'] = 'kses_hook';</code> |
670 | <br /> | 670 | <br /> |
671 | 671 | ||
672 | <code class="code">     $C['schemes'] = '*:'. implode(',', $p);</code> | 672 | <code class="code">     $C['schemes'] = '*:'. implode(',', $p);</code> |
673 | <br /> | 673 | <br /> |
674 | 674 | ||
675 | <code class="code">     return htmLawed($t, $C, $h);</code> | 675 | <code class="code">     return htmLawed($t, $C, $h);</code> |
676 | <br /> | 676 | <br /> |
677 | 677 | ||
678 | <code class="code">     }</code> | 678 | <code class="code">     }</code> |
679 | <br /> | 679 | <br /> |
680 | <br /> | 680 | <br /> |
681 | 681 | ||
682 | <code class="code">    function kses_hook($t, &$C, &$S){</code> | 682 | <code class="code">    function kses_hook($t, &$C, &$S){</code> |
683 | <br /> | 683 | <br /> |
684 | 684 | ||
685 | <code class="code">     return $t;</code> | 685 | <code class="code">     return $t;</code> |
686 | <br /> | 686 | <br /> |
687 | 687 | ||
688 | <code class="code">    }</code> | 688 | <code class="code">    }</code> |
689 | <br /> | 689 | <br /> |
690 | <br /> | 690 | <br /> |
691 |   If the <span class="term">Kses</span> file used by the application has been significantly altered by the application developers, then one may need a different approach. E.g., with <span class="term">WordPress</span> (as in the year 2012), it is best to copy the htmLawed code, along with the above-mentioned additions, to <span class="term">wp_includes/kses.php</span>, rename the newly added function <span class="term">kses()</span> to <span class="term">wp_kses()</span>, and delete the code for the original <span class="term">wp_kses()</span> function.<br /> | 691 |   If the <span class="term">Kses</span> file used by the application has been significantly altered by the application developers, then one may need a different approach. E.g., with <span class="term">WordPress</span> (as in the year 2012), it is best to copy the htmLawed code, along with the above-mentioned additions, to <span class="term">wp_includes/kses.php</span>, rename the newly added function <span class="term">kses()</span> to <span class="term">wp_kses()</span>, and delete the code for the original <span class="term">wp_kses()</span> function.<br /> |
692 | <br /> | 692 | <br /> |
693 |   If the <span class="term">Kses</span> code has a non-empty hook function (e.g., <span class="term">wp_kses_hook()</span> in case of <span class="term">WordPress</span>), then the code for htmLawed's <span class="term">kses_hook()</span> function should be appropriately edited. However, the requirement of the hook function should be re-evaluated considering that htmLawed has extra capabilities. With <span class="term">WordPress</span>, the hook function is an essential one. The following code is suggested for the htmLawed <span class="term">kses_hook()</span> in case of <span class="term">WordPress</span>:<br /> | 693 |   If the <span class="term">Kses</span> code has a non-empty hook function (e.g., <span class="term">wp_kses_hook()</span> in case of <span class="term">WordPress</span>), then the code for htmLawed's <span class="term">kses_hook()</span> function should be appropriately edited. However, the requirement of the hook function should be re-evaluated considering that htmLawed has extra capabilities. With <span class="term">WordPress</span>, the hook function is an essential one. The following code is suggested for the htmLawed <span class="term">kses_hook()</span> in case of <span class="term">WordPress</span>:<br /> |
694 | <br /> | 694 | <br /> |
695 | 695 | ||
696 | <code class="code">    // kses compatibility</code> | 696 | <code class="code">    // kses compatibility</code> |
697 | <br /> | 697 | <br /> |
698 | 698 | ||
699 | <code class="code">    function kses_hook($string, &$cf, &$spec){</code> | 699 | <code class="code">    function kses_hook($string, &$cf, &$spec){</code> |
700 | <br /> | 700 | <br /> |
701 | 701 | ||
702 | <code class="code">     $allowed_html = $spec;</code> | 702 | <code class="code">     $allowed_html = $spec;</code> |
703 | <br /> | 703 | <br /> |
704 | 704 | ||
705 | <code class="code">     $allowed_protocols = array();</code> | 705 | <code class="code">     $allowed_protocols = array();</code> |
706 | <br /> | 706 | <br /> |
707 | 707 | ||
708 | <code class="code">     foreach($cf['schemes'] as $v){</code> | 708 | <code class="code">     foreach($cf['schemes'] as $v){</code> |
709 | <br /> | 709 | <br /> |
710 | 710 | ||
711 | <code class="code">      foreach($v as $k2=>$v2){</code> | 711 | <code class="code">      foreach($v as $k2=>$v2){</code> |
712 | <br /> | 712 | <br /> |
713 | 713 | ||
714 | <code class="code">       if(!in_array($k2, $allowed_protocols)){</code> | 714 | <code class="code">       if(!in_array($k2, $allowed_protocols)){</code> |
715 | <br /> | 715 | <br /> |
716 | 716 | ||
717 | <code class="code">        $allowed_protocols[] = $k2;</code> | 717 | <code class="code">        $allowed_protocols[] = $k2;</code> |
718 | <br /> | 718 | <br /> |
719 | 719 | ||
720 | <code class="code">       }</code> | 720 | <code class="code">       }</code> |
721 | <br /> | 721 | <br /> |
722 | 722 | ||
723 | <code class="code">      }</code> | 723 | <code class="code">      }</code> |
724 | <br /> | 724 | <br /> |
725 | 725 | ||
726 | <code class="code">     }</code> | 726 | <code class="code">     }</code> |
727 | <br /> | 727 | <br /> |
728 | 728 | ||
729 | <code class="code">     return wp_kses_hook($string, $allowed_html, $allowed_protocols);</code> | 729 | <code class="code">     return wp_kses_hook($string, $allowed_html, $allowed_protocols);</code> |
730 | <br /> | 730 | <br /> |
731 | 731 | ||
732 | <code class="code">    }</code> | 732 | <code class="code">    }</code> |
733 | <br /> | 733 | <br /> |
734 | 734 | ||
735 | </div> | 735 | </div> |
736 | <div class="sub-section"><h3> | 736 | <div class="sub-section"><h3> |
737 | <a name="s2.7" id="s2.7"></a><span class="item-no">2.7</span>  Tolerance for ill-written HTML | 737 | <a name="s2.7" id="s2.7"></a><span class="item-no">2.7</span>  Tolerance for ill-written HTML |
738 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 738 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
739 | <br /> | 739 | <br /> |
740 |   htmLawed can work with ill-written HTML code in the input. However, HTML that is too ill-written may not be <em>read</em> as HTML, and may therefore get identified as mere plain text. Following statements indicate the degree of <em>looseness</em> that htmLawed can work with, and can be provided in instructions to writers:<br /> | 740 |   htmLawed can work with ill-written HTML code in the input. However, HTML that is too ill-written may not be <em>read</em> as HTML, and may therefore get identified as mere plain text. Following statements indicate the degree of <em>looseness</em> that htmLawed can work with, and can be provided in instructions to writers:<br /> |
741 | <br /> | 741 | <br /> |
742 |   *  Tags must be flanked by <span class="term"><</span> and <span class="term">></span> with no <span class="term">></span> inside -- any needed <span class="term">></span> should be put in as <span class="term">&gt;</span>. It is possible for tag content (element name and attributes) to be spread over many lines instead of being on one. A space may be present between the tag content and <span class="term">></span>, like <span class="term"><div ></span> and <span class="term"><img / ></span>, but not after the <span class="term"><</span>.<br /> | 742 |   *  Tags must be flanked by <span class="term"><</span> and <span class="term">></span> with no <span class="term">></span> inside -- any needed <span class="term">></span> should be put in as <span class="term">&gt;</span>. It is possible for tag content (element name and attributes) to be spread over many lines instead of being on one. A space may be present between the tag content and <span class="term">></span>, like <span class="term"><div ></span> and <span class="term"><img / ></span>, but not after the <span class="term"><</span>.<br /> |
743 | <br /> | 743 | <br /> |
744 |   *  Element and attribute names need not be lower-cased.<br /> | 744 |   *  Element and attribute names need not be lower-cased.<br /> |
745 | <br /> | 745 | <br /> |
746 |   *  Attribute string of elements may be liberally spaced with tabs, line-breaks, etc.<br /> | 746 |   *  Attribute string of elements may be liberally spaced with tabs, line-breaks, etc.<br /> |
747 | <br /> | 747 | <br /> |
748 |   *  Attribute values may be single- and not double-quoted.<br /> | 748 |   *  Attribute values may be single- and not double-quoted.<br /> |
749 | <br /> | 749 | <br /> |
750 |   *  Left-padding of numeric entities (like, <span class="term">&#0160;</span>, <span class="term">&x07ff;</span>) with <span class="term">0</span> is okay as long as the number of characters between between the <span class="term">&</span> and the <span class="term">;</span> does not exceed 8. All entities must end with <span class="term">;</span> though.<br /> | 750 |   *  Left-padding of numeric entities (like, <span class="term">&#0160;</span>, <span class="term">&x07ff;</span>) with <span class="term">0</span> is okay as long as the number of characters between between the <span class="term">&</span> and the <span class="term">;</span> does not exceed 8. All entities must end with <span class="term">;</span> though.<br /> |
751 | <br /> | 751 | <br /> |
752 |   *  Named character entities must be properly cased. Thus, <span class="term">&Lt;</span> or <span class="term">&TILDE;</span> will not be recognized as entities and will be <em>neutralized</em>.<br /> | 752 |   *  Named character entities must be properly cased. Thus, <span class="term">&Lt;</span> or <span class="term">&TILDE;</span> will not be recognized as entities and will be <em>neutralized</em>.<br /> |
753 | <br /> | 753 | <br /> |
754 |   *  HTML comments should not be inside element tags (they can be between tags), and should begin with <span class="term"><!--</span> and end with <span class="term">--></span>. Characters like <span class="term"><</span>, <span class="term">></span>, and <span class="term">&</span> may be allowed inside depending on <span class="term">$config</span>, but any <span class="term">--></span> inside should be put in as <span class="term">--&gt;</span>. Any <span class="term">--</span> inside will be automatically converted to <span class="term">-</span>, and a space will be added before the <span class="term">--></span> comment-closing marker  unless <span class="term">$config["comments"]</span> is set to <span class="term">4</span> (<a href="#s3.3.1">section 3.3.1</a>).<br /> | 754 |   *  HTML comments should not be inside element tags (they can be between tags), and should begin with <span class="term"><!--</span> and end with <span class="term">--></span>. Characters like <span class="term"><</span>, <span class="term">></span>, and <span class="term">&</span> may be allowed inside depending on <span class="term">$config</span>, but any <span class="term">--></span> inside should be put in as <span class="term">--&gt;</span>. Any <span class="term">--</span> inside will be automatically converted to <span class="term">-</span>, and a space will be added before the <span class="term">--></span> comment-closing marker  unless <span class="term">$config["comments"]</span> is set to <span class="term">4</span> (<a href="#s3.3.1">section 3.3.1</a>).<br /> |
755 | <br /> | 755 | <br /> |
756 |   *  <span class="term">CDATA</span> sections should not be inside element tags, and can be in element content only if plain text is allowed for that element. They should begin with <span class="term"><[CDATA[</span> and end with <span class="term">]]></span>. Characters like <span class="term"><</span>, <span class="term">></span>, and <span class="term">&</span> may be allowed inside depending on <span class="term">$config</span>, but any <span class="term">]]></span> inside should be put in as <span class="term">]]&gt;</span>.<br /> | 756 |   *  <span class="term">CDATA</span> sections should not be inside element tags, and can be in element content only if plain text is allowed for that element. They should begin with <span class="term"><[CDATA[</span> and end with <span class="term">]]></span>. Characters like <span class="term"><</span>, <span class="term">></span>, and <span class="term">&</span> may be allowed inside depending on <span class="term">$config</span>, but any <span class="term">]]></span> inside should be put in as <span class="term">]]&gt;</span>.<br /> |
757 | <br /> | 757 | <br /> |
758 |   *  For attribute values, character entities <span class="term">&lt;</span>, <span class="term">&gt;</span> and <span class="term">&amp;</span> should be used instead of characters <span class="term"><</span> and <span class="term">></span>, and <span class="term">&</span> (when <span class="term">&</span> is not part of a character entity). This applies even for Javascript code in values of attributes like <span class="term">onclick</span>.<br /> | 758 |   *  For attribute values, character entities <span class="term">&lt;</span>, <span class="term">&gt;</span> and <span class="term">&amp;</span> should be used instead of characters <span class="term"><</span> and <span class="term">></span>, and <span class="term">&</span> (when <span class="term">&</span> is not part of a character entity). This applies even for Javascript code in values of attributes like <span class="term">onclick</span>.<br /> |
759 | <br /> | 759 | <br /> |
760 |   *  Characters <span class="term"><</span>, <span class="term">></span>, <span class="term">&</span> and <span class="term">"</span> that are part of actual Javascript, etc., code in <span class="term">script</span> elements should be used as such and not be put in as entities like <span class="term">&gt;</span>. Otherwise, though the HTML will be valid, the code may fail to work. Further, if such characters have to be used, then they should be put inside <span class="term">CDATA</span> sections.<br /> | 760 |   *  Characters <span class="term"><</span>, <span class="term">></span>, <span class="term">&</span> and <span class="term">"</span> that are part of actual Javascript, etc., code in <span class="term">script</span> elements should be used as such and not be put in as entities like <span class="term">&gt;</span>. Otherwise, though the HTML will be valid, the code may fail to work. Further, if such characters have to be used, then they should be put inside <span class="term">CDATA</span> sections.<br /> |
761 | <br /> | 761 | <br /> |
762 |   *  Simple instructions like "an opening tag cannot be present between two closing tags" and "nested elements should be closed in the reverse order of how they were opened" can help authors write balanced HTML. If tags are imbalanced, htmLawed will try to balance them, but in the process, depending on <span class="term">$config["keep_bad"]</span>, some code/text may be lost.<br /> | 762 |   *  Simple instructions like "an opening tag cannot be present between two closing tags" and "nested elements should be closed in the reverse order of how they were opened" can help authors write balanced HTML. If tags are imbalanced, htmLawed will try to balance them, but in the process, depending on <span class="term">$config["keep_bad"]</span>, some code/text may be lost.<br /> |
763 | <br /> | 763 | <br /> |
764 |   *  Input authors should be notified of admin-specified allowed elements, attributes, configuration values (like conversion of named entities to numeric ones), etc.<br /> | 764 |   *  Input authors should be notified of admin-specified allowed elements, attributes, configuration values (like conversion of named entities to numeric ones), etc.<br /> |
765 | <br /> | 765 | <br /> |
766 |   *  With <span class="term">$config["unique_ids"]</span> not <span class="term">0</span> and the <span class="term">id</span> attribute being permitted, writers should carefully avoid using duplicate or invalid <span class="term">id</span> values as even though htmLawed will correct/remove the values, the final output may not be the one desired. E.g., when <span class="term"><a id="home"></a><input id="home" /><label for="home"></label></span> is processed into<br /> | 766 |   *  With <span class="term">$config["unique_ids"]</span> not <span class="term">0</span> and the <span class="term">id</span> attribute being permitted, writers should carefully avoid using duplicate or invalid <span class="term">id</span> values as even though htmLawed will correct/remove the values, the final output may not be the one desired. E.g., when <span class="term"><a id="home"></a><input id="home" /><label for="home"></label></span> is processed into<br /> |
767 | <span class="term"><a id="home"></a><input id="prefix_home" /><label for="home"></label></span>.<br /> | 767 | <span class="term"><a id="home"></a><input id="prefix_home" /><label for="home"></label></span>.<br /> |
768 | <br /> | 768 | <br /> |
769 |   *  Even if intended HTML is lost from an ill-written input, the processed output will be more secure and standard-compliant.<br /> | 769 |   *  Even if intended HTML is lost from an ill-written input, the processed output will be more secure and standard-compliant.<br /> |
770 | <br /> | 770 | <br /> |
771 |   *  For URLs, unless <span class="term">$config["scheme"]</span> is appropriately set, writers should avoid using escape characters or entities in schemes. E.g., <span class="term">htt&#112;</span> (which many browsers will read as the harmless <span class="term">http</span>) may be considered bad by htmLawed.<br /> | 771 |   *  For URLs, unless <span class="term">$config["scheme"]</span> is appropriately set, writers should avoid using escape characters or entities in schemes. E.g., <span class="term">htt&#112;</span> (which many browsers will read as the harmless <span class="term">http</span>) may be considered bad by htmLawed.<br /> |
772 | <br /> | 772 | <br /> |
773 |   *  htmLawed will attempt to put plain text present directly inside <span class="term">blockquote</span>, <span class="term">form</span>, <span class="term">map</span> and <span class="term">noscript</span> elements (illegal as per the specifications) inside auto-generated <span class="term">div</span> elements during tag balancing (<a href="#s3.3.3">section 3.3.3</a>).<br /> | 773 |   *  htmLawed will attempt to put plain text present directly inside <span class="term">blockquote</span>, <span class="term">form</span>, <span class="term">map</span> and <span class="term">noscript</span> elements (illegal as per the specifications) inside auto-generated <span class="term">div</span> elements during tag balancing (<a href="#s3.3.3">section 3.3.3</a>).<br /> |
774 | 774 | ||
775 | </div> | 775 | </div> |
776 | <div class="sub-section"><h3> | 776 | <div class="sub-section"><h3> |
777 | <a name="s2.8" id="s2.8"></a><span class="item-no">2.8</span>  Limitations & work-arounds | 777 | <a name="s2.8" id="s2.8"></a><span class="item-no">2.8</span>  Limitations & work-arounds |
778 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 778 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
779 | <br /> | 779 | <br /> |
780 |   htmLawed's main objective is to make the input text <em>more</em> standard-compliant, secure for readers, and free of HTML elements and attributes considered undesirable by the administrator. Some of its current limitations, regardless of this objective, are noted below along with possible work-arounds.<br /> | 780 |   htmLawed's main objective is to make the input text <em>more</em> standard-compliant, secure for readers, and free of HTML elements and attributes considered undesirable by the administrator. Some of its current limitations, regardless of this objective, are noted below along with possible work-arounds.<br /> |
781 | <br /> | 781 | <br /> |
782 |   It should be borne in mind that no browser application is 100% standard-compliant, standard specifications continue to evolve, and many browsers accept commonly used non-standard HTML. Regarding security, note that <em>unsafe</em> HTML code is not legally invalid per se.<br /> | 782 |   It should be borne in mind that no browser application is 100% standard-compliant, standard specifications continue to evolve, and many browsers accept commonly used non-standard HTML. Regarding security, note that <em>unsafe</em> HTML code is not legally invalid per se.<br /> |
783 | <br /> | 783 | <br /> |
784 |   *  By default, htmLawed will not strictly adhere to the <em>current</em> HTML standard. Admins can configure htmLawed to be more strict about standard compliance. Standard specification for HTML is continuously evolving. There are two bodies (<a href="http://www.w3c.org">W3C</a> and <a href="http://www.whatwg.org">WHATWG</a>) that specify the standard and their specifications are not identical. E.g., as in mid-2013, the <span class="term">border</span> attribute is valid in <span class="term">table</span> as per W3C but not WHATWG. Thus, htmLawed may not be fully compliant with the standard of a specific group. The HTML standards/rules that htmLawed uses in its logic are a mix of the W3C and WHATWG standards, and can be lax because of the laxity of HTML interpreters (browsers) regarding standards.<br /> | 784 |   *  By default, htmLawed will not strictly adhere to the <em>current</em> HTML standard. Admins can configure htmLawed to be more strict about standard compliance. Standard specification for HTML is continuously evolving. There are two bodies (<a href="http://www.w3c.org">W3C</a> and <a href="http://www.whatwg.org">WHATWG</a>) that specify the standard and their specifications are not identical. E.g., as in mid-2013, the <span class="term">border</span> attribute is valid in <span class="term">table</span> as per W3C but not WHATWG. Thus, htmLawed may not be fully compliant with the standard of a specific group. The HTML standards/rules that htmLawed uses in its logic are a mix of the W3C and WHATWG standards, and can be lax because of the laxity of HTML interpreters (browsers) regarding standards.<br /> |
785 | <br /> | 785 | <br /> |
786 |   *  In general, htmLawed processes input to generate output that is most likely to be standard-compatible in most users' browsers. Thus, for example, it does not enforce the required value of <span class="term">0</span> on <span class="term">border</span> attribute of <span class="term">img</span> (an HTML version 5 specification).<br /> | 786 |   *  In general, htmLawed processes input to generate output that is most likely to be standard-compatible in most users' browsers. Thus, for example, it does not enforce the required value of <span class="term">0</span> on <span class="term">border</span> attribute of <span class="term">img</span> (an HTML version 5 specification).<br /> |
787 | <br /> | 787 | <br /> |
788 |   *  htmLawed is meant for input that goes into the <span class="term">body</span> of HTML documents. HTML's head-level elements are not supported, nor are the frame-specific elements <span class="term">frameset</span>, <span class="term">frame</span> and <span class="term">noframes</span>. However, content of the latter elements can be individually filtered through htmLawed.<br /> | 788 |   *  htmLawed is meant for input that goes into the <span class="term">body</span> of HTML documents. HTML's head-level elements are not supported, nor are the frame-specific elements <span class="term">frameset</span>, <span class="term">frame</span> and <span class="term">noframes</span>. However, content of the latter elements can be individually filtered through htmLawed.<br /> |
789 | <br /> | 789 | <br /> |
790 |   *  It cannot handle input that has non-HTML code like <span class="term">SVG</span> and <span class="term">MathML</span>. One way around is to break the input into pieces and passing only those without non-HTML code to htmLawed. Another is described in <a href="#s3.9">section 3.9</a>. A third way may be to some how take advantage of the <span class="term">$config["and_mark"]</span> parameter (see <a href="#s3.2">section 3.2</a>).<br /> | 790 |   *  It cannot handle input that has non-HTML code like <span class="term">SVG</span> and <span class="term">MathML</span>. One way around is to break the input into pieces and passing only those without non-HTML code to htmLawed. Another is described in <a href="#s3.9">section 3.9</a>. A third way may be to some how take advantage of the <span class="term">$config["and_mark"]</span> parameter (see <a href="#s3.2">section 3.2</a>).<br /> |
791 | <br /> | 791 | <br /> |
792 |   *  By default, htmLawed won't check many attribute values for standard compliance. E.g., <span class="term">width="20m"</span> with the dimension in non-standard <span class="term">m</span> is let through. Implementing universal and strict attribute value checks can make htmLawed slow and resource-intensive. Admins should look at the <span class="term">hook_tag</span> parameter (<a href="#s3.4.9">section 3.4.9</a>) or <span class="term">$spec</span> to enforce finer checks on attribute values.<br /> | 792 |   *  By default, htmLawed won't check many attribute values for standard compliance. E.g., <span class="term">width="20m"</span> with the dimension in non-standard <span class="term">m</span> is let through. Implementing universal and strict attribute value checks can make htmLawed slow and resource-intensive. Admins should look at the <span class="term">hook_tag</span> parameter (<a href="#s3.4.9">section 3.4.9</a>) or <span class="term">$spec</span> to enforce finer checks on attribute values.<br /> |
793 | <br /> | 793 | <br /> |
794 |   *  By default, htmLawed considers all ARIA, data-*, event and microdata attributes as global attributes and permits them in all elements. This is not strictly standard-compliant. E.g., the <span class="term">itemtype</span> microdata attribute is permitted only in elements that also have the <span class="term">itemscope</span> attribute. Admins can configure htmLawed to be more strict about this (<a href="#s2.3">section 2.3</a>).<br /> | 794 |   *  By default, htmLawed considers all ARIA, data-*, event and microdata attributes as global attributes and permits them in all elements. This is not strictly standard-compliant. E.g., the <span class="term">itemtype</span> microdata attribute is permitted only in elements that also have the <span class="term">itemscope</span> attribute. Admins can configure htmLawed to be more strict about this (<a href="#s2.3">section 2.3</a>).<br /> |
795 | <br /> | 795 | <br /> |
796 |   *  The attributes, deprecated (which can be transformed too) or not, that it supports are largely those that are in the specifications. Only a few of the proprietary attributes are supported. However, <span class="term">$spec</span> can be used to allow custom attributes (<a href="#s2.3">section 2.3</a>).<br /> | 796 |   *  The attributes, deprecated (which can be transformed too) or not, that it supports are largely those that are in the specifications. Only a few of the proprietary attributes are supported. However, <span class="term">$spec</span> can be used to allow custom attributes (<a href="#s2.3">section 2.3</a>).<br /> |
797 | <br /> | 797 | <br /> |
798 |   *  Except for contained URLs and dynamic expressions (also optional), htmLawed does not check CSS style property values. Admins should look at using the <span class="term">hook_tag</span> parameter (<a href="#s3.4.9">section 3.4.9</a>) or <span class="term">$spec</span> for finer checks. Perhaps the best option is to disallow <span class="term">style</span> but allow <span class="term">class</span> attributes with the right <span class="term">oneof</span> or <span class="term">match</span> values for <span class="term">class</span>, and have the various class style properties in <span class="term">.css</span> CSS stylesheet files.<br /> | 798 |   *  Except for contained URLs and dynamic expressions (also optional), htmLawed does not check CSS style property values. Admins should look at using the <span class="term">hook_tag</span> parameter (<a href="#s3.4.9">section 3.4.9</a>) or <span class="term">$spec</span> for finer checks. Perhaps the best option is to disallow <span class="term">style</span> but allow <span class="term">class</span> attributes with the right <span class="term">oneof</span> or <span class="term">match</span> values for <span class="term">class</span>, and have the various class style properties in <span class="term">.css</span> CSS stylesheet files.<br /> |
799 | <br /> | 799 | <br /> |
800 |   *  htmLawed does not parse emoticons, decode <em>BBcode</em>, or <em>wikify</em>, auto-converting text to proper HTML. Similarly, it won't convert line-breaks to <span class="term">br</span> elements. Such functions are beyond its purview. Admins should use other code to pre- or post-process the input for such purposes.<br /> | 800 |   *  htmLawed does not parse emoticons, decode <em>BBcode</em>, or <em>wikify</em>, auto-converting text to proper HTML. Similarly, it won't convert line-breaks to <span class="term">br</span> elements. Such functions are beyond its purview. Admins should use other code to pre- or post-process the input for such purposes.<br /> |
801 | <br /> | 801 | <br /> |
802 |   *  htmLawed cannot be used to have links force-opened in new windows (by auto-adding appropriate <span class="term">target</span> and <span class="term">onclick</span> attributes to <span class="term">a</span>). Admins should look at Javascript-based DOM-modifying solutions for this. Admins may also be able to use a custom hook function to enforce such checks (<span class="term">hook_tag</span> parameter; see <a href="#s3.4.9">section 3.4.9</a>).<br /> | 802 |   *  htmLawed cannot be used to have links force-opened in new windows (by auto-adding appropriate <span class="term">target</span> and <span class="term">onclick</span> attributes to <span class="term">a</span>). Admins should look at Javascript-based DOM-modifying solutions for this. Admins may also be able to use a custom hook function to enforce such checks (<span class="term">hook_tag</span> parameter; see <a href="#s3.4.9">section 3.4.9</a>).<br /> |
803 | <br /> | 803 | <br /> |
804 |   *  Nesting-based checks are not possible. E.g., one cannot disallow <span class="term">p</span> elements specifically inside <span class="term">td</span> while permitting it elsewhere. Admins may be able to use a custom hook function to enforce such checks (<span class="term">hook_tag</span> parameter; see <a href="#s3.4.9">section 3.4.9</a>).<br /> | 804 |   *  Nesting-based checks are not possible. E.g., one cannot disallow <span class="term">p</span> elements specifically inside <span class="term">td</span> while permitting it elsewhere. Admins may be able to use a custom hook function to enforce such checks (<span class="term">hook_tag</span> parameter; see <a href="#s3.4.9">section 3.4.9</a>).<br /> |
805 | <br /> | 805 | <br /> |
806 |   *  Except for optionally converting absolute or relative URLs to the other type, htmLawed will not alter URLs (e.g., to change the value of query strings or to convert <span class="term">http</span> to <span class="term">https</span>. Having absolute URLs may be a standard-requirement, e.g., when HTML is embedded in email messages, whereas altering URLs for other purposes is beyond htmLawed's goals. Admins may be able to use a custom hook function to enforce such checks (<span class="term">hook_tag</span> parameter; see <a href="#s3.4.9">section 3.4.9</a>).<br /> | 806 |   *  Except for optionally converting absolute or relative URLs to the other type, htmLawed will not alter URLs (e.g., to change the value of query strings or to convert <span class="term">http</span> to <span class="term">https</span>. Having absolute URLs may be a standard-requirement, e.g., when HTML is embedded in email messages, whereas altering URLs for other purposes is beyond htmLawed's goals. Admins may be able to use a custom hook function to enforce such checks (<span class="term">hook_tag</span> parameter; see <a href="#s3.4.9">section 3.4.9</a>).<br /> |
807 | <br /> | 807 | <br /> |
808 |   *  Pairs of opening and closing tags that do not enclose any content (like <span class="term"><em></em></span>) are not removed. This may be against the standard specification for certain elements (e.g., <span class="term">table</span>). However, presence of such standard-incompliant code will not break the display or layout of content. Admins can also use simple regex-based code to filter out such code.<br /> | 808 |   *  Pairs of opening and closing tags that do not enclose any content (like <span class="term"><em></em></span>) are not removed. This may be against the standard specification for certain elements (e.g., <span class="term">table</span>). However, presence of such standard-incompliant code will not break the display or layout of content. Admins can also use simple regex-based code to filter out such code.<br /> |
809 | <br /> | 809 | <br /> |
810 |   *  htmLawed does not check for certain element orderings described in the standard specifications (e.g., in a <span class="term">table</span>, <span class="term">tbody</span> is allowed before <span class="term">tfoot</span>). Admins may be able to use a custom hook function to enforce such checks (<span class="term">hook_tag</span> parameter; see <a href="#s3.4.9">section 3.4.9</a>).<br /> | 810 |   *  htmLawed does not check for certain element orderings described in the standard specifications (e.g., in a <span class="term">table</span>, <span class="term">tbody</span> is allowed before <span class="term">tfoot</span>). Admins may be able to use a custom hook function to enforce such checks (<span class="term">hook_tag</span> parameter; see <a href="#s3.4.9">section 3.4.9</a>).<br /> |
811 | <br /> | 811 | <br /> |
812 |   *  htmLawed does not check the number of nested elements. E.g., it will allow two <span class="term">caption</span> elements in a <span class="term">table</span> element, illegal as per standard specifications. Admins may be able to use a custom hook function to enforce such checks (<span class="term">hook_tag</span> parameter; see <a href="#s3.4.9">section 3.4.9</a>).<br /> | 812 |   *  htmLawed does not check the number of nested elements. E.g., it will allow two <span class="term">caption</span> elements in a <span class="term">table</span> element, illegal as per standard specifications. Admins may be able to use a custom hook function to enforce such checks (<span class="term">hook_tag</span> parameter; see <a href="#s3.4.9">section 3.4.9</a>).<br /> |
813 | <br /> | 813 | <br /> |
814 |   *  There are multiple ways to interpret ill-written HTML. E.g., in <span class="term"><small><small>text</small></span>, is it that the second closing tag for <span class="term">small</span> is missing or is it that the second opening tag for <span class="term">small</span> was put in by mistake? htmLawed corrects the HTML in the string assuming the former, while the user may have intended the string for the latter. This is an issue that is impossible to address perfectly.<br /> | 814 |   *  There are multiple ways to interpret ill-written HTML. E.g., in <span class="term"><small><small>text</small></span>, is it that the second closing tag for <span class="term">small</span> is missing or is it that the second opening tag for <span class="term">small</span> was put in by mistake? htmLawed corrects the HTML in the string assuming the former, while the user may have intended the string for the latter. This is an issue that is impossible to address perfectly.<br /> |
815 | <br /> | 815 | <br /> |
816 |   *  htmLawed might convert certain entities to actual characters and remove backslashes and CSS comment-markers (<span class="term">/*</span>) in <span class="term">style</span> attribute values in order to detect malicious HTML like crafted, Internet Explorer browser-specific dynamic expressions like <span class="term">&#101;xpression...</span>. If this is too harsh, admins can allow CSS expressions through htmLawed core but then use a custom function through the <span class="term">hook_tag</span> parameter (<a href="#s3.4.9">section 3.4.9</a>) to more specifically identify CSS expressions in the <span class="term">style</span> attribute values. Also, using <span class="term">$config["style_pass"]</span>, it is possible to have htmLawed pass <span class="term">style</span> attribute values without even looking at them (<a href="#s3.4.8">section 3.4.8</a>).<br /> | 816 |   *  htmLawed might convert certain entities to actual characters and remove backslashes and CSS comment-markers (<span class="term">/*</span>) in <span class="term">style</span> attribute values in order to detect malicious HTML like crafted, Internet Explorer browser-specific dynamic expressions like <span class="term">&#101;xpression...</span>. If this is too harsh, admins can allow CSS expressions through htmLawed core but then use a custom function through the <span class="term">hook_tag</span> parameter (<a href="#s3.4.9">section 3.4.9</a>) to more specifically identify CSS expressions in the <span class="term">style</span> attribute values. Also, using <span class="term">$config["style_pass"]</span>, it is possible to have htmLawed pass <span class="term">style</span> attribute values without even looking at them (<a href="#s3.4.8">section 3.4.8</a>).<br /> |
817 | <br /> | 817 | <br /> |
818 |   *  htmLawed does not correct certain possible attribute-based security vulnerabilities (e.g., <span class="term"><a href="http://x%22+style=%22background-image:xss">x</a></span>). These arise when browsers mis-identify markup in <em>escaped</em> text, defeating the very purpose of escaping text (a bad browser will read the given example as <span class="term"><a href="http://x" style="background-image:xss">x</a></span>).<br /> | 818 |   *  htmLawed does not correct certain possible attribute-based security vulnerabilities (e.g., <span class="term"><a href="http://x%22+style=%22background-image:xss">x</a></span>). These arise when browsers mis-identify markup in <em>escaped</em> text, defeating the very purpose of escaping text (a bad browser will read the given example as <span class="term"><a href="http://x" style="background-image:xss">x</a></span>).<br /> |
819 | <br /> | 819 | <br /> |
820 |   *  Because of poor Unicode support in PHP, htmLawed does not remove the <em>high value</em> HTML-invalid characters with multi-byte code-points. Such characters however are extremely unlikely to be in the input. (see <a href="#s3.1">section 3.1</a>).<br /> | 820 |   *  Because of poor Unicode support in PHP, htmLawed does not remove the <em>high value</em> HTML-invalid characters with multi-byte code-points. Such characters however are extremely unlikely to be in the input. (see <a href="#s3.1">section 3.1</a>).<br /> |
821 | <br /> | 821 | <br /> |
822 |   *  htmLawed does not check or correct the character encoding of the input it receives. In conjunction with permitting circumstances such as when the character encoding is left undefined through HTTP headers or HTML <span class="term">meta</span> tags, this can permit an exploit (like Google's <em>UTF-7/XSS</em> vulnerability of the past). Also, htmLawed can mangle input text if it is not well-formed in terms of character encoding. Administrators can consider using code available elsewhere to check well-formedness of input text characters to correct any defect.<br /> | 822 |   *  htmLawed does not check or correct the character encoding of the input it receives. In conjunction with permitting circumstances such as when the character encoding is left undefined through HTTP headers or HTML <span class="term">meta</span> tags, this can permit an exploit (like Google's <em>UTF-7/XSS</em> vulnerability of the past). Also, htmLawed can mangle input text if it is not well-formed in terms of character encoding. Administrators can consider using code available elsewhere to check well-formedness of input text characters to correct any defect.<br /> |
823 | <br /> | 823 | <br /> |
824 |   *  htmLawed is expected to work with input texts in ASCII standard-compatible single-byte encodings such as national variants of ASCII (like ISO-646-DE/German of the ISO 646 standard), extended ASCII variants (like ISO 8859-10/Turkish of the ISO 8859/ISO Latin standard), ISO 8859-based Windows variants (like Windows 1252), EBCDIC, Shift JIS (Japanese), GB-Roman (Chinese), and KS-Roman (Korean). It should also properly handle texts with variable-byte encodings like UTF-7 (Unicode) and UTF-8 (Unicode). However, htmLawed may mangle input texts with double-byte encodings like UTF-16 (Unicode), JIS X 0208:1997 (Japanese) and K SX 1001:1992 (Korean), or the UTF-32 (Unicode) quadruple-byte encoding. If an input text has such an encoding, administrators can use PHP's <a href="http://php.net/manual/en/book.iconv.php">iconv</a> functions, or some other mean, to convert text to UTF-8 before passing it to htmLawed.<br /> | 824 |   *  htmLawed is expected to work with input texts in ASCII standard-compatible single-byte encodings such as national variants of ASCII (like ISO-646-DE/German of the ISO 646 standard), extended ASCII variants (like ISO 8859-10/Turkish of the ISO 8859/ISO Latin standard), ISO 8859-based Windows variants (like Windows 1252), EBCDIC, Shift JIS (Japanese), GB-Roman (Chinese), and KS-Roman (Korean). It should also properly handle texts with variable-byte encodings like UTF-7 (Unicode) and UTF-8 (Unicode). However, htmLawed may mangle input texts with double-byte encodings like UTF-16 (Unicode), JIS X 0208:1997 (Japanese) and K SX 1001:1992 (Korean), or the UTF-32 (Unicode) quadruple-byte encoding. If an input text has such an encoding, administrators can use PHP's <a href="http://php.net/manual/en/book.iconv.php">iconv</a> functions, or some other mean, to convert text to UTF-8 before passing it to htmLawed.<br /> |
825 | <br /> | 825 | <br /> |
826 |   *  Like any script using PHP's PCRE regex functions, PHP setup-specific low PCRE limit values can cause htmLawed to at least partially fail with very long input texts.<br /> | 826 |   *  Like any script using PHP's PCRE regex functions, PHP setup-specific low PCRE limit values can cause htmLawed to at least partially fail with very long input texts.<br /> |
827 | 827 | ||
828 | </div> | 828 | </div> |
829 | <div class="sub-section"><h3> | 829 | <div class="sub-section"><h3> |
830 | <a name="s2.9" id="s2.9"></a><span class="item-no">2.9</span>  Examples of usage | 830 | <a name="s2.9" id="s2.9"></a><span class="item-no">2.9</span>  Examples of usage |
831 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 831 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
832 | <br /> | 832 | <br /> |
833 |   Safest, allowing only <em>safe</em> HTML markup --<br /> | 833 |   Safest, allowing only <em>safe</em> HTML markup --<br /> |
834 | <br /> | 834 | <br /> |
835 | 835 | ||
836 | <code class="code">    $config = array('safe'=>1);</code> | 836 | <code class="code">    $config = array('safe'=>1);</code> |
837 | <br /> | 837 | <br /> |
838 | 838 | ||
839 | <code class="code">    $out = htmLawed($in, $config);</code> | 839 | <code class="code">    $out = htmLawed($in, $config);</code> |
840 | <br /> | 840 | <br /> |
841 | <br /> | 841 | <br /> |
842 |   Simplest, allowing all valid HTML markup including Javascript --<br /> | 842 |   Simplest, allowing all valid HTML markup including Javascript --<br /> |
843 | <br /> | 843 | <br /> |
844 | 844 | ||
845 | <code class="code">    $out = htmLawed($in);</code> | 845 | <code class="code">    $out = htmLawed($in);</code> |
846 | <br /> | 846 | <br /> |
847 | <br /> | 847 | <br /> |
848 |   Allowing all valid HTML markup but restricting URL schemes in <span class="term">src</span> attribute values to <span class="term">http</span> and <span class="term">https</span> --<br /> | 848 |   Allowing all valid HTML markup but restricting URL schemes in <span class="term">src</span> attribute values to <span class="term">http</span> and <span class="term">https</span> --<br /> |
849 | <br /> | 849 | <br /> |
850 | 850 | ||
851 | <code class="code">    $config = array('schemes'=>'*:*; src:http, https');</code> | 851 | <code class="code">    $config = array('schemes'=>'*:*; src:http, https');</code> |
852 | <br /> | 852 | <br /> |
853 | 853 | ||
854 | <code class="code">    $out = htmLawed($in, $config);</code> | 854 | <code class="code">    $out = htmLawed($in, $config);</code> |
855 | <br /> | 855 | <br /> |
856 | <br /> | 856 | <br /> |
857 |   Allowing only <span class="term">safe</span> HTML and the elements <span class="term">a</span>, <span class="term">em</span>, and <span class="term">strong</span> --<br /> | 857 |   Allowing only <span class="term">safe</span> HTML and the elements <span class="term">a</span>, <span class="term">em</span>, and <span class="term">strong</span> --<br /> |
858 | <br /> | 858 | <br /> |
859 | 859 | ||
860 | <code class="code">    $config = array('safe'=>1, 'elements'=>'a, em, strong');</code> | 860 | <code class="code">    $config = array('safe'=>1, 'elements'=>'a, em, strong');</code> |
861 | <br /> | 861 | <br /> |
862 | 862 | ||
863 | <code class="code">    $out = htmLawed($in, $config);</code> | 863 | <code class="code">    $out = htmLawed($in, $config);</code> |
864 | <br /> | 864 | <br /> |
865 | <br /> | 865 | <br /> |
866 |   Not allowing elements <span class="term">script</span> and <span class="term">object</span> --<br /> | 866 |   Not allowing elements <span class="term">script</span> and <span class="term">object</span> --<br /> |
867 | <br /> | 867 | <br /> |
868 | 868 | ||
869 | <code class="code">    $config = array('elements'=>'* -script -object');</code> | 869 | <code class="code">    $config = array('elements'=>'* -script -object');</code> |
870 | <br /> | 870 | <br /> |
871 | 871 | ||
872 | <code class="code">    $out = htmLawed($in, $config);</code> | 872 | <code class="code">    $out = htmLawed($in, $config);</code> |
873 | <br /> | 873 | <br /> |
874 | <br /> | 874 | <br /> |
875 |   Not allowing attributes <span class="term">id</span> and <span class="term">style</span> --<br /> | 875 |   Not allowing attributes <span class="term">id</span> and <span class="term">style</span> --<br /> |
876 | <br /> | 876 | <br /> |
877 | 877 | ||
878 | <code class="code">    $config = array('deny_attribute'=>'id, style');</code> | 878 | <code class="code">    $config = array('deny_attribute'=>'id, style');</code> |
879 | <br /> | 879 | <br /> |
880 | 880 | ||
881 | <code class="code">    $out = htmLawed($in, $config);</code> | 881 | <code class="code">    $out = htmLawed($in, $config);</code> |
882 | <br /> | 882 | <br /> |
883 | <br /> | 883 | <br /> |
884 |   Permitting only attributes <span class="term">title</span> and <span class="term">href</span> --<br /> | 884 |   Permitting only attributes <span class="term">title</span> and <span class="term">href</span> --<br /> |
885 | <br /> | 885 | <br /> |
886 | 886 | ||
887 | <code class="code">    $config = array('deny_attribute'=>'* -title -href');</code> | 887 | <code class="code">    $config = array('deny_attribute'=>'* -title -href');</code> |
888 | <br /> | 888 | <br /> |
889 | 889 | ||
890 | <code class="code">    $out = htmLawed($in, $config);</code> | 890 | <code class="code">    $out = htmLawed($in, $config);</code> |
891 | <br /> | 891 | <br /> |
892 | <br /> | 892 | <br /> |
893 |   Remove bad/disallowed tags altogether instead of converting them to entities --<br /> | 893 |   Remove bad/disallowed tags altogether instead of converting them to entities --<br /> |
894 | <br /> | 894 | <br /> |
895 | 895 | ||
896 | <code class="code">    $config = array('keep_bad'=>0);</code> | 896 | <code class="code">    $config = array('keep_bad'=>0);</code> |
897 | <br /> | 897 | <br /> |
898 | 898 | ||
899 | <code class="code">    $out = htmLawed($in, $config);</code> | 899 | <code class="code">    $out = htmLawed($in, $config);</code> |
900 | <br /> | 900 | <br /> |
901 | <br /> | 901 | <br /> |
902 |   Allowing attribute <span class="term">title</span> only in <span class="term">a</span> and not allowing attributes <span class="term">id</span>, <span class="term">style</span>, or scriptable <em>on*</em> attributes like <span class="term">onclick</span> --<br /> | 902 |   Allowing attribute <span class="term">title</span> only in <span class="term">a</span> and not allowing attributes <span class="term">id</span>, <span class="term">style</span>, or scriptable <em>on*</em> attributes like <span class="term">onclick</span> --<br /> |
903 | <br /> | 903 | <br /> |
904 | 904 | ||
905 | <code class="code">    $config = array('deny_attribute'=>'title, id, style, on*');</code> | 905 | <code class="code">    $config = array('deny_attribute'=>'title, id, style, on*');</code> |
906 | <br /> | 906 | <br /> |
907 | 907 | ||
908 | <code class="code">    $spec = 'a=title';</code> | 908 | <code class="code">    $spec = 'a=title';</code> |
909 | <br /> | 909 | <br /> |
910 | 910 | ||
911 | <code class="code">    $out = htmLawed($in, $config, $spec);</code> | 911 | <code class="code">    $out = htmLawed($in, $config, $spec);</code> |
912 | <br /> | 912 | <br /> |
913 | <br /> | 913 | <br /> |
914 |   Allowing a custom attribute, <span class="term">vFlag</span>, in <span class="term">img</span> and permitting custom use of the standard attribute, <span class="term">rel</span>, in <span class="term">input</span> --<br /> | 914 |   Allowing a custom attribute, <span class="term">vFlag</span>, in <span class="term">img</span> and permitting custom use of the standard attribute, <span class="term">rel</span>, in <span class="term">input</span> --<br /> |
915 | <br /> | 915 | <br /> |
916 | 916 | ||
917 | <code class="code">    $spec = 'img=vFlag; input=rel';</code> | 917 | <code class="code">    $spec = 'img=vFlag; input=rel';</code> |
918 | <br /> | 918 | <br /> |
919 | 919 | ||
920 | <code class="code">    $out = htmLawed($in, $config, $spec);</code> | 920 | <code class="code">    $out = htmLawed($in, $config, $spec);</code> |
921 | <br /> | 921 | <br /> |
922 | <br /> | 922 | <br /> |
923 |   Some case-studies are presented below.<br /> | 923 |   Some case-studies are presented below.<br /> |
924 | <br /> | 924 | <br /> |
925 |   <strong>1.</strong> A blog administrator wants to allow only <span class="term">a</span>, <span class="term">em</span>, <span class="term">strike</span>, <span class="term">strong</span> and <span class="term">u</span> in comments, but needs <span class="term">strike</span> and <span class="term">u</span> transformed to <span class="term">span</span> for better XHTML 1-strict compliance, and, he wants the <span class="term">a</span> links to point only to <span class="term">http</span> or <span class="term">https</span> resources:<br /> | 925 |   <strong>1.</strong> A blog administrator wants to allow only <span class="term">a</span>, <span class="term">em</span>, <span class="term">strike</span>, <span class="term">strong</span> and <span class="term">u</span> in comments, but needs <span class="term">strike</span> and <span class="term">u</span> transformed to <span class="term">span</span> for better XHTML 1-strict compliance, and, he wants the <span class="term">a</span> links to point only to <span class="term">http</span> or <span class="term">https</span> resources:<br /> |
926 | <br /> | 926 | <br /> |
927 | 927 | ||
928 | <code class="code">    $processed = htmLawed($in, array('elements'=>'a, em, strike, strong, u', 'make_tag_strict'=>1, 'safe'=>1, 'schemes'=>'*:http, https'), 'a=href');</code> | 928 | <code class="code">    $processed = htmLawed($in, array('elements'=>'a, em, strike, strong, u', 'make_tag_strict'=>1, 'safe'=>1, 'schemes'=>'*:http, https'), 'a=href');</code> |
929 | <br /> | 929 | <br /> |
930 | <br /> | 930 | <br /> |
931 |   <strong>2.</strong> An author uses a custom-made web application to load content on his website. He is the only one using that application and the content he generates has all types of HTML, including scripts. The web application uses htmLawed primarily as a tool to correct errors that creep in while writing HTML and to take care of the occasional <em>bad</em> characters in copy-paste text introduced by Microsoft Office. The web application provides a preview before submitted input is added to the content. For the previewing process, htmLawed is set up as follows:<br /> | 931 |   <strong>2.</strong> An author uses a custom-made web application to load content on his website. He is the only one using that application and the content he generates has all types of HTML, including scripts. The web application uses htmLawed primarily as a tool to correct errors that creep in while writing HTML and to take care of the occasional <em>bad</em> characters in copy-paste text introduced by Microsoft Office. The web application provides a preview before submitted input is added to the content. For the previewing process, htmLawed is set up as follows:<br /> |
932 | <br /> | 932 | <br /> |
933 | 933 | ||
934 | <code class="code">    $processed = htmLawed($in, array('css_expression'=>1, 'keep_bad'=>1, 'make_tag_strict'=>1, 'schemes'=>'*:*', 'valid_xhtml'=>1));</code> | 934 | <code class="code">    $processed = htmLawed($in, array('css_expression'=>1, 'keep_bad'=>1, 'make_tag_strict'=>1, 'schemes'=>'*:*', 'valid_xhtml'=>1));</code> |
935 | <br /> | 935 | <br /> |
936 | <br /> | 936 | <br /> |
937 |   For the final submission process, <span class="term">keep_bad</span> is set to <span class="term">6</span>. A value of <span class="term">1</span> for the preview process allows the author to note and correct any HTML mistake without losing any of the typed text.<br /> | 937 |   For the final submission process, <span class="term">keep_bad</span> is set to <span class="term">6</span>. A value of <span class="term">1</span> for the preview process allows the author to note and correct any HTML mistake without losing any of the typed text.<br /> |
938 | <br /> | 938 | <br /> |
939 |   <strong>3.</strong> A data-miner is scraping information in a specific table of similar web-pages and is collating the data rows, and uses htmLawed to reduce unnecessary markup and white-spaces:<br /> | 939 |   <strong>3.</strong> A data-miner is scraping information in a specific table of similar web-pages and is collating the data rows, and uses htmLawed to reduce unnecessary markup and white-spaces:<br /> |
940 | <br /> | 940 | <br /> |
941 | 941 | ||
942 | <code class="code">    $processed = htmLawed($in, array('elements'=>'tr, td', 'tidy'=>-1), 'tr, td =');</code> | 942 | <code class="code">    $processed = htmLawed($in, array('elements'=>'tr, td', 'tidy'=>-1), 'tr, td =');</code> |
943 | <br /> | 943 | <br /> |
944 | 944 | ||
945 | </div> | 945 | </div> |
946 | </div> | 946 | </div> |
947 | <div class="section"><h2> | 947 | <div class="section"><h2> |
948 | <a name="s3" id="s3"></a><span class="item-no">3</span>  Details | 948 | <a name="s3" id="s3"></a><span class="item-no">3</span>  Details |
949 | </h2><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 949 | </h2><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
950 | <div class="sub-section"><h3> | 950 | <div class="sub-section"><h3> |
951 | <a name="s3.1" id="s3.1"></a><span class="item-no">3.1</span>  Invalid/dangerous characters | 951 | <a name="s3.1" id="s3.1"></a><span class="item-no">3.1</span>  Invalid/dangerous characters |
952 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 952 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
953 | <br /> | 953 | <br /> |
954 |   Valid characters (more correctly, their code-points) in HTML or XML are, hexadecimally, <span class="term">9</span>, <span class="term">a</span>, <span class="term">d</span>, <span class="term">20</span> to <span class="term">d7ff</span>, and <span class="term">e000</span> to <span class="term">10ffff</span>, except <span class="term">fffe</span> and <span class="term">ffff</span> (decimally, <span class="term">9</span>, <span class="term">10</span>, <span class="term">13</span>, <span class="term">32</span> to <span class="term">55295</span>, and <span class="term">57344</span> to <span class="term">1114111</span>, except <span class="term">65534</span> and <span class="term">65535</span>). htmLawed removes the invalid characters <span class="term">0</span> to <span class="term">8</span>, <span class="term">b</span>, <span class="term">c</span>, and <span class="term">e</span> to <span class="term">1f</span>.<br /> | 954 |   Valid characters (more correctly, their code-points) in HTML or XML are, hexadecimally, <span class="term">9</span>, <span class="term">a</span>, <span class="term">d</span>, <span class="term">20</span> to <span class="term">d7ff</span>, and <span class="term">e000</span> to <span class="term">10ffff</span>, except <span class="term">fffe</span> and <span class="term">ffff</span> (decimally, <span class="term">9</span>, <span class="term">10</span>, <span class="term">13</span>, <span class="term">32</span> to <span class="term">55295</span>, and <span class="term">57344</span> to <span class="term">1114111</span>, except <span class="term">65534</span> and <span class="term">65535</span>). htmLawed removes the invalid characters <span class="term">0</span> to <span class="term">8</span>, <span class="term">b</span>, <span class="term">c</span>, and <span class="term">e</span> to <span class="term">1f</span>.<br /> |
955 | <br /> | 955 | <br /> |
956 |   Because of PHP's poor native support for multi-byte characters, htmLawed cannot check for the remaining invalid code-points. However, for various reasons, it is very unlikely for any of those characters to be in the input.<br /> | 956 |   Because of PHP's poor native support for multi-byte characters, htmLawed cannot check for the remaining invalid code-points. However, for various reasons, it is very unlikely for any of those characters to be in the input.<br /> |
957 | <br /> | 957 | <br /> |
958 |   Characters that are discouraged (see <a href="#s5.1">section 5.1</a>) but not invalid are not removed by htmLawed.<br /> | 958 |   Characters that are discouraged (see <a href="#s5.1">section 5.1</a>) but not invalid are not removed by htmLawed.<br /> |
959 | <br /> | 959 | <br /> |
960 |   It (function <span class="term">hl_tag()</span>) also replaces the potentially dangerous (in some Mozilla [Firefox] and Opera browsers) soft-hyphen character (code-point, hexadecimally, <span class="term">ad</span>, or decimally, <span class="term">173</span>) in attribute values with spaces. Where required, the characters <span class="term"><</span>, <span class="term">></span>, <span class="term">&</span>, and <span class="term">"</span> are converted to entities.<br /> | 960 |   It (function <span class="term">hl_tag()</span>) also replaces the potentially dangerous (in some Mozilla [Firefox] and Opera browsers) soft-hyphen character (code-point, hexadecimally, <span class="term">ad</span>, or decimally, <span class="term">173</span>) in attribute values with spaces. Where required, the characters <span class="term"><</span>, <span class="term">></span>, <span class="term">&</span>, and <span class="term">"</span> are converted to entities.<br /> |
961 | <br /> | 961 | <br /> |
962 |   With <span class="term">$config["clean_ms_char"]</span> set as <span class="term">1</span> or <span class="term">2</span>, many of the discouraged characters (decimal code-points <span class="term">127</span> to <span class="term">159</span> except <span class="term">133</span>) that many Microsoft applications incorrectly use (as per the <span class="term">Windows 1252</span> [<span class="term">Cp-1252</span>] or a similar encoding system), and the character for decimal code-point <span class="term">133</span>, are converted to appropriate decimal numerical entities (or removed for a few cases)-- see appendix in <a href="#s5.4">section 5.4</a>. This can help avoid some display issues arising from copying-pasting of content.<br /> | 962 |   With <span class="term">$config["clean_ms_char"]</span> set as <span class="term">1</span> or <span class="term">2</span>, many of the discouraged characters (decimal code-points <span class="term">127</span> to <span class="term">159</span> except <span class="term">133</span>) that many Microsoft applications incorrectly use (as per the <span class="term">Windows 1252</span> [<span class="term">Cp-1252</span>] or a similar encoding system), and the character for decimal code-point <span class="term">133</span>, are converted to appropriate decimal numerical entities (or removed for a few cases)-- see appendix in <a href="#s5.4">section 5.4</a>. This can help avoid some display issues arising from copying-pasting of content.<br /> |
963 | <br /> | 963 | <br /> |
964 |   With <span class="term">$config["clean_ms_char"]</span> set as <span class="term">2</span>, characters for the hexadecimal code-points <span class="term">82</span>, <span class="term">91</span>, and <span class="term">92</span> (for special single-quotes), and <span class="term">84</span>, <span class="term">93</span>, and <span class="term">94</span> (for special double-quotes) are converted to ordinary single and double quotes respectively and not to entities.<br /> | 964 |   With <span class="term">$config["clean_ms_char"]</span> set as <span class="term">2</span>, characters for the hexadecimal code-points <span class="term">82</span>, <span class="term">91</span>, and <span class="term">92</span> (for special single-quotes), and <span class="term">84</span>, <span class="term">93</span>, and <span class="term">94</span> (for special double-quotes) are converted to ordinary single and double quotes respectively and not to entities.<br /> |
965 | <br /> | 965 | <br /> |
966 |   The character values are replaced with entities/characters and not character values referred to by the entities/characters to keep this task independent of the character-encoding of input text.<br /> | 966 |   The character values are replaced with entities/characters and not character values referred to by the entities/characters to keep this task independent of the character-encoding of input text.<br /> |
967 | <br /> | 967 | <br /> |
968 |   The <span class="term">$config["clean_ms_char"]</span> parameter should not be used if authors do not copy-paste Microsoft-created text, or if the input text is not believed to use the <span class="term">Windows 1252</span> (<span class="term">Cp-1252</span>) or a similar encoding like <span class="term">Cp-1251</span> (otherwise, for example when UTF-8 encoding is in use, Japanese or Korean characters can get mangled). Further, the input form and the web-pages displaying it or its content should have the character encoding appropriately marked-up.<br /> | 968 |   The <span class="term">$config["clean_ms_char"]</span> parameter should not be used if authors do not copy-paste Microsoft-created text, or if the input text is not believed to use the <span class="term">Windows 1252</span> (<span class="term">Cp-1252</span>) or a similar encoding like <span class="term">Cp-1251</span> (otherwise, for example when UTF-8 encoding is in use, Japanese or Korean characters can get mangled). Further, the input form and the web-pages displaying it or its content should have the character encoding appropriately marked-up.<br /> |
969 | 969 | ||
970 | </div> | 970 | </div> |
971 | <div class="sub-section"><h3> | 971 | <div class="sub-section"><h3> |
972 | <a name="s3.2" id="s3.2"></a><span class="item-no">3.2</span>  Character references/entities | 972 | <a name="s3.2" id="s3.2"></a><span class="item-no">3.2</span>  Character references/entities |
973 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 973 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
974 | <br /> | 974 | <br /> |
975 |   Valid character entities take the form <span class="term">&*;</span> where <span class="term">*</span> is <span class="term">#x</span> followed by a hexadecimal number (hexadecimal numeric entity; like <span class="term">&#xA0;</span> for non-breaking space), or alphanumeric like <span class="term">gt</span> (external or named entity; like <span class="term">&nbsp;</span> for non-breaking space), or <span class="term">#</span> followed by a number (decimal numeric entity; like <span class="term">&#160;</span> for non-breaking space). Character entities referring to the soft-hyphen character (the <span class="term">&shy;</span> or <span class="term">\xad</span> character; hexadecimal code-point <span class="term">ad</span> [decimal <span class="term">173</span>]) in URL-accepting attribute values are always replaced with spaces; soft-hyphens in attribute values introduce vulnerabilities in some older versions of the Opera and Mozilla [Firefox] browsers.<br /> | 975 |   Valid character entities take the form <span class="term">&*;</span> where <span class="term">*</span> is <span class="term">#x</span> followed by a hexadecimal number (hexadecimal numeric entity; like <span class="term">&#xA0;</span> for non-breaking space), or alphanumeric like <span class="term">gt</span> (external or named entity; like <span class="term">&nbsp;</span> for non-breaking space), or <span class="term">#</span> followed by a number (decimal numeric entity; like <span class="term">&#160;</span> for non-breaking space). Character entities referring to the soft-hyphen character (the <span class="term">&shy;</span> or <span class="term">\xad</span> character; hexadecimal code-point <span class="term">ad</span> [decimal <span class="term">173</span>]) in URL-accepting attribute values are always replaced with spaces; soft-hyphens in attribute values introduce vulnerabilities in some older versions of the Opera and Mozilla [Firefox] browsers.<br /> |
976 | <br /> | 976 | <br /> |
977 |   htmLawed (function <span class="term">hl_ent()</span>):<br /> | 977 |   htmLawed (function <span class="term">hl_ent()</span>):<br /> |
978 | <br /> | 978 | <br /> |
979 |   *  Neutralizes entities with multiple leading zeroes or missing semi-colons (potentially dangerous)<br /> | 979 |   *  Neutralizes entities with multiple leading zeroes or missing semi-colons (potentially dangerous)<br /> |
980 | <br /> | 980 | <br /> |
981 |   *  Lowercases the <span class="term">X</span> (for XML-compliance) and <span class="term">A-F</span> of hexadecimal numeric entities<br /> | 981 |   *  Lowercases the <span class="term">X</span> (for XML-compliance) and <span class="term">A-F</span> of hexadecimal numeric entities<br /> |
982 | <br /> | 982 | <br /> |
983 |   *  Neutralizes entities referring to characters that are HTML-invalid (see <a href="#s3.1">section 3.1</a>)<br /> | 983 |   *  Neutralizes entities referring to characters that are HTML-invalid (see <a href="#s3.1">section 3.1</a>)<br /> |
984 | <br /> | 984 | <br /> |
985 |   *  Neutralizes entities referring to characters that are HTML-discouraged (code-points, hexadecimally, <span class="term">7f</span> to <span class="term">84</span>, <span class="term">86</span> to <span class="term">9f</span>, and <span class="term">fdd0</span> to <span class="term">fddf</span>, or decimally, <span class="term">127</span> to <span class="term">132</span>, <span class="term">134</span> to <span class="term">159</span>, and <span class="term">64991</span> to <span class="term">64976</span>). Entities referring to the remaining discouraged characters (see <a href="#s5.1">section 5.1</a> for a full list) are let through.<br /> | 985 |   *  Neutralizes entities referring to characters that are HTML-discouraged (code-points, hexadecimally, <span class="term">7f</span> to <span class="term">84</span>, <span class="term">86</span> to <span class="term">9f</span>, and <span class="term">fdd0</span> to <span class="term">fddf</span>, or decimally, <span class="term">127</span> to <span class="term">132</span>, <span class="term">134</span> to <span class="term">159</span>, and <span class="term">64991</span> to <span class="term">64976</span>). Entities referring to the remaining discouraged characters (see <a href="#s5.1">section 5.1</a> for a full list) are let through.<br /> |
986 | <br /> | 986 | <br /> |
987 |   *  Neutralizes named entities that are not in the specifications<br /> | 987 |   *  Neutralizes named entities that are not in the specifications<br /> |
988 | <br /> | 988 | <br /> |
989 |   *  Optionally converts valid HTML-specific named entities except <span class="term">&gt;</span>, <span class="term">&lt;</span>, <span class="term">&quot;</span>, and <span class="term">&amp;</span> to decimal numeric ones (hexadecimal if $config["hexdec_entity"] is <span class="term">2</span>) for generic XML-compliance. For this, <span class="term">$config["named_entity"]</span> should be <span class="term">1</span>.<br /> | 989 |   *  Optionally converts valid HTML-specific named entities except <span class="term">&gt;</span>, <span class="term">&lt;</span>, <span class="term">&quot;</span>, and <span class="term">&amp;</span> to decimal numeric ones (hexadecimal if $config["hexdec_entity"] is <span class="term">2</span>) for generic XML-compliance. For this, <span class="term">$config["named_entity"]</span> should be <span class="term">1</span>.<br /> |
990 | <br /> | 990 | <br /> |
991 |   *  Optionally converts hexadecimal numeric entities to the more widely supported decimal ones. For this, <span class="term">$config["hexdec_entity"]</span> should be <span class="term">0</span>.<br /> | 991 |   *  Optionally converts hexadecimal numeric entities to the more widely supported decimal ones. For this, <span class="term">$config["hexdec_entity"]</span> should be <span class="term">0</span>.<br /> |
992 | <br /> | 992 | <br /> |
993 |   *  Optionally converts decimal numeric entities to the hexadecimal ones. For this, <span class="term">$config["hexdec_entity"]</span> should be <span class="term">2</span>.<br /> | 993 |   *  Optionally converts decimal numeric entities to the hexadecimal ones. For this, <span class="term">$config["hexdec_entity"]</span> should be <span class="term">2</span>.<br /> |
994 | <br /> | 994 | <br /> |
995 |   <em>Neutralization</em> refers to the <em>entitification</em> of <span class="term">&</span> to <span class="term">&amp;</span>.<br /> | 995 |   <em>Neutralization</em> refers to the <em>entitification</em> of <span class="term">&</span> to <span class="term">&amp;</span>.<br /> |
996 | <br /> | 996 | <br /> |
997 |   <strong>Note</strong>: htmLawed does not convert entities to the actual characters represented by them; one can pass the htmLawed output through PHP's <span class="term">html_entity_decode</span> <a href="http://www.php.net/html_entity_decode">function</a> for that.<br /> | 997 |   <strong>Note</strong>: htmLawed does not convert entities to the actual characters represented by them; one can pass the htmLawed output through PHP's <span class="term">html_entity_decode</span> <a href="http://www.php.net/html_entity_decode">function</a> for that.<br /> |
998 | <br /> | 998 | <br /> |
999 |   <strong>Note</strong>: If <span class="term">$config["and_mark"]</span> is set, and set to a value other than <span class="term">0</span>, then the <span class="term">&</span> characters in the original input are replaced with the control character for the hexadecimal code-point <span class="term">6</span> (<span class="term">\x06</span>; <span class="term">&</span> characters introduced by htmLawed, e.g., after converting <span class="term"><</span> to <span class="term">&lt;</span>, are not affected). This allows one to distinguish, say, an <span class="term">&gt;</span> introduced by htmLawed and an <span class="term">&gt;</span> put in by the input writer, and can be helpful in further processing of the htmLawed-processed text (e.g., to identify the character sequence <span class="term">o(><)o</span> to generate an emoticon image). When this feature is active, admins should ensure that the htmLawed output is not directly used in web pages or XML documents as the presence of the <span class="term">\x06</span> can break documents. Before use in such documents, and preferably before any storage, any remaining <span class="term">\x06</span> should be changed back to <span class="term">&</span>, e.g., with:<br /> | 999 |   <strong>Note</strong>: If <span class="term">$config["and_mark"]</span> is set, and set to a value other than <span class="term">0</span>, then the <span class="term">&</span> characters in the original input are replaced with the control character for the hexadecimal code-point <span class="term">6</span> (<span class="term">\x06</span>; <span class="term">&</span> characters introduced by htmLawed, e.g., after converting <span class="term"><</span> to <span class="term">&lt;</span>, are not affected). This allows one to distinguish, say, an <span class="term">&gt;</span> introduced by htmLawed and an <span class="term">&gt;</span> put in by the input writer, and can be helpful in further processing of the htmLawed-processed text (e.g., to identify the character sequence <span class="term">o(><)o</span> to generate an emoticon image). When this feature is active, admins should ensure that the htmLawed output is not directly used in web pages or XML documents as the presence of the <span class="term">\x06</span> can break documents. Before use in such documents, and preferably before any storage, any remaining <span class="term">\x06</span> should be changed back to <span class="term">&</span>, e.g., with:<br /> |
1000 | <br /> | 1000 | <br /> |
1001 | 1001 | ||
1002 | <code class="code">    $final = str_replace("\x06", '&', $prelim);</code> | 1002 | <code class="code">    $final = str_replace("\x06", '&', $prelim);</code> |
1003 | <br /> | 1003 | <br /> |
1004 | <br /> | 1004 | <br /> |
1005 |   Also, see <a href="#s3.9">section 3.9</a>.<br /> | 1005 |   Also, see <a href="#s3.9">section 3.9</a>.<br /> |
1006 | 1006 | ||
1007 | </div> | 1007 | </div> |
1008 | <div class="sub-section"><h3> | 1008 | <div class="sub-section"><h3> |
1009 | <a name="s3.3" id="s3.3"></a><span class="item-no">3.3</span>  HTML elements | 1009 | <a name="s3.3" id="s3.3"></a><span class="item-no">3.3</span>  HTML elements |
1010 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1010 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1011 | <br /> | 1011 | <br /> |
1012 |   htmLawed can be configured to allow only certain HTML elements (tags) in the input. Disallowed elements (just tag-content, and not element-content), based on <span class="term">$config["keep_bad"]</span>, are either <em>neutralized</em> (converted to plain text by entitification of <span class="term"><</span> and <span class="term">></span>) or removed.<br /> | 1012 |   htmLawed can be configured to allow only certain HTML elements (tags) in the input. Disallowed elements (just tag-content, and not element-content), based on <span class="term">$config["keep_bad"]</span>, are either <em>neutralized</em> (converted to plain text by entitification of <span class="term"><</span> and <span class="term">></span>) or removed.<br /> |
1013 | <br /> | 1013 | <br /> |
1014 |   E.g., with only <span class="term">em</span> permitted:<br /> | 1014 |   E.g., with only <span class="term">em</span> permitted:<br /> |
1015 | <br /> | 1015 | <br /> |
1016 |   Input:<br /> | 1016 |   Input:<br /> |
1017 | <br /> | 1017 | <br /> |
1018 | 1018 | ||
1019 | <code class="code">      <em>My</em> website is <a href="http://a.com>a.com</a>.</code> | 1019 | <code class="code">      <em>My</em> website is <a href="http://a.com>a.com</a>.</code> |
1020 | <br /> | 1020 | <br /> |
1021 | <br /> | 1021 | <br /> |
1022 |   Output, with <span class="term">$config["keep_bad"] = 0</span>:<br /> | 1022 |   Output, with <span class="term">$config["keep_bad"] = 0</span>:<br /> |
1023 | <br /> | 1023 | <br /> |
1024 | 1024 | ||
1025 | <code class="code">      <em>My</em> website is a.com.</code> | 1025 | <code class="code">      <em>My</em> website is a.com.</code> |
1026 | <br /> | 1026 | <br /> |
1027 | <br /> | 1027 | <br /> |
1028 |   Output, with <span class="term">$config["keep_bad"]</span> not <span class="term">0</span>:<br /> | 1028 |   Output, with <span class="term">$config["keep_bad"]</span> not <span class="term">0</span>:<br /> |
1029 | <br /> | 1029 | <br /> |
1030 | 1030 | ||
1031 | <code class="code">      <em>My</em> website is &lt;a href=""&gt;a.com&lt;/a&gt;.</code> | 1031 | <code class="code">      <em>My</em> website is &lt;a href=""&gt;a.com&lt;/a&gt;.</code> |
1032 | <br /> | 1032 | <br /> |
1033 | <br /> | 1033 | <br /> |
1034 |   See <a href="#s3.3.3">section 3.3.3</a> for differences between the various non-zero <span class="term">$config["keep_bad"]</span> values.<br /> | 1034 |   See <a href="#s3.3.3">section 3.3.3</a> for differences between the various non-zero <span class="term">$config["keep_bad"]</span> values.<br /> |
1035 | <br /> | 1035 | <br /> |
1036 |   htmLawed by default permits these 118 HTML elements:<br /> | 1036 |   htmLawed by default permits these 118 HTML elements:<br /> |
1037 | <br /> | 1037 | <br /> |
1038 | 1038 | ||
1039 | <code class="code">    a, abbr, acronym, address, applet, area, article, aside, audio, b, bdi, bdo, big, blockquote, br, button, canvas, caption, center, cite, code, col, colgroup, command, data, datalist, dd, del, details, dfn, dir, div, dl, dt, em, embed, fieldset, figcaption, figure, font, footer, form, h1, h2, h3, h4, h5, h6, header, hgroup, hr, i, iframe, img, input, ins, isindex, kbd, keygen, label, legend, li, link, main, map, mark, menu, meta, meter, nav, noscript, object, ol, optgroup, option, output, p, param, pre, progress, q, rb, rbc, rp, rt, rtc, ruby, s, samp, script, section, select, small, source, span, strike, strong, style, sub, summary, sup, table, tbody, td, textarea, tfoot, th, thead, time, tr, track, tt, u, ul, var, video, wbr</code> | 1039 | <code class="code">    a, abbr, acronym, address, applet, area, article, aside, audio, b, bdi, bdo, big, blockquote, br, button, canvas, caption, center, cite, code, col, colgroup, command, data, datalist, dd, del, details, dfn, dir, div, dl, dt, em, embed, fieldset, figcaption, figure, font, footer, form, h1, h2, h3, h4, h5, h6, header, hgroup, hr, i, iframe, img, input, ins, isindex, kbd, keygen, label, legend, li, link, main, map, mark, menu, meta, meter, nav, noscript, object, ol, optgroup, option, output, p, param, pre, progress, q, rb, rbc, rp, rt, rtc, ruby, s, samp, script, section, select, small, source, span, strike, strong, style, sub, summary, sup, table, tbody, td, textarea, tfoot, th, thead, time, tr, track, tt, u, ul, var, video, wbr</code> |
1040 | <br /> | 1040 | <br /> |
1041 | <br /> | 1041 | <br /> |
1042 |   The HTML version 4 elements <span class="term">acronym</span>, <span class="term">applet</span>, <span class="term">big</span>, <span class="term">center</span>, <span class="term">dir</span>, <span class="term">font</span>, <span class="term">strike</span>, and <span class="term">tt</span> are obsolete/deprecated in HTML version 5. On the other hand, the obsolete/deprecated HTML 4 elements <span class="term">embed</span>, <span class="term">menu</span> and <span class="term">u</span> are no longer so in HTML 5. Elements new to HTML 5 are <span class="term">article</span>, <span class="term">aside</span>, <span class="term">audio</span>, <span class="term">bdi</span>, <span class="term">canvas</span>, <span class="term">command</span>, <span class="term">data</span>, <span class="term">datalist</span>, <span class="term">details</span>, <span class="term">figure</span>, <span class="term">figcaption</span>, <span class="term">footer</span>, <span class="term">header</span>, <span class="term">hgroup</span>, <span class="term">keygen</span>, <span class="term">link</span>, <span class="term">main</span>, <span class="term">mark</span>, <span class="term">meta</span>, <span class="term">meter</span>, <span class="term">nav</span>, <span class="term">output</span>, <span class="term">progress</span>, <span class="term">section</span>, <span class="term">source</span>, <span class="term">style</span>, <span class="term">summary</span>, <span class="term">time</span>, <span class="term">track</span>, <span class="term">video</span>, and <span class="term">wbr</span>. The <span class="term">link</span>, <span class="term">meta</span> and <span class="term">style</span> elements exist in HTML 4 but are not allowed in the HTML body. These 16 elements are <em>empty</em> elements that have an opening tag with possible content but no element content (thus, no closing tag): <span class="term">area</span>, <span class="term">br</span>, <span class="term">col</span>, <span class="term">command</span>, <span class="term">embed</span>, <span class="term">hr</span>, <span class="term">img</span>, <span class="term">input</span>, <span class="term">isindex</span>, <span class="term">keygen</span>, <span class="term">link</span>, <span class="term">meta</span>, <span class="term">param</span>, <span class="term">source</span>, <span class="term">track</span>, and <span class="term">wbr</span>.<br /> | 1042 |   The HTML version 4 elements <span class="term">acronym</span>, <span class="term">applet</span>, <span class="term">big</span>, <span class="term">center</span>, <span class="term">dir</span>, <span class="term">font</span>, <span class="term">strike</span>, and <span class="term">tt</span> are obsolete/deprecated in HTML version 5. On the other hand, the obsolete/deprecated HTML 4 elements <span class="term">embed</span>, <span class="term">menu</span> and <span class="term">u</span> are no longer so in HTML 5. Elements new to HTML 5 are <span class="term">article</span>, <span class="term">aside</span>, <span class="term">audio</span>, <span class="term">bdi</span>, <span class="term">canvas</span>, <span class="term">command</span>, <span class="term">data</span>, <span class="term">datalist</span>, <span class="term">details</span>, <span class="term">figure</span>, <span class="term">figcaption</span>, <span class="term">footer</span>, <span class="term">header</span>, <span class="term">hgroup</span>, <span class="term">keygen</span>, <span class="term">link</span>, <span class="term">main</span>, <span class="term">mark</span>, <span class="term">meta</span>, <span class="term">meter</span>, <span class="term">nav</span>, <span class="term">output</span>, <span class="term">progress</span>, <span class="term">section</span>, <span class="term">source</span>, <span class="term">style</span>, <span class="term">summary</span>, <span class="term">time</span>, <span class="term">track</span>, <span class="term">video</span>, and <span class="term">wbr</span>. The <span class="term">link</span>, <span class="term">meta</span> and <span class="term">style</span> elements exist in HTML 4 but are not allowed in the HTML body. These 16 elements are <em>empty</em> elements that have an opening tag with possible content but no element content (thus, no closing tag): <span class="term">area</span>, <span class="term">br</span>, <span class="term">col</span>, <span class="term">command</span>, <span class="term">embed</span>, <span class="term">hr</span>, <span class="term">img</span>, <span class="term">input</span>, <span class="term">isindex</span>, <span class="term">keygen</span>, <span class="term">link</span>, <span class="term">meta</span>, <span class="term">param</span>, <span class="term">source</span>, <span class="term">track</span>, and <span class="term">wbr</span>.<br /> |
1043 | <br /> | 1043 | <br /> |
1044 |   With <span class="term">$config["safe"] = 1</span>, the default set will exclude <span class="term">applet</span>, <span class="term">audio</span>, <span class="term">canvas</span>, <span class="term">embed</span>, <span class="term">iframe</span>, <span class="term">object</span>, <span class="term">script</span> and <span class="term">video</span>; see <a href="#s3.6">section 3.6</a>.<br /> | 1044 |   With <span class="term">$config["safe"] = 1</span>, the default set will exclude <span class="term">applet</span>, <span class="term">audio</span>, <span class="term">canvas</span>, <span class="term">embed</span>, <span class="term">iframe</span>, <span class="term">object</span>, <span class="term">script</span> and <span class="term">video</span>; see <a href="#s3.6">section 3.6</a>.<br /> |
1045 | <br /> | 1045 | <br /> |
1046 |   When <span class="term">$config["elements"]</span>, which specifies allowed elements, is <em>properly</em> defined, and neither empty nor set to <span class="term">0</span> or <span class="term">*</span>, the default set is not used. To have elements added to or removed from the default set, a <span class="term">+/-</span> notation is used. E.g., <span class="term">*-script-object</span> implies that only <span class="term">script</span> and <span class="term">object</span> are disallowed, whereas <span class="term">*+embed</span> means that <span class="term">noembed</span> is also allowed. Elements can also be specified as comma separated names. E.g., <span class="term">a, b, i</span> means only <span class="term">a</span>, <span class="term">b</span> and <span class="term">i</span> are permitted. In this notation, <span class="term">*</span>, <span class="term">+</span> and <span class="term">-</span> have no significance and can actually cause a mis-reading.<br /> | 1046 |   When <span class="term">$config["elements"]</span>, which specifies allowed elements, is <em>properly</em> defined, and neither empty nor set to <span class="term">0</span> or <span class="term">*</span>, the default set is not used. To have elements added to or removed from the default set, a <span class="term">+/-</span> notation is used. E.g., <span class="term">*-script-object</span> implies that only <span class="term">script</span> and <span class="term">object</span> are disallowed, whereas <span class="term">*+embed</span> means that <span class="term">noembed</span> is also allowed. Elements can also be specified as comma separated names. E.g., <span class="term">a, b, i</span> means only <span class="term">a</span>, <span class="term">b</span> and <span class="term">i</span> are permitted. In this notation, <span class="term">*</span>, <span class="term">+</span> and <span class="term">-</span> have no significance and can actually cause a mis-reading.<br /> |
1047 | <br /> | 1047 | <br /> |
1048 |   Some more examples of <span class="term">$config["elements"]</span> values indicating permitted elements (note that empty spaces are liberally allowed for clarity):<br /> | 1048 |   Some more examples of <span class="term">$config["elements"]</span> values indicating permitted elements (note that empty spaces are liberally allowed for clarity):<br /> |
1049 | <br /> | 1049 | <br /> |
1050 |   *  <span class="term">a, blockquote, code, em, strong</span> -- only <span class="term">a</span>, <span class="term">blockquote</span>, <span class="term">code</span>, <span class="term">em</span>, and <span class="term">strong</span><br /> | 1050 |   *  <span class="term">a, blockquote, code, em, strong</span> -- only <span class="term">a</span>, <span class="term">blockquote</span>, <span class="term">code</span>, <span class="term">em</span>, and <span class="term">strong</span><br /> |
1051 |   *  <span class="term">*-script</span> -- all excluding <span class="term">script</span><br /> | 1051 |   *  <span class="term">*-script</span> -- all excluding <span class="term">script</span><br /> |
1052 |   *  <span class="term">* -acronym -big -center -dir -font -isindex -s -strike -tt</span> -- only non-obsolete/deprecated elements of HTML5<br /> | 1052 |   *  <span class="term">* -acronym -big -center -dir -font -isindex -s -strike -tt</span> -- only non-obsolete/deprecated elements of HTML5<br /> |
1053 |   *  <span class="term">*+noembed-script</span> -- all including <span class="term">noembed</span> excluding <span class="term">script</span><br /> | 1053 |   *  <span class="term">*+noembed-script</span> -- all including <span class="term">noembed</span> excluding <span class="term">script</span><br /> |
1054 | <br /> | 1054 | <br /> |
1055 |   Some mis-usages (and the resulting permitted elements) that can be avoided:<br /> | 1055 |   Some mis-usages (and the resulting permitted elements) that can be avoided:<br /> |
1056 | <br /> | 1056 | <br /> |
1057 |   *  <span class="term">-*</span> -- none; instead of htmLawed, one might just use, e.g., the <span class="term">htmlspecialchars()</span> PHP function<br /> | 1057 |   *  <span class="term">-*</span> -- none; instead of htmLawed, one might just use, e.g., the <span class="term">htmlspecialchars()</span> PHP function<br /> |
1058 |   *  <span class="term">*, -script</span> -- all except <span class="term">script</span>; admin probably meant <span class="term">*-script</span><br /> | 1058 |   *  <span class="term">*, -script</span> -- all except <span class="term">script</span>; admin probably meant <span class="term">*-script</span><br /> |
1059 |   *  <span class="term">-*, a, em, strong</span> -- all; admin probably meant <span class="term">a, em, strong</span><br /> | 1059 |   *  <span class="term">-*, a, em, strong</span> -- all; admin probably meant <span class="term">a, em, strong</span><br /> |
1060 |   *  <span class="term">*</span> -- all; admin need not have set <span class="term">elements</span><br /> | 1060 |   *  <span class="term">*</span> -- all; admin need not have set <span class="term">elements</span><br /> |
1061 |   *  <span class="term">*-form+form</span> -- all; a <span class="term">+</span> will always over-ride any <span class="term">-</span><br /> | 1061 |   *  <span class="term">*-form+form</span> -- all; a <span class="term">+</span> will always over-ride any <span class="term">-</span><br /> |
1062 |   *  <span class="term">*, noembed</span> -- only <span class="term">noembed</span>; admin probably meant <span class="term">*+noembed</span><br /> | 1062 |   *  <span class="term">*, noembed</span> -- only <span class="term">noembed</span>; admin probably meant <span class="term">*+noembed</span><br /> |
1063 |   *  <span class="term">a, +b, i</span> -- only <span class="term">a</span> and <span class="term">i</span>; admin probably meant <span class="term">a, b, i</span><br /> | 1063 |   *  <span class="term">a, +b, i</span> -- only <span class="term">a</span> and <span class="term">i</span>; admin probably meant <span class="term">a, b, i</span><br /> |
1064 | <br /> | 1064 | <br /> |
1065 |   Basically, when using the <span class="term">+/-</span> notation, commas (<span class="term">,</span>) should not be used, and vice versa, and <span class="term">*</span> should be used with the former but not the latter.<br /> | 1065 |   Basically, when using the <span class="term">+/-</span> notation, commas (<span class="term">,</span>) should not be used, and vice versa, and <span class="term">*</span> should be used with the former but not the latter.<br /> |
1066 | <br /> | 1066 | <br /> |
1067 |   <strong>Note</strong>: Even if an element that is not in the default set is allowed through <span class="term">$config["elements"]</span>, like <span class="term">noembed</span> in the last example, it will eventually be removed during tag balancing unless such balancing is turned off (<span class="term">$config["balance"]</span> set to <span class="term">0</span>). Currently, the only way around this, which actually is simple, is to edit htmLawed's PHP code which define various arrays in the function <span class="term">hl_bal()</span> to accommodate the element and its nesting properties.<br /> | 1067 |   <strong>Note</strong>: Even if an element that is not in the default set is allowed through <span class="term">$config["elements"]</span>, like <span class="term">noembed</span> in the last example, it will eventually be removed during tag balancing unless such balancing is turned off (<span class="term">$config["balance"]</span> set to <span class="term">0</span>). Currently, the only way around this, which actually is simple, is to edit htmLawed's PHP code which define various arrays in the function <span class="term">hl_bal()</span> to accommodate the element and its nesting properties.<br /> |
1068 | <br /> | 1068 | <br /> |
1069 |   A possible second way to specify allowed elements is to set <span class="term">$config["parent"]</span> to an element name that supposedly will hold the input, and to set <span class="term">$config["balance"]</span> to <span class="term">1</span>. During tag balancing (see <a href="#s3.3.3">section 3.3.3</a>), all elements that cannot legally nest inside the parent element will be removed. The parent element is auto-reset to <span class="term">div</span> if <span class="term">$config["parent"]</span> is empty, <span class="term">body</span>, or an element not in htmLawed's default set of 118 elements.<br /> | 1069 |   A possible second way to specify allowed elements is to set <span class="term">$config["parent"]</span> to an element name that supposedly will hold the input, and to set <span class="term">$config["balance"]</span> to <span class="term">1</span>. During tag balancing (see <a href="#s3.3.3">section 3.3.3</a>), all elements that cannot legally nest inside the parent element will be removed. The parent element is auto-reset to <span class="term">div</span> if <span class="term">$config["parent"]</span> is empty, <span class="term">body</span>, or an element not in htmLawed's default set of 118 elements.<br /> |
1070 | <br /> | 1070 | <br /> |
1071 |   <em>Tag transformation</em> is possible for improving compliance with HTML standards -- most of the obsolete/deprecated elements of HTML version 5 are converted to valid  ones; see <a href="#s3.3.2">section 3.3.2</a>.<br /> | 1071 |   <em>Tag transformation</em> is possible for improving compliance with HTML standards -- most of the obsolete/deprecated elements of HTML version 5 are converted to valid  ones; see <a href="#s3.3.2">section 3.3.2</a>.<br /> |
1072 | 1072 | ||
1073 | <div class="sub-sub-section"><h4> | 1073 | <div class="sub-sub-section"><h4> |
1074 | <a name="s3.3.1" id="s3.3.1"></a><span class="item-no">3.3.1</span>  Handling of comments & CDATA sections | 1074 | <a name="s3.3.1" id="s3.3.1"></a><span class="item-no">3.3.1</span>  Handling of comments & CDATA sections |
1075 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1075 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1076 | <br /> | 1076 | <br /> |
1077 |   <span class="term">CDATA</span> sections have the format <span class="term"><![CDATA[...anything but not "]]>"...]]></span>, and HTML comments, <span class="term"><!--...anything but not "-->"... --></span>. Neither HTML comments nor <span class="term">CDATA</span> sections can reside inside tags. HTML comments can exist anywhere else, but <span class="term">CDATA</span> sections can exist only where plain text is allowed (e.g., immediately inside <span class="term">td</span> element content but not immediately inside <span class="term">tr</span> element content).<br /> | 1077 |   <span class="term">CDATA</span> sections have the format <span class="term"><![CDATA[...anything but not "]]>"...]]></span>, and HTML comments, <span class="term"><!--...anything but not "-->"... --></span>. Neither HTML comments nor <span class="term">CDATA</span> sections can reside inside tags. HTML comments can exist anywhere else, but <span class="term">CDATA</span> sections can exist only where plain text is allowed (e.g., immediately inside <span class="term">td</span> element content but not immediately inside <span class="term">tr</span> element content).<br /> |
1078 | <br /> | 1078 | <br /> |
1079 |   htmLawed (function <span class="term">hl_cmtcd()</span>) handles HTML comments or <span class="term">CDATA</span> sections depending on the values of <span class="term">$config["comment"]</span> or <span class="term">$config["cdata"]</span>. If <span class="term">0</span>, such markup is not looked for and the text is processed like plain text. If <span class="term">1</span>, it is removed completely. If <span class="term">2</span>, it is preserved but any <span class="term"><</span>, <span class="term">></span> and <span class="term">&</span> inside are changed to entities. If <span class="term">3</span> for <span class="term">$config["cdata"]</span>, or <span class="term">3</span> or <span class="term">4</span> for <span class="term">$config["comment"]</span>, they are left as such. When <span class="term">$config["comment"]</span> is set to <span class="term">4</span>, htmLawed will not force a space character before the <span class="term">--></span> comment-closing marker. While such a space is required for standard-compliance, it can corrupt marker code put in HTML by some software (such as Microsoft Outlook).<br /> | 1079 |   htmLawed (function <span class="term">hl_cmtcd()</span>) handles HTML comments or <span class="term">CDATA</span> sections depending on the values of <span class="term">$config["comment"]</span> or <span class="term">$config["cdata"]</span>. If <span class="term">0</span>, such markup is not looked for and the text is processed like plain text. If <span class="term">1</span>, it is removed completely. If <span class="term">2</span>, it is preserved but any <span class="term"><</span>, <span class="term">></span> and <span class="term">&</span> inside are changed to entities. If <span class="term">3</span> for <span class="term">$config["cdata"]</span>, or <span class="term">3</span> or <span class="term">4</span> for <span class="term">$config["comment"]</span>, they are left as such. When <span class="term">$config["comment"]</span> is set to <span class="term">4</span>, htmLawed will not force a space character before the <span class="term">--></span> comment-closing marker. While such a space is required for standard-compliance, it can corrupt marker code put in HTML by some software (such as Microsoft Outlook).<br /> |
1080 | <br /> | 1080 | <br /> |
1081 |   Note that for the last two cases, HTML comments and <span class="term">CDATA</span> sections will always be removed from tag content (function <span class="term">hl_tag()</span>).<br /> | 1081 |   Note that for the last two cases, HTML comments and <span class="term">CDATA</span> sections will always be removed from tag content (function <span class="term">hl_tag()</span>).<br /> |
1082 | <br /> | 1082 | <br /> |
1083 |   Examples:<br /> | 1083 |   Examples:<br /> |
1084 | <br /> | 1084 | <br /> |
1085 |   Input:<br /> | 1085 |   Input:<br /> |
1086 | 1086 | ||
1087 | <code class="code">    <!-- home link--><a href="home.htm"><![CDATA[x=&y]]>Home</a></code> | 1087 | <code class="code">    <!-- home link--><a href="home.htm"><![CDATA[x=&y]]>Home</a></code> |
1088 | <br /> | 1088 | <br /> |
1089 |   Output (<span class="term">$config["comment"] = 0, $config["cdata"] = 2</span>):<br /> | 1089 |   Output (<span class="term">$config["comment"] = 0, $config["cdata"] = 2</span>):<br /> |
1090 | 1090 | ||
1091 | <code class="code">    &lt;-- home link--&gt;<a href="home.htm"><![CDATA[x=&amp;y]]>Home</a></code> | 1091 | <code class="code">    &lt;-- home link--&gt;<a href="home.htm"><![CDATA[x=&amp;y]]>Home</a></code> |
1092 | <br /> | 1092 | <br /> |
1093 |   Output (<span class="term">$config["comment"] = 1, $config["cdata"] = 2</span>):<br /> | 1093 |   Output (<span class="term">$config["comment"] = 1, $config["cdata"] = 2</span>):<br /> |
1094 | 1094 | ||
1095 | <code class="code">    <a href="home.htm"><![CDATA[x=&amp;y]]>Home</a></code> | 1095 | <code class="code">    <a href="home.htm"><![CDATA[x=&amp;y]]>Home</a></code> |
1096 | <br /> | 1096 | <br /> |
1097 |   Output (<span class="term">$config["comment"] = 2, $config["cdata"] = 2</span>):<br /> | 1097 |   Output (<span class="term">$config["comment"] = 2, $config["cdata"] = 2</span>):<br /> |
1098 | 1098 | ||
1099 | <code class="code">    <!-- home link --><a href="home.htm"><![CDATA[x=&amp;y]]>Home</a></code> | 1099 | <code class="code">    <!-- home link --><a href="home.htm"><![CDATA[x=&amp;y]]>Home</a></code> |
1100 | <br /> | 1100 | <br /> |
1101 |   Output (<span class="term">$config["comment"] = 2, $config["cdata"] = 1</span>):<br /> | 1101 |   Output (<span class="term">$config["comment"] = 2, $config["cdata"] = 1</span>):<br /> |
1102 | 1102 | ||
1103 | <code class="code">    <!-- home link --><a href="home.htm">Home</a></code> | 1103 | <code class="code">    <!-- home link --><a href="home.htm">Home</a></code> |
1104 | <br /> | 1104 | <br /> |
1105 |   Output (<span class="term">$config["comment"] = 3, $config["cdata"] = 3</span>):<br /> | 1105 |   Output (<span class="term">$config["comment"] = 3, $config["cdata"] = 3</span>):<br /> |
1106 | 1106 | ||
1107 | <code class="code">    <!-- home link --><a href="home.htm"><![CDATA[x=&y]]>Home</a></code> | 1107 | <code class="code">    <!-- home link --><a href="home.htm"><![CDATA[x=&y]]>Home</a></code> |
1108 | <br /> | 1108 | <br /> |
1109 |   Output (<span class="term">$config["comment"] = 4, $config["cdata"] = 3</span>):<br /> | 1109 |   Output (<span class="term">$config["comment"] = 4, $config["cdata"] = 3</span>):<br /> |
1110 | 1110 | ||
1111 | <code class="code">    <!-- home link--><a href="home.htm"><![CDATA[x=&y]]>Home</a></code> | 1111 | <code class="code">    <!-- home link--><a href="home.htm"><![CDATA[x=&y]]>Home</a></code> |
1112 | <br /> | 1112 | <br /> |
1113 | <br /> | 1113 | <br /> |
1114 |   For standard-compliance, comments are given the form <span class="term"><!--comment --></span>, and any <span class="term">--</span> in the content is made <span class="term">-</span>. When <span class="term">$config["comment"]</span> is set to <span class="term">4</span>, htmLawed will not force a space character before the <span class="term">--></span> comment-closing marker.<br /> | 1114 |   For standard-compliance, comments are given the form <span class="term"><!--comment --></span>, and any <span class="term">--</span> in the content is made <span class="term">-</span>. When <span class="term">$config["comment"]</span> is set to <span class="term">4</span>, htmLawed will not force a space character before the <span class="term">--></span> comment-closing marker.<br /> |
1115 | <br /> | 1115 | <br /> |
1116 |   When <span class="term">$config["safe"] = 1</span>, CDATA sections and comments are considered plain text unless <span class="term">$config["comment"]</span> or <span class="term">$config["cdata"]</span> is explicitly specified; see <a href="#s3.6">section 3.6</a>.<br /> | 1116 |   When <span class="term">$config["safe"] = 1</span>, CDATA sections and comments are considered plain text unless <span class="term">$config["comment"]</span> or <span class="term">$config["cdata"]</span> is explicitly specified; see <a href="#s3.6">section 3.6</a>.<br /> |
1117 | 1117 | ||
1118 | </div> | 1118 | </div> |
1119 | <div class="sub-sub-section"><h4> | 1119 | <div class="sub-sub-section"><h4> |
1120 | <a name="s3.3.2" id="s3.3.2"></a><span class="item-no">3.3.2</span>  Tag-transformation for better compliance with standards | 1120 | <a name="s3.3.2" id="s3.3.2"></a><span class="item-no">3.3.2</span>  Tag-transformation for better compliance with standards |
1121 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1121 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1122 | <br /> | 1122 | <br /> |
1123 |   If <span class="term">$config["make_tag_strict"]</span> is set and not <span class="term">0</span>, following deprecated elements (and attributes), as per HTML 5 specification, even if admin-permitted, are mutated as indicated (element content remains intact; function <span class="term">hl_tag2()</span>):<br /> | 1123 |   If <span class="term">$config["make_tag_strict"]</span> is set and not <span class="term">0</span>, following deprecated elements (and attributes), as per HTML 5 specification, even if admin-permitted, are mutated as indicated (element content remains intact; function <span class="term">hl_tag2()</span>):<br /> |
1124 | <br /> | 1124 | <br /> |
1125 |   *  acronym - <span class="term">abbr</span><br /> | 1125 |   *  acronym - <span class="term">abbr</span><br /> |
1126 |   *  applet - based on <span class="term">$config["make_tag_strict"]</span>, unchanged (<span class="term">1</span>) or removed (<span class="term">2</span>)<br /> | 1126 |   *  applet - based on <span class="term">$config["make_tag_strict"]</span>, unchanged (<span class="term">1</span>) or removed (<span class="term">2</span>)<br /> |
1127 |   *  big - <span class="term">span style="font-size: larger;"</span><br /> | 1127 |   *  big - <span class="term">span style="font-size: larger;"</span><br /> |
1128 |   *  center - <span class="term">div style="text-align: center;"</span><br /> | 1128 |   *  center - <span class="term">div style="text-align: center;"</span><br /> |
1129 |   *  dir - <span class="term">ul</span><br /> | 1129 |   *  dir - <span class="term">ul</span><br /> |
1130 |   *  font (face, size, color) -    <span class="term">span style="font-family: ; font-size: ; color: ;"</span> (size transformation <a href="http://web.archive.org/web/20180201141931/http://style.cleverchimp.com/font_size_intervals/altintervals.html">reference</a>)<br /> | 1130 |   *  font (face, size, color) -    <span class="term">span style="font-family: ; font-size: ; color: ;"</span> (size transformation <a href="http://web.archive.org/web/20180201141931/http://style.cleverchimp.com/font_size_intervals/altintervals.html">reference</a>)<br /> |
1131 |   *  isindex - based on <span class="term">$config["make_tag_strict"]</span>, unchanged (<span class="term">1</span>) or removed (<span class="term">2</span>)<br /> | 1131 |   *  isindex - based on <span class="term">$config["make_tag_strict"]</span>, unchanged (<span class="term">1</span>) or removed (<span class="term">2</span>)<br /> |
1132 |   *  s - <span class="term">span style="text-decoration: line-through;"</span><br /> | 1132 |   *  s - <span class="term">span style="text-decoration: line-through;"</span><br /> |
1133 |   *  strike - <span class="term">span style="text-decoration: line-through;"</span><br /> | 1133 |   *  strike - <span class="term">span style="text-decoration: line-through;"</span><br /> |
1134 |   *  tt - <span class="term">code</span><br /> | 1134 |   *  tt - <span class="term">code</span><br /> |
1135 | <br /> | 1135 | <br /> |
1136 |   For an element with a pre-existing <span class="term">style</span> attribute value, the extra style properties are appended.<br /> | 1136 |   For an element with a pre-existing <span class="term">style</span> attribute value, the extra style properties are appended.<br /> |
1137 | <br /> | 1137 | <br /> |
1138 |   Example input:<br /> | 1138 |   Example input:<br /> |
1139 | <br /> | 1139 | <br /> |
1140 | 1140 | ||
1141 | <code class="code">    <center></code> | 1141 | <code class="code">    <center></code> |
1142 | <br /> | 1142 | <br /> |
1143 | 1143 | ||
1144 | <code class="code">     The PHP <s>software</s> script used for this <strike>web-page</strike> web-page is <font style="font-weight: bold " face=arial size='+3' color   =  "red  ">htmLawedTest.php</font>, from <u style= 'color:green'>PHP Labware</u>.</code> | 1144 | <code class="code">     The PHP <s>software</s> script used for this <strike>web-page</strike> web-page is <font style="font-weight: bold " face=arial size='+3' color   =  "red  ">htmLawedTest.php</font>, from <u style= 'color:green'>PHP Labware</u>.</code> |
1145 | <br /> | 1145 | <br /> |
1146 | 1146 | ||
1147 | <code class="code">    </center></code> | 1147 | <code class="code">    </center></code> |
1148 | <br /> | 1148 | <br /> |
1149 | <br /> | 1149 | <br /> |
1150 |   The output:<br /> | 1150 |   The output:<br /> |
1151 | <br /> | 1151 | <br /> |
1152 | 1152 | ||
1153 | <code class="code">    <div style="text-align: center;"></code> | 1153 | <code class="code">    <div style="text-align: center;"></code> |
1154 | <br /> | 1154 | <br /> |
1155 | 1155 | ||
1156 | <code class="code">     The PHP <span style="text-decoration: line-through;">software</span> script used for this <span style="text-decoration: line-through;">web-page</span> web-page is <span style="font-weight: bold; font-size: 200%; color: red; font-family: arial;">htmLawedTest.php</span>, from <u style="color:green">PHP Labware</u>.</code> | 1156 | <code class="code">     The PHP <span style="text-decoration: line-through;">software</span> script used for this <span style="text-decoration: line-through;">web-page</span> web-page is <span style="font-weight: bold; font-size: 200%; color: red; font-family: arial;">htmLawedTest.php</span>, from <u style="color:green">PHP Labware</u>.</code> |
1157 | <br /> | 1157 | <br /> |
1158 | 1158 | ||
1159 | <code class="code">    </div></code> | 1159 | <code class="code">    </div></code> |
1160 | <br /> | 1160 | <br /> |
1161 | 1161 | ||
1162 | </div> | 1162 | </div> |
1163 | <div class="sub-sub-section"><h4> | 1163 | <div class="sub-sub-section"><h4> |
1164 | <a name="s3.3.3" id="s3.3.3"></a><span class="item-no">3.3.3</span>  Tag balancing & proper nesting | 1164 | <a name="s3.3.3" id="s3.3.3"></a><span class="item-no">3.3.3</span>  Tag balancing & proper nesting |
1165 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1165 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1166 | <br /> | 1166 | <br /> |
1167 |   If <span class="term">$config["balance"]</span> is set to <span class="term">1</span>, htmLawed (function <span class="term">hl_bal()</span>) checks and corrects the input to have properly balanced tags and legal element content (i.e., any element nesting should be valid, and plain text may be present only in the content of elements that allow them).<br /> | 1167 |   If <span class="term">$config["balance"]</span> is set to <span class="term">1</span>, htmLawed (function <span class="term">hl_bal()</span>) checks and corrects the input to have properly balanced tags and legal element content (i.e., any element nesting should be valid, and plain text may be present only in the content of elements that allow them).<br /> |
1168 | <br /> | 1168 | <br /> |
1169 |   Depending on the value of <span class="term">$config["keep_bad"]</span> (see <a href="#s2.2">section 2.2</a> and <a href="#s3.3">section 3.3</a>), illegal content may be removed or neutralized to plain text by converting < and > to entities:<br /> | 1169 |   Depending on the value of <span class="term">$config["keep_bad"]</span> (see <a href="#s2.2">section 2.2</a> and <a href="#s3.3">section 3.3</a>), illegal content may be removed or neutralized to plain text by converting < and > to entities:<br /> |
1170 | <br /> | 1170 | <br /> |
1171 |   <span class="term">0</span> - remove; this option is available only to maintain Kses-compatibility and should not be used otherwise (see <a href="#s2.6">section 2.6</a>)<br /> | 1171 |   <span class="term">0</span> - remove; this option is available only to maintain Kses-compatibility and should not be used otherwise (see <a href="#s2.6">section 2.6</a>)<br /> |
1172 |   <span class="term">1</span> - neutralize tags and keep element content<br /> | 1172 |   <span class="term">1</span> - neutralize tags and keep element content<br /> |
1173 |   <span class="term">2</span> - remove tags but keep element content<br /> | 1173 |   <span class="term">2</span> - remove tags but keep element content<br /> |
1174 |   <span class="term">3</span> and <span class="term">4</span> - like <span class="term">1</span> and <span class="term">2</span>, but keep element content only if text (<span class="term">pcdata</span>) is valid in parent element as per specs<br /> | 1174 |   <span class="term">3</span> and <span class="term">4</span> - like <span class="term">1</span> and <span class="term">2</span>, but keep element content only if text (<span class="term">pcdata</span>) is valid in parent element as per specs<br /> |
1175 |   <span class="term">5</span> and <span class="term">6</span> -  like <span class="term">3</span> and <span class="term">4</span>, but line-breaks, tabs and spaces are left<br /> | 1175 |   <span class="term">5</span> and <span class="term">6</span> -  like <span class="term">3</span> and <span class="term">4</span>, but line-breaks, tabs and spaces are left<br /> |
1176 | <br /> | 1176 | <br /> |
1177 |   Example input (disallowing the <span class="term">p</span> element):<br /> | 1177 |   Example input (disallowing the <span class="term">p</span> element):<br /> |
1178 | <br /> | 1178 | <br /> |
1179 | 1179 | ||
1180 | <code class="code">    <*> Pseudo-tags <*></code> | 1180 | <code class="code">    <*> Pseudo-tags <*></code> |
1181 | <br /> | 1181 | <br /> |
1182 | 1182 | ||
1183 | <code class="code">    <xml>Non-HTML tag xml</xml></code> | 1183 | <code class="code">    <xml>Non-HTML tag xml</xml></code> |
1184 | <br /> | 1184 | <br /> |
1185 | 1185 | ||
1186 | <code class="code">    <p></code> | 1186 | <code class="code">    <p></code> |
1187 | <br /> | 1187 | <br /> |
1188 | 1188 | ||
1189 | <code class="code">    Disallowed tag p</code> | 1189 | <code class="code">    Disallowed tag p</code> |
1190 | <br /> | 1190 | <br /> |
1191 | 1191 | ||
1192 | <code class="code">    </p></code> | 1192 | <code class="code">    </p></code> |
1193 | <br /> | 1193 | <br /> |
1194 | 1194 | ||
1195 | <code class="code">    <ul>Bad<li>OK</li></ul></code> | 1195 | <code class="code">    <ul>Bad<li>OK</li></ul></code> |
1196 | <br /> | 1196 | <br /> |
1197 | <br /> | 1197 | <br /> |
1198 |   The output with <span class="term">$config["keep_bad"] = 1</span>:<br /> | 1198 |   The output with <span class="term">$config["keep_bad"] = 1</span>:<br /> |
1199 | <br /> | 1199 | <br /> |
1200 | 1200 | ||
1201 | <code class="code">    &lt;*&gt; Pseudo-tags &lt;*&gt;</code> | 1201 | <code class="code">    &lt;*&gt; Pseudo-tags &lt;*&gt;</code> |
1202 | <br /> | 1202 | <br /> |
1203 | 1203 | ||
1204 | <code class="code">    &lt;xml&gt;Non-HTML tag xml&lt;/xml&gt;</code> | 1204 | <code class="code">    &lt;xml&gt;Non-HTML tag xml&lt;/xml&gt;</code> |
1205 | <br /> | 1205 | <br /> |
1206 | 1206 | ||
1207 | <code class="code">    &lt;p&gt;</code> | 1207 | <code class="code">    &lt;p&gt;</code> |
1208 | <br /> | 1208 | <br /> |
1209 | 1209 | ||
1210 | <code class="code">    Disallowed tag p</code> | 1210 | <code class="code">    Disallowed tag p</code> |
1211 | <br /> | 1211 | <br /> |
1212 | 1212 | ||
1213 | <code class="code">    &lt;/p&gt;</code> | 1213 | <code class="code">    &lt;/p&gt;</code> |
1214 | <br /> | 1214 | <br /> |
1215 | 1215 | ||
1216 | <code class="code">    <ul>Bad<li>OK</li></ul></code> | 1216 | <code class="code">    <ul>Bad<li>OK</li></ul></code> |
1217 | <br /> | 1217 | <br /> |
1218 | <br /> | 1218 | <br /> |
1219 |   The output with <span class="term">$config["keep_bad"] = 3</span>:<br /> | 1219 |   The output with <span class="term">$config["keep_bad"] = 3</span>:<br /> |
1220 | <br /> | 1220 | <br /> |
1221 | 1221 | ||
1222 | <code class="code">    &lt;*&gt; Pseudo-tags &lt;*&gt;</code> | 1222 | <code class="code">    &lt;*&gt; Pseudo-tags &lt;*&gt;</code> |
1223 | <br /> | 1223 | <br /> |
1224 | 1224 | ||
1225 | <code class="code">    &lt;xml&gt;Non-HTML tag xml&lt;/xml&gt;</code> | 1225 | <code class="code">    &lt;xml&gt;Non-HTML tag xml&lt;/xml&gt;</code> |
1226 | <br /> | 1226 | <br /> |
1227 | 1227 | ||
1228 | <code class="code">    &lt;p&gt;</code> | 1228 | <code class="code">    &lt;p&gt;</code> |
1229 | <br /> | 1229 | <br /> |
1230 | 1230 | ||
1231 | <code class="code">    Disallowed tag p</code> | 1231 | <code class="code">    Disallowed tag p</code> |
1232 | <br /> | 1232 | <br /> |
1233 | 1233 | ||
1234 | <code class="code">    &lt;/p&gt;</code> | 1234 | <code class="code">    &lt;/p&gt;</code> |
1235 | <br /> | 1235 | <br /> |
1236 | 1236 | ||
1237 | <code class="code">    <ul><li>OK</li></ul></code> | 1237 | <code class="code">    <ul><li>OK</li></ul></code> |
1238 | <br /> | 1238 | <br /> |
1239 | <br /> | 1239 | <br /> |
1240 |   The output with <span class="term">$config["keep_bad"] = 6</span>:<br /> | 1240 |   The output with <span class="term">$config["keep_bad"] = 6</span>:<br /> |
1241 | <br /> | 1241 | <br /> |
1242 | 1242 | ||
1243 | <code class="code">    &lt;*&gt; Pseudo-tags &lt;*&gt;</code> | 1243 | <code class="code">    &lt;*&gt; Pseudo-tags &lt;*&gt;</code> |
1244 | <br /> | 1244 | <br /> |
1245 | 1245 | ||
1246 | <code class="code">    Non-HTML tag xml</code> | 1246 | <code class="code">    Non-HTML tag xml</code> |
1247 | <br /> | 1247 | <br /> |
1248 | <br /> | 1248 | <br /> |
1249 | 1249 | ||
1250 | <code class="code">    Disallowed tag p</code> | 1250 | <code class="code">    Disallowed tag p</code> |
1251 | <br /> | 1251 | <br /> |
1252 | <br /> | 1252 | <br /> |
1253 | 1253 | ||
1254 | <code class="code">    <ul><li>OK</li></ul></code> | 1254 | <code class="code">    <ul><li>OK</li></ul></code> |
1255 | <br /> | 1255 | <br /> |
1256 | <br /> | 1256 | <br /> |
1257 |   An option like <span class="term">1</span> is useful, e.g., when a writer previews his submission, whereas one like <span class="term">3</span> is useful before content is finalized and made available to all.<br /> | 1257 |   An option like <span class="term">1</span> is useful, e.g., when a writer previews his submission, whereas one like <span class="term">3</span> is useful before content is finalized and made available to all.<br /> |
1258 | <br /> | 1258 | <br /> |
1259 |   <strong>Note:</strong> In the example above, unlike <span class="term"><*></span>, <span class="term"><xml></span> gets considered as a tag (even though there is no HTML element named <span class="term">xml</span>). Thus, the <span class="term">keep_bad</span> parameter's value affects <span class="term"><xml></span> but not <span class="term"><*></span>. In general, text matching the regular expression pattern <span class="term"><(/?)([a-zA-Z][a-zA-Z1-6]*)([^>]*?)\s?></span> is considered a tag (phrase enclosed by the angled brackets <span class="term"><</span> and <span class="term">></span>, and starting [with an optional slash preceding] with an alphanumeric word that starts with an alphabet...), and is subjected to the <span class="term">keep_bad</span> value.<br /> | 1259 |   <strong>Note:</strong> In the example above, unlike <span class="term"><*></span>, <span class="term"><xml></span> gets considered as a tag (even though there is no HTML element named <span class="term">xml</span>). Thus, the <span class="term">keep_bad</span> parameter's value affects <span class="term"><xml></span> but not <span class="term"><*></span>. In general, text matching the regular expression pattern <span class="term"><(/?)([a-zA-Z][a-zA-Z1-6]*)([^>]*?)\s?></span> is considered a tag (phrase enclosed by the angled brackets <span class="term"><</span> and <span class="term">></span>, and starting [with an optional slash preceding] with an alphanumeric word that starts with an alphabet...), and is subjected to the <span class="term">keep_bad</span> value.<br /> |
1260 | <br /> | 1260 | <br /> |
1261 |   Nesting/content rules for each of the 118 elements in htmLawed's default set (see <a href="#s3.3">section 3.3</a>) are defined in function <span class="term">hl_bal()</span>. This means that if a non-standard element besides <span class="term">embed</span> is being permitted through <span class="term">$config["elements"]</span>, the element's tag content will end up getting removed if <span class="term">$config["balance"]</span> is set to <span class="term">1</span>.<br /> | 1261 |   Nesting/content rules for each of the 118 elements in htmLawed's default set (see <a href="#s3.3">section 3.3</a>) are defined in function <span class="term">hl_bal()</span>. This means that if a non-standard element besides <span class="term">embed</span> is being permitted through <span class="term">$config["elements"]</span>, the element's tag content will end up getting removed if <span class="term">$config["balance"]</span> is set to <span class="term">1</span>.<br /> |
1262 | <br /> | 1262 | <br /> |
1263 |   Plain text and/or certain elements nested inside <span class="term">blockquote</span>, <span class="term">form</span>, <span class="term">map</span> and <span class="term">noscript</span> need to be in block-level elements. This point is often missed during manual writing of HTML code. htmLawed attempts to address this during balancing. E.g., if the parent container is set as <span class="term">form</span>, the input <span class="term">B:<input type="text" value="b" />C:<input type="text" value="c" /></span> is converted to <span class="term"><div>B:<input type="text" value="b" />C:<input type="text" value="c" /></div></span>.<br /> | 1263 |   Plain text and/or certain elements nested inside <span class="term">blockquote</span>, <span class="term">form</span>, <span class="term">map</span> and <span class="term">noscript</span> need to be in block-level elements. This point is often missed during manual writing of HTML code. htmLawed attempts to address this during balancing. E.g., if the parent container is set as <span class="term">form</span>, the input <span class="term">B:<input type="text" value="b" />C:<input type="text" value="c" /></span> is converted to <span class="term"><div>B:<input type="text" value="b" />C:<input type="text" value="c" /></div></span>.<br /> |
1264 | 1264 | ||
1265 | </div> | 1265 | </div> |
1266 | <div class="sub-sub-section"><h4> | 1266 | <div class="sub-sub-section"><h4> |
1267 | <a name="s3.3.4" id="s3.3.4"></a><span class="item-no">3.3.4</span>  Elements requiring child elements | 1267 | <a name="s3.3.4" id="s3.3.4"></a><span class="item-no">3.3.4</span>  Elements requiring child elements |
1268 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1268 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1269 | <br /> | 1269 | <br /> |
1270 |   As per HTML specifications, elements such as those below require legal child elements nested inside them:<br /> | 1270 |   As per HTML specifications, elements such as those below require legal child elements nested inside them:<br /> |
1271 | <br /> | 1271 | <br /> |
1272 | 1272 | ||
1273 | <code class="code">    blockquote, dir, dl, form, map, menu, noscript, ol, optgroup, rbc, rtc, ruby, select, table, tbody, tfoot, thead, tr, ul</code> | 1273 | <code class="code">    blockquote, dir, dl, form, map, menu, noscript, ol, optgroup, rbc, rtc, ruby, select, table, tbody, tfoot, thead, tr, ul</code> |
1274 | <br /> | 1274 | <br /> |
1275 | <br /> | 1275 | <br /> |
1276 |   In some cases, the specifications stipulate the number and/or the ordering of the child elements. A <span class="term">table</span> can have 0 or 1 <span class="term">caption</span>, <span class="term">tbody</span>, <span class="term">tfoot</span>, and <span class="term">thead</span>, but they must be in this order: <span class="term">caption</span>, <span class="term">thead</span>, <span class="term">tfoot</span>, <span class="term">tbody</span>.<br /> | 1276 |   In some cases, the specifications stipulate the number and/or the ordering of the child elements. A <span class="term">table</span> can have 0 or 1 <span class="term">caption</span>, <span class="term">tbody</span>, <span class="term">tfoot</span>, and <span class="term">thead</span>, but they must be in this order: <span class="term">caption</span>, <span class="term">thead</span>, <span class="term">tfoot</span>, <span class="term">tbody</span>.<br /> |
1277 | <br /> | 1277 | <br /> |
1278 |   htmLawed currently does not check for conformance to these rules. Note that any non-compliance in this regard will not introduce security vulnerabilities, crash browser applications, or affect the rendering of web-pages.<br /> | 1278 |   htmLawed currently does not check for conformance to these rules. Note that any non-compliance in this regard will not introduce security vulnerabilities, crash browser applications, or affect the rendering of web-pages.<br /> |
1279 | <br /> | 1279 | <br /> |
1280 |   With <span class="term">$config["direct_list_nest"]</span> set to <span class="term">1</span>, htmLawed will allow direct nesting of <span class="term">ol</span>, <span class="term">ul</span>, or <span class="term">menu</span> list within another <span class="term">ol</span>, <span class="term">ul</span>, or <span class="term">menu</span> without requiring the child list to be within an <span class="term">li</span> of the parent list. While this may not be standard-compliant, directly nested lists are rendered properly by almost all browsers. The parameter <span class="term">$config["direct_list_nest"]</span> has no effect if tag balancing (<a href="#s3.3.3">section 3.3.3</a>) is turned off.<br /> | 1280 |   With <span class="term">$config["direct_list_nest"]</span> set to <span class="term">1</span>, htmLawed will allow direct nesting of <span class="term">ol</span>, <span class="term">ul</span>, or <span class="term">menu</span> list within another <span class="term">ol</span>, <span class="term">ul</span>, or <span class="term">menu</span> without requiring the child list to be within an <span class="term">li</span> of the parent list. While this may not be standard-compliant, directly nested lists are rendered properly by almost all browsers. The parameter <span class="term">$config["direct_list_nest"]</span> has no effect if tag balancing (<a href="#s3.3.3">section 3.3.3</a>) is turned off.<br /> |
1281 | 1281 | ||
1282 | </div> | 1282 | </div> |
1283 | <div class="sub-sub-section"><h4> | 1283 | <div class="sub-sub-section"><h4> |
1284 | <a name="s3.3.5" id="s3.3.5"></a><span class="item-no">3.3.5</span>  Beautify or compact HTML | 1284 | <a name="s3.3.5" id="s3.3.5"></a><span class="item-no">3.3.5</span>  Beautify or compact HTML |
1285 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1285 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1286 | <br /> | 1286 | <br /> |
1287 |   By default, htmLawed will neither <em>beautify</em> HTML code by formatting it with indentations, etc., nor will it make it compact by removing un-needed white-space.(It does always properly white-space tag content.)<br /> | 1287 |   By default, htmLawed will neither <em>beautify</em> HTML code by formatting it with indentations, etc., nor will it make it compact by removing un-needed white-space.(It does always properly white-space tag content.)<br /> |
1288 | <br /> | 1288 | <br /> |
1289 |   As per the HTML standards, spaces, tabs and line-breaks in web-pages (except those inside <span class="term">pre</span> elements) are all considered equivalent, and referred to as <em>white-spaces</em>. Browser applications are supposed to consider contiguous white-spaces as just a single space, and to disregard white-spaces trailing opening tags or preceding closing tags. This white-space <em>normalization</em> allows the use of text/code beautifully formatted with indentations and line-spacings for readability. Such <em>pretty</em> HTML can, however, increase the size of web-pages, or make the extraction or scraping of plain text cumbersome.<br /> | 1289 |   As per the HTML standards, spaces, tabs and line-breaks in web-pages (except those inside <span class="term">pre</span> elements) are all considered equivalent, and referred to as <em>white-spaces</em>. Browser applications are supposed to consider contiguous white-spaces as just a single space, and to disregard white-spaces trailing opening tags or preceding closing tags. This white-space <em>normalization</em> allows the use of text/code beautifully formatted with indentations and line-spacings for readability. Such <em>pretty</em> HTML can, however, increase the size of web-pages, or make the extraction or scraping of plain text cumbersome.<br /> |
1290 | <br /> | 1290 | <br /> |
1291 |   With the <span class="term">$config</span> parameter <span class="term">tidy</span>, htmLawed can be used to beautify or compact the input text. Input with just plain text and no HTML markup is also subject to this. Besides <span class="term">pre</span>, the <span class="term">script</span> and <span class="term">textarea</span> elements, CDATA sections, and HTML comments are not subjected to the tidying process.<br /> | 1291 |   With the <span class="term">$config</span> parameter <span class="term">tidy</span>, htmLawed can be used to beautify or compact the input text. Input with just plain text and no HTML markup is also subject to this. Besides <span class="term">pre</span>, the <span class="term">script</span> and <span class="term">textarea</span> elements, CDATA sections, and HTML comments are not subjected to the tidying process.<br /> |
1292 | <br /> | 1292 | <br /> |
1293 |   To <em>compact</em>, use <span class="term">$config["tidy"] = -1</span>; single instances or runs of white-spaces are replaced with a single space, and white-spaces trailing and leading open and closing tags, respectively, are removed.<br /> | 1293 |   To <em>compact</em>, use <span class="term">$config["tidy"] = -1</span>; single instances or runs of white-spaces are replaced with a single space, and white-spaces trailing and leading open and closing tags, respectively, are removed.<br /> |
1294 | <br /> | 1294 | <br /> |
1295 |   To <em>beautify</em>, <span class="term">$config["tidy"]</span> is set as <span class="term">1</span>, or for customized tidying, as a string like <span class="term">2s2n</span>. The <span class="term">s</span> or <span class="term">t</span> character specifies the use of spaces or tabs for indentation. The first and third characters, any of the digits 0-9, specify the number of spaces or tabs per indentation, and any parental lead spacing (extra indenting of the whole block of input text). The <span class="term">r</span> and <span class="term">n</span> characters are used to specify line-break characters: <span class="term">n</span> for <span class="term">\n</span> (Unix/Mac OS X line-breaks), <span class="term">rn</span> or <span class="term">nr</span> for <span class="term">\r\n</span> (Windows/DOS line-breaks), or <span class="term">r</span> for <span class="term">\r</span>.<br /> | 1295 |   To <em>beautify</em>, <span class="term">$config["tidy"]</span> is set as <span class="term">1</span>, or for customized tidying, as a string like <span class="term">2s2n</span>. The <span class="term">s</span> or <span class="term">t</span> character specifies the use of spaces or tabs for indentation. The first and third characters, any of the digits 0-9, specify the number of spaces or tabs per indentation, and any parental lead spacing (extra indenting of the whole block of input text). The <span class="term">r</span> and <span class="term">n</span> characters are used to specify line-break characters: <span class="term">n</span> for <span class="term">\n</span> (Unix/Mac OS X line-breaks), <span class="term">rn</span> or <span class="term">nr</span> for <span class="term">\r\n</span> (Windows/DOS line-breaks), or <span class="term">r</span> for <span class="term">\r</span>.<br /> |
1296 | <br /> | 1296 | <br /> |
1297 |   The <span class="term">$config["tidy"]</span> value of <span class="term">1</span> is equivalent to <span class="term">2s0n</span>. Other <span class="term">$config["tidy"]</span> values are read loosely: a value of <span class="term">4</span> is equivalent to <span class="term">4s0n</span>; <span class="term">t2</span>, to <span class="term">1t2n</span>; <span class="term">s</span>, to <span class="term">2s0n</span>; <span class="term">2TR</span>, to <span class="term">2t0r</span>; <span class="term">T1</span>, to <span class="term">1t1n</span>; <span class="term">nr3</span>, to <span class="term">3s0nr</span>, and so on. Except in the indentations and line-spacings, runs of white-spaces are replaced with a single space during beautification.<br /> | 1297 |   The <span class="term">$config["tidy"]</span> value of <span class="term">1</span> is equivalent to <span class="term">2s0n</span>. Other <span class="term">$config["tidy"]</span> values are read loosely: a value of <span class="term">4</span> is equivalent to <span class="term">4s0n</span>; <span class="term">t2</span>, to <span class="term">1t2n</span>; <span class="term">s</span>, to <span class="term">2s0n</span>; <span class="term">2TR</span>, to <span class="term">2t0r</span>; <span class="term">T1</span>, to <span class="term">1t1n</span>; <span class="term">nr3</span>, to <span class="term">3s0nr</span>, and so on. Except in the indentations and line-spacings, runs of white-spaces are replaced with a single space during beautification.<br /> |
1298 | <br /> | 1298 | <br /> |
1299 |   Input formatting using <span class="term">$config["tidy"]</span> is not recommended when input text has mixed markup (like HTML + PHP).<br /> | 1299 |   Input formatting using <span class="term">$config["tidy"]</span> is not recommended when input text has mixed markup (like HTML + PHP).<br /> |
1300 | 1300 | ||
1301 | </div> | 1301 | </div> |
1302 | <div class="sub-section"><h3> | 1302 | <div class="sub-section"><h3> |
1303 | <a name="s3.4" id="s3.4"></a><span class="item-no">3.4</span>  Attributes | 1303 | <a name="s3.4" id="s3.4"></a><span class="item-no">3.4</span>  Attributes |
1304 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1304 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1305 | <br /> | 1305 | <br /> |
1306 |   In its default setting, htmLawed will only permit attributes described in the HTML specifications (including deprecated ones). A list of the attributes and the elements they are allowed in is in <a href="#s5.2">section 5.2</a>. Using the <span class="term">$spec</span> argument, htmLawed can be forced to permit custom, non-standard attributes as well as custom rules for standard attributes (<a href="#s2.3">section 2.3</a>).<br /> | 1306 |   In its default setting, htmLawed will only permit attributes described in the HTML specifications (including deprecated ones). A list of the attributes and the elements they are allowed in is in <a href="#s5.2">section 5.2</a>. Using the <span class="term">$spec</span> argument, htmLawed can be forced to permit custom, non-standard attributes as well as custom rules for standard attributes (<a href="#s2.3">section 2.3</a>).<br /> |
1307 | <br /> | 1307 | <br /> |
1308 |   Custom <em>data-*</em> (<em>data-star</em>) attributes, where the first three characters of the value of <em>star</em> (*) after lower-casing do not equal <span class="term">xml</span>, and the value of <em>star</em> does not have a colon (:), equal-to (=), newline, solidus (/), space or tab character, or any upper-case A-Z character are allowed in all elements. ARIA, event and microdata attributes like <span class="term">aria-live</span>, <span class="term">onclick</span> and <span class="term">itemid</span> are also considered global attributes (<a href="#s5.2">section 5.2</a>).<br /> | 1308 |   Custom <em>data-*</em> (<em>data-star</em>) attributes, where the first three characters of the value of <em>star</em> (*) after lower-casing do not equal <span class="term">xml</span>, and the value of <em>star</em> does not have a colon (:), equal-to (=), newline, solidus (/), space or tab character, or any upper-case A-Z character are allowed in all elements. ARIA, event and microdata attributes like <span class="term">aria-live</span>, <span class="term">onclick</span> and <span class="term">itemid</span> are also considered global attributes (<a href="#s5.2">section 5.2</a>).<br /> |
1309 | <br /> | 1309 | <br /> |
1310 |   When <span class="term">$config["deny_attribute"]</span> is not set, or set to <span class="term">0</span>, or empty (<span class="term">""</span>), all attributes are permitted. Otherwise, <span class="term">$config["deny_attribute"]</span> can be set as a list of comma-separated names of the denied attributes. <span class="term">on*</span> can be used to refer to the group of potentially dangerous, script-accepting event attributes like <span class="term">onblur</span> and <span class="term">onchange</span> that have <span class="term">on</span> at the beginning of their names. Similarly, <span class="term">aria*</span> and <span class="term">data*</span> can be used to respectively refer to the set of all ARIA and data-* attributes.<br /> | 1310 |   When <span class="term">$config["deny_attribute"]</span> is not set, or set to <span class="term">0</span>, or empty (<span class="term">""</span>), all attributes are permitted. Otherwise, <span class="term">$config["deny_attribute"]</span> can be set as a list of comma-separated names of the denied attributes. <span class="term">on*</span> can be used to refer to the group of potentially dangerous, script-accepting event attributes like <span class="term">onblur</span> and <span class="term">onchange</span> that have <span class="term">on</span> at the beginning of their names. Similarly, <span class="term">aria*</span> and <span class="term">data*</span> can be used to respectively refer to the set of all ARIA and data-* attributes.<br /> |
1311 | <br /> | 1311 | <br /> |
1312 |   With <span class="term">$config["safe"] = 1</span> (<a href="#s3.6">section 3.6</a>), the <span class="term">on*</span> event attributes are automatically disallowed even if a value for <span class="term">$config["deny_attribute"]</span> has been manually provided.<br /> | 1312 |   With <span class="term">$config["safe"] = 1</span> (<a href="#s3.6">section 3.6</a>), the <span class="term">on*</span> event attributes are automatically disallowed even if a value for <span class="term">$config["deny_attribute"]</span> has been manually provided.<br /> |
1313 | <br /> | 1313 | <br /> |
1314 |   Note that attributes specified in <span class="term">$config["deny_attribute"]</span> are denied globally, for all elements. To deny attributes for only specific elements, <span class="term">$spec</span> (see <a href="#s2.3">section 2.3</a>) can be used. <span class="term">$spec</span> can also be used to element-specifically permit an attribute otherwise denied through <span class="term">$config["deny_attribute"]</span>.<br /> | 1314 |   Note that attributes specified in <span class="term">$config["deny_attribute"]</span> are denied globally, for all elements. To deny attributes for only specific elements, <span class="term">$spec</span> (see <a href="#s2.3">section 2.3</a>) can be used. <span class="term">$spec</span> can also be used to element-specifically permit an attribute otherwise denied through <span class="term">$config["deny_attribute"]</span>.<br /> |
1315 | <br /> | 1315 | <br /> |
1316 |   Finer restrictions on attributes can also be put into effect through <span class="term">$config["deny_attribute"]</span> (<a href="3.4.9">section</a>).<br /> | 1316 |   Finer restrictions on attributes can also be put into effect through <span class="term">$config["deny_attribute"]</span> (<a href="3.4.9">section</a>).<br /> |
1317 | <br /> | 1317 | <br /> |
1318 |   <strong>Note</strong>: To deny all but a few attributes globally, a simpler way to specify <span class="term">$config["deny_attribute"]</span> would be to use the notation <span class="term">* -attribute1 -attribute2 ...</span>. Thus, a value of <span class="term">* -title -href</span> implies that except <span class="term">href</span> and <span class="term">title</span> (where allowed as per standards) all other attributes are to be removed. With this notation, the value for the parameter <span class="term">safe</span> (<a href="#s3.6">section 3.6</a>) will have no effect on <span class="term">deny_attribute</span>. Values of <span class="term">aria*</span> <span class="term">data*</span>, and <span class="term">on*</span> cannot be used in this notation to refer to the sets of all ARIA, data-*, and on* attributes respectively.<br /> | 1318 |   <strong>Note</strong>: To deny all but a few attributes globally, a simpler way to specify <span class="term">$config["deny_attribute"]</span> would be to use the notation <span class="term">* -attribute1 -attribute2 ...</span>. Thus, a value of <span class="term">* -title -href</span> implies that except <span class="term">href</span> and <span class="term">title</span> (where allowed as per standards) all other attributes are to be removed. With this notation, the value for the parameter <span class="term">safe</span> (<a href="#s3.6">section 3.6</a>) will have no effect on <span class="term">deny_attribute</span>. Values of <span class="term">aria*</span> <span class="term">data*</span>, and <span class="term">on*</span> cannot be used in this notation to refer to the sets of all ARIA, data-*, and on* attributes respectively.<br /> |
1319 | <br /> | 1319 | <br /> |
1320 |   htmLawed (function <span class="term">hl_tag()</span>) also:<br /> | 1320 |   htmLawed (function <span class="term">hl_tag()</span>) also:<br /> |
1321 | <br /> | 1321 | <br /> |
1322 |   *  Lower-cases attribute names<br /> | 1322 |   *  Lower-cases attribute names<br /> |
1323 |   *  Removes duplicate attributes (last one stays)<br /> | 1323 |   *  Removes duplicate attributes (last one stays)<br /> |
1324 |   *  Gives attributes the form <span class="term">name="value"</span> and single-spaces them, removing unnecessary white-spacing<br /> | 1324 |   *  Gives attributes the form <span class="term">name="value"</span> and single-spaces them, removing unnecessary white-spacing<br /> |
1325 |   *  Provides <em>required</em> attributes (see <a href="#s3.4.1">section 3.4.1</a>)<br /> | 1325 |   *  Provides <em>required</em> attributes (see <a href="#s3.4.1">section 3.4.1</a>)<br /> |
1326 |   *  Double-quotes values and escapes any <span class="term">"</span> inside them<br /> | 1326 |   *  Double-quotes values and escapes any <span class="term">"</span> inside them<br /> |
1327 |   *  Replaces the possibly dangerous soft-hyphen characters (hexadecimal code-point <span class="term">ad</span>) in the values with spaces<br /> | 1327 |   *  Replaces the possibly dangerous soft-hyphen characters (hexadecimal code-point <span class="term">ad</span>) in the values with spaces<br /> |
1328 |   *  Allows custom function to additionally filter/modify attribute values (see <a href="#s3.4.9">section 3.4.9</a>)<br /> | 1328 |   *  Allows custom function to additionally filter/modify attribute values (see <a href="#s3.4.9">section 3.4.9</a>)<br /> |
1329 | 1329 | ||
1330 | <div class="sub-sub-section"><h4> | 1330 | <div class="sub-sub-section"><h4> |
1331 | <a name="s3.4.1" id="s3.4.1"></a><span class="item-no">3.4.1</span>  Auto-addition of XHTML-required attributes | 1331 | <a name="s3.4.1" id="s3.4.1"></a><span class="item-no">3.4.1</span>  Auto-addition of XHTML-required attributes |
1332 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1332 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1333 | <br /> | 1333 | <br /> |
1334 |   If indicated attributes for the following elements are found missing, htmLawed (function <span class="term">hl_tag()</span>) will add them (with values same as attribute names unless indicated otherwise below):<br /> | 1334 |   If indicated attributes for the following elements are found missing, htmLawed (function <span class="term">hl_tag()</span>) will add them (with values same as attribute names unless indicated otherwise below):<br /> |
1335 | <br /> | 1335 | <br /> |
1336 |   *  area - alt (<span class="term">area</span>)<br /> | 1336 |   *  area - alt (<span class="term">area</span>)<br /> |
1337 |   *  area, img - src, alt (<span class="term">image</span>)<br /> | 1337 |   *  area, img - src, alt (<span class="term">image</span>)<br /> |
1338 |   *  bdo - dir (<span class="term">ltr</span>)<br /> | 1338 |   *  bdo - dir (<span class="term">ltr</span>)<br /> |
1339 |   *  form - action<br /> | 1339 |   *  form - action<br /> |
1340 |   *  label - command<br /> | 1340 |   *  label - command<br /> |
1341 |   *  map - name<br /> | 1341 |   *  map - name<br /> |
1342 |   *  optgroup - label<br /> | 1342 |   *  optgroup - label<br /> |
1343 |   *  param - name<br /> | 1343 |   *  param - name<br /> |
1344 |   *  style - scoped<br /> | 1344 |   *  style - scoped<br /> |
1345 |   *  textarea - rows (<span class="term">10</span>), cols (<span class="term">50</span>)<br /> | 1345 |   *  textarea - rows (<span class="term">10</span>), cols (<span class="term">50</span>)<br /> |
1346 | <br /> | 1346 | <br /> |
1347 |   Additionally, with <span class="term">$config["xml:lang"]</span> set to <span class="term">1</span> or <span class="term">2</span>, if the <span class="term">lang</span> but not the <span class="term">xml:lang</span> attribute is declared, then the latter is added too, with a value copied from that of <span class="term">lang</span>. This is for better standard-compliance. With <span class="term">$config["xml:lang"]</span> set to <span class="term">2</span>, the <span class="term">lang</span> attribute is removed (XHTML specification).<br /> | 1347 |   Additionally, with <span class="term">$config["xml:lang"]</span> set to <span class="term">1</span> or <span class="term">2</span>, if the <span class="term">lang</span> but not the <span class="term">xml:lang</span> attribute is declared, then the latter is added too, with a value copied from that of <span class="term">lang</span>. This is for better standard-compliance. With <span class="term">$config["xml:lang"]</span> set to <span class="term">2</span>, the <span class="term">lang</span> attribute is removed (XHTML specification).<br /> |
1348 | <br /> | 1348 | <br /> |
1349 |   Note that the <span class="term">name</span> attribute for <span class="term">map</span>, invalid in XHTML, is also transformed if required -- see <a href="#s3.4.6">section 3.4.6</a>.<br /> | 1349 |   Note that the <span class="term">name</span> attribute for <span class="term">map</span>, invalid in XHTML, is also transformed if required -- see <a href="#s3.4.6">section 3.4.6</a>.<br /> |
1350 | 1350 | ||
1351 | </div> | 1351 | </div> |
1352 | <div class="sub-sub-section"><h4> | 1352 | <div class="sub-sub-section"><h4> |
1353 | <a name="s3.4.2" id="s3.4.2"></a><span class="item-no">3.4.2</span>  Duplicate/invalid <span class="term">id</span> values | 1353 | <a name="s3.4.2" id="s3.4.2"></a><span class="item-no">3.4.2</span>  Duplicate/invalid <span class="term">id</span> values |
1354 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1354 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1355 | <br /> | 1355 | <br /> |
1356 |   If <span class="term">$config["unique_ids"]</span> is <span class="term">1</span>, htmLawed (function <span class="term">hl_tag()</span>) removes <span class="term">id</span> attributes with values that are not standards-compliant (must not have a space character) or duplicate. If <span class="term">$config["unique_ids"]</span> is a word (without a non-word character like space), any duplicate but otherwise valid value will be appropriately prefixed with the word to ensure its uniqueness.<br /> | 1356 |   If <span class="term">$config["unique_ids"]</span> is <span class="term">1</span>, htmLawed (function <span class="term">hl_tag()</span>) removes <span class="term">id</span> attributes with values that are not standards-compliant (must not have a space character) or duplicate. If <span class="term">$config["unique_ids"]</span> is a word (without a non-word character like space), any duplicate but otherwise valid value will be appropriately prefixed with the word to ensure its uniqueness.<br /> |
1357 | <br /> | 1357 | <br /> |
1358 |   Even if multiple inputs need to be filtered (through multiple calls to htmLawed), htmLawed ensures uniqueness of <span class="term">id</span> values as it uses a global variable (<span class="term">$GLOBALS["hl_Ids"]</span> array). Further, an admin can restrict the use of certain <span class="term">id</span> values by presetting this variable before htmLawed is called into use. E.g.:<br /> | 1358 |   Even if multiple inputs need to be filtered (through multiple calls to htmLawed), htmLawed ensures uniqueness of <span class="term">id</span> values as it uses a global variable (<span class="term">$GLOBALS["hl_Ids"]</span> array). Further, an admin can restrict the use of certain <span class="term">id</span> values by presetting this variable before htmLawed is called into use. E.g.:<br /> |
1359 | <br /> | 1359 | <br /> |
1360 | 1360 | ||
1361 | <code class="code">    $GLOBALS['hl_Ids'] = array('top'=>1, 'bottom'=>1, 'myform'=>1); // id values not allowed in input</code> | 1361 | <code class="code">    $GLOBALS['hl_Ids'] = array('top'=>1, 'bottom'=>1, 'myform'=>1); // id values not allowed in input</code> |
1362 | <br /> | 1362 | <br /> |
1363 | 1363 | ||
1364 | <code class="code">    $processed = htmLawed($text); // filter input</code> | 1364 | <code class="code">    $processed = htmLawed($text); // filter input</code> |
1365 | <br /> | 1365 | <br /> |
1366 | 1366 | ||
1367 | </div> | 1367 | </div> |
1368 | <div class="sub-sub-section"><h4> | 1368 | <div class="sub-sub-section"><h4> |
1369 | <a name="s3.4.3" id="s3.4.3"></a><span class="item-no">3.4.3</span>  URL schemes & scripts in attribute values | 1369 | <a name="s3.4.3" id="s3.4.3"></a><span class="item-no">3.4.3</span>  URL schemes & scripts in attribute values |
1370 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1370 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1371 | <br /> | 1371 | <br /> |
1372 |   htmLawed edits attributes that take URLs as values if they are found to contain un-permitted schemes. E.g., if the <span class="term">afp</span> scheme is not permitted, then <span class="term"><a href="afp://domain.org"></span> becomes <span class="term"><a href="denied:afp://domain.org"></span>, and if Javascript is not permitted <span class="term"><a onclick="javascript:xss();"></span> becomes <span class="term"><a onclick="denied:javascript:xss();"></span>.<br /> | 1372 |   htmLawed edits attributes that take URLs as values if they are found to contain un-permitted schemes. E.g., if the <span class="term">afp</span> scheme is not permitted, then <span class="term"><a href="afp://domain.org"></span> becomes <span class="term"><a href="denied:afp://domain.org"></span>, and if Javascript is not permitted <span class="term"><a onclick="javascript:xss();"></span> becomes <span class="term"><a onclick="denied:javascript:xss();"></span>.<br /> |
1373 | <br /> | 1373 | <br /> |
1374 |   By default htmLawed permits these schemes in URLs for the <span class="term">href</span> attribute:<br /> | 1374 |   By default htmLawed permits these schemes in URLs for the <span class="term">href</span> attribute:<br /> |
1375 | <br /> | 1375 | <br /> |
1376 | 1376 | ||
1377 | <code class="code">    aim, app, feed, file, ftp, gopher, http, https, javascript, irc, mailto, news, nntp, sftp, ssh, tel, telnet</code> | 1377 | <code class="code">    aim, app, feed, file, ftp, gopher, http, https, javascript, irc, mailto, news, nntp, sftp, ssh, tel, telnet</code> |
1378 | <br /> | 1378 | <br /> |
1379 | <br /> | 1379 | <br /> |
1380 |   Also, only <span class="term">data</span>, <span class="term">file</span>, <span class="term">http</span>, <span class="term">https</span> and <span class="term">javascript</span> are permitted in these attributes that accept URLs:<br /> | 1380 |   Also, only <span class="term">data</span>, <span class="term">file</span>, <span class="term">http</span>, <span class="term">https</span> and <span class="term">javascript</span> are permitted in these attributes that accept URLs:<br /> |
1381 | <br /> | 1381 | <br /> |
1382 | 1382 | ||
1383 | <code class="code">    action, cite, classid, codebase, data, itemtype, longdesc, model, pluginspage, pluginurl, src, srcset, style, usemap, and event attributes like onclick</code> | 1383 | <code class="code">    action, cite, classid, codebase, data, itemtype, longdesc, model, pluginspage, pluginurl, src, srcset, style, usemap, and event attributes like onclick</code> |
1384 | <br /> | 1384 | <br /> |
1385 | <br /> | 1385 | <br /> |
1386 |   With <span class="term">$config["safe"] = 1</span> (<a href="#s3.6">section 3.6</a>), the above is changed to disallow <span class="term">app</span>, <span class="term">data</span> and <span class="term">javascript</span>.<br /> | 1386 |   With <span class="term">$config["safe"] = 1</span> (<a href="#s3.6">section 3.6</a>), the above is changed to disallow <span class="term">app</span>, <span class="term">data</span> and <span class="term">javascript</span>.<br /> |
1387 | <br /> | 1387 | <br /> |
1388 |   These default sets are used when <span class="term">$config["schemes"]</span> is not set (see <a href="#s2.2">section 2.2</a>). To over-ride the defaults, <span class="term">$config["schemes"]</span> is defined as a string of semi-colon-separated sub-strings of type <span class="term">attribute: comma-separated schemes</span>. E.g., <span class="term">href: mailto, http, https; onclick: javascript; src: http, https</span>. For unspecified attributes, <span class="term">data</span>, <span class="term">file</span>, <span class="term">http</span>, <span class="term">https</span> and <span class="term">javascript</span> are permitted. This can be changed by passing schemes for <span class="term">*</span> in <span class="term">$config["schemes"]</span>. E.g., <span class="term">href: mailto, http, https; *: https, https</span>.<br /> | 1388 |   These default sets are used when <span class="term">$config["schemes"]</span> is not set (see <a href="#s2.2">section 2.2</a>). To over-ride the defaults, <span class="term">$config["schemes"]</span> is defined as a string of semi-colon-separated sub-strings of type <span class="term">attribute: comma-separated schemes</span>. E.g., <span class="term">href: mailto, http, https; onclick: javascript; src: http, https</span>. For unspecified attributes, <span class="term">data</span>, <span class="term">file</span>, <span class="term">http</span>, <span class="term">https</span> and <span class="term">javascript</span> are permitted. This can be changed by passing schemes for <span class="term">*</span> in <span class="term">$config["schemes"]</span>. E.g., <span class="term">href: mailto, http, https; *: https, https</span>.<br /> |
1389 | <br /> | 1389 | <br /> |
1390 |   <span class="term">*</span> (asterisk) can be put in the list of schemes to permit all protocols. E.g., <span class="term">style: *; img: http, https</span> results in protocols not being checked in <span class="term">style</span> attribute values. However, in such cases, any relative-to-absolute URL conversion, or vice versa, (<a href="#s3.4.4">section 3.4.4</a>) is not done. When an attribute is explicitly listed in <span class="term">$config["schemes"]</span>, then filtering is dictated by the setting for the attribute, with no effect of the setting for asterisk. That is, the set of attributes that asterisk refers to no longer includes the listed attribute.<br /> | 1390 |   <span class="term">*</span> (asterisk) can be put in the list of schemes to permit all protocols. E.g., <span class="term">style: *; img: http, https</span> results in protocols not being checked in <span class="term">style</span> attribute values. However, in such cases, any relative-to-absolute URL conversion, or vice versa, (<a href="#s3.4.4">section 3.4.4</a>) is not done. When an attribute is explicitly listed in <span class="term">$config["schemes"]</span>, then filtering is dictated by the setting for the attribute, with no effect of the setting for asterisk. That is, the set of attributes that asterisk refers to no longer includes the listed attribute.<br /> |
1391 | <br /> | 1391 | <br /> |
1392 |   Thus, <em>to allow the xmpp scheme</em>, one can set <span class="term">$config["schemes"]</span> as <span class="term">href: mailto, http, https; *: http, https, xmpp</span>, or <span class="term">href: mailto, http, https, xmpp; *: http, https, xmpp</span>, or <span class="term">*: *</span>, and so on. The consequence of each of these example values will be different (e.g., only the last two but not the first will allow <span class="term">xmpp</span> in <span class="term">href</span>)<br /> | 1392 |   Thus, <em>to allow the xmpp scheme</em>, one can set <span class="term">$config["schemes"]</span> as <span class="term">href: mailto, http, https; *: http, https, xmpp</span>, or <span class="term">href: mailto, http, https, xmpp; *: http, https, xmpp</span>, or <span class="term">*: *</span>, and so on. The consequence of each of these example values will be different (e.g., only the last two but not the first will allow <span class="term">xmpp</span> in <span class="term">href</span>)<br /> |
1393 | <br /> | 1393 | <br /> |
1394 |   As a side-note, one may find <span class="term">style: *</span> useful as URLs in <span class="term">style</span> attributes can be specified in a variety of ways, and the patterns that htmLawed uses to identify URLs may mistakenly identify non-URL text.<br /> | 1394 |   As a side-note, one may find <span class="term">style: *</span> useful as URLs in <span class="term">style</span> attributes can be specified in a variety of ways, and the patterns that htmLawed uses to identify URLs may mistakenly identify non-URL text.<br /> |
1395 | <br /> | 1395 | <br /> |
1396 |   <span class="term">!</span> can be put in the list of schemes to disallow all protocols as well as <em>local</em> URLs. Thus, with <span class="term">href: http, style: !</span>, <span class="term"><a href="http://cnn.com" style="background-image: url(local.jpg);">CNN</a></span> will become <span class="term"><a href="http://cnn.com" style="background-image: url(denied:local.jpg);">CNN</a></span><br /> | 1396 |   <span class="term">!</span> can be put in the list of schemes to disallow all protocols as well as <em>local</em> URLs. Thus, with <span class="term">href: http, style: !</span>, <span class="term"><a href="http://cnn.com" style="background-image: url(local.jpg);">CNN</a></span> will become <span class="term"><a href="http://cnn.com" style="background-image: url(denied:local.jpg);">CNN</a></span><br /> |
1397 | <br /> | 1397 | <br /> |
1398 |   <strong>Note</strong>: If URL-accepting attributes other than those listed above are being allowed, then the scheme will not be checked unless the attribute name contains the string <span class="term">src</span> (e.g., <span class="term">dynsrc</span>) or starts with <span class="term">o</span> (e.g., <span class="term">onbeforecopy</span>).<br /> | 1398 |   <strong>Note</strong>: If URL-accepting attributes other than those listed above are being allowed, then the scheme will not be checked unless the attribute name contains the string <span class="term">src</span> (e.g., <span class="term">dynsrc</span>) or starts with <span class="term">o</span> (e.g., <span class="term">onbeforecopy</span>).<br /> |
1399 | <br /> | 1399 | <br /> |
1400 |   With <span class="term">$config["safe"] = 1</span>, all URLs are disallowed in the <span class="term">style</span> attribute values.<br /> | 1400 |   With <span class="term">$config["safe"] = 1</span>, all URLs are disallowed in the <span class="term">style</span> attribute values.<br /> |
1401 | 1401 | ||
1402 | </div> | 1402 | </div> |
1403 | <div class="sub-sub-section"><h4> | 1403 | <div class="sub-sub-section"><h4> |
1404 | <a name="s3.4.4" id="s3.4.4"></a><span class="item-no">3.4.4</span>  Absolute & relative URLs in attribute values | 1404 | <a name="s3.4.4" id="s3.4.4"></a><span class="item-no">3.4.4</span>  Absolute & relative URLs in attribute values |
1405 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1405 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1406 | <br /> | 1406 | <br /> |
1407 |   htmLawed can make absolute URLs in attributes like <span class="term">href</span> relative (<span class="term">$config["abs_url"]</span> is <span class="term">-1</span>), and vice versa (<span class="term">$config["abs_url"]</span> is <span class="term">1</span>). URLs in scripts are not considered for this, and so are URLs like <span class="term">#section_6</span> (fragment), <span class="term">?name=Tim#show</span> (starting with query string), and <span class="term">;var=1?name=Tim#show</span> (starting with parameters). Further, this requires that <span class="term">$config["base_url"]</span> be set properly, with the <span class="term">://</span> and a trailing slash (<span class="term">/</span>), with no query string, etc. E.g., <span class="term">file:///D:/page/</span>, <span class="term">https://abc.com/x/y/</span>, or <span class="term">http://localhost/demo/</span> are okay, but <span class="term">file:///D:/page/?help=1</span>, <span class="term">abc.com/x/y/</span> and <span class="term">http://localhost/demo/index.htm</span> are not.<br /> | 1407 |   htmLawed can make absolute URLs in attributes like <span class="term">href</span> relative (<span class="term">$config["abs_url"]</span> is <span class="term">-1</span>), and vice versa (<span class="term">$config["abs_url"]</span> is <span class="term">1</span>). URLs in scripts are not considered for this, and so are URLs like <span class="term">#section_6</span> (fragment), <span class="term">?name=Tim#show</span> (starting with query string), and <span class="term">;var=1?name=Tim#show</span> (starting with parameters). Further, this requires that <span class="term">$config["base_url"]</span> be set properly, with the <span class="term">://</span> and a trailing slash (<span class="term">/</span>), with no query string, etc. E.g., <span class="term">file:///D:/page/</span>, <span class="term">https://abc.com/x/y/</span>, or <span class="term">http://localhost/demo/</span> are okay, but <span class="term">file:///D:/page/?help=1</span>, <span class="term">abc.com/x/y/</span> and <span class="term">http://localhost/demo/index.htm</span> are not.<br /> |
1408 | <br /> | 1408 | <br /> |
1409 |   For making absolute URLs relative, only those URLs that have the <span class="term">$config["base_url"]</span> string at the beginning are converted. E.g., with <span class="term">$config["base_url"] = "https://abc.com/x/y/"</span>, <span class="term">https://abc.com/x/y/a.gif</span> and <span class="term">https://abc.com/x/y/z/b.gif</span> become <span class="term">a.gif</span> and <span class="term">z/b.gif</span> respectively, while <span class="term">https://abc.com/x/c.gif</span> is not changed.<br /> | 1409 |   For making absolute URLs relative, only those URLs that have the <span class="term">$config["base_url"]</span> string at the beginning are converted. E.g., with <span class="term">$config["base_url"] = "https://abc.com/x/y/"</span>, <span class="term">https://abc.com/x/y/a.gif</span> and <span class="term">https://abc.com/x/y/z/b.gif</span> become <span class="term">a.gif</span> and <span class="term">z/b.gif</span> respectively, while <span class="term">https://abc.com/x/c.gif</span> is not changed.<br /> |
1410 | <br /> | 1410 | <br /> |
1411 |   When making relative URLs absolute, only values for scheme, network location (host-name) and path values in the base URL are inherited. See <a href="#s5.5">section 5.5</a> for more about the URL specification as per RFC <a href="http://www.ietf.org/rfc/rfc1808.txt">1808</a>.<br /> | 1411 |   When making relative URLs absolute, only values for scheme, network location (host-name) and path values in the base URL are inherited. See <a href="#s5.5">section 5.5</a> for more about the URL specification as per RFC <a href="http://www.ietf.org/rfc/rfc1808.txt">1808</a>.<br /> |
1412 | 1412 | ||
1413 | </div> | 1413 | </div> |
1414 | <div class="sub-sub-section"><h4> | 1414 | <div class="sub-sub-section"><h4> |
1415 | <a name="s3.4.5" id="s3.4.5"></a><span class="item-no">3.4.5</span>  Lower-cased, standard attribute values | 1415 | <a name="s3.4.5" id="s3.4.5"></a><span class="item-no">3.4.5</span>  Lower-cased, standard attribute values |
1416 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1416 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1417 | <br /> | 1417 | <br /> |
1418 |   Optionally, for standard-compliance, htmLawed (function <span class="term">hl_tag()</span>) lower-cases standard attribute values to give, e.g., <span class="term">input type="password"</span> instead of <span class="term">input type="Password"</span>, if <span class="term">$config["lc_std_val"]</span> is <span class="term">1</span>. Attribute values matching those listed below for any of the elements listed further below (plus those for the <span class="term">type</span> attribute of <span class="term">button</span> or <span class="term">input</span>) are lower-cased:<br /> | 1418 |   Optionally, for standard-compliance, htmLawed (function <span class="term">hl_tag()</span>) lower-cases standard attribute values to give, e.g., <span class="term">input type="password"</span> instead of <span class="term">input type="Password"</span>, if <span class="term">$config["lc_std_val"]</span> is <span class="term">1</span>. Attribute values matching those listed below for any of the elements listed further below (plus those for the <span class="term">type</span> attribute of <span class="term">button</span> or <span class="term">input</span>) are lower-cased:<br /> |
1419 | <br /> | 1419 | <br /> |
1420 | 1420 | ||
1421 | <code class="code">    all, auto, baseline, bottom, button, captions, center, chapters, char, checkbox, circle, col, colgroup, color, cols, data, date, datetime, datetime-local, default, descriptions, email, file, get, groups, hidden, image, justify, left, ltr, metadata, middle, month, none, number, object, password, poly, post, preserve, radio, range, rect, ref, reset, right, row, rowgroup, rows, rtl, search, submit, subtitles, tel, text, time, top, url, week</code> | 1421 | <code class="code">    all, auto, baseline, bottom, button, captions, center, chapters, char, checkbox, circle, col, colgroup, color, cols, data, date, datetime, datetime-local, default, descriptions, email, file, get, groups, hidden, image, justify, left, ltr, metadata, middle, month, none, number, object, password, poly, post, preserve, radio, range, rect, ref, reset, right, row, rowgroup, rows, rtl, search, submit, subtitles, tel, text, time, top, url, week</code> |
1422 | <br /> | 1422 | <br /> |
1423 | <br /> | 1423 | <br /> |
1424 | 1424 | ||
1425 | <code class="code">    a, area, bdo, button, col, fieldset, form, img, input, object, ol, optgroup, option, param, script, select, table, td, textarea, tfoot, th, thead, tr, track, xml:space</code> | 1425 | <code class="code">    a, area, bdo, button, col, fieldset, form, img, input, object, ol, optgroup, option, param, script, select, table, td, textarea, tfoot, th, thead, tr, track, xml:space</code> |
1426 | <br /> | 1426 | <br /> |
1427 | <br /> | 1427 | <br /> |
1428 |   The following <em>empty</em> (<em>minimized</em>) attributes are always assigned lower-cased values (same as the attribute names):<br /> | 1428 |   The following <em>empty</em> (<em>minimized</em>) attributes are always assigned lower-cased values (same as the attribute names):<br /> |
1429 | <br /> | 1429 | <br /> |
1430 | 1430 | ||
1431 | <code class="code">    checkbox, checked, command, compact, declare, defer, default, disabled, hidden, inert, ismap, itemscope, multiple, nohref, noresize, noshade, nowrap, open, radio, readonly, required, reversed, selected</code> | 1431 | <code class="code">    checkbox, checked, command, compact, declare, defer, default, disabled, hidden, inert, ismap, itemscope, multiple, nohref, noresize, noshade, nowrap, open, radio, readonly, required, reversed, selected</code> |
1432 | <br /> | 1432 | <br /> |
1433 | 1433 | ||
1434 | </div> | 1434 | </div> |
1435 | <div class="sub-sub-section"><h4> | 1435 | <div class="sub-sub-section"><h4> |
1436 | <a name="s3.4.6" id="s3.4.6"></a><span class="item-no">3.4.6</span>  Transformation of deprecated attributes | 1436 | <a name="s3.4.6" id="s3.4.6"></a><span class="item-no">3.4.6</span>  Transformation of deprecated attributes |
1437 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1437 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1438 | <br /> | 1438 | <br /> |
1439 |   If <span class="term">$config["no_deprecated_attr"]</span> is <span class="term">0</span>, then deprecated attributes are removed and, in most cases, their values are transformed to CSS style properties and added to the <span class="term">style</span> attributes (function <span class="term">hl_tag()</span>). Except for <span class="term">bordercolor</span> for <span class="term">table</span>, <span class="term">tr</span> and <span class="term">td</span>, the scores of proprietary attributes that were never part of any cross-browser standard are not supported in this functionality.<br /> | 1439 |   If <span class="term">$config["no_deprecated_attr"]</span> is <span class="term">0</span>, then deprecated attributes are removed and, in most cases, their values are transformed to CSS style properties and added to the <span class="term">style</span> attributes (function <span class="term">hl_tag()</span>). Except for <span class="term">bordercolor</span> for <span class="term">table</span>, <span class="term">tr</span> and <span class="term">td</span>, the scores of proprietary attributes that were never part of any cross-browser standard are not supported in this functionality.<br /> |
1440 | <br /> | 1440 | <br /> |
1441 |   *  align in caption, div, h, h2, h3, h4, h5, h6, hr, img, input, legend, object, p, table - for <span class="term">img</span> with value of <span class="term">left</span> or <span class="term">right</span>, becomes, e.g., <span class="term">float: left</span>; for <span class="term">div</span> and <span class="term">table</span> with value <span class="term">center</span>, becomes <span class="term">margin: auto</span>; all others become, e.g., <span class="term">text-align: right</span><br /> | 1441 |   *  align in caption, div, h, h2, h3, h4, h5, h6, hr, img, input, legend, object, p, table - for <span class="term">img</span> with value of <span class="term">left</span> or <span class="term">right</span>, becomes, e.g., <span class="term">float: left</span>; for <span class="term">div</span> and <span class="term">table</span> with value <span class="term">center</span>, becomes <span class="term">margin: auto</span>; all others become, e.g., <span class="term">text-align: right</span><br /> |
1442 |   *  bgcolor in table, td, th and tr - E.g., <span class="term">bgcolor="#ffffff"</span> becomes <span class="term">background-color: #ffffff</span><br /> | 1442 |   *  bgcolor in table, td, th and tr - E.g., <span class="term">bgcolor="#ffffff"</span> becomes <span class="term">background-color: #ffffff</span><br /> |
1443 |   *  border in object - E.g., <span class="term">height="10"</span> becomes <span class="term">height: 10px</span><br /> | 1443 |   *  border in object - E.g., <span class="term">height="10"</span> becomes <span class="term">height: 10px</span><br /> |
1444 |   *  bordercolor in table, td and tr - E.g., <span class="term">bordercolor=#999999</span> becomes <span class="term">border-color: #999999;</span><br /> | 1444 |   *  bordercolor in table, td and tr - E.g., <span class="term">bordercolor=#999999</span> becomes <span class="term">border-color: #999999;</span><br /> |
1445 |   *  compact in dl, ol and ul - <span class="term">font-size: 85%</span><br /> | 1445 |   *  compact in dl, ol and ul - <span class="term">font-size: 85%</span><br /> |
1446 |   *  cellspacing in table - <span class="term">cellspacing="10"</span> becomes <span class="term">border-spacing: 10px</span><br /> | 1446 |   *  cellspacing in table - <span class="term">cellspacing="10"</span> becomes <span class="term">border-spacing: 10px</span><br /> |
1447 |   *  clear in br - E.g., 'clear="all" becomes <span class="term">clear: both</span><br /> | 1447 |   *  clear in br - E.g., 'clear="all" becomes <span class="term">clear: both</span><br /> |
1448 |   *  height in td and th - E.g., <span class="term">height= "10"</span> becomes <span class="term">height: 10px</span> and <span class="term">height="*"</span> becomes <span class="term">height: auto</span><br /> | 1448 |   *  height in td and th - E.g., <span class="term">height= "10"</span> becomes <span class="term">height: 10px</span> and <span class="term">height="*"</span> becomes <span class="term">height: auto</span><br /> |
1449 |   *  hspace in img and object - E.g., <span class="term">hspace="10"</span> becomes <span class="term">margin-left: 10px; margin-right: 10px</span><br /> | 1449 |   *  hspace in img and object - E.g., <span class="term">hspace="10"</span> becomes <span class="term">margin-left: 10px; margin-right: 10px</span><br /> |
1450 |   *  language in script - <span class="term">language="VBScript"</span> becomes <span class="term">type="text/vbscript"</span><br /> | 1450 |   *  language in script - <span class="term">language="VBScript"</span> becomes <span class="term">type="text/vbscript"</span><br /> |
1451 |   *  name in a, form, iframe, img and map - E.g., <span class="term">name="xx"</span> becomes <span class="term">id="xx"</span><br /> | 1451 |   *  name in a, form, iframe, img and map - E.g., <span class="term">name="xx"</span> becomes <span class="term">id="xx"</span><br /> |
1452 |   *  noshade in hr - <span class="term">border-style: none; border: 0; background-color: gray; color: gray</span><br /> | 1452 |   *  noshade in hr - <span class="term">border-style: none; border: 0; background-color: gray; color: gray</span><br /> |
1453 |   *  nowrap in td and th - <span class="term">white-space: nowrap</span><br /> | 1453 |   *  nowrap in td and th - <span class="term">white-space: nowrap</span><br /> |
1454 |   *  size in hr - E.g., <span class="term">size="10"</span> becomes <span class="term">height: 10px</span><br /> | 1454 |   *  size in hr - E.g., <span class="term">size="10"</span> becomes <span class="term">height: 10px</span><br /> |
1455 |   *  vspace in img and object - E.g., <span class="term">vspace="10"</span> becomes <span class="term">margin-top: 10px; margin-bottom: 10px</span><br /> | 1455 |   *  vspace in img and object - E.g., <span class="term">vspace="10"</span> becomes <span class="term">margin-top: 10px; margin-bottom: 10px</span><br /> |
1456 |   *  width in hr, pre, table, td and th - like <span class="term">height</span><br /> | 1456 |   *  width in hr, pre, table, td and th - like <span class="term">height</span><br /> |
1457 | <br /> | 1457 | <br /> |
1458 |   Example input:<br /> | 1458 |   Example input:<br /> |
1459 | <br /> | 1459 | <br /> |
1460 | 1460 | ||
1461 | <code class="code">    <img src="j.gif" alt="image" name="dad's" /><img src="k.gif" alt="image" id="dad_off" name="dad" /></code> | 1461 | <code class="code">    <img src="j.gif" alt="image" name="dad's" /><img src="k.gif" alt="image" id="dad_off" name="dad" /></code> |
1462 | <br /> | 1462 | <br /> |
1463 | 1463 | ||
1464 | <code class="code">    <br clear="left" /></code> | 1464 | <code class="code">    <br clear="left" /></code> |
1465 | <br /> | 1465 | <br /> |
1466 | 1466 | ||
1467 | <code class="code">    <hr noshade size="1" /></code> | 1467 | <code class="code">    <hr noshade size="1" /></code> |
1468 | <br /> | 1468 | <br /> |
1469 | 1469 | ||
1470 | <code class="code">    <img name="img" src="i.gif" align="left" alt="image" hspace="10" vspace="10" width="10em" height="20" border="1" style="padding:5px;" /></code> | 1470 | <code class="code">    <img name="img" src="i.gif" align="left" alt="image" hspace="10" vspace="10" width="10em" height="20" border="1" style="padding:5px;" /></code> |
1471 | <br /> | 1471 | <br /> |
1472 | 1472 | ||
1473 | <code class="code">    <table width="50em" align="center" bgcolor="red"></code> | 1473 | <code class="code">    <table width="50em" align="center" bgcolor="red"></code> |
1474 | <br /> | 1474 | <br /> |
1475 | 1475 | ||
1476 | <code class="code">     <tr></code> | 1476 | <code class="code">     <tr></code> |
1477 | <br /> | 1477 | <br /> |
1478 | 1478 | ||
1479 | <code class="code">      <td width="20%"></code> | 1479 | <code class="code">      <td width="20%"></code> |
1480 | <br /> | 1480 | <br /> |
1481 | 1481 | ||
1482 | <code class="code">       <div align="center"></code> | 1482 | <code class="code">       <div align="center"></code> |
1483 | <br /> | 1483 | <br /> |
1484 | 1484 | ||
1485 | <code class="code">        <h3 align="right">Section</h3></code> | 1485 | <code class="code">        <h3 align="right">Section</h3></code> |
1486 | <br /> | 1486 | <br /> |
1487 | 1487 | ||
1488 | <code class="code">        <p align="right">Para</p></code> | 1488 | <code class="code">        <p align="right">Para</p></code> |
1489 | <br /> | 1489 | <br /> |
1490 | 1490 | ||
1491 | <code class="code">       </div></code> | 1491 | <code class="code">       </div></code> |
1492 | <br /> | 1492 | <br /> |
1493 | 1493 | ||
1494 | <code class="code">      </td></code> | 1494 | <code class="code">      </td></code> |
1495 | <br /> | 1495 | <br /> |
1496 | 1496 | ||
1497 | <code class="code">      <td width="*"></code> | 1497 | <code class="code">      <td width="*"></code> |
1498 | <br /> | 1498 | <br /> |
1499 | 1499 | ||
1500 | <code class="code">      </td></code> | 1500 | <code class="code">      </td></code> |
1501 | <br /> | 1501 | <br /> |
1502 | 1502 | ||
1503 | <code class="code">     </tr></code> | 1503 | <code class="code">     </tr></code> |
1504 | <br /> | 1504 | <br /> |
1505 | 1505 | ||
1506 | <code class="code">    </table></code> | 1506 | <code class="code">    </table></code> |
1507 | <br /> | 1507 | <br /> |
1508 | 1508 | ||
1509 | <code class="code">    <br clear="all" /></code> | 1509 | <code class="code">    <br clear="all" /></code> |
1510 | <br /> | 1510 | <br /> |
1511 | <br /> | 1511 | <br /> |
1512 |   And the output with <span class="term">$config["no_deprecated_attr"] = 1</span>:<br /> | 1512 |   And the output with <span class="term">$config["no_deprecated_attr"] = 1</span>:<br /> |
1513 | <br /> | 1513 | <br /> |
1514 | 1514 | ||
1515 | <code class="code">    <img src="j.gif" alt="image" id="dad's" /><img src="k.gif" alt="image" id="dad_off" /></code> | 1515 | <code class="code">    <img src="j.gif" alt="image" id="dad's" /><img src="k.gif" alt="image" id="dad_off" /></code> |
1516 | <br /> | 1516 | <br /> |
1517 | 1517 | ||
1518 | <code class="code">    <br style="clear: left;" /></code> | 1518 | <code class="code">    <br style="clear: left;" /></code> |
1519 | <br /> | 1519 | <br /> |
1520 | 1520 | ||
1521 | <code class="code">    <hr style="border-style: none; border: 0; background-color: gray; color: gray; size: 1px;" /></code> | 1521 | <code class="code">    <hr style="border-style: none; border: 0; background-color: gray; color: gray; size: 1px;" /></code> |
1522 | <br /> | 1522 | <br /> |
1523 | 1523 | ||
1524 | <code class="code">    <img src="i.gif" alt="image" width="10em" height="20" style="padding:5px; float: left; margin-left: 10px; margin-right: 10px; margin-top: 10px; margin-bottom: 10px; border: 1px;" id="img" /></code> | 1524 | <code class="code">    <img src="i.gif" alt="image" width="10em" height="20" style="padding:5px; float: left; margin-left: 10px; margin-right: 10px; margin-top: 10px; margin-bottom: 10px; border: 1px;" id="img" /></code> |
1525 | <br /> | 1525 | <br /> |
1526 | 1526 | ||
1527 | <code class="code">    <table width="50em" style="margin: auto; background-color: red;"></code> | 1527 | <code class="code">    <table width="50em" style="margin: auto; background-color: red;"></code> |
1528 | <br /> | 1528 | <br /> |
1529 | 1529 | ||
1530 | <code class="code">     <tr></code> | 1530 | <code class="code">     <tr></code> |
1531 | <br /> | 1531 | <br /> |
1532 | 1532 | ||
1533 | <code class="code">      <td style="width: 20%;"></code> | 1533 | <code class="code">      <td style="width: 20%;"></code> |
1534 | <br /> | 1534 | <br /> |
1535 | 1535 | ||
1536 | <code class="code">       <div style="margin: auto;"></code> | 1536 | <code class="code">       <div style="margin: auto;"></code> |
1537 | <br /> | 1537 | <br /> |
1538 | 1538 | ||
1539 | <code class="code">        <h3 style="text-align: right;">Section</h3></code> | 1539 | <code class="code">        <h3 style="text-align: right;">Section</h3></code> |
1540 | <br /> | 1540 | <br /> |
1541 | 1541 | ||
1542 | <code class="code">        <p style="text-align: right;">Para</p></code> | 1542 | <code class="code">        <p style="text-align: right;">Para</p></code> |
1543 | <br /> | 1543 | <br /> |
1544 | 1544 | ||
1545 | <code class="code">       </div></code> | 1545 | <code class="code">       </div></code> |
1546 | <br /> | 1546 | <br /> |
1547 | 1547 | ||
1548 | <code class="code">      </td></code> | 1548 | <code class="code">      </td></code> |
1549 | <br /> | 1549 | <br /> |
1550 | 1550 | ||
1551 | <code class="code">      <td style="width: auto;"></code> | 1551 | <code class="code">      <td style="width: auto;"></code> |
1552 | <br /> | 1552 | <br /> |
1553 | 1553 | ||
1554 | <code class="code">      </td></code> | 1554 | <code class="code">      </td></code> |
1555 | <br /> | 1555 | <br /> |
1556 | 1556 | ||
1557 | <code class="code">     </tr></code> | 1557 | <code class="code">     </tr></code> |
1558 | <br /> | 1558 | <br /> |
1559 | 1559 | ||
1560 | <code class="code">    </table></code> | 1560 | <code class="code">    </table></code> |
1561 | <br /> | 1561 | <br /> |
1562 | 1562 | ||
1563 | <code class="code">    <br style="clear: both;" /></code> | 1563 | <code class="code">    <br style="clear: both;" /></code> |
1564 | <br /> | 1564 | <br /> |
1565 | <br /> | 1565 | <br /> |
1566 |   For <span class="term">lang</span>, deprecated in XHTML 1.1, transformation is taken care of through <span class="term">$config["xml:lang"]</span>; see <a href="#s3.4.1">section 3.4.1</a>.<br /> | 1566 |   For <span class="term">lang</span>, deprecated in XHTML 1.1, transformation is taken care of through <span class="term">$config["xml:lang"]</span>; see <a href="#s3.4.1">section 3.4.1</a>.<br /> |
1567 | <br /> | 1567 | <br /> |
1568 |   The attribute <span class="term">name</span> is deprecated in <span class="term">form</span>, <span class="term">iframe</span>, and <span class="term">img</span>, and is replaced with <span class="term">id</span> if an <span class="term">id</span> attribute doesn't exist and if the <span class="term">name</span> value is appropriate for <span class="term">id</span> (i.e., doesn't have a non-word character like space). For such replacements for <span class="term">a</span> and <span class="term">map</span>, for which the <span class="term">name</span> attribute is deprecated in XHTML 1.1, <span class="term">$config["no_deprecated_attr"]</span> should be set to <span class="term">2</span> (when set to <span class="term">1</span>, for these two elements, the <span class="term">name</span> attribute is retained).<br /> | 1568 |   The attribute <span class="term">name</span> is deprecated in <span class="term">form</span>, <span class="term">iframe</span>, and <span class="term">img</span>, and is replaced with <span class="term">id</span> if an <span class="term">id</span> attribute doesn't exist and if the <span class="term">name</span> value is appropriate for <span class="term">id</span> (i.e., doesn't have a non-word character like space). For such replacements for <span class="term">a</span> and <span class="term">map</span>, for which the <span class="term">name</span> attribute is deprecated in XHTML 1.1, <span class="term">$config["no_deprecated_attr"]</span> should be set to <span class="term">2</span> (when set to <span class="term">1</span>, for these two elements, the <span class="term">name</span> attribute is retained).<br /> |
1569 | 1569 | ||
1570 | </div> | 1570 | </div> |
1571 | <div class="sub-sub-section"><h4> | 1571 | <div class="sub-sub-section"><h4> |
1572 | <a name="s3.4.7" id="s3.4.7"></a><span class="item-no">3.4.7</span>  Anti-spam & <span class="term">href</span> | 1572 | <a name="s3.4.7" id="s3.4.7"></a><span class="item-no">3.4.7</span>  Anti-spam & <span class="term">href</span> |
1573 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1573 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1574 | <br /> | 1574 | <br /> |
1575 |   htmLawed (function <span class="term">hl_tag()</span>) can check the <span class="term">href</span> attribute values (link addresses) as an anti-spam (email or link spam) measure.<br /> | 1575 |   htmLawed (function <span class="term">hl_tag()</span>) can check the <span class="term">href</span> attribute values (link addresses) as an anti-spam (email or link spam) measure.<br /> |
1576 | <br /> | 1576 | <br /> |
1577 |   If <span class="term">$config["anti_mail_spam"]</span> is not <span class="term">0</span>, the <span class="term">@</span> of email addresses in <span class="term">href</span> values like <span class="term">mailto:a@b.com</span> is replaced with text specified by <span class="term">$config["anti_mail_spam"]</span>. The text should be of a form that makes it clear to others that the address needs to be edited before a mail is sent; e.g., <span class="term"><remove_this_antispam>@</span> (makes the example address <span class="term">a<remove_this_antispam>@b.com</span>).<br /> | 1577 |   If <span class="term">$config["anti_mail_spam"]</span> is not <span class="term">0</span>, the <span class="term">@</span> of email addresses in <span class="term">href</span> values like <span class="term">mailto:a@b.com</span> is replaced with text specified by <span class="term">$config["anti_mail_spam"]</span>. The text should be of a form that makes it clear to others that the address needs to be edited before a mail is sent; e.g., <span class="term"><remove_this_antispam>@</span> (makes the example address <span class="term">a<remove_this_antispam>@b.com</span>).<br /> |
1578 | <br /> | 1578 | <br /> |
1579 |   For regular links, one can choose to have a <span class="term">rel</span> attribute with <span class="term">nofollow</span> in its value (which tells some search engines to not follow a link). This can discourage link spammers. Additionally, or as an alternative, one can choose to empty the <span class="term">href</span> value altogether (disable the link).<br /> | 1579 |   For regular links, one can choose to have a <span class="term">rel</span> attribute with <span class="term">nofollow</span> in its value (which tells some search engines to not follow a link). This can discourage link spammers. Additionally, or as an alternative, one can choose to empty the <span class="term">href</span> value altogether (disable the link).<br /> |
1580 | <br /> | 1580 | <br /> |
1581 |   For use of these options, <span class="term">$config["anti_link_spam"]</span> should be set as an array with values <span class="term">regex1</span> and <span class="term">regex2</span>, both or one of which can be empty (like <span class="term">array("", "regex2")</span>) to indicate that that option is not to be used. Otherwise, <span class="term">regex1</span> or <span class="term">regex2</span> should be PHP- and PCRE-compatible regular expression patterns: <span class="term">href</span> values will be matched against them and those matching the pattern will accordingly be treated.<br /> | 1581 |   For use of these options, <span class="term">$config["anti_link_spam"]</span> should be set as an array with values <span class="term">regex1</span> and <span class="term">regex2</span>, both or one of which can be empty (like <span class="term">array("", "regex2")</span>) to indicate that that option is not to be used. Otherwise, <span class="term">regex1</span> or <span class="term">regex2</span> should be PHP- and PCRE-compatible regular expression patterns: <span class="term">href</span> values will be matched against them and those matching the pattern will accordingly be treated.<br /> |
1582 | <br /> | 1582 | <br /> |
1583 |   Note that the regular expressions should have <em>delimiters</em>, and be well-formed and preferably fast. Absolute efficiency/accuracy is often not needed.<br /> | 1583 |   Note that the regular expressions should have <em>delimiters</em>, and be well-formed and preferably fast. Absolute efficiency/accuracy is often not needed.<br /> |
1584 | <br /> | 1584 | <br /> |
1585 |   An example, to have a <span class="term">rel</span> attribute with <span class="term">nofollow</span> for all links, and to disable links that do not point to domains <span class="term">abc.com</span> and <span class="term">xyz.org</span>:<br /> | 1585 |   An example, to have a <span class="term">rel</span> attribute with <span class="term">nofollow</span> for all links, and to disable links that do not point to domains <span class="term">abc.com</span> and <span class="term">xyz.org</span>:<br /> |
1586 | <br /> | 1586 | <br /> |
1587 | 1587 | ||
1588 | <code class="code">    $config["anti_link_spam"] = array('`.`', '`://\W*(?!(abc\.com|xyz\.org))`');</code> | 1588 | <code class="code">    $config["anti_link_spam"] = array('`.`', '`://\W*(?!(abc\.com|xyz\.org))`');</code> |
1589 | <br /> | 1589 | <br /> |
1590 | 1590 | ||
1591 | </div> | 1591 | </div> |
1592 | <div class="sub-sub-section"><h4> | 1592 | <div class="sub-sub-section"><h4> |
1593 | <a name="s3.4.8" id="s3.4.8"></a><span class="item-no">3.4.8</span>  Inline style properties | 1593 | <a name="s3.4.8" id="s3.4.8"></a><span class="item-no">3.4.8</span>  Inline style properties |
1594 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1594 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1595 | <br /> | 1595 | <br /> |
1596 |   htmLawed can check URL schemes and dynamic expressions (to guard against Javascript, etc., script-based insecurities) in inline CSS style property values in the <span class="term">style</span> attributes. (CSS properties like <span class="term">background-image</span> that accept URLs in their values are noted in <a href="#s5.3">section 5.3</a>.) Dynamic CSS expressions that allow scripting in the IE browser, and can be a vulnerability, can be removed from property values by setting <span class="term">$config["css_expression"]</span> to <span class="term">1</span> (default setting). Note that when <span class="term">$config["css_expression"]</span> is set to <span class="term">1</span>, htmLawed will remove <span class="term">/*</span> from the <span class="term">style</span> values.<br /> | 1596 |   htmLawed can check URL schemes and dynamic expressions (to guard against Javascript, etc., script-based insecurities) in inline CSS style property values in the <span class="term">style</span> attributes. (CSS properties like <span class="term">background-image</span> that accept URLs in their values are noted in <a href="#s5.3">section 5.3</a>.) Dynamic CSS expressions that allow scripting in the IE browser, and can be a vulnerability, can be removed from property values by setting <span class="term">$config["css_expression"]</span> to <span class="term">1</span> (default setting). Note that when <span class="term">$config["css_expression"]</span> is set to <span class="term">1</span>, htmLawed will remove <span class="term">/*</span> from the <span class="term">style</span> values.<br /> |
1597 | <br /> | 1597 | <br /> |
1598 |   <strong>Note</strong>: Because of the various ways of representing characters in attribute values (URL-escapement, entitification, etc.), htmLawed might alter the values of the <span class="term">style</span> attribute values, and may even falsely identify dynamic CSS expressions and URL schemes in them. If this is an important issue, checking of URLs and dynamic expressions can be turned off (<span class="term">$config["schemes"] = "...style:*..."</span>, see <a href="#s3.4.3">section 3.4.3</a>, and <span class="term">$config["css_expression"] = 0</span>). Alternately, admins can use their own custom function for finer handling of <span class="term">style</span> values through the <span class="term">hook_tag</span> parameter (see <a href="#s3.4.9">section 3.4.9</a>).<br /> | 1598 |   <strong>Note</strong>: Because of the various ways of representing characters in attribute values (URL-escapement, entitification, etc.), htmLawed might alter the values of the <span class="term">style</span> attribute values, and may even falsely identify dynamic CSS expressions and URL schemes in them. If this is an important issue, checking of URLs and dynamic expressions can be turned off (<span class="term">$config["schemes"] = "...style:*..."</span>, see <a href="#s3.4.3">section 3.4.3</a>, and <span class="term">$config["css_expression"] = 0</span>). Alternately, admins can use their own custom function for finer handling of <span class="term">style</span> values through the <span class="term">hook_tag</span> parameter (see <a href="#s3.4.9">section 3.4.9</a>).<br /> |
1599 | <br /> | 1599 | <br /> |
1600 |   It is also possible to have htmLawed let through any <span class="term">style</span> value by setting <span class="term">$config["style_pass"]</span> to <span class="term">1</span>.<br /> | 1600 |   It is also possible to have htmLawed let through any <span class="term">style</span> value by setting <span class="term">$config["style_pass"]</span> to <span class="term">1</span>.<br /> |
1601 | <br /> | 1601 | <br /> |
1602 |   As such, it is better to set up a CSS file with class declarations, disallow the <span class="term">style</span> attribute, set a <span class="term">$spec</span> rule (see <a href="#s2.3">section 2.3</a>) for <span class="term">class</span> for the <span class="term">oneof</span> or <span class="term">match</span> parameter, and ask writers to make use of the <span class="term">class</span> attribute.<br /> | 1602 |   As such, it is better to set up a CSS file with class declarations, disallow the <span class="term">style</span> attribute, set a <span class="term">$spec</span> rule (see <a href="#s2.3">section 2.3</a>) for <span class="term">class</span> for the <span class="term">oneof</span> or <span class="term">match</span> parameter, and ask writers to make use of the <span class="term">class</span> attribute.<br /> |
1603 | 1603 | ||
1604 | </div> | 1604 | </div> |
1605 | <div class="sub-sub-section"><h4> | 1605 | <div class="sub-sub-section"><h4> |
1606 | <a name="s3.4.9" id="s3.4.9"></a><span class="item-no">3.4.9</span>  Hook function for tag content | 1606 | <a name="s3.4.9" id="s3.4.9"></a><span class="item-no">3.4.9</span>  Hook function for tag content |
1607 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1607 | </h4><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1608 | <br /> | 1608 | <br /> |
1609 |   It is possible to utilize a custom hook function to alter the tag content htmLawed has finalized (i.e., after it has checked/corrected for required attributes, transformed attributes, lower-cased attribute names, etc.).<br /> | 1609 |   It is possible to utilize a custom hook function to alter the tag content htmLawed has finalized (i.e., after it has checked/corrected for required attributes, transformed attributes, lower-cased attribute names, etc.).<br /> |
1610 | <br /> | 1610 | <br /> |
1611 |   When <span class="term">$config</span> parameter <span class="term">hook_tag</span> is set to the name of a function, htmLawed (function <span class="term">hl_tag()</span>) will pass on the element name, and the <em>finalized</em> attribute name-value pairs as array elements to the function. The function, after completing a task such as filtering or tag transformation, will typically return an empty string, the full opening tag string like <span class="term"><element_name attribute_1_name="attribute_1_value"...></span> (for empty elements like <span class="term">img</span> and <span class="term">input</span>, the element-closing slash <span class="term">/</span> should also be included), etc.<br /> | 1611 |   When <span class="term">$config</span> parameter <span class="term">hook_tag</span> is set to the name of a function, htmLawed (function <span class="term">hl_tag()</span>) will pass on the element name, and the <em>finalized</em> attribute name-value pairs as array elements to the function. The function, after completing a task such as filtering or tag transformation, will typically return an empty string, the full opening tag string like <span class="term"><element_name attribute_1_name="attribute_1_value"...></span> (for empty elements like <span class="term">img</span> and <span class="term">input</span>, the element-closing slash <span class="term">/</span> should also be included), etc.<br /> |
1612 | <br /> | 1612 | <br /> |
1613 |   Any <span class="term">hook_tag</span> function, since htmLawed version 1.1.11, also receives names of elements in closing tags, such as <span class="term">a</span> in the closing <span class="term"></a></span> tag of the element <span class="term"><a href="http://cnn.com">CNN</a></span>. No other value is passed to the function since a closing tag contains only element names. Typically, the function will return an empty string or a full closing tag (like <span class="term"></a></span>).<br /> | 1613 |   Any <span class="term">hook_tag</span> function, since htmLawed version 1.1.11, also receives names of elements in closing tags, such as <span class="term">a</span> in the closing <span class="term"></a></span> tag of the element <span class="term"><a href="http://cnn.com">CNN</a></span>. No other value is passed to the function since a closing tag contains only element names. Typically, the function will return an empty string or a full closing tag (like <span class="term"></a></span>).<br /> |
1614 | <br /> | 1614 | <br /> |
1615 |   This is a <strong>powerful functionality</strong> that can be exploited for various objectives: consolidate-and-convert inline <span class="term">style</span> attributes to <span class="term">class</span>, convert <span class="term">embed</span> elements to <span class="term">object</span>, permit only one <span class="term">caption</span> element in a <span class="term">table</span> element, disallow embedding of certain types of media, <strong>inject HTML</strong>, use <a href="http://csstidy.sourceforge.net">CSSTidy</a> to sanitize <span class="term">style</span> attribute values, etc.<br /> | 1615 |   This is a <strong>powerful functionality</strong> that can be exploited for various objectives: consolidate-and-convert inline <span class="term">style</span> attributes to <span class="term">class</span>, convert <span class="term">embed</span> elements to <span class="term">object</span>, permit only one <span class="term">caption</span> element in a <span class="term">table</span> element, disallow embedding of certain types of media, <strong>inject HTML</strong>, use <a href="http://csstidy.sourceforge.net">CSSTidy</a> to sanitize <span class="term">style</span> attribute values, etc.<br /> |
1616 | <br /> | 1616 | <br /> |
1617 |   As an example, the custom hook code below can be used to force a series of specifically ordered <span class="term">id</span> attributes on all elements, and a specific <span class="term">param</span> element inside all <span class="term">object</span> elements:<br /> | 1617 |   As an example, the custom hook code below can be used to force a series of specifically ordered <span class="term">id</span> attributes on all elements, and a specific <span class="term">param</span> element inside all <span class="term">object</span> elements:<br /> |
1618 | <br /> | 1618 | <br /> |
1619 | 1619 | ||
1620 | <code class="code">    function my_tag_function($element, $attribute_array=0){</code> | 1620 | <code class="code">    function my_tag_function($element, $attribute_array=0){</code> |
1621 | <br /> | 1621 | <br /> |
1622 | <br /> | 1622 | <br /> |
1623 | 1623 | ||
1624 | <code class="code">      // If second argument is not received, it means a closing tag is being handled</code> | 1624 | <code class="code">      // If second argument is not received, it means a closing tag is being handled</code> |
1625 | <br /> | 1625 | <br /> |
1626 | 1626 | ||
1627 | <code class="code">      if(is_numeric($attribute_array)){</code> | 1627 | <code class="code">      if(is_numeric($attribute_array)){</code> |
1628 | <br /> | 1628 | <br /> |
1629 | 1629 | ||
1630 | <code class="code">        return "</$element>";</code> | 1630 | <code class="code">        return "</$element>";</code> |
1631 | <br /> | 1631 | <br /> |
1632 | 1632 | ||
1633 | <code class="code">      }</code> | 1633 | <code class="code">      }</code> |
1634 | <br /> | 1634 | <br /> |
1635 | <br /> | 1635 | <br /> |
1636 | 1636 | ||
1637 | <code class="code">      static $id = 0;</code> | 1637 | <code class="code">      static $id = 0;</code> |
1638 | <br /> | 1638 | <br /> |
1639 | 1639 | ||
1640 | <code class="code">      // Remove any duplicate element</code> | 1640 | <code class="code">      // Remove any duplicate element</code> |
1641 | <br /> | 1641 | <br /> |
1642 | 1642 | ||
1643 | <code class="code">      if($element == 'param' && isset($attribute_array['allowscriptaccess'])){</code> | 1643 | <code class="code">      if($element == 'param' && isset($attribute_array['allowscriptaccess'])){</code> |
1644 | <br /> | 1644 | <br /> |
1645 | 1645 | ||
1646 | <code class="code">        return '';</code> | 1646 | <code class="code">        return '';</code> |
1647 | <br /> | 1647 | <br /> |
1648 | 1648 | ||
1649 | <code class="code">      }</code> | 1649 | <code class="code">      }</code> |
1650 | <br /> | 1650 | <br /> |
1651 | <br /> | 1651 | <br /> |
1652 | 1652 | ||
1653 | <code class="code">      $new_element = '';</code> | 1653 | <code class="code">      $new_element = '';</code> |
1654 | <br /> | 1654 | <br /> |
1655 | <br /> | 1655 | <br /> |
1656 | 1656 | ||
1657 | <code class="code">      // Force a serialized ID number</code> | 1657 | <code class="code">      // Force a serialized ID number</code> |
1658 | <br /> | 1658 | <br /> |
1659 | 1659 | ||
1660 | <code class="code">      $attribute_array['id'] = 'my_'. $id;</code> | 1660 | <code class="code">      $attribute_array['id'] = 'my_'. $id;</code> |
1661 | <br /> | 1661 | <br /> |
1662 | 1662 | ||
1663 | <code class="code">      ++$id;</code> | 1663 | <code class="code">      ++$id;</code> |
1664 | <br /> | 1664 | <br /> |
1665 | <br /> | 1665 | <br /> |
1666 | 1666 | ||
1667 | <code class="code">      // Inject param for allowscriptaccess</code> | 1667 | <code class="code">      // Inject param for allowscriptaccess</code> |
1668 | <br /> | 1668 | <br /> |
1669 | 1669 | ||
1670 | <code class="code">      if($element == 'object'){</code> | 1670 | <code class="code">      if($element == 'object'){</code> |
1671 | <br /> | 1671 | <br /> |
1672 | 1672 | ||
1673 | <code class="code">        $new_element = '<param id="my_'. $id. '"; allowscriptaccess="never" />';</code> | 1673 | <code class="code">        $new_element = '<param id="my_'. $id. '"; allowscriptaccess="never" />';</code> |
1674 | <br /> | 1674 | <br /> |
1675 | 1675 | ||
1676 | <code class="code">        ++$id;</code> | 1676 | <code class="code">        ++$id;</code> |
1677 | <br /> | 1677 | <br /> |
1678 | 1678 | ||
1679 | <code class="code">      }</code> | 1679 | <code class="code">      }</code> |
1680 | <br /> | 1680 | <br /> |
1681 | <br /> | 1681 | <br /> |
1682 | 1682 | ||
1683 | <code class="code">      $string = '';</code> | 1683 | <code class="code">      $string = '';</code> |
1684 | <br /> | 1684 | <br /> |
1685 | 1685 | ||
1686 | <code class="code">      foreach($attribute_array as $k=>$v){</code> | 1686 | <code class="code">      foreach($attribute_array as $k=>$v){</code> |
1687 | <br /> | 1687 | <br /> |
1688 | 1688 | ||
1689 | <code class="code">        $string .= " {$k}=\"{$v}\"";</code> | 1689 | <code class="code">        $string .= " {$k}=\"{$v}\"";</code> |
1690 | <br /> | 1690 | <br /> |
1691 | 1691 | ||
1692 | <code class="code">      }</code> | 1692 | <code class="code">      }</code> |
1693 | <br /> | 1693 | <br /> |
1694 | <br /> | 1694 | <br /> |
1695 | 1695 | ||
1696 | <code class="code">      static $empty_elements = array('area'=>1, 'br'=>1, 'col'=>1, 'command'=>1, 'embed'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'isindex'=>1, 'keygen'=>1, 'link'=>1, 'meta'=>1, 'param'=>1, 'source'=>1, 'track'=>1, 'wbr'=>1);</code> | 1696 | <code class="code">      static $empty_elements = array('area'=>1, 'br'=>1, 'col'=>1, 'command'=>1, 'embed'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'isindex'=>1, 'keygen'=>1, 'link'=>1, 'meta'=>1, 'param'=>1, 'source'=>1, 'track'=>1, 'wbr'=>1);</code> |
1697 | <br /> | 1697 | <br /> |
1698 | <br /> | 1698 | <br /> |
1699 | 1699 | ||
1700 | <code class="code">      return "<{$element}{$string}". (array_key_exists($element, $empty_elements) ? ' /' : ''). '>'. $new_element;</code> | 1700 | <code class="code">      return "<{$element}{$string}". (array_key_exists($element, $empty_elements) ? ' /' : ''). '>'. $new_element;</code> |
1701 | <br /> | 1701 | <br /> |
1702 | 1702 | ||
1703 | <code class="code">    }</code> | 1703 | <code class="code">    }</code> |
1704 | <br /> | 1704 | <br /> |
1705 | <br /> | 1705 | <br /> |
1706 |   The <span class="term">hook_tag</span> parameter is different from the <span class="term">hook</span> parameter (<a href="#s3.7">section 3.7</a>).<br /> | 1706 |   The <span class="term">hook_tag</span> parameter is different from the <span class="term">hook</span> parameter (<a href="#s3.7">section 3.7</a>).<br /> |
1707 | <br /> | 1707 | <br /> |
1708 |   Snippets of hook function code developed by others may be available on the <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed">htmLawed</a> website.<br /> | 1708 |   Snippets of hook function code developed by others may be available on the <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed">htmLawed</a> website.<br /> |
1709 | 1709 | ||
1710 | </div> | 1710 | </div> |
1711 | <div class="sub-section"><h3> | 1711 | <div class="sub-section"><h3> |
1712 | <a name="s3.5" id="s3.5"></a><span class="item-no">3.5</span>  Simple configuration directive for most valid XHTML | 1712 | <a name="s3.5" id="s3.5"></a><span class="item-no">3.5</span>  Simple configuration directive for most valid XHTML |
1713 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1713 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1714 | <br /> | 1714 | <br /> |
1715 |   If <span class="term">$config["valid_xhtml"]</span> is set to <span class="term">1</span>, some relevant <span class="term">$config</span> parameters (indicated by <span class="term">~</span> in <a href="#s2.2">section 2.2</a>) are auto-adjusted. This allows one to pass the <span class="term">$config</span> argument with a simpler value. If a value for a parameter auto-set through <span class="term">valid_xhtml</span> is still manually provided, then that value will over-ride the auto-set value.<br /> | 1715 |   If <span class="term">$config["valid_xhtml"]</span> is set to <span class="term">1</span>, some relevant <span class="term">$config</span> parameters (indicated by <span class="term">~</span> in <a href="#s2.2">section 2.2</a>) are auto-adjusted. This allows one to pass the <span class="term">$config</span> argument with a simpler value. If a value for a parameter auto-set through <span class="term">valid_xhtml</span> is still manually provided, then that value will over-ride the auto-set value.<br /> |
1716 | 1716 | ||
1717 | </div> | 1717 | </div> |
1718 | <div class="sub-section"><h3> | 1718 | <div class="sub-section"><h3> |
1719 | <a name="s3.6" id="s3.6"></a><span class="item-no">3.6</span>  Simple configuration directive for most <em>safe</em> HTML | 1719 | <a name="s3.6" id="s3.6"></a><span class="item-no">3.6</span>  Simple configuration directive for most <em>safe</em> HTML |
1720 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1720 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1721 | <br /> | 1721 | <br /> |
1722 |   <em>Safe</em> HTML refers to HTML that is restricted to reduce the vulnerability for scripting attacks (such as XSS) based on HTML code which otherwise may still be legal and compliant with the HTML standard specifications. When elements such as <span class="term">script</span> and <span class="term">object</span>, and attributes such as <span class="term">onmouseover</span> and <span class="term">style</span> are allowed in the input text, an input writer can introduce malevolent HTML code. Note that what is considered <span class="term">safe</span> depends on the nature of the web application and the trust-level accorded to its users.<br /> | 1722 |   <em>Safe</em> HTML refers to HTML that is restricted to reduce the vulnerability for scripting attacks (such as XSS) based on HTML code which otherwise may still be legal and compliant with the HTML standard specifications. When elements such as <span class="term">script</span> and <span class="term">object</span>, and attributes such as <span class="term">onmouseover</span> and <span class="term">style</span> are allowed in the input text, an input writer can introduce malevolent HTML code. Note that what is considered <span class="term">safe</span> depends on the nature of the web application and the trust-level accorded to its users.<br /> |
1723 | <br /> | 1723 | <br /> |
1724 |   htmLawed allows an admin to use <span class="term">$config["safe"]</span> to auto-adjust multiple <span class="term">$config</span> parameters (such as <span class="term">elements</span> which declares the allowed element-set), which otherwise would have to be manually set. The relevant parameters are indicated by <span class="term">"</span> in <a href="#s2.2">section 2.2</a>). Thus, one can pass the <span class="term">$config</span> argument with a simpler value. Having the <span class="term">safe</span> parameter set to <span class="term">1</span> is equivalent to setting the following <span class="term">$config</span> parameters to the noted values :<br /> | 1724 |   htmLawed allows an admin to use <span class="term">$config["safe"]</span> to auto-adjust multiple <span class="term">$config</span> parameters (such as <span class="term">elements</span> which declares the allowed element-set), which otherwise would have to be manually set. The relevant parameters are indicated by <span class="term">"</span> in <a href="#s2.2">section 2.2</a>). Thus, one can pass the <span class="term">$config</span> argument with a simpler value. Having the <span class="term">safe</span> parameter set to <span class="term">1</span> is equivalent to setting the following <span class="term">$config</span> parameters to the noted values :<br /> |
1725 | <br /> | 1725 | <br /> |
1726 | 1726 | ||
1727 | <code class="code">    cdata - 0</code> | 1727 | <code class="code">    cdata - 0</code> |
1728 | <br /> | 1728 | <br /> |
1729 | 1729 | ||
1730 | <code class="code">    comment - 0</code> | 1730 | <code class="code">    comment - 0</code> |
1731 | <br /> | 1731 | <br /> |
1732 | 1732 | ||
1733 | <code class="code">    deny_attribute - on*</code> | 1733 | <code class="code">    deny_attribute - on*</code> |
1734 | <br /> | 1734 | <br /> |
1735 | 1735 | ||
1736 | <code class="code">    elements - * -applet -audio -canvas -embed -iframe -object -script -video</code> | 1736 | <code class="code">    elements - * -applet -audio -canvas -embed -iframe -object -script -video</code> |
1737 | <br /> | 1737 | <br /> |
1738 | 1738 | ||
1739 | <code class="code">    schemes - href: aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, tel, telnet; style: !; *:file, http, https</code> | 1739 | <code class="code">    schemes - href: aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, tel, telnet; style: !; *:file, http, https</code> |
1740 | <br /> | 1740 | <br /> |
1741 | <br /> | 1741 | <br /> |
1742 |   With <span class="term">safe</span> set to <span class="term">1</span>, htmLawed considers <span class="term">CDATA</span> sections and HTML comments as plain text, and prohibits the <span class="term">applet</span>, <span class="term">audio</span>, <span class="term">canvas</span>, <span class="term">embed</span>, <span class="term">iframe</span>, <span class="term">object</span>, <span class="term">script</span> and <span class="term">video</span> elements, and the <span class="term">on*</span> attributes like <span class="term">onclick</span>. ( There are <span class="term">$config</span> parameters like <span class="term">css_expression</span> that are not affected by the value set for <span class="term">safe</span> but whose default values still contribute towards a more <em>safe</em> output.) Further, unless overridden by the value for parameter <span class="term">schemes</span> (see <a href="#s3.4.3">section 3.4.3</a>), the schemes <span class="term">app</span>, <span class="term">data</span> and <span class="term">javascript</span> are not permitted, and URLs with schemes are neutralized so that, e.g., <span class="term">style="moz-binding:url(http://danger)"</span> becomes <span class="term">style="moz-binding:url(denied:http://danger)"</span>.<br /> | 1742 |   With <span class="term">safe</span> set to <span class="term">1</span>, htmLawed considers <span class="term">CDATA</span> sections and HTML comments as plain text, and prohibits the <span class="term">applet</span>, <span class="term">audio</span>, <span class="term">canvas</span>, <span class="term">embed</span>, <span class="term">iframe</span>, <span class="term">object</span>, <span class="term">script</span> and <span class="term">video</span> elements, and the <span class="term">on*</span> attributes like <span class="term">onclick</span>. ( There are <span class="term">$config</span> parameters like <span class="term">css_expression</span> that are not affected by the value set for <span class="term">safe</span> but whose default values still contribute towards a more <em>safe</em> output.) Further, unless overridden by the value for parameter <span class="term">schemes</span> (see <a href="#s3.4.3">section 3.4.3</a>), the schemes <span class="term">app</span>, <span class="term">data</span> and <span class="term">javascript</span> are not permitted, and URLs with schemes are neutralized so that, e.g., <span class="term">style="moz-binding:url(http://danger)"</span> becomes <span class="term">style="moz-binding:url(denied:http://danger)"</span>.<br /> |
1743 | <br /> | 1743 | <br /> |
1744 |   Admins, however, may still want to completely deny the <span class="term">style</span> attribute, e.g., with code like<br /> | 1744 |   Admins, however, may still want to completely deny the <span class="term">style</span> attribute, e.g., with code like<br /> |
1745 | <br /> | 1745 | <br /> |
1746 | 1746 | ||
1747 | <code class="code">    $processed = htmLawed($text, array('safe'=>1, 'deny_attribute'=>'style'));</code> | 1747 | <code class="code">    $processed = htmLawed($text, array('safe'=>1, 'deny_attribute'=>'style'));</code> |
1748 | <br /> | 1748 | <br /> |
1749 | <br /> | 1749 | <br /> |
1750 |   Permitting the <span class="term">style</span> attribute brings in risks of <em>click-jacking</em>, etc. CSS property values can render a page non-functional or be used to deface it. Except for URLs, dynamic expressions, and some other things, htmLawed does not completely check <span class="term">style</span> values. It does provide ways for the code-developer implementing htmLawed to do such checks through the <span class="term">$spec</span> argument, and through the <span class="term">hook_tag</span> parameter (see <a href="#s3.4.8">section 3.4.8</a> for more). Disallowing style completely and relying on CSS classes and stylesheet files is recommended.<br /> | 1750 |   Permitting the <span class="term">style</span> attribute brings in risks of <em>click-jacking</em>, etc. CSS property values can render a page non-functional or be used to deface it. Except for URLs, dynamic expressions, and some other things, htmLawed does not completely check <span class="term">style</span> values. It does provide ways for the code-developer implementing htmLawed to do such checks through the <span class="term">$spec</span> argument, and through the <span class="term">hook_tag</span> parameter (see <a href="#s3.4.8">section 3.4.8</a> for more). Disallowing style completely and relying on CSS classes and stylesheet files is recommended.<br /> |
1751 | <br /> | 1751 | <br /> |
1752 |   If a value for a parameter auto-set through <span class="term">safe</span> is still manually provided, then that value can over-ride the auto-set value. E.g., with <span class="term">$config["safe"] = 1</span> and <span class="term">$config["elements"] = "* +script"</span>, <span class="term">script</span>, but not <span class="term">applet</span>, is allowed. Such over-ride does not occur for <span class="term">deny_attribute</span> (for legacy reason) when comma-separated attribute names are provided as the value for this parameter (<a href="#s3.4">section 3.4</a>); instead htmLawed will add <span class="term">on*</span> to the value provided for <span class="term">deny_attribute</span>.<br /> | 1752 |   If a value for a parameter auto-set through <span class="term">safe</span> is still manually provided, then that value can over-ride the auto-set value. E.g., with <span class="term">$config["safe"] = 1</span> and <span class="term">$config["elements"] = "* +script"</span>, <span class="term">script</span>, but not <span class="term">applet</span>, is allowed. Such over-ride does not occur for <span class="term">deny_attribute</span> (for legacy reason) when comma-separated attribute names are provided as the value for this parameter (<a href="#s3.4">section 3.4</a>); instead htmLawed will add <span class="term">on*</span> to the value provided for <span class="term">deny_attribute</span>.<br /> |
1753 | <br /> | 1753 | <br /> |
1754 |   A page illustrating the efficacy of htmLawed's anti-XSS abilities with <span class="term">safe</span> set to <span class="term">1</span> against XSS vectors listed by <a href="http://ha.ckers.org/xss.html">RSnake</a> may be available <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/rsnake/RSnakeXSSTest.htm">here</a>.<br /> | 1754 |   A page illustrating the efficacy of htmLawed's anti-XSS abilities with <span class="term">safe</span> set to <span class="term">1</span> against XSS vectors listed by <a href="http://ha.ckers.org/xss.html">RSnake</a> may be available <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/rsnake/RSnakeXSSTest.htm">here</a>.<br /> |
1755 | 1755 | ||
1756 | </div> | 1756 | </div> |
1757 | <div class="sub-section"><h3> | 1757 | <div class="sub-section"><h3> |
1758 | <a name="s3.7" id="s3.7"></a><span class="item-no">3.7</span>  Using a hook function | 1758 | <a name="s3.7" id="s3.7"></a><span class="item-no">3.7</span>  Using a hook function |
1759 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1759 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1760 | <br /> | 1760 | <br /> |
1761 |   If <span class="term">$config["hook"]</span> is not set to <span class="term">0</span>, then htmLawed will allow preliminarily processed input to be altered by a hook function named by <span class="term">$config["hook"]</span> before starting the main work (but after handling of characters, entities, HTML comments and <span class="term">CDATA</span> sections -- see code for function <span class="term">htmLawed()</span>).<br /> | 1761 |   If <span class="term">$config["hook"]</span> is not set to <span class="term">0</span>, then htmLawed will allow preliminarily processed input to be altered by a hook function named by <span class="term">$config["hook"]</span> before starting the main work (but after handling of characters, entities, HTML comments and <span class="term">CDATA</span> sections -- see code for function <span class="term">htmLawed()</span>).<br /> |
1762 | <br /> | 1762 | <br /> |
1763 |   The hook function also allows one to alter the <em>finalized</em> values of <span class="term">$config</span> and <span class="term">$spec</span>.<br /> | 1763 |   The hook function also allows one to alter the <em>finalized</em> values of <span class="term">$config</span> and <span class="term">$spec</span>.<br /> |
1764 | <br /> | 1764 | <br /> |
1765 |   Note that the <span class="term">hook</span> parameter is different from the <span class="term">hook_tag</span> parameter (<a href="#s3.4.9">section 3.4.9</a>).<br /> | 1765 |   Note that the <span class="term">hook</span> parameter is different from the <span class="term">hook_tag</span> parameter (<a href="#s3.4.9">section 3.4.9</a>).<br /> |
1766 | <br /> | 1766 | <br /> |
1767 |   Snippets of hook function code developed by others may be available on the <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed">htmLawed</a> website.<br /> | 1767 |   Snippets of hook function code developed by others may be available on the <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed">htmLawed</a> website.<br /> |
1768 | 1768 | ||
1769 | </div> | 1769 | </div> |
1770 | <div class="sub-section"><h3> | 1770 | <div class="sub-section"><h3> |
1771 | <a name="s3.8" id="s3.8"></a><span class="item-no">3.8</span>  Obtaining <em>finalized</em> parameter values | 1771 | <a name="s3.8" id="s3.8"></a><span class="item-no">3.8</span>  Obtaining <em>finalized</em> parameter values |
1772 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1772 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1773 | <br /> | 1773 | <br /> |
1774 |   htmLawed can assign the <em>finalized</em> <span class="term">$config</span> and <span class="term">$spec</span> values to a variable named by <span class="term">$config["show_setting"]</span>. The variable, made global by htmLawed, is set as an array with three keys: <span class="term">config</span>, with the <span class="term">$config</span> value, <span class="term">spec</span>, with the <span class="term">$spec</span> value, and <span class="term">time</span>, with a value that is the Unix time (the output of PHP's <span class="term">microtime()</span> function) when the value was assigned. Admins should use a PHP-compliant variable name (e.g., one that does not begin with a numerical digit) that does not conflict with variable names in their non-htmLawed code.<br /> | 1774 |   htmLawed can assign the <em>finalized</em> <span class="term">$config</span> and <span class="term">$spec</span> values to a variable named by <span class="term">$config["show_setting"]</span>. The variable, made global by htmLawed, is set as an array with three keys: <span class="term">config</span>, with the <span class="term">$config</span> value, <span class="term">spec</span>, with the <span class="term">$spec</span> value, and <span class="term">time</span>, with a value that is the Unix time (the output of PHP's <span class="term">microtime()</span> function) when the value was assigned. Admins should use a PHP-compliant variable name (e.g., one that does not begin with a numerical digit) that does not conflict with variable names in their non-htmLawed code.<br /> |
1775 | <br /> | 1775 | <br /> |
1776 |   The values, which are also post-hook function (if any), can be used to auto-generate information (on, e.g., the elements that are permitted) for input writers.<br /> | 1776 |   The values, which are also post-hook function (if any), can be used to auto-generate information (on, e.g., the elements that are permitted) for input writers.<br /> |
1777 | 1777 | ||
1778 | </div> | 1778 | </div> |
1779 | <div class="sub-section"><h3> | 1779 | <div class="sub-section"><h3> |
1780 | <a name="s3.9" id="s3.9"></a><span class="item-no">3.9</span>  Retaining non-HTML tags in input with mixed markup | 1780 | <a name="s3.9" id="s3.9"></a><span class="item-no">3.9</span>  Retaining non-HTML tags in input with mixed markup |
1781 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1781 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1782 | <br /> | 1782 | <br /> |
1783 |   htmLawed does not remove certain characters that, though invalid, are nevertheless <em>discouraged</em> in HTML documents as per the specifications (see <a href="#s5.1">section 5.1</a>). This can be utilized to deal with input that contains mixed markup. Input that may have HTML markup as well as some other markup that is based on the <span class="term"><</span>, <span class="term">></span> and <span class="term">&</span> characters is considered to have mixed markup. The non-HTML markup can be rather proprietary (like markup for emoticons/smileys), or standard (like MathML or SVG). Or it can be programming code meant for execution/evaluation (such as embedded PHP code).<br /> | 1783 |   htmLawed does not remove certain characters that, though invalid, are nevertheless <em>discouraged</em> in HTML documents as per the specifications (see <a href="#s5.1">section 5.1</a>). This can be utilized to deal with input that contains mixed markup. Input that may have HTML markup as well as some other markup that is based on the <span class="term"><</span>, <span class="term">></span> and <span class="term">&</span> characters is considered to have mixed markup. The non-HTML markup can be rather proprietary (like markup for emoticons/smileys), or standard (like MathML or SVG). Or it can be programming code meant for execution/evaluation (such as embedded PHP code).<br /> |
1784 | <br /> | 1784 | <br /> |
1785 |   To deal with such mixed markup, the input text can be pre-processed to hide the non-HTML markup by specifically replacing the <span class="term"><</span>, <span class="term">></span> and <span class="term">&</span> characters with some of the HTML-discouraged characters (see <a href="#s3.1.2">section 3.1.2</a>). Post-htmLawed processing, the replacements are reverted.<br /> | 1785 |   To deal with such mixed markup, the input text can be pre-processed to hide the non-HTML markup by specifically replacing the <span class="term"><</span>, <span class="term">></span> and <span class="term">&</span> characters with some of the HTML-discouraged characters (see <a href="#s3.1.2">section 3.1.2</a>). Post-htmLawed processing, the replacements are reverted.<br /> |
1786 | <br /> | 1786 | <br /> |
1787 |   An example (mixed HTML and PHP code in input text):<br /> | 1787 |   An example (mixed HTML and PHP code in input text):<br /> |
1788 | <br /> | 1788 | <br /> |
1789 | 1789 | ||
1790 | <code class="code">    $text = preg_replace('`<\?php(.+?)\?>`sm', "\x83?php\\1?\x84", $text);</code> | 1790 | <code class="code">    $text = preg_replace('`<\?php(.+?)\?>`sm', "\x83?php\\1?\x84", $text);</code> |
1791 | <br /> | 1791 | <br /> |
1792 | 1792 | ||
1793 | <code class="code">    $processed = htmLawed($text);</code> | 1793 | <code class="code">    $processed = htmLawed($text);</code> |
1794 | <br /> | 1794 | <br /> |
1795 | 1795 | ||
1796 | <code class="code">    $processed = preg_replace('`\x83\?php(.+?)\?\x84`sm', '<?php$1?>', $processed);</code> | 1796 | <code class="code">    $processed = preg_replace('`\x83\?php(.+?)\?\x84`sm', '<?php$1?>', $processed);</code> |
1797 | <br /> | 1797 | <br /> |
1798 | <br /> | 1798 | <br /> |
1799 |   This code will not work if <span class="term">$config["clean_ms_char"]</span> is set to <span class="term">1</span> (<a href="#s3.1">section 3.1</a>), in which case one should instead deploy a hook function (<a href="#s3.7">section 3.7</a>). (htmLawed internally uses certain control characters, code-points <span class="term">1</span> to <span class="term">7</span>, and use of these characters as markers in the logic of hook functions may cause issues.)<br /> | 1799 |   This code will not work if <span class="term">$config["clean_ms_char"]</span> is set to <span class="term">1</span> (<a href="#s3.1">section 3.1</a>), in which case one should instead deploy a hook function (<a href="#s3.7">section 3.7</a>). (htmLawed internally uses certain control characters, code-points <span class="term">1</span> to <span class="term">7</span>, and use of these characters as markers in the logic of hook functions may cause issues.)<br /> |
1800 | <br /> | 1800 | <br /> |
1801 |   Admins may also be able to use <span class="term">$config["and_mark"]</span> to deal with such mixed markup; see <a href="#s3.2">section 3.2</a>.<br /> | 1801 |   Admins may also be able to use <span class="term">$config["and_mark"]</span> to deal with such mixed markup; see <a href="#s3.2">section 3.2</a>.<br /> |
1802 | 1802 | ||
1803 | </div> | 1803 | </div> |
1804 | </div> | 1804 | </div> |
1805 | <div class="section"><h2> | 1805 | <div class="section"><h2> |
1806 | <a name="s4" id="s4"></a><span class="item-no">4</span>  Other | 1806 | <a name="s4" id="s4"></a><span class="item-no">4</span>  Other |
1807 | </h2><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1807 | </h2><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1808 | <div class="sub-section"><h3> | 1808 | <div class="sub-section"><h3> |
1809 | <a name="s4.1" id="s4.1"></a><span class="item-no">4.1</span>  Support | 1809 | <a name="s4.1" id="s4.1"></a><span class="item-no">4.1</span>  Support |
1810 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1810 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1811 | <br /> | 1811 | <br /> |
1812 |   Software updates and forum-based community-support may be found at <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed">http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed</a>. For general PHP issues (not htmLawed-specific), support may be found through internet searches and at <a href="http://php.net">http://php.net</a>.<br /> | 1812 |   Software updates and forum-based community-support may be found at <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed">http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed</a>. For general PHP issues (not htmLawed-specific), support may be found through internet searches and at <a href="http://php.net">http://php.net</a>.<br /> |
1813 | 1813 | ||
1814 | </div> | 1814 | </div> |
1815 | <div class="sub-section"><h3> | 1815 | <div class="sub-section"><h3> |
1816 | <a name="s4.2" id="s4.2"></a><span class="item-no">4.2</span>  Known issues | 1816 | <a name="s4.2" id="s4.2"></a><span class="item-no">4.2</span>  Known issues |
1817 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1817 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1818 | <br /> | 1818 | <br /> |
1819 |   See <a href="#s2.8">section 2.8</a>.<br /> | 1819 |   See <a href="#s2.8">section 2.8</a>.<br /> |
1820 | 1820 | ||
1821 | </div> | 1821 | </div> |
1822 | <div class="sub-section"><h3> | 1822 | <div class="sub-section"><h3> |
1823 | <a name="s4.3" id="s4.3"></a><span class="item-no">4.3</span>  Change-log | 1823 | <a name="s4.3" id="s4.3"></a><span class="item-no">4.3</span>  Change-log |
1824 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1824 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1825 | <br /> | 1825 | <br /> |
1826 |   (The release date for the downloadable package of files containing documentation, demo script, test-cases, etc., besides the <span class="term">htmLawed.php</span> file, may be updated without a change-log entry if the secondary files, but not htmLawed per se, are revised.)<br /> | 1826 |   (The release date for the downloadable package of files containing documentation, demo script, test-cases, etc., besides the <span class="term">htmLawed.php</span> file, may be updated without a change-log entry if the secondary files, but not htmLawed per se, are revised.)<br /> |
1827 | <br /> | 1827 | <br /> |
1828 |   <em>Version number - Release date. Notes</em><br /> | 1828 |   <em>Version number - Release date. Notes</em><br /> |
1829 | <br /> | 1829 | <br /> |
1830 |   1.2.5 - 24 September 2019. Fixes two bugs in <span class="term">font</span> tag transformation<br /> | 1830 |   1.2.5 - 24 September 2019. Fixes two bugs in <span class="term">font</span> tag transformation<br /> |
1831 | <br /> | 1831 | <br /> |
1832 |   1.2.4.2 - 16 May 2019. Corrects a PHP notice if a semi-colon is present in <span class="term">$config["schemes"]</span><br /> | 1832 |   1.2.4.2 - 16 May 2019. Corrects a PHP notice if a semi-colon is present in <span class="term">$config["schemes"]</span><br /> |
1833 | <br /> | 1833 | <br /> |
1834 |   1.2.4.1 - 12 September 2017. Corrects a function re-declaration bug introduced in version 1.2.4<br /> | 1834 |   1.2.4.1 - 12 September 2017. Corrects a function re-declaration bug introduced in version 1.2.4<br /> |
1835 | <br /> | 1835 | <br /> |
1836 |   1.2.4 - 31 August 2017. Removes use of PHP <span class="term">create_function</span> function and <span class="term">$php_errormsg</span> reserved variable (deprecated in PHP 7.2)<br /> | 1836 |   1.2.4 - 31 August 2017. Removes use of PHP <span class="term">create_function</span> function and <span class="term">$php_errormsg</span> reserved variable (deprecated in PHP 7.2)<br /> |
1837 | <br /> | 1837 | <br /> |
1838 |   1.2.3 - 5 July 2017. New option value of <span class="term">4</span> for <span class="term">$config["comments"]</span> to stop enforcing a space character before the <span class="term">--></span> comment-closing marker<br /> | 1838 |   1.2.3 - 5 July 2017. New option value of <span class="term">4</span> for <span class="term">$config["comments"]</span> to stop enforcing a space character before the <span class="term">--></span> comment-closing marker<br /> |
1839 | <br /> | 1839 | <br /> |
1840 |   1.2.2 - 25 May 2017. Fix for a bug in parsing <span class="term">$spec</span> that got introduced in version 1.2; also, <span class="term">$spec</span> is now parsed to accommodate specifications for an HTML element when they are specified in multiple rules<br /> | 1840 |   1.2.2 - 25 May 2017. Fix for a bug in parsing <span class="term">$spec</span> that got introduced in version 1.2; also, <span class="term">$spec</span> is now parsed to accommodate specifications for an HTML element when they are specified in multiple rules<br /> |
1841 | <br /> | 1841 | <br /> |
1842 |   1.2.1.1 - 17 May 2017. Fix for a potential security vulnerability in transformation of deprecated attributes<br /> | 1842 |   1.2.1.1 - 17 May 2017. Fix for a potential security vulnerability in transformation of deprecated attributes<br /> |
1843 | <br /> | 1843 | <br /> |
1844 |   1.2.1 - 15 May 2017. Fix for a potential security vulnerability in transformation of deprecated attributes<br /> | 1844 |   1.2.1 - 15 May 2017. Fix for a potential security vulnerability in transformation of deprecated attributes<br /> |
1845 | <br /> | 1845 | <br /> |
1846 |   1.2 - 11 February 2017. (First beta release on 26 May 2013). Added support for HTML version 5; ARIA, data-* and microdata attributes; <span class="term">app</span>, <span class="term">data</span>, <span class="term">javascript</span> and <span class="term">tel</span> URL schemes (thus, <span class="term">javascript:</span> is not filtered in default mode). Removed support for code using Kses functions (see <a href="#s2.6">section 2.6</a>). Changes in revisions to the beta releases are not noted here.<br /> | 1846 |   1.2 - 11 February 2017. (First beta release on 26 May 2013). Added support for HTML version 5; ARIA, data-* and microdata attributes; <span class="term">app</span>, <span class="term">data</span>, <span class="term">javascript</span> and <span class="term">tel</span> URL schemes (thus, <span class="term">javascript:</span> is not filtered in default mode). Removed support for code using Kses functions (see <a href="#s2.6">section 2.6</a>). Changes in revisions to the beta releases are not noted here.<br /> |
1847 | <br /> | 1847 | <br /> |
1848 |   1.1.22 - 5 March 2016. Improved testing of attribute value rules specified in <span class="term">$spec</span><br /> | 1848 |   1.1.22 - 5 March 2016. Improved testing of attribute value rules specified in <span class="term">$spec</span><br /> |
1849 | <br /> | 1849 | <br /> |
1850 |   1.1.21 - 27 February 2016. Improvement and security fix in transforming <span class="term">font</span> element<br /> | 1850 |   1.1.21 - 27 February 2016. Improvement and security fix in transforming <span class="term">font</span> element<br /> |
1851 | <br /> | 1851 | <br /> |
1852 |   1.1.20 - 9 June 2015. Fix for a potential security vulnerability arising from unescaped double-quote character in single-quoted attribute value of some deprecated elements when tag transformation is enabled; recognition for non-(HTML 4) standard <span class="term">allowfullscreen</span> attribute of <span class="term">iframe</span><br /> | 1852 |   1.1.20 - 9 June 2015. Fix for a potential security vulnerability arising from unescaped double-quote character in single-quoted attribute value of some deprecated elements when tag transformation is enabled; recognition for non-(HTML 4) standard <span class="term">allowfullscreen</span> attribute of <span class="term">iframe</span><br /> |
1853 | <br /> | 1853 | <br /> |
1854 |   1.1.19 - 19 January 2015. Fix for a bug in cleaning of soft-hyphens in URL values, etc<br /> | 1854 |   1.1.19 - 19 January 2015. Fix for a bug in cleaning of soft-hyphens in URL values, etc<br /> |
1855 | <br /> | 1855 | <br /> |
1856 |   1.1.18 - 2 August 2014. Fix for a potential security vulnerability arising from specially encoded text with serial opening tags<br /> | 1856 |   1.1.18 - 2 August 2014. Fix for a potential security vulnerability arising from specially encoded text with serial opening tags<br /> |
1857 | <br /> | 1857 | <br /> |
1858 |   1.1.17 - 11 March 2014. Removed use of PHP function preg_replace with <span class="term">e</span> modifier for compatibility with PHP 5.5.<br /> | 1858 |   1.1.17 - 11 March 2014. Removed use of PHP function preg_replace with <span class="term">e</span> modifier for compatibility with PHP 5.5.<br /> |
1859 | <br /> | 1859 | <br /> |
1860 |   1.1.16 - 29 August 2013. Fix for a potential security vulnerability arising from specialy encoded space characters in URL schemes/protocols<br /> | 1860 |   1.1.16 - 29 August 2013. Fix for a potential security vulnerability arising from specialy encoded space characters in URL schemes/protocols<br /> |
1861 | <br /> | 1861 | <br /> |
1862 |   1.1.15 - 11 August 2013. Improved tidying/prettifying functionality<br /> | 1862 |   1.1.15 - 11 August 2013. Improved tidying/prettifying functionality<br /> |
1863 | <br /> | 1863 | <br /> |
1864 |   1.1.14 - 8 August 2012. Fix for possible segmental loss of incremental indentation during <span class="term">tidying</span> when <span class="term">balance</span> is disabled; fix for non-effectuation under some circumstances of a corrective behavior to preserve plain text within elements like <span class="term">blockquote</span><br /> | 1864 |   1.1.14 - 8 August 2012. Fix for possible segmental loss of incremental indentation during <span class="term">tidying</span> when <span class="term">balance</span> is disabled; fix for non-effectuation under some circumstances of a corrective behavior to preserve plain text within elements like <span class="term">blockquote</span><br /> |
1865 | <br /> | 1865 | <br /> |
1866 |   1.1.13 - 22 July 2012. Added feature allowing use of custom, non-standard attributes or custom rules for standard attributes<br /> | 1866 |   1.1.13 - 22 July 2012. Added feature allowing use of custom, non-standard attributes or custom rules for standard attributes<br /> |
1867 | <br /> | 1867 | <br /> |
1868 |   1.1.12 - 5 July 2012. Fix for a bug in identifying an unquoted value of the <span class="term">face</span> attribute<br /> | 1868 |   1.1.12 - 5 July 2012. Fix for a bug in identifying an unquoted value of the <span class="term">face</span> attribute<br /> |
1869 | <br /> | 1869 | <br /> |
1870 |   1.1.11 - 5 June 2012. Fix for possible problem with handling of multi-byte characters in attribute values in an mbstring.func_overload enviroment. <span class="term">$config["hook_tag"]</span>, if specified, now receives names of elements in closing tags.<br /> | 1870 |   1.1.11 - 5 June 2012. Fix for possible problem with handling of multi-byte characters in attribute values in an mbstring.func_overload enviroment. <span class="term">$config["hook_tag"]</span>, if specified, now receives names of elements in closing tags.<br /> |
1871 | <br /> | 1871 | <br /> |
1872 |   1.1.10 - 22 October 2011. Fix for a bug in the <span class="term">tidy</span> functionality that caused the entire input to be replaced with a single space; new parameter, <span class="term">$config["direct_list_nest"]</span> to allow direct descendance of a list in a list. (5 April 2012. Dual licensing from LGPLv3 to LGPLv3 and GPLv2+.)<br /> | 1872 |   1.1.10 - 22 October 2011. Fix for a bug in the <span class="term">tidy</span> functionality that caused the entire input to be replaced with a single space; new parameter, <span class="term">$config["direct_list_nest"]</span> to allow direct descendance of a list in a list. (5 April 2012. Dual licensing from LGPLv3 to LGPLv3 and GPLv2+.)<br /> |
1873 | <br /> | 1873 | <br /> |
1874 |   1.1.9.5 - 6 July 2011. Minor correction of a rule for nesting of <span class="term">li</span> within <span class="term">dir</span><br /> | 1874 |   1.1.9.5 - 6 July 2011. Minor correction of a rule for nesting of <span class="term">li</span> within <span class="term">dir</span><br /> |
1875 | <br /> | 1875 | <br /> |
1876 |   1.1.9.4 - 3 July 2010. Parameter <span class="term">schemes</span> now accepts <span class="term">!</span> so any URL, even a local one, can be <em>denied</em>. An issue in which a second URL value in <span class="term">style</span> properties was not checked was fixed.<br /> | 1876 |   1.1.9.4 - 3 July 2010. Parameter <span class="term">schemes</span> now accepts <span class="term">!</span> so any URL, even a local one, can be <em>denied</em>. An issue in which a second URL value in <span class="term">style</span> properties was not checked was fixed.<br /> |
1877 | <br /> | 1877 | <br /> |
1878 |   1.1.9.3 - 17 May 2010. Checks for correct nesting of <span class="term">param</span><br /> | 1878 |   1.1.9.3 - 17 May 2010. Checks for correct nesting of <span class="term">param</span><br /> |
1879 | <br /> | 1879 | <br /> |
1880 |   1.1.9.2 - 26 April 2010. Minor fix regarding rendering of denied URL schemes<br /> | 1880 |   1.1.9.2 - 26 April 2010. Minor fix regarding rendering of denied URL schemes<br /> |
1881 | <br /> | 1881 | <br /> |
1882 |   1.1.9.1 - 26 February 2010. htmLawed now uses the LGPL version 3 license; support for <span class="term">flashvars</span> attribute for <span class="term">embed</span><br /> | 1882 |   1.1.9.1 - 26 February 2010. htmLawed now uses the LGPL version 3 license; support for <span class="term">flashvars</span> attribute for <span class="term">embed</span><br /> |
1883 | <br /> | 1883 | <br /> |
1884 |   1.1.9 - 22 December 2009. Soft-hyphens are now removed only from URL-accepting attribute values<br /> | 1884 |   1.1.9 - 22 December 2009. Soft-hyphens are now removed only from URL-accepting attribute values<br /> |
1885 | <br /> | 1885 | <br /> |
1886 |   1.1.8.1 - 16 July 2009. Minor code-change to fix a PHP error notice<br /> | 1886 |   1.1.8.1 - 16 July 2009. Minor code-change to fix a PHP error notice<br /> |
1887 | <br /> | 1887 | <br /> |
1888 |   1.1.8 - 23 April 2009. Parameter <span class="term">deny_attribute</span> now accepts the wild-card <span class="term">*</span>, making it simpler to specify its value when all but a few attributes are being denied; fixed a bug in interpreting <span class="term">$spec</span><br /> | 1888 |   1.1.8 - 23 April 2009. Parameter <span class="term">deny_attribute</span> now accepts the wild-card <span class="term">*</span>, making it simpler to specify its value when all but a few attributes are being denied; fixed a bug in interpreting <span class="term">$spec</span><br /> |
1889 | <br /> | 1889 | <br /> |
1890 |   1.1.7 - 11-12 March 2009. Attributes globally denied through <span class="term">deny_attribute</span> can be allowed element-specifically through <span class="term">$spec</span>; <span class="term">$config["style_pass"]</span> allowing letting through any <span class="term">style</span> value introduced; altered logic to catch certain types of dynamic crafted CSS expressions<br /> | 1890 |   1.1.7 - 11-12 March 2009. Attributes globally denied through <span class="term">deny_attribute</span> can be allowed element-specifically through <span class="term">$spec</span>; <span class="term">$config["style_pass"]</span> allowing letting through any <span class="term">style</span> value introduced; altered logic to catch certain types of dynamic crafted CSS expressions<br /> |
1891 | <br /> | 1891 | <br /> |
1892 |   1.1.3-6 - 28-31 January - 4 February 2009. Altered logic to catch certain types of dynamic crafted CSS expressions<br /> | 1892 |   1.1.3-6 - 28-31 January - 4 February 2009. Altered logic to catch certain types of dynamic crafted CSS expressions<br /> |
1893 | <br /> | 1893 | <br /> |
1894 |   1.1.2 - 22 January 2009. Fixed bug in parsing of <span class="term">font</span> attributes during tag transformation<br /> | 1894 |   1.1.2 - 22 January 2009. Fixed bug in parsing of <span class="term">font</span> attributes during tag transformation<br /> |
1895 | <br /> | 1895 | <br /> |
1896 |   1.1.1 - 27 September 2008. Better nesting correction when omitable closing tags are absent<br /> | 1896 |   1.1.1 - 27 September 2008. Better nesting correction when omitable closing tags are absent<br /> |
1897 | <br /> | 1897 | <br /> |
1898 |   1.1 - 29 June 2008. <span class="term">$config["hook_tag"]</span> and <span class="term">$config["tidy"]</span> introduced for custom tag/attribute check/modification/injection and output compaction/beautification; fixed a regex-in-$spec parsing bug<br /> | 1898 |   1.1 - 29 June 2008. <span class="term">$config["hook_tag"]</span> and <span class="term">$config["tidy"]</span> introduced for custom tag/attribute check/modification/injection and output compaction/beautification; fixed a regex-in-$spec parsing bug<br /> |
1899 | <br /> | 1899 | <br /> |
1900 |   1.0.9 - 11 June 2008. Fix for a bug in checks for invalid HTML code-point entities<br /> | 1900 |   1.0.9 - 11 June 2008. Fix for a bug in checks for invalid HTML code-point entities<br /> |
1901 | <br /> | 1901 | <br /> |
1902 |   1.0.8 - 15 May 2008. Permit <span class="term">bordercolor</span> attribute for <span class="term">table</span>, <span class="term">td</span> and <span class="term">tr</span><br /> | 1902 |   1.0.8 - 15 May 2008. Permit <span class="term">bordercolor</span> attribute for <span class="term">table</span>, <span class="term">td</span> and <span class="term">tr</span><br /> |
1903 | <br /> | 1903 | <br /> |
1904 |   1.0.7 - 1 May 2008. Support for <span class="term">wmode</span> attribute for <span class="term">embed</span>; <span class="term">$config["show_setting"]</span> introduced; improved <span class="term">$config["elements"]</span> evaluation<br /> | 1904 |   1.0.7 - 1 May 2008. Support for <span class="term">wmode</span> attribute for <span class="term">embed</span>; <span class="term">$config["show_setting"]</span> introduced; improved <span class="term">$config["elements"]</span> evaluation<br /> |
1905 | <br /> | 1905 | <br /> |
1906 |   1.0.6 - 20 April 2008. <span class="term">$config["and_mark"]</span> introduced<br /> | 1906 |   1.0.6 - 20 April 2008. <span class="term">$config["and_mark"]</span> introduced<br /> |
1907 | <br /> | 1907 | <br /> |
1908 |   1.0.5 - 12 March 2008. <span class="term">style</span> URL schemes essentially disallowed when $config <span class="term">safe</span> is on; improved regex for CSS expression search<br /> | 1908 |   1.0.5 - 12 March 2008. <span class="term">style</span> URL schemes essentially disallowed when $config <span class="term">safe</span> is on; improved regex for CSS expression search<br /> |
1909 | <br /> | 1909 | <br /> |
1910 |   1.0.4 - 10 March 2008. Improved corrections for <span class="term">blockquote</span>, <span class="term">form</span>, <span class="term">map</span> and <span class="term">noscript</span><br /> | 1910 |   1.0.4 - 10 March 2008. Improved corrections for <span class="term">blockquote</span>, <span class="term">form</span>, <span class="term">map</span> and <span class="term">noscript</span><br /> |
1911 | <br /> | 1911 | <br /> |
1912 |   1.0.3 - 3 March 2008. Character entities for soft-hyphens are now replaced with spaces (instead of being removed); fix for a bug allowing <span class="term">td</span> directly inside <span class="term">table</span>; <span class="term">$config["safe"]</span> introduced<br /> | 1912 |   1.0.3 - 3 March 2008. Character entities for soft-hyphens are now replaced with spaces (instead of being removed); fix for a bug allowing <span class="term">td</span> directly inside <span class="term">table</span>; <span class="term">$config["safe"]</span> introduced<br /> |
1913 | <br /> | 1913 | <br /> |
1914 |   1.0.2 - 13 February 2008. Improved implementation of <span class="term">$config["keep_bad"]</span><br /> | 1914 |   1.0.2 - 13 February 2008. Improved implementation of <span class="term">$config["keep_bad"]</span><br /> |
1915 | <br /> | 1915 | <br /> |
1916 |   1.0.1 - 7 November 2007. Improved regex for identifying URLs, protocols and dynamic expressions (<span class="term">hl_tag()</span> and <span class="term">hl_prot()</span>); no error display with <span class="term">hl_regex()</span><br /> | 1916 |   1.0.1 - 7 November 2007. Improved regex for identifying URLs, protocols and dynamic expressions (<span class="term">hl_tag()</span> and <span class="term">hl_prot()</span>); no error display with <span class="term">hl_regex()</span><br /> |
1917 | <br /> | 1917 | <br /> |
1918 |   1.0 - 2 November 2007. First release<br /> | 1918 |   1.0 - 2 November 2007. First release<br /> |
1919 | 1919 | ||
1920 | </div> | 1920 | </div> |
1921 | <div class="sub-section"><h3> | 1921 | <div class="sub-section"><h3> |
1922 | <a name="s4.4" id="s4.4"></a><span class="item-no">4.4</span>  Testing | 1922 | <a name="s4.4" id="s4.4"></a><span class="item-no">4.4</span>  Testing |
1923 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1923 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1924 | <br /> | 1924 | <br /> |
1925 |   To test htmLawed using a form interface, a <a href="htmLawedTest.php">demo</a> web-page is provided with the htmLawed distribution (<span class="term">htmLawed.php</span> and <span class="term">htmLawedTest.php</span> should be in the same directory on the web-server). A file with <a href="htmLawed_TESTCASE.txt">test-cases</a> is also provided.<br /> | 1925 |   To test htmLawed using a form interface, a <a href="htmLawedTest.php">demo</a> web-page is provided with the htmLawed distribution (<span class="term">htmLawed.php</span> and <span class="term">htmLawedTest.php</span> should be in the same directory on the web-server). A file with <a href="htmLawed_TESTCASE.txt">test-cases</a> is also provided.<br /> |
1926 | 1926 | ||
1927 | </div> | 1927 | </div> |
1928 | <div class="sub-section"><h3> | 1928 | <div class="sub-section"><h3> |
1929 | <a name="s4.5" id="s4.5"></a><span class="item-no">4.5</span>  Upgrade, & old versions | 1929 | <a name="s4.5" id="s4.5"></a><span class="item-no">4.5</span>  Upgrade, & old versions |
1930 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1930 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1931 | <br /> | 1931 | <br /> |
1932 |   Upgrading is as simple as replacing the previous version of <span class="term">htmLawed.php</span>, assuming the file was not modified for customized features. As htmLawed output is almost always used in static documents, upgrading should not affect old, finalized content.<br /> | 1932 |   Upgrading is as simple as replacing the previous version of <span class="term">htmLawed.php</span>, assuming the file was not modified for customized features. As htmLawed output is almost always used in static documents, upgrading should not affect old, finalized content.<br /> |
1933 | <br /> | 1933 | <br /> |
1934 |   <strong>Note:</strong> The following upgrades may affect the functionality of a specific htmLawed installation:<br /> | 1934 |   <strong>Note:</strong> The following upgrades may affect the functionality of a specific htmLawed installation:<br /> |
1935 | <br /> | 1935 | <br /> |
1936 |   (1) From version 1.1-1.1.10 to 1.1.11 or later, if a <span class="term">hook_tag</span> function is in use: In version 1.1.11 and later, elements in closing tags (and not just the opening tags) are also passed to the function. There are no attribute names/values to pass, so a <span class="term">hook_tag</span> function receives only the element name. The <span class="term">hook_tag</span> function therefore may have to be edited. See <a href="#s3.4.9">section 3.4.9</a>.<br /> | 1936 |   (1) From version 1.1-1.1.10 to 1.1.11 or later, if a <span class="term">hook_tag</span> function is in use: In version 1.1.11 and later, elements in closing tags (and not just the opening tags) are also passed to the function. There are no attribute names/values to pass, so a <span class="term">hook_tag</span> function receives only the element name. The <span class="term">hook_tag</span> function therefore may have to be edited. See <a href="#s3.4.9">section 3.4.9</a>.<br /> |
1937 | <br /> | 1937 | <br /> |
1938 |   (2) From version older than 1.2.beta to later, if htmLawed was used as Kses replacement with Kses code in use: In version 1.2.beta or later, htmLawed no longer provides direct support for code that uses Kses functions (see <a href="#s2.6">section 2.6</a>).<br /> | 1938 |   (2) From version older than 1.2.beta to later, if htmLawed was used as Kses replacement with Kses code in use: In version 1.2.beta or later, htmLawed no longer provides direct support for code that uses Kses functions (see <a href="#s2.6">section 2.6</a>).<br /> |
1939 | <br /> | 1939 | <br /> |
1940 |   (3) From version older than 1.2 to later, if htmLawed is used without <span class="term">$config["safe"]</span> set to 1: Unlike previous versions, htmLawed version 1.2 and later permit <span class="term">data</span> and <span class="term">javascript</span> URL schemes by default (see <a href="#s3.4.3">section 3.4.3</a>).<br /> | 1940 |   (3) From version older than 1.2 to later, if htmLawed is used without <span class="term">$config["safe"]</span> set to 1: Unlike previous versions, htmLawed version 1.2 and later permit <span class="term">data</span> and <span class="term">javascript</span> URL schemes by default (see <a href="#s3.4.3">section 3.4.3</a>).<br /> |
1941 | <br /> | 1941 | <br /> |
1942 |   Old versions of htmLawed may be available online. E.g., for version 1.0, check <a href="http://www.bioinformatics.org/phplabware/downloads/htmLawed1.zip">http://www.bioinformatics.org/phplabware/downloads/htmLawed1.zip</a>; for 1.1.1, <a href="http://www.bioinformatics.org/phplabware/downloads/htmLawed111.zip">http://www.bioinformatics.org/phplabware/downloads/htmLawed111.zip</a>; and for 1.1.22, <a href="http://www.bioinformatics.org/phplabware/downloads/htmLawed1122.zip">http://www.bioinformatics.org/phplabware/downloads/htmLawed1122.zip</a>.<br /> | 1942 |   Old versions of htmLawed may be available online. E.g., for version 1.0, check <a href="http://www.bioinformatics.org/phplabware/downloads/htmLawed1.zip">http://www.bioinformatics.org/phplabware/downloads/htmLawed1.zip</a>; for 1.1.1, <a href="http://www.bioinformatics.org/phplabware/downloads/htmLawed111.zip">http://www.bioinformatics.org/phplabware/downloads/htmLawed111.zip</a>; and for 1.1.22, <a href="http://www.bioinformatics.org/phplabware/downloads/htmLawed1122.zip">http://www.bioinformatics.org/phplabware/downloads/htmLawed1122.zip</a>.<br /> |
1943 | 1943 | ||
1944 | </div> | 1944 | </div> |
1945 | <div class="sub-section"><h3> | 1945 | <div class="sub-section"><h3> |
1946 | <a name="s4.6" id="s4.6"></a><span class="item-no">4.6</span>  Comparison with <span class="term">HTMLPurifier</span> | 1946 | <a name="s4.6" id="s4.6"></a><span class="item-no">4.6</span>  Comparison with <span class="term">HTMLPurifier</span> |
1947 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1947 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1948 | <br /> | 1948 | <br /> |
1949 |   The HTMLPurifier PHP library by Edward Yang is a very good HTML filtering script that uses object oriented PHP code. Compared to htmLawed, it (as of year 2015):<br /> | 1949 |   The HTMLPurifier PHP library by Edward Yang is a very good HTML filtering script that uses object oriented PHP code. Compared to htmLawed, it (as of year 2015):<br /> |
1950 | <br /> | 1950 | <br /> |
1951 |   *  does not support PHP versions older than 5.0 (HTMLPurifier dropped PHP 4 support after version 2)<br /> | 1951 |   *  does not support PHP versions older than 5.0 (HTMLPurifier dropped PHP 4 support after version 2)<br /> |
1952 | <br /> | 1952 | <br /> |
1953 |   *  is 15-20 times bigger (scores of files totalling more than 750 kb)<br /> | 1953 |   *  is 15-20 times bigger (scores of files totalling more than 750 kb)<br /> |
1954 | <br /> | 1954 | <br /> |
1955 |   *  consumes 10-15 times more RAM memory (just including the HTMLPurifier files without calling the filter requires a few MBs of memory)<br /> | 1955 |   *  consumes 10-15 times more RAM memory (just including the HTMLPurifier files without calling the filter requires a few MBs of memory)<br /> |
1956 | <br /> | 1956 | <br /> |
1957 |   *  is expectedly slower<br /> | 1957 |   *  is expectedly slower<br /> |
1958 | <br /> | 1958 | <br /> |
1959 |   *  lacks many of the extra features of htmLawed (like entity conversions and code compaction/beautification)<br /> | 1959 |   *  lacks many of the extra features of htmLawed (like entity conversions and code compaction/beautification)<br /> |
1960 | <br /> | 1960 | <br /> |
1961 |   *  has poor documentation<br /> | 1961 |   *  has poor documentation<br /> |
1962 | <br /> | 1962 | <br /> |
1963 |   However, HTMLPurifier has finer checks for character encodings and attribute values, and can log warnings and errors. Visit the HTMLPurifier <a href="http://htmlpurifier.org">website</a> for updated information.<br /> | 1963 |   However, HTMLPurifier has finer checks for character encodings and attribute values, and can log warnings and errors. Visit the HTMLPurifier <a href="http://htmlpurifier.org">website</a> for updated information.<br /> |
1964 | 1964 | ||
1965 | </div> | 1965 | </div> |
1966 | <div class="sub-section"><h3> | 1966 | <div class="sub-section"><h3> |
1967 | <a name="s4.7" id="s4.7"></a><span class="item-no">4.7</span>  Use through application plug-ins/modules | 1967 | <a name="s4.7" id="s4.7"></a><span class="item-no">4.7</span>  Use through application plug-ins/modules |
1968 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1968 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1969 | <br /> | 1969 | <br /> |
1970 |   Plug-ins/modules to implement htmLawed in applications such as Drupal may have been developed. Check the application websites and the htmLawed <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed">forum</a>.<br /> | 1970 |   Plug-ins/modules to implement htmLawed in applications such as Drupal may have been developed. Check the application websites and the htmLawed <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed">forum</a>.<br /> |
1971 | 1971 | ||
1972 | </div> | 1972 | </div> |
1973 | <div class="sub-section"><h3> | 1973 | <div class="sub-section"><h3> |
1974 | <a name="s4.8" id="s4.8"></a><span class="item-no">4.8</span>  Use in non-PHP applications | 1974 | <a name="s4.8" id="s4.8"></a><span class="item-no">4.8</span>  Use in non-PHP applications |
1975 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1975 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1976 | <br /> | 1976 | <br /> |
1977 |   Non-PHP applications written in Python, Ruby, etc., may be able to use htmLawed through system calls to the PHP engine. Such code may have been documented on the internet. Also check the forum on the htmLawed <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed">site</a>.<br /> | 1977 |   Non-PHP applications written in Python, Ruby, etc., may be able to use htmLawed through system calls to the PHP engine. Such code may have been documented on the internet. Also check the forum on the htmLawed <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed">site</a>.<br /> |
1978 | 1978 | ||
1979 | </div> | 1979 | </div> |
1980 | <div class="sub-section"><h3> | 1980 | <div class="sub-section"><h3> |
1981 | <a name="s4.9" id="s4.9"></a><span class="item-no">4.9</span>  Donate | 1981 | <a name="s4.9" id="s4.9"></a><span class="item-no">4.9</span>  Donate |
1982 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1982 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1983 | <br /> | 1983 | <br /> |
1984 |   A donation in any currency and amount to appreciate or support this software can be sent by <a href="http://paypal.com">PayPal</a> to this email address: drpatnaik at yahoo dot com.<br /> | 1984 |   A donation in any currency and amount to appreciate or support this software can be sent by <a href="http://paypal.com">PayPal</a> to this email address: drpatnaik at yahoo dot com.<br /> |
1985 | 1985 | ||
1986 | </div> | 1986 | </div> |
1987 | <div class="sub-section"><h3> | 1987 | <div class="sub-section"><h3> |
1988 | <a name="s4.10" id="s4.10"></a><span class="item-no">4.10</span>  Acknowledgements | 1988 | <a name="s4.10" id="s4.10"></a><span class="item-no">4.10</span>  Acknowledgements |
1989 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1989 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
1990 | <br /> | 1990 | <br /> |
1991 |   Nicholas Alipaz, Bryan Blakey, Pádraic Brady, Dac Chartrand, Alexandre Chouinard, Ulf Harnhammer, Gareth Heyes, Hakre, Klaus Leithoff, Lukasz Pilorz, Shelley Powers, Psych0tr1a, Lincoln Russell, Tomas Sykorka, Harro Verton, Edward Yang, and many anonymous users.<br /> | 1991 |   Nicholas Alipaz, Bryan Blakey, Pádraic Brady, Dac Chartrand, Alexandre Chouinard, Ulf Harnhammer, Gareth Heyes, Hakre, Klaus Leithoff, Lukasz Pilorz, Shelley Powers, Psych0tr1a, Lincoln Russell, Tomas Sykorka, Harro Verton, Edward Yang, and many anonymous users.<br /> |
1992 | <br /> | 1992 | <br /> |
1993 |   Thank you!<br /> | 1993 |   Thank you!<br /> |
1994 | 1994 | ||
1995 | </div> | 1995 | </div> |
1996 | </div> | 1996 | </div> |
1997 | <div class="section"><h2> | 1997 | <div class="section"><h2> |
1998 | <a name="s5" id="s5"></a><span class="item-no">5</span>  Appendices | 1998 | <a name="s5" id="s5"></a><span class="item-no">5</span>  Appendices |
1999 | </h2><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 1999 | </h2><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
2000 | <div class="sub-section"><h3> | 2000 | <div class="sub-section"><h3> |
2001 | <a name="s5.1" id="s5.1"></a><span class="item-no">5.1</span>  Characters discouraged in XHTML | 2001 | <a name="s5.1" id="s5.1"></a><span class="item-no">5.1</span>  Characters discouraged in XHTML |
2002 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 2002 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
2003 | <br /> | 2003 | <br /> |
2004 |   Characters represented by the following hexadecimal code-points are <em>not</em> invalid, even though some validators may issue messages stating otherwise.<br /> | 2004 |   Characters represented by the following hexadecimal code-points are <em>not</em> invalid, even though some validators may issue messages stating otherwise.<br /> |
2005 | <br /> | 2005 | <br /> |
2006 |   <span class="term">7f</span> to <span class="term">84</span>, <span class="term">86</span> to <span class="term">9f</span>, <span class="term">fdd0</span> to <span class="term">fddf</span>, <span class="term">1fffe</span>, <span class="term">1ffff</span>, <span class="term">2fffe</span>, <span class="term">2ffff</span>, <span class="term">3fffe</span>, <span class="term">3ffff</span>, <span class="term">4fffe</span>, <span class="term">4ffff</span>, <span class="term">5fffe</span>, <span class="term">5ffff</span>, <span class="term">6fffe</span>, <span class="term">6ffff</span>, <span class="term">7fffe</span>, <span class="term">7ffff</span>, <span class="term">8fffe</span>, <span class="term">8ffff</span>, <span class="term">9fffe</span>, <span class="term">9ffff</span>, <span class="term">afffe</span>, <span class="term">affff</span>, <span class="term">bfffe</span>, <span class="term">bffff</span>, <span class="term">cfffe</span>, <span class="term">cffff</span>, <span class="term">dfffe</span>, <span class="term">dffff</span>, <span class="term">efffe</span>, <span class="term">effff</span>, <span class="term">ffffe</span>, <span class="term">fffff</span>, <span class="term">10fffe</span> and <span class="term">10ffff</span><br /> | 2006 |   <span class="term">7f</span> to <span class="term">84</span>, <span class="term">86</span> to <span class="term">9f</span>, <span class="term">fdd0</span> to <span class="term">fddf</span>, <span class="term">1fffe</span>, <span class="term">1ffff</span>, <span class="term">2fffe</span>, <span class="term">2ffff</span>, <span class="term">3fffe</span>, <span class="term">3ffff</span>, <span class="term">4fffe</span>, <span class="term">4ffff</span>, <span class="term">5fffe</span>, <span class="term">5ffff</span>, <span class="term">6fffe</span>, <span class="term">6ffff</span>, <span class="term">7fffe</span>, <span class="term">7ffff</span>, <span class="term">8fffe</span>, <span class="term">8ffff</span>, <span class="term">9fffe</span>, <span class="term">9ffff</span>, <span class="term">afffe</span>, <span class="term">affff</span>, <span class="term">bfffe</span>, <span class="term">bffff</span>, <span class="term">cfffe</span>, <span class="term">cffff</span>, <span class="term">dfffe</span>, <span class="term">dffff</span>, <span class="term">efffe</span>, <span class="term">effff</span>, <span class="term">ffffe</span>, <span class="term">fffff</span>, <span class="term">10fffe</span> and <span class="term">10ffff</span><br /> |
2007 | 2007 | ||
2008 | </div> | 2008 | </div> |
2009 | <div class="sub-section"><h3> | 2009 | <div class="sub-section"><h3> |
2010 | <a name="s5.2" id="s5.2"></a><span class="item-no">5.2</span>  Valid attribute-element combinations | 2010 | <a name="s5.2" id="s5.2"></a><span class="item-no">5.2</span>  Valid attribute-element combinations |
2011 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 2011 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
2012 | <br /> | 2012 | <br /> |
2013 |   *  includes deprecated attributes (marked <span class="term">^</span>), attributes for microdata (marked <span class="term">*</span>), the non-standard <span class="term">bordercolor</span>, and new-in-HTML5 attributes (marked <span class="term">~</span>); can have multiple comma-separated values (marked <span class="term">%</span>); can have multiple space-separated values (marked <span class="term">$</span>)<br /> | 2013 |   *  includes deprecated attributes (marked <span class="term">^</span>), attributes for microdata (marked <span class="term">*</span>), the non-standard <span class="term">bordercolor</span>, and new-in-HTML5 attributes (marked <span class="term">~</span>); can have multiple comma-separated values (marked <span class="term">%</span>); can have multiple space-separated values (marked <span class="term">$</span>)<br /> |
2014 |   *  only non-frameset, HTML body elements<br /> | 2014 |   *  only non-frameset, HTML body elements<br /> |
2015 |   *  <span class="term">name</span> for <span class="term">a</span> and <span class="term">map</span>, and <span class="term">lang</span> are invalid in XHTML 1.1<br /> | 2015 |   *  <span class="term">name</span> for <span class="term">a</span> and <span class="term">map</span>, and <span class="term">lang</span> are invalid in XHTML 1.1<br /> |
2016 |   *  <span class="term">target</span> is valid for <span class="term">a</span> in XHTML 1.1 and higher<br /> | 2016 |   *  <span class="term">target</span> is valid for <span class="term">a</span> in XHTML 1.1 and higher<br /> |
2017 |   *  <span class="term">xml:space</span> is only for XHTML 1.1<br /> | 2017 |   *  <span class="term">xml:space</span> is only for XHTML 1.1<br /> |
2018 | <br /> | 2018 | <br /> |
2019 |   abbr - td, th<br /> | 2019 |   abbr - td, th<br /> |
2020 |   accept - form, input<br /> | 2020 |   accept - form, input<br /> |
2021 |   accept-charset - form<br /> | 2021 |   accept-charset - form<br /> |
2022 |   action - form<br /> | 2022 |   action - form<br /> |
2023 |   align - applet, caption^, col, colgroup, div^, embed, h1^, h2^, h3^, h4^, h5^, h6^, hr^, iframe, img^, input^, legend^, object^, p^, table^, tbody, td, tfoot, th, thead, tr<br /> | 2023 |   align - applet, caption^, col, colgroup, div^, embed, h1^, h2^, h3^, h4^, h5^, h6^, hr^, iframe, img^, input^, legend^, object^, p^, table^, tbody, td, tfoot, th, thead, tr<br /> |
2024 |   allowfullscreen - iframe<br /> | 2024 |   allowfullscreen - iframe<br /> |
2025 |   alt - applet, area, img, input<br /> | 2025 |   alt - applet, area, img, input<br /> |
2026 |   archive - applet, object<br /> | 2026 |   archive - applet, object<br /> |
2027 |   async~ - script<br /> | 2027 |   async~ - script<br /> |
2028 |   autocomplete~ - input<br /> | 2028 |   autocomplete~ - input<br /> |
2029 |   autofocus~ - button, input, keygen, select, textarea<br /> | 2029 |   autofocus~ - button, input, keygen, select, textarea<br /> |
2030 |   autoplay~ - audio, video<br /> | 2030 |   autoplay~ - audio, video<br /> |
2031 |   axis - td, th<br /> | 2031 |   axis - td, th<br /> |
2032 |   bgcolor - embed, table^, td^, th^, tr^<br /> | 2032 |   bgcolor - embed, table^, td^, th^, tr^<br /> |
2033 |   border - img, object^, table<br /> | 2033 |   border - img, object^, table<br /> |
2034 |   bordercolor - table, td, tr<br /> | 2034 |   bordercolor - table, td, tr<br /> |
2035 |   cellpadding - table<br /> | 2035 |   cellpadding - table<br /> |
2036 |   cellspacing - table<br /> | 2036 |   cellspacing - table<br /> |
2037 |   challenge~ - keygen<br /> | 2037 |   challenge~ - keygen<br /> |
2038 |   char - col, colgroup, tbody, td, tfoot, th, thead, tr<br /> | 2038 |   char - col, colgroup, tbody, td, tfoot, th, thead, tr<br /> |
2039 |   charoff - col, colgroup, tbody, td, tfoot, th, thead, tr<br /> | 2039 |   charoff - col, colgroup, tbody, td, tfoot, th, thead, tr<br /> |
2040 |   charset - a, script<br /> | 2040 |   charset - a, script<br /> |
2041 |   checked - command, input<br /> | 2041 |   checked - command, input<br /> |
2042 |   cite - blockquote, del, ins, q<br /> | 2042 |   cite - blockquote, del, ins, q<br /> |
2043 |   classid - object<br /> | 2043 |   classid - object<br /> |
2044 |   clear - br^<br /> | 2044 |   clear - br^<br /> |
2045 |   code - applet<br /> | 2045 |   code - applet<br /> |
2046 |   codebase - object, applet<br /> | 2046 |   codebase - object, applet<br /> |
2047 |   codetype - object<br /> | 2047 |   codetype - object<br /> |
2048 |   color - font<br /> | 2048 |   color - font<br /> |
2049 |   cols - textarea<br /> | 2049 |   cols - textarea<br /> |
2050 |   colspan - td, th<br /> | 2050 |   colspan - td, th<br /> |
2051 |   compact - dir, dl^, menu, ol^, ul^<br /> | 2051 |   compact - dir, dl^, menu, ol^, ul^<br /> |
2052 |   content - meta<br /> | 2052 |   content - meta<br /> |
2053 |   controls~ - audio, video<br /> | 2053 |   controls~ - audio, video<br /> |
2054 |   coords - area, a<br /> | 2054 |   coords - area, a<br /> |
2055 |   crossorigin~ - img<br /> | 2055 |   crossorigin~ - img<br /> |
2056 |   data - object<br /> | 2056 |   data - object<br /> |
2057 |   datetime - del, ins, time<br /> | 2057 |   datetime - del, ins, time<br /> |
2058 |   declare - object<br /> | 2058 |   declare - object<br /> |
2059 |   default~ - track<br /> | 2059 |   default~ - track<br /> |
2060 |   defer - script<br /> | 2060 |   defer - script<br /> |
2061 |   dir - bdo<br /> | 2061 |   dir - bdo<br /> |
2062 |   dirname~ - input, textarea<br /> | 2062 |   dirname~ - input, textarea<br /> |
2063 |   disabled - button, command, fieldset, input, keygen, optgroup, option, select, textarea<br /> | 2063 |   disabled - button, command, fieldset, input, keygen, optgroup, option, select, textarea<br /> |
2064 |   download~ - a<br /> | 2064 |   download~ - a<br /> |
2065 |   enctype - form<br /> | 2065 |   enctype - form<br /> |
2066 |   face - font<br /> | 2066 |   face - font<br /> |
2067 |   flashvars** - embed<br /> | 2067 |   flashvars** - embed<br /> |
2068 |   for - label, output<br /> | 2068 |   for - label, output<br /> |
2069 |   form~ - button, fieldset, input, keygen, label, object, output, select, textarea<br /> | 2069 |   form~ - button, fieldset, input, keygen, label, object, output, select, textarea<br /> |
2070 |   formaction~ - button, input<br /> | 2070 |   formaction~ - button, input<br /> |
2071 |   formenctype~ - button, input<br /> | 2071 |   formenctype~ - button, input<br /> |
2072 |   formmethod~ - button, input<br /> | 2072 |   formmethod~ - button, input<br /> |
2073 |   formnovalidate~ - button, input<br /> | 2073 |   formnovalidate~ - button, input<br /> |
2074 |   formtarget~ - button, input<br /> | 2074 |   formtarget~ - button, input<br /> |
2075 |   frame - table<br /> | 2075 |   frame - table<br /> |
2076 |   frameborder - iframe<br /> | 2076 |   frameborder - iframe<br /> |
2077 |   headers - td, th<br /> | 2077 |   headers - td, th<br /> |
2078 |   height - applet, canvas, embed, iframe, img, input, object, td^, th^, video<br /> | 2078 |   height - applet, canvas, embed, iframe, img, input, object, td^, th^, video<br /> |
2079 |   high~ - meter<br /> | 2079 |   high~ - meter<br /> |
2080 |   href - a, area, link<br /> | 2080 |   href - a, area, link<br /> |
2081 |   hreflang - a, area, link<br /> | 2081 |   hreflang - a, area, link<br /> |
2082 |   hspace - applet, embed, img^, object^<br /> | 2082 |   hspace - applet, embed, img^, object^<br /> |
2083 |   icon~ - command<br /> | 2083 |   icon~ - command<br /> |
2084 |   ismap - img, input<br /> | 2084 |   ismap - img, input<br /> |
2085 |   keytype~ - keygen<br /> | 2085 |   keytype~ - keygen<br /> |
2086 |   keyparams~ - keygen<br /> | 2086 |   keyparams~ - keygen<br /> |
2087 |   kind~ - track<br /> | 2087 |   kind~ - track<br /> |
2088 |   label - command, menu, option, optgroup, track<br /> | 2088 |   label - command, menu, option, optgroup, track<br /> |
2089 |   language - script^<br /> | 2089 |   language - script^<br /> |
2090 |   list~ - input<br /> | 2090 |   list~ - input<br /> |
2091 |   longdesc - img, iframe<br /> | 2091 |   longdesc - img, iframe<br /> |
2092 |   loop~ - audio, video<br /> | 2092 |   loop~ - audio, video<br /> |
2093 |   low~ - meter<br /> | 2093 |   low~ - meter<br /> |
2094 |   marginheight - iframe<br /> | 2094 |   marginheight - iframe<br /> |
2095 |   marginwidth - iframe<br /> | 2095 |   marginwidth - iframe<br /> |
2096 |   max~ - input, meter, progress<br /> | 2096 |   max~ - input, meter, progress<br /> |
2097 |   maxlength - input, textarea<br /> | 2097 |   maxlength - input, textarea<br /> |
2098 |   media~ - a, area, link, source, style<br /> | 2098 |   media~ - a, area, link, source, style<br /> |
2099 |   mediagroup~ - audio, video<br /> | 2099 |   mediagroup~ - audio, video<br /> |
2100 |   method - form<br /> | 2100 |   method - form<br /> |
2101 |   min~ - input, meter<br /> | 2101 |   min~ - input, meter<br /> |
2102 |   model** - embed<br /> | 2102 |   model** - embed<br /> |
2103 |   multiple - input, select<br /> | 2103 |   multiple - input, select<br /> |
2104 |   muted~ - audio, video<br /> | 2104 |   muted~ - audio, video<br /> |
2105 |   name - a^, applet^, button, embed, fieldset, form^, iframe^, img^, input, keygen, map^, object, output, param, select, textarea<br /> | 2105 |   name - a^, applet^, button, embed, fieldset, form^, iframe^, img^, input, keygen, map^, object, output, param, select, textarea<br /> |
2106 |   nohref - area<br /> | 2106 |   nohref - area<br /> |
2107 |   noshade - hr^<br /> | 2107 |   noshade - hr^<br /> |
2108 |   novalidate~ - form<br /> | 2108 |   novalidate~ - form<br /> |
2109 |   nowrap - td^, th^<br /> | 2109 |   nowrap - td^, th^<br /> |
2110 |   object - applet<br /> | 2110 |   object - applet<br /> |
2111 |   open~ - details<br /> | 2111 |   open~ - details<br /> |
2112 |   optimum~ - meter<br /> | 2112 |   optimum~ - meter<br /> |
2113 |   pattern~ - input<br /> | 2113 |   pattern~ - input<br /> |
2114 |   ping~ - a, area<br /> | 2114 |   ping~ - a, area<br /> |
2115 |   placeholder~ - input, textarea<br /> | 2115 |   placeholder~ - input, textarea<br /> |
2116 |   pluginspage** - embed<br /> | 2116 |   pluginspage** - embed<br /> |
2117 |   pluginurl** - embed<br /> | 2117 |   pluginurl** - embed<br /> |
2118 |   poster~ - video<br /> | 2118 |   poster~ - video<br /> |
2119 |   pqg~ - keygen<br /> | 2119 |   pqg~ - keygen<br /> |
2120 |   preload~ - audio, video<br /> | 2120 |   preload~ - audio, video<br /> |
2121 |   prompt - isindex<br /> | 2121 |   prompt - isindex<br /> |
2122 |   pubdate~ - time<br /> | 2122 |   pubdate~ - time<br /> |
2123 |   radiogroup* - command<br /> | 2123 |   radiogroup* - command<br /> |
2124 |   readonly - input, textarea<br /> | 2124 |   readonly - input, textarea<br /> |
2125 |   required~ - input, select, textarea<br /> | 2125 |   required~ - input, select, textarea<br /> |
2126 |   rel$ - a, area, link<br /> | 2126 |   rel$ - a, area, link<br /> |
2127 |   rev - a<br /> | 2127 |   rev - a<br /> |
2128 |   reversed~ - old<br /> | 2128 |   reversed~ - old<br /> |
2129 |   rows - textarea<br /> | 2129 |   rows - textarea<br /> |
2130 |   rowspan - td, th<br /> | 2130 |   rowspan - td, th<br /> |
2131 |   rules - table<br /> | 2131 |   rules - table<br /> |
2132 |   sandbox~ - iframe<br /> | 2132 |   sandbox~ - iframe<br /> |
2133 |   scope - td, th<br /> | 2133 |   scope - td, th<br /> |
2134 |   scoped~ - style<br /> | 2134 |   scoped~ - style<br /> |
2135 |   scrolling - iframe<br /> | 2135 |   scrolling - iframe<br /> |
2136 |   seamless~ - iframe<br /> | 2136 |   seamless~ - iframe<br /> |
2137 |   selected - option<br /> | 2137 |   selected - option<br /> |
2138 |   shape - area, a<br /> | 2138 |   shape - area, a<br /> |
2139 |   size - font, hr^, input, select<br /> | 2139 |   size - font, hr^, input, select<br /> |
2140 |   sizes~ - link<br /> | 2140 |   sizes~ - link<br /> |
2141 |   span - col, colgroup<br /> | 2141 |   span - col, colgroup<br /> |
2142 |   src - audio, embed, iframe, img, input, script, source, track, video<br /> | 2142 |   src - audio, embed, iframe, img, input, script, source, track, video<br /> |
2143 |   srcdoc~ - iframe<br /> | 2143 |   srcdoc~ - iframe<br /> |
2144 |   srclang~ - track<br /> | 2144 |   srclang~ - track<br /> |
2145 |   srcset~% - img<br /> | 2145 |   srcset~% - img<br /> |
2146 |   standby - object<br /> | 2146 |   standby - object<br /> |
2147 |   start - ol<br /> | 2147 |   start - ol<br /> |
2148 |   step~ - input<br /> | 2148 |   step~ - input<br /> |
2149 |   summary - table<br /> | 2149 |   summary - table<br /> |
2150 |   target - a, area, form<br /> | 2150 |   target - a, area, form<br /> |
2151 |   type - a, area, button, command, embed, input, li, link, menu, object, ol, param, script, source, style, ul<br /> | 2151 |   type - a, area, button, command, embed, input, li, link, menu, object, ol, param, script, source, style, ul<br /> |
2152 |   typemustmatch~ - object<br /> | 2152 |   typemustmatch~ - object<br /> |
2153 |   usemap - img, input, object<br /> | 2153 |   usemap - img, input, object<br /> |
2154 |   valign - col, colgroup, tbody, td, tfoot, th, thead, tr<br /> | 2154 |   valign - col, colgroup, tbody, td, tfoot, th, thead, tr<br /> |
2155 |   value - button, data, input, li, meter, option, param, progress<br /> | 2155 |   value - button, data, input, li, meter, option, param, progress<br /> |
2156 |   valuetype - param<br /> | 2156 |   valuetype - param<br /> |
2157 |   vspace - applet, embed, img^, object^<br /> | 2157 |   vspace - applet, embed, img^, object^<br /> |
2158 |   width - applet, canvas, col, colgroup, embed, hr^, iframe, img, input, object, pre^, table, td^, th^, video<br /> | 2158 |   width - applet, canvas, col, colgroup, embed, hr^, iframe, img, input, object, pre^, table, td^, th^, video<br /> |
2159 |   wmode - embed<br /> | 2159 |   wmode - embed<br /> |
2160 |   wrap~ - textarea<br /> | 2160 |   wrap~ - textarea<br /> |
2161 | <br /> | 2161 | <br /> |
2162 |   The following attributes, including event-specific ones and attributes of ARIA and microdata specifications, are considered global and allowed in all elements:<br /> | 2162 |   The following attributes, including event-specific ones and attributes of ARIA and microdata specifications, are considered global and allowed in all elements:<br /> |
2163 | <br /> | 2163 | <br /> |
2164 |   accesskey, aria-activedescendant, aria-atomic, aria-autocomplete, aria-busy, aria-checked, aria-controls, aria-describedby, aria-disabled, aria-dropeffect, aria-expanded, aria-flowto, aria-grabbed, aria-haspopup, aria-hidden, aria-invalid, aria-label, aria-labelledby, aria-level, aria-live, aria-multiline, aria-multiselectable, aria-orientation, aria-owns, aria-posinset, aria-pressed, aria-readonly, aria-relevant, aria-required, aria-selected, aria-setsize, aria-sort, aria-valuemax, aria-valuemin, aria-valuenow, aria-valuetext, class$, contenteditable, contextmenu, dir, draggable, dropzone, hidden, id, inert, itemid, itemprop, itemref, itemscope, itemtype, lang, onabort, onblur, oncanplay, oncanplaythrough, onchange, onclick, oncontextmenu, oncopy, oncuechange, oncut, ondblclick, ondrag, ondragend, ondragenter, ondragleave, ondragover, ondragstart, ondrop, ondurationchange, onemptied, onended, onerror, onfocus, onformchange, onforminput, oninput, oninvalid, onkeydown, onkeypress, onkeyup, onload, onloadeddata, onloadedmetadata, onloadstart, onlostpointercapture, onmousedown, onmousemove, onmouseout, onmouseover, onmouseup, onmousewheel, onpaste, onpause, onplay, onplaying, onpointercancel, ongotpointercapture, onpointerdown, onpointerenter, onpointerleave, onpointermove, onpointerout, onpointerover, onpointerup, onprogress, onratechange, onreadystatechange, onreset, onsearch, onscroll, onseeked, onseeking, onselect, onshow, onstalled, onsubmit, onsuspend, ontimeupdate, ontoggle, ontouchcancel, ontouchend, ontouchmove, ontouchstart, onvolumechange, onwaiting, onwheel, role, spellcheck, style, tabindex, title, translate, xmlns, xml:base, xml:lang, xml:space<br /> | 2164 |   accesskey, aria-activedescendant, aria-atomic, aria-autocomplete, aria-busy, aria-checked, aria-controls, aria-describedby, aria-disabled, aria-dropeffect, aria-expanded, aria-flowto, aria-grabbed, aria-haspopup, aria-hidden, aria-invalid, aria-label, aria-labelledby, aria-level, aria-live, aria-multiline, aria-multiselectable, aria-orientation, aria-owns, aria-posinset, aria-pressed, aria-readonly, aria-relevant, aria-required, aria-selected, aria-setsize, aria-sort, aria-valuemax, aria-valuemin, aria-valuenow, aria-valuetext, class$, contenteditable, contextmenu, dir, draggable, dropzone, hidden, id, inert, itemid, itemprop, itemref, itemscope, itemtype, lang, onabort, onblur, oncanplay, oncanplaythrough, onchange, onclick, oncontextmenu, oncopy, oncuechange, oncut, ondblclick, ondrag, ondragend, ondragenter, ondragleave, ondragover, ondragstart, ondrop, ondurationchange, onemptied, onended, onerror, onfocus, onformchange, onforminput, oninput, oninvalid, onkeydown, onkeypress, onkeyup, onload, onloadeddata, onloadedmetadata, onloadstart, onlostpointercapture, onmousedown, onmousemove, onmouseout, onmouseover, onmouseup, onmousewheel, onpaste, onpause, onplay, onplaying, onpointercancel, ongotpointercapture, onpointerdown, onpointerenter, onpointerleave, onpointermove, onpointerout, onpointerover, onpointerup, onprogress, onratechange, onreadystatechange, onreset, onsearch, onscroll, onseeked, onseeking, onselect, onshow, onstalled, onsubmit, onsuspend, ontimeupdate, ontoggle, ontouchcancel, ontouchend, ontouchmove, ontouchstart, onvolumechange, onwaiting, onwheel, role, spellcheck, style, tabindex, title, translate, xmlns, xml:base, xml:lang, xml:space<br /> |
2165 | <br /> | 2165 | <br /> |
2166 |   Custom <em>data-*</em> attributes, where the first three characters of the value of <em>star</em> (*) after lower-casing do not equal <span class="term">xml</span> and the value of <em>star</em> does not have a colon (:), equal-to (=), newline, solidus (/), space, tab, or any A-Z character, are also considered global and allowed in all elements.<br /> | 2166 |   Custom <em>data-*</em> attributes, where the first three characters of the value of <em>star</em> (*) after lower-casing do not equal <span class="term">xml</span> and the value of <em>star</em> does not have a colon (:), equal-to (=), newline, solidus (/), space, tab, or any A-Z character, are also considered global and allowed in all elements.<br /> |
2167 | 2167 | ||
2168 | </div> | 2168 | </div> |
2169 | <div class="sub-section"><h3> | 2169 | <div class="sub-section"><h3> |
2170 | <a name="s5.3" id="s5.3"></a><span class="item-no">5.3</span>  CSS 2.1 properties accepting URLs | 2170 | <a name="s5.3" id="s5.3"></a><span class="item-no">5.3</span>  CSS 2.1 properties accepting URLs |
2171 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 2171 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
2172 | <br /> | 2172 | <br /> |
2173 |   background<br /> | 2173 |   background<br /> |
2174 |   background-image<br /> | 2174 |   background-image<br /> |
2175 |   content<br /> | 2175 |   content<br /> |
2176 |   cue-after<br /> | 2176 |   cue-after<br /> |
2177 |   cue-before<br /> | 2177 |   cue-before<br /> |
2178 |   cursor<br /> | 2178 |   cursor<br /> |
2179 |   list-style<br /> | 2179 |   list-style<br /> |
2180 |   list-style-image<br /> | 2180 |   list-style-image<br /> |
2181 |   play-during<br /> | 2181 |   play-during<br /> |
2182 | 2182 | ||
2183 | </div> | 2183 | </div> |
2184 | <div class="sub-section"><h3> | 2184 | <div class="sub-section"><h3> |
2185 | <a name="s5.4" id="s5.4"></a><span class="item-no">5.4</span>  Microsoft Windows 1252 character replacements | 2185 | <a name="s5.4" id="s5.4"></a><span class="item-no">5.4</span>  Microsoft Windows 1252 character replacements |
2186 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 2186 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
2187 | <br /> | 2187 | <br /> |
2188 |   Key: <span class="term">d</span> double, <span class="term">l</span> left, <span class="term">q</span> quote, <span class="term">r</span> right, <span class="term">s.</span> single<br /> | 2188 |   Key: <span class="term">d</span> double, <span class="term">l</span> left, <span class="term">q</span> quote, <span class="term">r</span> right, <span class="term">s.</span> single<br /> |
2189 | <br /> | 2189 | <br /> |
2190 |   Code-point (decimal) - hexadecimal value - replacement entity - represented character<br /> | 2190 |   Code-point (decimal) - hexadecimal value - replacement entity - represented character<br /> |
2191 | <br /> | 2191 | <br /> |
2192 |   127 - 7f - (removed) - (not used)<br /> | 2192 |   127 - 7f - (removed) - (not used)<br /> |
2193 |   128 - 80 - &#8364; - euro<br /> | 2193 |   128 - 80 - &#8364; - euro<br /> |
2194 |   129 - 81 - (removed) - (not used)<br /> | 2194 |   129 - 81 - (removed) - (not used)<br /> |
2195 |   130 - 82 - &#8218; - baseline s. q<br /> | 2195 |   130 - 82 - &#8218; - baseline s. q<br /> |
2196 |   131 - 83 - &#402; - florin<br /> | 2196 |   131 - 83 - &#402; - florin<br /> |
2197 |   132 - 84 - &#8222; - baseline d q<br /> | 2197 |   132 - 84 - &#8222; - baseline d q<br /> |
2198 |   133 - 85 - &#8230; - ellipsis<br /> | 2198 |   133 - 85 - &#8230; - ellipsis<br /> |
2199 |   134 - 86 - &#8224; - dagger<br /> | 2199 |   134 - 86 - &#8224; - dagger<br /> |
2200 |   135 - 87 - &#8225; - d dagger<br /> | 2200 |   135 - 87 - &#8225; - d dagger<br /> |
2201 |   136 - 88 - &#710; - circumflex accent<br /> | 2201 |   136 - 88 - &#710; - circumflex accent<br /> |
2202 |   137 - 89 - &#8240; - permile<br /> | 2202 |   137 - 89 - &#8240; - permile<br /> |
2203 |   138 - 8a - &#352; - S Hacek<br /> | 2203 |   138 - 8a - &#352; - S Hacek<br /> |
2204 |   139 - 8b - &#8249; - l s. guillemet<br /> | 2204 |   139 - 8b - &#8249; - l s. guillemet<br /> |
2205 |   140 - 8c - &#338; - OE ligature<br /> | 2205 |   140 - 8c - &#338; - OE ligature<br /> |
2206 |   141 - 8d - (removed) - (not used)<br /> | 2206 |   141 - 8d - (removed) - (not used)<br /> |
2207 |   142 - 8e - &#381; - Z dieresis<br /> | 2207 |   142 - 8e - &#381; - Z dieresis<br /> |
2208 |   143 - 8f - (removed) - (not used)<br /> | 2208 |   143 - 8f - (removed) - (not used)<br /> |
2209 |   144 - 90 - (removed) - (not used)<br /> | 2209 |   144 - 90 - (removed) - (not used)<br /> |
2210 |   145 - 91 - &#8216; - l s. q<br /> | 2210 |   145 - 91 - &#8216; - l s. q<br /> |
2211 |   146 - 92 - &#8217; - r s. q<br /> | 2211 |   146 - 92 - &#8217; - r s. q<br /> |
2212 |   147 - 93 - &#8220; - l d q<br /> | 2212 |   147 - 93 - &#8220; - l d q<br /> |
2213 |   148 - 94 - &#8221; - r d q<br /> | 2213 |   148 - 94 - &#8221; - r d q<br /> |
2214 |   149 - 95 - &#8226; - bullet<br /> | 2214 |   149 - 95 - &#8226; - bullet<br /> |
2215 |   150 - 96 - &#8211; - en dash<br /> | 2215 |   150 - 96 - &#8211; - en dash<br /> |
2216 |   151 - 97 - &#8212; - em dash<br /> | 2216 |   151 - 97 - &#8212; - em dash<br /> |
2217 |   152 - 98 - &#732; - tilde accent<br /> | 2217 |   152 - 98 - &#732; - tilde accent<br /> |
2218 |   153 - 99 - &#8482; - trademark<br /> | 2218 |   153 - 99 - &#8482; - trademark<br /> |
2219 |   154 - 9a - &#353; - s Hacek<br /> | 2219 |   154 - 9a - &#353; - s Hacek<br /> |
2220 |   155 - 9b - &#8250; - r s. guillemet<br /> | 2220 |   155 - 9b - &#8250; - r s. guillemet<br /> |
2221 |   156 - 9c - &#339; - oe ligature<br /> | 2221 |   156 - 9c - &#339; - oe ligature<br /> |
2222 |   157 - 9d - (removed) - (not used)<br /> | 2222 |   157 - 9d - (removed) - (not used)<br /> |
2223 |   158 - 9e - &#382; - z dieresis<br /> | 2223 |   158 - 9e - &#382; - z dieresis<br /> |
2224 |   159 - 9f - &#376; - Y dieresis<br /> | 2224 |   159 - 9f - &#376; - Y dieresis<br /> |
2225 | 2225 | ||
2226 | </div> | 2226 | </div> |
2227 | <div class="sub-section"><h3> | 2227 | <div class="sub-section"><h3> |
2228 | <a name="s5.5" id="s5.5"></a><span class="item-no">5.5</span>  URL format | 2228 | <a name="s5.5" id="s5.5"></a><span class="item-no">5.5</span>  URL format |
2229 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 2229 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
2230 | <br /> | 2230 | <br /> |
2231 |   An <em>absolute</em> URL has a <span class="term">protocol</span> or <span class="term">scheme</span>, a <span class="term">network location</span> or <span class="term">hostname</span>, and, optional <span class="term">path</span>, <span class="term">parameters</span>, <span class="term">query</span> and <span class="term">fragment</span> segments. Thus, an absolute URL has this generic structure:<br /> | 2231 |   An <em>absolute</em> URL has a <span class="term">protocol</span> or <span class="term">scheme</span>, a <span class="term">network location</span> or <span class="term">hostname</span>, and, optional <span class="term">path</span>, <span class="term">parameters</span>, <span class="term">query</span> and <span class="term">fragment</span> segments. Thus, an absolute URL has this generic structure:<br /> |
2232 | <br /> | 2232 | <br /> |
2233 | 2233 | ||
2234 | <code class="code">    (scheme) : (//network location) /(path) ;(parameters) ?(query) #(fragment)</code> | 2234 | <code class="code">    (scheme) : (//network location) /(path) ;(parameters) ?(query) #(fragment)</code> |
2235 | <br /> | 2235 | <br /> |
2236 | <br /> | 2236 | <br /> |
2237 |   The schemes can only contain letters, digits, <span class="term">+</span>, <span class="term">.</span> and <span class="term">-</span>. Hostname is the portion after the <span class="term">//</span> and up to the first <span class="term">/</span> (if any; else, up to the end) when <span class="term">:</span> is followed by a <span class="term">//</span> (e.g., <span class="term">abc.com</span> in <span class="term">ftp://abc.com/def</span>); otherwise, it consists of everything after the <span class="term">:</span> (e.g., <span class="term">def@abc.com</span> in mailto:def@abc.com').<br /> | 2237 |   The schemes can only contain letters, digits, <span class="term">+</span>, <span class="term">.</span> and <span class="term">-</span>. Hostname is the portion after the <span class="term">//</span> and up to the first <span class="term">/</span> (if any; else, up to the end) when <span class="term">:</span> is followed by a <span class="term">//</span> (e.g., <span class="term">abc.com</span> in <span class="term">ftp://abc.com/def</span>); otherwise, it consists of everything after the <span class="term">:</span> (e.g., <span class="term">def@abc.com</span> in mailto:def@abc.com').<br /> |
2238 | <br /> | 2238 | <br /> |
2239 |   <em>Relative</em> URLs do not have explicit schemes and network locations; such values are inherited from a <em>base</em> URL.<br /> | 2239 |   <em>Relative</em> URLs do not have explicit schemes and network locations; such values are inherited from a <em>base</em> URL.<br /> |
2240 | 2240 | ||
2241 | </div> | 2241 | </div> |
2242 | <div class="sub-section"><h3> | 2242 | <div class="sub-section"><h3> |
2243 | <a name="s5.6" id="s5.6"></a><span class="item-no">5.6</span>  Brief on htmLawed code | 2243 | <a name="s5.6" id="s5.6"></a><span class="item-no">5.6</span>  Brief on htmLawed code |
2244 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> | 2244 | </h3><span class="totop"><a href="#peak">(to top)</a></span><br style="clear: both;" /> |
2245 | <br /> | 2245 | <br /> |
2246 |   Much of the code's logic and reasoning can be understood from the documentation above.<br /> | 2246 |   Much of the code's logic and reasoning can be understood from the documentation above.<br /> |
2247 | <br /> | 2247 | <br /> |
2248 |   The <strong>output</strong> of htmLawed is a text string containing the processed input. There is no custom error tracking.<br /> | 2248 |   The <strong>output</strong> of htmLawed is a text string containing the processed input. There is no custom error tracking.<br /> |
2249 | <br /> | 2249 | <br /> |
2250 |   <strong>Function arguments</strong> for htmLawed are:<br /> | 2250 |   <strong>Function arguments</strong> for htmLawed are:<br /> |
2251 | <br /> | 2251 | <br /> |
2252 |   *  <span class="term">$in</span> - first argument; a text string; the <strong>input text</strong> to be processed. Any extraneous slashes added by PHP when <em>magic quotes</em> are enabled should be removed beforehand using PHP's <span class="term">stripslashes()</span> function.<br /> | 2252 |   *  <span class="term">$in</span> - first argument; a text string; the <strong>input text</strong> to be processed. Any extraneous slashes added by PHP when <em>magic quotes</em> are enabled should be removed beforehand using PHP's <span class="term">stripslashes()</span> function.<br /> |
2253 | <br /> | 2253 | <br /> |
2254 |   *  <span class="term">$config</span> - second argument; an associative array; optional; named <span class="term">$C</span> within htmLawed code. The array has keys with names like <span class="term">balance</span> and <span class="term">keep_bad</span>, and the values, which can be boolean, string, or array, depending on the key, are read to accordingly set the <strong>configurable parameters</strong> (indicated by the keys). All configurable parameters receive some default value if the value to be used is not specified by the user through <span class="term">$config</span>. <em>Finalized</em> <span class="term">$config</span> is thus a filtered and possibly larger array.<br /> | 2254 |   *  <span class="term">$config</span> - second argument; an associative array; optional; named <span class="term">$C</span> within htmLawed code. The array has keys with names like <span class="term">balance</span> and <span class="term">keep_bad</span>, and the values, which can be boolean, string, or array, depending on the key, are read to accordingly set the <strong>configurable parameters</strong> (indicated by the keys). All configurable parameters receive some default value if the value to be used is not specified by the user through <span class="term">$config</span>. <em>Finalized</em> <span class="term">$config</span> is thus a filtered and possibly larger array.<br /> |
2255 | <br /> | 2255 | <br /> |
2256 |   *  <span class="term">$spec</span> - third argument; a text string; optional. The string has rules, written in an htmLawed-designated format, <strong>specifying</strong> element-specific attribute and attribute value restrictions. Function <span class="term">hl_spec()</span> is used to convert the string to an associative-array, named <span class="term">$S</span> within htmLawed code, for internal use. <em>Finalized</em> <span class="term">$spec</span> is thus an array.<br /> | 2256 |   *  <span class="term">$spec</span> - third argument; a text string; optional. The string has rules, written in an htmLawed-designated format, <strong>specifying</strong> element-specific attribute and attribute value restrictions. Function <span class="term">hl_spec()</span> is used to convert the string to an associative-array, named <span class="term">$S</span> within htmLawed code, for internal use. <em>Finalized</em> <span class="term">$spec</span> is thus an array.<br /> |
2257 | <br /> | 2257 | <br /> |
2258 |   <em>Finalized</em> <span class="term">$config</span> and <span class="term">$spec</span> are made <strong>global variables</strong> while htmLawed is at work. Values of any pre-existing global variables with same names are noted, and their values are restored after htmLawed finishes processing the input (to capture the <em>finalized</em> values, the <span class="term">show_settings</span> parameter of <span class="term">$config</span> should be used). Depending on <span class="term">$config</span>, another global variable <span class="term">hl_Ids</span>, to track <span class="term">id</span> attribute values for uniqueness, may be set. Unlike the other two variables, this one is not reset (or unset) post-processing.<br /> | 2258 |   <em>Finalized</em> <span class="term">$config</span> and <span class="term">$spec</span> are made <strong>global variables</strong> while htmLawed is at work. Values of any pre-existing global variables with same names are noted, and their values are restored after htmLawed finishes processing the input (to capture the <em>finalized</em> values, the <span class="term">show_settings</span> parameter of <span class="term">$config</span> should be used). Depending on <span class="term">$config</span>, another global variable <span class="term">hl_Ids</span>, to track <span class="term">id</span> attribute values for uniqueness, may be set. Unlike the other two variables, this one is not reset (or unset) post-processing.<br /> |
2259 | <br /> | 2259 | <br /> |
2260 |   Except for the main <span class="term">htmLawed()</span> function, htmLawed's functions are <strong>name-spaced</strong> using the <span class="term">hl_</span> prefix. The <strong>functions</strong> and their roles are:<br /> | 2260 |   Except for the main <span class="term">htmLawed()</span> function, htmLawed's functions are <strong>name-spaced</strong> using the <span class="term">hl_</span> prefix. The <strong>functions</strong> and their roles are:<br /> |
2261 | <br /> | 2261 | <br /> |
2262 |   *  <span class="term">hl_attrval</span> - check attribute values against <span class="term">$spec</span><br /> | 2262 |   *  <span class="term">hl_attrval</span> - check attribute values against <span class="term">$spec</span><br /> |
2263 |   *  <span class="term">hl_bal</span> - balance tags and ensure proper nesting<br /> | 2263 |   *  <span class="term">hl_bal</span> - balance tags and ensure proper nesting<br /> |
2264 |   *  <span class="term">hl_cmtcd</span> - handle CDATA sections and HTML comments<br /> | 2264 |   *  <span class="term">hl_cmtcd</span> - handle CDATA sections and HTML comments<br /> |
2265 |   *  <span class="term">hl_ent</span> - handle character entities<br /> | 2265 |   *  <span class="term">hl_ent</span> - handle character entities<br /> |
2266 |   *  <span class="term">hl_prot</span> - check a URL scheme/protocol<br /> | 2266 |   *  <span class="term">hl_prot</span> - check a URL scheme/protocol<br /> |
2267 |   *  <span class="term">hl_regex</span> - check syntax of a regular expression<br /> | 2267 |   *  <span class="term">hl_regex</span> - check syntax of a regular expression<br /> |
2268 |   *  <span class="term">hl_spec</span> - convert user-supplied <span class="term">$spec</span> value to one used internally<br /> | 2268 |   *  <span class="term">hl_spec</span> - convert user-supplied <span class="term">$spec</span> value to one used internally<br /> |
2269 |   *  <span class="term">hl_tag</span> - handle element tags and attributes<br /> | 2269 |   *  <span class="term">hl_tag</span> - handle element tags and attributes<br /> |
2270 |   *  <span class="term">hl_tag2</span> - transform element tags<br /> | 2270 |   *  <span class="term">hl_tag2</span> - transform element tags<br /> |
2271 |   *  <span class="term">hl_tidy</span> - compact/beautify HTML<br /> | 2271 |   *  <span class="term">hl_tidy</span> - compact/beautify HTML<br /> |
2272 |   *  <span class="term">hl_version</span> - report htmLawed version<br /> | 2272 |   *  <span class="term">hl_version</span> - report htmLawed version<br /> |
2273 |   *  <span class="term">htmLawed</span> - main function<br /> | 2273 |   *  <span class="term">htmLawed</span> - main function<br /> |
2274 | <br /> | 2274 | <br /> |
2275 |   <span class="term">htmLawed()</span> finalizes <span class="term">$spec</span> (with the help of <span class="term">hl_spec()</span>) and <span class="term">$config</span>, and globalizes them. Finalization of <span class="term">$config</span> involves setting default values if an inappropriate or invalid one is supplied. This includes calling <span class="term">hl_regex()</span> to check well-formedness of regular expression patterns if such expressions are user-supplied through <span class="term">$config</span>. <span class="term">htmLawed()</span> then removes invalid characters like nulls and <span class="term">x01</span> and appropriately handles entities using <span class="term">hl_ent()</span>. HTML comments and CDATA sections are identified and treated as per <span class="term">$config</span> with the help of <span class="term">hl_cmtcd()</span>. When retained, the <span class="term"><</span> and <span class="term">></span> characters identifying them, and the <span class="term"><</span>, <span class="term">></span> and <span class="term">&</span> characters inside them, are replaced with control characters (code-points <span class="term">1</span> to <span class="term">5</span>) till any tag balancing is completed.<br /> | 2275 |   <span class="term">htmLawed()</span> finalizes <span class="term">$spec</span> (with the help of <span class="term">hl_spec()</span>) and <span class="term">$config</span>, and globalizes them. Finalization of <span class="term">$config</span> involves setting default values if an inappropriate or invalid one is supplied. This includes calling <span class="term">hl_regex()</span> to check well-formedness of regular expression patterns if such expressions are user-supplied through <span class="term">$config</span>. <span class="term">htmLawed()</span> then removes invalid characters like nulls and <span class="term">x01</span> and appropriately handles entities using <span class="term">hl_ent()</span>. HTML comments and CDATA sections are identified and treated as per <span class="term">$config</span> with the help of <span class="term">hl_cmtcd()</span>. When retained, the <span class="term"><</span> and <span class="term">></span> characters identifying them, and the <span class="term"><</span>, <span class="term">></span> and <span class="term">&</span> characters inside them, are replaced with control characters (code-points <span class="term">1</span> to <span class="term">5</span>) till any tag balancing is completed.<br /> |
2276 | <br /> | 2276 | <br /> |
2277 |   After this <em>initial processing</em> <span class="term">htmLawed()</span> identifies tags using regex and processes them with the help of <span class="term">hl_tag()</span> --  a large function that analyzes tag content, filtering it as per HTML standards, <span class="term">$config</span> and <span class="term">$spec</span>. Among other things, <span class="term">hl_tag()</span> transforms deprecated elements using <span class="term">hl_tag2()</span>, removes attributes from closing tags, checks attribute values as per <span class="term">$spec</span> rules using <span class="term">hl_attrval()</span>, and checks URL protocols using <span class="term">hl_prot()</span>. <span class="term">htmLawed()</span> performs tag balancing and nesting checks with a call to <span class="term">hl_bal()</span>, and optionally compacts/beautifies the output with proper white-spacing with a call to <span class="term">hl_tidy()</span>. The latter temporarily replaces white-space, and <span class="term"><</span>, <span class="term">></span> and <span class="term">&</span> characters inside <span class="term">pre</span>, <span class="term">script</span> and <span class="term">textarea</span> elements, and HTML comments and CDATA sections with control characters (code-points <span class="term">1</span> to <span class="term">5</span>, and <span class="term">7</span>).<br /> | 2277 |   After this <em>initial processing</em> <span class="term">htmLawed()</span> identifies tags using regex and processes them with the help of <span class="term">hl_tag()</span> --  a large function that analyzes tag content, filtering it as per HTML standards, <span class="term">$config</span> and <span class="term">$spec</span>. Among other things, <span class="term">hl_tag()</span> transforms deprecated elements using <span class="term">hl_tag2()</span>, removes attributes from closing tags, checks attribute values as per <span class="term">$spec</span> rules using <span class="term">hl_attrval()</span>, and checks URL protocols using <span class="term">hl_prot()</span>. <span class="term">htmLawed()</span> performs tag balancing and nesting checks with a call to <span class="term">hl_bal()</span>, and optionally compacts/beautifies the output with proper white-spacing with a call to <span class="term">hl_tidy()</span>. The latter temporarily replaces white-space, and <span class="term"><</span>, <span class="term">></span> and <span class="term">&</span> characters inside <span class="term">pre</span>, <span class="term">script</span> and <span class="term">textarea</span> elements, and HTML comments and CDATA sections with control characters (code-points <span class="term">1</span> to <span class="term">5</span>, and <span class="term">7</span>).<br /> |
2278 | <br /> | 2278 | <br /> |
2279 |   htmLawed permits the use of custom code or <strong>hook functions</strong> at two stages. The first, called inside <span class="term">htmLawed()</span>, allows the input text as well as the finalized <span class="term">$config</span> and <span class="term">$spec</span> values to be altered right after the initial processing (see <a href="#s3.7">section 3.7</a>). The second is called by <span class="term">hl_tag()</span> once the tag content is finalized (see <a href="#s3.4.9">section 3.4.9</a>).<br /> | 2279 |   htmLawed permits the use of custom code or <strong>hook functions</strong> at two stages. The first, called inside <span class="term">htmLawed()</span>, allows the input text as well as the finalized <span class="term">$config</span> and <span class="term">$spec</span> values to be altered right after the initial processing (see <a href="#s3.7">section 3.7</a>). The second is called by <span class="term">hl_tag()</span> once the tag content is finalized (see <a href="#s3.4.9">section 3.4.9</a>).<br /> |
2280 | <br /> | 2280 | <br /> |
2281 |   The functionality of htmLawed is dictated by the external HTML standards. The code of htmLawed is thus written for a clear-cut aim, with not much concern for tweaking by other developers. The code is only minimally annotated with comments -- it is not meant to instruct. PHP developers familiar with the HTML specifications will see the logic, and others can always refer to the htmLawed documentation. | 2281 |   The functionality of htmLawed is dictated by the external HTML standards. The code of htmLawed is thus written for a clear-cut aim, with not much concern for tweaking by other developers. The code is only minimally annotated with comments -- it is not meant to instruct. PHP developers familiar with the HTML specifications will see the logic, and others can always refer to the htmLawed documentation. |
2282 | </div> | 2282 | </div> |
2283 | </div> | 2283 | </div> |
2284 | <br /> | 2284 | <br /> |
2285 | <hr /><br /><br /><span class="subtle"><small>HTM version of <em><a href="htmLawed_README.txt">htmLawed_README.txt</a></em> generated on 25 Sep, 2019 using <a href="http://www.bioinformatics.org/phplabware/internal_utilities">rTxt2htm</a> from PHP Labware</small></span> | 2285 | <hr /><br /><br /><span class="subtle"><small>HTM version of <em><a href="htmLawed_README.txt">htmLawed_README.txt</a></em> generated on 25 Sep, 2019 using <a href="http://www.bioinformatics.org/phplabware/internal_utilities">rTxt2htm</a> from PHP Labware</small></span> |
2286 | </div><!-- ended div body --> | 2286 | </div><!-- ended div body --> |
2287 | </div><!-- ended div top --> | 2287 | </div><!-- ended div top --> |
2288 | </body> | 2288 | </body> |
2289 | </html> \ No newline at end of file | 2289 | </html> \ No newline at end of file |
diff --git a/lib/htmlawed/htmLawed_README.txt b/lib/htmlawed/htmLawed_README.txt index 7950500..824fe90 100755 --- a/lib/htmlawed/htmLawed_README.txt +++ b/lib/htmlawed/htmLawed_README.txt | |||
@@ -1,1817 +1,1817 @@ | |||
1 | /* | 1 | /* |
2 | htmLawed_README.txt, 24 September 2019 | 2 | htmLawed_README.txt, 24 September 2019 |
3 | htmLawed 1.2.5, 24 September 2019 | 3 | htmLawed 1.2.5, 24 September 2019 |
4 | Copyright Santosh Patnaik | 4 | Copyright Santosh Patnaik |
5 | Dual licensed with LGPL 3 and GPL 2+ | 5 | Dual licensed with LGPL 3 and GPL 2+ |
6 | A PHP Labware internal utility - http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed | 6 | A PHP Labware internal utility - http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed |
7 | */ | 7 | */ |
8 | 8 | ||
9 | 9 | ||
10 | == Content ========================================================= | 10 | == Content ========================================================= |
11 | 11 | ||
12 | 12 | ||
13 | 1 About htmLawed | 13 | 1 About htmLawed |
14 | 1.1 Example uses | 14 | 1.1 Example uses |
15 | 1.2 Features | 15 | 1.2 Features |
16 | 1.3 History | 16 | 1.3 History |
17 | 1.4 License & copyright | 17 | 1.4 License & copyright |
18 | 1.5 Terms used here | 18 | 1.5 Terms used here |
19 | 1.6 Availability | 19 | 1.6 Availability |
20 | 2 Usage | 20 | 2 Usage |
21 | 2.1 Simple | 21 | 2.1 Simple |
22 | 2.2 Configuring htmLawed using the '$config' argument | 22 | 2.2 Configuring htmLawed using the '$config' argument |
23 | 2.3 Extra HTML specifications using the '$spec' argument | 23 | 2.3 Extra HTML specifications using the '$spec' argument |
24 | 2.4 Performance time & memory usage | 24 | 2.4 Performance time & memory usage |
25 | 2.5 Some security risks to keep in mind | 25 | 2.5 Some security risks to keep in mind |
26 | 2.6 Use with 'kses()' code | 26 | 2.6 Use with 'kses()' code |
27 | 2.7 Tolerance for ill-written HTML | 27 | 2.7 Tolerance for ill-written HTML |
28 | 2.8 Limitations & work-arounds | 28 | 2.8 Limitations & work-arounds |
29 | 2.9 Examples of usage | 29 | 2.9 Examples of usage |
30 | 3 Details | 30 | 3 Details |
31 | 3.1 Invalid/dangerous characters | 31 | 3.1 Invalid/dangerous characters |
32 | 3.2 Character references/entities | 32 | 3.2 Character references/entities |
33 | 3.3 HTML elements | 33 | 3.3 HTML elements |
34 | 3.3.1 HTML comments & 'CDATA' sections | 34 | 3.3.1 HTML comments & 'CDATA' sections |
35 | 3.3.2 Tag-transformation for better compliance with standards | 35 | 3.3.2 Tag-transformation for better compliance with standards |
36 | 3.3.3 Tag balancing & proper nesting | 36 | 3.3.3 Tag balancing & proper nesting |
37 | 3.3.4 Elements requiring child elements | 37 | 3.3.4 Elements requiring child elements |
38 | 3.3.5 Beautify or compact HTML | 38 | 3.3.5 Beautify or compact HTML |
39 | 3.4 Attributes | 39 | 3.4 Attributes |
40 | 3.4.1 Auto-addition of XHTML-required attributes | 40 | 3.4.1 Auto-addition of XHTML-required attributes |
41 | 3.4.2 Duplicate/invalid 'id' values | 41 | 3.4.2 Duplicate/invalid 'id' values |
42 | 3.4.3 URL schemes & scripts in attribute values | 42 | 3.4.3 URL schemes & scripts in attribute values |
43 | 3.4.4 Absolute & relative URLs | 43 | 3.4.4 Absolute & relative URLs |
44 | 3.4.5 Lower-cased, standard attribute values | 44 | 3.4.5 Lower-cased, standard attribute values |
45 | 3.4.6 Transformation of deprecated attributes | 45 | 3.4.6 Transformation of deprecated attributes |
46 | 3.4.7 Anti-spam & 'href' | 46 | 3.4.7 Anti-spam & 'href' |
47 | 3.4.8 Inline style properties | 47 | 3.4.8 Inline style properties |
48 | 3.4.9 Hook function for tag content | 48 | 3.4.9 Hook function for tag content |
49 | 3.5 Simple configuration directive for most valid XHTML | 49 | 3.5 Simple configuration directive for most valid XHTML |
50 | 3.6 Simple configuration directive for most `safe` HTML | 50 | 3.6 Simple configuration directive for most `safe` HTML |
51 | 3.7 Using a hook function | 51 | 3.7 Using a hook function |
52 | 3.8 Obtaining `finalized` parameter values | 52 | 3.8 Obtaining `finalized` parameter values |
53 | 3.9 Retaining non-HTML tags in input with mixed markup | 53 | 3.9 Retaining non-HTML tags in input with mixed markup |
54 | 4 Other | 54 | 4 Other |
55 | 4.1 Support | 55 | 4.1 Support |
56 | 4.2 Known issues | 56 | 4.2 Known issues |
57 | 4.3 Change-log | 57 | 4.3 Change-log |
58 | 4.4 Testing | 58 | 4.4 Testing |
59 | 4.5 Upgrade, & old versions | 59 | 4.5 Upgrade, & old versions |
60 | 4.6 Comparison with 'HTMLPurifier' | 60 | 4.6 Comparison with 'HTMLPurifier' |
61 | 4.7 Use through application plug-ins/modules | 61 | 4.7 Use through application plug-ins/modules |
62 | 4.8 Use in non-PHP applications | 62 | 4.8 Use in non-PHP applications |
63 | 4.9 Donate | 63 | 4.9 Donate |
64 | 4.10 Acknowledgements | 64 | 4.10 Acknowledgements |
65 | 5 Appendices | 65 | 5 Appendices |
66 | 5.1 Characters discouraged in HTML | 66 | 5.1 Characters discouraged in HTML |
67 | 5.2 Valid attribute-element combinations | 67 | 5.2 Valid attribute-element combinations |
68 | 5.3 CSS 2.1 properties accepting URLs | 68 | 5.3 CSS 2.1 properties accepting URLs |
69 | 5.4 Microsoft Windows 1252 character replacements | 69 | 5.4 Microsoft Windows 1252 character replacements |
70 | 5.5 URL format | 70 | 5.5 URL format |
71 | 5.6 Brief on htmLawed code | 71 | 5.6 Brief on htmLawed code |
72 | 72 | ||
73 | 73 | ||
74 | == 1 About htmLawed ================================================ | 74 | == 1 About htmLawed ================================================ |
75 | 75 | ||
76 | 76 | ||
77 | htmLawed is a PHP script to process text with HTML markup to make it more compliant with HTML standards and with administrative policies. It works by making HTML well-formed with balanced and properly nested tags, neutralizing code that introduces a security vulnerability or is used for cross-site scripting (XSS) attacks, allowing only specified HTML tags and attributes, and so on. Such `lawing in` of HTML code ensures that it is in accordance with the aesthetics, safety and usability requirements set by administrators. | 77 | htmLawed is a PHP script to process text with HTML markup to make it more compliant with HTML standards and with administrative policies. It works by making HTML well-formed with balanced and properly nested tags, neutralizing code that introduces a security vulnerability or is used for cross-site scripting (XSS) attacks, allowing only specified HTML tags and attributes, and so on. Such `lawing in` of HTML code ensures that it is in accordance with the aesthetics, safety and usability requirements set by administrators. |
78 | 78 | ||
79 | htmLawed is highly customizable, and fast with low memory usage. Its free and open-source code is in one small file. It does not require extensions or libraries, and works in older versions of PHP as well. It is a good alternative to the HTML Tidy:- http://tidy.sourceforge.net application. | 79 | htmLawed is highly customizable, and fast with low memory usage. Its free and open-source code is in one small file. It does not require extensions or libraries, and works in older versions of PHP as well. It is a good alternative to the HTML Tidy:- http://tidy.sourceforge.net application. |
80 | 80 | ||
81 | 81 | ||
82 | -- 1.1 Example uses ------------------------------------------------ | 82 | -- 1.1 Example uses ------------------------------------------------ |
83 | 83 | ||
84 | 84 | ||
85 | * Filtering of text submitted as comments on blogs to allow only certain HTML elements | 85 | * Filtering of text submitted as comments on blogs to allow only certain HTML elements |
86 | 86 | ||
87 | * Making RSS newsfeed items standard-compliant: often one uses an excerpt from an HTML document for the content, and with unbalanced tags, non-numerical entities, etc., such excerpts may not be XML-compliant | 87 | * Making RSS newsfeed items standard-compliant: often one uses an excerpt from an HTML document for the content, and with unbalanced tags, non-numerical entities, etc., such excerpts may not be XML-compliant |
88 | 88 | ||
89 | * Beautifying or pretty-printing HTML code | 89 | * Beautifying or pretty-printing HTML code |
90 | 90 | ||
91 | * Text processing for stricter XML standard-compliance: e.g., to have lowercased 'x' in hexadecimal numeric entities becomes necessary if an HTML document with MathML content needs to be served as 'application/xml' | 91 | * Text processing for stricter XML standard-compliance: e.g., to have lowercased 'x' in hexadecimal numeric entities becomes necessary if an HTML document with MathML content needs to be served as 'application/xml' |
92 | 92 | ||
93 | * Scraping text from web-pages | 93 | * Scraping text from web-pages |
94 | 94 | ||
95 | * Transforming an HTML element to another | 95 | * Transforming an HTML element to another |
96 | 96 | ||
97 | 97 | ||
98 | -- 1.2 Features ---------------------------------------------------o | 98 | -- 1.2 Features ---------------------------------------------------o |
99 | 99 | ||
100 | 100 | ||
101 | Key: '*' security feature, '^' standard compliance, '~' requires setting right options | 101 | Key: '*' security feature, '^' standard compliance, '~' requires setting right options |
102 | 102 | ||
103 | htmLawed: | 103 | htmLawed: |
104 | 104 | ||
105 | * makes input more *secure* and *standard-compliant* for HTML as well as generic *XML* documents ^ | 105 | * makes input more *secure* and *standard-compliant* for HTML as well as generic *XML* documents ^ |
106 | * supports markup for *HTML 5* and *microdata, ARIA, Ruby, custom attributes*, etc. ^ | 106 | * supports markup for *HTML 5* and *microdata, ARIA, Ruby, custom attributes*, etc. ^ |
107 | * can *beautify* or *compact* HTML ~ | 107 | * can *beautify* or *compact* HTML ~ |
108 | * works with input of almost any *character encoding* and does not affect it | 108 | * works with input of almost any *character encoding* and does not affect it |
109 | * has good *tolerance for ill-written HTML* | 109 | * has good *tolerance for ill-written HTML* |
110 | 110 | ||
111 | * can enforce *restricted use of elements* *~ | 111 | * can enforce *restricted use of elements* *~ |
112 | * ensures proper closure of empty elements like 'img' ^ | 112 | * ensures proper closure of empty elements like 'img' ^ |
113 | * *transforms deprecated elements* like 'font' ^~ | 113 | * *transforms deprecated elements* like 'font' ^~ |
114 | * can permit HTML *comments* and *CDATA* sections ^~ | 114 | * can permit HTML *comments* and *CDATA* sections ^~ |
115 | * can permit all elements, including 'script', 'object' and 'form' ~ | 115 | * can permit all elements, including 'script', 'object' and 'form' ~ |
116 | 116 | ||
117 | * can *restrict attributes by element* ^~ | 117 | * can *restrict attributes by element* ^~ |
118 | * removes *invalid attributes* ^ | 118 | * removes *invalid attributes* ^ |
119 | * lower-cases element and attribute names ^ | 119 | * lower-cases element and attribute names ^ |
120 | * provides *required attributes*, like 'alt' for 'image' ^ | 120 | * provides *required attributes*, like 'alt' for 'image' ^ |
121 | * *transforms deprecated attributes* ^~ | 121 | * *transforms deprecated attributes* ^~ |
122 | * ensures attributes are *declared only once* ^ | 122 | * ensures attributes are *declared only once* ^ |
123 | * permits *custom*, non-standard attributes as well as custom rules for standard attributes ~ | 123 | * permits *custom*, non-standard attributes as well as custom rules for standard attributes ~ |
124 | 124 | ||
125 | * declares value for `empty` (`minimized` or `boolean`) attributes like 'checked' ^ | 125 | * declares value for `empty` (`minimized` or `boolean`) attributes like 'checked' ^ |
126 | * checks for potentially dangerous attribute values *~ | 126 | * checks for potentially dangerous attribute values *~ |
127 | * ensures *unique* 'id' attribute values ^~ | 127 | * ensures *unique* 'id' attribute values ^~ |
128 | * *double-quotes* attribute values ^ | 128 | * *double-quotes* attribute values ^ |
129 | * lower-cases *standard attribute values* like 'password' ^ | 129 | * lower-cases *standard attribute values* like 'password' ^ |
130 | 130 | ||
131 | * can restrict *URL protocol/scheme by attribute* *~ | 131 | * can restrict *URL protocol/scheme by attribute* *~ |
132 | * can disable *dynamic expressions* in 'style' values *~ | 132 | * can disable *dynamic expressions* in 'style' values *~ |
133 | 133 | ||
134 | * neutralizes invalid named *character entities* ^ | 134 | * neutralizes invalid named *character entities* ^ |
135 | * converts hexadecimal numeric entities to decimal ones, or vice versa ^~ | 135 | * converts hexadecimal numeric entities to decimal ones, or vice versa ^~ |
136 | * converts named entities to numeric ones for generic XML use ^~ | 136 | * converts named entities to numeric ones for generic XML use ^~ |
137 | 137 | ||
138 | * removes *null* characters * | 138 | * removes *null* characters * |
139 | * neutralizes potentially dangerous proprietary Netscape *Javascript entities* * | 139 | * neutralizes potentially dangerous proprietary Netscape *Javascript entities* * |
140 | * replaces potentially dangerous *soft-hyphen* character in URL-accepting attribute values with spaces * | 140 | * replaces potentially dangerous *soft-hyphen* character in URL-accepting attribute values with spaces * |
141 | 141 | ||
142 | * removes common *invalid characters* not allowed in HTML or XML ^ | 142 | * removes common *invalid characters* not allowed in HTML or XML ^ |
143 | * replaces *characters from Microsoft applications* like 'Word' that are discouraged in HTML or XML ^~ | 143 | * replaces *characters from Microsoft applications* like 'Word' that are discouraged in HTML or XML ^~ |
144 | * neutralize entities for characters invalid or discouraged in HTML or XML ^ | 144 | * neutralize entities for characters invalid or discouraged in HTML or XML ^ |
145 | * appropriately neutralize '<', '&', '"', and '>' characters ^* | 145 | * appropriately neutralize '<', '&', '"', and '>' characters ^* |
146 | 146 | ||
147 | * understands improperly spaced tag content (e.g., spread over more than a line) and properly spaces them | 147 | * understands improperly spaced tag content (e.g., spread over more than a line) and properly spaces them |
148 | * attempts to *balance tags* for well-formedness ^~ | 148 | * attempts to *balance tags* for well-formedness ^~ |
149 | * understands when *omitable closing tags* like '</p>' are missing ^~ | 149 | * understands when *omitable closing tags* like '</p>' are missing ^~ |
150 | * attempts to permit only *validly nested tags* ^~ | 150 | * attempts to permit only *validly nested tags* ^~ |
151 | * can *either remove or neutralize bad content* ^~ | 151 | * can *either remove or neutralize bad content* ^~ |
152 | * attempts to *rectify common errors of plain-text misplacement* (e.g., directly inside 'blockquote') ^~ | 152 | * attempts to *rectify common errors of plain-text misplacement* (e.g., directly inside 'blockquote') ^~ |
153 | 153 | ||
154 | * has optional *anti-spam* measures such as addition of 'rel="nofollow"' and link-disabling ~ | 154 | * has optional *anti-spam* measures such as addition of 'rel="nofollow"' and link-disabling ~ |
155 | * optionally makes *relative URLs absolute*, and vice versa ~ | 155 | * optionally makes *relative URLs absolute*, and vice versa ~ |
156 | 156 | ||
157 | * optionally marks '&' to identify the entities for '&', '<' and '>' introduced by it ~ | 157 | * optionally marks '&' to identify the entities for '&', '<' and '>' introduced by it ~ |
158 | 158 | ||
159 | * allows deployment of powerful *hook functions* to *inject* HTML, *consolidate* 'style' attributes to 'class', finely check attribute values, etc. ~ | 159 | * allows deployment of powerful *hook functions* to *inject* HTML, *consolidate* 'style' attributes to 'class', finely check attribute values, etc. ~ |
160 | 160 | ||
161 | 161 | ||
162 | -- 1.3 History ----------------------------------------------------o | 162 | -- 1.3 History ----------------------------------------------------o |
163 | 163 | ||
164 | 164 | ||
165 | htmLawed was created in 2007 for use with 'LabWiki', a wiki software developed at PHP Labware, as a suitable software could not be found. Existing PHP software like 'Kses' and 'HTMLPurifier' were deemed inadequate, slow, resource-intensive, or dependent on an extension or external application like 'HTML Tidy'. The core logic of htmLawed, that of identifying HTML elements and attributes, was based on the 'Kses' (version 0.2.2) HTML filter software of Ulf Harnhammar (it can still be used with code that uses 'Kses'; see section:- #2.6.). Support for HTML version 5 was added in May 2013 in a beta and in February 2017 in a production release. | 165 | htmLawed was created in 2007 for use with 'LabWiki', a wiki software developed at PHP Labware, as a suitable software could not be found. Existing PHP software like 'Kses' and 'HTMLPurifier' were deemed inadequate, slow, resource-intensive, or dependent on an extension or external application like 'HTML Tidy'. The core logic of htmLawed, that of identifying HTML elements and attributes, was based on the 'Kses' (version 0.2.2) HTML filter software of Ulf Harnhammar (it can still be used with code that uses 'Kses'; see section:- #2.6.). Support for HTML version 5 was added in May 2013 in a beta and in February 2017 in a production release. |
166 | 166 | ||
167 | See section:- #4.3 for a detailed log of changes in htmLawed over the years, and section:- #4.10 for acknowledgements. | 167 | See section:- #4.3 for a detailed log of changes in htmLawed over the years, and section:- #4.10 for acknowledgements. |
168 | 168 | ||
169 | 169 | ||
170 | -- 1.4 License & copyright ----------------------------------------o | 170 | -- 1.4 License & copyright ----------------------------------------o |
171 | 171 | ||
172 | 172 | ||
173 | htmLawed is free and open-source software, copyrighted by Santosh Patnaik, MD, PhD, and dual-licensed with LGPL version 3:- http://www.gnu.org/licenses/lgpl-3.0.txt, and GPL version 2:- http://www.gnu.org/licenses/gpl-2.0.txt (or later) licenses. | 173 | htmLawed is free and open-source software, copyrighted by Santosh Patnaik, MD, PhD, and dual-licensed with LGPL version 3:- http://www.gnu.org/licenses/lgpl-3.0.txt, and GPL version 2:- http://www.gnu.org/licenses/gpl-2.0.txt (or later) licenses. |
174 | 174 | ||
175 | 175 | ||
176 | -- 1.5 Terms used here --------------------------------------------o | 176 | -- 1.5 Terms used here --------------------------------------------o |
177 | 177 | ||
178 | 178 | ||
179 | In this document, only HTML body-level elements are considered. htmLawed does not have support for head-level elements, 'body', and the frame-level elements, 'frameset', 'frame' and 'noframes', and these elements are ignored here. | 179 | In this document, only HTML body-level elements are considered. htmLawed does not have support for head-level elements, 'body', and the frame-level elements, 'frameset', 'frame' and 'noframes', and these elements are ignored here. |
180 | 180 | ||
181 | * `administrator` - or admin; person setting up the code that utilizes htmLawed; also, `user` | 181 | * `administrator` - or admin; person setting up the code that utilizes htmLawed; also, `user` |
182 | * `attributes` - name-value pairs like 'href="http://x.com"' in opening tags | 182 | * `attributes` - name-value pairs like 'href="http://x.com"' in opening tags |
183 | * `author` - see `writer` | 183 | * `author` - see `writer` |
184 | * `character` - atomic unit of text; internally represented by a numeric `code-point` as specified by the `encoding` or `charset` in use | 184 | * `character` - atomic unit of text; internally represented by a numeric `code-point` as specified by the `encoding` or `charset` in use |
185 | * `entity` - markup like '>' and ' ' used to refer to a character | 185 | * `entity` - markup like '>' and ' ' used to refer to a character |
186 | * `element` - HTML element like 'a' and 'img' | 186 | * `element` - HTML element like 'a' and 'img' |
187 | * `element content` - content between the opening and closing tags of an element, like 'click' of the '<a href="x">click</a>' element | 187 | * `element content` - content between the opening and closing tags of an element, like 'click' of the '<a href="x">click</a>' element |
188 | * `HTML` - implies XHTML unless specified otherwise | 188 | * `HTML` - implies XHTML unless specified otherwise |
189 | * `HTML body` - content in the `body` container of an HTML document | 189 | * `HTML body` - content in the `body` container of an HTML document |
190 | * `input` - text given to htmLawed to process | 190 | * `input` - text given to htmLawed to process |
191 | * `legal` – standard-compliant; also, `valid` | 191 | * `legal` – standard-compliant; also, `valid` |
192 | * `processing` - involves filtering, correction, etc., of input | 192 | * `processing` - involves filtering, correction, etc., of input |
193 | * `safe` - absence or reduction of certain characters and HTML elements and attributes in HTML of text that can otherwise potentially, and circumstantially, expose text readers to security vulnerabilities like cross-site scripting attacks (XSS) | 193 | * `safe` - absence or reduction of certain characters and HTML elements and attributes in HTML of text that can otherwise potentially, and circumstantially, expose text readers to security vulnerabilities like cross-site scripting attacks (XSS) |
194 | * `scheme` - a URL protocol like 'http' and 'ftp' | 194 | * `scheme` - a URL protocol like 'http' and 'ftp' |
195 | * `specification` - detailed description including rules that define HTML | 195 | * `specification` - detailed description including rules that define HTML |
196 | * `standard` – widely accepted specification | 196 | * `standard` – widely accepted specification |
197 | * `style property` - terms like 'border' and 'height' for which declarations are made in values for the 'style' attribute of elements | 197 | * `style property` - terms like 'border' and 'height' for which declarations are made in values for the 'style' attribute of elements |
198 | * `tag` - markers like '<a href="x">' and '</a>' delineating element content; the opening tag can contain attributes | 198 | * `tag` - markers like '<a href="x">' and '</a>' delineating element content; the opening tag can contain attributes |
199 | * `tag content` - consists of tag markers '<' and '>', element names like 'div', and possibly attributes | 199 | * `tag content` - consists of tag markers '<' and '>', element names like 'div', and possibly attributes |
200 | * `user` - administrator | 200 | * `user` - administrator |
201 | * `valid` - see `legal` | 201 | * `valid` - see `legal` |
202 | * `writer` - end-user like a blog commenter providing the input that is to be processed; also, `author` | 202 | * `writer` - end-user like a blog commenter providing the input that is to be processed; also, `author` |
203 | * `XHTML` - XML-compliant HTML; parsing rules for XHTML are more strict than for regular HTML | 203 | * `XHTML` - XML-compliant HTML; parsing rules for XHTML are more strict than for regular HTML |
204 | 204 | ||
205 | 205 | ||
206 | -- 1.6 Availability -----------------------------------------------o | 206 | -- 1.6 Availability -----------------------------------------------o |
207 | 207 | ||
208 | 208 | ||
209 | htmLawed can be downloaded for free at its website:- http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed. Besides the 'htmLawed.php' file, the download has the htmLawed documentation (this document) in plain text:- htmLawed_README.txt and HTML:- htmLawed_README.htm formats, a script for testing:- htmLawedTest.php, and a text file for test-cases:- htmLawed_TESTCASE.txt. htmLawed is also available as a PHP class (OOP code) at its website. | 209 | htmLawed can be downloaded for free at its website:- http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed. Besides the 'htmLawed.php' file, the download has the htmLawed documentation (this document) in plain text:- htmLawed_README.txt and HTML:- htmLawed_README.htm formats, a script for testing:- htmLawedTest.php, and a text file for test-cases:- htmLawed_TESTCASE.txt. htmLawed is also available as a PHP class (OOP code) at its website. |
210 | 210 | ||
211 | 211 | ||
212 | == 2 Usage =======================================================oo | 212 | == 2 Usage =======================================================oo |
213 | 213 | ||
214 | 214 | ||
215 | htmLawed works in PHP version 4.4 or higher. Either 'include()' the 'htmLawed.php' file, or copy-paste the entire code. | 215 | htmLawed works in PHP version 4.4 or higher. Either 'include()' the 'htmLawed.php' file, or copy-paste the entire code. |
216 | 216 | ||
217 | To use with PHP 4.3, have the following code included: | 217 | To use with PHP 4.3, have the following code included: |
218 | 218 | ||
219 | if(!function_exists('ctype_digit')){ | 219 | if(!function_exists('ctype_digit')){ |
220 | function ctype_digit($var){ | 220 | function ctype_digit($var){ |
221 | return ((int) $var == $var); | 221 | return ((int) $var == $var); |
222 | } | 222 | } |
223 | } | 223 | } |
224 | 224 | ||
225 | 225 | ||
226 | -- 2.1 Simple ------------------------------------------------------ | 226 | -- 2.1 Simple ------------------------------------------------------ |
227 | 227 | ||
228 | 228 | ||
229 | The input text to be processed, '$text', is passed as an argument of type string; 'htmLawed()' returns the processed string: | 229 | The input text to be processed, '$text', is passed as an argument of type string; 'htmLawed()' returns the processed string: |
230 | 230 | ||
231 | $processed = htmLawed($text); | 231 | $processed = htmLawed($text); |
232 | 232 | ||
233 | With the 'htmLawed class' (section:- #1.6), usage is: | 233 | With the 'htmLawed class' (section:- #1.6), usage is: |
234 | 234 | ||
235 | $processed = htmLawed::hl($text); | 235 | $processed = htmLawed::hl($text); |
236 | 236 | ||
237 | *Notes*: (1) If input is from a '$_GET' or '$_POST' value, and 'magic quotes' are enabled on the PHP setup, run 'stripslashes()' on the input before passing to htmLawed. (2) htmLawed does not have support for head-level elements, 'body', and the frame-level elements, 'frameset', 'frame' and 'noframes'. | 237 | *Notes*: (1) If input is from a '$_GET' or '$_POST' value, and 'magic quotes' are enabled on the PHP setup, run 'stripslashes()' on the input before passing to htmLawed. (2) htmLawed does not have support for head-level elements, 'body', and the frame-level elements, 'frameset', 'frame' and 'noframes'. |
238 | 238 | ||
239 | By default, htmLawed will process the text allowing all valid HTML elements/tags and commonly used URL schemes and CSS style properties. It will allow Javascript code, 'CDATA' sections and HTML comments, balance tags, and ensure proper nesting of elements. Such actions can be configured using two other optional arguments -- '$config' and '$spec': | 239 | By default, htmLawed will process the text allowing all valid HTML elements/tags and commonly used URL schemes and CSS style properties. It will allow Javascript code, 'CDATA' sections and HTML comments, balance tags, and ensure proper nesting of elements. Such actions can be configured using two other optional arguments -- '$config' and '$spec': |
240 | 240 | ||
241 | $processed = htmLawed($text, $config, $spec); | 241 | $processed = htmLawed($text, $config, $spec); |
242 | 242 | ||
243 | The '$config' and '$spec' arguments are detailed below. Some examples are shown in section:- #2.9. For maximum protection against 'XSS' and other security vulnerabilities, consider using the 'safe' parameter; see section:- #3.6. | 243 | The '$config' and '$spec' arguments are detailed below. Some examples are shown in section:- #2.9. For maximum protection against 'XSS' and other security vulnerabilities, consider using the 'safe' parameter; see section:- #3.6. |
244 | 244 | ||
245 | 245 | ||
246 | -- 2.2 Configuring htmLawed using the '$config' argument ---------o | 246 | -- 2.2 Configuring htmLawed using the '$config' argument ---------o |
247 | 247 | ||
248 | 248 | ||
249 | '$config' instructs htmLawed on how to tackle certain tasks. When '$config' is not specified, or not set as an array (e.g., '$config = 1'), htmLawed will take default actions. One or many of the task-action or parameter-value pairs can be specified in '$config' as array key-value pairs. If a parameter is not specified, htmLawed will use the default value for it, indicated further below. In PHP code, parameter values that are integers should not be quoted and should be used as numeric types (unless meant as string/text). Thus, for instance: | 249 | '$config' instructs htmLawed on how to tackle certain tasks. When '$config' is not specified, or not set as an array (e.g., '$config = 1'), htmLawed will take default actions. One or many of the task-action or parameter-value pairs can be specified in '$config' as array key-value pairs. If a parameter is not specified, htmLawed will use the default value for it, indicated further below. In PHP code, parameter values that are integers should not be quoted and should be used as numeric types (unless meant as string/text). Thus, for instance: |
250 | 250 | ||
251 | $config = array('comment'=>0, 'cdata'=>1, 'elements'=>'a, b, strong'); | 251 | $config = array('comment'=>0, 'cdata'=>1, 'elements'=>'a, b, strong'); |
252 | $processed = htmLawed($text, $config); | 252 | $processed = htmLawed($text, $config); |
253 | 253 | ||
254 | Below are the various parameters that can be specified in '$config'. | 254 | Below are the various parameters that can be specified in '$config'. |
255 | 255 | ||
256 | Key: '*' default, '^' different from htmLawed versions below 1.2, '~' different default when 'valid_xhtml' is set to '1' (see section:- #3.5), '"' different default when 'safe' is set to '1' (see section:- #3.6) | 256 | Key: '*' default, '^' different from htmLawed versions below 1.2, '~' different default when 'valid_xhtml' is set to '1' (see section:- #3.5), '"' different default when 'safe' is set to '1' (see section:- #3.6) |
257 | 257 | ||
258 | *abs_url* | 258 | *abs_url* |
259 | Make URLs absolute or relative; '$config["base_url"]' needs to be set; see section:- #3.4.4 | 259 | Make URLs absolute or relative; '$config["base_url"]' needs to be set; see section:- #3.4.4 |
260 | 260 | ||
261 | '-1' - make relative | 261 | '-1' - make relative |
262 | '0' - no action * | 262 | '0' - no action * |
263 | '1' - make absolute | 263 | '1' - make absolute |
264 | 264 | ||
265 | *and_mark* | 265 | *and_mark* |
266 | Mark '&' characters in the original input; see section:- #3.2 | 266 | Mark '&' characters in the original input; see section:- #3.2 |
267 | 267 | ||
268 | *anti_link_spam* | 268 | *anti_link_spam* |
269 | Anti-link-spam measure; see section:- #3.4.7 | 269 | Anti-link-spam measure; see section:- #3.4.7 |
270 | 270 | ||
271 | '0' - no measure taken * | 271 | '0' - no measure taken * |
272 | `array("regex1", "regex2")` - will ensure a 'rel' attribute with 'nofollow' in its value in case the 'href' attribute value matches the regular expression pattern 'regex1', and/or will remove 'href' if its value matches the regular expression pattern 'regex2'. E.g., 'array("/./", "/://\W*(?!(abc\.com|xyz\.org))/")'; see section:- #3.4.7 for more. | 272 | `array("regex1", "regex2")` - will ensure a 'rel' attribute with 'nofollow' in its value in case the 'href' attribute value matches the regular expression pattern 'regex1', and/or will remove 'href' if its value matches the regular expression pattern 'regex2'. E.g., 'array("/./", "/://\W*(?!(abc\.com|xyz\.org))/")'; see section:- #3.4.7 for more. |
273 | 273 | ||
274 | *anti_mail_spam* | 274 | *anti_mail_spam* |
275 | Anti-mail-spam measure; see section:- #3.4.7 | 275 | Anti-mail-spam measure; see section:- #3.4.7 |
276 | 276 | ||
277 | '0' - no measure taken * | 277 | '0' - no measure taken * |
278 | `word` - '@' in mail address in 'href' attribute value is replaced with specified `word` | 278 | `word` - '@' in mail address in 'href' attribute value is replaced with specified `word` |
279 | 279 | ||
280 | *balance* | 280 | *balance* |
281 | Balance tags for well-formedness and proper nesting; see section:- #3.3.3 | 281 | Balance tags for well-formedness and proper nesting; see section:- #3.3.3 |
282 | 282 | ||
283 | '0' - no | 283 | '0' - no |
284 | '1' - yes * | 284 | '1' - yes * |
285 | 285 | ||
286 | *base_url* | 286 | *base_url* |
287 | Base URL value that needs to be set if '$config["abs_url"]' is not '0'; see section:- #3.4.4 | 287 | Base URL value that needs to be set if '$config["abs_url"]' is not '0'; see section:- #3.4.4 |
288 | 288 | ||
289 | *cdata* | 289 | *cdata* |
290 | Handling of 'CDATA' sections; see section:- #3.3.1 | 290 | Handling of 'CDATA' sections; see section:- #3.3.1 |
291 | 291 | ||
292 | '0' - don't consider 'CDATA' sections as markup and proceed as if plain text " | 292 | '0' - don't consider 'CDATA' sections as markup and proceed as if plain text " |
293 | '1' - remove | 293 | '1' - remove |
294 | '2' - allow, but neutralize any '<', '>', and '&' inside by converting them to named entities | 294 | '2' - allow, but neutralize any '<', '>', and '&' inside by converting them to named entities |
295 | '3' - allow * | 295 | '3' - allow * |
296 | 296 | ||
297 | *clean_ms_char* | 297 | *clean_ms_char* |
298 | Replace `discouraged` characters introduced by Microsoft Word, etc.; see section:- #3.1 | 298 | Replace `discouraged` characters introduced by Microsoft Word, etc.; see section:- #3.1 |
299 | 299 | ||
300 | '0' - no * | 300 | '0' - no * |
301 | '1' - yes | 301 | '1' - yes |
302 | '2' - yes, but replace special single & double quotes with ordinary ones | 302 | '2' - yes, but replace special single & double quotes with ordinary ones |
303 | 303 | ||
304 | *comment* | 304 | *comment* |
305 | Handling of HTML comments; see section:- #3.3.1 | 305 | Handling of HTML comments; see section:- #3.3.1 |
306 | 306 | ||
307 | '0' - don't consider comments as markup and proceed as if plain text " | 307 | '0' - don't consider comments as markup and proceed as if plain text " |
308 | '1' - remove | 308 | '1' - remove |
309 | '2' - allow, but neutralize any '<', '>', and '&' inside by converting to named entities | 309 | '2' - allow, but neutralize any '<', '>', and '&' inside by converting to named entities |
310 | '3' - allow * | 310 | '3' - allow * |
311 | 311 | ||
312 | *css_expression* | 312 | *css_expression* |
313 | Allow dynamic CSS expression by not removing the expression from CSS property values in 'style' attributes; see section:- #3.4.8 | 313 | Allow dynamic CSS expression by not removing the expression from CSS property values in 'style' attributes; see section:- #3.4.8 |
314 | 314 | ||
315 | '0' - remove * | 315 | '0' - remove * |
316 | '1' - allow | 316 | '1' - allow |
317 | 317 | ||
318 | *deny_attribute* | 318 | *deny_attribute* |
319 | Denied HTML attributes; see section:- #3.4 | 319 | Denied HTML attributes; see section:- #3.4 |
320 | 320 | ||
321 | '0' - none * | 321 | '0' - none * |
322 | `string` - dictated by values in `string` | 322 | `string` - dictated by values in `string` |
323 | 'on*' - on* event attributes like 'onfocus' not allowed " | 323 | 'on*' - on* event attributes like 'onfocus' not allowed " |
324 | 324 | ||
325 | *direct_nest_list* | 325 | *direct_nest_list* |
326 | Allow direct nesting of a list within another without requiring it to be a list item; see section:- #3.3.4 | 326 | Allow direct nesting of a list within another without requiring it to be a list item; see section:- #3.3.4 |
327 | 327 | ||
328 | '0' - no * | 328 | '0' - no * |
329 | '1' - yes | 329 | '1' - yes |
330 | 330 | ||
331 | *elements* | 331 | *elements* |
332 | Allowed HTML elements; see section:- #3.3 | 332 | Allowed HTML elements; see section:- #3.3 |
333 | 333 | ||
334 | `all` - *^ | 334 | `all` - *^ |
335 | '* -acronym -big -center -dir -font -isindex -s -strike -tt' - ~^ | 335 | '* -acronym -big -center -dir -font -isindex -s -strike -tt' - ~^ |
336 | `applet, audio, canvas, embed, iframe, object, script, and video elements not allowed` - "^ | 336 | `applet, audio, canvas, embed, iframe, object, script, and video elements not allowed` - "^ |
337 | 337 | ||
338 | *hexdec_entity* | 338 | *hexdec_entity* |
339 | Allow hexadecimal numeric entities and do not convert to the more widely accepted decimal ones, or convert decimal to hexadecimal ones; see section:- #3.2 | 339 | Allow hexadecimal numeric entities and do not convert to the more widely accepted decimal ones, or convert decimal to hexadecimal ones; see section:- #3.2 |
340 | 340 | ||
341 | '0' - no | 341 | '0' - no |
342 | '1' - yes * | 342 | '1' - yes * |
343 | '2' - convert decimal to hexadecimal ones | 343 | '2' - convert decimal to hexadecimal ones |
344 | 344 | ||
345 | *hook* | 345 | *hook* |
346 | Name of an optional hook function to alter the input string, '$config' or '$spec' before htmLawed enters the main phase of its work; see section:- #3.7 | 346 | Name of an optional hook function to alter the input string, '$config' or '$spec' before htmLawed enters the main phase of its work; see section:- #3.7 |
347 | 347 | ||
348 | '0' - no hook function * | 348 | '0' - no hook function * |
349 | `name` - `name` is name of the hook function | 349 | `name` - `name` is name of the hook function |
350 | 350 | ||
351 | *hook_tag* | 351 | *hook_tag* |
352 | Name of an optional hook function to alter tag content finalized by htmLawed; see section:- #3.4.9 | 352 | Name of an optional hook function to alter tag content finalized by htmLawed; see section:- #3.4.9 |
353 | 353 | ||
354 | '0' - no hook function * | 354 | '0' - no hook function * |
355 | `name` - `name` is name of the hook function | 355 | `name` - `name` is name of the hook function |
356 | 356 | ||
357 | *keep_bad* | 357 | *keep_bad* |
358 | Neutralize `bad` tags by converting their '<' and '>' characters to entities, or remove them; see section:- #3.3.3 | 358 | Neutralize `bad` tags by converting their '<' and '>' characters to entities, or remove them; see section:- #3.3.3 |
359 | 359 | ||
360 | '0' - remove | 360 | '0' - remove |
361 | '1' - neutralize both tags and element content | 361 | '1' - neutralize both tags and element content |
362 | '2' - remove tags but neutralize element content | 362 | '2' - remove tags but neutralize element content |
363 | '3' and '4' - like '1' and '2' but remove if text ('pcdata') is invalid in parent element | 363 | '3' and '4' - like '1' and '2' but remove if text ('pcdata') is invalid in parent element |
364 | '5' and '6' * - like '3' and '4' but line-breaks, tabs and spaces are left | 364 | '5' and '6' * - like '3' and '4' but line-breaks, tabs and spaces are left |
365 | 365 | ||
366 | *lc_std_val* | 366 | *lc_std_val* |
367 | For XHTML compliance, predefined, standard attribute values, like 'get' for the 'method' attribute of 'form', must be lowercased; see section:- #3.4.5 | 367 | For XHTML compliance, predefined, standard attribute values, like 'get' for the 'method' attribute of 'form', must be lowercased; see section:- #3.4.5 |
368 | 368 | ||
369 | '0' - no | 369 | '0' - no |
370 | '1' - yes * | 370 | '1' - yes * |
371 | 371 | ||
372 | *make_tag_strict* | 372 | *make_tag_strict* |
373 | Transform or remove these deprecated HTML elements, even if they are allowed by the admin: acronym, applet, big, center, dir, font, isindex, s, strike, tt; see section:- #3.3.2 | 373 | Transform or remove these deprecated HTML elements, even if they are allowed by the admin: acronym, applet, big, center, dir, font, isindex, s, strike, tt; see section:- #3.3.2 |
374 | 374 | ||
375 | '0' - no | 375 | '0' - no |
376 | '1' - yes, but leave 'applet' and 'isindex' that currently cannot be transformed *^ | 376 | '1' - yes, but leave 'applet' and 'isindex' that currently cannot be transformed *^ |
377 | '2' - yes, removing 'applet' and 'isindex' elements and their contents (nested elements remain) ~^ | 377 | '2' - yes, removing 'applet' and 'isindex' elements and their contents (nested elements remain) ~^ |
378 | 378 | ||
379 | *named_entity* | 379 | *named_entity* |
380 | Allow non-universal named HTML entities, or convert to numeric ones; see section:- #3.2 | 380 | Allow non-universal named HTML entities, or convert to numeric ones; see section:- #3.2 |
381 | 381 | ||
382 | '0' - convert | 382 | '0' - convert |
383 | '1' - allow * | 383 | '1' - allow * |
384 | 384 | ||
385 | *no_deprecated_attr* | 385 | *no_deprecated_attr* |
386 | Allow deprecated attributes or transform them; see section:- #3.4.6 | 386 | Allow deprecated attributes or transform them; see section:- #3.4.6 |
387 | 387 | ||
388 | '0' - allow | 388 | '0' - allow |
389 | '1' - transform, but 'name' attributes for 'a' and 'map' are retained * | 389 | '1' - transform, but 'name' attributes for 'a' and 'map' are retained * |
390 | '2' - transform | 390 | '2' - transform |
391 | 391 | ||
392 | *parent* | 392 | *parent* |
393 | Name of the parent element, possibly imagined, that will hold the input; see section:- #3.3 | 393 | Name of the parent element, possibly imagined, that will hold the input; see section:- #3.3 |
394 | 394 | ||
395 | *safe* | 395 | *safe* |
396 | Magic parameter to make input the most secure against vulnerabilities like XSS without needing to specify other relevant '$config' parameters; see section:- #3.6 | 396 | Magic parameter to make input the most secure against vulnerabilities like XSS without needing to specify other relevant '$config' parameters; see section:- #3.6 |
397 | 397 | ||
398 | '0' - no * | 398 | '0' - no * |
399 | '1' - will auto-adjust other relevant '$config' parameters (indicated by '"' in this list) ^ | 399 | '1' - will auto-adjust other relevant '$config' parameters (indicated by '"' in this list) ^ |
400 | 400 | ||
401 | *schemes* | 401 | *schemes* |
402 | Array of attribute-specific, comma-separated, lower-cased list of schemes (protocols) allowed in attributes accepting URLs (or '!' to `deny` any URL); '*' covers all unspecified attributes; see section:- #3.4.3 | 402 | Array of attribute-specific, comma-separated, lower-cased list of schemes (protocols) allowed in attributes accepting URLs (or '!' to `deny` any URL); '*' covers all unspecified attributes; see section:- #3.4.3 |
403 | 403 | ||
404 | 'href: aim, app, feed, file, ftp, gopher, http, https, javascript, irc, mailto, news, nntp, sftp, ssh, tel, telnet; *:data, file, http, https, javascript' *^ | 404 | 'href: aim, app, feed, file, ftp, gopher, http, https, javascript, irc, mailto, news, nntp, sftp, ssh, tel, telnet; *:data, file, http, https, javascript' *^ |
405 | 'href: aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, tel, telnet; style: !; *:file, http, https' " | 405 | 'href: aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, tel, telnet; style: !; *:file, http, https' " |
406 | 406 | ||
407 | *show_setting* | 407 | *show_setting* |
408 | Name of a PHP variable to assign the `finalized` '$config' and '$spec' values; see section:- #3.8 | 408 | Name of a PHP variable to assign the `finalized` '$config' and '$spec' values; see section:- #3.8 |
409 | 409 | ||
410 | *style_pass* | 410 | *style_pass* |
411 | Ignore 'style' attribute values, letting them through without any alteration | 411 | Ignore 'style' attribute values, letting them through without any alteration |
412 | 412 | ||
413 | '0' - no * | 413 | '0' - no * |
414 | '1' - htmLawed will let through any 'style' value; see section:- #3.4.8 | 414 | '1' - htmLawed will let through any 'style' value; see section:- #3.4.8 |
415 | 415 | ||
416 | *tidy* | 416 | *tidy* |
417 | Beautify or compact HTML code; see section:- #3.3.5 | 417 | Beautify or compact HTML code; see section:- #3.3.5 |
418 | 418 | ||
419 | '-1' - compact | 419 | '-1' - compact |
420 | '0' - no * | 420 | '0' - no * |
421 | '1' or `string` - beautify (custom format specified by 'string') | 421 | '1' or `string` - beautify (custom format specified by 'string') |
422 | 422 | ||
423 | *unique_ids* | 423 | *unique_ids* |
424 | 'id' attribute value checks; see section:- #3.4.2 | 424 | 'id' attribute value checks; see section:- #3.4.2 |
425 | 425 | ||
426 | '0' - no | 426 | '0' - no |
427 | '1' - remove duplicate and/or invalid ones * | 427 | '1' - remove duplicate and/or invalid ones * |
428 | `word` - remove invalid ones and replace duplicate ones with new and unique ones based on the `word`; the admin-specified `word` cannot contain a space character | 428 | `word` - remove invalid ones and replace duplicate ones with new and unique ones based on the `word`; the admin-specified `word` cannot contain a space character |
429 | 429 | ||
430 | *valid_xhtml* | 430 | *valid_xhtml* |
431 | Magic parameter to make input the most valid XHTML without needing to specify other relevant '$config' parameters; see section:- #3.5 | 431 | Magic parameter to make input the most valid XHTML without needing to specify other relevant '$config' parameters; see section:- #3.5 |
432 | 432 | ||
433 | '0' - no * | 433 | '0' - no * |
434 | '1' - will auto-adjust other relevant '$config' parameters (indicated by '~' in this list) | 434 | '1' - will auto-adjust other relevant '$config' parameters (indicated by '~' in this list) |
435 | 435 | ||
436 | *xml:lang* | 436 | *xml:lang* |
437 | Auto-add 'xml:lang' attribute; see section:- #3.4.1 | 437 | Auto-add 'xml:lang' attribute; see section:- #3.4.1 |
438 | 438 | ||
439 | '0' - no * | 439 | '0' - no * |
440 | '1' - add if 'lang' attribute is present | 440 | '1' - add if 'lang' attribute is present |
441 | '2' - add if 'lang' attribute is present, and remove 'lang' ~ | 441 | '2' - add if 'lang' attribute is present, and remove 'lang' ~ |
442 | 442 | ||
443 | 443 | ||
444 | -- 2.3 Extra HTML specifications using the $spec parameter --------o | 444 | -- 2.3 Extra HTML specifications using the $spec parameter --------o |
445 | 445 | ||
446 | 446 | ||
447 | The '$spec' argument of htmLawed can be used to disallow an otherwise legal attribute for an element, or to restrict the attribute's values. This can also be helpful as a security measure (e.g., in certain versions of browsers, certain values can cause buffer overflows and denial of service attacks), or in enforcing admin policies. '$spec' is specified as a string of text containing one or more `rules`, with multiple rules separated from each other by a semi-colon (';'). E.g., | 447 | The '$spec' argument of htmLawed can be used to disallow an otherwise legal attribute for an element, or to restrict the attribute's values. This can also be helpful as a security measure (e.g., in certain versions of browsers, certain values can cause buffer overflows and denial of service attacks), or in enforcing admin policies. '$spec' is specified as a string of text containing one or more `rules`, with multiple rules separated from each other by a semi-colon (';'). E.g., |
448 | 448 | ||
449 | $spec = 'i=-*; td, tr=style, id, -*; a=id(match="/[a-z][a-z\d.:\-`"]*/i"/minval=2), href(maxlen=100/minlen=34); img=-width,-alt'; | 449 | $spec = 'i=-*; td, tr=style, id, -*; a=id(match="/[a-z][a-z\d.:\-`"]*/i"/minval=2), href(maxlen=100/minlen=34); img=-width,-alt'; |
450 | $processed = htmLawed($text, $config, $spec); | 450 | $processed = htmLawed($text, $config, $spec); |
451 | 451 | ||
452 | Or, | 452 | Or, |
453 | 453 | ||
454 | $processed = htmLawed($text, $config, 'i=-*; td, tr=style, id, -*; a=id(match="/[a-z][a-z\d.:\-`"]*/i"/minval=2), href(maxlen=100/minlen=34); img=-width,-alt'); | 454 | $processed = htmLawed($text, $config, 'i=-*; td, tr=style, id, -*; a=id(match="/[a-z][a-z\d.:\-`"]*/i"/minval=2), href(maxlen=100/minlen=34); img=-width,-alt'); |
455 | 455 | ||
456 | A rule begins with an HTML *element* name(s) (`rule-element`), for which the rule applies, followed by an equal-to (=) sign. A rule-element may represent multiple elements if comma (,)-separated element names are used. E.g., 'th,td,tr='. | 456 | A rule begins with an HTML *element* name(s) (`rule-element`), for which the rule applies, followed by an equal-to (=) sign. A rule-element may represent multiple elements if comma (,)-separated element names are used. E.g., 'th,td,tr='. |
457 | 457 | ||
458 | Rest of the rule consists of comma-separated HTML *attribute names*. A minus (-) character before an attribute means that the attribute is not permitted inside the rule-element. E.g., '-width'. To deny all attributes, '-*' can be used. | 458 | Rest of the rule consists of comma-separated HTML *attribute names*. A minus (-) character before an attribute means that the attribute is not permitted inside the rule-element. E.g., '-width'. To deny all attributes, '-*' can be used. |
459 | 459 | ||
460 | Following shows examples of rule excerpts with rule-element 'a' and the attributes that are being permitted: | 460 | Following shows examples of rule excerpts with rule-element 'a' and the attributes that are being permitted: |
461 | 461 | ||
462 | * 'a=' - all | 462 | * 'a=' - all |
463 | * 'a=id' - all | 463 | * 'a=id' - all |
464 | * 'a=href, title, -id, -onclick' - all except 'id' and 'onclick' | 464 | * 'a=href, title, -id, -onclick' - all except 'id' and 'onclick' |
465 | * 'a=*, id, -id' - all except 'id' | 465 | * 'a=*, id, -id' - all except 'id' |
466 | * 'a=-*' - none | 466 | * 'a=-*' - none |
467 | * 'a=-*, href, title' - none except 'href' and 'title' | 467 | * 'a=-*, href, title' - none except 'href' and 'title' |
468 | * 'a=-*, -id, href, title' - none except 'href' and 'title' | 468 | * 'a=-*, -id, href, title' - none except 'href' and 'title' |
469 | 469 | ||
470 | Rules regarding *attribute values* are optionally specified inside round brackets after attribute names in solidus (/)-separated `parameter = value` pairs. E.g., 'title(maxlen=30/minlen=5)'. None or one or more of the following parameters may be specified: | 470 | Rules regarding *attribute values* are optionally specified inside round brackets after attribute names in solidus (/)-separated `parameter = value` pairs. E.g., 'title(maxlen=30/minlen=5)'. None or one or more of the following parameters may be specified: |
471 | 471 | ||
472 | * 'oneof' - one or more choices separated by '|' that the value should match; if only one choice is provided, then the value must match that choice; matching is case-sensitive | 472 | * 'oneof' - one or more choices separated by '|' that the value should match; if only one choice is provided, then the value must match that choice; matching is case-sensitive |
473 | 473 | ||
474 | * 'noneof' - one or more choices separated by '|' that the value should not match; matching is case-sensitive | 474 | * 'noneof' - one or more choices separated by '|' that the value should not match; matching is case-sensitive |
475 | 475 | ||
476 | * 'maxlen' and 'minlen' - upper and lower limits for the number of characters in the attribute value; specified in numbers | 476 | * 'maxlen' and 'minlen' - upper and lower limits for the number of characters in the attribute value; specified in numbers |
477 | 477 | ||
478 | * 'maxval' and 'minval' - upper and lower limits for the numerical value specified in the attribute value; specified in numbers | 478 | * 'maxval' and 'minval' - upper and lower limits for the numerical value specified in the attribute value; specified in numbers |
479 | 479 | ||
480 | * 'match' and 'nomatch' - pattern that the attribute value should or should not match; specified as PHP/PCRE-compatible regular expressions with delimiters and possibly modifiers (e.g., to specify case-sensitivity for matching) | 480 | * 'match' and 'nomatch' - pattern that the attribute value should or should not match; specified as PHP/PCRE-compatible regular expressions with delimiters and possibly modifiers (e.g., to specify case-sensitivity for matching) |
481 | 481 | ||
482 | * 'default' - a value to force on the attribute if the value provided by the writer does not fit any of the specified parameters | 482 | * 'default' - a value to force on the attribute if the value provided by the writer does not fit any of the specified parameters |
483 | 483 | ||
484 | If 'default' is not set and the attribute value does not satisfy any of the specified parameters, then the attribute is removed. The 'default' value can also be used to force all attribute declarations to take the same value (by getting the values declared illegal by setting, e.g., 'maxlen' to '-1'). | 484 | If 'default' is not set and the attribute value does not satisfy any of the specified parameters, then the attribute is removed. The 'default' value can also be used to force all attribute declarations to take the same value (by getting the values declared illegal by setting, e.g., 'maxlen' to '-1'). |
485 | 485 | ||
486 | Examples with `input` '<input title="WIDTH" value="10em" /><input title="length" value="5" class="ic1 ic2" />' are shown below. | 486 | Examples with `input` '<input title="WIDTH" value="10em" /><input title="length" value="5" class="ic1 ic2" />' are shown below. |
487 | 487 | ||
488 | `Rule`: 'input=title(maxlen=60/minlen=6), value' | 488 | `Rule`: 'input=title(maxlen=60/minlen=6), value' |
489 | `Output`: '<input value="10em" /><input title="length" value="5" class="ic1 ic2" />' | 489 | `Output`: '<input value="10em" /><input title="length" value="5" class="ic1 ic2" />' |
490 | 490 | ||
491 | `Rule`: 'input=title(), value(maxval=8/default=6)' | 491 | `Rule`: 'input=title(), value(maxval=8/default=6)' |
492 | `Output`: '<input title="WIDTH" value="6" /><input title="length" value="5" class="ic1 ic2" />' | 492 | `Output`: '<input title="WIDTH" value="6" /><input title="length" value="5" class="ic1 ic2" />' |
493 | 493 | ||
494 | `Rule`: 'input=title(nomatch=%w.d%i), value(match=%em%/default=6em)' | 494 | `Rule`: 'input=title(nomatch=%w.d%i), value(match=%em%/default=6em)' |
495 | `Output`: '<input value="10em" /><input title="length" value="6em" class="ic1 ic2" />' | 495 | `Output`: '<input value="10em" /><input title="length" value="6em" class="ic1 ic2" />' |
496 | 496 | ||
497 | `Rule`: 'input=class(noneof=ic2|ic3/oneof=ic1|ic4), title(oneof=height|depth/default=depth), value(noneof=5|6)' | 497 | `Rule`: 'input=class(noneof=ic2|ic3/oneof=ic1|ic4), title(oneof=height|depth/default=depth), value(noneof=5|6)' |
498 | `Output`: '<input title="depth" value="10em" /><input title="depth" class="ic1" />' | 498 | `Output`: '<input title="depth" value="10em" /><input title="depth" class="ic1" />' |
499 | 499 | ||
500 | *Special characters*: The characters ';', ',', '/', '(', ')', '|', '~' and space have special meanings in the rules. Words in the rules that use such characters, or the characters themselves, should be `escaped` by enclosing in pairs of double-quotes ('"'). A back-tick ('`') can be used to escape a literal '"'. An example rule illustrating this is 'input=value(maxlen=30/match="/^\w/"/default="your `"ID`"")'. | 500 | *Special characters*: The characters ';', ',', '/', '(', ')', '|', '~' and space have special meanings in the rules. Words in the rules that use such characters, or the characters themselves, should be `escaped` by enclosing in pairs of double-quotes ('"'). A back-tick ('`') can be used to escape a literal '"'. An example rule illustrating this is 'input=value(maxlen=30/match="/^\w/"/default="your `"ID`"")'. |
501 | 501 | ||
502 | *Attributes that accept multiple values*: If an attribute is 'accesskey', 'class', 'itemtype' or 'rel', which can have multiple, space-separated values, or 'srcset', which can have multiple, comma-separated values, htmLawed will parse the attribute value for such multiple values and will individually test each of them. | 502 | *Attributes that accept multiple values*: If an attribute is 'accesskey', 'class', 'itemtype' or 'rel', which can have multiple, space-separated values, or 'srcset', which can have multiple, comma-separated values, htmLawed will parse the attribute value for such multiple values and will individually test each of them. |
503 | 503 | ||
504 | *Note*: To deny an attribute for all elements for which it is legal, '$config["deny_attribute"]' (see section:- #3.4) can be used instead of '$spec'. Also, attributes can be allowed element-specifically through '$spec' while being denied globally through '$config["deny_attribute"]'. The 'hook_tag' parameter (section:- #3.4.9) can also be possibly used to implement a functionality like that achieved using '$spec' functionality. | 504 | *Note*: To deny an attribute for all elements for which it is legal, '$config["deny_attribute"]' (see section:- #3.4) can be used instead of '$spec'. Also, attributes can be allowed element-specifically through '$spec' while being denied globally through '$config["deny_attribute"]'. The 'hook_tag' parameter (section:- #3.4.9) can also be possibly used to implement a functionality like that achieved using '$spec' functionality. |
505 | 505 | ||
506 | *Note*: Attributes' specifications for an element may be set through multiple rules. In case of conflict, the attribute specification in the first rule will get precedence. | 506 | *Note*: Attributes' specifications for an element may be set through multiple rules. In case of conflict, the attribute specification in the first rule will get precedence. |
507 | 507 | ||
508 | '$spec' can also be used to permit custom, non-standard attributes as well as custom rules for standard attributes. Thus, the following value of '$spec' will permit the custom uses of the standard 'rel' attribute in 'input' (not permitted as per standards) and of a non-standard attribute, 'vFlag', in 'img'. | 508 | '$spec' can also be used to permit custom, non-standard attributes as well as custom rules for standard attributes. Thus, the following value of '$spec' will permit the custom uses of the standard 'rel' attribute in 'input' (not permitted as per standards) and of a non-standard attribute, 'vFlag', in 'img'. |
509 | 509 | ||
510 | $spec = 'img=vFlag; input=rel' | 510 | $spec = 'img=vFlag; input=rel' |
511 | 511 | ||
512 | The attribute names must begin with an alphabet and cannot have space, equal-to (=) and solidus (/) characters. | 512 | The attribute names must begin with an alphabet and cannot have space, equal-to (=) and solidus (/) characters. |
513 | 513 | ||
514 | 514 | ||
515 | -- 2.4 Performance time & memory usage ----------------------------o | 515 | -- 2.4 Performance time & memory usage ----------------------------o |
516 | 516 | ||
517 | 517 | ||
518 | The time and memory consumed during text processing by htmLawed depends on its configuration, the size of the input, and the amount, nestedness and well-formedness of the HTML markup within the input. In particular, tag balancing and beautification each can increase the processing time by about a quarter. | 518 | The time and memory consumed during text processing by htmLawed depends on its configuration, the size of the input, and the amount, nestedness and well-formedness of the HTML markup within the input. In particular, tag balancing and beautification each can increase the processing time by about a quarter. |
519 | 519 | ||
520 | The htmLawed demo:- htmLawedTest.php can be used to evaluate the performance and effects of different types of input and '$config'. | 520 | The htmLawed demo:- htmLawedTest.php can be used to evaluate the performance and effects of different types of input and '$config'. |
521 | 521 | ||
522 | 522 | ||
523 | -- 2.5 Some security risks to keep in mind ------------------------o | 523 | -- 2.5 Some security risks to keep in mind ------------------------o |
524 | 524 | ||
525 | 525 | ||
526 | When setting the parameters/arguments (like those to allow certain HTML elements) for use with htmLawed, one should bear in mind that the setting may let through potentially `dangerous` HTML code which is meant to steal user-data, deface a website, render a page non-functional, etc. Unless end-users, either people or software, supplying the content are completely trusted, security issues arising from the degree of HTML usage permitted through htmLawed's setting should be considered. For example, following increase security risks: | 526 | When setting the parameters/arguments (like those to allow certain HTML elements) for use with htmLawed, one should bear in mind that the setting may let through potentially `dangerous` HTML code which is meant to steal user-data, deface a website, render a page non-functional, etc. Unless end-users, either people or software, supplying the content are completely trusted, security issues arising from the degree of HTML usage permitted through htmLawed's setting should be considered. For example, following increase security risks: |
527 | 527 | ||
528 | * Allowing 'script', 'applet', 'embed', 'iframe', 'canvas', 'audio', 'video' or 'object' elements, or certain of their attributes like 'allowscriptaccess' | 528 | * Allowing 'script', 'applet', 'embed', 'iframe', 'canvas', 'audio', 'video' or 'object' elements, or certain of their attributes like 'allowscriptaccess' |
529 | 529 | ||
530 | * Allowing HTML comments (some Internet Explorer versions are vulnerable with, e.g., '<!--[if gte IE 4]><script>alert("xss");</script><![endif]-->' | 530 | * Allowing HTML comments (some Internet Explorer versions are vulnerable with, e.g., '<!--[if gte IE 4]><script>alert("xss");</script><![endif]-->' |
531 | 531 | ||
532 | * Allowing dynamic CSS expressions (some Internet Explorer versions are vulnerable) | 532 | * Allowing dynamic CSS expressions (some Internet Explorer versions are vulnerable) |
533 | 533 | ||
534 | * Allowing the 'style' attribute | 534 | * Allowing the 'style' attribute |
535 | 535 | ||
536 | To remove `unsecure` HTML, code-developers using htmLawed must set '$config' appropriately. E.g., '$config["elements"] = "* -script"' to deny the 'script' element (section:- #3.3), '$config["safe"] = 1' to auto-configure ceratin htmLawed parameters for maximizing security (section:- #3.6), etc. | 536 | To remove `unsecure` HTML, code-developers using htmLawed must set '$config' appropriately. E.g., '$config["elements"] = "* -script"' to deny the 'script' element (section:- #3.3), '$config["safe"] = 1' to auto-configure ceratin htmLawed parameters for maximizing security (section:- #3.6), etc. |
537 | 537 | ||
538 | Permitting the '*style*' attribute brings in risks of `click-jacking`, `phishing`, web-page overlays, etc., `even` when the 'safe' parameter is enabled (see section:- #3.6). Except for URLs and a few other things like CSS dynamic expressions, htmLawed currently does not check every CSS style property. It does provide ways for the code-developer implementing htmLawed to do such checks through htmLawed's '$spec' argument, and through the 'hook_tag' parameter (see section:- #3.4.8 for more). Disallowing 'style' completely and relying on CSS classes and stylesheet files is recommended. | 538 | Permitting the '*style*' attribute brings in risks of `click-jacking`, `phishing`, web-page overlays, etc., `even` when the 'safe' parameter is enabled (see section:- #3.6). Except for URLs and a few other things like CSS dynamic expressions, htmLawed currently does not check every CSS style property. It does provide ways for the code-developer implementing htmLawed to do such checks through htmLawed's '$spec' argument, and through the 'hook_tag' parameter (see section:- #3.4.8 for more). Disallowing 'style' completely and relying on CSS classes and stylesheet files is recommended. |
539 | 539 | ||
540 | htmLawed does not check or correct the character *encoding* of the input it receives. In conjunction with permissive circumstances, such as when the character encoding is left undefined through HTTP headers or HTML 'meta' tags, this can allow for an exploit (like Google's `UTF-7/XSS` vulnerability of the past). | 540 | htmLawed does not check or correct the character *encoding* of the input it receives. In conjunction with permissive circumstances, such as when the character encoding is left undefined through HTTP headers or HTML 'meta' tags, this can allow for an exploit (like Google's `UTF-7/XSS` vulnerability of the past). |
541 | 541 | ||
542 | Ocassionally, though very rarely, the default settings with which htmLawed runs may change between different versions of htmLawed. Admins should keep this in mind when upgrading htmLawed. Important changes in htmLawed's default behavior in new releases of the software are noted in section:- #4.5 on upgrades. | 542 | Ocassionally, though very rarely, the default settings with which htmLawed runs may change between different versions of htmLawed. Admins should keep this in mind when upgrading htmLawed. Important changes in htmLawed's default behavior in new releases of the software are noted in section:- #4.5 on upgrades. |
543 | 543 | ||
544 | 544 | ||
545 | -- 2.6 Use with 'kses()' code -------------------------------------o | 545 | -- 2.6 Use with 'kses()' code -------------------------------------o |
546 | 546 | ||
547 | 547 | ||
548 | The 'Kses' PHP script for HTML filtering is used by many applications (like 'WordPress', as in year 2012). It is possible to have such applications use htmLawed instead, since it is compatible with code that calls the 'kses()' function declared in the 'Kses' file (usually named 'kses.php'). E.g., application code like this will continue to work after replacing 'Kses' with htmLawed: | 548 | The 'Kses' PHP script for HTML filtering is used by many applications (like 'WordPress', as in year 2012). It is possible to have such applications use htmLawed instead, since it is compatible with code that calls the 'kses()' function declared in the 'Kses' file (usually named 'kses.php'). E.g., application code like this will continue to work after replacing 'Kses' with htmLawed: |
549 | 549 | ||
550 | $comment_filtered = kses($comment_input, array('a'=>array(), 'b'=>array(), 'i'=>array())); | 550 | $comment_filtered = kses($comment_input, array('a'=>array(), 'b'=>array(), 'i'=>array())); |
551 | 551 | ||
552 | If the application uses a 'Kses' file that has the 'kses()' function declared, then, to have the application use htmLawed instead of 'Kses', rename 'htmLawed.php' (to 'kses.php', e.g.) and replace the 'Kses' file (or just replace the code in the 'Kses' file with the htmLawed code). If the 'kses()' function in the 'Kses' file had been renamed by the application developer (e.g., in 'WordPress', it is named 'wp_kses()'), then appropriately rename the 'kses()' function in the htmLawed code. Then, add the following code (which was a part of htmLawed prior to version 1.2): | 552 | If the application uses a 'Kses' file that has the 'kses()' function declared, then, to have the application use htmLawed instead of 'Kses', rename 'htmLawed.php' (to 'kses.php', e.g.) and replace the 'Kses' file (or just replace the code in the 'Kses' file with the htmLawed code). If the 'kses()' function in the 'Kses' file had been renamed by the application developer (e.g., in 'WordPress', it is named 'wp_kses()'), then appropriately rename the 'kses()' function in the htmLawed code. Then, add the following code (which was a part of htmLawed prior to version 1.2): |
553 | 553 | ||
554 | // kses compatibility | 554 | // kses compatibility |
555 | function kses($t, $h, $p=array('http', 'https', 'ftp', 'news', 'nntp', 'telnet', 'gopher', 'mailto')){ | 555 | function kses($t, $h, $p=array('http', 'https', 'ftp', 'news', 'nntp', 'telnet', 'gopher', 'mailto')){ |
556 | foreach($h as $k=>$v){ | 556 | foreach($h as $k=>$v){ |
557 | $h[$k]['n']['*'] = 1; | 557 | $h[$k]['n']['*'] = 1; |
558 | } | 558 | } |
559 | $C['cdata'] = $C['comment'] = $C['make_tag_strict'] = $C['no_deprecated_attr'] = $C['unique_ids'] = 0; | 559 | $C['cdata'] = $C['comment'] = $C['make_tag_strict'] = $C['no_deprecated_attr'] = $C['unique_ids'] = 0; |
560 | $C['keep_bad'] = 1; | 560 | $C['keep_bad'] = 1; |
561 | $C['elements'] = count($h) ? strtolower(implode(',', array_keys($h))) : '-*'; | 561 | $C['elements'] = count($h) ? strtolower(implode(',', array_keys($h))) : '-*'; |
562 | $C['hook'] = 'kses_hook'; | 562 | $C['hook'] = 'kses_hook'; |
563 | $C['schemes'] = '*:'. implode(',', $p); | 563 | $C['schemes'] = '*:'. implode(',', $p); |
564 | return htmLawed($t, $C, $h); | 564 | return htmLawed($t, $C, $h); |
565 | } | 565 | } |
566 | 566 | ||
567 | function kses_hook($t, &$C, &$S){ | 567 | function kses_hook($t, &$C, &$S){ |
568 | return $t; | 568 | return $t; |
569 | } | 569 | } |
570 | 570 | ||
571 | If the 'Kses' file used by the application has been significantly altered by the application developers, then one may need a different approach. E.g., with 'WordPress' (as in the year 2012), it is best to copy the htmLawed code, along with the above-mentioned additions, to 'wp_includes/kses.php', rename the newly added function 'kses()' to 'wp_kses()', and delete the code for the original 'wp_kses()' function. | 571 | If the 'Kses' file used by the application has been significantly altered by the application developers, then one may need a different approach. E.g., with 'WordPress' (as in the year 2012), it is best to copy the htmLawed code, along with the above-mentioned additions, to 'wp_includes/kses.php', rename the newly added function 'kses()' to 'wp_kses()', and delete the code for the original 'wp_kses()' function. |
572 | 572 | ||
573 | If the 'Kses' code has a non-empty hook function (e.g., 'wp_kses_hook()' in case of 'WordPress'), then the code for htmLawed's 'kses_hook()' function should be appropriately edited. However, the requirement of the hook function should be re-evaluated considering that htmLawed has extra capabilities. With 'WordPress', the hook function is an essential one. The following code is suggested for the htmLawed 'kses_hook()' in case of 'WordPress': | 573 | If the 'Kses' code has a non-empty hook function (e.g., 'wp_kses_hook()' in case of 'WordPress'), then the code for htmLawed's 'kses_hook()' function should be appropriately edited. However, the requirement of the hook function should be re-evaluated considering that htmLawed has extra capabilities. With 'WordPress', the hook function is an essential one. The following code is suggested for the htmLawed 'kses_hook()' in case of 'WordPress': |
574 | 574 | ||
575 | // kses compatibility | 575 | // kses compatibility |
576 | function kses_hook($string, &$cf, &$spec){ | 576 | function kses_hook($string, &$cf, &$spec){ |
577 | $allowed_html = $spec; | 577 | $allowed_html = $spec; |
578 | $allowed_protocols = array(); | 578 | $allowed_protocols = array(); |
579 | foreach($cf['schemes'] as $v){ | 579 | foreach($cf['schemes'] as $v){ |
580 | foreach($v as $k2=>$v2){ | 580 | foreach($v as $k2=>$v2){ |
581 | if(!in_array($k2, $allowed_protocols)){ | 581 | if(!in_array($k2, $allowed_protocols)){ |
582 | $allowed_protocols[] = $k2; | 582 | $allowed_protocols[] = $k2; |
583 | } | 583 | } |
584 | } | 584 | } |
585 | } | 585 | } |
586 | return wp_kses_hook($string, $allowed_html, $allowed_protocols); | 586 | return wp_kses_hook($string, $allowed_html, $allowed_protocols); |
587 | } | 587 | } |
588 | 588 | ||
589 | 589 | ||
590 | -- 2.7 Tolerance for ill-written HTML -----------------------------o | 590 | -- 2.7 Tolerance for ill-written HTML -----------------------------o |
591 | 591 | ||
592 | 592 | ||
593 | htmLawed can work with ill-written HTML code in the input. However, HTML that is too ill-written may not be `read` as HTML, and may therefore get identified as mere plain text. Following statements indicate the degree of `looseness` that htmLawed can work with, and can be provided in instructions to writers: | 593 | htmLawed can work with ill-written HTML code in the input. However, HTML that is too ill-written may not be `read` as HTML, and may therefore get identified as mere plain text. Following statements indicate the degree of `looseness` that htmLawed can work with, and can be provided in instructions to writers: |
594 | 594 | ||
595 | * Tags must be flanked by '<' and '>' with no '>' inside -- any needed '>' should be put in as '>'. It is possible for tag content (element name and attributes) to be spread over many lines instead of being on one. A space may be present between the tag content and '>', like '<div >' and '<img / >', but not after the '<'. | 595 | * Tags must be flanked by '<' and '>' with no '>' inside -- any needed '>' should be put in as '>'. It is possible for tag content (element name and attributes) to be spread over many lines instead of being on one. A space may be present between the tag content and '>', like '<div >' and '<img / >', but not after the '<'. |
596 | 596 | ||
597 | * Element and attribute names need not be lower-cased. | 597 | * Element and attribute names need not be lower-cased. |
598 | 598 | ||
599 | * Attribute string of elements may be liberally spaced with tabs, line-breaks, etc. | 599 | * Attribute string of elements may be liberally spaced with tabs, line-breaks, etc. |
600 | 600 | ||
601 | * Attribute values may be single- and not double-quoted. | 601 | * Attribute values may be single- and not double-quoted. |
602 | 602 | ||
603 | * Left-padding of numeric entities (like, ' ', '&x07ff;') with '0' is okay as long as the number of characters between between the '&' and the ';' does not exceed 8. All entities must end with ';' though. | 603 | * Left-padding of numeric entities (like, ' ', '&x07ff;') with '0' is okay as long as the number of characters between between the '&' and the ';' does not exceed 8. All entities must end with ';' though. |
604 | 604 | ||
605 | * Named character entities must be properly cased. Thus, '≪' or '&TILDE;' will not be recognized as entities and will be `neutralized`. | 605 | * Named character entities must be properly cased. Thus, '≪' or '&TILDE;' will not be recognized as entities and will be `neutralized`. |
606 | 606 | ||
607 | * HTML comments should not be inside element tags (they can be between tags), and should begin with '<!--' and end with '-->'. Characters like '<', '>', and '&' may be allowed inside depending on '$config', but any '-->' inside should be put in as '-->'. Any '--' inside will be automatically converted to '-', and a space will be added before the '-->' comment-closing marker unless '$config["comments"]' is set to '4' (section:- #3.3.1). | 607 | * HTML comments should not be inside element tags (they can be between tags), and should begin with '<!--' and end with '-->'. Characters like '<', '>', and '&' may be allowed inside depending on '$config', but any '-->' inside should be put in as '-->'. Any '--' inside will be automatically converted to '-', and a space will be added before the '-->' comment-closing marker unless '$config["comments"]' is set to '4' (section:- #3.3.1). |
608 | 608 | ||
609 | * 'CDATA' sections should not be inside element tags, and can be in element content only if plain text is allowed for that element. They should begin with '<[CDATA[' and end with ']]>'. Characters like '<', '>', and '&' may be allowed inside depending on '$config', but any ']]>' inside should be put in as ']]>'. | 609 | * 'CDATA' sections should not be inside element tags, and can be in element content only if plain text is allowed for that element. They should begin with '<[CDATA[' and end with ']]>'. Characters like '<', '>', and '&' may be allowed inside depending on '$config', but any ']]>' inside should be put in as ']]>'. |
610 | 610 | ||
611 | * For attribute values, character entities '<', '>' and '&' should be used instead of characters '<' and '>', and '&' (when '&' is not part of a character entity). This applies even for Javascript code in values of attributes like 'onclick'. | 611 | * For attribute values, character entities '<', '>' and '&' should be used instead of characters '<' and '>', and '&' (when '&' is not part of a character entity). This applies even for Javascript code in values of attributes like 'onclick'. |
612 | 612 | ||
613 | * Characters '<', '>', '&' and '"' that are part of actual Javascript, etc., code in 'script' elements should be used as such and not be put in as entities like '>'. Otherwise, though the HTML will be valid, the code may fail to work. Further, if such characters have to be used, then they should be put inside 'CDATA' sections. | 613 | * Characters '<', '>', '&' and '"' that are part of actual Javascript, etc., code in 'script' elements should be used as such and not be put in as entities like '>'. Otherwise, though the HTML will be valid, the code may fail to work. Further, if such characters have to be used, then they should be put inside 'CDATA' sections. |
614 | 614 | ||
615 | * Simple instructions like "an opening tag cannot be present between two closing tags" and "nested elements should be closed in the reverse order of how they were opened" can help authors write balanced HTML. If tags are imbalanced, htmLawed will try to balance them, but in the process, depending on '$config["keep_bad"]', some code/text may be lost. | 615 | * Simple instructions like "an opening tag cannot be present between two closing tags" and "nested elements should be closed in the reverse order of how they were opened" can help authors write balanced HTML. If tags are imbalanced, htmLawed will try to balance them, but in the process, depending on '$config["keep_bad"]', some code/text may be lost. |
616 | 616 | ||
617 | * Input authors should be notified of admin-specified allowed elements, attributes, configuration values (like conversion of named entities to numeric ones), etc. | 617 | * Input authors should be notified of admin-specified allowed elements, attributes, configuration values (like conversion of named entities to numeric ones), etc. |
618 | 618 | ||
619 | * With '$config["unique_ids"]' not '0' and the 'id' attribute being permitted, writers should carefully avoid using duplicate or invalid 'id' values as even though htmLawed will correct/remove the values, the final output may not be the one desired. E.g., when '<a id="home"></a><input id="home" /><label for="home"></label>' is processed into | 619 | * With '$config["unique_ids"]' not '0' and the 'id' attribute being permitted, writers should carefully avoid using duplicate or invalid 'id' values as even though htmLawed will correct/remove the values, the final output may not be the one desired. E.g., when '<a id="home"></a><input id="home" /><label for="home"></label>' is processed into |
620 | '<a id="home"></a><input id="prefix_home" /><label for="home"></label>'. | 620 | '<a id="home"></a><input id="prefix_home" /><label for="home"></label>'. |
621 | 621 | ||
622 | * Even if intended HTML is lost from an ill-written input, the processed output will be more secure and standard-compliant. | 622 | * Even if intended HTML is lost from an ill-written input, the processed output will be more secure and standard-compliant. |
623 | 623 | ||
624 | * For URLs, unless '$config["scheme"]' is appropriately set, writers should avoid using escape characters or entities in schemes. E.g., 'http' (which many browsers will read as the harmless 'http') may be considered bad by htmLawed. | 624 | * For URLs, unless '$config["scheme"]' is appropriately set, writers should avoid using escape characters or entities in schemes. E.g., 'http' (which many browsers will read as the harmless 'http') may be considered bad by htmLawed. |
625 | 625 | ||
626 | * htmLawed will attempt to put plain text present directly inside 'blockquote', 'form', 'map' and 'noscript' elements (illegal as per the specifications) inside auto-generated 'div' elements during tag balancing (section:- #3.3.3). | 626 | * htmLawed will attempt to put plain text present directly inside 'blockquote', 'form', 'map' and 'noscript' elements (illegal as per the specifications) inside auto-generated 'div' elements during tag balancing (section:- #3.3.3). |
627 | 627 | ||
628 | 628 | ||
629 | -- 2.8 Limitations & work-arounds ---------------------------------o | 629 | -- 2.8 Limitations & work-arounds ---------------------------------o |
630 | 630 | ||
631 | 631 | ||
632 | htmLawed's main objective is to make the input text `more` standard-compliant, secure for readers, and free of HTML elements and attributes considered undesirable by the administrator. Some of its current limitations, regardless of this objective, are noted below along with possible work-arounds. | 632 | htmLawed's main objective is to make the input text `more` standard-compliant, secure for readers, and free of HTML elements and attributes considered undesirable by the administrator. Some of its current limitations, regardless of this objective, are noted below along with possible work-arounds. |
633 | 633 | ||
634 | It should be borne in mind that no browser application is 100% standard-compliant, standard specifications continue to evolve, and many browsers accept commonly used non-standard HTML. Regarding security, note that `unsafe` HTML code is not legally invalid per se. | 634 | It should be borne in mind that no browser application is 100% standard-compliant, standard specifications continue to evolve, and many browsers accept commonly used non-standard HTML. Regarding security, note that `unsafe` HTML code is not legally invalid per se. |
635 | 635 | ||
636 | * By default, htmLawed will not strictly adhere to the `current` HTML standard. Admins can configure htmLawed to be more strict about standard compliance. Standard specification for HTML is continuously evolving. There are two bodies (W3C:- http://www.w3c.org and WHATWG:- http://www.whatwg.org) that specify the standard and their specifications are not identical. E.g., as in mid-2013, the 'border' attribute is valid in 'table' as per W3C but not WHATWG. Thus, htmLawed may not be fully compliant with the standard of a specific group. The HTML standards/rules that htmLawed uses in its logic are a mix of the W3C and WHATWG standards, and can be lax because of the laxity of HTML interpreters (browsers) regarding standards. | 636 | * By default, htmLawed will not strictly adhere to the `current` HTML standard. Admins can configure htmLawed to be more strict about standard compliance. Standard specification for HTML is continuously evolving. There are two bodies (W3C:- http://www.w3c.org and WHATWG:- http://www.whatwg.org) that specify the standard and their specifications are not identical. E.g., as in mid-2013, the 'border' attribute is valid in 'table' as per W3C but not WHATWG. Thus, htmLawed may not be fully compliant with the standard of a specific group. The HTML standards/rules that htmLawed uses in its logic are a mix of the W3C and WHATWG standards, and can be lax because of the laxity of HTML interpreters (browsers) regarding standards. |
637 | 637 | ||
638 | * In general, htmLawed processes input to generate output that is most likely to be standard-compatible in most users' browsers. Thus, for example, it does not enforce the required value of '0' on 'border' attribute of 'img' (an HTML version 5 specification). | 638 | * In general, htmLawed processes input to generate output that is most likely to be standard-compatible in most users' browsers. Thus, for example, it does not enforce the required value of '0' on 'border' attribute of 'img' (an HTML version 5 specification). |
639 | 639 | ||
640 | * htmLawed is meant for input that goes into the 'body' of HTML documents. HTML's head-level elements are not supported, nor are the frame-specific elements 'frameset', 'frame' and 'noframes'. However, content of the latter elements can be individually filtered through htmLawed. | 640 | * htmLawed is meant for input that goes into the 'body' of HTML documents. HTML's head-level elements are not supported, nor are the frame-specific elements 'frameset', 'frame' and 'noframes'. However, content of the latter elements can be individually filtered through htmLawed. |
641 | 641 | ||
642 | * It cannot handle input that has non-HTML code like 'SVG' and 'MathML'. One way around is to break the input into pieces and passing only those without non-HTML code to htmLawed. Another is described in section:- #3.9. A third way may be to some how take advantage of the '$config["and_mark"]' parameter (see section:- #3.2). | 642 | * It cannot handle input that has non-HTML code like 'SVG' and 'MathML'. One way around is to break the input into pieces and passing only those without non-HTML code to htmLawed. Another is described in section:- #3.9. A third way may be to some how take advantage of the '$config["and_mark"]' parameter (see section:- #3.2). |
643 | 643 | ||
644 | * By default, htmLawed won't check many attribute values for standard compliance. E.g., 'width="20m"' with the dimension in non-standard 'm' is let through. Implementing universal and strict attribute value checks can make htmLawed slow and resource-intensive. Admins should look at the 'hook_tag' parameter (section:- #3.4.9) or '$spec' to enforce finer checks on attribute values. | 644 | * By default, htmLawed won't check many attribute values for standard compliance. E.g., 'width="20m"' with the dimension in non-standard 'm' is let through. Implementing universal and strict attribute value checks can make htmLawed slow and resource-intensive. Admins should look at the 'hook_tag' parameter (section:- #3.4.9) or '$spec' to enforce finer checks on attribute values. |
645 | 645 | ||
646 | * By default, htmLawed considers all ARIA, data-*, event and microdata attributes as global attributes and permits them in all elements. This is not strictly standard-compliant. E.g., the 'itemtype' microdata attribute is permitted only in elements that also have the 'itemscope' attribute. Admins can configure htmLawed to be more strict about this (section:- #2.3). | 646 | * By default, htmLawed considers all ARIA, data-*, event and microdata attributes as global attributes and permits them in all elements. This is not strictly standard-compliant. E.g., the 'itemtype' microdata attribute is permitted only in elements that also have the 'itemscope' attribute. Admins can configure htmLawed to be more strict about this (section:- #2.3). |
647 | 647 | ||
648 | * The attributes, deprecated (which can be transformed too) or not, that it supports are largely those that are in the specifications. Only a few of the proprietary attributes are supported. However, '$spec' can be used to allow custom attributes (section:- #2.3). | 648 | * The attributes, deprecated (which can be transformed too) or not, that it supports are largely those that are in the specifications. Only a few of the proprietary attributes are supported. However, '$spec' can be used to allow custom attributes (section:- #2.3). |
649 | 649 | ||
650 | * Except for contained URLs and dynamic expressions (also optional), htmLawed does not check CSS style property values. Admins should look at using the 'hook_tag' parameter (section:- #3.4.9) or '$spec' for finer checks. Perhaps the best option is to disallow 'style' but allow 'class' attributes with the right 'oneof' or 'match' values for 'class', and have the various class style properties in '.css' CSS stylesheet files. | 650 | * Except for contained URLs and dynamic expressions (also optional), htmLawed does not check CSS style property values. Admins should look at using the 'hook_tag' parameter (section:- #3.4.9) or '$spec' for finer checks. Perhaps the best option is to disallow 'style' but allow 'class' attributes with the right 'oneof' or 'match' values for 'class', and have the various class style properties in '.css' CSS stylesheet files. |
651 | 651 | ||
652 | * htmLawed does not parse emoticons, decode `BBcode`, or `wikify`, auto-converting text to proper HTML. Similarly, it won't convert line-breaks to 'br' elements. Such functions are beyond its purview. Admins should use other code to pre- or post-process the input for such purposes. | 652 | * htmLawed does not parse emoticons, decode `BBcode`, or `wikify`, auto-converting text to proper HTML. Similarly, it won't convert line-breaks to 'br' elements. Such functions are beyond its purview. Admins should use other code to pre- or post-process the input for such purposes. |
653 | 653 | ||
654 | * htmLawed cannot be used to have links force-opened in new windows (by auto-adding appropriate 'target' and 'onclick' attributes to 'a'). Admins should look at Javascript-based DOM-modifying solutions for this. Admins may also be able to use a custom hook function to enforce such checks ('hook_tag' parameter; see section:- #3.4.9). | 654 | * htmLawed cannot be used to have links force-opened in new windows (by auto-adding appropriate 'target' and 'onclick' attributes to 'a'). Admins should look at Javascript-based DOM-modifying solutions for this. Admins may also be able to use a custom hook function to enforce such checks ('hook_tag' parameter; see section:- #3.4.9). |
655 | 655 | ||
656 | * Nesting-based checks are not possible. E.g., one cannot disallow 'p' elements specifically inside 'td' while permitting it elsewhere. Admins may be able to use a custom hook function to enforce such checks ('hook_tag' parameter; see section:- #3.4.9). | 656 | * Nesting-based checks are not possible. E.g., one cannot disallow 'p' elements specifically inside 'td' while permitting it elsewhere. Admins may be able to use a custom hook function to enforce such checks ('hook_tag' parameter; see section:- #3.4.9). |
657 | 657 | ||
658 | * Except for optionally converting absolute or relative URLs to the other type, htmLawed will not alter URLs (e.g., to change the value of query strings or to convert 'http' to 'https'. Having absolute URLs may be a standard-requirement, e.g., when HTML is embedded in email messages, whereas altering URLs for other purposes is beyond htmLawed's goals. Admins may be able to use a custom hook function to enforce such checks ('hook_tag' parameter; see section:- #3.4.9). | 658 | * Except for optionally converting absolute or relative URLs to the other type, htmLawed will not alter URLs (e.g., to change the value of query strings or to convert 'http' to 'https'. Having absolute URLs may be a standard-requirement, e.g., when HTML is embedded in email messages, whereas altering URLs for other purposes is beyond htmLawed's goals. Admins may be able to use a custom hook function to enforce such checks ('hook_tag' parameter; see section:- #3.4.9). |
659 | 659 | ||
660 | * Pairs of opening and closing tags that do not enclose any content (like '<em></em>') are not removed. This may be against the standard specification for certain elements (e.g., 'table'). However, presence of such standard-incompliant code will not break the display or layout of content. Admins can also use simple regex-based code to filter out such code. | 660 | * Pairs of opening and closing tags that do not enclose any content (like '<em></em>') are not removed. This may be against the standard specification for certain elements (e.g., 'table'). However, presence of such standard-incompliant code will not break the display or layout of content. Admins can also use simple regex-based code to filter out such code. |
661 | 661 | ||
662 | * htmLawed does not check for certain element orderings described in the standard specifications (e.g., in a 'table', 'tbody' is allowed before 'tfoot'). Admins may be able to use a custom hook function to enforce such checks ('hook_tag' parameter; see section:- #3.4.9). | 662 | * htmLawed does not check for certain element orderings described in the standard specifications (e.g., in a 'table', 'tbody' is allowed before 'tfoot'). Admins may be able to use a custom hook function to enforce such checks ('hook_tag' parameter; see section:- #3.4.9). |
663 | 663 | ||
664 | * htmLawed does not check the number of nested elements. E.g., it will allow two 'caption' elements in a 'table' element, illegal as per standard specifications. Admins may be able to use a custom hook function to enforce such checks ('hook_tag' parameter; see section:- #3.4.9). | 664 | * htmLawed does not check the number of nested elements. E.g., it will allow two 'caption' elements in a 'table' element, illegal as per standard specifications. Admins may be able to use a custom hook function to enforce such checks ('hook_tag' parameter; see section:- #3.4.9). |
665 | 665 | ||
666 | * There are multiple ways to interpret ill-written HTML. E.g., in '<small><small>text</small>', is it that the second closing tag for 'small' is missing or is it that the second opening tag for 'small' was put in by mistake? htmLawed corrects the HTML in the string assuming the former, while the user may have intended the string for the latter. This is an issue that is impossible to address perfectly. | 666 | * There are multiple ways to interpret ill-written HTML. E.g., in '<small><small>text</small>', is it that the second closing tag for 'small' is missing or is it that the second opening tag for 'small' was put in by mistake? htmLawed corrects the HTML in the string assuming the former, while the user may have intended the string for the latter. This is an issue that is impossible to address perfectly. |
667 | 667 | ||
668 | * htmLawed might convert certain entities to actual characters and remove backslashes and CSS comment-markers ('/*') in 'style' attribute values in order to detect malicious HTML like crafted, Internet Explorer browser-specific dynamic expressions like 'expression...'. If this is too harsh, admins can allow CSS expressions through htmLawed core but then use a custom function through the 'hook_tag' parameter (section:- #3.4.9) to more specifically identify CSS expressions in the 'style' attribute values. Also, using '$config["style_pass"]', it is possible to have htmLawed pass 'style' attribute values without even looking at them (section:- #3.4.8). | 668 | * htmLawed might convert certain entities to actual characters and remove backslashes and CSS comment-markers ('/*') in 'style' attribute values in order to detect malicious HTML like crafted, Internet Explorer browser-specific dynamic expressions like 'expression...'. If this is too harsh, admins can allow CSS expressions through htmLawed core but then use a custom function through the 'hook_tag' parameter (section:- #3.4.9) to more specifically identify CSS expressions in the 'style' attribute values. Also, using '$config["style_pass"]', it is possible to have htmLawed pass 'style' attribute values without even looking at them (section:- #3.4.8). |
669 | 669 | ||
670 | * htmLawed does not correct certain possible attribute-based security vulnerabilities (e.g., '<a href="http://x%22+style=%22background-image:xss">x</a>'). These arise when browsers mis-identify markup in `escaped` text, defeating the very purpose of escaping text (a bad browser will read the given example as '<a href="http://x" style="background-image:xss">x</a>'). | 670 | * htmLawed does not correct certain possible attribute-based security vulnerabilities (e.g., '<a href="http://x%22+style=%22background-image:xss">x</a>'). These arise when browsers mis-identify markup in `escaped` text, defeating the very purpose of escaping text (a bad browser will read the given example as '<a href="http://x" style="background-image:xss">x</a>'). |
671 | 671 | ||
672 | * Because of poor Unicode support in PHP, htmLawed does not remove the `high value` HTML-invalid characters with multi-byte code-points. Such characters however are extremely unlikely to be in the input. (see section:- #3.1). | 672 | * Because of poor Unicode support in PHP, htmLawed does not remove the `high value` HTML-invalid characters with multi-byte code-points. Such characters however are extremely unlikely to be in the input. (see section:- #3.1). |
673 | 673 | ||
674 | * htmLawed does not check or correct the character encoding of the input it receives. In conjunction with permitting circumstances such as when the character encoding is left undefined through HTTP headers or HTML 'meta' tags, this can permit an exploit (like Google's `UTF-7/XSS` vulnerability of the past). Also, htmLawed can mangle input text if it is not well-formed in terms of character encoding. Administrators can consider using code available elsewhere to check well-formedness of input text characters to correct any defect. | 674 | * htmLawed does not check or correct the character encoding of the input it receives. In conjunction with permitting circumstances such as when the character encoding is left undefined through HTTP headers or HTML 'meta' tags, this can permit an exploit (like Google's `UTF-7/XSS` vulnerability of the past). Also, htmLawed can mangle input text if it is not well-formed in terms of character encoding. Administrators can consider using code available elsewhere to check well-formedness of input text characters to correct any defect. |
675 | 675 | ||
676 | * htmLawed is expected to work with input texts in ASCII standard-compatible single-byte encodings such as national variants of ASCII (like ISO-646-DE/German of the ISO 646 standard), extended ASCII variants (like ISO 8859-10/Turkish of the ISO 8859/ISO Latin standard), ISO 8859-based Windows variants (like Windows 1252), EBCDIC, Shift JIS (Japanese), GB-Roman (Chinese), and KS-Roman (Korean). It should also properly handle texts with variable-byte encodings like UTF-7 (Unicode) and UTF-8 (Unicode). However, htmLawed may mangle input texts with double-byte encodings like UTF-16 (Unicode), JIS X 0208:1997 (Japanese) and K SX 1001:1992 (Korean), or the UTF-32 (Unicode) quadruple-byte encoding. If an input text has such an encoding, administrators can use PHP's iconv:- http://php.net/manual/en/book.iconv.php functions, or some other mean, to convert text to UTF-8 before passing it to htmLawed. | 676 | * htmLawed is expected to work with input texts in ASCII standard-compatible single-byte encodings such as national variants of ASCII (like ISO-646-DE/German of the ISO 646 standard), extended ASCII variants (like ISO 8859-10/Turkish of the ISO 8859/ISO Latin standard), ISO 8859-based Windows variants (like Windows 1252), EBCDIC, Shift JIS (Japanese), GB-Roman (Chinese), and KS-Roman (Korean). It should also properly handle texts with variable-byte encodings like UTF-7 (Unicode) and UTF-8 (Unicode). However, htmLawed may mangle input texts with double-byte encodings like UTF-16 (Unicode), JIS X 0208:1997 (Japanese) and K SX 1001:1992 (Korean), or the UTF-32 (Unicode) quadruple-byte encoding. If an input text has such an encoding, administrators can use PHP's iconv:- http://php.net/manual/en/book.iconv.php functions, or some other mean, to convert text to UTF-8 before passing it to htmLawed. |
677 | 677 | ||
678 | * Like any script using PHP's PCRE regex functions, PHP setup-specific low PCRE limit values can cause htmLawed to at least partially fail with very long input texts. | 678 | * Like any script using PHP's PCRE regex functions, PHP setup-specific low PCRE limit values can cause htmLawed to at least partially fail with very long input texts. |
679 | 679 | ||
680 | 680 | ||
681 | -- 2.9 Examples of usage ------------------------------------------o | 681 | -- 2.9 Examples of usage ------------------------------------------o |
682 | 682 | ||
683 | 683 | ||
684 | Safest, allowing only `safe` HTML markup -- | 684 | Safest, allowing only `safe` HTML markup -- |
685 | 685 | ||
686 | $config = array('safe'=>1); | 686 | $config = array('safe'=>1); |
687 | $out = htmLawed($in, $config); | 687 | $out = htmLawed($in, $config); |
688 | 688 | ||
689 | Simplest, allowing all valid HTML markup including Javascript -- | 689 | Simplest, allowing all valid HTML markup including Javascript -- |
690 | 690 | ||
691 | $out = htmLawed($in); | 691 | $out = htmLawed($in); |
692 | 692 | ||
693 | Allowing all valid HTML markup but restricting URL schemes in 'src' attribute values to 'http' and 'https' -- | 693 | Allowing all valid HTML markup but restricting URL schemes in 'src' attribute values to 'http' and 'https' -- |
694 | 694 | ||
695 | $config = array('schemes'=>'*:*; src:http, https'); | 695 | $config = array('schemes'=>'*:*; src:http, https'); |
696 | $out = htmLawed($in, $config); | 696 | $out = htmLawed($in, $config); |
697 | 697 | ||
698 | Allowing only 'safe' HTML and the elements 'a', 'em', and 'strong' -- | 698 | Allowing only 'safe' HTML and the elements 'a', 'em', and 'strong' -- |
699 | 699 | ||
700 | $config = array('safe'=>1, 'elements'=>'a, em, strong'); | 700 | $config = array('safe'=>1, 'elements'=>'a, em, strong'); |
701 | $out = htmLawed($in, $config); | 701 | $out = htmLawed($in, $config); |
702 | 702 | ||
703 | Not allowing elements 'script' and 'object' -- | 703 | Not allowing elements 'script' and 'object' -- |
704 | 704 | ||
705 | $config = array('elements'=>'* -script -object'); | 705 | $config = array('elements'=>'* -script -object'); |
706 | $out = htmLawed($in, $config); | 706 | $out = htmLawed($in, $config); |
707 | 707 | ||
708 | Not allowing attributes 'id' and 'style' -- | 708 | Not allowing attributes 'id' and 'style' -- |
709 | 709 | ||
710 | $config = array('deny_attribute'=>'id, style'); | 710 | $config = array('deny_attribute'=>'id, style'); |
711 | $out = htmLawed($in, $config); | 711 | $out = htmLawed($in, $config); |
712 | 712 | ||
713 | Permitting only attributes 'title' and 'href' -- | 713 | Permitting only attributes 'title' and 'href' -- |
714 | 714 | ||
715 | $config = array('deny_attribute'=>'* -title -href'); | 715 | $config = array('deny_attribute'=>'* -title -href'); |
716 | $out = htmLawed($in, $config); | 716 | $out = htmLawed($in, $config); |
717 | 717 | ||
718 | Remove bad/disallowed tags altogether instead of converting them to entities -- | 718 | Remove bad/disallowed tags altogether instead of converting them to entities -- |
719 | 719 | ||
720 | $config = array('keep_bad'=>0); | 720 | $config = array('keep_bad'=>0); |
721 | $out = htmLawed($in, $config); | 721 | $out = htmLawed($in, $config); |
722 | 722 | ||
723 | Allowing attribute 'title' only in 'a' and not allowing attributes 'id', 'style', or scriptable `on*` attributes like 'onclick' -- | 723 | Allowing attribute 'title' only in 'a' and not allowing attributes 'id', 'style', or scriptable `on*` attributes like 'onclick' -- |
724 | 724 | ||
725 | $config = array('deny_attribute'=>'title, id, style, on*'); | 725 | $config = array('deny_attribute'=>'title, id, style, on*'); |
726 | $spec = 'a=title'; | 726 | $spec = 'a=title'; |
727 | $out = htmLawed($in, $config, $spec); | 727 | $out = htmLawed($in, $config, $spec); |
728 | 728 | ||
729 | Allowing a custom attribute, 'vFlag', in 'img' and permitting custom use of the standard attribute, 'rel', in 'input' -- | 729 | Allowing a custom attribute, 'vFlag', in 'img' and permitting custom use of the standard attribute, 'rel', in 'input' -- |
730 | 730 | ||
731 | $spec = 'img=vFlag; input=rel'; | 731 | $spec = 'img=vFlag; input=rel'; |
732 | $out = htmLawed($in, $config, $spec); | 732 | $out = htmLawed($in, $config, $spec); |
733 | 733 | ||
734 | Some case-studies are presented below. | 734 | Some case-studies are presented below. |
735 | 735 | ||
736 | *1.* A blog administrator wants to allow only 'a', 'em', 'strike', 'strong' and 'u' in comments, but needs 'strike' and 'u' transformed to 'span' for better XHTML 1-strict compliance, and, he wants the 'a' links to point only to 'http' or 'https' resources: | 736 | *1.* A blog administrator wants to allow only 'a', 'em', 'strike', 'strong' and 'u' in comments, but needs 'strike' and 'u' transformed to 'span' for better XHTML 1-strict compliance, and, he wants the 'a' links to point only to 'http' or 'https' resources: |
737 | 737 | ||
738 | $processed = htmLawed($in, array('elements'=>'a, em, strike, strong, u', 'make_tag_strict'=>1, 'safe'=>1, 'schemes'=>'*:http, https'), 'a=href'); | 738 | $processed = htmLawed($in, array('elements'=>'a, em, strike, strong, u', 'make_tag_strict'=>1, 'safe'=>1, 'schemes'=>'*:http, https'), 'a=href'); |
739 | 739 | ||
740 | *2.* An author uses a custom-made web application to load content on his website. He is the only one using that application and the content he generates has all types of HTML, including scripts. The web application uses htmLawed primarily as a tool to correct errors that creep in while writing HTML and to take care of the occasional `bad` characters in copy-paste text introduced by Microsoft Office. The web application provides a preview before submitted input is added to the content. For the previewing process, htmLawed is set up as follows: | 740 | *2.* An author uses a custom-made web application to load content on his website. He is the only one using that application and the content he generates has all types of HTML, including scripts. The web application uses htmLawed primarily as a tool to correct errors that creep in while writing HTML and to take care of the occasional `bad` characters in copy-paste text introduced by Microsoft Office. The web application provides a preview before submitted input is added to the content. For the previewing process, htmLawed is set up as follows: |
741 | 741 | ||
742 | $processed = htmLawed($in, array('css_expression'=>1, 'keep_bad'=>1, 'make_tag_strict'=>1, 'schemes'=>'*:*', 'valid_xhtml'=>1)); | 742 | $processed = htmLawed($in, array('css_expression'=>1, 'keep_bad'=>1, 'make_tag_strict'=>1, 'schemes'=>'*:*', 'valid_xhtml'=>1)); |
743 | 743 | ||
744 | For the final submission process, 'keep_bad' is set to '6'. A value of '1' for the preview process allows the author to note and correct any HTML mistake without losing any of the typed text. | 744 | For the final submission process, 'keep_bad' is set to '6'. A value of '1' for the preview process allows the author to note and correct any HTML mistake without losing any of the typed text. |
745 | 745 | ||
746 | *3.* A data-miner is scraping information in a specific table of similar web-pages and is collating the data rows, and uses htmLawed to reduce unnecessary markup and white-spaces: | 746 | *3.* A data-miner is scraping information in a specific table of similar web-pages and is collating the data rows, and uses htmLawed to reduce unnecessary markup and white-spaces: |
747 | 747 | ||
748 | $processed = htmLawed($in, array('elements'=>'tr, td', 'tidy'=>-1), 'tr, td ='); | 748 | $processed = htmLawed($in, array('elements'=>'tr, td', 'tidy'=>-1), 'tr, td ='); |
749 | 749 | ||
750 | 750 | ||
751 | == 3 Details =====================================================oo | 751 | == 3 Details =====================================================oo |
752 | 752 | ||
753 | 753 | ||
754 | -- 3.1 Invalid/dangerous characters -------------------------------- | 754 | -- 3.1 Invalid/dangerous characters -------------------------------- |
755 | 755 | ||
756 | 756 | ||
757 | Valid characters (more correctly, their code-points) in HTML or XML are, hexadecimally, '9', 'a', 'd', '20' to 'd7ff', and 'e000' to '10ffff', except 'fffe' and 'ffff' (decimally, '9', '10', '13', '32' to '55295', and '57344' to '1114111', except '65534' and '65535'). htmLawed removes the invalid characters '0' to '8', 'b', 'c', and 'e' to '1f'. | 757 | Valid characters (more correctly, their code-points) in HTML or XML are, hexadecimally, '9', 'a', 'd', '20' to 'd7ff', and 'e000' to '10ffff', except 'fffe' and 'ffff' (decimally, '9', '10', '13', '32' to '55295', and '57344' to '1114111', except '65534' and '65535'). htmLawed removes the invalid characters '0' to '8', 'b', 'c', and 'e' to '1f'. |
758 | 758 | ||
759 | Because of PHP's poor native support for multi-byte characters, htmLawed cannot check for the remaining invalid code-points. However, for various reasons, it is very unlikely for any of those characters to be in the input. | 759 | Because of PHP's poor native support for multi-byte characters, htmLawed cannot check for the remaining invalid code-points. However, for various reasons, it is very unlikely for any of those characters to be in the input. |
760 | 760 | ||
761 | Characters that are discouraged (see section:- #5.1) but not invalid are not removed by htmLawed. | 761 | Characters that are discouraged (see section:- #5.1) but not invalid are not removed by htmLawed. |
762 | 762 | ||
763 | It (function 'hl_tag()') also replaces the potentially dangerous (in some Mozilla [Firefox] and Opera browsers) soft-hyphen character (code-point, hexadecimally, 'ad', or decimally, '173') in attribute values with spaces. Where required, the characters '<', '>', '&', and '"' are converted to entities. | 763 | It (function 'hl_tag()') also replaces the potentially dangerous (in some Mozilla [Firefox] and Opera browsers) soft-hyphen character (code-point, hexadecimally, 'ad', or decimally, '173') in attribute values with spaces. Where required, the characters '<', '>', '&', and '"' are converted to entities. |
764 | 764 | ||
765 | With '$config["clean_ms_char"]' set as '1' or '2', many of the discouraged characters (decimal code-points '127' to '159' except '133') that many Microsoft applications incorrectly use (as per the 'Windows 1252' ['Cp-1252'] or a similar encoding system), and the character for decimal code-point '133', are converted to appropriate decimal numerical entities (or removed for a few cases)-- see appendix in section:- #5.4. This can help avoid some display issues arising from copying-pasting of content. | 765 | With '$config["clean_ms_char"]' set as '1' or '2', many of the discouraged characters (decimal code-points '127' to '159' except '133') that many Microsoft applications incorrectly use (as per the 'Windows 1252' ['Cp-1252'] or a similar encoding system), and the character for decimal code-point '133', are converted to appropriate decimal numerical entities (or removed for a few cases)-- see appendix in section:- #5.4. This can help avoid some display issues arising from copying-pasting of content. |
766 | 766 | ||
767 | With '$config["clean_ms_char"]' set as '2', characters for the hexadecimal code-points '82', '91', and '92' (for special single-quotes), and '84', '93', and '94' (for special double-quotes) are converted to ordinary single and double quotes respectively and not to entities. | 767 | With '$config["clean_ms_char"]' set as '2', characters for the hexadecimal code-points '82', '91', and '92' (for special single-quotes), and '84', '93', and '94' (for special double-quotes) are converted to ordinary single and double quotes respectively and not to entities. |
768 | 768 | ||
769 | The character values are replaced with entities/characters and not character values referred to by the entities/characters to keep this task independent of the character-encoding of input text. | 769 | The character values are replaced with entities/characters and not character values referred to by the entities/characters to keep this task independent of the character-encoding of input text. |
770 | 770 | ||
771 | The '$config["clean_ms_char"]' parameter should not be used if authors do not copy-paste Microsoft-created text, or if the input text is not believed to use the 'Windows 1252' ('Cp-1252') or a similar encoding like 'Cp-1251' (otherwise, for example when UTF-8 encoding is in use, Japanese or Korean characters can get mangled). Further, the input form and the web-pages displaying it or its content should have the character encoding appropriately marked-up. | 771 | The '$config["clean_ms_char"]' parameter should not be used if authors do not copy-paste Microsoft-created text, or if the input text is not believed to use the 'Windows 1252' ('Cp-1252') or a similar encoding like 'Cp-1251' (otherwise, for example when UTF-8 encoding is in use, Japanese or Korean characters can get mangled). Further, the input form and the web-pages displaying it or its content should have the character encoding appropriately marked-up. |
772 | 772 | ||
773 | 773 | ||
774 | -- 3.2 Character references/entities ------------------------------o | 774 | -- 3.2 Character references/entities ------------------------------o |
775 | 775 | ||
776 | 776 | ||
777 | Valid character entities take the form '&*;' where '*' is '#x' followed by a hexadecimal number (hexadecimal numeric entity; like ' ' for non-breaking space), or alphanumeric like 'gt' (external or named entity; like ' ' for non-breaking space), or '#' followed by a number (decimal numeric entity; like ' ' for non-breaking space). Character entities referring to the soft-hyphen character (the '­' or '\xad' character; hexadecimal code-point 'ad' [decimal '173']) in URL-accepting attribute values are always replaced with spaces; soft-hyphens in attribute values introduce vulnerabilities in some older versions of the Opera and Mozilla [Firefox] browsers. | 777 | Valid character entities take the form '&*;' where '*' is '#x' followed by a hexadecimal number (hexadecimal numeric entity; like ' ' for non-breaking space), or alphanumeric like 'gt' (external or named entity; like ' ' for non-breaking space), or '#' followed by a number (decimal numeric entity; like ' ' for non-breaking space). Character entities referring to the soft-hyphen character (the '­' or '\xad' character; hexadecimal code-point 'ad' [decimal '173']) in URL-accepting attribute values are always replaced with spaces; soft-hyphens in attribute values introduce vulnerabilities in some older versions of the Opera and Mozilla [Firefox] browsers. |
778 | 778 | ||
779 | htmLawed (function 'hl_ent()'): | 779 | htmLawed (function 'hl_ent()'): |
780 | 780 | ||
781 | * Neutralizes entities with multiple leading zeroes or missing semi-colons (potentially dangerous) | 781 | * Neutralizes entities with multiple leading zeroes or missing semi-colons (potentially dangerous) |
782 | 782 | ||
783 | * Lowercases the 'X' (for XML-compliance) and 'A-F' of hexadecimal numeric entities | 783 | * Lowercases the 'X' (for XML-compliance) and 'A-F' of hexadecimal numeric entities |
784 | 784 | ||
785 | * Neutralizes entities referring to characters that are HTML-invalid (see section:- #3.1) | 785 | * Neutralizes entities referring to characters that are HTML-invalid (see section:- #3.1) |
786 | 786 | ||
787 | * Neutralizes entities referring to characters that are HTML-discouraged (code-points, hexadecimally, '7f' to '84', '86' to '9f', and 'fdd0' to 'fddf', or decimally, '127' to '132', '134' to '159', and '64991' to '64976'). Entities referring to the remaining discouraged characters (see section:- #5.1 for a full list) are let through. | 787 | * Neutralizes entities referring to characters that are HTML-discouraged (code-points, hexadecimally, '7f' to '84', '86' to '9f', and 'fdd0' to 'fddf', or decimally, '127' to '132', '134' to '159', and '64991' to '64976'). Entities referring to the remaining discouraged characters (see section:- #5.1 for a full list) are let through. |
788 | 788 | ||
789 | * Neutralizes named entities that are not in the specifications | 789 | * Neutralizes named entities that are not in the specifications |
790 | 790 | ||
791 | * Optionally converts valid HTML-specific named entities except '>', '<', '"', and '&' to decimal numeric ones (hexadecimal if $config["hexdec_entity"] is '2') for generic XML-compliance. For this, '$config["named_entity"]' should be '1'. | 791 | * Optionally converts valid HTML-specific named entities except '>', '<', '"', and '&' to decimal numeric ones (hexadecimal if $config["hexdec_entity"] is '2') for generic XML-compliance. For this, '$config["named_entity"]' should be '1'. |
792 | 792 | ||
793 | * Optionally converts hexadecimal numeric entities to the more widely supported decimal ones. For this, '$config["hexdec_entity"]' should be '0'. | 793 | * Optionally converts hexadecimal numeric entities to the more widely supported decimal ones. For this, '$config["hexdec_entity"]' should be '0'. |
794 | 794 | ||
795 | * Optionally converts decimal numeric entities to the hexadecimal ones. For this, '$config["hexdec_entity"]' should be '2'. | 795 | * Optionally converts decimal numeric entities to the hexadecimal ones. For this, '$config["hexdec_entity"]' should be '2'. |
796 | 796 | ||
797 | `Neutralization` refers to the `entitification` of '&' to '&'. | 797 | `Neutralization` refers to the `entitification` of '&' to '&'. |
798 | 798 | ||
799 | *Note*: htmLawed does not convert entities to the actual characters represented by them; one can pass the htmLawed output through PHP's 'html_entity_decode' function:- http://www.php.net/html_entity_decode for that. | 799 | *Note*: htmLawed does not convert entities to the actual characters represented by them; one can pass the htmLawed output through PHP's 'html_entity_decode' function:- http://www.php.net/html_entity_decode for that. |
800 | 800 | ||
801 | *Note*: If '$config["and_mark"]' is set, and set to a value other than '0', then the '&' characters in the original input are replaced with the control character for the hexadecimal code-point '6' ('\x06'; '&' characters introduced by htmLawed, e.g., after converting '<' to '<', are not affected). This allows one to distinguish, say, an '>' introduced by htmLawed and an '>' put in by the input writer, and can be helpful in further processing of the htmLawed-processed text (e.g., to identify the character sequence 'o(><)o' to generate an emoticon image). When this feature is active, admins should ensure that the htmLawed output is not directly used in web pages or XML documents as the presence of the '\x06' can break documents. Before use in such documents, and preferably before any storage, any remaining '\x06' should be changed back to '&', e.g., with: | 801 | *Note*: If '$config["and_mark"]' is set, and set to a value other than '0', then the '&' characters in the original input are replaced with the control character for the hexadecimal code-point '6' ('\x06'; '&' characters introduced by htmLawed, e.g., after converting '<' to '<', are not affected). This allows one to distinguish, say, an '>' introduced by htmLawed and an '>' put in by the input writer, and can be helpful in further processing of the htmLawed-processed text (e.g., to identify the character sequence 'o(><)o' to generate an emoticon image). When this feature is active, admins should ensure that the htmLawed output is not directly used in web pages or XML documents as the presence of the '\x06' can break documents. Before use in such documents, and preferably before any storage, any remaining '\x06' should be changed back to '&', e.g., with: |
802 | 802 | ||
803 | $final = str_replace("\x06", '&', $prelim); | 803 | $final = str_replace("\x06", '&', $prelim); |
804 | 804 | ||
805 | Also, see section:- #3.9. | 805 | Also, see section:- #3.9. |
806 | 806 | ||
807 | 807 | ||
808 | -- 3.3 HTML elements ----------------------------------------------o | 808 | -- 3.3 HTML elements ----------------------------------------------o |
809 | 809 | ||
810 | 810 | ||
811 | htmLawed can be configured to allow only certain HTML elements (tags) in the input. Disallowed elements (just tag-content, and not element-content), based on '$config["keep_bad"]', are either `neutralized` (converted to plain text by entitification of '<' and '>') or removed. | 811 | htmLawed can be configured to allow only certain HTML elements (tags) in the input. Disallowed elements (just tag-content, and not element-content), based on '$config["keep_bad"]', are either `neutralized` (converted to plain text by entitification of '<' and '>') or removed. |
812 | 812 | ||
813 | E.g., with only 'em' permitted: | 813 | E.g., with only 'em' permitted: |
814 | 814 | ||
815 | Input: | 815 | Input: |
816 | 816 | ||
817 | <em>My</em> website is <a href="http://a.com>a.com</a>. | 817 | <em>My</em> website is <a href="http://a.com>a.com</a>. |
818 | 818 | ||
819 | Output, with '$config["keep_bad"] = 0': | 819 | Output, with '$config["keep_bad"] = 0': |
820 | 820 | ||
821 | <em>My</em> website is a.com. | 821 | <em>My</em> website is a.com. |
822 | 822 | ||
823 | Output, with '$config["keep_bad"]' not '0': | 823 | Output, with '$config["keep_bad"]' not '0': |
824 | 824 | ||
825 | <em>My</em> website is <a href="">a.com</a>. | 825 | <em>My</em> website is <a href="">a.com</a>. |
826 | 826 | ||
827 | See section:- #3.3.3 for differences between the various non-zero '$config["keep_bad"]' values. | 827 | See section:- #3.3.3 for differences between the various non-zero '$config["keep_bad"]' values. |
828 | 828 | ||
829 | htmLawed by default permits these 118 HTML elements: | 829 | htmLawed by default permits these 118 HTML elements: |
830 | 830 | ||
831 | a, abbr, acronym, address, applet, area, article, aside, audio, b, bdi, bdo, big, blockquote, br, button, canvas, caption, center, cite, code, col, colgroup, command, data, datalist, dd, del, details, dfn, dir, div, dl, dt, em, embed, fieldset, figcaption, figure, font, footer, form, h1, h2, h3, h4, h5, h6, header, hgroup, hr, i, iframe, img, input, ins, isindex, kbd, keygen, label, legend, li, link, main, map, mark, menu, meta, meter, nav, noscript, object, ol, optgroup, option, output, p, param, pre, progress, q, rb, rbc, rp, rt, rtc, ruby, s, samp, script, section, select, small, source, span, strike, strong, style, sub, summary, sup, table, tbody, td, textarea, tfoot, th, thead, time, tr, track, tt, u, ul, var, video, wbr | 831 | a, abbr, acronym, address, applet, area, article, aside, audio, b, bdi, bdo, big, blockquote, br, button, canvas, caption, center, cite, code, col, colgroup, command, data, datalist, dd, del, details, dfn, dir, div, dl, dt, em, embed, fieldset, figcaption, figure, font, footer, form, h1, h2, h3, h4, h5, h6, header, hgroup, hr, i, iframe, img, input, ins, isindex, kbd, keygen, label, legend, li, link, main, map, mark, menu, meta, meter, nav, noscript, object, ol, optgroup, option, output, p, param, pre, progress, q, rb, rbc, rp, rt, rtc, ruby, s, samp, script, section, select, small, source, span, strike, strong, style, sub, summary, sup, table, tbody, td, textarea, tfoot, th, thead, time, tr, track, tt, u, ul, var, video, wbr |
832 | 832 | ||
833 | The HTML version 4 elements 'acronym', 'applet', 'big', 'center', 'dir', 'font', 'strike', and 'tt' are obsolete/deprecated in HTML version 5. On the other hand, the obsolete/deprecated HTML 4 elements 'embed', 'menu' and 'u' are no longer so in HTML 5. Elements new to HTML 5 are 'article', 'aside', 'audio', 'bdi', 'canvas', 'command', 'data', 'datalist', 'details', 'figure', 'figcaption', 'footer', 'header', 'hgroup', 'keygen', 'link', 'main', 'mark', 'meta', 'meter', 'nav', 'output', 'progress', 'section', 'source', 'style', 'summary', 'time', 'track', 'video', and 'wbr'. The 'link', 'meta' and 'style' elements exist in HTML 4 but are not allowed in the HTML body. These 16 elements are `empty` elements that have an opening tag with possible content but no element content (thus, no closing tag): 'area', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'isindex', 'keygen', 'link', 'meta', 'param', 'source', 'track', and 'wbr'. | 833 | The HTML version 4 elements 'acronym', 'applet', 'big', 'center', 'dir', 'font', 'strike', and 'tt' are obsolete/deprecated in HTML version 5. On the other hand, the obsolete/deprecated HTML 4 elements 'embed', 'menu' and 'u' are no longer so in HTML 5. Elements new to HTML 5 are 'article', 'aside', 'audio', 'bdi', 'canvas', 'command', 'data', 'datalist', 'details', 'figure', 'figcaption', 'footer', 'header', 'hgroup', 'keygen', 'link', 'main', 'mark', 'meta', 'meter', 'nav', 'output', 'progress', 'section', 'source', 'style', 'summary', 'time', 'track', 'video', and 'wbr'. The 'link', 'meta' and 'style' elements exist in HTML 4 but are not allowed in the HTML body. These 16 elements are `empty` elements that have an opening tag with possible content but no element content (thus, no closing tag): 'area', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'isindex', 'keygen', 'link', 'meta', 'param', 'source', 'track', and 'wbr'. |
834 | 834 | ||
835 | With '$config["safe"] = 1', the default set will exclude 'applet', 'audio', 'canvas', 'embed', 'iframe', 'object', 'script' and 'video'; see section:- #3.6. | 835 | With '$config["safe"] = 1', the default set will exclude 'applet', 'audio', 'canvas', 'embed', 'iframe', 'object', 'script' and 'video'; see section:- #3.6. |
836 | 836 | ||
837 | When '$config["elements"]', which specifies allowed elements, is `properly` defined, and neither empty nor set to '0' or '*', the default set is not used. To have elements added to or removed from the default set, a '+/-' notation is used. E.g., '*-script-object' implies that only 'script' and 'object' are disallowed, whereas '*+embed' means that 'noembed' is also allowed. Elements can also be specified as comma separated names. E.g., 'a, b, i' means only 'a', 'b' and 'i' are permitted. In this notation, '*', '+' and '-' have no significance and can actually cause a mis-reading. | 837 | When '$config["elements"]', which specifies allowed elements, is `properly` defined, and neither empty nor set to '0' or '*', the default set is not used. To have elements added to or removed from the default set, a '+/-' notation is used. E.g., '*-script-object' implies that only 'script' and 'object' are disallowed, whereas '*+embed' means that 'noembed' is also allowed. Elements can also be specified as comma separated names. E.g., 'a, b, i' means only 'a', 'b' and 'i' are permitted. In this notation, '*', '+' and '-' have no significance and can actually cause a mis-reading. |
838 | 838 | ||
839 | Some more examples of '$config["elements"]' values indicating permitted elements (note that empty spaces are liberally allowed for clarity): | 839 | Some more examples of '$config["elements"]' values indicating permitted elements (note that empty spaces are liberally allowed for clarity): |
840 | 840 | ||
841 | * 'a, blockquote, code, em, strong' -- only 'a', 'blockquote', 'code', 'em', and 'strong' | 841 | * 'a, blockquote, code, em, strong' -- only 'a', 'blockquote', 'code', 'em', and 'strong' |
842 | * '*-script' -- all excluding 'script' | 842 | * '*-script' -- all excluding 'script' |
843 | * '* -acronym -big -center -dir -font -isindex -s -strike -tt' -- only non-obsolete/deprecated elements of HTML5 | 843 | * '* -acronym -big -center -dir -font -isindex -s -strike -tt' -- only non-obsolete/deprecated elements of HTML5 |
844 | * '*+noembed-script' -- all including 'noembed' excluding 'script' | 844 | * '*+noembed-script' -- all including 'noembed' excluding 'script' |
845 | 845 | ||
846 | Some mis-usages (and the resulting permitted elements) that can be avoided: | 846 | Some mis-usages (and the resulting permitted elements) that can be avoided: |
847 | 847 | ||
848 | * '-*' -- none; instead of htmLawed, one might just use, e.g., the 'htmlspecialchars()' PHP function | 848 | * '-*' -- none; instead of htmLawed, one might just use, e.g., the 'htmlspecialchars()' PHP function |
849 | * '*, -script' -- all except 'script'; admin probably meant '*-script' | 849 | * '*, -script' -- all except 'script'; admin probably meant '*-script' |
850 | * '-*, a, em, strong' -- all; admin probably meant 'a, em, strong' | 850 | * '-*, a, em, strong' -- all; admin probably meant 'a, em, strong' |
851 | * '*' -- all; admin need not have set 'elements' | 851 | * '*' -- all; admin need not have set 'elements' |
852 | * '*-form+form' -- all; a '+' will always over-ride any '-' | 852 | * '*-form+form' -- all; a '+' will always over-ride any '-' |
853 | * '*, noembed' -- only 'noembed'; admin probably meant '*+noembed' | 853 | * '*, noembed' -- only 'noembed'; admin probably meant '*+noembed' |
854 | * 'a, +b, i' -- only 'a' and 'i'; admin probably meant 'a, b, i' | 854 | * 'a, +b, i' -- only 'a' and 'i'; admin probably meant 'a, b, i' |
855 | 855 | ||
856 | Basically, when using the '+/-' notation, commas (',') should not be used, and vice versa, and '*' should be used with the former but not the latter. | 856 | Basically, when using the '+/-' notation, commas (',') should not be used, and vice versa, and '*' should be used with the former but not the latter. |
857 | 857 | ||
858 | *Note*: Even if an element that is not in the default set is allowed through '$config["elements"]', like 'noembed' in the last example, it will eventually be removed during tag balancing unless such balancing is turned off ('$config["balance"]' set to '0'). Currently, the only way around this, which actually is simple, is to edit htmLawed's PHP code which define various arrays in the function 'hl_bal()' to accommodate the element and its nesting properties. | 858 | *Note*: Even if an element that is not in the default set is allowed through '$config["elements"]', like 'noembed' in the last example, it will eventually be removed during tag balancing unless such balancing is turned off ('$config["balance"]' set to '0'). Currently, the only way around this, which actually is simple, is to edit htmLawed's PHP code which define various arrays in the function 'hl_bal()' to accommodate the element and its nesting properties. |
859 | 859 | ||
860 | A possible second way to specify allowed elements is to set '$config["parent"]' to an element name that supposedly will hold the input, and to set '$config["balance"]' to '1'. During tag balancing (see section:- #3.3.3), all elements that cannot legally nest inside the parent element will be removed. The parent element is auto-reset to 'div' if '$config["parent"]' is empty, 'body', or an element not in htmLawed's default set of 118 elements. | 860 | A possible second way to specify allowed elements is to set '$config["parent"]' to an element name that supposedly will hold the input, and to set '$config["balance"]' to '1'. During tag balancing (see section:- #3.3.3), all elements that cannot legally nest inside the parent element will be removed. The parent element is auto-reset to 'div' if '$config["parent"]' is empty, 'body', or an element not in htmLawed's default set of 118 elements. |
861 | 861 | ||
862 | `Tag transformation` is possible for improving compliance with HTML standards -- most of the obsolete/deprecated elements of HTML version 5 are converted to valid ones; see section:- #3.3.2. | 862 | `Tag transformation` is possible for improving compliance with HTML standards -- most of the obsolete/deprecated elements of HTML version 5 are converted to valid ones; see section:- #3.3.2. |
863 | 863 | ||
864 | 864 | ||
865 | .. 3.3.1 Handling of comments & CDATA sections ..................... | 865 | .. 3.3.1 Handling of comments & CDATA sections ..................... |
866 | 866 | ||
867 | 867 | ||
868 | 'CDATA' sections have the format '<![CDATA[...anything but not "]]>"...]]>', and HTML comments, '<!--...anything but not "-->"... -->'. Neither HTML comments nor 'CDATA' sections can reside inside tags. HTML comments can exist anywhere else, but 'CDATA' sections can exist only where plain text is allowed (e.g., immediately inside 'td' element content but not immediately inside 'tr' element content). | 868 | 'CDATA' sections have the format '<![CDATA[...anything but not "]]>"...]]>', and HTML comments, '<!--...anything but not "-->"... -->'. Neither HTML comments nor 'CDATA' sections can reside inside tags. HTML comments can exist anywhere else, but 'CDATA' sections can exist only where plain text is allowed (e.g., immediately inside 'td' element content but not immediately inside 'tr' element content). |
869 | 869 | ||
870 | htmLawed (function 'hl_cmtcd()') handles HTML comments or 'CDATA' sections depending on the values of '$config["comment"]' or '$config["cdata"]'. If '0', such markup is not looked for and the text is processed like plain text. If '1', it is removed completely. If '2', it is preserved but any '<', '>' and '&' inside are changed to entities. If '3' for '$config["cdata"]', or '3' or '4' for '$config["comment"]', they are left as such. When '$config["comment"]' is set to '4', htmLawed will not force a space character before the '-->' comment-closing marker. While such a space is required for standard-compliance, it can corrupt marker code put in HTML by some software (such as Microsoft Outlook). | 870 | htmLawed (function 'hl_cmtcd()') handles HTML comments or 'CDATA' sections depending on the values of '$config["comment"]' or '$config["cdata"]'. If '0', such markup is not looked for and the text is processed like plain text. If '1', it is removed completely. If '2', it is preserved but any '<', '>' and '&' inside are changed to entities. If '3' for '$config["cdata"]', or '3' or '4' for '$config["comment"]', they are left as such. When '$config["comment"]' is set to '4', htmLawed will not force a space character before the '-->' comment-closing marker. While such a space is required for standard-compliance, it can corrupt marker code put in HTML by some software (such as Microsoft Outlook). |
871 | 871 | ||
872 | Note that for the last two cases, HTML comments and 'CDATA' sections will always be removed from tag content (function 'hl_tag()'). | 872 | Note that for the last two cases, HTML comments and 'CDATA' sections will always be removed from tag content (function 'hl_tag()'). |
873 | 873 | ||
874 | Examples: | 874 | Examples: |
875 | 875 | ||
876 | Input: | 876 | Input: |
877 | <!-- home link--><a href="home.htm"><![CDATA[x=&y]]>Home</a> | 877 | <!-- home link--><a href="home.htm"><![CDATA[x=&y]]>Home</a> |
878 | Output ('$config["comment"] = 0, $config["cdata"] = 2'): | 878 | Output ('$config["comment"] = 0, $config["cdata"] = 2'): |
879 | <-- home link--><a href="home.htm"><![CDATA[x=&y]]>Home</a> | 879 | <-- home link--><a href="home.htm"><![CDATA[x=&y]]>Home</a> |
880 | Output ('$config["comment"] = 1, $config["cdata"] = 2'): | 880 | Output ('$config["comment"] = 1, $config["cdata"] = 2'): |
881 | <a href="home.htm"><![CDATA[x=&y]]>Home</a> | 881 | <a href="home.htm"><![CDATA[x=&y]]>Home</a> |
882 | Output ('$config["comment"] = 2, $config["cdata"] = 2'): | 882 | Output ('$config["comment"] = 2, $config["cdata"] = 2'): |
883 | <!-- home link --><a href="home.htm"><![CDATA[x=&y]]>Home</a> | 883 | <!-- home link --><a href="home.htm"><![CDATA[x=&y]]>Home</a> |
884 | Output ('$config["comment"] = 2, $config["cdata"] = 1'): | 884 | Output ('$config["comment"] = 2, $config["cdata"] = 1'): |
885 | <!-- home link --><a href="home.htm">Home</a> | 885 | <!-- home link --><a href="home.htm">Home</a> |
886 | Output ('$config["comment"] = 3, $config["cdata"] = 3'): | 886 | Output ('$config["comment"] = 3, $config["cdata"] = 3'): |
887 | <!-- home link --><a href="home.htm"><![CDATA[x=&y]]>Home</a> | 887 | <!-- home link --><a href="home.htm"><![CDATA[x=&y]]>Home</a> |
888 | Output ('$config["comment"] = 4, $config["cdata"] = 3'): | 888 | Output ('$config["comment"] = 4, $config["cdata"] = 3'): |
889 | <!-- home link--><a href="home.htm"><![CDATA[x=&y]]>Home</a> | 889 | <!-- home link--><a href="home.htm"><![CDATA[x=&y]]>Home</a> |
890 | 890 | ||
891 | For standard-compliance, comments are given the form '<!--comment -->', and any '--' in the content is made '-'. When '$config["comment"]' is set to '4', htmLawed will not force a space character before the '-->' comment-closing marker. | 891 | For standard-compliance, comments are given the form '<!--comment -->', and any '--' in the content is made '-'. When '$config["comment"]' is set to '4', htmLawed will not force a space character before the '-->' comment-closing marker. |
892 | 892 | ||
893 | When '$config["safe"] = 1', CDATA sections and comments are considered plain text unless '$config["comment"]' or '$config["cdata"]' is explicitly specified; see section:- #3.6. | 893 | When '$config["safe"] = 1', CDATA sections and comments are considered plain text unless '$config["comment"]' or '$config["cdata"]' is explicitly specified; see section:- #3.6. |
894 | 894 | ||
895 | 895 | ||
896 | .. 3.3.2 Tag-transformation for better compliance with standards ..o | 896 | .. 3.3.2 Tag-transformation for better compliance with standards ..o |
897 | 897 | ||
898 | 898 | ||
899 | If '$config["make_tag_strict"]' is set and not '0', following deprecated elements (and attributes), as per HTML 5 specification, even if admin-permitted, are mutated as indicated (element content remains intact; function 'hl_tag2()'): | 899 | If '$config["make_tag_strict"]' is set and not '0', following deprecated elements (and attributes), as per HTML 5 specification, even if admin-permitted, are mutated as indicated (element content remains intact; function 'hl_tag2()'): |
900 | 900 | ||
901 | * acronym - 'abbr' | 901 | * acronym - 'abbr' |
902 | * applet - based on '$config["make_tag_strict"]', unchanged ('1') or removed ('2') | 902 | * applet - based on '$config["make_tag_strict"]', unchanged ('1') or removed ('2') |
903 | * big - 'span style="font-size: larger;"' | 903 | * big - 'span style="font-size: larger;"' |
904 | * center - 'div style="text-align: center;"' | 904 | * center - 'div style="text-align: center;"' |
905 | * dir - 'ul' | 905 | * dir - 'ul' |
906 | * font (face, size, color) - 'span style="font-family: ; font-size: ; color: ;"' (size transformation reference:- http://web.archive.org/web/20180201141931/http://style.cleverchimp.com/font_size_intervals/altintervals.html) | 906 | * font (face, size, color) - 'span style="font-family: ; font-size: ; color: ;"' (size transformation reference:- http://web.archive.org/web/20180201141931/http://style.cleverchimp.com/font_size_intervals/altintervals.html) |
907 | * isindex - based on '$config["make_tag_strict"]', unchanged ('1') or removed ('2') | 907 | * isindex - based on '$config["make_tag_strict"]', unchanged ('1') or removed ('2') |
908 | * s - 'span style="text-decoration: line-through;"' | 908 | * s - 'span style="text-decoration: line-through;"' |
909 | * strike - 'span style="text-decoration: line-through;"' | 909 | * strike - 'span style="text-decoration: line-through;"' |
910 | * tt - 'code' | 910 | * tt - 'code' |
911 | 911 | ||
912 | For an element with a pre-existing 'style' attribute value, the extra style properties are appended. | 912 | For an element with a pre-existing 'style' attribute value, the extra style properties are appended. |
913 | 913 | ||
914 | Example input: | 914 | Example input: |
915 | 915 | ||
916 | <center> | 916 | <center> |
917 | The PHP <s>software</s> script used for this <strike>web-page</strike> web-page is <font style="font-weight: bold " face=arial size='+3' color = "red ">htmLawedTest.php</font>, from <u style= 'color:green'>PHP Labware</u>. | 917 | The PHP <s>software</s> script used for this <strike>web-page</strike> web-page is <font style="font-weight: bold " face=arial size='+3' color = "red ">htmLawedTest.php</font>, from <u style= 'color:green'>PHP Labware</u>. |
918 | </center> | 918 | </center> |
919 | 919 | ||
920 | The output: | 920 | The output: |
921 | 921 | ||
922 | <div style="text-align: center;"> | 922 | <div style="text-align: center;"> |
923 | The PHP <span style="text-decoration: line-through;">software</span> script used for this <span style="text-decoration: line-through;">web-page</span> web-page is <span style="font-weight: bold; font-size: 200%; color: red; font-family: arial;">htmLawedTest.php</span>, from <u style="color:green">PHP Labware</u>. | 923 | The PHP <span style="text-decoration: line-through;">software</span> script used for this <span style="text-decoration: line-through;">web-page</span> web-page is <span style="font-weight: bold; font-size: 200%; color: red; font-family: arial;">htmLawedTest.php</span>, from <u style="color:green">PHP Labware</u>. |
924 | </div> | 924 | </div> |
925 | 925 | ||
926 | 926 | ||
927 | .. 3.3.3 Tag balancing & proper nesting ...........................o | 927 | .. 3.3.3 Tag balancing & proper nesting ...........................o |
928 | 928 | ||
929 | 929 | ||
930 | If '$config["balance"]' is set to '1', htmLawed (function 'hl_bal()') checks and corrects the input to have properly balanced tags and legal element content (i.e., any element nesting should be valid, and plain text may be present only in the content of elements that allow them). | 930 | If '$config["balance"]' is set to '1', htmLawed (function 'hl_bal()') checks and corrects the input to have properly balanced tags and legal element content (i.e., any element nesting should be valid, and plain text may be present only in the content of elements that allow them). |
931 | 931 | ||
932 | Depending on the value of '$config["keep_bad"]' (see section:- #2.2 and section:- #3.3), illegal content may be removed or neutralized to plain text by converting < and > to entities: | 932 | Depending on the value of '$config["keep_bad"]' (see section:- #2.2 and section:- #3.3), illegal content may be removed or neutralized to plain text by converting < and > to entities: |
933 | 933 | ||
934 | '0' - remove; this option is available only to maintain Kses-compatibility and should not be used otherwise (see section:- #2.6) | 934 | '0' - remove; this option is available only to maintain Kses-compatibility and should not be used otherwise (see section:- #2.6) |
935 | '1' - neutralize tags and keep element content | 935 | '1' - neutralize tags and keep element content |
936 | '2' - remove tags but keep element content | 936 | '2' - remove tags but keep element content |
937 | '3' and '4' - like '1' and '2', but keep element content only if text ('pcdata') is valid in parent element as per specs | 937 | '3' and '4' - like '1' and '2', but keep element content only if text ('pcdata') is valid in parent element as per specs |
938 | '5' and '6' - like '3' and '4', but line-breaks, tabs and spaces are left | 938 | '5' and '6' - like '3' and '4', but line-breaks, tabs and spaces are left |
939 | 939 | ||
940 | Example input (disallowing the 'p' element): | 940 | Example input (disallowing the 'p' element): |
941 | 941 | ||
942 | <*> Pseudo-tags <*> | 942 | <*> Pseudo-tags <*> |
943 | <xml>Non-HTML tag xml</xml> | 943 | <xml>Non-HTML tag xml</xml> |
944 | <p> | 944 | <p> |
945 | Disallowed tag p | 945 | Disallowed tag p |
946 | </p> | 946 | </p> |
947 | <ul>Bad<li>OK</li></ul> | 947 | <ul>Bad<li>OK</li></ul> |
948 | 948 | ||
949 | The output with '$config["keep_bad"] = 1': | 949 | The output with '$config["keep_bad"] = 1': |
950 | 950 | ||
951 | <*> Pseudo-tags <*> | 951 | <*> Pseudo-tags <*> |
952 | <xml>Non-HTML tag xml</xml> | 952 | <xml>Non-HTML tag xml</xml> |
953 | <p> | 953 | <p> |
954 | Disallowed tag p | 954 | Disallowed tag p |
955 | </p> | 955 | </p> |
956 | <ul>Bad<li>OK</li></ul> | 956 | <ul>Bad<li>OK</li></ul> |
957 | 957 | ||
958 | The output with '$config["keep_bad"] = 3': | 958 | The output with '$config["keep_bad"] = 3': |
959 | 959 | ||
960 | <*> Pseudo-tags <*> | 960 | <*> Pseudo-tags <*> |
961 | <xml>Non-HTML tag xml</xml> | 961 | <xml>Non-HTML tag xml</xml> |
962 | <p> | 962 | <p> |
963 | Disallowed tag p | 963 | Disallowed tag p |
964 | </p> | 964 | </p> |
965 | <ul><li>OK</li></ul> | 965 | <ul><li>OK</li></ul> |
966 | 966 | ||
967 | The output with '$config["keep_bad"] = 6': | 967 | The output with '$config["keep_bad"] = 6': |
968 | 968 | ||
969 | <*> Pseudo-tags <*> | 969 | <*> Pseudo-tags <*> |
970 | Non-HTML tag xml | 970 | Non-HTML tag xml |
971 | 971 | ||
972 | Disallowed tag p | 972 | Disallowed tag p |
973 | 973 | ||
974 | <ul><li>OK</li></ul> | 974 | <ul><li>OK</li></ul> |
975 | 975 | ||
976 | An option like '1' is useful, e.g., when a writer previews his submission, whereas one like '3' is useful before content is finalized and made available to all. | 976 | An option like '1' is useful, e.g., when a writer previews his submission, whereas one like '3' is useful before content is finalized and made available to all. |
977 | 977 | ||
978 | *Note:* In the example above, unlike '<*>', '<xml>' gets considered as a tag (even though there is no HTML element named 'xml'). Thus, the 'keep_bad' parameter's value affects '<xml>' but not '<*>'. In general, text matching the regular expression pattern '<(/?)([a-zA-Z][a-zA-Z1-6]*)([^>]*?)\s?>' is considered a tag (phrase enclosed by the angled brackets '<' and '>', and starting [with an optional slash preceding] with an alphanumeric word that starts with an alphabet...), and is subjected to the 'keep_bad' value. | 978 | *Note:* In the example above, unlike '<*>', '<xml>' gets considered as a tag (even though there is no HTML element named 'xml'). Thus, the 'keep_bad' parameter's value affects '<xml>' but not '<*>'. In general, text matching the regular expression pattern '<(/?)([a-zA-Z][a-zA-Z1-6]*)([^>]*?)\s?>' is considered a tag (phrase enclosed by the angled brackets '<' and '>', and starting [with an optional slash preceding] with an alphanumeric word that starts with an alphabet...), and is subjected to the 'keep_bad' value. |
979 | 979 | ||
980 | Nesting/content rules for each of the 118 elements in htmLawed's default set (see section:- #3.3) are defined in function 'hl_bal()'. This means that if a non-standard element besides 'embed' is being permitted through '$config["elements"]', the element's tag content will end up getting removed if '$config["balance"]' is set to '1'. | 980 | Nesting/content rules for each of the 118 elements in htmLawed's default set (see section:- #3.3) are defined in function 'hl_bal()'. This means that if a non-standard element besides 'embed' is being permitted through '$config["elements"]', the element's tag content will end up getting removed if '$config["balance"]' is set to '1'. |
981 | 981 | ||
982 | Plain text and/or certain elements nested inside 'blockquote', 'form', 'map' and 'noscript' need to be in block-level elements. This point is often missed during manual writing of HTML code. htmLawed attempts to address this during balancing. E.g., if the parent container is set as 'form', the input 'B:<input type="text" value="b" />C:<input type="text" value="c" />' is converted to '<div>B:<input type="text" value="b" />C:<input type="text" value="c" /></div>'. | 982 | Plain text and/or certain elements nested inside 'blockquote', 'form', 'map' and 'noscript' need to be in block-level elements. This point is often missed during manual writing of HTML code. htmLawed attempts to address this during balancing. E.g., if the parent container is set as 'form', the input 'B:<input type="text" value="b" />C:<input type="text" value="c" />' is converted to '<div>B:<input type="text" value="b" />C:<input type="text" value="c" /></div>'. |
983 | 983 | ||
984 | 984 | ||
985 | .. 3.3.4 Elements requiring child elements ........................o | 985 | .. 3.3.4 Elements requiring child elements ........................o |
986 | 986 | ||
987 | 987 | ||
988 | As per HTML specifications, elements such as those below require legal child elements nested inside them: | 988 | As per HTML specifications, elements such as those below require legal child elements nested inside them: |
989 | 989 | ||
990 | blockquote, dir, dl, form, map, menu, noscript, ol, optgroup, rbc, rtc, ruby, select, table, tbody, tfoot, thead, tr, ul | 990 | blockquote, dir, dl, form, map, menu, noscript, ol, optgroup, rbc, rtc, ruby, select, table, tbody, tfoot, thead, tr, ul |
991 | 991 | ||
992 | In some cases, the specifications stipulate the number and/or the ordering of the child elements. A 'table' can have 0 or 1 'caption', 'tbody', 'tfoot', and 'thead', but they must be in this order: 'caption', 'thead', 'tfoot', 'tbody'. | 992 | In some cases, the specifications stipulate the number and/or the ordering of the child elements. A 'table' can have 0 or 1 'caption', 'tbody', 'tfoot', and 'thead', but they must be in this order: 'caption', 'thead', 'tfoot', 'tbody'. |
993 | 993 | ||
994 | htmLawed currently does not check for conformance to these rules. Note that any non-compliance in this regard will not introduce security vulnerabilities, crash browser applications, or affect the rendering of web-pages. | 994 | htmLawed currently does not check for conformance to these rules. Note that any non-compliance in this regard will not introduce security vulnerabilities, crash browser applications, or affect the rendering of web-pages. |
995 | 995 | ||
996 | With '$config["direct_list_nest"]' set to '1', htmLawed will allow direct nesting of 'ol', 'ul', or 'menu' list within another 'ol', 'ul', or 'menu' without requiring the child list to be within an 'li' of the parent list. While this may not be standard-compliant, directly nested lists are rendered properly by almost all browsers. The parameter '$config["direct_list_nest"]' has no effect if tag balancing (section:- #3.3.3) is turned off. | 996 | With '$config["direct_list_nest"]' set to '1', htmLawed will allow direct nesting of 'ol', 'ul', or 'menu' list within another 'ol', 'ul', or 'menu' without requiring the child list to be within an 'li' of the parent list. While this may not be standard-compliant, directly nested lists are rendered properly by almost all browsers. The parameter '$config["direct_list_nest"]' has no effect if tag balancing (section:- #3.3.3) is turned off. |
997 | 997 | ||
998 | 998 | ||
999 | .. 3.3.5 Beautify or compact HTML .................................o | 999 | .. 3.3.5 Beautify or compact HTML .................................o |
1000 | 1000 | ||
1001 | 1001 | ||
1002 | By default, htmLawed will neither `beautify` HTML code by formatting it with indentations, etc., nor will it make it compact by removing un-needed white-space.(It does always properly white-space tag content.) | 1002 | By default, htmLawed will neither `beautify` HTML code by formatting it with indentations, etc., nor will it make it compact by removing un-needed white-space.(It does always properly white-space tag content.) |
1003 | 1003 | ||
1004 | As per the HTML standards, spaces, tabs and line-breaks in web-pages (except those inside 'pre' elements) are all considered equivalent, and referred to as `white-spaces`. Browser applications are supposed to consider contiguous white-spaces as just a single space, and to disregard white-spaces trailing opening tags or preceding closing tags. This white-space `normalization` allows the use of text/code beautifully formatted with indentations and line-spacings for readability. Such `pretty` HTML can, however, increase the size of web-pages, or make the extraction or scraping of plain text cumbersome. | 1004 | As per the HTML standards, spaces, tabs and line-breaks in web-pages (except those inside 'pre' elements) are all considered equivalent, and referred to as `white-spaces`. Browser applications are supposed to consider contiguous white-spaces as just a single space, and to disregard white-spaces trailing opening tags or preceding closing tags. This white-space `normalization` allows the use of text/code beautifully formatted with indentations and line-spacings for readability. Such `pretty` HTML can, however, increase the size of web-pages, or make the extraction or scraping of plain text cumbersome. |
1005 | 1005 | ||
1006 | With the '$config' parameter 'tidy', htmLawed can be used to beautify or compact the input text. Input with just plain text and no HTML markup is also subject to this. Besides 'pre', the 'script' and 'textarea' elements, CDATA sections, and HTML comments are not subjected to the tidying process. | 1006 | With the '$config' parameter 'tidy', htmLawed can be used to beautify or compact the input text. Input with just plain text and no HTML markup is also subject to this. Besides 'pre', the 'script' and 'textarea' elements, CDATA sections, and HTML comments are not subjected to the tidying process. |
1007 | 1007 | ||
1008 | To `compact`, use '$config["tidy"] = -1'; single instances or runs of white-spaces are replaced with a single space, and white-spaces trailing and leading open and closing tags, respectively, are removed. | 1008 | To `compact`, use '$config["tidy"] = -1'; single instances or runs of white-spaces are replaced with a single space, and white-spaces trailing and leading open and closing tags, respectively, are removed. |
1009 | 1009 | ||
1010 | To `beautify`, '$config["tidy"]' is set as '1', or for customized tidying, as a string like '2s2n'. The 's' or 't' character specifies the use of spaces or tabs for indentation. The first and third characters, any of the digits 0-9, specify the number of spaces or tabs per indentation, and any parental lead spacing (extra indenting of the whole block of input text). The 'r' and 'n' characters are used to specify line-break characters: 'n' for '\n' (Unix/Mac OS X line-breaks), 'rn' or 'nr' for '\r\n' (Windows/DOS line-breaks), or 'r' for '\r'. | 1010 | To `beautify`, '$config["tidy"]' is set as '1', or for customized tidying, as a string like '2s2n'. The 's' or 't' character specifies the use of spaces or tabs for indentation. The first and third characters, any of the digits 0-9, specify the number of spaces or tabs per indentation, and any parental lead spacing (extra indenting of the whole block of input text). The 'r' and 'n' characters are used to specify line-break characters: 'n' for '\n' (Unix/Mac OS X line-breaks), 'rn' or 'nr' for '\r\n' (Windows/DOS line-breaks), or 'r' for '\r'. |
1011 | 1011 | ||
1012 | The '$config["tidy"]' value of '1' is equivalent to '2s0n'. Other '$config["tidy"]' values are read loosely: a value of '4' is equivalent to '4s0n'; 't2', to '1t2n'; 's', to '2s0n'; '2TR', to '2t0r'; 'T1', to '1t1n'; 'nr3', to '3s0nr', and so on. Except in the indentations and line-spacings, runs of white-spaces are replaced with a single space during beautification. | 1012 | The '$config["tidy"]' value of '1' is equivalent to '2s0n'. Other '$config["tidy"]' values are read loosely: a value of '4' is equivalent to '4s0n'; 't2', to '1t2n'; 's', to '2s0n'; '2TR', to '2t0r'; 'T1', to '1t1n'; 'nr3', to '3s0nr', and so on. Except in the indentations and line-spacings, runs of white-spaces are replaced with a single space during beautification. |
1013 | 1013 | ||
1014 | Input formatting using '$config["tidy"]' is not recommended when input text has mixed markup (like HTML + PHP). | 1014 | Input formatting using '$config["tidy"]' is not recommended when input text has mixed markup (like HTML + PHP). |
1015 | 1015 | ||
1016 | 1016 | ||
1017 | -- 3.4 Attributes -------------------------------------------------o | 1017 | -- 3.4 Attributes -------------------------------------------------o |
1018 | 1018 | ||
1019 | 1019 | ||
1020 | In its default setting, htmLawed will only permit attributes described in the HTML specifications (including deprecated ones). A list of the attributes and the elements they are allowed in is in section:- #5.2. Using the '$spec' argument, htmLawed can be forced to permit custom, non-standard attributes as well as custom rules for standard attributes (section:- #2.3). | 1020 | In its default setting, htmLawed will only permit attributes described in the HTML specifications (including deprecated ones). A list of the attributes and the elements they are allowed in is in section:- #5.2. Using the '$spec' argument, htmLawed can be forced to permit custom, non-standard attributes as well as custom rules for standard attributes (section:- #2.3). |
1021 | 1021 | ||
1022 | Custom `data-*` (`data-star`) attributes, where the first three characters of the value of `star` (*) after lower-casing do not equal 'xml', and the value of `star` does not have a colon (:), equal-to (=), newline, solidus (/), space or tab character, or any upper-case A-Z character are allowed in all elements. ARIA, event and microdata attributes like 'aria-live', 'onclick' and 'itemid' are also considered global attributes (section:- #5.2). | 1022 | Custom `data-*` (`data-star`) attributes, where the first three characters of the value of `star` (*) after lower-casing do not equal 'xml', and the value of `star` does not have a colon (:), equal-to (=), newline, solidus (/), space or tab character, or any upper-case A-Z character are allowed in all elements. ARIA, event and microdata attributes like 'aria-live', 'onclick' and 'itemid' are also considered global attributes (section:- #5.2). |
1023 | 1023 | ||
1024 | When '$config["deny_attribute"]' is not set, or set to '0', or empty ('""'), all attributes are permitted. Otherwise, '$config["deny_attribute"]' can be set as a list of comma-separated names of the denied attributes. 'on*' can be used to refer to the group of potentially dangerous, script-accepting event attributes like 'onblur' and 'onchange' that have 'on' at the beginning of their names. Similarly, 'aria*' and 'data*' can be used to respectively refer to the set of all ARIA and data-* attributes. | 1024 | When '$config["deny_attribute"]' is not set, or set to '0', or empty ('""'), all attributes are permitted. Otherwise, '$config["deny_attribute"]' can be set as a list of comma-separated names of the denied attributes. 'on*' can be used to refer to the group of potentially dangerous, script-accepting event attributes like 'onblur' and 'onchange' that have 'on' at the beginning of their names. Similarly, 'aria*' and 'data*' can be used to respectively refer to the set of all ARIA and data-* attributes. |
1025 | 1025 | ||
1026 | With '$config["safe"] = 1' (section:- #3.6), the 'on*' event attributes are automatically disallowed even if a value for '$config["deny_attribute"]' has been manually provided. | 1026 | With '$config["safe"] = 1' (section:- #3.6), the 'on*' event attributes are automatically disallowed even if a value for '$config["deny_attribute"]' has been manually provided. |
1027 | 1027 | ||
1028 | Note that attributes specified in '$config["deny_attribute"]' are denied globally, for all elements. To deny attributes for only specific elements, '$spec' (see section:- #2.3) can be used. '$spec' can also be used to element-specifically permit an attribute otherwise denied through '$config["deny_attribute"]'. | 1028 | Note that attributes specified in '$config["deny_attribute"]' are denied globally, for all elements. To deny attributes for only specific elements, '$spec' (see section:- #2.3) can be used. '$spec' can also be used to element-specifically permit an attribute otherwise denied through '$config["deny_attribute"]'. |
1029 | 1029 | ||
1030 | Finer restrictions on attributes can also be put into effect through '$config["deny_attribute"]' (section:- 3.4.9). | 1030 | Finer restrictions on attributes can also be put into effect through '$config["deny_attribute"]' (section:- 3.4.9). |
1031 | 1031 | ||
1032 | *Note*: To deny all but a few attributes globally, a simpler way to specify '$config["deny_attribute"]' would be to use the notation '* -attribute1 -attribute2 ...'. Thus, a value of '* -title -href' implies that except 'href' and 'title' (where allowed as per standards) all other attributes are to be removed. With this notation, the value for the parameter 'safe' (section:- #3.6) will have no effect on 'deny_attribute'. Values of 'aria*' 'data*', and 'on*' cannot be used in this notation to refer to the sets of all ARIA, data-*, and on* attributes respectively. | 1032 | *Note*: To deny all but a few attributes globally, a simpler way to specify '$config["deny_attribute"]' would be to use the notation '* -attribute1 -attribute2 ...'. Thus, a value of '* -title -href' implies that except 'href' and 'title' (where allowed as per standards) all other attributes are to be removed. With this notation, the value for the parameter 'safe' (section:- #3.6) will have no effect on 'deny_attribute'. Values of 'aria*' 'data*', and 'on*' cannot be used in this notation to refer to the sets of all ARIA, data-*, and on* attributes respectively. |
1033 | 1033 | ||
1034 | htmLawed (function 'hl_tag()') also: | 1034 | htmLawed (function 'hl_tag()') also: |
1035 | 1035 | ||
1036 | * Lower-cases attribute names | 1036 | * Lower-cases attribute names |
1037 | * Removes duplicate attributes (last one stays) | 1037 | * Removes duplicate attributes (last one stays) |
1038 | * Gives attributes the form 'name="value"' and single-spaces them, removing unnecessary white-spacing | 1038 | * Gives attributes the form 'name="value"' and single-spaces them, removing unnecessary white-spacing |
1039 | * Provides `required` attributes (see section:- #3.4.1) | 1039 | * Provides `required` attributes (see section:- #3.4.1) |
1040 | * Double-quotes values and escapes any '"' inside them | 1040 | * Double-quotes values and escapes any '"' inside them |
1041 | * Replaces the possibly dangerous soft-hyphen characters (hexadecimal code-point 'ad') in the values with spaces | 1041 | * Replaces the possibly dangerous soft-hyphen characters (hexadecimal code-point 'ad') in the values with spaces |
1042 | * Allows custom function to additionally filter/modify attribute values (see section:- #3.4.9) | 1042 | * Allows custom function to additionally filter/modify attribute values (see section:- #3.4.9) |
1043 | 1043 | ||
1044 | 1044 | ||
1045 | .. 3.4.1 Auto-addition of XHTML-required attributes ................ | 1045 | .. 3.4.1 Auto-addition of XHTML-required attributes ................ |
1046 | 1046 | ||
1047 | 1047 | ||
1048 | If indicated attributes for the following elements are found missing, htmLawed (function 'hl_tag()') will add them (with values same as attribute names unless indicated otherwise below): | 1048 | If indicated attributes for the following elements are found missing, htmLawed (function 'hl_tag()') will add them (with values same as attribute names unless indicated otherwise below): |
1049 | 1049 | ||
1050 | * area - alt ('area') | 1050 | * area - alt ('area') |
1051 | * area, img - src, alt ('image') | 1051 | * area, img - src, alt ('image') |
1052 | * bdo - dir ('ltr') | 1052 | * bdo - dir ('ltr') |
1053 | * form - action | 1053 | * form - action |
1054 | * label - command | 1054 | * label - command |
1055 | * map - name | 1055 | * map - name |
1056 | * optgroup - label | 1056 | * optgroup - label |
1057 | * param - name | 1057 | * param - name |
1058 | * style - scoped | 1058 | * style - scoped |
1059 | * textarea - rows ('10'), cols ('50') | 1059 | * textarea - rows ('10'), cols ('50') |
1060 | 1060 | ||
1061 | Additionally, with '$config["xml:lang"]' set to '1' or '2', if the 'lang' but not the 'xml:lang' attribute is declared, then the latter is added too, with a value copied from that of 'lang'. This is for better standard-compliance. With '$config["xml:lang"]' set to '2', the 'lang' attribute is removed (XHTML specification). | 1061 | Additionally, with '$config["xml:lang"]' set to '1' or '2', if the 'lang' but not the 'xml:lang' attribute is declared, then the latter is added too, with a value copied from that of 'lang'. This is for better standard-compliance. With '$config["xml:lang"]' set to '2', the 'lang' attribute is removed (XHTML specification). |
1062 | 1062 | ||
1063 | Note that the 'name' attribute for 'map', invalid in XHTML, is also transformed if required -- see section:- #3.4.6. | 1063 | Note that the 'name' attribute for 'map', invalid in XHTML, is also transformed if required -- see section:- #3.4.6. |
1064 | 1064 | ||
1065 | 1065 | ||
1066 | .. 3.4.2 Duplicate/invalid 'id' values ............................o | 1066 | .. 3.4.2 Duplicate/invalid 'id' values ............................o |
1067 | 1067 | ||
1068 | 1068 | ||
1069 | If '$config["unique_ids"]' is '1', htmLawed (function 'hl_tag()') removes 'id' attributes with values that are not standards-compliant (must not have a space character) or duplicate. If '$config["unique_ids"]' is a word (without a non-word character like space), any duplicate but otherwise valid value will be appropriately prefixed with the word to ensure its uniqueness. | 1069 | If '$config["unique_ids"]' is '1', htmLawed (function 'hl_tag()') removes 'id' attributes with values that are not standards-compliant (must not have a space character) or duplicate. If '$config["unique_ids"]' is a word (without a non-word character like space), any duplicate but otherwise valid value will be appropriately prefixed with the word to ensure its uniqueness. |
1070 | 1070 | ||
1071 | Even if multiple inputs need to be filtered (through multiple calls to htmLawed), htmLawed ensures uniqueness of 'id' values as it uses a global variable ('$GLOBALS["hl_Ids"]' array). Further, an admin can restrict the use of certain 'id' values by presetting this variable before htmLawed is called into use. E.g.: | 1071 | Even if multiple inputs need to be filtered (through multiple calls to htmLawed), htmLawed ensures uniqueness of 'id' values as it uses a global variable ('$GLOBALS["hl_Ids"]' array). Further, an admin can restrict the use of certain 'id' values by presetting this variable before htmLawed is called into use. E.g.: |
1072 | 1072 | ||
1073 | $GLOBALS['hl_Ids'] = array('top'=>1, 'bottom'=>1, 'myform'=>1); // id values not allowed in input | 1073 | $GLOBALS['hl_Ids'] = array('top'=>1, 'bottom'=>1, 'myform'=>1); // id values not allowed in input |
1074 | $processed = htmLawed($text); // filter input | 1074 | $processed = htmLawed($text); // filter input |
1075 | 1075 | ||
1076 | 1076 | ||
1077 | .. 3.4.3 URL schemes & scripts in attribute values ................o | 1077 | .. 3.4.3 URL schemes & scripts in attribute values ................o |
1078 | 1078 | ||
1079 | 1079 | ||
1080 | htmLawed edits attributes that take URLs as values if they are found to contain un-permitted schemes. E.g., if the 'afp' scheme is not permitted, then '<a href="afp://domain.org">' becomes '<a href="denied:afp://domain.org">', and if Javascript is not permitted '<a onclick="javascript:xss();">' becomes '<a onclick="denied:javascript:xss();">'. | 1080 | htmLawed edits attributes that take URLs as values if they are found to contain un-permitted schemes. E.g., if the 'afp' scheme is not permitted, then '<a href="afp://domain.org">' becomes '<a href="denied:afp://domain.org">', and if Javascript is not permitted '<a onclick="javascript:xss();">' becomes '<a onclick="denied:javascript:xss();">'. |
1081 | 1081 | ||
1082 | By default htmLawed permits these schemes in URLs for the 'href' attribute: | 1082 | By default htmLawed permits these schemes in URLs for the 'href' attribute: |
1083 | 1083 | ||
1084 | aim, app, feed, file, ftp, gopher, http, https, javascript, irc, mailto, news, nntp, sftp, ssh, tel, telnet | 1084 | aim, app, feed, file, ftp, gopher, http, https, javascript, irc, mailto, news, nntp, sftp, ssh, tel, telnet |
1085 | 1085 | ||
1086 | Also, only 'data', 'file', 'http', 'https' and 'javascript' are permitted in these attributes that accept URLs: | 1086 | Also, only 'data', 'file', 'http', 'https' and 'javascript' are permitted in these attributes that accept URLs: |
1087 | 1087 | ||
1088 | action, cite, classid, codebase, data, itemtype, longdesc, model, pluginspage, pluginurl, src, srcset, style, usemap, and event attributes like onclick | 1088 | action, cite, classid, codebase, data, itemtype, longdesc, model, pluginspage, pluginurl, src, srcset, style, usemap, and event attributes like onclick |
1089 | 1089 | ||
1090 | With '$config["safe"] = 1' (section:- #3.6), the above is changed to disallow 'app', 'data' and 'javascript'. | 1090 | With '$config["safe"] = 1' (section:- #3.6), the above is changed to disallow 'app', 'data' and 'javascript'. |
1091 | 1091 | ||
1092 | These default sets are used when '$config["schemes"]' is not set (see section:- #2.2). To over-ride the defaults, '$config["schemes"]' is defined as a string of semi-colon-separated sub-strings of type 'attribute: comma-separated schemes'. E.g., 'href: mailto, http, https; onclick: javascript; src: http, https'. For unspecified attributes, 'data', 'file', 'http', 'https' and 'javascript' are permitted. This can be changed by passing schemes for '*' in '$config["schemes"]'. E.g., 'href: mailto, http, https; *: https, https'. | 1092 | These default sets are used when '$config["schemes"]' is not set (see section:- #2.2). To over-ride the defaults, '$config["schemes"]' is defined as a string of semi-colon-separated sub-strings of type 'attribute: comma-separated schemes'. E.g., 'href: mailto, http, https; onclick: javascript; src: http, https'. For unspecified attributes, 'data', 'file', 'http', 'https' and 'javascript' are permitted. This can be changed by passing schemes for '*' in '$config["schemes"]'. E.g., 'href: mailto, http, https; *: https, https'. |
1093 | 1093 | ||
1094 | '*' (asterisk) can be put in the list of schemes to permit all protocols. E.g., 'style: *; img: http, https' results in protocols not being checked in 'style' attribute values. However, in such cases, any relative-to-absolute URL conversion, or vice versa, (section:- #3.4.4) is not done. When an attribute is explicitly listed in '$config["schemes"]', then filtering is dictated by the setting for the attribute, with no effect of the setting for asterisk. That is, the set of attributes that asterisk refers to no longer includes the listed attribute. | 1094 | '*' (asterisk) can be put in the list of schemes to permit all protocols. E.g., 'style: *; img: http, https' results in protocols not being checked in 'style' attribute values. However, in such cases, any relative-to-absolute URL conversion, or vice versa, (section:- #3.4.4) is not done. When an attribute is explicitly listed in '$config["schemes"]', then filtering is dictated by the setting for the attribute, with no effect of the setting for asterisk. That is, the set of attributes that asterisk refers to no longer includes the listed attribute. |
1095 | 1095 | ||
1096 | Thus, `to allow the xmpp scheme`, one can set '$config["schemes"]' as 'href: mailto, http, https; *: http, https, xmpp', or 'href: mailto, http, https, xmpp; *: http, https, xmpp', or '*: *', and so on. The consequence of each of these example values will be different (e.g., only the last two but not the first will allow 'xmpp' in 'href') | 1096 | Thus, `to allow the xmpp scheme`, one can set '$config["schemes"]' as 'href: mailto, http, https; *: http, https, xmpp', or 'href: mailto, http, https, xmpp; *: http, https, xmpp', or '*: *', and so on. The consequence of each of these example values will be different (e.g., only the last two but not the first will allow 'xmpp' in 'href') |
1097 | 1097 | ||
1098 | As a side-note, one may find 'style: *' useful as URLs in 'style' attributes can be specified in a variety of ways, and the patterns that htmLawed uses to identify URLs may mistakenly identify non-URL text. | 1098 | As a side-note, one may find 'style: *' useful as URLs in 'style' attributes can be specified in a variety of ways, and the patterns that htmLawed uses to identify URLs may mistakenly identify non-URL text. |
1099 | 1099 | ||
1100 | '!' can be put in the list of schemes to disallow all protocols as well as `local` URLs. Thus, with 'href: http, style: !', '<a href="http://cnn.com" style="background-image: url(local.jpg);">CNN</a>' will become '<a href="http://cnn.com" style="background-image: url(denied:local.jpg);">CNN</a>' | 1100 | '!' can be put in the list of schemes to disallow all protocols as well as `local` URLs. Thus, with 'href: http, style: !', '<a href="http://cnn.com" style="background-image: url(local.jpg);">CNN</a>' will become '<a href="http://cnn.com" style="background-image: url(denied:local.jpg);">CNN</a>' |
1101 | 1101 | ||
1102 | *Note*: If URL-accepting attributes other than those listed above are being allowed, then the scheme will not be checked unless the attribute name contains the string 'src' (e.g., 'dynsrc') or starts with 'o' (e.g., 'onbeforecopy'). | 1102 | *Note*: If URL-accepting attributes other than those listed above are being allowed, then the scheme will not be checked unless the attribute name contains the string 'src' (e.g., 'dynsrc') or starts with 'o' (e.g., 'onbeforecopy'). |
1103 | 1103 | ||
1104 | With '$config["safe"] = 1', all URLs are disallowed in the 'style' attribute values. | 1104 | With '$config["safe"] = 1', all URLs are disallowed in the 'style' attribute values. |
1105 | 1105 | ||
1106 | 1106 | ||
1107 | .. 3.4.4 Absolute & relative URLs in attribute values ............o | 1107 | .. 3.4.4 Absolute & relative URLs in attribute values ............o |
1108 | 1108 | ||
1109 | 1109 | ||
1110 | htmLawed can make absolute URLs in attributes like 'href' relative ('$config["abs_url"]' is '-1'), and vice versa ('$config["abs_url"]' is '1'). URLs in scripts are not considered for this, and so are URLs like '#section_6' (fragment), '?name=Tim#show' (starting with query string), and ';var=1?name=Tim#show' (starting with parameters). Further, this requires that '$config["base_url"]' be set properly, with the '://' and a trailing slash ('/'), with no query string, etc. E.g., 'file:///D:/page/', 'https://abc.com/x/y/', or 'http://localhost/demo/' are okay, but 'file:///D:/page/?help=1', 'abc.com/x/y/' and 'http://localhost/demo/index.htm' are not. | 1110 | htmLawed can make absolute URLs in attributes like 'href' relative ('$config["abs_url"]' is '-1'), and vice versa ('$config["abs_url"]' is '1'). URLs in scripts are not considered for this, and so are URLs like '#section_6' (fragment), '?name=Tim#show' (starting with query string), and ';var=1?name=Tim#show' (starting with parameters). Further, this requires that '$config["base_url"]' be set properly, with the '://' and a trailing slash ('/'), with no query string, etc. E.g., 'file:///D:/page/', 'https://abc.com/x/y/', or 'http://localhost/demo/' are okay, but 'file:///D:/page/?help=1', 'abc.com/x/y/' and 'http://localhost/demo/index.htm' are not. |
1111 | 1111 | ||
1112 | For making absolute URLs relative, only those URLs that have the '$config["base_url"]' string at the beginning are converted. E.g., with '$config["base_url"] = "https://abc.com/x/y/"', 'https://abc.com/x/y/a.gif' and 'https://abc.com/x/y/z/b.gif' become 'a.gif' and 'z/b.gif' respectively, while 'https://abc.com/x/c.gif' is not changed. | 1112 | For making absolute URLs relative, only those URLs that have the '$config["base_url"]' string at the beginning are converted. E.g., with '$config["base_url"] = "https://abc.com/x/y/"', 'https://abc.com/x/y/a.gif' and 'https://abc.com/x/y/z/b.gif' become 'a.gif' and 'z/b.gif' respectively, while 'https://abc.com/x/c.gif' is not changed. |
1113 | 1113 | ||
1114 | When making relative URLs absolute, only values for scheme, network location (host-name) and path values in the base URL are inherited. See section:- #5.5 for more about the URL specification as per RFC 1808:- http://www.ietf.org/rfc/rfc1808.txt. | 1114 | When making relative URLs absolute, only values for scheme, network location (host-name) and path values in the base URL are inherited. See section:- #5.5 for more about the URL specification as per RFC 1808:- http://www.ietf.org/rfc/rfc1808.txt. |
1115 | 1115 | ||
1116 | 1116 | ||
1117 | .. 3.4.5 Lower-cased, standard attribute values ...................o | 1117 | .. 3.4.5 Lower-cased, standard attribute values ...................o |
1118 | 1118 | ||
1119 | 1119 | ||
1120 | Optionally, for standard-compliance, htmLawed (function 'hl_tag()') lower-cases standard attribute values to give, e.g., 'input type="password"' instead of 'input type="Password"', if '$config["lc_std_val"]' is '1'. Attribute values matching those listed below for any of the elements listed further below (plus those for the 'type' attribute of 'button' or 'input') are lower-cased: | 1120 | Optionally, for standard-compliance, htmLawed (function 'hl_tag()') lower-cases standard attribute values to give, e.g., 'input type="password"' instead of 'input type="Password"', if '$config["lc_std_val"]' is '1'. Attribute values matching those listed below for any of the elements listed further below (plus those for the 'type' attribute of 'button' or 'input') are lower-cased: |
1121 | 1121 | ||
1122 | all, auto, baseline, bottom, button, captions, center, chapters, char, checkbox, circle, col, colgroup, color, cols, data, date, datetime, datetime-local, default, descriptions, email, file, get, groups, hidden, image, justify, left, ltr, metadata, middle, month, none, number, object, password, poly, post, preserve, radio, range, rect, ref, reset, right, row, rowgroup, rows, rtl, search, submit, subtitles, tel, text, time, top, url, week | 1122 | all, auto, baseline, bottom, button, captions, center, chapters, char, checkbox, circle, col, colgroup, color, cols, data, date, datetime, datetime-local, default, descriptions, email, file, get, groups, hidden, image, justify, left, ltr, metadata, middle, month, none, number, object, password, poly, post, preserve, radio, range, rect, ref, reset, right, row, rowgroup, rows, rtl, search, submit, subtitles, tel, text, time, top, url, week |
1123 | 1123 | ||
1124 | a, area, bdo, button, col, fieldset, form, img, input, object, ol, optgroup, option, param, script, select, table, td, textarea, tfoot, th, thead, tr, track, xml:space | 1124 | a, area, bdo, button, col, fieldset, form, img, input, object, ol, optgroup, option, param, script, select, table, td, textarea, tfoot, th, thead, tr, track, xml:space |
1125 | 1125 | ||
1126 | The following `empty` (`minimized`) attributes are always assigned lower-cased values (same as the attribute names): | 1126 | The following `empty` (`minimized`) attributes are always assigned lower-cased values (same as the attribute names): |
1127 | 1127 | ||
1128 | checkbox, checked, command, compact, declare, defer, default, disabled, hidden, inert, ismap, itemscope, multiple, nohref, noresize, noshade, nowrap, open, radio, readonly, required, reversed, selected | 1128 | checkbox, checked, command, compact, declare, defer, default, disabled, hidden, inert, ismap, itemscope, multiple, nohref, noresize, noshade, nowrap, open, radio, readonly, required, reversed, selected |
1129 | 1129 | ||
1130 | 1130 | ||
1131 | .. 3.4.6 Transformation of deprecated attributes ..................o | 1131 | .. 3.4.6 Transformation of deprecated attributes ..................o |
1132 | 1132 | ||
1133 | 1133 | ||
1134 | If '$config["no_deprecated_attr"]' is '0', then deprecated attributes are removed and, in most cases, their values are transformed to CSS style properties and added to the 'style' attributes (function 'hl_tag()'). Except for 'bordercolor' for 'table', 'tr' and 'td', the scores of proprietary attributes that were never part of any cross-browser standard are not supported in this functionality. | 1134 | If '$config["no_deprecated_attr"]' is '0', then deprecated attributes are removed and, in most cases, their values are transformed to CSS style properties and added to the 'style' attributes (function 'hl_tag()'). Except for 'bordercolor' for 'table', 'tr' and 'td', the scores of proprietary attributes that were never part of any cross-browser standard are not supported in this functionality. |
1135 | 1135 | ||
1136 | * align in caption, div, h, h2, h3, h4, h5, h6, hr, img, input, legend, object, p, table - for 'img' with value of 'left' or 'right', becomes, e.g., 'float: left'; for 'div' and 'table' with value 'center', becomes 'margin: auto'; all others become, e.g., 'text-align: right' | 1136 | * align in caption, div, h, h2, h3, h4, h5, h6, hr, img, input, legend, object, p, table - for 'img' with value of 'left' or 'right', becomes, e.g., 'float: left'; for 'div' and 'table' with value 'center', becomes 'margin: auto'; all others become, e.g., 'text-align: right' |
1137 | * bgcolor in table, td, th and tr - E.g., 'bgcolor="#ffffff"' becomes 'background-color: #ffffff' | 1137 | * bgcolor in table, td, th and tr - E.g., 'bgcolor="#ffffff"' becomes 'background-color: #ffffff' |
1138 | * border in object - E.g., 'height="10"' becomes 'height: 10px' | 1138 | * border in object - E.g., 'height="10"' becomes 'height: 10px' |
1139 | * bordercolor in table, td and tr - E.g., 'bordercolor=#999999' becomes 'border-color: #999999;' | 1139 | * bordercolor in table, td and tr - E.g., 'bordercolor=#999999' becomes 'border-color: #999999;' |
1140 | * compact in dl, ol and ul - 'font-size: 85%' | 1140 | * compact in dl, ol and ul - 'font-size: 85%' |
1141 | * cellspacing in table - 'cellspacing="10"' becomes 'border-spacing: 10px' | 1141 | * cellspacing in table - 'cellspacing="10"' becomes 'border-spacing: 10px' |
1142 | * clear in br - E.g., 'clear="all" becomes 'clear: both' | 1142 | * clear in br - E.g., 'clear="all" becomes 'clear: both' |
1143 | * height in td and th - E.g., 'height= "10"' becomes 'height: 10px' and 'height="*"' becomes 'height: auto' | 1143 | * height in td and th - E.g., 'height= "10"' becomes 'height: 10px' and 'height="*"' becomes 'height: auto' |
1144 | * hspace in img and object - E.g., 'hspace="10"' becomes 'margin-left: 10px; margin-right: 10px' | 1144 | * hspace in img and object - E.g., 'hspace="10"' becomes 'margin-left: 10px; margin-right: 10px' |
1145 | * language in script - 'language="VBScript"' becomes 'type="text/vbscript"' | 1145 | * language in script - 'language="VBScript"' becomes 'type="text/vbscript"' |
1146 | * name in a, form, iframe, img and map - E.g., 'name="xx"' becomes 'id="xx"' | 1146 | * name in a, form, iframe, img and map - E.g., 'name="xx"' becomes 'id="xx"' |
1147 | * noshade in hr - 'border-style: none; border: 0; background-color: gray; color: gray' | 1147 | * noshade in hr - 'border-style: none; border: 0; background-color: gray; color: gray' |
1148 | * nowrap in td and th - 'white-space: nowrap' | 1148 | * nowrap in td and th - 'white-space: nowrap' |
1149 | * size in hr - E.g., 'size="10"' becomes 'height: 10px' | 1149 | * size in hr - E.g., 'size="10"' becomes 'height: 10px' |
1150 | * vspace in img and object - E.g., 'vspace="10"' becomes 'margin-top: 10px; margin-bottom: 10px' | 1150 | * vspace in img and object - E.g., 'vspace="10"' becomes 'margin-top: 10px; margin-bottom: 10px' |
1151 | * width in hr, pre, table, td and th - like 'height' | 1151 | * width in hr, pre, table, td and th - like 'height' |
1152 | 1152 | ||
1153 | Example input: | 1153 | Example input: |
1154 | 1154 | ||
1155 | <img src="j.gif" alt="image" name="dad's" /><img src="k.gif" alt="image" id="dad_off" name="dad" /> | 1155 | <img src="j.gif" alt="image" name="dad's" /><img src="k.gif" alt="image" id="dad_off" name="dad" /> |
1156 | <br clear="left" /> | 1156 | <br clear="left" /> |
1157 | <hr noshade size="1" /> | 1157 | <hr noshade size="1" /> |
1158 | <img name="img" src="i.gif" align="left" alt="image" hspace="10" vspace="10" width="10em" height="20" border="1" style="padding:5px;" /> | 1158 | <img name="img" src="i.gif" align="left" alt="image" hspace="10" vspace="10" width="10em" height="20" border="1" style="padding:5px;" /> |
1159 | <table width="50em" align="center" bgcolor="red"> | 1159 | <table width="50em" align="center" bgcolor="red"> |
1160 | <tr> | 1160 | <tr> |
1161 | <td width="20%"> | 1161 | <td width="20%"> |
1162 | <div align="center"> | 1162 | <div align="center"> |
1163 | <h3 align="right">Section</h3> | 1163 | <h3 align="right">Section</h3> |
1164 | <p align="right">Para</p> | 1164 | <p align="right">Para</p> |
1165 | </div> | 1165 | </div> |
1166 | </td> | 1166 | </td> |
1167 | <td width="*"> | 1167 | <td width="*"> |
1168 | </td> | 1168 | </td> |
1169 | </tr> | 1169 | </tr> |
1170 | </table> | 1170 | </table> |
1171 | <br clear="all" /> | 1171 | <br clear="all" /> |
1172 | 1172 | ||
1173 | And the output with '$config["no_deprecated_attr"] = 1': | 1173 | And the output with '$config["no_deprecated_attr"] = 1': |
1174 | 1174 | ||
1175 | <img src="j.gif" alt="image" id="dad's" /><img src="k.gif" alt="image" id="dad_off" /> | 1175 | <img src="j.gif" alt="image" id="dad's" /><img src="k.gif" alt="image" id="dad_off" /> |
1176 | <br style="clear: left;" /> | 1176 | <br style="clear: left;" /> |
1177 | <hr style="border-style: none; border: 0; background-color: gray; color: gray; size: 1px;" /> | 1177 | <hr style="border-style: none; border: 0; background-color: gray; color: gray; size: 1px;" /> |
1178 | <img src="i.gif" alt="image" width="10em" height="20" style="padding:5px; float: left; margin-left: 10px; margin-right: 10px; margin-top: 10px; margin-bottom: 10px; border: 1px;" id="img" /> | 1178 | <img src="i.gif" alt="image" width="10em" height="20" style="padding:5px; float: left; margin-left: 10px; margin-right: 10px; margin-top: 10px; margin-bottom: 10px; border: 1px;" id="img" /> |
1179 | <table width="50em" style="margin: auto; background-color: red;"> | 1179 | <table width="50em" style="margin: auto; background-color: red;"> |
1180 | <tr> | 1180 | <tr> |
1181 | <td style="width: 20%;"> | 1181 | <td style="width: 20%;"> |
1182 | <div style="margin: auto;"> | 1182 | <div style="margin: auto;"> |
1183 | <h3 style="text-align: right;">Section</h3> | 1183 | <h3 style="text-align: right;">Section</h3> |
1184 | <p style="text-align: right;">Para</p> | 1184 | <p style="text-align: right;">Para</p> |
1185 | </div> | 1185 | </div> |
1186 | </td> | 1186 | </td> |
1187 | <td style="width: auto;"> | 1187 | <td style="width: auto;"> |
1188 | </td> | 1188 | </td> |
1189 | </tr> | 1189 | </tr> |
1190 | </table> | 1190 | </table> |
1191 | <br style="clear: both;" /> | 1191 | <br style="clear: both;" /> |
1192 | 1192 | ||
1193 | For 'lang', deprecated in XHTML 1.1, transformation is taken care of through '$config["xml:lang"]'; see section:- #3.4.1. | 1193 | For 'lang', deprecated in XHTML 1.1, transformation is taken care of through '$config["xml:lang"]'; see section:- #3.4.1. |
1194 | 1194 | ||
1195 | The attribute 'name' is deprecated in 'form', 'iframe', and 'img', and is replaced with 'id' if an 'id' attribute doesn't exist and if the 'name' value is appropriate for 'id' (i.e., doesn't have a non-word character like space). For such replacements for 'a' and 'map', for which the 'name' attribute is deprecated in XHTML 1.1, '$config["no_deprecated_attr"]' should be set to '2' (when set to '1', for these two elements, the 'name' attribute is retained). | 1195 | The attribute 'name' is deprecated in 'form', 'iframe', and 'img', and is replaced with 'id' if an 'id' attribute doesn't exist and if the 'name' value is appropriate for 'id' (i.e., doesn't have a non-word character like space). For such replacements for 'a' and 'map', for which the 'name' attribute is deprecated in XHTML 1.1, '$config["no_deprecated_attr"]' should be set to '2' (when set to '1', for these two elements, the 'name' attribute is retained). |
1196 | 1196 | ||
1197 | 1197 | ||
1198 | .. 3.4.7 Anti-spam & 'href' .......................................o | 1198 | .. 3.4.7 Anti-spam & 'href' .......................................o |
1199 | 1199 | ||
1200 | 1200 | ||
1201 | htmLawed (function 'hl_tag()') can check the 'href' attribute values (link addresses) as an anti-spam (email or link spam) measure. | 1201 | htmLawed (function 'hl_tag()') can check the 'href' attribute values (link addresses) as an anti-spam (email or link spam) measure. |
1202 | 1202 | ||
1203 | If '$config["anti_mail_spam"]' is not '0', the '@' of email addresses in 'href' values like 'mailto:a@b.com' is replaced with text specified by '$config["anti_mail_spam"]'. The text should be of a form that makes it clear to others that the address needs to be edited before a mail is sent; e.g., '<remove_this_antispam>@' (makes the example address 'a<remove_this_antispam>@b.com'). | 1203 | If '$config["anti_mail_spam"]' is not '0', the '@' of email addresses in 'href' values like 'mailto:a@b.com' is replaced with text specified by '$config["anti_mail_spam"]'. The text should be of a form that makes it clear to others that the address needs to be edited before a mail is sent; e.g., '<remove_this_antispam>@' (makes the example address 'a<remove_this_antispam>@b.com'). |
1204 | 1204 | ||
1205 | For regular links, one can choose to have a 'rel' attribute with 'nofollow' in its value (which tells some search engines to not follow a link). This can discourage link spammers. Additionally, or as an alternative, one can choose to empty the 'href' value altogether (disable the link). | 1205 | For regular links, one can choose to have a 'rel' attribute with 'nofollow' in its value (which tells some search engines to not follow a link). This can discourage link spammers. Additionally, or as an alternative, one can choose to empty the 'href' value altogether (disable the link). |
1206 | 1206 | ||
1207 | For use of these options, '$config["anti_link_spam"]' should be set as an array with values 'regex1' and 'regex2', both or one of which can be empty (like 'array("", "regex2")') to indicate that that option is not to be used. Otherwise, 'regex1' or 'regex2' should be PHP- and PCRE-compatible regular expression patterns: 'href' values will be matched against them and those matching the pattern will accordingly be treated. | 1207 | For use of these options, '$config["anti_link_spam"]' should be set as an array with values 'regex1' and 'regex2', both or one of which can be empty (like 'array("", "regex2")') to indicate that that option is not to be used. Otherwise, 'regex1' or 'regex2' should be PHP- and PCRE-compatible regular expression patterns: 'href' values will be matched against them and those matching the pattern will accordingly be treated. |
1208 | 1208 | ||
1209 | Note that the regular expressions should have `delimiters`, and be well-formed and preferably fast. Absolute efficiency/accuracy is often not needed. | 1209 | Note that the regular expressions should have `delimiters`, and be well-formed and preferably fast. Absolute efficiency/accuracy is often not needed. |
1210 | 1210 | ||
1211 | An example, to have a 'rel' attribute with 'nofollow' for all links, and to disable links that do not point to domains 'abc.com' and 'xyz.org': | 1211 | An example, to have a 'rel' attribute with 'nofollow' for all links, and to disable links that do not point to domains 'abc.com' and 'xyz.org': |
1212 | 1212 | ||
1213 | $config["anti_link_spam"] = array('`.`', '`://\W*(?!(abc\.com|xyz\.org))`'); | 1213 | $config["anti_link_spam"] = array('`.`', '`://\W*(?!(abc\.com|xyz\.org))`'); |
1214 | 1214 | ||
1215 | 1215 | ||
1216 | .. 3.4.8 Inline style properties ..................................o | 1216 | .. 3.4.8 Inline style properties ..................................o |
1217 | 1217 | ||
1218 | 1218 | ||
1219 | htmLawed can check URL schemes and dynamic expressions (to guard against Javascript, etc., script-based insecurities) in inline CSS style property values in the 'style' attributes. (CSS properties like 'background-image' that accept URLs in their values are noted in section:- #5.3.) Dynamic CSS expressions that allow scripting in the IE browser, and can be a vulnerability, can be removed from property values by setting '$config["css_expression"]' to '1' (default setting). Note that when '$config["css_expression"]' is set to '1', htmLawed will remove '/*' from the 'style' values. | 1219 | htmLawed can check URL schemes and dynamic expressions (to guard against Javascript, etc., script-based insecurities) in inline CSS style property values in the 'style' attributes. (CSS properties like 'background-image' that accept URLs in their values are noted in section:- #5.3.) Dynamic CSS expressions that allow scripting in the IE browser, and can be a vulnerability, can be removed from property values by setting '$config["css_expression"]' to '1' (default setting). Note that when '$config["css_expression"]' is set to '1', htmLawed will remove '/*' from the 'style' values. |
1220 | 1220 | ||
1221 | *Note*: Because of the various ways of representing characters in attribute values (URL-escapement, entitification, etc.), htmLawed might alter the values of the 'style' attribute values, and may even falsely identify dynamic CSS expressions and URL schemes in them. If this is an important issue, checking of URLs and dynamic expressions can be turned off ('$config["schemes"] = "...style:*..."', see section:- #3.4.3, and '$config["css_expression"] = 0'). Alternately, admins can use their own custom function for finer handling of 'style' values through the 'hook_tag' parameter (see section:- #3.4.9). | 1221 | *Note*: Because of the various ways of representing characters in attribute values (URL-escapement, entitification, etc.), htmLawed might alter the values of the 'style' attribute values, and may even falsely identify dynamic CSS expressions and URL schemes in them. If this is an important issue, checking of URLs and dynamic expressions can be turned off ('$config["schemes"] = "...style:*..."', see section:- #3.4.3, and '$config["css_expression"] = 0'). Alternately, admins can use their own custom function for finer handling of 'style' values through the 'hook_tag' parameter (see section:- #3.4.9). |
1222 | 1222 | ||
1223 | It is also possible to have htmLawed let through any 'style' value by setting '$config["style_pass"]' to '1'. | 1223 | It is also possible to have htmLawed let through any 'style' value by setting '$config["style_pass"]' to '1'. |
1224 | 1224 | ||
1225 | As such, it is better to set up a CSS file with class declarations, disallow the 'style' attribute, set a '$spec' rule (see section:- #2.3) for 'class' for the 'oneof' or 'match' parameter, and ask writers to make use of the 'class' attribute. | 1225 | As such, it is better to set up a CSS file with class declarations, disallow the 'style' attribute, set a '$spec' rule (see section:- #2.3) for 'class' for the 'oneof' or 'match' parameter, and ask writers to make use of the 'class' attribute. |
1226 | 1226 | ||
1227 | 1227 | ||
1228 | .. 3.4.9 Hook function for tag content ............................o | 1228 | .. 3.4.9 Hook function for tag content ............................o |
1229 | 1229 | ||
1230 | 1230 | ||
1231 | It is possible to utilize a custom hook function to alter the tag content htmLawed has finalized (i.e., after it has checked/corrected for required attributes, transformed attributes, lower-cased attribute names, etc.). | 1231 | It is possible to utilize a custom hook function to alter the tag content htmLawed has finalized (i.e., after it has checked/corrected for required attributes, transformed attributes, lower-cased attribute names, etc.). |
1232 | 1232 | ||
1233 | When '$config' parameter 'hook_tag' is set to the name of a function, htmLawed (function 'hl_tag()') will pass on the element name, and the `finalized` attribute name-value pairs as array elements to the function. The function, after completing a task such as filtering or tag transformation, will typically return an empty string, the full opening tag string like '<element_name attribute_1_name="attribute_1_value"...>' (for empty elements like 'img' and 'input', the element-closing slash '/' should also be included), etc. | 1233 | When '$config' parameter 'hook_tag' is set to the name of a function, htmLawed (function 'hl_tag()') will pass on the element name, and the `finalized` attribute name-value pairs as array elements to the function. The function, after completing a task such as filtering or tag transformation, will typically return an empty string, the full opening tag string like '<element_name attribute_1_name="attribute_1_value"...>' (for empty elements like 'img' and 'input', the element-closing slash '/' should also be included), etc. |
1234 | 1234 | ||
1235 | Any 'hook_tag' function, since htmLawed version 1.1.11, also receives names of elements in closing tags, such as 'a' in the closing '</a>' tag of the element '<a href="http://cnn.com">CNN</a>'. No other value is passed to the function since a closing tag contains only element names. Typically, the function will return an empty string or a full closing tag (like '</a>'). | 1235 | Any 'hook_tag' function, since htmLawed version 1.1.11, also receives names of elements in closing tags, such as 'a' in the closing '</a>' tag of the element '<a href="http://cnn.com">CNN</a>'. No other value is passed to the function since a closing tag contains only element names. Typically, the function will return an empty string or a full closing tag (like '</a>'). |
1236 | 1236 | ||
1237 | This is a *powerful functionality* that can be exploited for various objectives: consolidate-and-convert inline 'style' attributes to 'class', convert 'embed' elements to 'object', permit only one 'caption' element in a 'table' element, disallow embedding of certain types of media, *inject HTML*, use CSSTidy:- http://csstidy.sourceforge.net to sanitize 'style' attribute values, etc. | 1237 | This is a *powerful functionality* that can be exploited for various objectives: consolidate-and-convert inline 'style' attributes to 'class', convert 'embed' elements to 'object', permit only one 'caption' element in a 'table' element, disallow embedding of certain types of media, *inject HTML*, use CSSTidy:- http://csstidy.sourceforge.net to sanitize 'style' attribute values, etc. |
1238 | 1238 | ||
1239 | As an example, the custom hook code below can be used to force a series of specifically ordered 'id' attributes on all elements, and a specific 'param' element inside all 'object' elements: | 1239 | As an example, the custom hook code below can be used to force a series of specifically ordered 'id' attributes on all elements, and a specific 'param' element inside all 'object' elements: |
1240 | 1240 | ||
1241 | function my_tag_function($element, $attribute_array=0){ | 1241 | function my_tag_function($element, $attribute_array=0){ |
1242 | 1242 | ||
1243 | // If second argument is not received, it means a closing tag is being handled | 1243 | // If second argument is not received, it means a closing tag is being handled |
1244 | if(is_numeric($attribute_array)){ | 1244 | if(is_numeric($attribute_array)){ |
1245 | return "</$element>"; | 1245 | return "</$element>"; |
1246 | } | 1246 | } |
1247 | 1247 | ||
1248 | static $id = 0; | 1248 | static $id = 0; |
1249 | // Remove any duplicate element | 1249 | // Remove any duplicate element |
1250 | if($element == 'param' && isset($attribute_array['allowscriptaccess'])){ | 1250 | if($element == 'param' && isset($attribute_array['allowscriptaccess'])){ |
1251 | return ''; | 1251 | return ''; |
1252 | } | 1252 | } |
1253 | 1253 | ||
1254 | $new_element = ''; | 1254 | $new_element = ''; |
1255 | 1255 | ||
1256 | // Force a serialized ID number | 1256 | // Force a serialized ID number |
1257 | $attribute_array['id'] = 'my_'. $id; | 1257 | $attribute_array['id'] = 'my_'. $id; |
1258 | ++$id; | 1258 | ++$id; |
1259 | 1259 | ||
1260 | // Inject param for allowscriptaccess | 1260 | // Inject param for allowscriptaccess |
1261 | if($element == 'object'){ | 1261 | if($element == 'object'){ |
1262 | $new_element = '<param id="my_'. $id. '"; allowscriptaccess="never" />'; | 1262 | $new_element = '<param id="my_'. $id. '"; allowscriptaccess="never" />'; |
1263 | ++$id; | 1263 | ++$id; |
1264 | } | 1264 | } |
1265 | 1265 | ||
1266 | $string = ''; | 1266 | $string = ''; |
1267 | foreach($attribute_array as $k=>$v){ | 1267 | foreach($attribute_array as $k=>$v){ |
1268 | $string .= " {$k}=\"{$v}\""; | 1268 | $string .= " {$k}=\"{$v}\""; |
1269 | } | 1269 | } |
1270 | 1270 | ||
1271 | static $empty_elements = array('area'=>1, 'br'=>1, 'col'=>1, 'command'=>1, 'embed'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'isindex'=>1, 'keygen'=>1, 'link'=>1, 'meta'=>1, 'param'=>1, 'source'=>1, 'track'=>1, 'wbr'=>1); | 1271 | static $empty_elements = array('area'=>1, 'br'=>1, 'col'=>1, 'command'=>1, 'embed'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'isindex'=>1, 'keygen'=>1, 'link'=>1, 'meta'=>1, 'param'=>1, 'source'=>1, 'track'=>1, 'wbr'=>1); |
1272 | 1272 | ||
1273 | return "<{$element}{$string}". (array_key_exists($element, $empty_elements) ? ' /' : ''). '>'. $new_element; | 1273 | return "<{$element}{$string}". (array_key_exists($element, $empty_elements) ? ' /' : ''). '>'. $new_element; |
1274 | } | 1274 | } |
1275 | 1275 | ||
1276 | The 'hook_tag' parameter is different from the 'hook' parameter (section:- #3.7). | 1276 | The 'hook_tag' parameter is different from the 'hook' parameter (section:- #3.7). |
1277 | 1277 | ||
1278 | Snippets of hook function code developed by others may be available on the htmLawed:- http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed website. | 1278 | Snippets of hook function code developed by others may be available on the htmLawed:- http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed website. |
1279 | 1279 | ||
1280 | 1280 | ||
1281 | -- 3.5 Simple configuration directive for most valid XHTML --------o | 1281 | -- 3.5 Simple configuration directive for most valid XHTML --------o |
1282 | 1282 | ||
1283 | 1283 | ||
1284 | If '$config["valid_xhtml"]' is set to '1', some relevant '$config' parameters (indicated by '~' in section:- #2.2) are auto-adjusted. This allows one to pass the '$config' argument with a simpler value. If a value for a parameter auto-set through 'valid_xhtml' is still manually provided, then that value will over-ride the auto-set value. | 1284 | If '$config["valid_xhtml"]' is set to '1', some relevant '$config' parameters (indicated by '~' in section:- #2.2) are auto-adjusted. This allows one to pass the '$config' argument with a simpler value. If a value for a parameter auto-set through 'valid_xhtml' is still manually provided, then that value will over-ride the auto-set value. |
1285 | 1285 | ||
1286 | 1286 | ||
1287 | -- 3.6 Simple configuration directive for most `safe` HTML --------o | 1287 | -- 3.6 Simple configuration directive for most `safe` HTML --------o |
1288 | 1288 | ||
1289 | 1289 | ||
1290 | `Safe` HTML refers to HTML that is restricted to reduce the vulnerability for scripting attacks (such as XSS) based on HTML code which otherwise may still be legal and compliant with the HTML standard specifications. When elements such as 'script' and 'object', and attributes such as 'onmouseover' and 'style' are allowed in the input text, an input writer can introduce malevolent HTML code. Note that what is considered 'safe' depends on the nature of the web application and the trust-level accorded to its users. | 1290 | `Safe` HTML refers to HTML that is restricted to reduce the vulnerability for scripting attacks (such as XSS) based on HTML code which otherwise may still be legal and compliant with the HTML standard specifications. When elements such as 'script' and 'object', and attributes such as 'onmouseover' and 'style' are allowed in the input text, an input writer can introduce malevolent HTML code. Note that what is considered 'safe' depends on the nature of the web application and the trust-level accorded to its users. |
1291 | 1291 | ||
1292 | htmLawed allows an admin to use '$config["safe"]' to auto-adjust multiple '$config' parameters (such as 'elements' which declares the allowed element-set), which otherwise would have to be manually set. The relevant parameters are indicated by '"' in section:- #2.2). Thus, one can pass the '$config' argument with a simpler value. Having the 'safe' parameter set to '1' is equivalent to setting the following '$config' parameters to the noted values : | 1292 | htmLawed allows an admin to use '$config["safe"]' to auto-adjust multiple '$config' parameters (such as 'elements' which declares the allowed element-set), which otherwise would have to be manually set. The relevant parameters are indicated by '"' in section:- #2.2). Thus, one can pass the '$config' argument with a simpler value. Having the 'safe' parameter set to '1' is equivalent to setting the following '$config' parameters to the noted values : |
1293 | 1293 | ||
1294 | cdata - 0 | 1294 | cdata - 0 |
1295 | comment - 0 | 1295 | comment - 0 |
1296 | deny_attribute - on* | 1296 | deny_attribute - on* |
1297 | elements - * -applet -audio -canvas -embed -iframe -object -script -video | 1297 | elements - * -applet -audio -canvas -embed -iframe -object -script -video |
1298 | schemes - href: aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, tel, telnet; style: !; *:file, http, https | 1298 | schemes - href: aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, tel, telnet; style: !; *:file, http, https |
1299 | 1299 | ||
1300 | With 'safe' set to '1', htmLawed considers 'CDATA' sections and HTML comments as plain text, and prohibits the 'applet', 'audio', 'canvas', 'embed', 'iframe', 'object', 'script' and 'video' elements, and the 'on*' attributes like 'onclick'. ( There are '$config' parameters like 'css_expression' that are not affected by the value set for 'safe' but whose default values still contribute towards a more `safe` output.) Further, unless overridden by the value for parameter 'schemes' (see section:- #3.4.3), the schemes 'app', 'data' and 'javascript' are not permitted, and URLs with schemes are neutralized so that, e.g., 'style="moz-binding:url(http://danger)"' becomes 'style="moz-binding:url(denied:http://danger)"'. | 1300 | With 'safe' set to '1', htmLawed considers 'CDATA' sections and HTML comments as plain text, and prohibits the 'applet', 'audio', 'canvas', 'embed', 'iframe', 'object', 'script' and 'video' elements, and the 'on*' attributes like 'onclick'. ( There are '$config' parameters like 'css_expression' that are not affected by the value set for 'safe' but whose default values still contribute towards a more `safe` output.) Further, unless overridden by the value for parameter 'schemes' (see section:- #3.4.3), the schemes 'app', 'data' and 'javascript' are not permitted, and URLs with schemes are neutralized so that, e.g., 'style="moz-binding:url(http://danger)"' becomes 'style="moz-binding:url(denied:http://danger)"'. |
1301 | 1301 | ||
1302 | Admins, however, may still want to completely deny the 'style' attribute, e.g., with code like | 1302 | Admins, however, may still want to completely deny the 'style' attribute, e.g., with code like |
1303 | 1303 | ||
1304 | $processed = htmLawed($text, array('safe'=>1, 'deny_attribute'=>'style')); | 1304 | $processed = htmLawed($text, array('safe'=>1, 'deny_attribute'=>'style')); |
1305 | 1305 | ||
1306 | Permitting the 'style' attribute brings in risks of `click-jacking`, etc. CSS property values can render a page non-functional or be used to deface it. Except for URLs, dynamic expressions, and some other things, htmLawed does not completely check 'style' values. It does provide ways for the code-developer implementing htmLawed to do such checks through the '$spec' argument, and through the 'hook_tag' parameter (see section:- #3.4.8 for more). Disallowing style completely and relying on CSS classes and stylesheet files is recommended. | 1306 | Permitting the 'style' attribute brings in risks of `click-jacking`, etc. CSS property values can render a page non-functional or be used to deface it. Except for URLs, dynamic expressions, and some other things, htmLawed does not completely check 'style' values. It does provide ways for the code-developer implementing htmLawed to do such checks through the '$spec' argument, and through the 'hook_tag' parameter (see section:- #3.4.8 for more). Disallowing style completely and relying on CSS classes and stylesheet files is recommended. |
1307 | 1307 | ||
1308 | If a value for a parameter auto-set through 'safe' is still manually provided, then that value can over-ride the auto-set value. E.g., with '$config["safe"] = 1' and '$config["elements"] = "* +script"', 'script', but not 'applet', is allowed. Such over-ride does not occur for 'deny_attribute' (for legacy reason) when comma-separated attribute names are provided as the value for this parameter (section:- #3.4); instead htmLawed will add 'on*' to the value provided for 'deny_attribute'. | 1308 | If a value for a parameter auto-set through 'safe' is still manually provided, then that value can over-ride the auto-set value. E.g., with '$config["safe"] = 1' and '$config["elements"] = "* +script"', 'script', but not 'applet', is allowed. Such over-ride does not occur for 'deny_attribute' (for legacy reason) when comma-separated attribute names are provided as the value for this parameter (section:- #3.4); instead htmLawed will add 'on*' to the value provided for 'deny_attribute'. |
1309 | 1309 | ||
1310 | A page illustrating the efficacy of htmLawed's anti-XSS abilities with 'safe' set to '1' against XSS vectors listed by RSnake:- http://ha.ckers.org/xss.html may be available here:- http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/rsnake/RSnakeXSSTest.htm. | 1310 | A page illustrating the efficacy of htmLawed's anti-XSS abilities with 'safe' set to '1' against XSS vectors listed by RSnake:- http://ha.ckers.org/xss.html may be available here:- http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/rsnake/RSnakeXSSTest.htm. |
1311 | 1311 | ||
1312 | 1312 | ||
1313 | -- 3.7 Using a hook function --------------------------------------o | 1313 | -- 3.7 Using a hook function --------------------------------------o |
1314 | 1314 | ||
1315 | 1315 | ||
1316 | If '$config["hook"]' is not set to '0', then htmLawed will allow preliminarily processed input to be altered by a hook function named by '$config["hook"]' before starting the main work (but after handling of characters, entities, HTML comments and 'CDATA' sections -- see code for function 'htmLawed()'). | 1316 | If '$config["hook"]' is not set to '0', then htmLawed will allow preliminarily processed input to be altered by a hook function named by '$config["hook"]' before starting the main work (but after handling of characters, entities, HTML comments and 'CDATA' sections -- see code for function 'htmLawed()'). |
1317 | 1317 | ||
1318 | The hook function also allows one to alter the `finalized` values of '$config' and '$spec'. | 1318 | The hook function also allows one to alter the `finalized` values of '$config' and '$spec'. |
1319 | 1319 | ||
1320 | Note that the 'hook' parameter is different from the 'hook_tag' parameter (section:- #3.4.9). | 1320 | Note that the 'hook' parameter is different from the 'hook_tag' parameter (section:- #3.4.9). |
1321 | 1321 | ||
1322 | Snippets of hook function code developed by others may be available on the htmLawed:- http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed website. | 1322 | Snippets of hook function code developed by others may be available on the htmLawed:- http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed website. |
1323 | 1323 | ||
1324 | 1324 | ||
1325 | -- 3.8 Obtaining `finalized` parameter values ---------------------o | 1325 | -- 3.8 Obtaining `finalized` parameter values ---------------------o |
1326 | 1326 | ||
1327 | 1327 | ||
1328 | htmLawed can assign the `finalized` '$config' and '$spec' values to a variable named by '$config["show_setting"]'. The variable, made global by htmLawed, is set as an array with three keys: 'config', with the '$config' value, 'spec', with the '$spec' value, and 'time', with a value that is the Unix time (the output of PHP's 'microtime()' function) when the value was assigned. Admins should use a PHP-compliant variable name (e.g., one that does not begin with a numerical digit) that does not conflict with variable names in their non-htmLawed code. | 1328 | htmLawed can assign the `finalized` '$config' and '$spec' values to a variable named by '$config["show_setting"]'. The variable, made global by htmLawed, is set as an array with three keys: 'config', with the '$config' value, 'spec', with the '$spec' value, and 'time', with a value that is the Unix time (the output of PHP's 'microtime()' function) when the value was assigned. Admins should use a PHP-compliant variable name (e.g., one that does not begin with a numerical digit) that does not conflict with variable names in their non-htmLawed code. |
1329 | 1329 | ||
1330 | The values, which are also post-hook function (if any), can be used to auto-generate information (on, e.g., the elements that are permitted) for input writers. | 1330 | The values, which are also post-hook function (if any), can be used to auto-generate information (on, e.g., the elements that are permitted) for input writers. |
1331 | 1331 | ||
1332 | 1332 | ||
1333 | -- 3.9 Retaining non-HTML tags in input with mixed markup ---------o | 1333 | -- 3.9 Retaining non-HTML tags in input with mixed markup ---------o |
1334 | 1334 | ||
1335 | 1335 | ||
1336 | htmLawed does not remove certain characters that, though invalid, are nevertheless `discouraged` in HTML documents as per the specifications (see section:- #5.1). This can be utilized to deal with input that contains mixed markup. Input that may have HTML markup as well as some other markup that is based on the '<', '>' and '&' characters is considered to have mixed markup. The non-HTML markup can be rather proprietary (like markup for emoticons/smileys), or standard (like MathML or SVG). Or it can be programming code meant for execution/evaluation (such as embedded PHP code). | 1336 | htmLawed does not remove certain characters that, though invalid, are nevertheless `discouraged` in HTML documents as per the specifications (see section:- #5.1). This can be utilized to deal with input that contains mixed markup. Input that may have HTML markup as well as some other markup that is based on the '<', '>' and '&' characters is considered to have mixed markup. The non-HTML markup can be rather proprietary (like markup for emoticons/smileys), or standard (like MathML or SVG). Or it can be programming code meant for execution/evaluation (such as embedded PHP code). |
1337 | 1337 | ||
1338 | To deal with such mixed markup, the input text can be pre-processed to hide the non-HTML markup by specifically replacing the '<', '>' and '&' characters with some of the HTML-discouraged characters (see section:- #3.1.2). Post-htmLawed processing, the replacements are reverted. | 1338 | To deal with such mixed markup, the input text can be pre-processed to hide the non-HTML markup by specifically replacing the '<', '>' and '&' characters with some of the HTML-discouraged characters (see section:- #3.1.2). Post-htmLawed processing, the replacements are reverted. |
1339 | 1339 | ||
1340 | An example (mixed HTML and PHP code in input text): | 1340 | An example (mixed HTML and PHP code in input text): |
1341 | 1341 | ||
1342 | $text = preg_replace('`<\?php(.+?)\?>`sm', "\x83?php\\1?\x84", $text); | 1342 | $text = preg_replace('`<\?php(.+?)\?>`sm', "\x83?php\\1?\x84", $text); |
1343 | $processed = htmLawed($text); | 1343 | $processed = htmLawed($text); |
1344 | $processed = preg_replace('`\x83\?php(.+?)\?\x84`sm', '<?php$1?>', $processed); | 1344 | $processed = preg_replace('`\x83\?php(.+?)\?\x84`sm', '<?php$1?>', $processed); |
1345 | 1345 | ||
1346 | This code will not work if '$config["clean_ms_char"]' is set to '1' (section:- #3.1), in which case one should instead deploy a hook function (section:- #3.7). (htmLawed internally uses certain control characters, code-points '1' to '7', and use of these characters as markers in the logic of hook functions may cause issues.) | 1346 | This code will not work if '$config["clean_ms_char"]' is set to '1' (section:- #3.1), in which case one should instead deploy a hook function (section:- #3.7). (htmLawed internally uses certain control characters, code-points '1' to '7', and use of these characters as markers in the logic of hook functions may cause issues.) |
1347 | 1347 | ||
1348 | Admins may also be able to use '$config["and_mark"]' to deal with such mixed markup; see section:- #3.2. | 1348 | Admins may also be able to use '$config["and_mark"]' to deal with such mixed markup; see section:- #3.2. |
1349 | 1349 | ||
1350 | 1350 | ||
1351 | == 4 Other =======================================================oo | 1351 | == 4 Other =======================================================oo |
1352 | 1352 | ||
1353 | 1353 | ||
1354 | -- 4.1 Support ----------------------------------------------------- | 1354 | -- 4.1 Support ----------------------------------------------------- |
1355 | 1355 | ||
1356 | 1356 | ||
1357 | Software updates and forum-based community-support may be found at http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed. For general PHP issues (not htmLawed-specific), support may be found through internet searches and at http://php.net. | 1357 | Software updates and forum-based community-support may be found at http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed. For general PHP issues (not htmLawed-specific), support may be found through internet searches and at http://php.net. |
1358 | 1358 | ||
1359 | 1359 | ||
1360 | -- 4.2 Known issues -----------------------------------------------o | 1360 | -- 4.2 Known issues -----------------------------------------------o |
1361 | 1361 | ||
1362 | 1362 | ||
1363 | See section:- #2.8. | 1363 | See section:- #2.8. |
1364 | 1364 | ||
1365 | 1365 | ||
1366 | -- 4.3 Change-log -------------------------------------------------o | 1366 | -- 4.3 Change-log -------------------------------------------------o |
1367 | 1367 | ||
1368 | 1368 | ||
1369 | (The release date for the downloadable package of files containing documentation, demo script, test-cases, etc., besides the 'htmLawed.php' file, may be updated without a change-log entry if the secondary files, but not htmLawed per se, are revised.) | 1369 | (The release date for the downloadable package of files containing documentation, demo script, test-cases, etc., besides the 'htmLawed.php' file, may be updated without a change-log entry if the secondary files, but not htmLawed per se, are revised.) |
1370 | 1370 | ||
1371 | `Version number - Release date. Notes` | 1371 | `Version number - Release date. Notes` |
1372 | 1372 | ||
1373 | 1.2.5 - 24 September 2019. Fixes two bugs in 'font' tag transformation | 1373 | 1.2.5 - 24 September 2019. Fixes two bugs in 'font' tag transformation |
1374 | 1374 | ||
1375 | 1.2.4.2 - 16 May 2019. Corrects a PHP notice if a semi-colon is present in '$config["schemes"]' | 1375 | 1.2.4.2 - 16 May 2019. Corrects a PHP notice if a semi-colon is present in '$config["schemes"]' |
1376 | 1376 | ||
1377 | 1.2.4.1 - 12 September 2017. Corrects a function re-declaration bug introduced in version 1.2.4 | 1377 | 1.2.4.1 - 12 September 2017. Corrects a function re-declaration bug introduced in version 1.2.4 |
1378 | 1378 | ||
1379 | 1.2.4 - 31 August 2017. Removes use of PHP 'create_function' function and '$php_errormsg' reserved variable (deprecated in PHP 7.2) | 1379 | 1.2.4 - 31 August 2017. Removes use of PHP 'create_function' function and '$php_errormsg' reserved variable (deprecated in PHP 7.2) |
1380 | 1380 | ||
1381 | 1.2.3 - 5 July 2017. New option value of '4' for '$config["comments"]' to stop enforcing a space character before the '-->' comment-closing marker | 1381 | 1.2.3 - 5 July 2017. New option value of '4' for '$config["comments"]' to stop enforcing a space character before the '-->' comment-closing marker |
1382 | 1382 | ||
1383 | 1.2.2 - 25 May 2017. Fix for a bug in parsing '$spec' that got introduced in version 1.2; also, '$spec' is now parsed to accommodate specifications for an HTML element when they are specified in multiple rules | 1383 | 1.2.2 - 25 May 2017. Fix for a bug in parsing '$spec' that got introduced in version 1.2; also, '$spec' is now parsed to accommodate specifications for an HTML element when they are specified in multiple rules |
1384 | 1384 | ||
1385 | 1.2.1.1 - 17 May 2017. Fix for a potential security vulnerability in transformation of deprecated attributes | 1385 | 1.2.1.1 - 17 May 2017. Fix for a potential security vulnerability in transformation of deprecated attributes |
1386 | 1386 | ||
1387 | 1.2.1 - 15 May 2017. Fix for a potential security vulnerability in transformation of deprecated attributes | 1387 | 1.2.1 - 15 May 2017. Fix for a potential security vulnerability in transformation of deprecated attributes |
1388 | 1388 | ||
1389 | 1.2 - 11 February 2017. (First beta release on 26 May 2013). Added support for HTML version 5; ARIA, data-* and microdata attributes; 'app', 'data', 'javascript' and 'tel' URL schemes (thus, 'javascript:' is not filtered in default mode). Removed support for code using Kses functions (see section:- #2.6). Changes in revisions to the beta releases are not noted here. | 1389 | 1.2 - 11 February 2017. (First beta release on 26 May 2013). Added support for HTML version 5; ARIA, data-* and microdata attributes; 'app', 'data', 'javascript' and 'tel' URL schemes (thus, 'javascript:' is not filtered in default mode). Removed support for code using Kses functions (see section:- #2.6). Changes in revisions to the beta releases are not noted here. |
1390 | 1390 | ||
1391 | 1.1.22 - 5 March 2016. Improved testing of attribute value rules specified in '$spec' | 1391 | 1.1.22 - 5 March 2016. Improved testing of attribute value rules specified in '$spec' |
1392 | 1392 | ||
1393 | 1.1.21 - 27 February 2016. Improvement and security fix in transforming 'font' element | 1393 | 1.1.21 - 27 February 2016. Improvement and security fix in transforming 'font' element |
1394 | 1394 | ||
1395 | 1.1.20 - 9 June 2015. Fix for a potential security vulnerability arising from unescaped double-quote character in single-quoted attribute value of some deprecated elements when tag transformation is enabled; recognition for non-(HTML 4) standard 'allowfullscreen' attribute of 'iframe' | 1395 | 1.1.20 - 9 June 2015. Fix for a potential security vulnerability arising from unescaped double-quote character in single-quoted attribute value of some deprecated elements when tag transformation is enabled; recognition for non-(HTML 4) standard 'allowfullscreen' attribute of 'iframe' |
1396 | 1396 | ||
1397 | 1.1.19 - 19 January 2015. Fix for a bug in cleaning of soft-hyphens in URL values, etc | 1397 | 1.1.19 - 19 January 2015. Fix for a bug in cleaning of soft-hyphens in URL values, etc |
1398 | 1398 | ||
1399 | 1.1.18 - 2 August 2014. Fix for a potential security vulnerability arising from specially encoded text with serial opening tags | 1399 | 1.1.18 - 2 August 2014. Fix for a potential security vulnerability arising from specially encoded text with serial opening tags |
1400 | 1400 | ||
1401 | 1.1.17 - 11 March 2014. Removed use of PHP function preg_replace with 'e' modifier for compatibility with PHP 5.5. | 1401 | 1.1.17 - 11 March 2014. Removed use of PHP function preg_replace with 'e' modifier for compatibility with PHP 5.5. |
1402 | 1402 | ||
1403 | 1.1.16 - 29 August 2013. Fix for a potential security vulnerability arising from specialy encoded space characters in URL schemes/protocols | 1403 | 1.1.16 - 29 August 2013. Fix for a potential security vulnerability arising from specialy encoded space characters in URL schemes/protocols |
1404 | 1404 | ||
1405 | 1.1.15 - 11 August 2013. Improved tidying/prettifying functionality | 1405 | 1.1.15 - 11 August 2013. Improved tidying/prettifying functionality |
1406 | 1406 | ||
1407 | 1.1.14 - 8 August 2012. Fix for possible segmental loss of incremental indentation during 'tidying' when 'balance' is disabled; fix for non-effectuation under some circumstances of a corrective behavior to preserve plain text within elements like 'blockquote' | 1407 | 1.1.14 - 8 August 2012. Fix for possible segmental loss of incremental indentation during 'tidying' when 'balance' is disabled; fix for non-effectuation under some circumstances of a corrective behavior to preserve plain text within elements like 'blockquote' |
1408 | 1408 | ||
1409 | 1.1.13 - 22 July 2012. Added feature allowing use of custom, non-standard attributes or custom rules for standard attributes | 1409 | 1.1.13 - 22 July 2012. Added feature allowing use of custom, non-standard attributes or custom rules for standard attributes |
1410 | 1410 | ||
1411 | 1.1.12 - 5 July 2012. Fix for a bug in identifying an unquoted value of the 'face' attribute | 1411 | 1.1.12 - 5 July 2012. Fix for a bug in identifying an unquoted value of the 'face' attribute |
1412 | 1412 | ||
1413 | 1.1.11 - 5 June 2012. Fix for possible problem with handling of multi-byte characters in attribute values in an mbstring.func_overload enviroment. '$config["hook_tag"]', if specified, now receives names of elements in closing tags. | 1413 | 1.1.11 - 5 June 2012. Fix for possible problem with handling of multi-byte characters in attribute values in an mbstring.func_overload enviroment. '$config["hook_tag"]', if specified, now receives names of elements in closing tags. |
1414 | 1414 | ||
1415 | 1.1.10 - 22 October 2011. Fix for a bug in the 'tidy' functionality that caused the entire input to be replaced with a single space; new parameter, '$config["direct_list_nest"]' to allow direct descendance of a list in a list. (5 April 2012. Dual licensing from LGPLv3 to LGPLv3 and GPLv2+.) | 1415 | 1.1.10 - 22 October 2011. Fix for a bug in the 'tidy' functionality that caused the entire input to be replaced with a single space; new parameter, '$config["direct_list_nest"]' to allow direct descendance of a list in a list. (5 April 2012. Dual licensing from LGPLv3 to LGPLv3 and GPLv2+.) |
1416 | 1416 | ||
1417 | 1.1.9.5 - 6 July 2011. Minor correction of a rule for nesting of 'li' within 'dir' | 1417 | 1.1.9.5 - 6 July 2011. Minor correction of a rule for nesting of 'li' within 'dir' |
1418 | 1418 | ||
1419 | 1.1.9.4 - 3 July 2010. Parameter 'schemes' now accepts '!' so any URL, even a local one, can be `denied`. An issue in which a second URL value in 'style' properties was not checked was fixed. | 1419 | 1.1.9.4 - 3 July 2010. Parameter 'schemes' now accepts '!' so any URL, even a local one, can be `denied`. An issue in which a second URL value in 'style' properties was not checked was fixed. |
1420 | 1420 | ||
1421 | 1.1.9.3 - 17 May 2010. Checks for correct nesting of 'param' | 1421 | 1.1.9.3 - 17 May 2010. Checks for correct nesting of 'param' |
1422 | 1422 | ||
1423 | 1.1.9.2 - 26 April 2010. Minor fix regarding rendering of denied URL schemes | 1423 | 1.1.9.2 - 26 April 2010. Minor fix regarding rendering of denied URL schemes |
1424 | 1424 | ||
1425 | 1.1.9.1 - 26 February 2010. htmLawed now uses the LGPL version 3 license; support for 'flashvars' attribute for 'embed' | 1425 | 1.1.9.1 - 26 February 2010. htmLawed now uses the LGPL version 3 license; support for 'flashvars' attribute for 'embed' |
1426 | 1426 | ||
1427 | 1.1.9 - 22 December 2009. Soft-hyphens are now removed only from URL-accepting attribute values | 1427 | 1.1.9 - 22 December 2009. Soft-hyphens are now removed only from URL-accepting attribute values |
1428 | 1428 | ||
1429 | 1.1.8.1 - 16 July 2009. Minor code-change to fix a PHP error notice | 1429 | 1.1.8.1 - 16 July 2009. Minor code-change to fix a PHP error notice |
1430 | 1430 | ||
1431 | 1.1.8 - 23 April 2009. Parameter 'deny_attribute' now accepts the wild-card '*', making it simpler to specify its value when all but a few attributes are being denied; fixed a bug in interpreting '$spec' | 1431 | 1.1.8 - 23 April 2009. Parameter 'deny_attribute' now accepts the wild-card '*', making it simpler to specify its value when all but a few attributes are being denied; fixed a bug in interpreting '$spec' |
1432 | 1432 | ||
1433 | 1.1.7 - 11-12 March 2009. Attributes globally denied through 'deny_attribute' can be allowed element-specifically through '$spec'; '$config["style_pass"]' allowing letting through any 'style' value introduced; altered logic to catch certain types of dynamic crafted CSS expressions | 1433 | 1.1.7 - 11-12 March 2009. Attributes globally denied through 'deny_attribute' can be allowed element-specifically through '$spec'; '$config["style_pass"]' allowing letting through any 'style' value introduced; altered logic to catch certain types of dynamic crafted CSS expressions |
1434 | 1434 | ||
1435 | 1.1.3-6 - 28-31 January - 4 February 2009. Altered logic to catch certain types of dynamic crafted CSS expressions | 1435 | 1.1.3-6 - 28-31 January - 4 February 2009. Altered logic to catch certain types of dynamic crafted CSS expressions |
1436 | 1436 | ||
1437 | 1.1.2 - 22 January 2009. Fixed bug in parsing of 'font' attributes during tag transformation | 1437 | 1.1.2 - 22 January 2009. Fixed bug in parsing of 'font' attributes during tag transformation |
1438 | 1438 | ||
1439 | 1.1.1 - 27 September 2008. Better nesting correction when omitable closing tags are absent | 1439 | 1.1.1 - 27 September 2008. Better nesting correction when omitable closing tags are absent |
1440 | 1440 | ||
1441 | 1.1 - 29 June 2008. '$config["hook_tag"]' and '$config["tidy"]' introduced for custom tag/attribute check/modification/injection and output compaction/beautification; fixed a regex-in-$spec parsing bug | 1441 | 1.1 - 29 June 2008. '$config["hook_tag"]' and '$config["tidy"]' introduced for custom tag/attribute check/modification/injection and output compaction/beautification; fixed a regex-in-$spec parsing bug |
1442 | 1442 | ||
1443 | 1.0.9 - 11 June 2008. Fix for a bug in checks for invalid HTML code-point entities | 1443 | 1.0.9 - 11 June 2008. Fix for a bug in checks for invalid HTML code-point entities |
1444 | 1444 | ||
1445 | 1.0.8 - 15 May 2008. Permit 'bordercolor' attribute for 'table', 'td' and 'tr' | 1445 | 1.0.8 - 15 May 2008. Permit 'bordercolor' attribute for 'table', 'td' and 'tr' |
1446 | 1446 | ||
1447 | 1.0.7 - 1 May 2008. Support for 'wmode' attribute for 'embed'; '$config["show_setting"]' introduced; improved '$config["elements"]' evaluation | 1447 | 1.0.7 - 1 May 2008. Support for 'wmode' attribute for 'embed'; '$config["show_setting"]' introduced; improved '$config["elements"]' evaluation |
1448 | 1448 | ||
1449 | 1.0.6 - 20 April 2008. '$config["and_mark"]' introduced | 1449 | 1.0.6 - 20 April 2008. '$config["and_mark"]' introduced |
1450 | 1450 | ||
1451 | 1.0.5 - 12 March 2008. 'style' URL schemes essentially disallowed when $config 'safe' is on; improved regex for CSS expression search | 1451 | 1.0.5 - 12 March 2008. 'style' URL schemes essentially disallowed when $config 'safe' is on; improved regex for CSS expression search |
1452 | 1452 | ||
1453 | 1.0.4 - 10 March 2008. Improved corrections for 'blockquote', 'form', 'map' and 'noscript' | 1453 | 1.0.4 - 10 March 2008. Improved corrections for 'blockquote', 'form', 'map' and 'noscript' |
1454 | 1454 | ||
1455 | 1.0.3 - 3 March 2008. Character entities for soft-hyphens are now replaced with spaces (instead of being removed); fix for a bug allowing 'td' directly inside 'table'; '$config["safe"]' introduced | 1455 | 1.0.3 - 3 March 2008. Character entities for soft-hyphens are now replaced with spaces (instead of being removed); fix for a bug allowing 'td' directly inside 'table'; '$config["safe"]' introduced |
1456 | 1456 | ||
1457 | 1.0.2 - 13 February 2008. Improved implementation of '$config["keep_bad"]' | 1457 | 1.0.2 - 13 February 2008. Improved implementation of '$config["keep_bad"]' |
1458 | 1458 | ||
1459 | 1.0.1 - 7 November 2007. Improved regex for identifying URLs, protocols and dynamic expressions ('hl_tag()' and 'hl_prot()'); no error display with 'hl_regex()' | 1459 | 1.0.1 - 7 November 2007. Improved regex for identifying URLs, protocols and dynamic expressions ('hl_tag()' and 'hl_prot()'); no error display with 'hl_regex()' |
1460 | 1460 | ||
1461 | 1.0 - 2 November 2007. First release | 1461 | 1.0 - 2 November 2007. First release |
1462 | 1462 | ||
1463 | 1463 | ||
1464 | -- 4.4 Testing ----------------------------------------------------o | 1464 | -- 4.4 Testing ----------------------------------------------------o |
1465 | 1465 | ||
1466 | 1466 | ||
1467 | To test htmLawed using a form interface, a demo:- htmLawedTest.php web-page is provided with the htmLawed distribution ('htmLawed.php' and 'htmLawedTest.php' should be in the same directory on the web-server). A file with test-cases:- htmLawed_TESTCASE.txt is also provided. | 1467 | To test htmLawed using a form interface, a demo:- htmLawedTest.php web-page is provided with the htmLawed distribution ('htmLawed.php' and 'htmLawedTest.php' should be in the same directory on the web-server). A file with test-cases:- htmLawed_TESTCASE.txt is also provided. |
1468 | 1468 | ||
1469 | 1469 | ||
1470 | -- 4.5 Upgrade, & old versions ------------------------------------o | 1470 | -- 4.5 Upgrade, & old versions ------------------------------------o |
1471 | 1471 | ||
1472 | 1472 | ||
1473 | Upgrading is as simple as replacing the previous version of 'htmLawed.php', assuming the file was not modified for customized features. As htmLawed output is almost always used in static documents, upgrading should not affect old, finalized content. | 1473 | Upgrading is as simple as replacing the previous version of 'htmLawed.php', assuming the file was not modified for customized features. As htmLawed output is almost always used in static documents, upgrading should not affect old, finalized content. |
1474 | 1474 | ||
1475 | *Note:* The following upgrades may affect the functionality of a specific htmLawed installation: | 1475 | *Note:* The following upgrades may affect the functionality of a specific htmLawed installation: |
1476 | 1476 | ||
1477 | (1) From version 1.1-1.1.10 to 1.1.11 or later, if a 'hook_tag' function is in use: In version 1.1.11 and later, elements in closing tags (and not just the opening tags) are also passed to the function. There are no attribute names/values to pass, so a 'hook_tag' function receives only the element name. The 'hook_tag' function therefore may have to be edited. See section:- #3.4.9. | 1477 | (1) From version 1.1-1.1.10 to 1.1.11 or later, if a 'hook_tag' function is in use: In version 1.1.11 and later, elements in closing tags (and not just the opening tags) are also passed to the function. There are no attribute names/values to pass, so a 'hook_tag' function receives only the element name. The 'hook_tag' function therefore may have to be edited. See section:- #3.4.9. |
1478 | 1478 | ||
1479 | (2) From version older than 1.2.beta to later, if htmLawed was used as Kses replacement with Kses code in use: In version 1.2.beta or later, htmLawed no longer provides direct support for code that uses Kses functions (see section:- #2.6). | 1479 | (2) From version older than 1.2.beta to later, if htmLawed was used as Kses replacement with Kses code in use: In version 1.2.beta or later, htmLawed no longer provides direct support for code that uses Kses functions (see section:- #2.6). |
1480 | 1480 | ||
1481 | (3) From version older than 1.2 to later, if htmLawed is used without '$config["safe"]' set to 1: Unlike previous versions, htmLawed version 1.2 and later permit 'data' and 'javascript' URL schemes by default (see section:- #3.4.3). | 1481 | (3) From version older than 1.2 to later, if htmLawed is used without '$config["safe"]' set to 1: Unlike previous versions, htmLawed version 1.2 and later permit 'data' and 'javascript' URL schemes by default (see section:- #3.4.3). |
1482 | 1482 | ||
1483 | Old versions of htmLawed may be available online. E.g., for version 1.0, check http://www.bioinformatics.org/phplabware/downloads/htmLawed1.zip; for 1.1.1, http://www.bioinformatics.org/phplabware/downloads/htmLawed111.zip; and for 1.1.22, http://www.bioinformatics.org/phplabware/downloads/htmLawed1122.zip. | 1483 | Old versions of htmLawed may be available online. E.g., for version 1.0, check http://www.bioinformatics.org/phplabware/downloads/htmLawed1.zip; for 1.1.1, http://www.bioinformatics.org/phplabware/downloads/htmLawed111.zip; and for 1.1.22, http://www.bioinformatics.org/phplabware/downloads/htmLawed1122.zip. |
1484 | 1484 | ||
1485 | 1485 | ||
1486 | -- 4.6 Comparison with 'HTMLPurifier' -----------------------------o | 1486 | -- 4.6 Comparison with 'HTMLPurifier' -----------------------------o |
1487 | 1487 | ||
1488 | 1488 | ||
1489 | The HTMLPurifier PHP library by Edward Yang is a very good HTML filtering script that uses object oriented PHP code. Compared to htmLawed, it (as of year 2015): | 1489 | The HTMLPurifier PHP library by Edward Yang is a very good HTML filtering script that uses object oriented PHP code. Compared to htmLawed, it (as of year 2015): |
1490 | 1490 | ||
1491 | * does not support PHP versions older than 5.0 (HTMLPurifier dropped PHP 4 support after version 2) | 1491 | * does not support PHP versions older than 5.0 (HTMLPurifier dropped PHP 4 support after version 2) |
1492 | 1492 | ||
1493 | * is 15-20 times bigger (scores of files totalling more than 750 kb) | 1493 | * is 15-20 times bigger (scores of files totalling more than 750 kb) |
1494 | 1494 | ||
1495 | * consumes 10-15 times more RAM memory (just including the HTMLPurifier files without calling the filter requires a few MBs of memory) | 1495 | * consumes 10-15 times more RAM memory (just including the HTMLPurifier files without calling the filter requires a few MBs of memory) |
1496 | 1496 | ||
1497 | * is expectedly slower | 1497 | * is expectedly slower |
1498 | 1498 | ||
1499 | * lacks many of the extra features of htmLawed (like entity conversions and code compaction/beautification) | 1499 | * lacks many of the extra features of htmLawed (like entity conversions and code compaction/beautification) |
1500 | 1500 | ||
1501 | * has poor documentation | 1501 | * has poor documentation |
1502 | 1502 | ||
1503 | However, HTMLPurifier has finer checks for character encodings and attribute values, and can log warnings and errors. Visit the HTMLPurifier website:- http://htmlpurifier.org for updated information. | 1503 | However, HTMLPurifier has finer checks for character encodings and attribute values, and can log warnings and errors. Visit the HTMLPurifier website:- http://htmlpurifier.org for updated information. |
1504 | 1504 | ||
1505 | 1505 | ||
1506 | -- 4.7 Use through application plug-ins/modules -------------------o | 1506 | -- 4.7 Use through application plug-ins/modules -------------------o |
1507 | 1507 | ||
1508 | 1508 | ||
1509 | Plug-ins/modules to implement htmLawed in applications such as Drupal may have been developed. Check the application websites and the htmLawed forum:- http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed. | 1509 | Plug-ins/modules to implement htmLawed in applications such as Drupal may have been developed. Check the application websites and the htmLawed forum:- http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed. |
1510 | 1510 | ||
1511 | 1511 | ||
1512 | -- 4.8 Use in non-PHP applications --------------------------------o | 1512 | -- 4.8 Use in non-PHP applications --------------------------------o |
1513 | 1513 | ||
1514 | 1514 | ||
1515 | Non-PHP applications written in Python, Ruby, etc., may be able to use htmLawed through system calls to the PHP engine. Such code may have been documented on the internet. Also check the forum on the htmLawed site:- http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed. | 1515 | Non-PHP applications written in Python, Ruby, etc., may be able to use htmLawed through system calls to the PHP engine. Such code may have been documented on the internet. Also check the forum on the htmLawed site:- http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed. |
1516 | 1516 | ||
1517 | 1517 | ||
1518 | -- 4.9 Donate -----------------------------------------------------o | 1518 | -- 4.9 Donate -----------------------------------------------------o |
1519 | 1519 | ||
1520 | 1520 | ||
1521 | A donation in any currency and amount to appreciate or support this software can be sent by PayPal:- http://paypal.com to this email address: drpatnaik at yahoo dot com. | 1521 | A donation in any currency and amount to appreciate or support this software can be sent by PayPal:- http://paypal.com to this email address: drpatnaik at yahoo dot com. |
1522 | 1522 | ||
1523 | 1523 | ||
1524 | -- 4.10 Acknowledgements ------------------------------------------o | 1524 | -- 4.10 Acknowledgements ------------------------------------------o |
1525 | 1525 | ||
1526 | 1526 | ||
1527 | Nicholas Alipaz, Bryan Blakey, Pádraic Brady, Dac Chartrand, Alexandre Chouinard, Ulf Harnhammer, Gareth Heyes, Hakre, Klaus Leithoff, Lukasz Pilorz, Shelley Powers, Psych0tr1a, Lincoln Russell, Tomas Sykorka, Harro Verton, Edward Yang, and many anonymous users. | 1527 | Nicholas Alipaz, Bryan Blakey, Pádraic Brady, Dac Chartrand, Alexandre Chouinard, Ulf Harnhammer, Gareth Heyes, Hakre, Klaus Leithoff, Lukasz Pilorz, Shelley Powers, Psych0tr1a, Lincoln Russell, Tomas Sykorka, Harro Verton, Edward Yang, and many anonymous users. |
1528 | 1528 | ||
1529 | Thank you! | 1529 | Thank you! |
1530 | 1530 | ||
1531 | 1531 | ||
1532 | == 5 Appendices ==================================================oo | 1532 | == 5 Appendices ==================================================oo |
1533 | 1533 | ||
1534 | 1534 | ||
1535 | -- 5.1 Characters discouraged in XHTML ----------------------------- | 1535 | -- 5.1 Characters discouraged in XHTML ----------------------------- |
1536 | 1536 | ||
1537 | 1537 | ||
1538 | Characters represented by the following hexadecimal code-points are `not` invalid, even though some validators may issue messages stating otherwise. | 1538 | Characters represented by the following hexadecimal code-points are `not` invalid, even though some validators may issue messages stating otherwise. |
1539 | 1539 | ||
1540 | '7f' to '84', '86' to '9f', 'fdd0' to 'fddf', '1fffe', '1ffff', '2fffe', '2ffff', '3fffe', '3ffff', '4fffe', '4ffff', '5fffe', '5ffff', '6fffe', '6ffff', '7fffe', '7ffff', '8fffe', '8ffff', '9fffe', '9ffff', 'afffe', 'affff', 'bfffe', 'bffff', 'cfffe', 'cffff', 'dfffe', 'dffff', 'efffe', 'effff', 'ffffe', 'fffff', '10fffe' and '10ffff' | 1540 | '7f' to '84', '86' to '9f', 'fdd0' to 'fddf', '1fffe', '1ffff', '2fffe', '2ffff', '3fffe', '3ffff', '4fffe', '4ffff', '5fffe', '5ffff', '6fffe', '6ffff', '7fffe', '7ffff', '8fffe', '8ffff', '9fffe', '9ffff', 'afffe', 'affff', 'bfffe', 'bffff', 'cfffe', 'cffff', 'dfffe', 'dffff', 'efffe', 'effff', 'ffffe', 'fffff', '10fffe' and '10ffff' |
1541 | 1541 | ||
1542 | 1542 | ||
1543 | -- 5.2 Valid attribute-element combinations -----------------------o | 1543 | -- 5.2 Valid attribute-element combinations -----------------------o |
1544 | 1544 | ||
1545 | 1545 | ||
1546 | * includes deprecated attributes (marked '^'), attributes for microdata (marked '*'), the non-standard 'bordercolor', and new-in-HTML5 attributes (marked '~'); can have multiple comma-separated values (marked '%'); can have multiple space-separated values (marked '$') | 1546 | * includes deprecated attributes (marked '^'), attributes for microdata (marked '*'), the non-standard 'bordercolor', and new-in-HTML5 attributes (marked '~'); can have multiple comma-separated values (marked '%'); can have multiple space-separated values (marked '$') |
1547 | * only non-frameset, HTML body elements | 1547 | * only non-frameset, HTML body elements |
1548 | * 'name' for 'a' and 'map', and 'lang' are invalid in XHTML 1.1 | 1548 | * 'name' for 'a' and 'map', and 'lang' are invalid in XHTML 1.1 |
1549 | * 'target' is valid for 'a' in XHTML 1.1 and higher | 1549 | * 'target' is valid for 'a' in XHTML 1.1 and higher |
1550 | * 'xml:space' is only for XHTML 1.1 | 1550 | * 'xml:space' is only for XHTML 1.1 |
1551 | 1551 | ||
1552 | abbr - td, th | 1552 | abbr - td, th |
1553 | accept - form, input | 1553 | accept - form, input |
1554 | accept-charset - form | 1554 | accept-charset - form |
1555 | action - form | 1555 | action - form |
1556 | align - applet, caption^, col, colgroup, div^, embed, h1^, h2^, h3^, h4^, h5^, h6^, hr^, iframe, img^, input^, legend^, object^, p^, table^, tbody, td, tfoot, th, thead, tr | 1556 | align - applet, caption^, col, colgroup, div^, embed, h1^, h2^, h3^, h4^, h5^, h6^, hr^, iframe, img^, input^, legend^, object^, p^, table^, tbody, td, tfoot, th, thead, tr |
1557 | allowfullscreen - iframe | 1557 | allowfullscreen - iframe |
1558 | alt - applet, area, img, input | 1558 | alt - applet, area, img, input |
1559 | archive - applet, object | 1559 | archive - applet, object |
1560 | async~ - script | 1560 | async~ - script |
1561 | autocomplete~ - input | 1561 | autocomplete~ - input |
1562 | autofocus~ - button, input, keygen, select, textarea | 1562 | autofocus~ - button, input, keygen, select, textarea |
1563 | autoplay~ - audio, video | 1563 | autoplay~ - audio, video |
1564 | axis - td, th | 1564 | axis - td, th |
1565 | bgcolor - embed, table^, td^, th^, tr^ | 1565 | bgcolor - embed, table^, td^, th^, tr^ |
1566 | border - img, object^, table | 1566 | border - img, object^, table |
1567 | bordercolor - table, td, tr | 1567 | bordercolor - table, td, tr |
1568 | cellpadding - table | 1568 | cellpadding - table |
1569 | cellspacing - table | 1569 | cellspacing - table |
1570 | challenge~ - keygen | 1570 | challenge~ - keygen |
1571 | char - col, colgroup, tbody, td, tfoot, th, thead, tr | 1571 | char - col, colgroup, tbody, td, tfoot, th, thead, tr |
1572 | charoff - col, colgroup, tbody, td, tfoot, th, thead, tr | 1572 | charoff - col, colgroup, tbody, td, tfoot, th, thead, tr |
1573 | charset - a, script | 1573 | charset - a, script |
1574 | checked - command, input | 1574 | checked - command, input |
1575 | cite - blockquote, del, ins, q | 1575 | cite - blockquote, del, ins, q |
1576 | classid - object | 1576 | classid - object |
1577 | clear - br^ | 1577 | clear - br^ |
1578 | code - applet | 1578 | code - applet |
1579 | codebase - object, applet | 1579 | codebase - object, applet |
1580 | codetype - object | 1580 | codetype - object |
1581 | color - font | 1581 | color - font |
1582 | cols - textarea | 1582 | cols - textarea |
1583 | colspan - td, th | 1583 | colspan - td, th |
1584 | compact - dir, dl^, menu, ol^, ul^ | 1584 | compact - dir, dl^, menu, ol^, ul^ |
1585 | content - meta | 1585 | content - meta |
1586 | controls~ - audio, video | 1586 | controls~ - audio, video |
1587 | coords - area, a | 1587 | coords - area, a |
1588 | crossorigin~ - img | 1588 | crossorigin~ - img |
1589 | data - object | 1589 | data - object |
1590 | datetime - del, ins, time | 1590 | datetime - del, ins, time |
1591 | declare - object | 1591 | declare - object |
1592 | default~ - track | 1592 | default~ - track |
1593 | defer - script | 1593 | defer - script |
1594 | dir - bdo | 1594 | dir - bdo |
1595 | dirname~ - input, textarea | 1595 | dirname~ - input, textarea |
1596 | disabled - button, command, fieldset, input, keygen, optgroup, option, select, textarea | 1596 | disabled - button, command, fieldset, input, keygen, optgroup, option, select, textarea |
1597 | download~ - a | 1597 | download~ - a |
1598 | enctype - form | 1598 | enctype - form |
1599 | face - font | 1599 | face - font |
1600 | flashvars** - embed | 1600 | flashvars** - embed |
1601 | for - label, output | 1601 | for - label, output |
1602 | form~ - button, fieldset, input, keygen, label, object, output, select, textarea | 1602 | form~ - button, fieldset, input, keygen, label, object, output, select, textarea |
1603 | formaction~ - button, input | 1603 | formaction~ - button, input |
1604 | formenctype~ - button, input | 1604 | formenctype~ - button, input |
1605 | formmethod~ - button, input | 1605 | formmethod~ - button, input |
1606 | formnovalidate~ - button, input | 1606 | formnovalidate~ - button, input |
1607 | formtarget~ - button, input | 1607 | formtarget~ - button, input |
1608 | frame - table | 1608 | frame - table |
1609 | frameborder - iframe | 1609 | frameborder - iframe |
1610 | headers - td, th | 1610 | headers - td, th |
1611 | height - applet, canvas, embed, iframe, img, input, object, td^, th^, video | 1611 | height - applet, canvas, embed, iframe, img, input, object, td^, th^, video |
1612 | high~ - meter | 1612 | high~ - meter |
1613 | href - a, area, link | 1613 | href - a, area, link |
1614 | hreflang - a, area, link | 1614 | hreflang - a, area, link |
1615 | hspace - applet, embed, img^, object^ | 1615 | hspace - applet, embed, img^, object^ |
1616 | icon~ - command | 1616 | icon~ - command |
1617 | ismap - img, input | 1617 | ismap - img, input |
1618 | keytype~ - keygen | 1618 | keytype~ - keygen |
1619 | keyparams~ - keygen | 1619 | keyparams~ - keygen |
1620 | kind~ - track | 1620 | kind~ - track |
1621 | label - command, menu, option, optgroup, track | 1621 | label - command, menu, option, optgroup, track |
1622 | language - script^ | 1622 | language - script^ |
1623 | list~ - input | 1623 | list~ - input |
1624 | longdesc - img, iframe | 1624 | longdesc - img, iframe |
1625 | loop~ - audio, video | 1625 | loop~ - audio, video |
1626 | low~ - meter | 1626 | low~ - meter |
1627 | marginheight - iframe | 1627 | marginheight - iframe |
1628 | marginwidth - iframe | 1628 | marginwidth - iframe |
1629 | max~ - input, meter, progress | 1629 | max~ - input, meter, progress |
1630 | maxlength - input, textarea | 1630 | maxlength - input, textarea |
1631 | media~ - a, area, link, source, style | 1631 | media~ - a, area, link, source, style |
1632 | mediagroup~ - audio, video | 1632 | mediagroup~ - audio, video |
1633 | method - form | 1633 | method - form |
1634 | min~ - input, meter | 1634 | min~ - input, meter |
1635 | model** - embed | 1635 | model** - embed |
1636 | multiple - input, select | 1636 | multiple - input, select |
1637 | muted~ - audio, video | 1637 | muted~ - audio, video |
1638 | name - a^, applet^, button, embed, fieldset, form^, iframe^, img^, input, keygen, map^, object, output, param, select, textarea | 1638 | name - a^, applet^, button, embed, fieldset, form^, iframe^, img^, input, keygen, map^, object, output, param, select, textarea |
1639 | nohref - area | 1639 | nohref - area |
1640 | noshade - hr^ | 1640 | noshade - hr^ |
1641 | novalidate~ - form | 1641 | novalidate~ - form |
1642 | nowrap - td^, th^ | 1642 | nowrap - td^, th^ |
1643 | object - applet | 1643 | object - applet |
1644 | open~ - details | 1644 | open~ - details |
1645 | optimum~ - meter | 1645 | optimum~ - meter |
1646 | pattern~ - input | 1646 | pattern~ - input |
1647 | ping~ - a, area | 1647 | ping~ - a, area |
1648 | placeholder~ - input, textarea | 1648 | placeholder~ - input, textarea |
1649 | pluginspage** - embed | 1649 | pluginspage** - embed |
1650 | pluginurl** - embed | 1650 | pluginurl** - embed |
1651 | poster~ - video | 1651 | poster~ - video |
1652 | pqg~ - keygen | 1652 | pqg~ - keygen |
1653 | preload~ - audio, video | 1653 | preload~ - audio, video |
1654 | prompt - isindex | 1654 | prompt - isindex |
1655 | pubdate~ - time | 1655 | pubdate~ - time |
1656 | radiogroup* - command | 1656 | radiogroup* - command |
1657 | readonly - input, textarea | 1657 | readonly - input, textarea |
1658 | required~ - input, select, textarea | 1658 | required~ - input, select, textarea |
1659 | rel$ - a, area, link | 1659 | rel$ - a, area, link |
1660 | rev - a | 1660 | rev - a |
1661 | reversed~ - old | 1661 | reversed~ - old |
1662 | rows - textarea | 1662 | rows - textarea |
1663 | rowspan - td, th | 1663 | rowspan - td, th |
1664 | rules - table | 1664 | rules - table |
1665 | sandbox~ - iframe | 1665 | sandbox~ - iframe |
1666 | scope - td, th | 1666 | scope - td, th |
1667 | scoped~ - style | 1667 | scoped~ - style |
1668 | scrolling - iframe | 1668 | scrolling - iframe |
1669 | seamless~ - iframe | 1669 | seamless~ - iframe |
1670 | selected - option | 1670 | selected - option |
1671 | shape - area, a | 1671 | shape - area, a |
1672 | size - font, hr^, input, select | 1672 | size - font, hr^, input, select |
1673 | sizes~ - link | 1673 | sizes~ - link |
1674 | span - col, colgroup | 1674 | span - col, colgroup |
1675 | src - audio, embed, iframe, img, input, script, source, track, video | 1675 | src - audio, embed, iframe, img, input, script, source, track, video |
1676 | srcdoc~ - iframe | 1676 | srcdoc~ - iframe |
1677 | srclang~ - track | 1677 | srclang~ - track |
1678 | srcset~% - img | 1678 | srcset~% - img |
1679 | standby - object | 1679 | standby - object |
1680 | start - ol | 1680 | start - ol |
1681 | step~ - input | 1681 | step~ - input |
1682 | summary - table | 1682 | summary - table |
1683 | target - a, area, form | 1683 | target - a, area, form |
1684 | type - a, area, button, command, embed, input, li, link, menu, object, ol, param, script, source, style, ul | 1684 | type - a, area, button, command, embed, input, li, link, menu, object, ol, param, script, source, style, ul |
1685 | typemustmatch~ - object | 1685 | typemustmatch~ - object |
1686 | usemap - img, input, object | 1686 | usemap - img, input, object |
1687 | valign - col, colgroup, tbody, td, tfoot, th, thead, tr | 1687 | valign - col, colgroup, tbody, td, tfoot, th, thead, tr |
1688 | value - button, data, input, li, meter, option, param, progress | 1688 | value - button, data, input, li, meter, option, param, progress |
1689 | valuetype - param | 1689 | valuetype - param |
1690 | vspace - applet, embed, img^, object^ | 1690 | vspace - applet, embed, img^, object^ |
1691 | width - applet, canvas, col, colgroup, embed, hr^, iframe, img, input, object, pre^, table, td^, th^, video | 1691 | width - applet, canvas, col, colgroup, embed, hr^, iframe, img, input, object, pre^, table, td^, th^, video |
1692 | wmode - embed | 1692 | wmode - embed |
1693 | wrap~ - textarea | 1693 | wrap~ - textarea |
1694 | 1694 | ||
1695 | The following attributes, including event-specific ones and attributes of ARIA and microdata specifications, are considered global and allowed in all elements: | 1695 | The following attributes, including event-specific ones and attributes of ARIA and microdata specifications, are considered global and allowed in all elements: |
1696 | 1696 | ||
1697 | accesskey, aria-activedescendant, aria-atomic, aria-autocomplete, aria-busy, aria-checked, aria-controls, aria-describedby, aria-disabled, aria-dropeffect, aria-expanded, aria-flowto, aria-grabbed, aria-haspopup, aria-hidden, aria-invalid, aria-label, aria-labelledby, aria-level, aria-live, aria-multiline, aria-multiselectable, aria-orientation, aria-owns, aria-posinset, aria-pressed, aria-readonly, aria-relevant, aria-required, aria-selected, aria-setsize, aria-sort, aria-valuemax, aria-valuemin, aria-valuenow, aria-valuetext, class$, contenteditable, contextmenu, dir, draggable, dropzone, hidden, id, inert, itemid, itemprop, itemref, itemscope, itemtype, lang, onabort, onblur, oncanplay, oncanplaythrough, onchange, onclick, oncontextmenu, oncopy, oncuechange, oncut, ondblclick, ondrag, ondragend, ondragenter, ondragleave, ondragover, ondragstart, ondrop, ondurationchange, onemptied, onended, onerror, onfocus, onformchange, onforminput, oninput, oninvalid, onkeydown, onkeypress, onkeyup, onload, onloadeddata, onloadedmetadata, onloadstart, onlostpointercapture, onmousedown, onmousemove, onmouseout, onmouseover, onmouseup, onmousewheel, onpaste, onpause, onplay, onplaying, onpointercancel, ongotpointercapture, onpointerdown, onpointerenter, onpointerleave, onpointermove, onpointerout, onpointerover, onpointerup, onprogress, onratechange, onreadystatechange, onreset, onsearch, onscroll, onseeked, onseeking, onselect, onshow, onstalled, onsubmit, onsuspend, ontimeupdate, ontoggle, ontouchcancel, ontouchend, ontouchmove, ontouchstart, onvolumechange, onwaiting, onwheel, role, spellcheck, style, tabindex, title, translate, xmlns, xml:base, xml:lang, xml:space | 1697 | accesskey, aria-activedescendant, aria-atomic, aria-autocomplete, aria-busy, aria-checked, aria-controls, aria-describedby, aria-disabled, aria-dropeffect, aria-expanded, aria-flowto, aria-grabbed, aria-haspopup, aria-hidden, aria-invalid, aria-label, aria-labelledby, aria-level, aria-live, aria-multiline, aria-multiselectable, aria-orientation, aria-owns, aria-posinset, aria-pressed, aria-readonly, aria-relevant, aria-required, aria-selected, aria-setsize, aria-sort, aria-valuemax, aria-valuemin, aria-valuenow, aria-valuetext, class$, contenteditable, contextmenu, dir, draggable, dropzone, hidden, id, inert, itemid, itemprop, itemref, itemscope, itemtype, lang, onabort, onblur, oncanplay, oncanplaythrough, onchange, onclick, oncontextmenu, oncopy, oncuechange, oncut, ondblclick, ondrag, ondragend, ondragenter, ondragleave, ondragover, ondragstart, ondrop, ondurationchange, onemptied, onended, onerror, onfocus, onformchange, onforminput, oninput, oninvalid, onkeydown, onkeypress, onkeyup, onload, onloadeddata, onloadedmetadata, onloadstart, onlostpointercapture, onmousedown, onmousemove, onmouseout, onmouseover, onmouseup, onmousewheel, onpaste, onpause, onplay, onplaying, onpointercancel, ongotpointercapture, onpointerdown, onpointerenter, onpointerleave, onpointermove, onpointerout, onpointerover, onpointerup, onprogress, onratechange, onreadystatechange, onreset, onsearch, onscroll, onseeked, onseeking, onselect, onshow, onstalled, onsubmit, onsuspend, ontimeupdate, ontoggle, ontouchcancel, ontouchend, ontouchmove, ontouchstart, onvolumechange, onwaiting, onwheel, role, spellcheck, style, tabindex, title, translate, xmlns, xml:base, xml:lang, xml:space |
1698 | 1698 | ||
1699 | Custom `data-*` attributes, where the first three characters of the value of `star` (*) after lower-casing do not equal 'xml' and the value of `star` does not have a colon (:), equal-to (=), newline, solidus (/), space, tab, or any A-Z character, are also considered global and allowed in all elements. | 1699 | Custom `data-*` attributes, where the first three characters of the value of `star` (*) after lower-casing do not equal 'xml' and the value of `star` does not have a colon (:), equal-to (=), newline, solidus (/), space, tab, or any A-Z character, are also considered global and allowed in all elements. |
1700 | 1700 | ||
1701 | 1701 | ||
1702 | -- 5.3 CSS 2.1 properties accepting URLs --------------------------o | 1702 | -- 5.3 CSS 2.1 properties accepting URLs --------------------------o |
1703 | 1703 | ||
1704 | 1704 | ||
1705 | background | 1705 | background |
1706 | background-image | 1706 | background-image |
1707 | content | 1707 | content |
1708 | cue-after | 1708 | cue-after |
1709 | cue-before | 1709 | cue-before |
1710 | cursor | 1710 | cursor |
1711 | list-style | 1711 | list-style |
1712 | list-style-image | 1712 | list-style-image |
1713 | play-during | 1713 | play-during |
1714 | 1714 | ||
1715 | 1715 | ||
1716 | -- 5.4 Microsoft Windows 1252 character replacements --------------o | 1716 | -- 5.4 Microsoft Windows 1252 character replacements --------------o |
1717 | 1717 | ||
1718 | 1718 | ||
1719 | Key: 'd' double, 'l' left, 'q' quote, 'r' right, 's.' single | 1719 | Key: 'd' double, 'l' left, 'q' quote, 'r' right, 's.' single |
1720 | 1720 | ||
1721 | Code-point (decimal) - hexadecimal value - replacement entity - represented character | 1721 | Code-point (decimal) - hexadecimal value - replacement entity - represented character |
1722 | 1722 | ||
1723 | 127 - 7f - (removed) - (not used) | 1723 | 127 - 7f - (removed) - (not used) |
1724 | 128 - 80 - € - euro | 1724 | 128 - 80 - € - euro |
1725 | 129 - 81 - (removed) - (not used) | 1725 | 129 - 81 - (removed) - (not used) |
1726 | 130 - 82 - ‚ - baseline s. q | 1726 | 130 - 82 - ‚ - baseline s. q |
1727 | 131 - 83 - ƒ - florin | 1727 | 131 - 83 - ƒ - florin |
1728 | 132 - 84 - „ - baseline d q | 1728 | 132 - 84 - „ - baseline d q |
1729 | 133 - 85 - … - ellipsis | 1729 | 133 - 85 - … - ellipsis |
1730 | 134 - 86 - † - dagger | 1730 | 134 - 86 - † - dagger |
1731 | 135 - 87 - ‡ - d dagger | 1731 | 135 - 87 - ‡ - d dagger |
1732 | 136 - 88 - ˆ - circumflex accent | 1732 | 136 - 88 - ˆ - circumflex accent |
1733 | 137 - 89 - ‰ - permile | 1733 | 137 - 89 - ‰ - permile |
1734 | 138 - 8a - Š - S Hacek | 1734 | 138 - 8a - Š - S Hacek |
1735 | 139 - 8b - ‹ - l s. guillemet | 1735 | 139 - 8b - ‹ - l s. guillemet |
1736 | 140 - 8c - Œ - OE ligature | 1736 | 140 - 8c - Œ - OE ligature |
1737 | 141 - 8d - (removed) - (not used) | 1737 | 141 - 8d - (removed) - (not used) |
1738 | 142 - 8e - Ž - Z dieresis | 1738 | 142 - 8e - Ž - Z dieresis |
1739 | 143 - 8f - (removed) - (not used) | 1739 | 143 - 8f - (removed) - (not used) |
1740 | 144 - 90 - (removed) - (not used) | 1740 | 144 - 90 - (removed) - (not used) |
1741 | 145 - 91 - ‘ - l s. q | 1741 | 145 - 91 - ‘ - l s. q |
1742 | 146 - 92 - ’ - r s. q | 1742 | 146 - 92 - ’ - r s. q |
1743 | 147 - 93 - “ - l d q | 1743 | 147 - 93 - “ - l d q |
1744 | 148 - 94 - ” - r d q | 1744 | 148 - 94 - ” - r d q |
1745 | 149 - 95 - • - bullet | 1745 | 149 - 95 - • - bullet |
1746 | 150 - 96 - – - en dash | 1746 | 150 - 96 - – - en dash |
1747 | 151 - 97 - — - em dash | 1747 | 151 - 97 - — - em dash |
1748 | 152 - 98 - ˜ - tilde accent | 1748 | 152 - 98 - ˜ - tilde accent |
1749 | 153 - 99 - ™ - trademark | 1749 | 153 - 99 - ™ - trademark |
1750 | 154 - 9a - š - s Hacek | 1750 | 154 - 9a - š - s Hacek |
1751 | 155 - 9b - › - r s. guillemet | 1751 | 155 - 9b - › - r s. guillemet |
1752 | 156 - 9c - œ - oe ligature | 1752 | 156 - 9c - œ - oe ligature |
1753 | 157 - 9d - (removed) - (not used) | 1753 | 157 - 9d - (removed) - (not used) |
1754 | 158 - 9e - ž - z dieresis | 1754 | 158 - 9e - ž - z dieresis |
1755 | 159 - 9f - Ÿ - Y dieresis | 1755 | 159 - 9f - Ÿ - Y dieresis |
1756 | 1756 | ||
1757 | 1757 | ||
1758 | -- 5.5 URL format -------------------------------------------------o | 1758 | -- 5.5 URL format -------------------------------------------------o |
1759 | 1759 | ||
1760 | 1760 | ||
1761 | An `absolute` URL has a 'protocol' or 'scheme', a 'network location' or 'hostname', and, optional 'path', 'parameters', 'query' and 'fragment' segments. Thus, an absolute URL has this generic structure: | 1761 | An `absolute` URL has a 'protocol' or 'scheme', a 'network location' or 'hostname', and, optional 'path', 'parameters', 'query' and 'fragment' segments. Thus, an absolute URL has this generic structure: |
1762 | 1762 | ||
1763 | (scheme) : (//network location) /(path) ;(parameters) ?(query) #(fragment) | 1763 | (scheme) : (//network location) /(path) ;(parameters) ?(query) #(fragment) |
1764 | 1764 | ||
1765 | The schemes can only contain letters, digits, '+', '.' and '-'. Hostname is the portion after the '//' and up to the first '/' (if any; else, up to the end) when ':' is followed by a '//' (e.g., 'abc.com' in 'ftp://abc.com/def'); otherwise, it consists of everything after the ':' (e.g., 'def@abc.com' in mailto:def@abc.com'). | 1765 | The schemes can only contain letters, digits, '+', '.' and '-'. Hostname is the portion after the '//' and up to the first '/' (if any; else, up to the end) when ':' is followed by a '//' (e.g., 'abc.com' in 'ftp://abc.com/def'); otherwise, it consists of everything after the ':' (e.g., 'def@abc.com' in mailto:def@abc.com'). |
1766 | 1766 | ||
1767 | `Relative` URLs do not have explicit schemes and network locations; such values are inherited from a `base` URL. | 1767 | `Relative` URLs do not have explicit schemes and network locations; such values are inherited from a `base` URL. |
1768 | 1768 | ||
1769 | 1769 | ||
1770 | -- 5.6 Brief on htmLawed code -------------------------------------o | 1770 | -- 5.6 Brief on htmLawed code -------------------------------------o |
1771 | 1771 | ||
1772 | 1772 | ||
1773 | Much of the code's logic and reasoning can be understood from the documentation above. | 1773 | Much of the code's logic and reasoning can be understood from the documentation above. |
1774 | 1774 | ||
1775 | The *output* of htmLawed is a text string containing the processed input. There is no custom error tracking. | 1775 | The *output* of htmLawed is a text string containing the processed input. There is no custom error tracking. |
1776 | 1776 | ||
1777 | *Function arguments* for htmLawed are: | 1777 | *Function arguments* for htmLawed are: |
1778 | 1778 | ||
1779 | * '$in' - first argument; a text string; the *input text* to be processed. Any extraneous slashes added by PHP when `magic quotes` are enabled should be removed beforehand using PHP's 'stripslashes()' function. | 1779 | * '$in' - first argument; a text string; the *input text* to be processed. Any extraneous slashes added by PHP when `magic quotes` are enabled should be removed beforehand using PHP's 'stripslashes()' function. |
1780 | 1780 | ||
1781 | * '$config' - second argument; an associative array; optional; named '$C' within htmLawed code. The array has keys with names like 'balance' and 'keep_bad', and the values, which can be boolean, string, or array, depending on the key, are read to accordingly set the *configurable parameters* (indicated by the keys). All configurable parameters receive some default value if the value to be used is not specified by the user through '$config'. `Finalized` '$config' is thus a filtered and possibly larger array. | 1781 | * '$config' - second argument; an associative array; optional; named '$C' within htmLawed code. The array has keys with names like 'balance' and 'keep_bad', and the values, which can be boolean, string, or array, depending on the key, are read to accordingly set the *configurable parameters* (indicated by the keys). All configurable parameters receive some default value if the value to be used is not specified by the user through '$config'. `Finalized` '$config' is thus a filtered and possibly larger array. |
1782 | 1782 | ||
1783 | * '$spec' - third argument; a text string; optional. The string has rules, written in an htmLawed-designated format, *specifying* element-specific attribute and attribute value restrictions. Function 'hl_spec()' is used to convert the string to an associative-array, named '$S' within htmLawed code, for internal use. `Finalized` '$spec' is thus an array. | 1783 | * '$spec' - third argument; a text string; optional. The string has rules, written in an htmLawed-designated format, *specifying* element-specific attribute and attribute value restrictions. Function 'hl_spec()' is used to convert the string to an associative-array, named '$S' within htmLawed code, for internal use. `Finalized` '$spec' is thus an array. |
1784 | 1784 | ||
1785 | `Finalized` '$config' and '$spec' are made *global variables* while htmLawed is at work. Values of any pre-existing global variables with same names are noted, and their values are restored after htmLawed finishes processing the input (to capture the `finalized` values, the 'show_settings' parameter of '$config' should be used). Depending on '$config', another global variable 'hl_Ids', to track 'id' attribute values for uniqueness, may be set. Unlike the other two variables, this one is not reset (or unset) post-processing. | 1785 | `Finalized` '$config' and '$spec' are made *global variables* while htmLawed is at work. Values of any pre-existing global variables with same names are noted, and their values are restored after htmLawed finishes processing the input (to capture the `finalized` values, the 'show_settings' parameter of '$config' should be used). Depending on '$config', another global variable 'hl_Ids', to track 'id' attribute values for uniqueness, may be set. Unlike the other two variables, this one is not reset (or unset) post-processing. |
1786 | 1786 | ||
1787 | Except for the main 'htmLawed()' function, htmLawed's functions are *name-spaced* using the 'hl_' prefix. The *functions* and their roles are: | 1787 | Except for the main 'htmLawed()' function, htmLawed's functions are *name-spaced* using the 'hl_' prefix. The *functions* and their roles are: |
1788 | 1788 | ||
1789 | * 'hl_attrval' - check attribute values against '$spec' | 1789 | * 'hl_attrval' - check attribute values against '$spec' |
1790 | * 'hl_bal' - balance tags and ensure proper nesting | 1790 | * 'hl_bal' - balance tags and ensure proper nesting |
1791 | * 'hl_cmtcd' - handle CDATA sections and HTML comments | 1791 | * 'hl_cmtcd' - handle CDATA sections and HTML comments |
1792 | * 'hl_ent' - handle character entities | 1792 | * 'hl_ent' - handle character entities |
1793 | * 'hl_prot' - check a URL scheme/protocol | 1793 | * 'hl_prot' - check a URL scheme/protocol |
1794 | * 'hl_regex' - check syntax of a regular expression | 1794 | * 'hl_regex' - check syntax of a regular expression |
1795 | * 'hl_spec' - convert user-supplied '$spec' value to one used internally | 1795 | * 'hl_spec' - convert user-supplied '$spec' value to one used internally |
1796 | * 'hl_tag' - handle element tags and attributes | 1796 | * 'hl_tag' - handle element tags and attributes |
1797 | * 'hl_tag2' - transform element tags | 1797 | * 'hl_tag2' - transform element tags |
1798 | * 'hl_tidy' - compact/beautify HTML | 1798 | * 'hl_tidy' - compact/beautify HTML |
1799 | * 'hl_version' - report htmLawed version | 1799 | * 'hl_version' - report htmLawed version |
1800 | * 'htmLawed' - main function | 1800 | * 'htmLawed' - main function |
1801 | 1801 | ||
1802 | 'htmLawed()' finalizes '$spec' (with the help of 'hl_spec()') and '$config', and globalizes them. Finalization of '$config' involves setting default values if an inappropriate or invalid one is supplied. This includes calling 'hl_regex()' to check well-formedness of regular expression patterns if such expressions are user-supplied through '$config'. 'htmLawed()' then removes invalid characters like nulls and 'x01' and appropriately handles entities using 'hl_ent()'. HTML comments and CDATA sections are identified and treated as per '$config' with the help of 'hl_cmtcd()'. When retained, the '<' and '>' characters identifying them, and the '<', '>' and '&' characters inside them, are replaced with control characters (code-points '1' to '5') till any tag balancing is completed. | 1802 | 'htmLawed()' finalizes '$spec' (with the help of 'hl_spec()') and '$config', and globalizes them. Finalization of '$config' involves setting default values if an inappropriate or invalid one is supplied. This includes calling 'hl_regex()' to check well-formedness of regular expression patterns if such expressions are user-supplied through '$config'. 'htmLawed()' then removes invalid characters like nulls and 'x01' and appropriately handles entities using 'hl_ent()'. HTML comments and CDATA sections are identified and treated as per '$config' with the help of 'hl_cmtcd()'. When retained, the '<' and '>' characters identifying them, and the '<', '>' and '&' characters inside them, are replaced with control characters (code-points '1' to '5') till any tag balancing is completed. |
1803 | 1803 | ||
1804 | After this `initial processing` 'htmLawed()' identifies tags using regex and processes them with the help of 'hl_tag()' -- a large function that analyzes tag content, filtering it as per HTML standards, '$config' and '$spec'. Among other things, 'hl_tag()' transforms deprecated elements using 'hl_tag2()', removes attributes from closing tags, checks attribute values as per '$spec' rules using 'hl_attrval()', and checks URL protocols using 'hl_prot()'. 'htmLawed()' performs tag balancing and nesting checks with a call to 'hl_bal()', and optionally compacts/beautifies the output with proper white-spacing with a call to 'hl_tidy()'. The latter temporarily replaces white-space, and '<', '>' and '&' characters inside 'pre', 'script' and 'textarea' elements, and HTML comments and CDATA sections with control characters (code-points '1' to '5', and '7'). | 1804 | After this `initial processing` 'htmLawed()' identifies tags using regex and processes them with the help of 'hl_tag()' -- a large function that analyzes tag content, filtering it as per HTML standards, '$config' and '$spec'. Among other things, 'hl_tag()' transforms deprecated elements using 'hl_tag2()', removes attributes from closing tags, checks attribute values as per '$spec' rules using 'hl_attrval()', and checks URL protocols using 'hl_prot()'. 'htmLawed()' performs tag balancing and nesting checks with a call to 'hl_bal()', and optionally compacts/beautifies the output with proper white-spacing with a call to 'hl_tidy()'. The latter temporarily replaces white-space, and '<', '>' and '&' characters inside 'pre', 'script' and 'textarea' elements, and HTML comments and CDATA sections with control characters (code-points '1' to '5', and '7'). |
1805 | 1805 | ||
1806 | htmLawed permits the use of custom code or *hook functions* at two stages. The first, called inside 'htmLawed()', allows the input text as well as the finalized '$config' and '$spec' values to be altered right after the initial processing (see section:- #3.7). The second is called by 'hl_tag()' once the tag content is finalized (see section:- #3.4.9). | 1806 | htmLawed permits the use of custom code or *hook functions* at two stages. The first, called inside 'htmLawed()', allows the input text as well as the finalized '$config' and '$spec' values to be altered right after the initial processing (see section:- #3.7). The second is called by 'hl_tag()' once the tag content is finalized (see section:- #3.4.9). |
1807 | 1807 | ||
1808 | The functionality of htmLawed is dictated by the external HTML standards. The code of htmLawed is thus written for a clear-cut aim, with not much concern for tweaking by other developers. The code is only minimally annotated with comments -- it is not meant to instruct. PHP developers familiar with the HTML specifications will see the logic, and others can always refer to the htmLawed documentation. | 1808 | The functionality of htmLawed is dictated by the external HTML standards. The code of htmLawed is thus written for a clear-cut aim, with not much concern for tweaking by other developers. The code is only minimally annotated with comments -- it is not meant to instruct. PHP developers familiar with the HTML specifications will see the logic, and others can always refer to the htmLawed documentation. |
1809 | 1809 | ||
1810 | ___________________________________________________________________oo | 1810 | ___________________________________________________________________oo |
1811 | 1811 | ||
1812 | 1812 | ||
1813 | @@description: htmLawed PHP software is a free, open-source, customizable HTML input purifier and filter | 1813 | @@description: htmLawed PHP software is a free, open-source, customizable HTML input purifier and filter |
1814 | @@encoding: utf-8 | 1814 | @@encoding: utf-8 |
1815 | @@keywords: htmLawed, HTM, HTML, HTML5, HTML 5, XHTML, XHTML5, HTML Tidy, converter, filter, formatter, purifier, sanitizer, XSS, input, PHP, software, code, script, security, cross-site scripting, hack, sanitize, remove, standards, tags, attributes, elements, Aria, Ruby, data attributes, tidy, indent, auto-indent, prettify, pretty print | 1815 | @@keywords: htmLawed, HTM, HTML, HTML5, HTML 5, XHTML, XHTML5, HTML Tidy, converter, filter, formatter, purifier, sanitizer, XSS, input, PHP, software, code, script, security, cross-site scripting, hack, sanitize, remove, standards, tags, attributes, elements, Aria, Ruby, data attributes, tidy, indent, auto-indent, prettify, pretty print |
1816 | @@language: en | 1816 | @@language: en |
1817 | @@title: htmLawed documentation | 1817 | @@title: htmLawed documentation |
diff --git a/lib/htmlawed/htmLawed_TESTCASE.txt b/lib/htmlawed/htmLawed_TESTCASE.txt index 24b00e7..2e64421 100755 --- a/lib/htmlawed/htmLawed_TESTCASE.txt +++ b/lib/htmlawed/htmLawed_TESTCASE.txt | |||
@@ -1,455 +1,455 @@ | |||
1 | /* | 1 | /* |
2 | htmLawed_TESTCASE.txt, 24 September 2019 | 2 | htmLawed_TESTCASE.txt, 24 September 2019 |
3 | To test htmLawed | 3 | To test htmLawed |
4 | Copyright Santosh Patnaik | 4 | Copyright Santosh Patnaik |
5 | Dual licensed with LGPL 3 and GPL 2+ | 5 | Dual licensed with LGPL 3 and GPL 2+ |
6 | A PHP Labware internal utility - www.bioinformatics.org/phplabware/internal_utilities/htmLawed | 6 | A PHP Labware internal utility - www.bioinformatics.org/phplabware/internal_utilities/htmLawed |
7 | */ | 7 | */ |
8 | 8 | ||
9 | This file has UTF-8-encoded text with both correct and incorrect/malformed HTML/XHTML code snippets to test htmLawed (test cases/samples). The entire text may also be used as a unit. | 9 | This file has UTF-8-encoded text with both correct and incorrect/malformed HTML/XHTML code snippets to test htmLawed (test cases/samples). The entire text may also be used as a unit. |
10 | 10 | ||
11 | ************************************************ | 11 | ************************************************ |
12 | when viewing this file in a web browser, set the | 12 | when viewing this file in a web browser, set the |
13 | character encoding to Unicode/UTF-8 | 13 | character encoding to Unicode/UTF-8 |
14 | ************************************************ | 14 | ************************************************ |
15 | 15 | ||
16 | --------------------- start -------------------- | 16 | --------------------- start -------------------- |
17 | 17 | ||
18 | <em>Try different $config and $spec values. Some text even when filtered in will not be displayed in a rendered web-page</em><br /> | 18 | <em>Try different $config and $spec values. Some text even when filtered in will not be displayed in a rendered web-page</em><br /> |
19 | 19 | ||
20 | <h6>Attributes</h6> | 20 | <h6>Attributes</h6> |
21 | 21 | ||
22 | <strong>Xml:lang:</strong><a lang="en" xml:lang="en"></a>, <a lang="en"></a>, <a xml:lang="en"></a><br /> | 22 | <strong>Xml:lang:</strong><a lang="en" xml:lang="en"></a>, <a lang="en"></a>, <a xml:lang="en"></a><br /> |
23 | <strong>Standard, predefined value, or empty attribute:</strong> <input type="text" disabled />, <input type="text" disabled="DISABLED" />, <input type="text" disabled="1" /><br /> | 23 | <strong>Standard, predefined value, or empty attribute:</strong> <input type="text" disabled />, <input type="text" disabled="DISABLED" />, <input type="text" disabled="1" /><br /> |
24 | <strong>Required:</strong> <img />, <img alt="image" /><br /> | 24 | <strong>Required:</strong> <img />, <img alt="image" /><br /> |
25 | <strong>Quote & space variation:</strong> <a id=id1 name=xy>a</a>, <a id='id2' name="xy">a</a>, <a id=' id3 ' name = "n" >a</a><br /> | 25 | <strong>Quote & space variation:</strong> <a id=id1 name=xy>a</a>, <a id='id2' name="xy">a</a>, <a id=' id3 ' name = "n" >a</a><br /> |
26 | <strong>Invalid:</strong> <a id="id4" src="s">a</a><br /> | 26 | <strong>Invalid:</strong> <a id="id4" src="s">a</a><br /> |
27 | <strong>Duplicated:</strong> <a id="id5" id="id6">a</a><br /> | 27 | <strong>Duplicated:</strong> <a id="id5" id="id6">a</a><br /> |
28 | <strong>Deprecated:</strong> <a id="id7" target="self" name="n">a</a>, <hr noshade="noshade" /><br /> | 28 | <strong>Deprecated:</strong> <a id="id7" target="self" name="n">a</a>, <hr noshade="noshade" /><br /> |
29 | <strong>Casing:</strong> <a HREF=""></a><br /> | 29 | <strong>Casing:</strong> <a HREF=""></a><br /> |
30 | <strong>Custom:</strong> <img alt="image" my:data="portrait" /><br /> | 30 | <strong>Custom:</strong> <img alt="image" my:data="portrait" /><br /> |
31 | <strong>Data-*:</strong> <a data-xml="x" data-xmnt="x" data-xmlnt="x" data-xmn:t="x" data-12="x" data-רש="x" data-xmxm="x">a</a><br /> | 31 | <strong>Data-*:</strong> <a data-xml="x" data-xmnt="x" data-xmlnt="x" data-xmn:t="x" data-12="x" data-רש="x" data-xmxm="x">a</a><br /> |
32 | <strong>Admin-restricted?:</strong> <a href="x" onclick="alert();"></a> | 32 | <strong>Admin-restricted?:</strong> <a href="x" onclick="alert();"></a> |
33 | 33 | ||
34 | <h6>Attribute values</h6> | 34 | <h6>Attribute values</h6> |
35 | 35 | ||
36 | <strong>Duplicate ID value:</strong><a id="id8"></a>, <a id="my_id8"></a>, <a id="id8"></a><br /> | 36 | <strong>Duplicate ID value:</strong><a id="id8"></a>, <a id="my_id8"></a>, <a id="id8"></a><br /> |
37 | (try 'my_' for prefix)<br /> | 37 | (try 'my_' for prefix)<br /> |
38 | <strong>Double-quotes in value:</strong><a title=ab"c"></a>, <a title="ab"c"></a>, <a title='ab"c'></a><br /> | 38 | <strong>Double-quotes in value:</strong><a title=ab"c"></a>, <a title="ab"c"></a>, <a title='ab"c'></a><br /> |
39 | (try filter for CSS expression)<br /> | 39 | (try filter for CSS expression)<br /> |
40 | <strong>CSS expression</strong>: <div style="prop:expression();"></div><div style="prop:expression()"></div><div style="prop: expression();"></div><div style="prop : expression()"></div><div style="prop:expression(js);"></div><div style="prop:expression(js;)"></div><div style="prop: expression('js');"></div><div style="prop : expr ession('js':)"></div><div style="prop:expression( 'js@ );"></div><br /> | 40 | <strong>CSS expression</strong>: <div style="prop:expression();"></div><div style="prop:expression()"></div><div style="prop: expression();"></div><div style="prop : expression()"></div><div style="prop:expression(js);"></div><div style="prop:expression(js;)"></div><div style="prop: expression('js');"></div><div style="prop : expr ession('js':)"></div><div style="prop:expression( 'js@ );"></div><br /> |
41 | <strong>Other:</strong> <input size="50" class="my" value="an input an input an input" />, <input size="5" class="your" value="an input" /><br /> | 41 | <strong>Other:</strong> <input size="50" class="my" value="an input an input an input" />, <input size="5" class="your" value="an input" /><br /> |
42 | (try 'maxlen', 'maxval', etc., for 'input' in '$spec') | 42 | (try 'maxlen', 'maxval', etc., for 'input' in '$spec') |
43 | 43 | ||
44 | <h6>Blockquotes</h6> | 44 | <h6>Blockquotes</h6> |
45 | 45 | ||
46 | <blockquote>abc</blockquote><br /> | 46 | <blockquote>abc</blockquote><br /> |
47 | <blockquote>abc<div>def</div></blockquote><br /> | 47 | <blockquote>abc<div>def</div></blockquote><br /> |
48 | <blockquote><div>abc</div>def</blockquote><br /> | 48 | <blockquote><div>abc</div>def</blockquote><br /> |
49 | <blockquote>abc<div>def</div>ghi</blockquote><br /> | 49 | <blockquote>abc<div>def</div>ghi</blockquote><br /> |
50 | abc<div>def</div>ghi<br /> | 50 | abc<div>def</div>ghi<br /> |
51 | <blockquote>QQQ<div>x</div><!-- comment --></blockquote><br /> | 51 | <blockquote>QQQ<div>x</div><!-- comment --></blockquote><br /> |
52 | <blockquote><div>x</div><!-- comment -->QQQ</blockquote><br /> | 52 | <blockquote><div>x</div><!-- comment -->QQQ</blockquote><br /> |
53 | <blockquote><!-- comment --><div>x</div>QQQ<div>x</div></blockquote><br /> | 53 | <blockquote><!-- comment --><div>x</div>QQQ<div>x</div></blockquote><br /> |
54 | <blockquote><div>x<!-- comment --></div>QQQ</blockquote><p>x</p><br /> | 54 | <blockquote><div>x<!-- comment --></div>QQQ</blockquote><p>x</p><br /> |
55 | <br /> | 55 | <br /> |
56 | (try with blockquote parent) | 56 | (try with blockquote parent) |
57 | 57 | ||
58 | <h6>CDATA sections</h6> | 58 | <h6>CDATA sections</h6> |
59 | 59 | ||
60 | <strong>Special characters inside:</strong> <![CDATA[ ]]> ]]>, <![CDATA[ 3 < 4 > 3.5, & 4 > 4 ]]><br /> | 60 | <strong>Special characters inside:</strong> <![CDATA[ ]]> ]]>, <![CDATA[ 3 < 4 > 3.5, & 4 > 4 ]]><br /> |
61 | <strong>Normal:</strong> <![CDATA[ check ]]>, <em>CDATA follows:<![CDATA[ check ]]></em><br /> | 61 | <strong>Normal:</strong> <![CDATA[ check ]]>, <em>CDATA follows:<![CDATA[ check ]]></em><br /> |
62 | <strong>Malformed:</strong> <![cdata check ]]>, < ![CDATA check ]]>, <![CDATA check ]]>, < ![CDATA check ] ]><br /> | 62 | <strong>Malformed:</strong> <![cdata check ]]>, < ![CDATA check ]]>, <![CDATA check ]]>, < ![CDATA check ] ]><br /> |
63 | <strong>Invalid:</strong> <em <![CDATA[ check ]]>>CDATA in tag content</em>, <table><![CDATA[ check ]]><tr><td>text not allowed</td></tr></table> | 63 | <strong>Invalid:</strong> <em <![CDATA[ check ]]>>CDATA in tag content</em>, <table><![CDATA[ check ]]><tr><td>text not allowed</td></tr></table> |
64 | 64 | ||
65 | <h6>Complex-1: deprecated elements</h6> | 65 | <h6>Complex-1: deprecated elements</h6> |
66 | 66 | ||
67 | <center> | 67 | <center> |
68 | The PHP <s>software</s> script used for this <strike>web-page</strike> webpage is <font style="font-weight: bold " face=arial size='+3' color = "red ">htmLawedTest.php</font>, from <u style= 'color:green'>PHP Labware</u>. | 68 | The PHP <s>software</s> script used for this <strike>web-page</strike> webpage is <font style="font-weight: bold " face=arial size='+3' color = "red ">htmLawedTest.php</font>, from <u style= 'color:green'>PHP Labware</u>. |
69 | </center> | 69 | </center> |
70 | 70 | ||
71 | <h6>Complex-2: deprecated attributes</h6> | 71 | <h6>Complex-2: deprecated attributes</h6> |
72 | 72 | ||
73 | <img src="s" alt="a" name="n" /><img src="s" alt="a" id="id9" name="n" /> | 73 | <img src="s" alt="a" name="n" /><img src="s" alt="a" id="id9" name="n" /> |
74 | <br clear="left" /> | 74 | <br clear="left" /> |
75 | <hr noshade size="1" /> | 75 | <hr noshade size="1" /> |
76 | <img name="id10" src="s" align="left" alt="image" hspace="10" vspace="10" width="10em" height="20" border="1" style="padding:5px;" /> | 76 | <img name="id10" src="s" align="left" alt="image" hspace="10" vspace="10" width="10em" height="20" border="1" style="padding:5px;" /> |
77 | <table width="50em" align="center" bgcolor="red"> | 77 | <table width="50em" align="center" bgcolor="red"> |
78 | <tr> | 78 | <tr> |
79 | <td width="20%"> | 79 | <td width="20%"> |
80 | <div align="center"> | 80 | <div align="center"> |
81 | <h3 align="right">Section</h3> | 81 | <h3 align="right">Section</h3> |
82 | <p align="right">Para</p> | 82 | <p align="right">Para</p> |
83 | <ol type="a" start="e"><li value="x"><a name="x">First</a> <a name="x" id="id11">item</a></li></ol> | 83 | <ol type="a" start="e"><li value="x"><a name="x">First</a> <a name="x" id="id11">item</a></li></ol> |
84 | </div> | 84 | </div> |
85 | </td> | 85 | </td> |
86 | <td width="*"> | 86 | <td width="*"> |
87 | <ol type="1"><li>First item</li></ol> | 87 | <ol type="1"><li>First item</li></ol> |
88 | </td> | 88 | </td> |
89 | </tr> | 89 | </tr> |
90 | </table> | 90 | </table> |
91 | <br clear="all" /> | 91 | <br clear="all" /> |
92 | 92 | ||
93 | <h6>Complex-3: embed, object, area</h6> | 93 | <h6>Complex-3: embed, object, area</h6> |
94 | 94 | ||
95 | <object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/ls7gi1VwdIQ"></param><embed src="http://www.youtube.com/v/ls7gi1VwdIQ" type="application/x-shockwave-flash" width="425" height="350"></embed></object><br /> | 95 | <object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/ls7gi1VwdIQ"></param><embed src="http://www.youtube.com/v/ls7gi1VwdIQ" type="application/x-shockwave-flash" width="425" height="350"></embed></object><br /> |
96 | 96 | ||
97 | <embed src="http://www.youtube.com/v/ls7gi1VwdIQ" type="application/x-shockwave-flash" width="425" height="350"></embed><br /> | 97 | <embed src="http://www.youtube.com/v/ls7gi1VwdIQ" type="application/x-shockwave-flash" width="425" height="350"></embed><br /> |
98 | 98 | ||
99 | <object data="1.gif" type="image/gif" usemap="#map1"><map name="map1"> | 99 | <object data="1.gif" type="image/gif" usemap="#map1"><map name="map1"> |
100 | <p>navigate the site: <a href="1" shape="REct" coOrds="0,0,118,28">1</a> | <a href="3" shape="circle" coords="184,200,60">3</a> | <a href="4" shape="poly" coords="276,0,276,28,100,200,50,50,276,0">4</a></p> | 100 | <p>navigate the site: <a href="1" shape="REct" coOrds="0,0,118,28">1</a> | <a href="3" shape="circle" coords="184,200,60">3</a> | <a href="4" shape="poly" coords="276,0,276,28,100,200,50,50,276,0">4</a></p> |
101 | <area href="5" shape="Rect" coords="0,0,118,28"> | 101 | <area href="5" shape="Rect" coords="0,0,118,28"> |
102 | </map></object> | 102 | </map></object> |
103 | 103 | ||
104 | <param name="name">value</param> | 104 | <param name="name">value</param> |
105 | 105 | ||
106 | <object id="obj1"> | 106 | <object id="obj1"> |
107 | <param name="param1"> | 107 | <param name="param1"> |
108 | <object id="obj2"> | 108 | <object id="obj2"> |
109 | <param name="param2"> | 109 | <param name="param2"> |
110 | </object> | 110 | </object> |
111 | </object> | 111 | </object> |
112 | 112 | ||
113 | <h6>Complex-4: nested and other tables</h6> | 113 | <h6>Complex-4: nested and other tables</h6> |
114 | 114 | ||
115 | <table border="1" bgcolor="red"> <tr> <td> Cell </td> <td colspan="2" rowspan="2"> <table border="1" bgcolor="green"> <tr> <td> Cell </td> <td colspan="2" rowspan="2"> </td> </tr> <tr> <td> Cell </td> </tr> <tr> <td> Cell </td> <td> Cell </td> <td> Cell </td> </tr> </table> </td> </tr> <tr> <td> Cell </td> </tr> <tr> <td> Cell </td> <td> Cell </td> <td> Cell </td> </tr> </table><br /> | 115 | <table border="1" bgcolor="red"> <tr> <td> Cell </td> <td colspan="2" rowspan="2"> <table border="1" bgcolor="green"> <tr> <td> Cell </td> <td colspan="2" rowspan="2"> </td> </tr> <tr> <td> Cell </td> </tr> <tr> <td> Cell </td> <td> Cell </td> <td> Cell </td> </tr> </table> </td> </tr> <tr> <td> Cell </td> </tr> <tr> <td> Cell </td> <td> Cell </td> <td> Cell </td> </tr> </table><br /> |
116 | <strong>PCDATA wrong:</strong> <table>Well<caption>Hello</caption></table><br /> | 116 | <strong>PCDATA wrong:</strong> <table>Well<caption>Hello</caption></table><br /> |
117 | <strong>Missing tr:</strong> <table><td>Well</td></table><br /> | 117 | <strong>Missing tr:</strong> <table><td>Well</td></table><br /> |
118 | 118 | ||
119 | <h6>Complex-5: pseudo, disallowed or non-HTML tags</h6> | 119 | <h6>Complex-5: pseudo, disallowed or non-HTML tags</h6> |
120 | 120 | ||
121 | (Try different 'keep_bad' values) | 121 | (Try different 'keep_bad' values) |
122 | <*> Pseudotags <*> | 122 | <*> Pseudotags <*> |
123 | <xml>Non-HTML tag xml</xml> | 123 | <xml>Non-HTML tag xml</xml> |
124 | <p> | 124 | <p> |
125 | Disallowed tag p | 125 | Disallowed tag p |
126 | </p> | 126 | </p> |
127 | <ul>Bad<li>OK</li></ul> | 127 | <ul>Bad<li>OK</li></ul> |
128 | 128 | ||
129 | <h6>Elements</h6> | 129 | <h6>Elements</h6> |
130 | 130 | ||
131 | <strong>Unbalanced:</strong> <a href="h"><em>check</a></em><br /> | 131 | <strong>Unbalanced:</strong> <a href="h"><em>check</a></em><br /> |
132 | <strong>Non-XHTML:</strong> <div><center><dir></dir></center></div><br /> | 132 | <strong>Non-XHTML:</strong> <div><center><dir></dir></center></div><br /> |
133 | <strong>Malformed:</strong> < a href=""></a>, <a href="" ></a>, <a href="" ></a>, <a href="" | 133 | <strong>Malformed:</strong> < a href=""></a>, <a href="" ></a>, <a href="" ></a>, <a href="" |
134 | ></a>, <a href="">< /a>, < a href=""></a >, <img src="s" alt="a" />, <img src="s" alt="a"/ >, <imgsrc="s" alt="a" /><br /> | 134 | ></a>, <a href="">< /a>, < a href=""></a >, <img src="s" alt="a" />, <img src="s" alt="a"/ >, <imgsrc="s" alt="a" /><br /> |
135 | <strong>Invalid:</strong> <image src="s" alt="a" /><br /> | 135 | <strong>Invalid:</strong> <image src="s" alt="a" /><br /> |
136 | <strong>Empty:</strong> <img src="s" alt="a" />, <img src="s" alt="a"></img>, <img src="s" alt="a">text</img><br /> | 136 | <strong>Empty:</strong> <img src="s" alt="a" />, <img src="s" alt="a"></img>, <img src="s" alt="a">text</img><br /> |
137 | <strong>Content invalid:</strong> <a href="h">1<a>2</a></a><br /> | 137 | <strong>Content invalid:</strong> <a href="h">1<a>2</a></a><br /> |
138 | <strong>Content invalid?:</strong> <form></form><br /> (try setting 'form' as parent)<br /> | 138 | <strong>Content invalid?:</strong> <form></form><br /> (try setting 'form' as parent)<br /> |
139 | <strong>Casing:</strong> <A href=""></a><br /> | 139 | <strong>Casing:</strong> <A href=""></a><br /> |
140 | <strong>Check for tidy:</strong> <br /><hr /></div><hr /></div><hr /></div><div>hi</div> | 140 | <strong>Check for tidy:</strong> <br /><hr /></div><hr /></div><hr /></div><div>hi</div> |
141 | 141 | ||
142 | <h6>Entities</h6> | 142 | <h6>Entities</h6> |
143 | 143 | ||
144 | <strong>Special:</strong> & 3 < 2 & 5>4 and j >i >a & i<j>a<br /> | 144 | <strong>Special:</strong> & 3 < 2 & 5>4 and j >i >a & i<j>a<br /> |
145 | <strong>Padding:</strong> B B f f  <br /> | 145 | <strong>Padding:</strong> B B f f  <br /> |
146 | <strong>Malformed:</strong> & #x27;, &x27;, ' &TILDE;, &tilde<br /> | 146 | <strong>Malformed:</strong> & #x27;, &x27;, ' &TILDE;, &tilde<br /> |
147 | <strong>Invalid:</strong> , �, , �, , &bad;<br /> | 147 | <strong>Invalid:</strong> , �, , �, , &bad;<br /> |
148 | <strong>Discouraged characters:</strong> , „, , <br /> | 148 | <strong>Discouraged characters:</strong> , „, , <br /> |
149 | <strong>Context:</strong> '>', <?<br /> | 149 | <strong>Context:</strong> '>', <?<br /> |
150 | <strong>Casing:</strong> ', ', &TILDE;, ˜ | 150 | <strong>Casing:</strong> ', ', &TILDE;, ˜ |
151 | <br /> | 151 | <br /> |
152 | (also check named-to-numeric and hexdec-to-decimal, and vice versa, conversions) | 152 | (also check named-to-numeric and hexdec-to-decimal, and vice versa, conversions) |
153 | 153 | ||
154 | <h6>Format</h6> | 154 | <h6>Format</h6> |
155 | 155 | ||
156 | <strong>Valid but ill-formatted:</strong> text <!-- comment --> | 156 | <strong>Valid but ill-formatted:</strong> text <!-- comment --> |
157 | text <!-- | 157 | text <!-- |
158 | A c o m m e n t --> | 158 | A c o m m e n t --> |
159 | <script> | 159 | <script> |
160 | <![CDATA[ | 160 | <![CDATA[ |
161 | code | 161 | code |
162 | ]]> | 162 | ]]> |
163 | </script><!-- comment --><![CDATA[ cdata ]]> <a>text</b> text<pre id="none">p r e</pre> | 163 | </script><!-- comment --><![CDATA[ cdata ]]> <a>text</b> text<pre id="none">p r e</pre> |
164 | <textarea>text</textarea> <textarea> | 164 | <textarea>text</textarea> <textarea> |
165 | text text | 165 | text text |
166 | </textarea> text text <br /><hr /> | 166 | </textarea> text text <br /><hr /> |
167 | text <img src="none" alt="none" /> t<em class="none">e<strong>x</strong>t</em> | 167 | text <img src="none" alt="none" /> t<em class="none">e<strong>x</strong>t</em> |
168 | text <img src="none" alt="none" /> <b>t<em> e <strong> x </strong> t</em></b> | 168 | text <img src="none" alt="none" /> <b>t<em> e <strong> x </strong> t</em></b> |
169 | <a href="a"> text <img src="none" alt="none" /> <b>t <em> e <strong> x </strong> t</em></b> | 169 | <a href="a"> text <img src="none" alt="none" /> <b>t <em> e <strong> x </strong> t</em></b> |
170 | </a> | 170 | </a> |
171 | <span style="background-color: yellow;">text <img src="none" alt="none" /> <b> <em> t e <strong> x </strong> t</em></b></span> | 171 | <span style="background-color: yellow;">text <img src="none" alt="none" /> <b> <em> t e <strong> x </strong> t</em></b></span> |
172 | <script>script</script> | 172 | <script>script</script> |
173 | <div> | 173 | <div> |
174 | <pre id="none">p <a>r</a> e <!-- comment --> </pre> | 174 | <pre id="none">p <a>r</a> e <!-- comment --> </pre> |
175 | <pre> | 175 | <pre> |
176 | pre | 176 | pre |
177 | </pre> | 177 | </pre> |
178 | </div> | 178 | </div> |
179 | <div><div><table border="1" style="background-color: red;"><tr><td>Cell</td><td colspan="2" rowspan="2"><table border="1" style="background-color: green;"><tr><td>Cell</td><td colspan="2" rowspan="2"></td></tr><tr><td>Cell</td></tr><tr><td>Cell</td><td>Cell</td><td>Cell</td></tr></table></td></tr><tr><td>Cell</td></tr><tr><td>Cell</td><td>Cell</td><td>Cell</td></tr></table></div></div> | 179 | <div><div><table border="1" style="background-color: red;"><tr><td>Cell</td><td colspan="2" rowspan="2"><table border="1" style="background-color: green;"><tr><td>Cell</td><td colspan="2" rowspan="2"></td></tr><tr><td>Cell</td></tr><tr><td>Cell</td><td>Cell</td><td>Cell</td></tr></table></td></tr><tr><td>Cell</td></tr><tr><td>Cell</td><td>Cell</td><td>Cell</td></tr></table></div></div> |
180 | (try to compact or beautify) | 180 | (try to compact or beautify) |
181 | 181 | ||
182 | <h6>Forms</h6> | 182 | <h6>Forms</h6> |
183 | 183 | ||
184 | (note nesting of 'form', missing required attributes, etc.)<br /> | 184 | (note nesting of 'form', missing required attributes, etc.)<br /> |
185 | <form> | 185 | <form> |
186 | <script type="text/javascript">s</script> | 186 | <script type="text/javascript">s</script> |
187 | <fieldset><legend>p</legend>l <input name="personal_lastname" type="text" tabindex="1"></fieldset> | 187 | <fieldset><legend>p</legend>l <input name="personal_lastname" type="text" tabindex="1"></fieldset> |
188 | <input name="h" type="checkbox" value="h" tabindex="20"> h | 188 | <input name="h" type="checkbox" value="h" tabindex="20"> h |
189 | <textarea name="t">t</textarea> | 189 | <textarea name="t">t</textarea> |
190 | <form action="a" method="get"></form></form><br /> | 190 | <form action="a" method="get"></form></form><br /> |
191 | <form action="b" method="get"><p><input type="text" value="i" /></form><br /> | 191 | <form action="b" method="get"><p><input type="text" value="i" /></form><br /> |
192 | <form>B:<input type="text" value="b" />C:<input type="text" value="c" /></form><br /> | 192 | <form>B:<input type="text" value="b" />C:<input type="text" value="c" /></form><br /> |
193 | (try each of these lines separately)<br /> | 193 | (try each of these lines separately)<br /> |
194 | <form action="a">what<br /> | 194 | <form action="a">what<br /> |
195 | <form action="a">what | 195 | <form action="a">what |
196 | (try with container as div and as form)<br /> | 196 | (try with container as div and as form)<br /> |
197 | <form>c <a>a</a> <b>b</b><input /><script>s</script> | 197 | <form>c <a>a</a> <b>b</b><input /><script>s</script> |
198 | 198 | ||
199 | <h6>HTML comments (also CDATA)</h6> | 199 | <h6>HTML comments (also CDATA)</h6> |
200 | 200 | ||
201 | <strong>Script inside:</strong> <!--[if gte IE 4]> | 201 | <strong>Script inside:</strong> <!--[if gte IE 4]> |
202 | <SCRIPT>alert('XSS');</SCRIPT> | 202 | <SCRIPT>alert('XSS');</SCRIPT> |
203 | <![endif]--><br /> | 203 | <![endif]--><br /> |
204 | <strong>Special characters inside: <!-- <![CDATA check ]]> -->, <!-- 3 < 4 > 3.5, & 4 > 4 -->, <!-- che--ck -->, <!--[if !IE]> <--><a>c</a><!--> <![endif]--><br /> | 204 | <strong>Special characters inside: <!-- <![CDATA check ]]> -->, <!-- 3 < 4 > 3.5, & 4 > 4 -->, <!-- che--ck -->, <!--[if !IE]> <--><a>c</a><!--> <![endif]--><br /> |
205 | <strong>Normal:</strong> <!-- check -->, <!--check -->, <em>comment:<!-- check --></em><!-- check -->, <table><!-- check --><tr><td>text not allowed</td></tr></table><br /> | 205 | <strong>Normal:</strong> <!-- check -->, <!--check -->, <em>comment:<!-- check --></em><!-- check -->, <table><!-- check --><tr><td>text not allowed</td></tr></table><br /> |
206 | <strong>Malformed:</strong> <![cdata check ]]>, < ![CDATA check ]]>, < ![CDATA check ] ]><br /> | 206 | <strong>Malformed:</strong> <![cdata check ]]>, < ![CDATA check ]]>, < ![CDATA check ] ]><br /> |
207 | Invalid:</strong> <em <!-- check -->>comment in tag content</em>, <!--check--> | 207 | Invalid:</strong> <em <!-- check -->>comment in tag content</em>, <!--check--> |
208 | 208 | ||
209 | <h6>HTML5</h6> | 209 | <h6>HTML5</h6> |
210 | 210 | ||
211 | <strong>figure and figcaption:</strong> <figure><img src="picture.jpg" alt="picture"><figcaption>Caption for the awesome picture</figcaption></figure> | 211 | <strong>figure and figcaption:</strong> <figure><img src="picture.jpg" alt="picture"><figcaption>Caption for the awesome picture</figcaption></figure> |
212 | <strong>article:</strong> <h1>A</h1><p>B</p><article><h2>C</h2></article><article><h2>E</h2><p>F</p><p>G</p></article> | 212 | <strong>article:</strong> <h1>A</h1><p>B</p><article><h2>C</h2></article><article><h2>E</h2><p>F</p><p>G</p></article> |
213 | <strong>meter</strong>: <p>Heat <meter min="100" max="200" value="150">150</meter>.</p> | 213 | <strong>meter</strong>: <p>Heat <meter min="100" max="200" value="150">150</meter>.</p> |
214 | <strong>datalist</strong>: <input list="b" /><datalist id="b"><option value="c"><option value="d"></datalist> | 214 | <strong>datalist</strong>: <input list="b" /><datalist id="b"><option value="c"><option value="d"></datalist> |
215 | 215 | ||
216 | <h6>Ins-Del</h6> | 216 | <h6>Ins-Del</h6> |
217 | 217 | ||
218 | (depending on context, these elements can be of either block or inline type)<br /> | 218 | (depending on context, these elements can be of either block or inline type)<br /> |
219 | <p><ins datetime="d" cite="c"><div>block</div></ins></p><br /> | 219 | <p><ins datetime="d" cite="c"><div>block</div></ins></p><br /> |
220 | <p><del>d</del></p><br /> | 220 | <p><del>d</del></p><br /> |
221 | <p><ins><del>d</del></ins></p><div><ins><p><del><div>d</div></del></p></ins></div><ins><div>d</div></ins> | 221 | <p><ins><del>d</del></ins></p><div><ins><p><del><div>d</div></del></p></ins></div><ins><div>d</div></ins> |
222 | 222 | ||
223 | <h6>Lists</h6> | 223 | <h6>Lists</h6> |
224 | 224 | ||
225 | <strong>Invalid character data</strong>: <ul><li>(item</li>)</ul><br /> | 225 | <strong>Invalid character data</strong>: <ul><li>(item</li>)</ul><br /> |
226 | <strong>Definition list</strong>: <dl><dt>a</dt>bad<dd>first <em>one</em></dd><dt>b</dt><dd>second</dd></dl><br /> | 226 | <strong>Definition list</strong>: <dl><dt>a</dt>bad<dd>first <em>one</em></dd><dt>b</dt><dd>second</dd></dl><br /> |
227 | <strong>Definition list, close-tags omitted</strong>: <dl><dt>a</dt>bad<dd>first <em>one</em></dd><dt>b<dd>second</dl><br /> | 227 | <strong>Definition list, close-tags omitted</strong>: <dl><dt>a</dt>bad<dd>first <em>one</em></dd><dt>b<dd>second</dl><br /> |
228 | <strong>Definition lists, nested</strong>: <dl> | 228 | <strong>Definition lists, nested</strong>: <dl> |
229 | <dt>T1</dt> | 229 | <dt>T1</dt> |
230 | <dd>D1</dd> | 230 | <dd>D1</dd> |
231 | <dt>T2</dt> | 231 | <dt>T2</dt> |
232 | <dd>D2<dl><dt>t1</dt><dd>d1</dd><dt>t2</dt><dd>d2</dd></dl></dd> | 232 | <dd>D2<dl><dt>t1</dt><dd>d1</dd><dt>t2</dt><dd>d2</dd></dl></dd> |
233 | <dt>T3</dt> | 233 | <dt>T3</dt> |
234 | <dd>D3</dd> | 234 | <dd>D3</dd> |
235 | <dt>T4</dt> | 235 | <dt>T4</dt> |
236 | <dd>D4<dl><dt>t1</dt><dd>d1</dd></dl></dd> | 236 | <dd>D4<dl><dt>t1</dt><dd>d1</dd></dl></dd> |
237 | </dl><br /> | 237 | </dl><br /> |
238 | <strong>Definition lists, nested, close-tags omitted</strong>: <dl> | 238 | <strong>Definition lists, nested, close-tags omitted</strong>: <dl> |
239 | <dt>T1 | 239 | <dt>T1 |
240 | <dd>D1</dd> | 240 | <dd>D1</dd> |
241 | <dt>T2</dt> | 241 | <dt>T2</dt> |
242 | <dd>D2<dl><dt>t1<dd>d1<dt>t2</dt><dd>d2</dd></dl></dd> | 242 | <dd>D2<dl><dt>t1<dd>d1<dt>t2</dt><dd>d2</dd></dl></dd> |
243 | <dt>T3 | 243 | <dt>T3 |
244 | <dd>D3 | 244 | <dd>D3 |
245 | <dt>T4 | 245 | <dt>T4 |
246 | <dd>D4<dl><dt>t1<dd>d1</dl></dd> | 246 | <dd>D4<dl><dt>t1<dd>d1</dl></dd> |
247 | </dl><br /> | 247 | </dl><br /> |
248 | <strong>Nested</strong>: <ul> | 248 | <strong>Nested</strong>: <ul> |
249 | <li>l1</li> | 249 | <li>l1</li> |
250 | <li>l2<ol><li>lo1</li><li>lo2</li></ol></li> | 250 | <li>l2<ol><li>lo1</li><li>lo2</li></ol></li> |
251 | <li>l3</li> | 251 | <li>l3</li> |
252 | <li>l4<ol><li>lo3</li><li>lo4<ol><li>lo5</li></ol></li></ol></li> | 252 | <li>l4<ol><li>lo3</li><li>lo4<ol><li>lo5</li></ol></li></ol></li> |
253 | </ul><br /> | 253 | </ul><br /> |
254 | <strong>Nested, directly</strong>: <ul> | 254 | <strong>Nested, directly</strong>: <ul> |
255 | <li>l1</li> | 255 | <li>l1</li> |
256 | <ol>l2</ol> | 256 | <ol>l2</ol> |
257 | <li>l3</li> | 257 | <li>l3</li> |
258 | </ul><br /> | 258 | </ul><br /> |
259 | <strong>Nested, close-tags omitted</strong>: <ul> | 259 | <strong>Nested, close-tags omitted</strong>: <ul> |
260 | <li>l1</li> | 260 | <li>l1</li> |
261 | <li>l2<ol><li>lo1<li>lo2</ol> | 261 | <li>l2<ol><li>lo1<li>lo2</ol> |
262 | <li>l3 | 262 | <li>l3 |
263 | <li>l4<ol><li>lo3<li>lo4<ol><li>lo5</ol></ol> | 263 | <li>l4<ol><li>lo3<li>lo4<ol><li>lo5</ol></ol> |
264 | </ul><br /> | 264 | </ul><br /> |
265 | <strong>Complex</strong>: | 265 | <strong>Complex</strong>: |
266 | <ol><script></script><li><table><tr><td> | 266 | <ol><script></script><li><table><tr><td> |
267 | <ul><li id="search" class="widget widget_search"> <form id="searchform" method="get" action="http://kohei.us"> | 267 | <ul><li id="search" class="widget widget_search"> <form id="searchform" method="get" action="http://kohei.us"> |
268 | <div> | 268 | <div> |
269 | 269 | ||
270 | <input type="text" name="s" id="s" size="15" /><br /> | 270 | <input type="text" name="s" id="s" size="15" /><br /> |
271 | <input type="submit" value="Search" /> | 271 | <input type="submit" value="Search" /> |
272 | </div> | 272 | </div> |
273 | </form> | 273 | </form> |
274 | </li></ul> | 274 | </li></ul> |
275 | </td></tr></table></li></ol> | 275 | </td></tr></table></li></ol> |
276 | <strong>Menu</strong>: <menu type="toolbar"><li><menu label="File"> | 276 | <strong>Menu</strong>: <menu type="toolbar"><li><menu label="File"> |
277 | <button type="button" onclick="new()">New...</button> | 277 | <button type="button" onclick="new()">New...</button> |
278 | </menu></li><li><menu label="Edit"><button type="button" onclick="cut()">Cut...</button></menu></li> | 278 | </menu></li><li><menu label="Edit"><button type="button" onclick="cut()">Cut...</button></menu></li> |
279 | </menu> | 279 | </menu> |
280 | 280 | ||
281 | <h6>Microdata</h6> | 281 | <h6>Microdata</h6> |
282 | 282 | ||
283 | <div itemscope itemtype="http://data-vocabulary.org/Person"> | 283 | <div itemscope itemtype="http://data-vocabulary.org/Person"> |
284 | I am <span itemprop="name">X</span> but people call me <span itemprop="nickname">Y</span>. | 284 | I am <span itemprop="name">X</span> but people call me <span itemprop="nickname">Y</span>. |
285 | Find me at <a href="http://www.xy.com" itemprop="url">www.xy.com</a> | 285 | Find me at <a href="http://www.xy.com" itemprop="url">www.xy.com</a> |
286 | </div> | 286 | </div> |
287 | 287 | ||
288 | <h6>Microsoft Word</h6> | 288 | <h6>Microsoft Word</h6> |
289 | 289 | ||
290 | <strong>Proprietary tag</strong>: <p class=3DMsoNormal><o:p> </o:p></p><br /> | 290 | <strong>Proprietary tag</strong>: <p class=3DMsoNormal><o:p> </o:p></p><br /> |
291 | <strong>XML declaration</strong>: <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><br /> | 291 | <strong>XML declaration</strong>: <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><br /> |
292 | <strong>XML-invalid character code-point (may not replicate)</strong>: <p class=3DMsoNormal>“Where is he?” asked both Mary – the one so lovely – and Jane.</p> | 292 | <strong>XML-invalid character code-point (may not replicate)</strong>: <p class=3DMsoNormal>“Where is he?” asked both Mary – the one so lovely – and Jane.</p> |
293 | 293 | ||
294 | <h6>Nesting</h6> | 294 | <h6>Nesting</h6> |
295 | 295 | ||
296 | <strong>Block or inline a</strong>: <p><a href="link">text</a></p><a href="link"><div>hi</div></a><br /> | 296 | <strong>Block or inline a</strong>: <p><a href="link">text</a></p><a href="link"><div>hi</div></a><br /> |
297 | 297 | ||
298 | <h6>Non-English text-1</h6> | 298 | <h6>Non-English text-1</h6> |
299 | 299 | ||
300 | Inscrieţi-vă acum la a Zecea Conferinţă Internaţională<br /> | 300 | Inscrieţi-vă acum la a Zecea Conferinţă Internaţională<br /> |
301 | გთხოვთ ახლავე გაიაროთ რეგისტრაცია<br /> | 301 | გთხოვთ ახლავე გაიაროთ რეგისტრაცია<br /> |
302 | večjezično računalništvo<br /> | 302 | večjezično računalništvo<br /> |
303 | <a title="อ.อ่าง">อ.อ่าง</a><br /> | 303 | <a title="อ.อ่าง">อ.อ่าง</a><br /> |
304 | <a title="הירשמו | 304 | <a title="הירשמו |
305 | כעת לכנס ">Зарегистрируйтесь сейчас | 305 | כעת לכנס ">Зарегистрируйтесь сейчас |
306 | на Десятую Международную Конференцию по</a><br /> | 306 | на Десятую Международную Конференцию по</a><br /> |
307 | (this file should have utf-8 encoding; some characters may not be displayed because of missing fonts, etc.) | 307 | (this file should have utf-8 encoding; some characters may not be displayed because of missing fonts, etc.) |
308 | 308 | ||
309 | <h6>Non-English text-2: entities</h6> | 309 | <h6>Non-English text-2: entities</h6> |
310 | 310 | ||
311 | 用统一码<br /> | 311 | 用统一码<br /> |
312 | გთხოვთ<br /> | 312 | გთხოვთ<br /> |
313 | Inscreva-se agora para a Décima Conferência Internacional Sobre O Unicode, realizada entre os dias 10 e 12 de março de 1997 em Mainz | 313 | Inscreva-se agora para a Décima Conferência Internacional Sobre O Unicode, realizada entre os dias 10 e 12 de março de 1997 em Mainz |
314 | na Alemanha. | 314 | na Alemanha. |
315 | 315 | ||
316 | <h6>Ruby</h6> | 316 | <h6>Ruby</h6> |
317 | 317 | ||
318 | (need compatible browser)<br /> | 318 | (need compatible browser)<br /> |
319 | <ruby xml:lang="ja"> | 319 | <ruby xml:lang="ja"> |
320 | <rbc> | 320 | <rbc> |
321 | <rb>斎</rb> | 321 | <rb>斎</rb> |
322 | <rb>藤</rb> | 322 | <rb>藤</rb> |
323 | <rb>信</rb> | 323 | <rb>信</rb> |
324 | <rb>男</rb> | 324 | <rb>男</rb> |
325 | </rbc> | 325 | </rbc> |
326 | <rtc class="reading"> | 326 | <rtc class="reading"> |
327 | <rt>さい</rt> | 327 | <rt>さい</rt> |
328 | <rt>とう</rt> | 328 | <rt>とう</rt> |
329 | <rt>のぶ</rt> | 329 | <rt>のぶ</rt> |
330 | <rt>お</rt> | 330 | <rt>お</rt> |
331 | </rtc> | 331 | </rtc> |
332 | <rtc class="annotation"> | 332 | <rtc class="annotation"> |
333 | <rt rbspan="4" xml:lang="en">W3C Associate Chairman</rt> | 333 | <rt rbspan="4" xml:lang="en">W3C Associate Chairman</rt> |
334 | </rtc> | 334 | </rtc> |
335 | </ruby><br /> | 335 | </ruby><br /> |
336 | <ruby> | 336 | <ruby> |
337 | <rb>WWW</rb> | 337 | <rb>WWW</rb> |
338 | <rp>(</rp><rt>World Wide Web</rt><rp>)</rp> | 338 | <rp>(</rp><rt>World Wide Web</rt><rp>)</rp> |
339 | </ruby><br /> | 339 | </ruby><br /> |
340 | <ruby> | 340 | <ruby> |
341 | A | 341 | A |
342 | <rp>(</rp><rt>aaa</rt><rp>)</rp> | 342 | <rp>(</rp><rt>aaa</rt><rp>)</rp> |
343 | </ruby> | 343 | </ruby> |
344 | 344 | ||
345 | 345 | ||
346 | <h6>Tables</h6> | 346 | <h6>Tables</h6> |
347 | 347 | ||
348 | <strong>Omitted closing tags:</strong> <table> | 348 | <strong>Omitted closing tags:</strong> <table> |
349 | <colgroup><col style="x" /><col style="y" /> | 349 | <colgroup><col style="x" /><col style="y" /> |
350 | <thead> | 350 | <thead> |
351 | <tr><th>h1c1<th>h1c2 | 351 | <tr><th>h1c1<th>h1c2 |
352 | <tbody> | 352 | <tbody> |
353 | <tr><td>r1c1<td>r1c2 | 353 | <tr><td>r1c1<td>r1c2 |
354 | <tr><td>r2c1<td>r2c2 | 354 | <tr><td>r2c1<td>r2c2 |
355 | </table><br /> | 355 | </table><br /> |
356 | <strong>Nested, omitted closing tags:</strong> <table> | 356 | <strong>Nested, omitted closing tags:</strong> <table> |
357 | <colgroup><col style="x" /><col style="y" /> | 357 | <colgroup><col style="x" /><col style="y" /> |
358 | <thead> | 358 | <thead> |
359 | <tr><th>h1c1<th>h1c2 | 359 | <tr><th>h1c1<th>h1c2 |
360 | <tbody> | 360 | <tbody> |
361 | <tr><td>r1c1<td>r1c2<table> | 361 | <tr><td>r1c1<td>r1c2<table> |
362 | <colgroup><col style="x" /><col style="y" /> | 362 | <colgroup><col style="x" /><col style="y" /> |
363 | <thead> | 363 | <thead> |
364 | <tr><th>h1c1<th>h1c2 | 364 | <tr><th>h1c1<th>h1c2 |
365 | <tbody> | 365 | <tbody> |
366 | <tr><td>r1c1<td>r1c2 | 366 | <tr><td>r1c1<td>r1c2 |
367 | <tr><td>r2c1<td>r2c2 | 367 | <tr><td>r2c1<td>r2c2 |
368 | </table> | 368 | </table> |
369 | <tr><td>r2c1<td>r2c2 | 369 | <tr><td>r2c1<td>r2c2 |
370 | </table><br /> | 370 | </table><br /> |
371 | 371 | ||
372 | <h6>Tag transformation</h6> | 372 | <h6>Tag transformation</h6> |
373 | <strong>Font element with malicious code:</strong> <p><font color="z-index:123;width:100%;height:100%;position:fixed;top:0;left:0;background-size:cover;background-attachment:fixed;background-image:url(https://i.imgur.com/VQ30s65.png)"></font></p><br /> | 373 | <strong>Font element with malicious code:</strong> <p><font color="z-index:123;width:100%;height:100%;position:fixed;top:0;left:0;background-size:cover;background-attachment:fixed;background-image:url(https://i.imgur.com/VQ30s65.png)"></font></p><br /> |
374 | <strong>Font element intended as 'inline' element:</strong> <p><font color='red'>hi</font></p><br /> | 374 | <strong>Font element intended as 'inline' element:</strong> <p><font color='red'>hi</font></p><br /> |
375 | <strong>Font element intended as 'block' element:</strong> <div><font color='red'><div>hi</div></font></div><br /> | 375 | <strong>Font element intended as 'block' element:</strong> <div><font color='red'><div>hi</div></font></div><br /> |
376 | <strong>Font element intended as 'block' element:</strong> <center><font color='red' face="serif, 'Times'"><div>hi</div><div>QQQ</div></font></center><br /> | 376 | <strong>Font element intended as 'block' element:</strong> <center><font color='red' face="serif, 'Times'"><div>hi</div><div>QQQ</div></font></center><br /> |
377 | 377 | ||
378 | <h6>Tidy</h6> | 378 | <h6>Tidy</h6> |
379 | <strong>White-space handling:</strong> abc<em> def </em> ghi abc <em>def</em> ghi | 379 | <strong>White-space handling:</strong> abc<em> def </em> ghi abc <em>def</em> ghi |
380 | 380 | ||
381 | <h6>URLs</h6> | 381 | <h6>URLs</h6> |
382 | 382 | ||
383 | <strong>Relative and absolute:</strong> <a href="mailto:x"></a>, <a href="http://a.com/b/c/d.f"></a>, <a href="./../d.f"></a>, <a href="./d.f"></a>, <a href="d.f"></a>, <a href="#s"></a>, <a href="./../../d.f#s"></a><br /> | 383 | <strong>Relative and absolute:</strong> <a href="mailto:x"></a>, <a href="http://a.com/b/c/d.f"></a>, <a href="./../d.f"></a>, <a href="./d.f"></a>, <a href="d.f"></a>, <a href="#s"></a>, <a href="./../../d.f#s"></a><br /> |
384 | (try base URL value of 'http://a.com/b/')<br /> | 384 | (try base URL value of 'http://a.com/b/')<br /> |
385 | <strong>CSS URLs:</strong> <div style="background-image: url('a.gif');"></div>, <div style="background-image: URL("a.gif");"></div>, <div style="background-image: url('http://a.com/a.gif');"></div>, <div style="background-image: url('./../a.gif');"></div>, <div style="background-image: url('js:xss')"></div><br /> | 385 | <strong>CSS URLs:</strong> <div style="background-image: url('a.gif');"></div>, <div style="background-image: URL("a.gif");"></div>, <div style="background-image: url('http://a.com/a.gif');"></div>, <div style="background-image: url('./../a.gif');"></div>, <div style="background-image: url('js:xss')"></div><br /> |
386 | <strong>Double URLs:</strong> <a style="behaviour: url(foo) url(http://example.com/xss.htc)">b</a><br /> | 386 | <strong>Double URLs:</strong> <a style="behaviour: url(foo) url(http://example.com/xss.htc)">b</a><br /> |
387 | <strong>Anti-spam:</strong> (try regex for 'http://a.com', etc.) <a href="mailto:x@y.com"></a>, <a href="http://a.com/b@d.f"></a>, <a href="a.com/d.f" rel="nofollow"></a>, <a href="a.com/d.f" rel="1, 2"></a>, <a href="a.com/d.f"></a>, <a href="b.com/d.f"></a>, <a href="c.com/d.f">, <a href="denied:http://c.com/d.f"></a><br /> | 387 | <strong>Anti-spam:</strong> (try regex for 'http://a.com', etc.) <a href="mailto:x@y.com"></a>, <a href="http://a.com/b@d.f"></a>, <a href="a.com/d.f" rel="nofollow"></a>, <a href="a.com/d.f" rel="1, 2"></a>, <a href="a.com/d.f"></a>, <a href="b.com/d.f"></a>, <a href="c.com/d.f">, <a href="denied:http://c.com/d.f"></a><br /> |
388 | <strong>Soft-hyphen:</strong> <a href="http://q=ídisc">ídisc</a> | 388 | <strong>Soft-hyphen:</strong> <a href="http://q=ídisc">ídisc</a> |
389 | 389 | ||
390 | <h6>XSS</h6> | 390 | <h6>XSS</h6> |
391 | 391 | ||
392 | <img alt="<img onmouseover=confirm(1)//"<""> | 392 | <img alt="<img onmouseover=confirm(1)//"<""> |
393 | '';!--"<xss>=&{()}<br /> | 393 | '';!--"<xss>=&{()}<br /> |
394 | <img src="javascript%3Aalert('xss');" /><br /> | 394 | <img src="javascript%3Aalert('xss');" /><br /> |
395 | <img src="javascript:alert('xss');" /><br /> | 395 | <img src="javascript:alert('xss');" /><br /> |
396 | <img src="java script:alert('xss');" /><br /> | 396 | <img src="java script:alert('xss');" /><br /> |
397 | <img | 397 | <img |
398 | src=javascript:alert('XSS') /><br /> | 398 | src=javascript:alert('XSS') /><br /> |
399 | <font color='#FF6699"onmouseover="alert(1)//'>test</font> | 399 | <font color='#FF6699"onmouseover="alert(1)//'>test</font> |
400 | <font color='<img//onerror="alert`www.ptsecurity.com`"src=Psych0tr1a'> | 400 | <font color='<img//onerror="alert`www.ptsecurity.com`"src=Psych0tr1a'> |
401 | <div style="javascript:alert('xss');"></div><br /> | 401 | <div style="javascript:alert('xss');"></div><br /> |
402 | <div style="background-image:url(javascript:alert('xss'));"></div><br /> | 402 | <div style="background-image:url(javascript:alert('xss'));"></div><br /> |
403 | <div style="background-image:url("javascript:alert('xss')" );"></div><br /> | 403 | <div style="background-image:url("javascript:alert('xss')" );"></div><br /> |
404 | <!--[if gte IE 4]><script>alert('xss');</script><![endif]--><br /> | 404 | <!--[if gte IE 4]><script>alert('xss');</script><![endif]--><br /> |
405 | <script a=">" src="http://ha.ckers.org/xss.js"></script><br /> | 405 | <script a=">" src="http://ha.ckers.org/xss.js"></script><br /> |
406 | <div style="background-image: url('js:xss')"></div><br /> | 406 | <div style="background-image: url('js:xss')"></div><br /> |
407 | <a style=";-moz-binding:url(http://lukasz.pilorz.net/xss/xss.xml#xss)" href="http://example.com">test</a><br /> | 407 | <a style=";-moz-binding:url(http://lukasz.pilorz.net/xss/xss.xml#xss)" href="http://example.com">test</a><br /> |
408 | <strong>Bad IE7:</strong> <a href="http://x&x=%22+style%3d%22background-image%3a+expression%28alert | 408 | <strong>Bad IE7:</strong> <a href="http://x&x=%22+style%3d%22background-image%3a+expression%28alert |
409 | %28%27xss%3f%29%29">x</a><br /> | 409 | %28%27xss%3f%29%29">x</a><br /> |
410 | <strong>Opera:</strong> <a href="\xE2\x80\x83javascript:alert(123)">link</a> | 410 | <strong>Opera:</strong> <a href="\xE2\x80\x83javascript:alert(123)">link</a> |
411 | <strong>Bad IE7:</strong> <a style=color:expr/*comment*/ession(alert(document.domain))>xxx</a><br /> | 411 | <strong>Bad IE7:</strong> <a style=color:expr/*comment*/ession(alert(document.domain))>xxx</a><br /> |
412 | <strong>Bad IE7:</strong> <a href="xxx" style="background: expression(alert('xss'));">xxx</a><br /> | 412 | <strong>Bad IE7:</strong> <a href="xxx" style="background: expression(alert('xss'));">xxx</a><br /> |
413 | <strong>Bad IE7:</strong> <a href="xxx" style="background: expression(alert('xss'));">xxx</a><br /> | 413 | <strong>Bad IE7:</strong> <a href="xxx" style="background: expression(alert('xss'));">xxx</a><br /> |
414 | <strong>Bad IE7:</strong> <a href="xxx" style="background: %45xpression(alert('xss'));">xxx</a><br /> | 414 | <strong>Bad IE7:</strong> <a href="xxx" style="background: %45xpression(alert('xss'));">xxx</a><br /> |
415 | <strong>Bad IE7:</strong> <a href="xxx" style="background:/**/expression(alert('xss'));">xxx</a><br /> | 415 | <strong>Bad IE7:</strong> <a href="xxx" style="background:/**/expression(alert('xss'));">xxx</a><br /> |
416 | <strong>Bad IE7:</strong> <a href="xxx" style="background:/**/Expression(alert('xss'));">xxx</a><br /> | 416 | <strong>Bad IE7:</strong> <a href="xxx" style="background:/**/Expression(alert('xss'));">xxx</a><br /> |
417 | <strong>Bad IE7:</strong> <a href="xxx" style="background:/**/Expression(alert('xss'));">xxx</a><br /> | 417 | <strong>Bad IE7:</strong> <a href="xxx" style="background:/**/Expression(alert('xss'));">xxx</a><br /> |
418 | <strong>Bad IE7:</strong> <a href="xxx" style="background: expr%45ssion(alert('xss'));">xxx</a><br /> | 418 | <strong>Bad IE7:</strong> <a href="xxx" style="background: expr%45ssion(alert('xss'));">xxx</a><br /> |
419 | <strong>Bad IE7:</strong> <a href="xxx" style="background: exp/* */ression(alert('xss'));">xxx</a><br /> | 419 | <strong>Bad IE7:</strong> <a href="xxx" style="background: exp/* */ression(alert('xss'));">xxx</a><br /> |
420 | <strong>Bad IE7:</strong> <a href="xxx" style="background: exp /* */ression(alert('xss'));">xxx</a><br /> | 420 | <strong>Bad IE7:</strong> <a href="xxx" style="background: exp /* */ression(alert('xss'));">xxx</a><br /> |
421 | <strong>Bad IE7:</strong> <a href="xxx" style="background: exp/ * * /ression(alert('xss'));">xxx</a><br /> | 421 | <strong>Bad IE7:</strong> <a href="xxx" style="background: exp/ * * /ression(alert('xss'));">xxx</a><br /> |
422 | <strong>Bad IE7:</strong> <a href="xxx" style="background:/* x */expression(alert('xss'));">xxx</a><br /> | 422 | <strong>Bad IE7:</strong> <a href="xxx" style="background:/* x */expression(alert('xss'));">xxx</a><br /> |
423 | <strong>Bad IE7:</strong> <a href="xxx" style="background:/* */ */expression(alert('xss'));">xxx</a><br /> | 423 | <strong>Bad IE7:</strong> <a href="xxx" style="background:/* */ */expression(alert('xss'));">xxx</a><br /> |
424 | <strong>Bad IE7:</strong> <a href="x" style="width: /****/**;;;;;;*/expression/**/(alert('xss'));">x</a><br /> | 424 | <strong>Bad IE7:</strong> <a href="x" style="width: /****/**;;;;;;*/expression/**/(alert('xss'));">x</a><br /> |
425 | <strong>Bad IE7:</strong> <a href="x" style="padding:10px; background:/**/expression(alert('xss'));">x</a><br /> | 425 | <strong>Bad IE7:</strong> <a href="x" style="padding:10px; background:/**/expression(alert('xss'));">x</a><br /> |
426 | <strong>Bad IE7:</strong> <a href="x" style="background: huh /* */ */expression(alert('xss'));">x</a><br /> | 426 | <strong>Bad IE7:</strong> <a href="x" style="background: huh /* */ */expression(alert('xss'));">x</a><br /> |
427 | <strong>Bad IE7:</strong> <a href="x" style="background:/**/expression(alert('xss'));background:/**/expression(alert('xss'));">x</a><br /> | 427 | <strong>Bad IE7:</strong> <a href="x" style="background:/**/expression(alert('xss'));background:/**/expression(alert('xss'));">x</a><br /> |
428 | <strong>Bad IE7:</strong> exp/*<a style='no\xss:noxss("*//*");xss:ex/*XSS*//*/*/pression(alert("XSS"))'>x</a><br /> | 428 | <strong>Bad IE7:</strong> exp/*<a style='no\xss:noxss("*//*");xss:ex/*XSS*//*/*/pression(alert("XSS"))'>x</a><br /> |
429 | <strong>Bad IE7:</strong> <a style="background:Expre\ssion(alert('xss'));">hi</a><br /> | 429 | <strong>Bad IE7:</strong> <a style="background:Expre\ssion(alert('xss'));">hi</a><br /> |
430 | <strong>Bad IE7:</strong> <a style="background:expre\ssion(alert('xss'));">hi</a><br /> | 430 | <strong>Bad IE7:</strong> <a style="background:expre\ssion(alert('xss'));">hi</a><br /> |
431 | <strong>Bad IE7:</strong> <a style="color: \0065 \0078 \0070 \0072 \0065 \0073 \0073 \0069 \006f \006e \0028 \0061 \006c \0065 \0072 \0074 \0028 \0031 \0029 \0029">test</a><br /> | 431 | <strong>Bad IE7:</strong> <a style="color: \0065 \0078 \0070 \0072 \0065 \0073 \0073 \0069 \006f \006e \0028 \0061 \006c \0065 \0072 \0074 \0028 \0031 \0029 \0029">test</a><br /> |
432 | <strong>Bad IE7:</strong> <a style="xss:e\0078pression(window.x?0:(alert(/XSS/),window.x=1));">hi</a><br /> | 432 | <strong>Bad IE7:</strong> <a style="xss:e\0078pression(window.x?0:(alert(/XSS/),window.x=1));">hi</a><br /> |
433 | <strong>Bad IE7:</strong> <a style="background:url('java | 433 | <strong>Bad IE7:</strong> <a style="background:url('java |
434 | script:eval(document.all.mycode.expr)')">hi</a><br /> | 434 | script:eval(document.all.mycode.expr)')">hi</a><br /> |
435 | 435 | ||
436 | <h6>Other</h6> | 436 | <h6>Other</h6> |
437 | 437 | ||
438 | 3 < 4 <br /> | 438 | 3 < 4 <br /> |
439 | 3 > 4 <br /> | 439 | 3 > 4 <br /> |
440 | > 3 <br /> | 440 | > 3 <br /> |
441 | <._.> hi! <br /> | 441 | <._.> hi! <br /> |
442 | <<< ALERT >>> <br /> | 442 | <<< ALERT >>> <br /> |
443 | <![if !vml]> some stuff <![endif]> <br /> | 443 | <![if !vml]> some stuff <![endif]> <br /> |
444 | <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> <br /> | 444 | <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> <br /> |
445 | <uml:ns ns = "urn:www"> <br /> | 445 | <uml:ns ns = "urn:www"> <br /> |
446 | <uml:ns ns = 'urn:www'> <br /> | 446 | <uml:ns ns = 'urn:www'> <br /> |
447 | if(13<age AND 21>age){say 'teen'} <br /> | 447 | if(13<age AND 21>age){say 'teen'} <br /> |
448 | age >51 and a smoking history of >51 pack-years <b>was</b> <br /> | 448 | age >51 and a smoking history of >51 pack-years <b>was</b> <br /> |
449 | age > 51 and a smoking history of >51 pack-years <b>was</b> <br /> | 449 | age > 51 and a smoking history of >51 pack-years <b>was</b> <br /> |
450 | age <51 and a smoking history of <51 pack-years <b>was</b> <br /> | 450 | age <51 and a smoking history of <51 pack-years <b>was</b> <br /> |
451 | age < 51 and a smoking history of < 51 pack-years <b>was</b> <br /> | 451 | age < 51 and a smoking history of < 51 pack-years <b>was</b> <br /> |
452 | <b>age >51 and a smoking history of >51 pack-years</b> <br /> | 452 | <b>age >51 and a smoking history of >51 pack-years</b> <br /> |
453 | <b>age > 51 and a smoking history of >51 pack-years</b> <br /> | 453 | <b>age > 51 and a smoking history of >51 pack-years</b> <br /> |
454 | <b>age <51 and a smoking history of <51 pack-years</b> <br /> | 454 | <b>age <51 and a smoking history of <51 pack-years</b> <br /> |
455 | <b>age < 51 and a smoking history of < 51 pack-years</b> <br /> | 455 | <b>age < 51 and a smoking history of < 51 pack-years</b> <br /> |