rahad-media-downloader 2.1.8 → 2.1.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. package/.cache/typescript/5.3/node_modules/.package-lock.json +54 -0
  2. package/.cache/typescript/5.3/node_modules/@types/cookie/LICENSE +21 -0
  3. package/.cache/typescript/5.3/node_modules/@types/cookie/README.md +15 -0
  4. package/.cache/typescript/5.3/node_modules/@types/cookie/index.d.ts +154 -0
  5. package/.cache/typescript/5.3/node_modules/@types/cookie/package.json +30 -0
  6. package/.cache/typescript/5.3/node_modules/@types/domhandler/LICENSE +21 -0
  7. package/.cache/typescript/5.3/node_modules/@types/domhandler/README.md +92 -0
  8. package/.cache/typescript/5.3/node_modules/@types/domhandler/index.d.ts +73 -0
  9. package/.cache/typescript/5.3/node_modules/@types/domhandler/package.json +25 -0
  10. package/.cache/typescript/5.3/node_modules/@types/domutils/LICENSE +21 -0
  11. package/.cache/typescript/5.3/node_modules/@types/domutils/README.md +15 -0
  12. package/.cache/typescript/5.3/node_modules/@types/domutils/index.d.ts +124 -0
  13. package/.cache/typescript/5.3/node_modules/@types/domutils/package.json +27 -0
  14. package/.cache/typescript/5.3/node_modules/@types/htmlparser2/LICENSE +21 -0
  15. package/.cache/typescript/5.3/node_modules/@types/htmlparser2/README.md +15 -0
  16. package/.cache/typescript/5.3/node_modules/@types/htmlparser2/index.d.ts +120 -0
  17. package/.cache/typescript/5.3/node_modules/@types/htmlparser2/package.json +45 -0
  18. package/.cache/typescript/5.3/node_modules/@types/psl/LICENSE +21 -0
  19. package/.cache/typescript/5.3/node_modules/@types/psl/README.md +52 -0
  20. package/.cache/typescript/5.3/node_modules/@types/psl/index.d.ts +33 -0
  21. package/.cache/typescript/5.3/node_modules/@types/psl/package.json +25 -0
  22. package/.cache/typescript/5.3/node_modules/domelementtype/LICENSE +11 -0
  23. package/.cache/typescript/5.3/node_modules/domelementtype/index.js +15 -0
  24. package/.cache/typescript/5.3/node_modules/domelementtype/package.json +16 -0
  25. package/.cache/typescript/5.3/node_modules/domelementtype/readme.md +1 -0
  26. package/.cache/typescript/5.3/node_modules/domhandler/.travis.yml +6 -0
  27. package/.cache/typescript/5.3/node_modules/domhandler/LICENSE +11 -0
  28. package/.cache/typescript/5.3/node_modules/domhandler/index.js +217 -0
  29. package/.cache/typescript/5.3/node_modules/domhandler/lib/element.js +20 -0
  30. package/.cache/typescript/5.3/node_modules/domhandler/lib/node.js +44 -0
  31. package/.cache/typescript/5.3/node_modules/domhandler/package.json +41 -0
  32. package/.cache/typescript/5.3/node_modules/domhandler/readme.md +116 -0
  33. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/01-basic.json +57 -0
  34. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/02-single_tag_1.json +21 -0
  35. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/03-single_tag_2.json +21 -0
  36. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/04-unescaped_in_script.json +27 -0
  37. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/05-tags_in_comment.json +18 -0
  38. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/06-comment_in_script.json +18 -0
  39. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/07-unescaped_in_style.json +20 -0
  40. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/08-extra_spaces_in_tag.json +20 -0
  41. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/09-unquoted_attrib.json +20 -0
  42. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/10-singular_attribute.json +15 -0
  43. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/11-text_outside_tags.json +40 -0
  44. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/12-text_only.json +11 -0
  45. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/13-comment_in_text.json +19 -0
  46. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/14-comment_in_text_in_script.json +18 -0
  47. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/15-non-verbose.json +22 -0
  48. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/16-normalize_whitespace.json +47 -0
  49. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/17-xml_namespace.json +18 -0
  50. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/18-enforce_empty_tags.json +16 -0
  51. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/19-ignore_empty_tags.json +20 -0
  52. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/20-template_script_tags.json +20 -0
  53. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/21-conditional_comments.json +15 -0
  54. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/22-lowercase_tags.json +41 -0
  55. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/23-dom-lvl1.json +131 -0
  56. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/24-with-start-indices.json +85 -0
  57. package/.cache/typescript/5.3/node_modules/domhandler/test/cases/25-with-end-indices.json +86 -0
  58. package/.cache/typescript/5.3/node_modules/domhandler/test/tests.js +60 -0
  59. package/.cache/typescript/5.3/package-lock.json +57 -0
  60. package/.cache/typescript/5.3/package.json +1 -1
  61. package/README.md +103 -18
  62. package/index.js +1 -1
  63. package/package.json +4 -3
  64. package/test.js +0 -35
