@cloudea/yang-editor 1.0.5 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/componets.d.ts +14 -2
- package/dist/componets.d.ts.map +1 -1
- package/dist/componets.js +95 -21
- package/dist/componets.js.map +1 -1
- package/dist/images.d.ts +3 -0
- package/dist/images.d.ts.map +1 -1
- package/dist/images.js +3 -0
- package/dist/images.js.map +1 -1
- package/dist/index.d.ts +10 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -1
- package/dist/index.js.map +1 -1
- package/dist/utils.d.ts +24 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +84 -1
- package/dist/utils.js.map +1 -1
- package/images/code@2x.png +0 -0
- package/images/collapse@2x.png +0 -0
- package/images/image@2x.png +0 -0
- package/package.json +1 -1
- package/src/componets.ts +113 -20
- package/src/images.ts +3 -0
- package/src/index.ts +29 -2
- package/src/style.css +67 -0
- package/src/utils.ts +95 -1
package/dist/utils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SelectionUtils = void 0;
|
|
3
|
+
exports.FormatCleaner = exports.SelectionUtils = void 0;
|
|
4
4
|
const componets_1 = require("./componets");
|
|
5
5
|
class SelectionUtils {
|
|
6
6
|
constructor(element) {
|
|
@@ -34,4 +34,87 @@ class SelectionUtils {
|
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
exports.SelectionUtils = SelectionUtils;
|
|
37
|
+
/**
|
|
38
|
+
* utils for format cleaning
|
|
39
|
+
*/
|
|
40
|
+
class FormatCleaner {
|
|
41
|
+
/**
|
|
42
|
+
* clean HTML string and return plain text
|
|
43
|
+
* @param htmlString html string
|
|
44
|
+
* @returns plain text
|
|
45
|
+
*/
|
|
46
|
+
static cleanHTMLString(htmlString) {
|
|
47
|
+
// remove Word XML namespace labels
|
|
48
|
+
htmlString = htmlString.replace(/<\/?[ovwm]:[^>]*>/gi, '');
|
|
49
|
+
// remove Word conditional comments
|
|
50
|
+
htmlString = htmlString.replace(/<!--\[if[\s\S]*?<!\[endif\]-->/gi, '');
|
|
51
|
+
htmlString = htmlString.replace(/<!--[\s\S]*?-->/g, '');
|
|
52
|
+
const tempDiv = document.createElement('div');
|
|
53
|
+
tempDiv.innerHTML = htmlString;
|
|
54
|
+
// remove all <style> tags (including @page, @font-face rules)
|
|
55
|
+
const styleTags = tempDiv.querySelectorAll('style');
|
|
56
|
+
styleTags.forEach(style => style.remove());
|
|
57
|
+
// remove other unwanted tags
|
|
58
|
+
FormatCleaner.unwantedTags.forEach(tag => {
|
|
59
|
+
const elements = tempDiv.querySelectorAll(tag);
|
|
60
|
+
elements.forEach(el => el.remove());
|
|
61
|
+
});
|
|
62
|
+
return this.extractPlainText(tempDiv);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* extract plain text from node, remove all HTML tags and styles
|
|
66
|
+
* @param node DOM node
|
|
67
|
+
* @returns plain text content
|
|
68
|
+
*/
|
|
69
|
+
static extractPlainText(node) {
|
|
70
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
71
|
+
return node.textContent || '';
|
|
72
|
+
}
|
|
73
|
+
else if (node.nodeType === Node.ELEMENT_NODE) {
|
|
74
|
+
const element = node;
|
|
75
|
+
const tagName = element.tagName.toLowerCase();
|
|
76
|
+
if (FormatCleaner.unwantedTags.includes(tagName)) {
|
|
77
|
+
return '';
|
|
78
|
+
}
|
|
79
|
+
if (tagName === 'br') {
|
|
80
|
+
return '\n';
|
|
81
|
+
}
|
|
82
|
+
// block elements(p、div etc.)
|
|
83
|
+
const isBlock = ['p', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
|
|
84
|
+
'li', 'tr', 'td', 'th', 'blockquote', 'pre'].includes(tagName);
|
|
85
|
+
let result = '';
|
|
86
|
+
for (let child of Array.from(element.childNodes)) {
|
|
87
|
+
result += this.extractPlainText(child);
|
|
88
|
+
}
|
|
89
|
+
if (isBlock && result.trim()) {
|
|
90
|
+
result += '\n';
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
return '';
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* remove all styles and other properties
|
|
98
|
+
* @param element HTML element
|
|
99
|
+
*/
|
|
100
|
+
static removeAllStyles(element) {
|
|
101
|
+
// remove style attribute
|
|
102
|
+
element.removeAttribute('style');
|
|
103
|
+
// remove common format attributes
|
|
104
|
+
const formatAttributes = ['class', 'align', 'valign', 'bgcolor', 'color',
|
|
105
|
+
'face', 'size', 'width', 'height', 'border',
|
|
106
|
+
'cellpadding', 'cellspacing', 'dir'];
|
|
107
|
+
formatAttributes.forEach(attr => {
|
|
108
|
+
if (element.hasAttribute(attr)) {
|
|
109
|
+
element.removeAttribute(attr);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
// recursively process child elements
|
|
113
|
+
for (let child of Array.from(element.children)) {
|
|
114
|
+
this.removeAllStyles(child);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.FormatCleaner = FormatCleaner;
|
|
119
|
+
FormatCleaner.unwantedTags = ['style', 'script', 'link', 'meta', 'head', 'title', 'xml'];
|
|
37
120
|
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAA,2CAA+C;AAE/C,MAAa,cAAc;IAIvB,YAAY,OAAoB;QAC5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAEM,oBAAoB;QACvB,IAAI,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACrC,IAAG,KAAK,EAAE,CAAC;YACP,IAAI,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC;YAChC,OAAM,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;oBACrC,IAAI,IAAI,GAAG,IAAmB,CAAC;oBAC/B,IAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,4BAAgB,CAAC,eAAe,CAAC,EAAE,CAAC;wBAC3D,OAAO,IAAI,CAAC;oBAChB,CAAC;gBACL,CAAC;gBACD,IAAI,GAAG,IAAI,CAAC,UAAkB,CAAC;YACnC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,iBAAiB;QACpB,IAAI,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QACtC,IAAG,SAAS,IAAI,SAAS,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YACvC,IAAI,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACpC,IAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBACtD,OAAO,KAAK,CAAC;YACjB,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAnCD,wCAmCC"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
package/src/componets.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { images } from "./images";
|
|
2
2
|
import {YangEditor, YangEditorColor} from "./index";
|
|
3
|
+
import { FormatCleaner } from "./utils";
|
|
3
4
|
|
|
4
5
|
export interface EditorElement {
|
|
5
6
|
}
|
|
@@ -10,6 +11,8 @@ export interface EditorComponent extends EditorElement {
|
|
|
10
11
|
onMounted(): void;
|
|
11
12
|
}
|
|
12
13
|
|
|
14
|
+
export type EditorFunction = "insertCollapse" | "insertImage" | "insertCode"
|
|
15
|
+
|
|
13
16
|
export class EditorBody implements EditorComponent {
|
|
14
17
|
public readonly element: HTMLDivElement;
|
|
15
18
|
public readonly context: YangEditor;
|
|
@@ -162,20 +165,38 @@ export class EditorContent implements EditorComponent {
|
|
|
162
165
|
}
|
|
163
166
|
|
|
164
167
|
this.element.onpaste = (e) => {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
//
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
168
|
+
e.preventDefault();
|
|
169
|
+
|
|
170
|
+
let clipboardData = e.clipboardData;
|
|
171
|
+
if (!clipboardData) return;
|
|
172
|
+
|
|
173
|
+
// get clipboard content
|
|
174
|
+
let html = clipboardData.getData("text/html");
|
|
175
|
+
let text = clipboardData.getData("text/plain");
|
|
176
|
+
|
|
177
|
+
let cleanedText = '';
|
|
178
|
+
if (html) {
|
|
179
|
+
cleanedText = FormatCleaner.cleanHTMLString(html);
|
|
180
|
+
} else if (text) {
|
|
181
|
+
cleanedText = text;
|
|
182
|
+
}
|
|
183
|
+
if (cleanedText) {
|
|
184
|
+
// insert content into selection range
|
|
185
|
+
const range = this.context.selectionUtils.getSelectionRange();
|
|
186
|
+
if (range) {
|
|
187
|
+
const lines = cleanedText.split('\n').filter(line => line.trim());
|
|
188
|
+
const fragment = document.createDocumentFragment();
|
|
189
|
+
lines.forEach((line, index) => {
|
|
190
|
+
fragment.appendChild(document.createTextNode(line));
|
|
191
|
+
if (index < lines.length - 1) {
|
|
192
|
+
fragment.appendChild(document.createElement('br'));
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
range.deleteContents();
|
|
196
|
+
range.insertNode(fragment);
|
|
197
|
+
range.collapse(false);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
179
200
|
}
|
|
180
201
|
|
|
181
202
|
this.insertDefaultParagraph();
|
|
@@ -187,14 +208,14 @@ export class EditorContent implements EditorComponent {
|
|
|
187
208
|
this.element.appendChild(document.createElement('p'));
|
|
188
209
|
}
|
|
189
210
|
|
|
190
|
-
insertCollapse() {
|
|
211
|
+
insertCollapse(args: {className?: string}) {
|
|
191
212
|
let paragraphElement = this.context.selectionUtils.getSelectedParagraph();
|
|
192
213
|
if(paragraphElement?.innerText.trim() === "") {
|
|
193
|
-
paragraphElement.replaceWith(new EditorCollapse(this.context).onMount());
|
|
214
|
+
paragraphElement.replaceWith(new EditorCollapse(this.context, undefined, args.className).onMount());
|
|
194
215
|
} else {
|
|
195
216
|
for(let child of this.element.children) {
|
|
196
217
|
if(child === paragraphElement) {
|
|
197
|
-
child.after(new EditorCollapse(this.context).onMount());
|
|
218
|
+
child.after(new EditorCollapse(this.context, undefined, args.className).onMount());
|
|
198
219
|
break;
|
|
199
220
|
}
|
|
200
221
|
}
|
|
@@ -272,11 +293,16 @@ class ButtonAdd implements EditorComponent {
|
|
|
272
293
|
this.element.classList.add("yang-editor-button-add");
|
|
273
294
|
this.element.innerText = "";
|
|
274
295
|
this.element.style.backgroundImage = `url("${images.add2x}")`;
|
|
275
|
-
|
|
276
|
-
|
|
296
|
+
|
|
297
|
+
let div = document.createElement("div");
|
|
298
|
+
div.classList.add("yang-editor-button-add-bridge");
|
|
299
|
+
this.element.appendChild(div)
|
|
300
|
+
|
|
301
|
+
//this.element.onclick = () => this.context.body.content.insertCollapse();
|
|
277
302
|
}
|
|
278
303
|
|
|
279
304
|
onMount(): HTMLElement {
|
|
305
|
+
this.element.appendChild(new EditorComponentMenu(this.context).onMount());
|
|
280
306
|
return this.element;
|
|
281
307
|
}
|
|
282
308
|
|
|
@@ -532,7 +558,7 @@ export class EditorCollapse implements EditorComponent {
|
|
|
532
558
|
body: HTMLDivElement;
|
|
533
559
|
container: HTMLDivElement;
|
|
534
560
|
|
|
535
|
-
constructor(editor: YangEditor, element?: HTMLElement) {
|
|
561
|
+
constructor(editor: YangEditor, element?: HTMLElement, className?: string) {
|
|
536
562
|
this.context = editor;
|
|
537
563
|
if(element) {
|
|
538
564
|
this.element = element;
|
|
@@ -568,6 +594,9 @@ export class EditorCollapse implements EditorComponent {
|
|
|
568
594
|
this.container.contentEditable = "false";
|
|
569
595
|
this.button.style.backgroundImage = `url("${images.down2x}")`;
|
|
570
596
|
}
|
|
597
|
+
if (className) {
|
|
598
|
+
this.container.classList.add(className);
|
|
599
|
+
}
|
|
571
600
|
}
|
|
572
601
|
|
|
573
602
|
getElement(): HTMLElement {
|
|
@@ -620,6 +649,70 @@ export class EditorCollapse implements EditorComponent {
|
|
|
620
649
|
|
|
621
650
|
}
|
|
622
651
|
|
|
652
|
+
|
|
653
|
+
export class EditorComponentMenu implements EditorComponent {
|
|
654
|
+
public readonly element: HTMLDivElement;
|
|
655
|
+
public readonly context: YangEditor;
|
|
656
|
+
public readonly functions: Map<EditorFunction, (args:any) => void> = new Map();
|
|
657
|
+
|
|
658
|
+
constructor(editor: YangEditor) {
|
|
659
|
+
this.context = editor;
|
|
660
|
+
this.element = document.createElement("div");
|
|
661
|
+
this.functions.set("insertCollapse", (args) => this.context.body.content.insertCollapse(args));
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
onMounted(): void {
|
|
665
|
+
throw new Error("Method not implemented.");
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
getElement(): HTMLElement {
|
|
669
|
+
return this.element;
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
onMount(): HTMLElement {
|
|
673
|
+
this.element.classList.add("yang-editor-component-menu");
|
|
674
|
+
|
|
675
|
+
if (this.context.options.menus) {
|
|
676
|
+
|
|
677
|
+
let ul = document.createElement("ul");
|
|
678
|
+
let lis = new Array<HTMLLIElement>();
|
|
679
|
+
|
|
680
|
+
for (let item of this.context.options.menus) {
|
|
681
|
+
let li = document.createElement("li");
|
|
682
|
+
let icon = document.createElement("button");
|
|
683
|
+
let text = document.createElement("p");
|
|
684
|
+
li.classList.add("yang-editor-component-menu-item");
|
|
685
|
+
icon.classList.add("yang-editor-component-menu-item-icon");
|
|
686
|
+
text.classList.add("yang-editor-component-menu-item-text");
|
|
687
|
+
let title = item.name;
|
|
688
|
+
icon.style.backgroundImage = `url("${item.icon}")`;
|
|
689
|
+
text.innerText = title;
|
|
690
|
+
if (item.className) {
|
|
691
|
+
li.classList.add(item.className);
|
|
692
|
+
}
|
|
693
|
+
if (item.callback) {
|
|
694
|
+
let func = this.functions.get(item.callback);
|
|
695
|
+
if (func) {
|
|
696
|
+
li.onclick = () => {
|
|
697
|
+
func(item.args)
|
|
698
|
+
};
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
li.appendChild(icon);
|
|
702
|
+
li.appendChild(text);
|
|
703
|
+
ul.appendChild(li);
|
|
704
|
+
lis.push(li);
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
this.element.appendChild(ul);
|
|
708
|
+
}
|
|
709
|
+
return this.getElement();
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
|
|
623
716
|
export class EditorParagraphMenu implements EditorComponent {
|
|
624
717
|
public readonly element: HTMLDivElement;
|
|
625
718
|
public readonly context: YangEditor;
|
package/src/images.ts
CHANGED
|
@@ -5,12 +5,15 @@ export const images = {
|
|
|
5
5
|
add2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAGmSURBVFiFxVbJYcMgEJwlaSRV+Gn0slWEKzA9WOoBd5DUoPhl/HUVqQTyELqsA1bB8fxWAmZgYWcJHFRKgtypjQkSAOBg6phusDDItYldkqJJG7JoUImdLv4m4Pt45RPzhEwLWL1rvoixgEpJCHdNQxwW8fY/5AAAicOG8Hk3/Y9iMOR55B7uhIsqpgU8/AivBQNLGUAlW0Sl5FgAeu87BkQ35Npgp4u2DkTP7bhqAdzdAxhcKKIbTwBkcwr+BJi7TwF/CmLV7hNChIc8CT4NAs5tXyYCAOFydIsjLGUcdxvgoorF+2UpC6SAytXkAIJPVEAuC0iRnoChUdhyZypdvw5USkI8rOHcNuimlrL3xQH1SnM57AQIyNG4cKvjp3KrWErk2ghYZh1Phjq1Ark2bDNJiPoVvCIN/hKLNuCeQuMhlZJ8M+teVndXn9uOdXAw2J+zJux6wq/7Dw4bAlJ1wjPYnz/64bASrkkFB5ayx0/jUrw/r+jzIsknfGXaC3a6SCaiaV5nTC1cMEOWukTswm4aV7Fbs4kQEknMEzAryKMp5yt6h1+8AKTXUlzRcwAAAABJRU5ErkJggg==',
|
|
6
6
|
bold2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAADcSURBVFiF7ZRrDoMgEISnTe9VejLxZMLJ7A/YoIllH80Gf/AlRg0Ph3V2gMlkMA9mfAMQhHslALk+R5ucawG74RILeCnErMz4G61aS33/KPa/hCqwGdbsEPy+p0lWn+OplxECgGJIEV4CqBvCKAFUes64LgI0hlW1YWTGj20IlNNza1isQSRqQcDPA4AuxrubaIIooJRdXAmNByQktAxgQ0iCJYoJqkB3racHUr2HUQKINEJARDt5/j3NR0DA2YCpN1naBQG6ViRWTgDHP0kYJR/wyIGMcx5MJvfmC0EdViqgG/sdAAAAAElFTkSuQmCC',
|
|
7
7
|
clear2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAADoSURBVFiF7ZdLDsIwDESHm+VmhJOlN4MFjWRckoztGiTESF70E7/XqIla4J8v5xIcX/YCgG2vj6QAaADuqpoQSoVrsK40CQ3vT1wA1GwJDa9v7kmVWMHTJWTTVVIk2Bk4TaIoWD+OSJjh2j4q0TxwDfFI9E1rKcA2t0rIXXMaS1OLBPUeVAPcIkH3pafJIFFBPn1EYCSh4cUisLyZkDBvQrIBtV5JCQreI2fBI1Ej8KjEKXCvxKlwq0QKnJUIw5nP8qYa3/D8/L4Ozs+yuj6VGK1xS3mXN4DjdHvrJZ4/o+IYI7MFx/9YHqpw4/wia7QRAAAAAElFTkSuQmCC',
|
|
8
|
+
code2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAACNSURBVFiF7ZbBCYAwEAQXK7GElJKS0klKtAT9RJCA4XK3Zx7egL+VGcgjAYIgkLM7bUUkAAeAKtjWtk1s+dm+PNjmx44S0cuL4J/CitDIaREWuTmCIVdHMOXTER5ycYSnfBixOYjULD0Czwix3CNiWs6MUMsZEWa5JYImf4v49DruI5Y8SG52p20Q/JwLnf9zIcEOe6AAAAAASUVORK5CYII=',
|
|
9
|
+
collapse2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAABgSURBVFiF7ZSxDcAgEMRuZEbIBozAqKQIKUARCjwQItn92U+DBAAAm+MkecP+SA6TIEoKHduQtpYHZKKWI3o2w4TD4y3iafE3genxWmhZ/Cm4PF4e8Un8xuv6KwAA4L+cIcQlYuhEL/UAAAAASUVORK5CYII=',
|
|
8
10
|
copy2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAADMSURBVFiF7ZZbEsIgDEVvHffVuDLpyqArqx8FrRiVhEd/cmYYZngklwwhAMbJTML1BOCu9LXG3in3wwHYGjQ6GpVEYIv9Taf/Gb2gtZFOoIXifn8cvFQYbIIJ4AR4vN9az6zpJsAhS5Pe5ALm2C/YU3SCPu1UAhKhp9MSAcMwASZgpADiBq8CAwGvilbD+msyPcPEzCXnNe3jWZdGQPqF+0uPO+AhKGCSCJRCksWnp+G3CNBIEbnjFl9vV+qQu9Vp88zMlbBgYDk3qnkARgpONsy9a0IAAAAASUVORK5CYII=',
|
|
9
11
|
cut2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAADxSURBVFiF7ZZRDoMgDIZ/lx2sN1t3MrzZ9uDIutKCIOjD+BJjgtB+AYoAk39nKXynzxPhUSIWAcDLeE6RYJWQVRuNTE4iUU6shjiOe3SOS0OVyc2Y951BWgn4ij4tAQvCZhuc73uWgPC7iSnX2ROwpoyddm+8nIEqYqIYxCpJS0KPO4QM5smw09+Sa4aQTqNO5kkNRUo0H1C3rkqDIFy0BAR755+yCWUwrwypMO6QROkgytW4lGg6iGIAnVzL5SCkS2fSUgWrSJLrs2D7AQHAw5MYXYa8R0JDuPhCAqSlxkbbcBhp6XVPXnMtX9V7MunCG5oyltrXyXn1AAAAAElFTkSuQmCC',
|
|
10
12
|
delete2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAADESURBVFiF7ZdhDoMgDIXflt1rvdnYyexO5n4I0URb4RHFBF9CTKptP4tgAXrXg/QTw65kvCIFAKMxhtJgLwJAAbyNe18i3vU0wC5x7VhN0fPQV6lUqoQcmaR5Bc4AGDEt3SYAEq/WsqUBJNO2KwYgYPpAlwkl2op3QgbALCejLlbBDXADXBuA6YhS16MLm0a7olBsS7aVKBCx2k/BWQA/BiA5fSoSy94D3sFEMP/dtBKAPQC5h5DcIXCUS+YGcaSkX0f6A9JRRH7yUeoDAAAAAElFTkSuQmCC',
|
|
11
13
|
deleteline2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAADwSURBVFiF7VZtDsIgDH3THcSj1JNZTzY82fyzxa4gUFZM1L2k6TLa1xcoH8CBf8fQmEfKB+W7gQHMBaM3ubtAFYWlTd4CJlWAEwK5lwhZvERKBaERTkYx98J4qIjZoGYXzMZ44DVTDxRmoZeAapwrYgjARQgI3iJKYMTdTV7kckpzpKnuD4s3NZ3OlwLmdFw3DIB9G7pjFN/XHTy3xZP6H9C+RE0gxPfCx6FFUC64Rw8EbM+KrIAxN7gkrwSa2CKoGYy29ZQ3KO0RABivV2xFu7wJJGHuKOZEbCrORUSNuRVfQYifZiljC+nXPcsP/B6ekq1yptAqTwMAAAAASUVORK5CYII=',
|
|
12
14
|
down2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAABiSURBVFiF7ZBBCoAwDARXX5an+bPiy+rFo5TYaSvIDuSWMEMkY4wxH7MlduKeXg5wqyKpwiktwU7qkpzkOMQ/ECSARmA5iRgm74kYLn8TMU2eiZgub0Uskz9FLJcbY8x/uAClcl7rtXA5XgAAAABJRU5ErkJggg==',
|
|
13
15
|
fgcolor: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTciIGhlaWdodD0iMTciIHZpZXdCb3g9IjAgMCAxNyAxNyIgZmlsbD0ibm9uZSI+PHBhdGggICBmaWxsPSJyZ2JhKDIyOCwgNzMsIDkxLCAxKSIgIGQ9Ik0yLjUgMEwxNC41IDBDMTUuODgwNyAwIDE3IDEuMTE5MjkgMTcgMi41TDE3IDE0LjVDMTcgMTUuODgwNyAxNS44ODA3IDE3IDE0LjUgMTdMMi41IDE3QzEuMTE5MjkgMTcgMCAxNS44ODA3IDAgMTQuNUwwIDIuNUMwIDEuMTE5MjkgMS4xMTkyOSAwIDIuNSAwWk0yLjUgMUMxLjY3MTU3IDEgMSAxLjY3MTU3IDEgMi41TDEgMTQuNUMxIDE1LjMyODQgMS42NzE1NyAxNiAyLjUgMTZMMTQuNSAxNkMxNS4zMjg0IDE2IDE2IDE1LjMyODQgMTYgMTQuNUwxNiAyLjVDMTYgMS42NzE1NyAxNS4zMjg0IDEgMTQuNSAxTDIuNSAxWiI+PC9wYXRoPjxnICBjbGlwLXBhdGg9InVybCgjY2xpcC1wYXRoLXVEbXBUYVlCZC1HQWJ2bVU0a1JTbSkiPjxwYXRoIGQ9Ik0xMy40Njg2IDEwLjM5NzNDMTMuNDQ4IDEwLjQxNzkgMTMuNDI3MiAxMC40MzgxIDEzLjQwNjEgMTAuNDU4MUMxMy4zODUgMTAuNDc4MSAxMy4zNjM3IDEwLjQ5NzggMTMuMzQyMSAxMC41MTczQzEzLjMyMDYgMTAuNTM2NyAxMy4yOTg4IDEwLjU1NiAxMy4yNzY3IDEwLjU3NDlDMTMuMjU0NyAxMC41OTM4IDEzLjIzMjQgMTAuNjEyNSAxMy4yMDk5IDEwLjYzMDlDMTMuMTg3NCAxMC42NDkyIDEzLjE2NDcgMTAuNjY3MyAxMy4xNDE3IDEwLjY4NTFDMTMuMTE4OCAxMC43MDMgMTMuMDk1NiAxMC43MjA1IDEzLjA3MjIgMTAuNzM3N0MxMy4wNDg5IDEwLjc1NSAxMy4wMjUzIDEwLjc3MTkgMTMuMDAxNSAxMC43ODg2QzEyLjk3NzcgMTAuODA1MiAxMi45NTM3IDEwLjgyMTYgMTIuOTI5NCAxMC44Mzc3QzEyLjkwNTIgMTAuODUzOCAxMi44ODA5IDEwLjg2OTUgMTIuODU2MyAxMC44ODVDMTIuODMxNyAxMC45MDA1IDEyLjgwNjkgMTAuOTE1NiAxMi43ODE5IDEwLjkzMDVDMTIuNzU2OSAxMC45NDUzIDEyLjczMTggMTAuOTU5OSAxMi43MDY1IDEwLjk3NDFDMTIuNjgxMSAxMC45ODgzIDEyLjY1NTYgMTEuMDAyMiAxMi42Mjk5IDExLjAxNThDMTIuNjA0MyAxMS4wMjk0IDEyLjU3ODQgMTEuMDQyNyAxMi41NTI0IDExLjA1NTdDMTIuNTI2NCAxMS4wNjg2IDEyLjUwMDMgMTEuMDgxMyAxMi40NzQgMTEuMDkzNkMxMi40NDc2IDExLjEwNTkgMTIuNDIxMiAxMS4xMTc5IDEyLjM5NDYgMTEuMTI5NkMxMi4zNjc5IDExLjE0MTIgMTIuMzQxMiAxMS4xNTI1IDEyLjMxNDMgMTEuMTYzNkMxMi4yODc0IDExLjE3NDYgMTIuMjYwNCAxMS4xODUyIDEyLjIzMzIgMTEuMTk1NUMxMi4yMDYxIDExLjIwNTkgMTIuMTc4OCAxMS4yMTU5IDEyLjE1MTQgMTEuMjI1NUMxMi4xMjQgMTEuMjM1MiAxMi4wOTY1IDExLjI0NDUgMTIuMDY4OSAxMS4yNTM1QzEyLjA0MTIgMTEuMjYyNSAxMi4wMTM1IDExLjI3MTEgMTEuOTg1NiAxMS4yNzk0QzExLjk1NzggMTEuMjg3NyAxMS45Mjk5IDExLjI5NTYgMTEuOTAxOCAxMS4zMDMyQzExLjg3MzggMTEuMzEwOCAxMS44NDU2IDExLjMxODEgMTEuODE3NCAxMS4zMjVDMTEuNzg5MiAxMS4zMzE5IDExLjc2MDkgMTEuMzM4NSAxMS43MzI1IDExLjM0NDdDMTEuNzA0MSAxMS4zNTA5IDExLjY3NTcgMTEuMzU2NyAxMS42NDcxIDExLjM2MjJDMTEuNjE4NiAxMS4zNjc3IDExLjU5IDExLjM3MjkgMTEuNTYxNCAxMS4zNzc3QzExLjUzMjcgMTEuMzgyNSAxMS41MDQgMTEuMzg2OSAxMS40NzUyIDExLjM5MUMxMS40NDY1IDExLjM5NTEgMTEuNDE3NyAxMS4zOTg4IDExLjM4ODggMTEuNDAyMkMxMS4zNTk5IDExLjQwNTYgMTEuMzMxMSAxMS40MDg2IDExLjMwMjEgMTEuNDExM0MxMS4yNzMyIDExLjQxMzkgMTEuMjQ0MiAxMS40MTYyIDExLjIxNTIgMTEuNDE4MkMxMS4xODYzIDExLjQyMDEgMTEuMTU3MiAxMS40MjE3IDExLjEyODIgMTEuNDIyOUMxMS4wOTkyIDExLjQyNDIgMTEuMDcwMiAxMS40MjUgMTEuMDQxMSAxMS40MjU1QzExLjAxMjEgMTEuNDI2MSAxMC45ODMgMTEuNDI2MiAxMC45NTM5IDExLjQyNkw5Ljg0OTI5IDExLjQyNkM5LjYxNzI4IDExLjQyNiA5LjM5Nzk2IDExLjY0NDcgOS4zOTc5NiAxMS44NzczQzkuMzk3OTYgMTEuOTY0IDkuNDUzMjkgMTIuMDU2NyA5LjU0Mzk2IDEyLjE5NEM5Ljc4MDYyIDEyLjQ0NDcgOS44OTA2MiAxMi43MzYgOS44OTA2MiAxMy4xMDQ3QzkuODkwNjIgMTMuNDYyNyA5LjczOTk2IDEzLjgyIDkuNDc1OTYgMTQuMDg0NkM5LjQ2NzkzIDE0LjA5MjcgOS40NTk4MiAxNC4xMDA3IDkuNDUxNjEgMTQuMTA4NUM5LjQ0MzM5IDE0LjExNjQgOS40MzUwOSAxNC4xMjQxIDkuNDI2NjkgMTQuMTMxOEM5LjQxODI5IDE0LjEzOTUgOS40MDk3OSAxNC4xNDcgOS40MDEyMSAxNC4xNTQ1QzkuMzkyNjMgMTQuMTYxOSA5LjM4Mzk1IDE0LjE2OTMgOS4zNzUyIDE0LjE3NjVDOS4zNjY0MyAxNC4xODM4IDkuMzU3NTkgMTQuMTkwOSA5LjM0ODY2IDE0LjE5NzlDOS4zMzk3MiAxNC4yMDQ5IDkuMzMwNyAxNC4yMTE5IDkuMzIxNiAxNC4yMTg3QzkuMzEyNDkgMTQuMjI1NSA5LjMwMzMyIDE0LjIzMjMgOS4yOTQwNSAxNC4yMzg4QzkuMjg0NzkgMTQuMjQ1NCA5LjI3NTQ1IDE0LjI1MTggOS4yNjYwMyAxNC4yNTgzQzkuMjU2NjEgMTQuMjY0NiA5LjI0NzExIDE0LjI3MDggOS4yMzc1NCAxNC4yNzdDOS4yMjc5NiAxNC4yODMxIDkuMjE4MzIgMTQuMjg5MSA5LjIwODYxIDE0LjI5NTFDOS4xOTg4OSAxNC4zMDA5IDkuMTg5MDkgMTQuMzA2NyA5LjE3OTI0IDE0LjMxMjRDOS4xNjkzOCAxNC4zMTggOS4xNTk0NyAxNC4zMjM1IDkuMTQ5NDcgMTQuMzI4OUM5LjEzOTQ4IDE0LjMzNDMgOS4xMjk0MiAxNC4zMzk3IDkuMTE5MzEgMTQuMzQ0OUM5LjEwOTE4IDE0LjM1IDkuMDk5IDE0LjM1NTEgOS4wODg3NiAxNC4zNkM5LjA3ODUyIDE0LjM2NDkgOS4wNjgyMSAxNC4zNjk3IDkuMDU3ODYgMTQuMzc0NEM5LjA0NzUxIDE0LjM3OTEgOS4wMzcwOSAxNC4zODM3IDkuMDI2NjIgMTQuMzg4MUM5LjAxNjE2IDE0LjM5MjYgOS4wMDU2NCAxNC4zOTY4IDguOTk1MDUgMTQuNDAxQzguOTg0NDggMTQuNDA1MiA4Ljk3Mzg3IDE0LjQwOTIgOC45NjMxOSAxNC40MTMyQzguOTUyNTIgMTQuNDE3MSA4Ljk0MTggMTQuNDIwOCA4LjkzMTA1IDE0LjQyNDZDOC45MjAyOCAxNC40MjgyIDguOTA5NDcgMTQuNDMxNyA4Ljg5ODYzIDE0LjQzNTFDOC44ODc3OCAxNC40Mzg1IDguODc2ODkgMTQuNDQxOCA4Ljg2NTk3IDE0LjQ0NUM4Ljg1NTA0IDE0LjQ0OCA4Ljg0NDA4IDE0LjQ1MSA4LjgzMzA4IDE0LjQ1MzlDOC44MjIwNyAxNC40NTY3IDguODExMDUgMTQuNDU5NSA4Ljc5OTk4IDE0LjQ2MjFDOC43ODg5MSAxNC40NjQ2IDguNzc3ODEgMTQuNDY3MiA4Ljc2NjY5IDE0LjQ2OTZDOC43NTU1NyAxNC40NzE4IDguNzQ0NDEgMTQuNDc0IDguNzMzMjMgMTQuNDc2MUM4LjcyMjA3IDE0LjQ3ODEgOC43MTA4NiAxNC40OCA4LjY5OTY0IDE0LjQ4MTlDOC42ODg0MSAxNC40ODM2IDguNjc3MTYgMTQuNDg1MyA4LjY2NTkgMTQuNDg2OUM4LjY1NDY0IDE0LjQ4ODMgOC42NDMzNSAxNC40ODk3IDguNjMyMDYgMTQuNDkxQzguNjIwNzYgMTQuNDkyMiA4LjYwOTQ1IDE0LjQ5MzQgOC41OTgxMiAxNC40OTQzQzguNTg2NzkgMTQuNDk1MiA4LjU3NTQ1IDE0LjQ5NjIgOC41NjQxMSAxNC40OTY5QzguNTUyNzcgMTQuNDk3NiA4LjU0MTQxIDE0LjQ5OCA4LjUzMDA2IDE0LjQ5ODVDOC41MTg3IDE0LjQ5ODkgOC41MDczMyAxNC40OTkxIDguNDk1OTcgMTQuNDk5M0M4LjM5OTE4IDE0LjQ5OTggOC4zMDI0MyAxNC40OTc5IDguMjA1NzQgMTQuNDkzN0M4LjEwOTA1IDE0LjQ4OTUgOC4wMTI1MiAxNC40ODI4IDcuOTE2MTQgMTQuNDczOUM3LjgxOTc3IDE0LjQ2NSA3LjcyMzY2IDE0LjQ1MzYgNy42Mjc4NCAxNC40NEM3LjUzMjAyIDE0LjQyNjQgNy40MzY1OCAxNC40MTA1IDcuMzQxNTMgMTQuMzkyMkM3LjI0NjQ4IDE0LjM3MzkgNy4xNTE5MyAxNC4zNTM0IDcuMDU3ODkgMTQuMzMwNkM2Ljk2MzgzIDE0LjMwNzcgNi44NzA0IDE0LjI4MjYgNi43Nzc1NyAxNC4yNTUyQzYuNjg0NzUgMTQuMjI3OCA2LjU5MjY0IDE0LjE5ODEgNi41MDEyNSAxNC4xNjYyQzYuNDA5ODYgMTQuMTM0NCA2LjMxOTMxIDE0LjEwMDMgNi4yMjk1OCAxNC4wNjRDNi4xMzk4NSAxNC4wMjc3IDYuMDUxMDYgMTMuOTg5MyA1Ljk2MzIgMTMuOTQ4N0M1Ljg3NTM1IDEzLjkwODEgNS43ODg1MiAxMy44NjUzIDUuNzAyNzQgMTMuODIwNUM1LjYxNjk2IDEzLjc3NTcgNS41MzIzMyAxMy43Mjg4IDUuNDQ4ODMgMTMuNjc5OEM1LjM2NTM0IDEzLjYzMDkgNS4yODMwNyAxMy41OCA1LjIwMjA1IDEzLjUyN0M1LjEyMTAyIDEzLjQ3NDEgNS4wNDEzNCAxMy40MTkyIDQuOTYyOTkgMTMuMzYyNEM0Ljg4NDY0IDEzLjMwNTUgNC44MDc3MiAxMy4yNDY4IDQuNzMyMjIgMTMuMTg2M0M0LjY1NjczIDEzLjEyNTcgNC41ODI3NSAxMy4wNjMzIDQuNTEwMjggMTIuOTk5MkM0LjQzNzgyIDEyLjkzNSA0LjM2Njk2IDEyLjg2OTEgNC4yOTc3IDEyLjgwMTVDNC4yMjg0NCAxMi43MzM5IDQuMTYwODcgMTIuNjY0NyA0LjA5NDk4IDEyLjU5MzhDNC4wMjkwOSAxMi41MjI5IDMuOTY0OTcgMTIuNDUwNCAzLjkwMjYgMTIuMzc2NEMzLjg0MDIzIDEyLjMwMjQgMy43Nzk3MSAxMi4yMjY5IDMuNzIxMDIgMTIuMTQ5OUMzLjY2MjMyIDEyLjA3MyAzLjYwNTUzIDExLjk5NDYgMy41NTA2NSAxMS45MTQ5QzMuNDk1NzcgMTEuODM1MiAzLjQ0Mjg2IDExLjc1NDIgMy4zOTE5MiAxMS42NzE5QzMuMzQwOTggMTEuNTg5NiAzLjI5MjA2IDExLjUwNjEgMy4yNDUxOCAxMS40MjE0QzMuMTk4MyAxMS4zMzY3IDMuMTUzNTEgMTEuMjUxIDMuMTEwOCAxMS4xNjQxQzMuMDY4MDkgMTEuMDc3MyAzLjAyNzUyIDEwLjk4OTQgMi45ODkwOCAxMC45MDA2QzIuOTUwNjUgMTAuODExOCAyLjkxNDM5IDEwLjcyMjEgMi44ODAzMiAxMC42MzE1QzIuODQ2MjUgMTAuNTQwOSAyLjgxNDQgMTAuNDQ5NSAyLjc4NDc3IDEwLjM1NzRDMi43NTUxNCAxMC4yNjUyIDIuNzI3NzcgMTAuMTcyNCAyLjcwMjY2IDEwLjA3ODlDMi42Nzc1NSA5Ljk4NTQ4IDIuNjU0NzIgOS44OTE0NSAyLjYzNDE4IDkuNzk2ODZDMi42MTM2NCA5LjcwMjI4IDIuNTk1NDEgOS42MDcyNyAyLjU3OTQ5IDkuNTExNzlDMi41NjM1OCA5LjQxNjMyIDIuNTQ5OTkgOS4zMjA1MiAyLjUzODczIDkuMjI0MzlDMi41Mjc0NyA5LjEyODI2IDIuNTE4NTYgOS4wMzE5MSAyLjUxMTk5IDguOTM1MzVDMi41MDU0MiA4LjgzODc5IDIuNTAxMiA4Ljc0MjEyIDIuNDk5MzMgOC42NDUzNkwyLjQ5OTMzIDguMzU1MzVDMi41MDAyOCA4LjMwNzAyIDIuNTAxODIgOC4yNTg3MiAyLjUwMzk1IDguMjEwNDNDMi41MDYwNyA4LjE2MjEzIDIuNTA4NzggOC4xMTM4NyAyLjUxMjA4IDguMDY1NjVDMi41MTUzOCA4LjAxNzQzIDIuNTE5MjYgNy45NjkyNSAyLjUyMzcyIDcuOTIxMTJDMi41MjgxOSA3Ljg3MyAyLjUzMzIzIDcuODI0OTMgMi41Mzg4NyA3Ljc3NjkxQzIuNTQ0NSA3LjcyODkgMi41NTA3MSA3LjY4MDk3IDIuNTU3NSA3LjYzMzEyQzIuNTY0MyA3LjU4NTI3IDIuNTcxNjcgNy41Mzc1IDIuNTc5NjIgNy40ODk4MkMyLjU4NzU4IDcuNDQyMTMgMi41OTYxMSA3LjM5NDU3IDIuNjA1MjEgNy4zNDcwOUMyLjYxNDMyIDcuMjk5NjIgMi42MjQgNy4yNTIyNyAyLjYzNDI2IDcuMjA1MDNDMi42NDQ1MSA3LjE1Nzc5IDIuNjU1MzQgNy4xMTA2OSAyLjY2Njc0IDcuMDYzNzJDMi42NzgxNCA3LjAxNjc0IDIuNjkwMSA2Ljk2OTkxIDIuNzAyNjQgNi45MjMyNEMyLjcxNTE3IDYuODc2NTUgMi43MjgyNyA2LjgzMDAzIDIuNzQxOTQgNi43ODM2NkMyLjc1NTYgNi43MzczIDIuNzY5ODIgNi42OTExIDIuNzg0NjEgNi42NDUwOEMyLjc5OTM5IDYuNTk5MDYgMi44MTQ3MyA2LjU1MzIyIDIuODMwNjMgNi41MDc1N0MyLjg0NjUyIDYuNDYxOTMgMi44NjI5NyA2LjQxNjQ4IDIuODc5OTcgNi4zNzEyNEMyLjg5Njk3IDYuMzI1OTkgMi45MTQ1MSA2LjI4MDk1IDIuOTMyNiA2LjIzNjEyQzIuOTUwNjkgNi4xOTEzIDIuOTY5MzMgNi4xNDY3MSAyLjk4ODUgNi4xMDIzM0MzLjAwNzY3IDYuMDU3OTYgMy4wMjczOCA2LjAxMzgzIDMuMDQ3NjIgNS45Njk5M0MzLjA2Nzg3IDUuOTI2MDQgMy4wODg2NCA1Ljg4MjQgMy4xMDk5NCA1LjgzOTAxQzMuMTMxMjUgNS43OTU2MSAzLjE1MzA3IDUuNzUyNDkgMy4xNzU0MiA1LjcwOTYzQzMuMTk3NzcgNS42NjY3OCAzLjIyMDYzIDUuNjI0MTkgMy4yNDQwMiA1LjU4MTg5QzMuMjY3NCA1LjUzOTU4IDMuMjkxMjkgNS40OTc1NyAzLjMxNTY5IDUuNDU1ODRDMy4zNDAwOSA1LjQxNDExIDMuMzY1IDUuMzcyNyAzLjM5MDQgNS4zMzE1N0MzLjQxNTgxIDUuMjkwNDUgMy40NDE3MSA1LjI0OTY0IDMuNDY4MSA1LjIwOTE1QzMuNDk0NSA1LjE2ODY2IDMuNTIxMzggNS4xMjg0OSAzLjU0ODc1IDUuMDg4NjRDMy41NzYxMiA1LjA0ODgxIDMuNjAzOTcgNS4wMDkzMSAzLjYzMjMgNC45NzAxM0MzLjY2MDYzIDQuOTMwOTcgMy42ODk0NCA0Ljg5MjE2IDMuNzE4NyA0Ljg1MzdDMy43NDc5NyA0LjgxNTIyIDMuNzc3NyA0Ljc3NzExIDMuODA3OSA0LjczOTM3QzMuODM4MSA0LjcwMTYyIDMuODY4NzUgNC42NjQyNSAzLjg5OTg1IDQuNjI3MjVDMy45MzA5NSA0LjU5MDI2IDMuOTYyNSA0LjU1MzY0IDMuOTk0NDkgNC41MTczOUM0LjAyNjQ3IDQuNDgxMTYgNC4wNTg5IDQuNDQ1MzEgNC4wOTE3NSA0LjQwOTg2QzQuMTI0NjEgNC4zNzQ0MSA0LjE1NzkgNC4zMzkzNyA0LjE5MTYxIDQuMzA0NzNDNC4yMjUzMiA0LjI3MDA4IDQuMjU5NDUgNC4yMzU4NSA0LjI5Mzk4IDQuMjAyMDRDNC4zMjg2MSA0LjE2ODE2IDQuMzYzNjUgNC4xMzQ3MiA0LjM5OTEgNC4xMDE2OUM0LjQzNDU1IDQuMDY4NjggNC40NzAzOSA0LjAzNjA5IDQuNTA2NjMgNC4wMDM5NUM0LjU0Mjg4IDMuOTcxNzkgNC41Nzk1IDMuOTQwMDggNC42MTY1MSAzLjkwODgyQzQuNjUzNTIgMy44Nzc1NyA0LjY5MDkgMy44NDY3NiA0LjcyODY3IDMuODE2NDJDNC43NjY0MyAzLjc4NjA3IDQuODA0NTUgMy43NTYxOSA0Ljg0MzAzIDMuNzI2NzZDNC44ODE1MyAzLjY5NzM0IDQuOTIwMzYgMy42NjgzOSA0Ljk1OTU1IDMuNjM5OTJDNC45OTg3NSAzLjYxMTQ0IDUuMDM4MjggMy41ODM0NSA1LjA3ODE2IDMuNTU1OTRDNS4xMTgwMiAzLjUyODQyIDUuMTU4MjIgMy41MDE0IDUuMTk4NzUgMy40NzQ4N0M1LjIzOTI5IDMuNDQ4MzMgNS4yODAxMyAzLjQyMjI5IDUuMzIxMyAzLjM5Njc1QzUuMzYyNDYgMy4zNzEyMSA1LjQwMzk0IDMuMzQ2MTcgNS40NDU3MSAzLjMyMTY0QzUuNDg3NDkgMy4yOTcxMSA1LjUyOTU1IDMuMjczMDkgNS41NzE5MSAzLjI0OTU4QzUuNjE0MjggMy4yMjYwNyA1LjY1NjkxIDMuMjAzMDggNS42OTk4MiAzLjE4MDYxQzUuNzQyNzQgMy4xNTgxNCA1Ljc4NTkyIDMuMTM2MiA1LjgyOTM4IDMuMTE0NzhDNS44NzI4MyAzLjA5MzM2IDUuOTE2NTQgMy4wNzI0NyA1Ljk2MDUgMy4wNTIxMkM2LjAwNDQ1IDMuMDMxNzYgNi4wNDg2NiAzLjAxMTk0IDYuMDkzMTEgMi45OTI2NkM2LjEzNzU0IDIuOTczMzggNi4xODIyMiAyLjk1NDY0IDYuMjI3MTEgMi45MzY0NUM2LjI3MiAyLjkxODI2IDYuMzE3MTIgMi45MDA2MSA2LjM2MjQ1IDIuODgzNTJDNi40MDc3OCAyLjg2NjQyIDYuNDUzMzEgMi44NDk4OCA2LjQ5OTA0IDIuODMzOUM2LjU0NDc3IDIuODE3OTEgNi41OTA2OCAyLjgwMjQ4IDYuNjM2OCAyLjc4NzYxQzYuNjgyOSAyLjc3Mjc0IDYuNzI5MTggMi43NTg0MyA2Ljc3NTY0IDIuNzQ0NjlDNi44MjIwOSAyLjczMDk1IDYuODY4NzEgMi43MTc3NyA2LjkxNTQ4IDIuNzA1MTZDNi45NjIyNSAyLjY5MjU1IDcuMDA5MTcgMi42ODA1MSA3LjA1NjI1IDIuNjY5MDVDNy4xMDMzMSAyLjY1NzU4IDcuMTUwNTEgMi42NDY2OSA3LjE5Nzg0IDIuNjM2MzdDNy4yNDUxOCAyLjYyNjA1IDcuMjkyNjQgMi42MTYzMSA3LjM0MDIgMi42MDcxNEM3LjM4Nzc3IDIuNTk3OTggNy40MzU0NCAyLjU4OTQgNy40ODMyMiAyLjU4MTM5QzcuNTMxIDIuNTczMzkgNy41Nzg4NyAyLjU2NTk3IDcuNjI2ODMgMi41NTkxM0M3LjY3NDggMi41NTIyOSA3LjcyMjgzIDIuNTQ2MDQgNy43NzA5NCAyLjU0MDM3QzcuODE5MDQgMi41MzQ3IDcuODY3MjIgMi41Mjk2MSA3LjkxNTQ1IDIuNTI1MTJDNy45NjM2OSAyLjUyMDYyIDguMDExOTcgMi41MTY3MSA4LjA2MDMxIDIuNTEzMzlDOC4xMDg2NCAyLjUxMDA3IDguMTU3IDIuNTA3MzMgOC4yMDU0IDIuNTA1MTlDOC4yNTM4IDIuNTAzMDQgOC4zMDIyMSAyLjUwMTQ5IDguMzUwNjQgMi41MDA1MkM4LjM5OTA3IDIuNDk5NTUgOC40NDc1MiAyLjQ5OTE3IDguNDk1OTcgMi40OTkzOUMxMC4wOTMzIDIuNDk5MzkgMTEuNTk1OSAzLjA1NTM4IDEyLjcyNTkgNC4wNjI3MkMxMi43NTk3IDQuMDkyNDIgMTIuNzkzMSA0LjEyMjU0IDEyLjgyNjIgNC4xNTMwOUMxMi44NTkyIDQuMTgzNjQgMTIuODkxOSA0LjIxNDYxIDEyLjkyNDEgNC4yNDU5OUMxMi45NTY0IDQuMjc3MzYgMTIuOTg4MiA0LjMwOTE0IDEzLjAxOTYgNC4zNDEzMkMxMy4wNTExIDQuMzczNSAxMy4wODIxIDQuNDA2MDYgMTMuMTEyOCA0LjQzOTAzQzEzLjE0MzQgNC40NzE5OSAxMy4xNzM2IDQuNTA1MzQgMTMuMjAzNCA0LjUzOTA3QzEzLjIzMzEgNC41NzI4IDEzLjI2MjUgNC42MDY5IDEzLjI5MTQgNC42NDEzNkMxMy4zMjAzIDQuNjc1ODMgMTMuMzQ4OCA0LjcxMDY0IDEzLjM3NjkgNC43NDU4NEMxMy40MDQ5IDQuNzgxMDMgMTMuNDMyNSA0LjgxNjU2IDEzLjQ1OTYgNC44NTI0NUMxMy40ODY4IDQuODg4MzQgMTMuNTEzNSA0LjkyNDU2IDEzLjUzOTcgNC45NjExMUMxMy41NjU5IDQuOTk3NjcgMTMuNTkxNyA1LjAzNDU1IDEzLjYxNyA1LjA3MTc2QzEzLjY0MjMgNS4xMDg5NiAxMy42NjcxIDUuMTQ2NDkgMTMuNjkxNSA1LjE4NDMzQzEzLjcxNTggNS4yMjIxNyAxMy43Mzk3IDUuMjYwMyAxMy43NjMxIDUuMjk4NzRDMTMuNzg2NSA1LjMzNzE5IDEzLjgwOTQgNS4zNzU5MiAxMy44MzE4IDUuNDE0OTNDMTMuODU0MiA1LjQ1Mzk0IDEzLjg3NjEgNS40OTMyMyAxMy44OTc1IDUuNTMyODFDMTMuOTE4OSA1LjU3MjM4IDEzLjkzOTggNS42MTIyMiAxMy45NjAyIDUuNjUyMzJDMTMuOTgwNiA1LjY5MjQyIDE0LjAwMDUgNS43MzI3NyAxNC4wMTk5IDUuNzczMzdDMTQuMDM5NiA1LjgxNDI2IDE0LjA1ODYgNS44NTU0MyAxNC4wNzcxIDUuODk2ODVDMTQuMDk1NiA1LjkzODI4IDE0LjExMzUgNS45Nzk5NiAxNC4xMzA4IDYuMDIxODlDMTQuMTQ4MSA2LjA2MzgyIDE0LjE2NDggNi4xMDU5OCAxNC4xODEgNi4xNDgzOEMxNC4xOTcxIDYuMTkwNzcgMTQuMjEyNyA2LjIzMzM5IDE0LjIyNzcgNi4yNzYyMkMxNC4yNDI2IDYuMzE5MDYgMTQuMjU2OSA2LjM2MjA5IDE0LjI3MDcgNi40MDUzMkMxNC4yODQ0IDYuNDQ4NTUgMTQuMjk3NSA2LjQ5MTk3IDE0LjMxMDEgNi41MzU1NkMxNC4zMjI1IDYuNTc5MTYgMTQuMzM0NCA2LjYyMjkzIDE0LjM0NTggNi42NjY4N0MxNC4zNTcxIDYuNzEwOCAxNC4zNjc4IDYuNzU0ODggMTQuMzc3OSA2Ljc5OTExQzE0LjM4NzkgNi44NDMzNCAxNC4zOTczIDYuODg3NzEgMTQuNDA2MiA2LjkzMjJDMTQuNDE1IDYuOTc2NyAxNC40MjMyIDcuMDIxMyAxNC40MzA5IDcuMDY2MDNDMTQuNDM4NCA3LjExMDc2IDE0LjQ0NTQgNy4xNTU1OSAxNC40NTE3IDcuMjAwNUMxNC40NTgxIDcuMjQ1NDIgMTQuNDYzNyA3LjI5MDQyIDE0LjQ2ODkgNy4zMzU1QzE0LjQ3MzggNy4zODA1OSAxNC40NzgyIDcuNDI1NzMgMTQuNDgyMSA3LjQ3MDkzQzE0LjQ4NTkgNy41MTYxMyAxNC40ODkgNy41NjEzNyAxNC40OTE2IDcuNjA2NjZDMTQuNDk0MiA3LjY1MTk2IDE0LjQ5NiA3LjY5NzI5IDE0LjQ5NzMgNy43NDI2M0MxNC40OTg2IDcuNzg3OTYgMTQuNDk5MyA3LjgzMzMzIDE0LjQ5OTMgNy44Nzg2OUMxNC40OTkzIDguODM5MzUgMTQuMTMyNiA5LjczNDAyIDEzLjQ2ODYgMTAuMzk3M1pNMTIuMDk3MyA0Ljc2NzM3QzExLjE0MDYgMy45MTQ3MSA5Ljg2MTI5IDMuNDQ0NzEgOC40OTU5NyAzLjQ0NDcxQzguNDE0NDUgMy40NDQyNyA4LjMzMjk4IDMuNDQ1OCA4LjI1MTU1IDMuNDQ5MzFDOC4xNzAxMSAzLjQ1MjgzIDguMDg4ODEgMy40NTgzMiA4LjAwNzYzIDMuNDY1NzlDNy45MjY0NyAzLjQ3MzI2IDcuODQ1NTMgMy40ODI3IDcuNzY0ODIgMy40OTQxMUM3LjY4NDExIDMuNTA1NTEgNy42MDM3MiAzLjUxODg4IDcuNTIzNjcgMy41MzQyQzcuNDQzNjEgMy41NDk1MSA3LjM2Mzk3IDMuNTY2NzcgNy4yODQ3NSAzLjU4NTk2QzcuMjA1NTMgMy42MDUxNSA3LjEyNjgzIDMuNjI2MjYgNy4wNDg2MyAzLjY0OTI4QzYuOTcwNDQgMy42NzIzMSA2Ljg5Mjg1IDMuNjk3MjEgNi44MTU4NyAzLjcyNDAxQzYuNzM4ODkgMy43NTA4MSA2LjY2MjYgMy43Nzk0NiA2LjU4NzAyIDMuODA5OTdDNi41MTE0MyAzLjg0MDQ3IDYuNDM2NjMgMy44NzI3OSA2LjM2MjYxIDMuOTA2OTRDNi4yODg2IDMuOTQxMDkgNi4yMTU0NiAzLjk3NzAyIDYuMTQzMTkgNC4wMTQ3MkM2LjA3MDkyIDQuMDUyNDEgNS45OTk2MSA0LjA5MTg2IDUuOTI5MjcgNC4xMzMwM0M1Ljg1ODkyIDQuMTc0MiA1Ljc4OTYxIDQuMjE3MDYgNS43MjEzNSA0LjI2MTYxQzUuNjUzMDkgNC4zMDYxNSA1LjU4NTk0IDQuMzUyMzIgNS41MTk5MyA0LjQwMDEzQzUuNDUzOTIgNC40NDc5NSA1LjM4OTEgNC40OTczMyA1LjMyNTQ4IDQuNTQ4MjlDNS4yNjE4NiA0LjU5OTI2IDUuMTk5NTMgNC42NTE3NSA1LjEzODQ2IDQuNzA1NzNDNS4wNzc0MSA0Ljc1OTczIDUuMDE3NyA0LjgxNTE5IDQuOTU5MzMgNC44NzIwOEM0LjkwMDk2IDQuOTI4OTggNC44NDQwMiA0Ljk4NzI3IDQuNzg4NDkgNS4wNDY5NEM0LjczMjk2IDUuMTA2NjEgNC42Nzg5MSA1LjE2NzU5IDQuNjI2MzUgNS4yMjk5QzQuNTczNzkgNS4yOTIyIDQuNTIyNzcgNS4zNTU3NCA0LjQ3MzMxIDUuNDIwNTJDNC40MjM4NCA1LjQ4NTMxIDQuMzc1OTcgNS41NTEyNSA0LjMyOTcgNS42MTgzN0M0LjI4MzQ1IDUuNjg1NDggNC4yMzg4NSA1Ljc1MzY3IDQuMTk1OSA1LjgyMjk1QzQuMTUyOTUgNS44OTIyMyA0LjExMTcxIDUuOTYyNTIgNC4wNzIxOCA2LjAzMzgxQzQuMDMyNjYgNi4xMDUwOSAzLjk5NDg5IDYuMTc3MjkgMy45NTg4OCA2LjI1MDQyQzMuOTIyODYgNi4zMjM1NCAzLjg4ODY2IDYuMzk3NSAzLjg1NjIzIDYuNDcyMjlDMy44MjM4MiA2LjU0NzA4IDMuNzkzMjQgNi42MjI2MSAzLjc2NDUgNi42OTg4OEMzLjczNTc2IDYuNzc1MTYgMy43MDg4OSA2Ljg1MjA5IDMuNjgzOSA2LjkyOTY4QzMuNjU4ODkgNy4wMDcyNiAzLjYzNTggNy4wODU0IDMuNjE0NiA3LjE2NDEyQzMuNTkzNCA3LjI0MjgyIDMuNTc0MTMgNy4zMjE5OSAzLjU1Njc5IDcuNDAxNjRDMy41Mzk0NCA3LjQ4MTI5IDMuNTI0MDQgNy41NjEzIDMuNTEwNTkgNy42NDE3QzMuNDk3MTQgNy43MjIwOSAzLjQ4NTY1IDcuODAyNzcgMy40NzYxMiA3Ljg4MzcyQzMuNDY2NTkgNy45NjQ2NyAzLjQ1OTA0IDguMDQ1ODEgMy40NTM0NiA4LjEyNzEzQzMuNDQ3ODggOC4yMDg0NSAzLjQ0NDI4IDguMjg5ODYgMy40NDI2NiA4LjM3MTM1TDMuNDQyNjYgOC42Mjg2OEMzLjQ0NDI4IDguNzEwMTggMy40NDc4OCA4Ljc5MTU5IDMuNDUzNDYgOC44NzI5MUMzLjQ1OTA0IDguOTU0MjMgMy40NjY1OSA5LjAzNTM3IDMuNDc2MTIgOS4xMTYzMkMzLjQ4NTY1IDkuMTk3MjcgMy40OTcxNCA5LjI3Nzk1IDMuNTEwNTkgOS4zNTgzNEMzLjUyNDA0IDkuNDM4NzMgMy41Mzk0NCA5LjUxODc0IDMuNTU2NzkgOS41OTgzOUMzLjU3NDEzIDkuNjc4MDQgMy41OTM0IDkuNzU3MjEgMy42MTQ2IDkuODM1OTJDMy42MzU4IDkuOTE0NjMgMy42NTg4OSA5Ljk5Mjc3IDMuNjgzOSAxMC4wNzA0QzMuNzA4ODkgMTAuMTQ3OSAzLjczNTc2IDEwLjIyNDkgMy43NjQ1IDEwLjMwMTFDMy43OTMyNCAxMC4zNzc0IDMuODIzODIgMTAuNDUzIDMuODU2MjMgMTAuNTI3OEMzLjg4ODY2IDEwLjYwMjUgMy45MjI4NiAxMC42NzY1IDMuOTU4ODggMTAuNzQ5NkMzLjk5NDg5IDEwLjgyMjcgNC4wMzI2NiAxMC44OTQ5IDQuMDcyMTggMTAuOTY2MkM0LjExMTcxIDExLjAzNzUgNC4xNTI5NSAxMS4xMDc4IDQuMTk1OSAxMS4xNzcxQzQuMjM4ODQgMTEuMjQ2NCA0LjI4MzQ0IDExLjMxNDYgNC4zMjk3IDExLjM4MTdDNC4zNzU5NyAxMS40NDg4IDQuNDIzODQgMTEuNTE0NyA0LjQ3MzMxIDExLjU3OTVDNC41MjI3NyAxMS42NDQzIDQuNTczNzkgMTEuNzA3OCA0LjYyNjM1IDExLjc3MDFDNC42Nzg5MSAxMS44MzI0IDQuNzMyOTYgMTEuODkzNCA0Ljc4ODQ5IDExLjk1MzFDNC44NDQwMiAxMi4wMTI4IDQuOTAwOTYgMTIuMDcxMSA0Ljk1OTMzIDEyLjEyOEM1LjAxNzcgMTIuMTg0OSA1LjA3NzQxIDEyLjI0MDMgNS4xMzg0NiAxMi4yOTQzQzUuMTk5NTMgMTIuMzQ4MyA1LjI2MTg2IDEyLjQwMDggNS4zMjU0OCAxMi40NTE3QzUuMzg5MSAxMi41MDI3IDUuNDUzOTIgMTIuNTUyMSA1LjUxOTkzIDEyLjU5OTlDNS41ODU5NCAxMi42NDc3IDUuNjUzMDkgMTIuNjkzOSA1LjcyMTM1IDEyLjczODRDNS43ODk2MSAxMi43ODMgNS44NTg5MiAxMi44MjU4IDUuOTI5MjcgMTIuODY3QzUuOTk5NjEgMTIuOTA4MiA2LjA3MDkyIDEyLjk0NzYgNi4xNDMxOSAxMi45ODUzQzYuMjE1NDYgMTMuMDIzIDYuMjg4NiAxMy4wNTkgNi4zNjI2MSAxMy4wOTMxQzYuNDM2NjMgMTMuMTI3MiA2LjUxMTQzIDEzLjE1OTYgNi41ODcwMiAxMy4xOTAxQzYuNjYyNiAxMy4yMjA2IDYuNzM4ODkgMTMuMjQ5MiA2LjgxNTg3IDEzLjI3NkM2Ljg5Mjg1IDEzLjMwMjggNi45NzA0MyAxMy4zMjc3IDcuMDQ4NjMgMTMuMzUwN0M3LjEyNjgzIDEzLjM3MzggNy4yMDU1MyAxMy4zOTQ5IDcuMjg0NzUgMTMuNDE0MUM3LjM2Mzk3IDEzLjQzMzMgNy40NDM2MSAxMy40NTA1IDcuNTIzNjcgMTMuNDY1OEM3LjYwMzcyIDEzLjQ4MTIgNy42ODQxMSAxMy40OTQ1IDcuNzY0ODIgMTMuNTA1OUM3Ljg0NTUzIDEzLjUxNzMgNy45MjY0NyAxMy41MjY4IDguMDA3NjMgMTMuNTM0MkM4LjA4ODgxIDEzLjU0MTcgOC4xNzAxMSAxMy41NDcyIDguMjUxNTUgMTMuNTUwN0M4LjMzMjk4IDEzLjU1NDIgOC40MTQ0NSAxMy41NTU4IDguNDk1OTcgMTMuNTU1M0M4LjcyNzk2IDEzLjU1NTMgOC45NDcyOSAxMy4zMzY3IDguOTQ3MjkgMTMuMTA0N0M4Ljk0NzI5IDEyLjk1NjcgOC45MTk5NiAxMi45MDMzIDguODQxOTYgMTIuODI1M0w4LjgwODYzIDEyLjc5MTNMOC43NzkyOSAxMi43NDZDOC42NDI2MyAxMi41NDIgOC40NTUzIDEyLjI2MTMgOC40NTUzIDExLjg3NzNDOC40NTUzIDExLjUxODcgOC42MDU5NiAxMS4xNjEzIDguODcwNjIgMTAuODk2N0M4Ljg3ODYzIDEwLjg4ODYgOC44ODY3NCAxMC44ODA2IDguODk0OTQgMTAuODcyOEM4LjkwMzE0IDEwLjg2NDkgOC45MTE0NCAxMC44NTcxIDguOTE5ODMgMTAuODQ5NEM4LjkyODIzIDEwLjg0MTggOC45MzY3MiAxMC44MzQyIDguOTQ1MjkgMTAuODI2N0M4Ljk1Mzg2IDEwLjgxOTMgOC45NjI1NCAxMC44MTE5IDguOTcxMjkgMTAuODA0N0M4Ljk4MDA0IDEwLjc5NzQgOC45ODg4OCAxMC43OTAzIDguOTk3ODEgMTAuNzgzMkM5LjAwNjc0IDEwLjc3NjIgOS4wMTU3NSAxMC43NjkyIDkuMDI0ODQgMTAuNzYyNEM5LjAzMzk1IDEwLjc1NTYgOS4wNDMxMyAxMC43NDg5IDkuMDUyMzggMTAuNzQyM0M5LjA2MTY0IDEwLjczNTcgOS4wNzA5OCAxMC43MjkyIDkuMDgwMzkgMTAuNzIyOUM5LjA4OTgxIDEwLjcxNjUgOS4wOTkzIDEwLjcxMDIgOS4xMDg4OCAxMC43MDQxQzkuMTE4NDUgMTAuNjk4IDkuMTI4MDkgMTAuNjkxOSA5LjEzNzggMTAuNjg2QzkuMTQ3NTIgMTAuNjgwMSA5LjE1NzMxIDEwLjY3NDMgOS4xNjcxNyAxMC42Njg3QzkuMTc3MDIgMTAuNjYzIDkuMTg2OTQgMTAuNjU3NSA5LjE5NjkzIDEwLjY1MkM5LjIwNjkzIDEwLjY0NjYgOS4yMTY5OCAxMC42NDEzIDkuMjI3MSAxMC42MzYxQzkuMjM3MjIgMTAuNjMwOSA5LjI0NzQxIDEwLjYyNTkgOS4yNTc2NSAxMC42MjA5QzkuMjY3ODkgMTAuNjE2IDkuMjc4MTkgMTAuNjExMiA5LjI4ODU1IDEwLjYwNjVDOS4yOTg5MSAxMC42MDE4IDkuMzA5MzMgMTAuNTk3MyA5LjMxOTc5IDEwLjU5MjhDOS4zMzAyNiAxMC41ODg0IDkuMzQwNzggMTAuNTg0MSA5LjM1MTM2IDEwLjU3OTlDOS4zNjE5NSAxMC41NzU4IDkuMzcyNTYgMTAuNTcxNyA5LjM4MzI0IDEwLjU2NzhDOS4zOTM5MSAxMC41NjM5IDkuNDA0NjIgMTAuNTYwMSA5LjQxNTM5IDEwLjU1NjRDOS40MjYxNiAxMC41NTI4IDkuNDM2OTcgMTAuNTQ5MyA5LjQ0NzgyIDEwLjU0NTlDOS40NTg2NyAxMC41NDI1IDkuNDY5NTYgMTAuNTM5MiA5LjQ4MDQ5IDEwLjUzNjFDOS40OTE0MyAxMC41MzMgOS41MDIzOSAxMC41MyA5LjUxMzQgMTAuNTI3MUM5LjUyNDQgMTAuNTI0MiA5LjUzNTQzIDEwLjUyMTUgOS41NDY1IDEwLjUxODlDOS41NTc1OCAxMC41MTYzIDkuNTY4NjggMTAuNTEzOSA5LjU3OTgxIDEwLjUxMTVDOS41OTA5MyAxMC41MDkyIDkuNjAyMDkgMTAuNTA3IDkuNjEzMjggMTAuNTA1QzkuNjI0NDYgMTAuNTAyOSA5LjYzNTY2IDEwLjUwMSA5LjY0Njg5IDEwLjQ5OTJDOS42NTgxMiAxMC40OTc0IDkuNjY5MzcgMTAuNDk1OCA5LjY4MDY0IDEwLjQ5NDNDOS42OTE5IDEwLjQ5MjggOS43MDMxOCAxMC40OTE0IDkuNzE0NDkgMTAuNDkwMkM5LjcyNTggMTAuNDg5IDkuNzM3MTEgMTAuNDg3OSA5Ljc0ODQ0IDEwLjQ4NjlDOS43NTk3NyAxMC40ODU5IDkuNzcxMTEgMTAuNDg1MSA5Ljc4MjQ2IDEwLjQ4NDRDOS43OTM4IDEwLjQ4MzggOS44MDUxNiAxMC40ODMyIDkuODE2NTMgMTAuNDgyOEM5LjgyNzg4IDEwLjQ4MjQgOS44MzkyNSAxMC40ODIxIDkuODUwNjIgMTAuNDgyTDEwLjk1NTMgMTAuNDgyQzEyLjQxNDYgMTAuNDgyIDEzLjU1NTkgOS4zMzkzNSAxMy41NTU5IDcuODgwNjhDMTMuNTUzMyA2LjcwODY5IDEzLjAzNDYgNS42MDQwNCAxMi4wOTczIDQuNzY3MzdaTTExLjkyNzMgOC45MDUzNUMxMS40NjkzIDguOTA1MzUgMTEuMDY2NiA4LjUwNDAxIDExLjA2NjYgOC4wNDQwMkMxMS4wNjY2IDcuNTg2MDMgMTEuNDY3OSA3LjE4MzM2IDExLjkyNzMgNy4xODMzNkMxMi4zODY2IDcuMTgzMzYgMTIuNzg5MyA3LjU4NjAzIDEyLjc4NzkgOC4wNDQwMkMxMi43ODc5IDguNTAyNjggMTIuMzg2NiA4LjkwNTM1IDExLjkyNzMgOC45MDUzNVpNMTAuMjA5OSA2LjYxMDdDOS43NTE5NiA2LjYxMDcgOS4zNDkyOSA2LjIwODcgOS4zNDkyOSA1Ljc0OTM3QzkuMzQ5MjkgNS4yOTEzNyA5Ljc1MDYyIDQuODg4NyAxMC4yMDk5IDQuODg4N0MxMC42NjkzIDQuODg4NyAxMS4wNzE5IDUuMjkxMzcgMTEuMDcwNiA1Ljc0OTM3QzExLjA2NjYgNi4yMTMzNiAxMC42NjkzIDYuNjEwNyAxMC4yMDk5IDYuNjEwN1pNNi44MDU5NyA2LjQyMzM2QzYuNzk1MjcgNi40MTQ0OCA2Ljc4NDc4IDYuNDA1MzQgNi43NzQ1MyA2LjM5NTk1QzYuNzY0MjcgNi4zODY1NyA2Ljc1NDI0IDYuMzc2OTMgNi43NDQ0NSA2LjM2NzA1QzYuNzM0NjUgNi4zNTcxOCA2LjcyNTEgNi4zNDcwNyA2LjcxNTc5IDYuMzM2NzNDNi43MDY0OSA2LjMyNjM5IDYuNjk3NDQgNi4zMTU4MyA2LjY4ODY1IDYuMzA1MDZDNi42Nzk4NSA2LjI5NDI4IDYuNjcxMzMgNi4yODMzIDYuNjYzMDcgNi4yNzIxMUM2LjY1NDgxIDYuMjYwOTIgNi42NDY4MyA2LjI0OTUzIDYuNjM5MTIgNi4yMzc5NkM2LjYzMTQxIDYuMjI2MzggNi42MjM5OCA2LjIxNDYzIDYuNjE2ODQgNi4yMDI2OUM2LjYwOTcgNi4xOTA3NSA2LjYwMjg2IDYuMTc4NjUgNi41OTYzMSA2LjE2NjM4QzYuNTg5NzYgNi4xNTQxMSA2LjU4MzUgNi4xNDE2OSA2LjU3NzU1IDYuMTI5MTJDNi41NzE1OSA2LjExNjU0IDYuNTY1OTUgNi4xMDM4NCA2LjU2MDYxIDYuMDkxQzYuNTU1MjggNi4wNzgxNSA2LjU1MDI1IDYuMDY1MTggNi41NDU1NCA2LjA1MjA5QzYuNTQwODQgNi4wMzkgNi41MzY0NSA2LjAyNTgyIDYuNTMyMzggNi4wMTI1MkM2LjUyODMyIDUuOTk5MjIgNi41MjQ1NyA1Ljk4NTgyIDYuNTIxMTQgNS45NzIzNEM2LjUxNzczIDUuOTU4ODYgNi41MTQ2NCA1Ljk0NTMgNi41MTE4OCA1LjkzMTY3QzYuNTA5MTEgNS45MTgwNCA2LjUwNjY4IDUuOTA0MzQgNi41MDQ1OSA1Ljg5MDU5QzYuNTAyNDkgNS44NzY4NSA2LjUwMDcyIDUuODYzMDYgNi40OTkyOCA1Ljg0OTIyQzYuNDk3ODUgNS44MzUzOCA2LjQ5Njc2IDUuODIxNTIgNi40OTYgNS44MDc2NEM2LjQ5NTIzIDUuNzkzNzUgNi40OTQ4MSA1Ljc3OTg1IDYuNDk0NzIgNS43NjU5NEM2LjQ5NDY0IDUuNzUyMDMgNi40OTQ4OCA1LjczODEyIDYuNDk1NDcgNS43MjQyM0M2LjQ5NjA1IDUuNzEwMzQgNi40OTY5OCA1LjY5NjQ2IDYuNDk4MjUgNS42ODI2MUM2LjQ5OTUgNS42Njg3NiA2LjUwMTA5IDUuNjU0OTQgNi41MDMwMiA1LjY0MTE3QzYuNTA0OTUgNS42Mjc0IDYuNTA3MjEgNS42MTM2OCA2LjUwOTggNS42QzYuNTEyMzkgNS41ODYzNCA2LjUxNTMyIDUuNTcyNzUgNi41MTg1NyA1LjU1OTIyQzYuNTIxODEgNS41NDU3IDYuNTI1NCA1LjUzMjI2IDYuNTI5MyA1LjUxODkxQzYuNTMzMiA1LjUwNTU2IDYuNTM3NDIgNS40OTIzMiA2LjU0MTk3IDUuNDc5MTdDNi41NDY1IDUuNDY2MDIgNi41NTEzNyA1LjQ1Mjk5IDYuNTU2NTUgNS40NDAwOUM2LjU2MTcyIDUuNDI3MTggNi41NjcyIDUuNDE0NCA2LjU3MyA1LjQwMTc2QzYuNTc4NzkgNS4zODkxMSA2LjU4NDg4IDUuMzc2NjEgNi41OTEyOCA1LjM2NDI2QzYuNTk3NjkgNS4zNTE5MiA2LjYwNDM4IDUuMzM5NzMgNi42MTEzNyA1LjMyNzdDNi42MTgzNiA1LjMxNTY3IDYuNjI1NjQgNS4zMDM4MiA2LjYzMzIgNS4yOTIxNUM2LjY0MDc2IDUuMjgwNDggNi42NDg2MSA1LjI2OSA2LjY1NjczIDUuMjU3NzFDNi42NjQ4NSA1LjI0NjQxIDYuNjczMjMgNS4yMzUzMyA2LjY4MTg5IDUuMjI0NDRDNi42OTA1NSA1LjIxMzU1IDYuNjk5NDcgNS4yMDI4OCA2LjcwODY0IDUuMTkyNDNDNi43MTc4MiA1LjE4MTk3IDYuNzI3MjQgNS4xNzE3NCA2LjczNjkxIDUuMTYxNzVDNi43NDY1OCA1LjE1MTc1IDYuNzU2NDggNS4xNDIgNi43NjY2MyA1LjEzMjQ3QzYuNzc2NzcgNS4xMjI5NiA2Ljc4NzE0IDUuMTEzNjkgNi43OTc3MiA1LjEwNDY4QzYuODA4MzEgNS4wOTU2NiA2LjgxOTEyIDUuMDg2OTEgNi44MzAxMyA1LjA3ODQxQzYuODQxMTUgNS4wNjk5MiA2Ljg1MjM2IDUuMDYxNyA2Ljg2Mzc4IDUuMDUzNzVDNi44NzUxOSA1LjA0NTggNi44ODY3OSA1LjAzODE0IDYuODk4NTcgNS4wMzA3NEM2LjkxMDM2IDUuMDIzMzYgNi45MjIzMSA1LjAxNjI2IDYuOTM0NDQgNS4wMDk0NUM2Ljk0NjU3IDUuMDAyNjQgNi45NTg4NiA0Ljk5NjE0IDYuOTcxMzEgNC45ODk5M0M2Ljk4Mzc1IDQuOTgzNyA2Ljk5NjM0IDQuOTc3OCA3LjAwOTA3IDQuOTcyMkM3LjAyMTggNC45NjY1OSA3LjAzNDY2IDQuOTYxMzEgNy4wNDc2NCA0Ljk1NjMzQzcuMDYwNjMgNC45NTEzNSA3LjA3MzczIDQuOTQ2NjggNy4wODY5NSA0Ljk0MjM0QzcuMTAwMTYgNC45Mzc5OSA3LjExMzQ3IDQuOTMzOTcgNy4xMjY4OCA0LjkzMDI3QzcuMTQwMjggNC45MjY1NyA3LjE1Mzc3IDQuOTIzMiA3LjE2NzM0IDQuOTIwMTVDNy4xODA5MSA0LjkxNzA5IDcuMTk0NTUgNC45MTQzOCA3LjIwODI1IDQuOTEyQzcuMjIxOTUgNC45MDk2MiA3LjIzNTcxIDQuOTA3NTUgNy4yNDk1MSA0LjkwNTgzQzcuMjYzMzIgNC45MDQxMSA3LjI3NzE2IDQuOTAyNzMgNy4yOTEwMiA0LjkwMTY4QzcuMzA0ODggNC45MDA2MyA3LjMxODc3IDQuODk5OTEgNy4zMzI2OCA0Ljg5OTU0QzcuMzQ2NTggNC44OTkxNiA3LjM2MDQ4IDQuODk5MTMgNy4zNzQzOSA0Ljg5OTQyQzcuMzg4MyA0Ljg5OTcyIDcuNDAyMTggNC45MDAzNSA3LjQxNjA2IDQuOTAxMzJDNy40Mjk5MyA0LjkwMjI5IDcuNDQzNzcgNC45MDM1OSA3LjQ1NzU5IDQuOTA1MjNDNy40NzE0MSA0LjkwNjg4IDcuNDg1MTYgNC45MDg4NCA3LjQ5ODg5IDQuOTExMTVDNy41MTI2MSA0LjkxMzQ2IDcuNTI2MjYgNC45MTYxIDcuNTM5ODQgNC45MTkwNkM3LjU1MzQzIDQuOTIyMDMgNy41NjY5NCA0LjkyNTMzIDcuNTgwMzcgNC45Mjg5NUM3LjU5MzggNC45MzI1NyA3LjYwNzEzIDQuOTM2NTIgNy42MjAzOCA0Ljk0MDc5QzcuNjMzNjEgNC45NDUwNiA3LjY0NjczIDQuOTQ5NjQgNy42NTk3NSA0Ljk1NDU1QzcuNjcyNzcgNC45NTk0NiA3LjY4NTY2IDQuOTY0NjcgNy42OTg0MiA0Ljk3MDE5QzcuNzExMTggNC45NzU3MiA3LjcyMzggNC45ODE1NiA3LjczNjI5IDQuOTg3N0M3Ljc0ODc3IDQuOTkzODQgNy43NjEwOCA1LjAwMDI3IDcuNzczMjYgNS4wMDcwMUM3Ljc4NTQyIDUuMDEzNzUgNy43OTc0MiA1LjAyMDc4IDcuODA5MjUgNS4wMjgxMUM3LjgyMTA3IDUuMDM1NDIgNy44MzI3MiA1LjA0MzAxIDcuODQ0MTggNS4wNTA5QzcuODU1NjQgNS4wNTg3OSA3Ljg2NjkgNS4wNjY5NCA3Ljg3Nzk2IDUuMDc1MzdMNy44Nzg2MyA1LjA3NjA0QzcuODg5NjYgNS4wODQ4MSA3LjkwMDQ1IDUuMDkzODUgNy45MTEwNCA1LjEwMzE1QzcuOTIxNjIgNS4xMTI0NSA3LjkzMTk1IDUuMTIyMDEgNy45NDIwNyA1LjEzMTgyQzcuOTUyMTcgNS4xNDE2MyA3Ljk2MjAyIDUuMTUxNjggNy45NzE2NCA1LjE2MTk4QzcuOTgxMjcgNS4xNzIyNyA3Ljk5MDYyIDUuMTgyNzkgNy45OTk3MSA1LjE5MzU1QzguMDA4ODIgNS4yMDQzMSA4LjAxNzY0IDUuMjE1MjggOC4wMjYyIDUuMjI2NDdDOC4wMzQ3NSA1LjIzNzY2IDguMDQzMDIgNS4yNDkwNSA4LjA1MTAzIDUuMjYwNjRDOC4wNTkwMyA1LjI3MjIzIDguMDY2NzQgNS4yODQwMiA4LjA3NDE2IDUuMjk2QzguMDgxNTggNS4zMDc5NyA4LjA4ODY5IDUuMzIwMTMgOC4wOTU1MSA1LjMzMjQ0QzguMTAyMzQgNS4zNDQ3NyA4LjEwODg2IDUuMzU3MjUgOC4xMTUwNiA1LjM2OTg5QzguMTIxMjcgNS4zODI1NCA4LjEyNzE2IDUuMzk1MzQgOC4xMzI3NCA1LjQwODI2QzguMTM4MzMgNS40MjEyIDguMTQzNTkgNS40MzQyNyA4LjE0ODUzIDUuNDQ3NDZDOC4xNTM0NiA1LjQ2MDY0IDguMTU4MDggNS40NzM5NiA4LjE2MjM2IDUuNDg3MzhDOC4xNjY2MyA1LjUwMDc5IDguMTcwNTkgNS41MTQzMSA4LjE3NDIyIDUuNTI3OTJDOC4xNzc4NCA1LjU0MTUzIDguMTgxMTIgNS41NTUyMyA4LjE4NDA2IDUuNTY5MDFDOC4xODcwMSA1LjU4Mjc4IDguMTg5NjIgNS41OTY2MiA4LjE5MTg5IDUuNjEwNTJDOC4xOTQxNSA1LjYyNDQzIDguMTk2MDggNS42MzgzNyA4LjE5NzY2IDUuNjUyMzZDOC4xOTkyNSA1LjY2NjM3IDguMjAwNDggNS42ODA0IDguMjAxMzcgNS42OTQ0NUM4LjIwMjI3IDUuNzA4NTEgOC4yMDI4MSA1LjcyMjU4IDguMjAzMDEgNS43MzY2N0M4LjIwMzIxIDUuNzUwNzUgOC4yMDMwNyA1Ljc2NDg0IDguMjAyNTcgNS43Nzg5MUM4LjIwMjA4IDUuNzkyOTkgOC4yMDEyNSA1LjgwNzA1IDguMjAwMDcgNS44MjEwOEM4LjE5ODg4IDUuODM1MTIgOC4xOTczNiA1Ljg0OTEyIDguMTk1NSA1Ljg2MzA4QzguMTkzNjIgNS44NzcwNCA4LjE5MTQxIDUuODkwOTUgOC4xODg4NiA1LjkwNDhDOC4xODYzMSA1LjkxODY2IDguMTgzNDEgNS45MzI0NCA4LjE4MDE4IDUuOTQ2MTVDOC4xNzY5NiA1Ljk1OTg2IDguMTczNCA1Ljk3MzQ4IDguMTY5NDkgNS45ODcwMkM4LjE2NTU5IDYuMDAwNTUgOC4xNjEzNiA2LjAxMzk5IDguMTU2OCA2LjAyNzMyQzguMTUyMjQgNi4wNDA2NCA4LjE0NzM2IDYuMDUzODUgOC4xNDIxNSA2LjA2Njk0QzguMTM2OTQgNi4wODAwMyA4LjEzMTQyIDYuMDkyOTggOC4xMjU1NyA2LjEwNThDOC4xMTk3MiA2LjExODYxIDguMTEzNTcgNi4xMzEyNyA4LjEwNzEgNi4xNDM3OUM4LjEwMDYzIDYuMTU2MzEgOC4wOTM4NiA2LjE2ODY2IDguMDg2NzggNi4xODA4M0M4LjA3OTcxIDYuMTkzMDEgOC4wNzIzNCA2LjIwNTAxIDguMDY0NjggNi4yMTY4M0M4LjA1NzAyIDYuMjI4NjYgOC4wNDkwNyA2LjI0MDI4IDguMDQwODMgNi4yNTE3MUM4LjAzMjU5IDYuMjYzMTMgOC4wMjQwOSA2LjI3NDM2IDguMDE1MyA2LjI4NTM2QzguMDA2NTQgNi4yOTYzOSA3Ljk5NzUyIDYuMzA3MjEgNy45ODgyMyA2LjMxNzhDNy45Nzg5MyA2LjMyODM5IDcuOTY5MzggNi4zMzg3NSA3Ljk1OTU5IDYuMzQ4ODdDNy45NDk3OCA2LjM1ODk5IDcuOTM5NzMgNi4zNjg4NyA3LjkyOTQ2IDYuMzc4NDlDNy45MTkxNyA2LjM4ODExIDcuOTA4NjYgNi4zOTc0OSA3Ljg5NzkxIDYuNDA2NjFDNy44ODcxNiA2LjQxNTcxIDcuODc2MiA2LjQyNDU2IDcuODY1MDIgNi40MzMxM0M3Ljg1Mzg0IDYuNDQxNjkgNy44NDI0NiA2LjQ0OTk5IDcuODMwODcgNi40NThDNy44MTkyOCA2LjQ2NjAyIDcuODA3NSA2LjQ3Mzc0IDcuNzk1NTQgNi40ODExN0M3Ljc4MzU3IDYuNDg4NjEgNy43NzE0MiA2LjQ5NTc1IDcuNzU5MSA2LjUwMjU4QzcuNzQ2NzkgNi41MDk0MSA3LjczNDMyIDYuNTE1OTUgNy43MjE2NyA2LjUyMjE4QzcuNzA5MDMgNi41Mjg0IDcuNjk2MjQgNi41MzQzMiA3LjY4MzMyIDYuNTM5OTFDNy42NzAzOSA2LjU0NTUgNy42NTczMiA2LjU1MDc3IDcuNjQ0MTQgNi41NTU3M0M3LjYzMDk2IDYuNTYwNjggNy42MTc2NCA2LjU2NTMxIDcuNjA0MjMgNi41Njk2MUM3LjU5MDgxIDYuNTczOTEgNy41NzczIDYuNTc3ODggNy41NjM2OSA2LjU4MTUyQzcuNTUwMDkgNi41ODUxNSA3LjUzNjM5IDYuNTg4NDUgNy41MjI2MiA2LjU5MTQxQzcuNTA4ODQgNi41OTQzOCA3LjQ5NSA2LjU5NyA3LjQ4MTEgNi41OTkyOUM3LjQ2NzIgNi42MDE1NyA3LjQ1MzI1IDYuNjAzNSA3LjQzOTI1IDYuNjA1MUM3LjQyNTI1IDYuNjA2NyA3LjQxMTIyIDYuNjA3OTYgNy4zOTcxNyA2LjYwODg2QzcuMzgzMTEgNi42MDk3NiA3LjM2OTAzIDYuNjEwMzIgNy4zNTQ5NSA2LjYxMDU1QzcuMzQwODYgNi42MTA3NyA3LjMyNjc3IDYuNjEwNjQgNy4zMTI2OSA2LjYxMDE2QzcuMjk4NjEgNi42MDk2OCA3LjI4NDU1IDYuNjA4ODYgNy4yNzA1MSA2LjYwNzY5QzcuMjU2NDcgNi42MDY1MyA3LjI0MjQ3IDYuNjA1MDIgNy4yMjg1IDYuNjAzMTVDNy4yMTQ1MyA2LjYwMTMgNy4yMDA2MiA2LjU5OTExIDcuMTg2NzcgNi41OTY1N0M3LjE3MjkxIDYuNTk0MDIgNy4xNTkxMyA2LjU5MTE1IDcuMTQ1NCA2LjU4NzkzQzcuMTMxNjggNi41ODQ3MiA3LjExODA1IDYuNTgxMTcgNy4xMDQ1MiA2LjU3NzI4QzcuMDkwOTggNi41NzM0IDcuMDc3NTQgNi41NjkxOCA3LjA2NDIgNi41NjQ2M0M3LjA1MDg3IDYuNTYwMDkgNy4wMzc2NSA2LjU1NTIxIDcuMDI0NTYgNi41NTAwMkM3LjAxMTQ3IDYuNTQ0ODMgNi45OTg1MSA2LjUzOTMxIDYuOTg1NjggNi41MzM0N0M2Ljk3Mjg2IDYuNTI3NjQgNi45NjAxOSA2LjUyMTUgNi45NDc2NiA2LjUxNTA0QzYuOTM1MTMgNi41MDg1OCA2LjkyMjc4IDYuNTAxODIgNi45MTA1OSA2LjQ5NDc1QzYuODk4MzkgNi40ODc2OSA2Ljg4NjM4IDYuNDgwMzQgNi44NzQ1NiA2LjQ3MjY5QzYuODYyNzMgNi40NjUwNCA2Ljg1MTEgNi40NTcwOSA2LjgzOTY2IDYuNDQ4ODZDNi44MjgyMiA2LjQ0MDY0IDYuODE3IDYuNDMyMTQgNi44MDU5NyA2LjQyMzM2Wk01LjYyNTMyIDguOTA1MzVDNS4xNjczMSA4LjkwNTM1IDQuNzY0NjQgOC41MDQwMSA0Ljc2NDY0IDguMDQ0MDJDNC43NjQ2NCA3LjU4NjAzIDUuMTY1MzIgNy4xODMzNiA1LjYyNTMyIDcuMTgzMzZDNi4wODMzMSA3LjE4MzM2IDYuNDg1OTggNy41ODYwMyA2LjQ4NTk4IDguMDQ0MDJDNi40ODU5OCA4LjUwMjY4IDYuMDg0NjQgOC45MDUzNSA1LjYyNTMyIDguOTA1MzVaIiAgIGZpbGw9IiNFNDQ5NUIiID48L3BhdGg+PC9nPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcC1wYXRoLXVEbXBUYVlCZC1HQWJ2bVU0a1JTbSI+PHBhdGggZD0iTTIuNSAxNC41TDE0LjUgMTQuNUwxNC41IDIuNUwyLjUgMi41TDIuNSAxNC41WiIgZmlsbD0id2hpdGUiLz48L2NsaXBQYXRoPjwvZGVmcz48L3N2Zz4=',
|
|
16
|
+
image2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAGtSURBVFiF7ZbhUcJAEIU/Gf8TKjB2oB3ECtQKCBUoFYgVgBUQKlArgA7ECggVECvQH7vHHeEmCXCMM8qbyVwme7l9t/t27+CE/44zz7cYSIGLwL7mwDuQV026A1bA95GelfpYw41ABCx0zIDZHruswhXwiETgGijKExJlOQ3s2MVUfSTmQ8sxmpznRyRg1l7rq+Wft4EhkrsVMAjN6LzGPkDyZvAEtIF+KAJ1EXjQ8VIfkBINhiYpOCrqUpAhKVg4315q/kl0jJDmU+ApuaYE+sAXNhUZfiGmQNdxXsYMIR5VOesiNTquIeUiRqJT7nZT4FVtvs7aNQscooFUHcRIffcQoXaAG+AeK94USUcldolAit3NYAfSphOuI+DTQIwcGG3gE9ldUbIP9f15RwJ5ldFEwHeCDdUx2F3sc2aMaaCBHFHtm75H2FIcY5Xe24PAFnwEZmyKqAOM1JbqmBHo0GpSBQXSD3pYLUxCOIf6RuQiQ0opJuBlxSWw1DGumD+nQT1XwKxtfG1dyT500uhARz4kiIYKRFve8+FXL6UGMXCLXCJDYknA6jnh7+AHjaWWLLCZ8v4AAAAASUVORK5CYII=',
|
|
14
17
|
italic2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAACtSURBVFiF7ZZhCoMwDIXj2L2Wmy03MzuZ+9NqkBVtXkoY9INSQZv3fDRaosnkz1iJaHMMbhV8DLV7g2fn858yzrzLrI372qnTBdMRtYwUaiHGQDcRe+AVUAMCih9NwIpqhgGLywAKvPuRBBhYG4IQ0H4VJIHafpplgMv869M73ICYa80wYIEMeAn7+XgSYFQURSig/SrLDbEzV4eP1jqXAe9bXtXdST8TTibpfAEImy7CCzNLkwAAAABJRU5ErkJggg==',
|
|
15
18
|
link2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAEGSURBVFiF7VdbDsMgDPOk3Wu52dKTtT3Z9jGYsoiCA1T7qSWEqhLbJDxa4MKfcZvIJQCe5nlPvU7UKEIBvBrtFBMl4dU1/17OEtcKuR87bMLPjCGcaiKTrUEiwW+phqCdcTZ7IbFeQQ9BsAyK+FbSxliaz6aLrbcSApQBL86A3R1NA8q6TBDEDFe5e8QjR67lj7urkLEx9OzlBHFbpqYBlogxK4y4JT5aRJ6I2R2CQKYYA9PXyJ0gytgALIY8goWJUXRcFASnsIMFsRSX4oevWbvIJBCnGDP/hSC2yr34sIEIoaDv86zLRM5IbqV308Qz5EBsqjD7Z6Spf6R+x+dc2EbELwDAGwAuxWOeKuGGAAAAAElFTkSuQmCC',
|
|
16
19
|
menu2: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMWVtIiBoZWlnaHQ9IjFlbSIgdmlld0JveD0iMCAwIDI1NiAyNTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgY2xhc3M9Imxhcmt1aS1pY29uIGxhcmt1aS1pY29uLWRyYWciIHN0eWxlPSJ3aWR0aDogMTZweDsgaGVpZ2h0OiAxNnB4OyI+PHBhdGggZD0iTTg4IDE4N2M5Ljk0MSAwIDE4IDguMDU5IDE4IDE4cy04LjA1OSAxOC0xOCAxOC0xOC04LjA1OS0xOC0xOCA4LjA1OS0xOCAxOC0xOFptODAgMGM5Ljk0MSAwIDE4IDguMDU5IDE4IDE4cy04LjA1OSAxOC0xOCAxOC0xOC04LjA1OS0xOC0xOCA4LjA1OS0xOCAxOC0xOFptLTgwLTc2YzkuOTQxIDAgMTggOC4wNTkgMTggMThzLTguMDU5IDE4LTE4IDE4LTE4LTguMDU5LTE4LTE4IDguMDU5LTE4IDE4LTE4Wm04MCAwYzkuOTQxIDAgMTggOC4wNTkgMTggMThzLTguMDU5IDE4LTE4IDE4LTE4LTguMDU5LTE4LTE4IDguMDU5LTE4IDE4LTE4Wk04OCAzNWM5Ljk0MSAwIDE4IDguMDU5IDE4IDE4cy04LjA1OSAxOC0xOCAxOC0xOC04LjA1OS0xOC0xOCA4LjA1OS0xOCAxOC0xOFptODAgMGM5Ljk0MSAwIDE4IDguMDU5IDE4IDE4cy04LjA1OSAxOC0xOCAxOC0xOC04LjA1OS0xOC0xOCA4LjA1OS0xOCAxOC0xOFoiIGZpbGw9ImN1cnJlbnRDb2xvciIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+PC9zdmc+',
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {ComponentFactory, EditorBody, EditorComponent,
|
|
1
|
+
import {ComponentFactory, EditorBody, EditorComponent, EditorToolbar, EditorFunction} from "./componets";
|
|
2
2
|
import { SelectionUtils } from "./utils";
|
|
3
|
+
import {images} from "./images";
|
|
3
4
|
|
|
4
5
|
export type YangEditorMode = "edit" | "readonly";
|
|
5
6
|
|
|
@@ -8,6 +9,14 @@ export interface YangEditorColor {
|
|
|
8
9
|
name: string;
|
|
9
10
|
}
|
|
10
11
|
|
|
12
|
+
export interface YangEditorMenuItem {
|
|
13
|
+
name: string;
|
|
14
|
+
icon: string;
|
|
15
|
+
className?: string;
|
|
16
|
+
callback?: EditorFunction;
|
|
17
|
+
args?: any
|
|
18
|
+
}
|
|
19
|
+
|
|
11
20
|
export interface YangEditorOptions {
|
|
12
21
|
elem: string;
|
|
13
22
|
width: string;
|
|
@@ -16,6 +25,7 @@ export interface YangEditorOptions {
|
|
|
16
25
|
events: {
|
|
17
26
|
onContentChange?: (html: string) => void,
|
|
18
27
|
},
|
|
28
|
+
menus?: YangEditorMenuItem[],
|
|
19
29
|
components?: {
|
|
20
30
|
foreColorStrip?: {
|
|
21
31
|
colors?: YangEditorColor[]
|
|
@@ -29,6 +39,20 @@ export interface YangEditorOptions {
|
|
|
29
39
|
}
|
|
30
40
|
}
|
|
31
41
|
|
|
42
|
+
const defaultOptions : YangEditorOptions = {
|
|
43
|
+
menus: [
|
|
44
|
+
{ name: "折叠面板", icon: images.collapse2x, className: 'gray', callback: "insertCollapse", args: {className: "gray"} },
|
|
45
|
+
{ name: "图片", icon: images.image2x, args: null },
|
|
46
|
+
{ name: "代码块", icon: images.code2x, args: null },
|
|
47
|
+
],
|
|
48
|
+
components: {},
|
|
49
|
+
elem: "yang-editor",
|
|
50
|
+
events: {},
|
|
51
|
+
width: "100%",
|
|
52
|
+
height: "auto",
|
|
53
|
+
mode: 'edit'
|
|
54
|
+
}
|
|
55
|
+
|
|
32
56
|
export class YangEditor {
|
|
33
57
|
|
|
34
58
|
public readonly element: HTMLElement;
|
|
@@ -36,10 +60,13 @@ export class YangEditor {
|
|
|
36
60
|
public readonly body: EditorBody;
|
|
37
61
|
public readonly selectionUtils: SelectionUtils;
|
|
38
62
|
public readonly componentFactory: ComponentFactory;
|
|
63
|
+
public readonly options: YangEditorOptions;
|
|
39
64
|
|
|
40
65
|
private components: Array<EditorComponent> = new Array<EditorComponent>();
|
|
41
66
|
|
|
42
|
-
constructor(
|
|
67
|
+
constructor(options: YangEditorOptions) {
|
|
68
|
+
this.options = {...defaultOptions, ...options};
|
|
69
|
+
|
|
43
70
|
let element = document.getElementById(options.elem);
|
|
44
71
|
if(element === null ) {
|
|
45
72
|
throw new Error(`Invalid Yang Editor option "${options.elem}"`);
|
package/src/style.css
CHANGED
|
@@ -73,8 +73,24 @@
|
|
|
73
73
|
background-size: contain;
|
|
74
74
|
background-repeat: no-repeat;
|
|
75
75
|
cursor: pointer;
|
|
76
|
+
position: relative;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.yang-editor-button-add .yang-editor-button-add-bridge {
|
|
80
|
+
width: 128px;
|
|
81
|
+
height: 40px;
|
|
82
|
+
position: absolute;
|
|
83
|
+
top: -4px;
|
|
84
|
+
left: -4px;
|
|
85
|
+
display: none;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.yang-editor .yang-editor-button-add:hover .yang-editor-button-add-bridge {
|
|
89
|
+
display: block;
|
|
90
|
+
z-index: 1;
|
|
76
91
|
}
|
|
77
92
|
|
|
93
|
+
|
|
78
94
|
.yang-editor .yang-editor-color-strip {
|
|
79
95
|
padding-left: 19px;
|
|
80
96
|
display: flex;
|
|
@@ -289,3 +305,54 @@
|
|
|
289
305
|
border-radius: 6px;
|
|
290
306
|
}
|
|
291
307
|
|
|
308
|
+
.yang-editor .yang-editor-button-add:hover .yang-editor-component-menu {
|
|
309
|
+
display: block;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.yang-editor .yang-editor-component-menu {
|
|
313
|
+
width: 180px;
|
|
314
|
+
padding: 4px 8px;
|
|
315
|
+
opacity: 1;
|
|
316
|
+
background: rgba(255, 255, 255, 1);
|
|
317
|
+
border: 1px solid rgba(217, 217, 217, 1);
|
|
318
|
+
box-shadow: 1px 1px 5px rgba(217, 217, 217, 0.3);
|
|
319
|
+
border-radius: 6px;
|
|
320
|
+
position: absolute;
|
|
321
|
+
left: 0;
|
|
322
|
+
top: 31px;
|
|
323
|
+
display: none;
|
|
324
|
+
z-index: 1;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
.yang-editor .yang-editor-component-menu-item {
|
|
328
|
+
border-radius: 6px;
|
|
329
|
+
cursor: pointer;
|
|
330
|
+
padding: 8px;
|
|
331
|
+
display: flex;
|
|
332
|
+
align-items: center;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
.yang-editor .yang-editor-component-menu-item:hover {
|
|
336
|
+
background: rgba(239, 240, 240, 1);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
.yang-editor .yang-editor-component-menu-item-icon {
|
|
340
|
+
flex-shrink: 0;
|
|
341
|
+
background: transparent;
|
|
342
|
+
margin-right: 8px;
|
|
343
|
+
background-size: 16px 16px;
|
|
344
|
+
background-repeat: no-repeat;
|
|
345
|
+
background-position: center;
|
|
346
|
+
width: 20px;
|
|
347
|
+
height: 20px;
|
|
348
|
+
cursor: pointer;
|
|
349
|
+
border: none;
|
|
350
|
+
outline: none;
|
|
351
|
+
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
.yang-editor .yang-editor-component-menu-item-text {
|
|
355
|
+
flex-shrink: 1;
|
|
356
|
+
flex-grow: 1;
|
|
357
|
+
text-align: left;
|
|
358
|
+
}
|
package/src/utils.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { ComponentFactory } from "./componets";
|
|
|
2
2
|
|
|
3
3
|
export class SelectionUtils {
|
|
4
4
|
|
|
5
|
-
private element: HTMLElement;
|
|
5
|
+
private readonly element: HTMLElement;
|
|
6
6
|
|
|
7
7
|
constructor(element: HTMLElement) {
|
|
8
8
|
this.element = element;
|
|
@@ -35,4 +35,98 @@ export class SelectionUtils {
|
|
|
35
35
|
}
|
|
36
36
|
return null;
|
|
37
37
|
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* utils for format cleaning
|
|
42
|
+
*/
|
|
43
|
+
export class FormatCleaner {
|
|
44
|
+
|
|
45
|
+
private static unwantedTags = ['style', 'script', 'link', 'meta', 'head', 'title', 'xml'];
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* clean HTML string and return plain text
|
|
49
|
+
* @param htmlString html string
|
|
50
|
+
* @returns plain text
|
|
51
|
+
*/
|
|
52
|
+
static cleanHTMLString(htmlString: string): string {
|
|
53
|
+
// remove Word XML namespace labels
|
|
54
|
+
htmlString = htmlString.replace(/<\/?[ovwm]:[^>]*>/gi, '');
|
|
55
|
+
|
|
56
|
+
// remove Word conditional comments
|
|
57
|
+
htmlString = htmlString.replace(/<!--\[if[\s\S]*?<!\[endif\]-->/gi, '');
|
|
58
|
+
htmlString = htmlString.replace(/<!--[\s\S]*?-->/g, '');
|
|
59
|
+
|
|
60
|
+
const tempDiv = document.createElement('div');
|
|
61
|
+
tempDiv.innerHTML = htmlString;
|
|
62
|
+
|
|
63
|
+
// remove all <style> tags (including @page, @font-face rules)
|
|
64
|
+
const styleTags = tempDiv.querySelectorAll('style');
|
|
65
|
+
styleTags.forEach(style => style.remove());
|
|
66
|
+
|
|
67
|
+
// remove other unwanted tags
|
|
68
|
+
FormatCleaner.unwantedTags.forEach(tag => {
|
|
69
|
+
const elements = tempDiv.querySelectorAll(tag);
|
|
70
|
+
elements.forEach(el => el.remove());
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
return this.extractPlainText(tempDiv);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* extract plain text from node, remove all HTML tags and styles
|
|
78
|
+
* @param node DOM node
|
|
79
|
+
* @returns plain text content
|
|
80
|
+
*/
|
|
81
|
+
static extractPlainText(node: Node): string {
|
|
82
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
83
|
+
return node.textContent || '';
|
|
84
|
+
} else if (node.nodeType === Node.ELEMENT_NODE) {
|
|
85
|
+
const element = node as HTMLElement;
|
|
86
|
+
const tagName = element.tagName.toLowerCase();
|
|
87
|
+
if (FormatCleaner.unwantedTags.includes(tagName)) {
|
|
88
|
+
return '';
|
|
89
|
+
}
|
|
90
|
+
if (tagName === 'br') {
|
|
91
|
+
return '\n';
|
|
92
|
+
}
|
|
93
|
+
// block elements(p、div etc.)
|
|
94
|
+
const isBlock = ['p', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
|
|
95
|
+
'li', 'tr', 'td', 'th', 'blockquote', 'pre'].includes(tagName);
|
|
96
|
+
let result = '';
|
|
97
|
+
for (let child of Array.from(element.childNodes)) {
|
|
98
|
+
result += this.extractPlainText(child);
|
|
99
|
+
}
|
|
100
|
+
if (isBlock && result.trim()) {
|
|
101
|
+
result += '\n';
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
return '';
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* remove all styles and other properties
|
|
110
|
+
* @param element HTML element
|
|
111
|
+
*/
|
|
112
|
+
static removeAllStyles(element: HTMLElement): void {
|
|
113
|
+
// remove style attribute
|
|
114
|
+
element.removeAttribute('style');
|
|
115
|
+
|
|
116
|
+
// remove common format attributes
|
|
117
|
+
const formatAttributes = ['class', 'align', 'valign', 'bgcolor', 'color',
|
|
118
|
+
'face', 'size', 'width', 'height', 'border',
|
|
119
|
+
'cellpadding', 'cellspacing', 'dir'];
|
|
120
|
+
|
|
121
|
+
formatAttributes.forEach(attr => {
|
|
122
|
+
if (element.hasAttribute(attr)) {
|
|
123
|
+
element.removeAttribute(attr);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// recursively process child elements
|
|
128
|
+
for (let child of Array.from(element.children)) {
|
|
129
|
+
this.removeAllStyles(child as HTMLElement);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
38
132
|
}
|