@@ -0,0 +1,44 @@
1
+ // This object will be used as the prototype for Nodes when creating a
2
+ // DOM-Level-1-compliant structure.
3
+ var NodePrototype = module.exports = {
4
+ get firstChild() {
5
+ var children = this.children;
6
+ return children && children[0] || null;
7
+ },
8
+ get lastChild() {
9
+ var children = this.children;
10
+ return children && children[children.length - 1] || null;
11
+ },
12
+ get nodeType() {
13
+ return nodeTypes[this.type] || nodeTypes.element;
14
+ }
15
+ };
16
+
17
+ var domLvl1 = {
18
+ tagName: "name",
19
+ childNodes: "children",
20
+ parentNode: "parent",
21
+ previousSibling: "prev",
22
+ nextSibling: "next",
23
+ nodeValue: "data"
24
+ };
25
+
26
+ var nodeTypes = {
27
+ element: 1,
28
+ text: 3,
29
+ cdata: 4,
30
+ comment: 8
31
+ };
32
+
33
+ Object.keys(domLvl1).forEach(function(key) {
34
+ var shorthand = domLvl1[key];
35
+ Object.defineProperty(NodePrototype, key, {
36
+ get: function() {
37
+ return this[shorthand] || null;
38
+ },
39
+ set: function(val) {
40
+ this[shorthand] = val;
41
+ return val;
42
+ }
43
+ });
44
+ });
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "domhandler",
3
+ "version": "2.4.2",
4
+ "description": "handler for htmlparser2 that turns pages into a dom",
5
+ "main": "index.js",
6
+ "directories": {
7
+ "test": "tests"
8
+ },
9
+ "scripts": {
10
+ "test": "mocha -R list && jshint index.js test/"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git://github.com/fb55/DomHandler.git"
15
+ },
16
+ "keywords": [
17
+ "dom",
18
+ "htmlparser2"
19
+ ],
20
+ "dependencies": {
21
+ "domelementtype": "1"
22
+ },
23
+ "devDependencies": {
24
+ "htmlparser2": "^3.9.0",
25
+ "mocha": "^3.0.2",
26
+ "jshint": "^2.9.1"
27
+ },
28
+ "author": "Felix Boehm <me@feedic.com>",
29
+ "license": "BSD-2-Clause",
30
+ "jshintConfig": {
31
+ "quotmark": "double",
32
+ "trailing": true,
33
+ "unused": true,
34
+ "undef": true,
35
+ "node": true,
36
+ "proto": true,
37
+ "globals": {
38
+ "it": true
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,116 @@
1
+ # domhandler [![Build Status](https://travis-ci.org/fb55/domhandler.svg?branch=master)](https://travis-ci.org/fb55/domhandler)
2
+
3
+ The DOM handler (formally known as DefaultHandler) creates a tree containing all nodes of a page. The tree may be manipulated using the [domutils](https://github.com/fb55/domutils) library.
4
+
5
+ ## Usage
6
+ ```javascript
7
+ var handler = new DomHandler([ <func> callback(err, dom), ] [ <obj> options ]);
8
+ // var parser = new Parser(handler[, options]);
9
+ ```
10
+
11
+ Available options are described below.
12
+
13
+ ## Example
14
+ ```javascript
15
+ var htmlparser = require("htmlparser2");
16
+ var rawHtml = "Xyz <script language= javascript>var foo = '<<bar>>';< / script><!--<!-- Waah! -- -->";
17
+ var handler = new htmlparser.DomHandler(function (error, dom) {
18
+ if (error)
19
+ [...do something for errors...]
20
+ else
21
+ [...parsing done, do something...]
22
+ console.log(dom);
23
+ });
24
+ var parser = new htmlparser.Parser(handler);
25
+ parser.write(rawHtml);
26
+ parser.end();
27
+ ```
28
+
29
+ Output:
30
+
31
+ ```javascript
32
+ [{
33
+ data: 'Xyz ',
34
+ type: 'text'
35
+ }, {
36
+ type: 'script',
37
+ name: 'script',
38
+ attribs: {
39
+ language: 'javascript'
40
+ },
41
+ children: [{
42
+ data: 'var foo = \'<bar>\';<',
43
+ type: 'text'
44
+ }]
45
+ }, {
46
+ data: '<!-- Waah! -- ',
47
+ type: 'comment'
48
+ }]
49
+ ```
50
+
51
+ ## Option: normalizeWhitespace
52
+ Indicates whether the whitespace in text nodes should be normalized (= all whitespace should be replaced with single spaces). The default value is "false".
53
+
54
+ The following HTML will be used:
55
+
56
+ ```html
57
+ <font>
58
+ <br>this is the text
59
+ <font>
60
+ ```
61
+
62
+ ### Example: true
63
+
64
+ ```javascript
65
+ [{
66
+ type: 'tag',
67
+ name: 'font',
68
+ children: [{
69
+ data: ' ',
70
+ type: 'text'
71
+ }, {
72
+ type: 'tag',
73
+ name: 'br'
74
+ }, {
75
+ data: 'this is the text ',
76
+ type: 'text'
77
+ }, {
78
+ type: 'tag',
79
+ name: 'font'
80
+ }]
81
+ }]
82
+ ```
83
+
84
+ ### Example: false
85
+
86
+ ```javascript
87
+ [{
88
+ type: 'tag',
89
+ name: 'font',
90
+ children: [{
91
+ data: '\n\t',
92
+ type: 'text'
93
+ }, {
94
+ type: 'tag',
95
+ name: 'br'
96
+ }, {
97
+ data: 'this is the text\n',
98
+ type: 'text'
99
+ }, {
100
+ type: 'tag',
101
+ name: 'font'
102
+ }]
103
+ }]
104
+ ```
105
+
106
+ ## Option: withDomLvl1
107
+
108
+ Adds DOM level 1 properties to all elements.
109
+
110
+ <!-- TODO: description -->
111
+
112
+ ## Option: withStartIndices
113
+ Indicates whether a `startIndex` property will be added to nodes. When the parser is used in a non-streaming fashion, `startIndex` is an integer indicating the position of the start of the node in the document. The default value is "false".
114
+
115
+ ## Option: withEndIndices
116
+ Indicates whether a `endIndex` property will be added to nodes. When the parser is used in a non-streaming fashion, `endIndex` is an integer indicating the position of the end of the node in the document. The default value is "false".
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "Basic test",
3
+ "options": {},
4
+ "html": "<!DOCTYPE html><html><title>The Title</title><body>Hello world</body></html>",
5
+ "expected": [
6
+ {
7
+ "name": "!doctype",
8
+ "data": "!DOCTYPE html",
9
+ "type": "directive"
10
+ },
11
+ {
12
+ "type": "tag",
13
+ "name": "html",
14
+ "attribs": {},
15
+ "parent": null,
16
+ "children": [
17
+ {
18
+ "type": "tag",
19
+ "name": "title",
20
+ "attribs": {},
21
+ "parent": {
22
+ "type": "tag",
23
+ "name": "html",
24
+ "attribs": {}
25
+ },
26
+ "children": [
27
+ {
28
+ "data": "The Title",
29
+ "type": "text",
30
+ "parent": {
31
+ "type": "tag",
32
+ "name": "title",
33
+ "attribs": {}
34
+ }
35
+ }
36
+ ]
37
+ },
38
+ {
39
+ "type": "tag",
40
+ "name": "body",
41
+ "attribs": {},
42
+ "children": [
43
+ {
44
+ "data": "Hello world",
45
+ "type": "text"
46
+ }
47
+ ],
48
+ "prev": {
49
+ "type": "tag",
50
+ "name": "title",
51
+ "attribs": {}
52
+ }
53
+ }
54
+ ]
55
+ }
56
+ ]
57
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "Single Tag 1",
3
+ "options": {},
4
+ "html": "<br>text</br>",
5
+ "expected": [
6
+ {
7
+ "type": "tag",
8
+ "name": "br",
9
+ "attribs": {}
10
+ },
11
+ {
12
+ "data": "text",
13
+ "type": "text"
14
+ },
15
+ {
16
+ "type": "tag",
17
+ "name": "br",
18
+ "attribs": {}
19
+ }
20
+ ]
21
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "Single Tag 2",
3
+ "options": {},
4
+ "html": "<br>text<br>",
5
+ "expected": [
6
+ {
7
+ "type": "tag",
8
+ "name": "br",
9
+ "attribs": {}
10
+ },
11
+ {
12
+ "data": "text",
13
+ "type": "text"
14
+ },
15
+ {
16
+ "type": "tag",
17
+ "name": "br",
18
+ "attribs": {}
19
+ }
20
+ ]
21
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "Unescaped chars in script",
3
+ "options": {},
4
+ "html": "<head><script language=\"Javascript\">var foo = \"<bar>\"; alert(2 > foo); var baz = 10 << 2; var zip = 10 >> 1; var yap = \"<<>>>><<\";</script></head>",
5
+ "expected": [
6
+ {
7
+ "type": "tag",
8
+ "name": "head",
9
+ "attribs": {},
10
+ "children": [
11
+ {
12
+ "type": "script",
13
+ "name": "script",
14
+ "attribs": {
15
+ "language": "Javascript"
16
+ },
17
+ "children": [
18
+ {
19
+ "data": "var foo = \"<bar>\"; alert(2 > foo); var baz = 10 << 2; var zip = 10 >> 1; var yap = \"<<>>>><<\";",
20
+ "type": "text"
21
+ }
22
+ ]
23
+ }
24
+ ]
25
+ }
26
+ ]
27
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "Special char in comment",
3
+ "options": {},
4
+ "html": "<head><!-- commented out tags <title>Test</title>--></head>",
5
+ "expected": [
6
+ {
7
+ "type": "tag",
8
+ "name": "head",
9
+ "attribs": {},
10
+ "children": [
11
+ {
12
+ "data": " commented out tags <title>Test</title>",
13
+ "type": "comment"
14
+ }
15
+ ]
16
+ }
17
+ ]
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "Script source in comment",
3
+ "options": {},
4
+ "html": "<script><!--var foo = 1;--></script>",
5
+ "expected": [
6
+ {
7
+ "type": "script",
8
+ "name": "script",
9
+ "attribs": {},
10
+ "children": [
11
+ {
12
+ "data": "<!--var foo = 1;-->",
13
+ "type": "text"
14
+ }
15
+ ]
16
+ }
17
+ ]
18
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "Unescaped chars in style",
3
+ "options": {},
4
+ "html": "<style type=\"text/css\">\n body > p\n\t{ font-weight: bold; }</style>",
5
+ "expected": [
6
+ {
7
+ "type": "style",
8
+ "name": "style",
9
+ "attribs": {
10
+ "type": "text/css"
11
+ },
12
+ "children": [
13
+ {
14
+ "data": "\n body > p\n\t{ font-weight: bold; }",
15
+ "type": "text"
16
+ }
17
+ ]
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "Extra spaces in tag",
3
+ "options": {},
4
+ "html": "<font\t\n size='14' \n>the text</\t\nfont\t \n>",
5
+ "expected": [
6
+ {
7
+ "type": "tag",
8
+ "name": "font",
9
+ "attribs": {
10
+ "size": "14"
11
+ },
12
+ "children": [
13
+ {
14
+ "data": "the text",
15
+ "type": "text"
16
+ }
17
+ ]
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "Unquoted attributes",
3
+ "options": {},
4
+ "html": "<font size= 14>the text</font>",
5
+ "expected": [
6
+ {
7
+ "type": "tag",
8
+ "name": "font",
9
+ "attribs": {
10
+ "size": "14"
11
+ },
12
+ "children": [
13
+ {
14
+ "data": "the text",
15
+ "type": "text"
16
+ }
17
+ ]
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "Singular attribute",
3
+ "options": {},
4
+ "html": "<option value='foo' selected>",
5
+ "expected": [
6
+ {
7
+ "type": "tag",
8
+ "name": "option",
9
+ "attribs": {
10
+ "value": "foo",
11
+ "selected": ""
12
+ }
13
+ }
14
+ ]
15
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "Text outside tags",
3
+ "options": {},
4
+ "html": "Line one\n<br>\nline two",
5
+ "expected": [
6
+ {
7
+ "data": "Line one\n",
8
+ "type": "text",
9
+ "prev": null,
10
+ "next": {
11
+ "type": "tag",
12
+ "name": "br",
13
+ "attribs": {}
14
+ }
15
+ },
16
+ {
17
+ "type": "tag",
18
+ "name": "br",
19
+ "attribs": {},
20
+ "prev": {
21
+ "data": "Line one\n",
22
+ "type": "text"
23
+ },
24
+ "next": {
25
+ "data": "\nline two",
26
+ "type": "text"
27
+ }
28
+ },
29
+ {
30
+ "data": "\nline two",
31
+ "type": "text",
32
+ "prev": {
33
+ "type": "tag",
34
+ "name": "br",
35
+ "attribs": {}
36
+ },
37
+ "next": null
38
+ }
39
+ ]
40
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "Only text",
3
+ "options": {},
4
+ "html": "this is the text",
5
+ "expected": [
6
+ {
7
+ "data": "this is the text",
8
+ "type": "text"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "Comment within text",
3
+ "options": {},
4
+ "html": "this is <!-- the comment --> the text",
5
+ "expected": [
6
+ {
7
+ "data": "this is ",
8
+ "type": "text"
9
+ },
10
+ {
11
+ "data": " the comment ",
12
+ "type": "comment"
13
+ },
14
+ {
15
+ "data": " the text",
16
+ "type": "text"
17
+ }
18
+ ]
19
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "Comment within text within script",
3
+ "options": {},
4
+ "html": "<script>this is <!-- the comment --> the text</script>",
5
+ "expected": [
6
+ {
7
+ "type": "script",
8
+ "name": "script",
9
+ "attribs": {},
10
+ "children": [
11
+ {
12
+ "data": "this is <!-- the comment --> the text",
13
+ "type": "text"
14
+ }
15
+ ]
16
+ }
17
+ ]
18
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "Option 'verbose' set to 'false'",
3
+ "options": {
4
+ "verbose": false
5
+ },
6
+ "html": "<font\t\n size='14' \n>the text</\t\nfont\t \n>",
7
+ "expected": [
8
+ {
9
+ "type": "tag",
10
+ "name": "font",
11
+ "attribs": {
12
+ "size": "14"
13
+ },
14
+ "children": [
15
+ {
16
+ "data": "the text",
17
+ "type": "text"
18
+ }
19
+ ]
20
+ }
21
+ ]
22
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "Normalize whitespace",
3
+ "options": {
4
+ "normalizeWhitespace": true
5
+ },
6
+ "html": "Line one\n<br>\t \r\n\f <br>\nline two<font><br> x </font>",
7
+ "expected": [
8
+ {
9
+ "data": "Line one ",
10
+ "type": "text"
11
+ },
12
+ {
13
+ "type": "tag",
14
+ "name": "br",
15
+ "attribs": {}
16
+ },
17
+ {
18
+ "data": " ",
19
+ "type": "text"
20
+ },
21
+ {
22
+ "type": "tag",
23
+ "name": "br",
24
+ "attribs": {}
25
+ },
26
+ {
27
+ "data": " line two",
28
+ "type": "text"
29
+ },
30
+ {
31
+ "type": "tag",
32
+ "name": "font",
33
+ "attribs": {},
34
+ "children": [
35
+ {
36
+ "type": "tag",
37
+ "name": "br",
38
+ "attribs": {}
39
+ },
40
+ {
41
+ "data": " x ",
42
+ "type": "text"
43
+ }
44
+ ]
45
+ }
46
+ ]
47
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "XML Namespace",
3
+ "options": {},
4
+ "html": "<ns:tag>text</ns:tag>",
5
+ "expected": [
6
+ {
7
+ "type": "tag",
8
+ "name": "ns:tag",
9
+ "attribs": {},
10
+ "children": [
11
+ {
12
+ "data": "text",
13
+ "type": "text"
14
+ }
15
+ ]
16
+ }
17
+ ]
18
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "Enforce empty tags",
3
+ "options": {},
4
+ "html": "<link>text</link>",
5
+ "expected": [
6
+ {
7
+ "type": "tag",
8
+ "name": "link",
9
+ "attribs": {}
10
+ },
11
+ {
12
+ "data": "text",
13
+ "type": "text"
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "Ignore empty tags (xml mode)",
3
+ "options": {
4
+ "xmlMode": true
5
+ },
6
+ "html": "<link>text</link>",
7
+ "expected": [
8
+ {
9
+ "type": "tag",
10
+ "name": "link",
11
+ "attribs": {},
12
+ "children": [
13
+ {
14
+ "data": "text",
15
+ "type": "text"
16
+ }
17
+ ]
18
+ }
19
+ ]
20
+ }