node-red-contrib-web-worldmap 2.29.0 → 2.30.1
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/.github/FUNDING.yml +13 -0
- package/CHANGELOG.md +5 -2
- package/README.md +3 -0
- package/node_modules/array-flatten/package.json +6 -9
- package/node_modules/body-parser/HISTORY.md +18 -0
- package/node_modules/body-parser/README.md +9 -1
- package/node_modules/body-parser/SECURITY.md +25 -0
- package/node_modules/body-parser/lib/read.js +26 -2
- package/node_modules/body-parser/lib/types/json.js +10 -4
- package/node_modules/body-parser/package.json +24 -20
- package/node_modules/call-bind/.eslintignore +1 -0
- package/node_modules/call-bind/.eslintrc +17 -0
- package/node_modules/call-bind/.github/FUNDING.yml +12 -0
- package/node_modules/call-bind/.nycrc +13 -0
- package/node_modules/call-bind/CHANGELOG.md +42 -0
- package/node_modules/call-bind/LICENSE +21 -0
- package/node_modules/call-bind/README.md +2 -0
- package/node_modules/call-bind/callBound.js +15 -0
- package/node_modules/call-bind/index.js +47 -0
- package/node_modules/call-bind/package.json +108 -0
- package/node_modules/call-bind/test/callBound.js +55 -0
- package/node_modules/call-bind/test/index.js +66 -0
- package/node_modules/cookie/HISTORY.md +8 -0
- package/node_modules/cookie/README.md +50 -34
- package/node_modules/cookie/SECURITY.md +25 -0
- package/node_modules/cookie/index.js +83 -15
- package/node_modules/cookie/package.json +17 -15
- package/node_modules/cookie-signature/package.json +6 -9
- package/node_modules/depd/History.md +7 -0
- package/node_modules/depd/LICENSE +1 -1
- package/node_modules/depd/Readme.md +8 -8
- package/node_modules/depd/index.js +29 -13
- package/node_modules/depd/package.json +25 -24
- package/node_modules/destroy/LICENSE +1 -0
- package/node_modules/destroy/README.md +15 -12
- package/node_modules/destroy/index.js +147 -13
- package/node_modules/destroy/package.json +29 -20
- package/node_modules/ee-first/package.json +6 -9
- package/node_modules/encodeurl/package.json +11 -14
- package/node_modules/escape-html/package.json +11 -14
- package/node_modules/etag/package.json +11 -14
- package/node_modules/express/History.md +54 -0
- package/node_modules/express/Readme.md +39 -31
- package/node_modules/express/lib/application.js +18 -1
- package/node_modules/express/lib/response.js +40 -18
- package/node_modules/express/lib/router/index.js +20 -15
- package/node_modules/express/lib/router/route.js +9 -0
- package/node_modules/express/lib/utils.js +1 -0
- package/node_modules/express/lib/view.js +1 -1
- package/node_modules/express/package.json +25 -26
- package/node_modules/finalhandler/HISTORY.md +8 -0
- package/node_modules/finalhandler/LICENSE +1 -1
- package/node_modules/finalhandler/README.md +5 -6
- package/node_modules/finalhandler/SECURITY.md +25 -0
- package/node_modules/finalhandler/index.js +8 -3
- package/node_modules/finalhandler/package.json +30 -32
- package/node_modules/fresh/package.json +6 -9
- package/node_modules/function-bind/.editorconfig +20 -0
- package/node_modules/function-bind/.eslintrc +15 -0
- package/node_modules/function-bind/.jscs.json +176 -0
- package/node_modules/function-bind/.npmignore +22 -0
- package/node_modules/function-bind/.travis.yml +168 -0
- package/node_modules/function-bind/LICENSE +20 -0
- package/node_modules/function-bind/README.md +48 -0
- package/node_modules/function-bind/implementation.js +52 -0
- package/node_modules/function-bind/index.js +5 -0
- package/node_modules/function-bind/package.json +96 -0
- package/node_modules/function-bind/test/.eslintrc +9 -0
- package/node_modules/function-bind/test/index.js +252 -0
- package/node_modules/get-intrinsic/.eslintrc +37 -0
- package/node_modules/get-intrinsic/.github/FUNDING.yml +12 -0
- package/node_modules/get-intrinsic/.nycrc +9 -0
- package/node_modules/get-intrinsic/CHANGELOG.md +98 -0
- package/node_modules/get-intrinsic/LICENSE +21 -0
- package/node_modules/get-intrinsic/README.md +71 -0
- package/node_modules/get-intrinsic/index.js +334 -0
- package/node_modules/get-intrinsic/package.json +120 -0
- package/node_modules/get-intrinsic/test/GetIntrinsic.js +274 -0
- package/node_modules/has/LICENSE-MIT +22 -0
- package/node_modules/has/README.md +18 -0
- package/node_modules/has/package.json +73 -0
- package/node_modules/has/src/index.js +5 -0
- package/node_modules/has/test/index.js +10 -0
- package/node_modules/has-symbols/.eslintrc +11 -0
- package/node_modules/has-symbols/.github/FUNDING.yml +12 -0
- package/node_modules/has-symbols/.nycrc +9 -0
- package/node_modules/has-symbols/CHANGELOG.md +75 -0
- package/node_modules/has-symbols/LICENSE +21 -0
- package/node_modules/has-symbols/README.md +46 -0
- package/node_modules/has-symbols/index.js +13 -0
- package/node_modules/has-symbols/package.json +126 -0
- package/node_modules/has-symbols/shams.js +42 -0
- package/node_modules/has-symbols/test/index.js +22 -0
- package/node_modules/has-symbols/test/shams/core-js.js +28 -0
- package/node_modules/has-symbols/test/shams/get-own-property-symbols.js +28 -0
- package/node_modules/has-symbols/test/tests.js +56 -0
- package/node_modules/http-errors/HISTORY.md +15 -0
- package/node_modules/http-errors/README.md +2 -2
- package/node_modules/http-errors/index.js +15 -25
- package/node_modules/http-errors/package.json +22 -20
- package/node_modules/media-typer/package.json +6 -9
- package/node_modules/merge-descriptors/package.json +6 -9
- package/node_modules/methods/package.json +11 -14
- package/node_modules/object-inspect/.eslintrc +53 -0
- package/node_modules/object-inspect/.github/FUNDING.yml +12 -0
- package/node_modules/object-inspect/.nycrc +13 -0
- package/node_modules/object-inspect/CHANGELOG.md +360 -0
- package/node_modules/object-inspect/LICENSE +21 -0
- package/node_modules/object-inspect/example/all.js +23 -0
- package/node_modules/object-inspect/example/circular.js +6 -0
- package/node_modules/object-inspect/example/fn.js +5 -0
- package/node_modules/object-inspect/example/inspect.js +10 -0
- package/node_modules/object-inspect/index.js +512 -0
- package/node_modules/object-inspect/package-support.json +20 -0
- package/node_modules/object-inspect/package.json +122 -0
- package/node_modules/object-inspect/readme.markdown +86 -0
- package/node_modules/object-inspect/test/bigint.js +58 -0
- package/node_modules/object-inspect/test/browser/dom.js +15 -0
- package/node_modules/object-inspect/test/circular.js +16 -0
- package/node_modules/object-inspect/test/deep.js +12 -0
- package/node_modules/object-inspect/test/element.js +53 -0
- package/node_modules/object-inspect/test/err.js +48 -0
- package/node_modules/object-inspect/test/fakes.js +29 -0
- package/node_modules/object-inspect/test/fn.js +76 -0
- package/node_modules/object-inspect/test/has.js +15 -0
- package/node_modules/object-inspect/test/holes.js +15 -0
- package/node_modules/object-inspect/test/indent-option.js +271 -0
- package/node_modules/object-inspect/test/inspect.js +139 -0
- package/node_modules/object-inspect/test/lowbyte.js +12 -0
- package/node_modules/object-inspect/test/number.js +58 -0
- package/node_modules/object-inspect/test/quoteStyle.js +17 -0
- package/node_modules/object-inspect/test/toStringTag.js +40 -0
- package/node_modules/object-inspect/test/undef.js +12 -0
- package/node_modules/object-inspect/test/values.js +211 -0
- package/node_modules/object-inspect/test-core-js.js +26 -0
- package/node_modules/object-inspect/util.inspect.js +1 -0
- package/node_modules/on-finished/HISTORY.md +10 -0
- package/node_modules/on-finished/README.md +28 -20
- package/node_modules/on-finished/index.js +51 -13
- package/node_modules/on-finished/package.json +25 -20
- package/node_modules/path-to-regexp/package.json +6 -9
- package/node_modules/qs/CHANGELOG.md +22 -5
- package/node_modules/qs/README.md +7 -0
- package/node_modules/qs/dist/qs.js +1207 -5
- package/node_modules/qs/lib/parse.js +6 -0
- package/node_modules/qs/lib/stringify.js +33 -3
- package/node_modules/qs/package.json +16 -13
- package/node_modules/qs/test/parse.js +9 -0
- package/node_modules/qs/test/stringify.js +62 -1
- package/node_modules/raw-body/HISTORY.md +14 -0
- package/node_modules/raw-body/LICENSE +1 -1
- package/node_modules/raw-body/README.md +4 -0
- package/node_modules/raw-body/SECURITY.md +24 -0
- package/node_modules/raw-body/index.js +45 -2
- package/node_modules/raw-body/package.json +16 -15
- package/node_modules/send/HISTORY.md +15 -0
- package/node_modules/send/LICENSE +1 -1
- package/node_modules/send/README.md +2 -2
- package/node_modules/send/SECURITY.md +24 -0
- package/node_modules/send/index.js +37 -27
- package/node_modules/send/package.json +22 -21
- package/node_modules/serve-static/HISTORY.md +12 -0
- package/node_modules/serve-static/README.md +1 -1
- package/node_modules/serve-static/package.json +16 -16
- package/node_modules/side-channel/.eslintignore +1 -0
- package/node_modules/side-channel/.eslintrc +11 -0
- package/node_modules/side-channel/.github/FUNDING.yml +12 -0
- package/node_modules/side-channel/.nycrc +13 -0
- package/node_modules/side-channel/CHANGELOG.md +65 -0
- package/node_modules/side-channel/LICENSE +21 -0
- package/node_modules/side-channel/README.md +2 -0
- package/node_modules/side-channel/index.js +124 -0
- package/node_modules/side-channel/package.json +95 -0
- package/node_modules/side-channel/test/index.js +78 -0
- package/node_modules/statuses/HISTORY.md +17 -0
- package/node_modules/statuses/README.md +51 -42
- package/node_modules/statuses/codes.json +2 -3
- package/node_modules/statuses/index.js +52 -19
- package/node_modules/statuses/package.json +29 -31
- package/node_modules/unpipe/package.json +7 -9
- package/node_modules/utils-merge/package.json +6 -9
- package/package.json +2 -2
- package/worldmap/worldmap.js +22 -7
- package/worldmap.html +16 -0
- package/worldmap.js +553 -551
- package/node_modules/depd/lib/compat/callsite-tostring.js +0 -103
- package/node_modules/depd/lib/compat/event-listener-count.js +0 -22
- package/node_modules/depd/lib/compat/index.js +0 -79
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
language: node_js
|
|
2
|
+
os:
|
|
3
|
+
- linux
|
|
4
|
+
node_js:
|
|
5
|
+
- "8.4"
|
|
6
|
+
- "7.10"
|
|
7
|
+
- "6.11"
|
|
8
|
+
- "5.12"
|
|
9
|
+
- "4.8"
|
|
10
|
+
- "iojs-v3.3"
|
|
11
|
+
- "iojs-v2.5"
|
|
12
|
+
- "iojs-v1.8"
|
|
13
|
+
- "0.12"
|
|
14
|
+
- "0.10"
|
|
15
|
+
- "0.8"
|
|
16
|
+
before_install:
|
|
17
|
+
- 'if [ "${TRAVIS_NODE_VERSION}" = "0.6" ]; then npm install -g npm@1.3 ; elif [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then case "$(npm --version)" in 1.*) npm install -g npm@1.4.28 ;; 2.*) npm install -g npm@2 ;; esac ; fi'
|
|
18
|
+
- 'if [ "${TRAVIS_NODE_VERSION}" != "0.6" ] && [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then if [ "${TRAVIS_NODE_VERSION%${TRAVIS_NODE_VERSION#[0-9]}}" = "0" ] || [ "${TRAVIS_NODE_VERSION:0:4}" = "iojs" ]; then npm install -g npm@4.5 ; else npm install -g npm; fi; fi'
|
|
19
|
+
install:
|
|
20
|
+
- 'if [ "${TRAVIS_NODE_VERSION}" = "0.6" ]; then nvm install 0.8 && npm install -g npm@1.3 && npm install -g npm@1.4.28 && npm install -g npm@2 && npm install && nvm use "${TRAVIS_NODE_VERSION}"; else npm install; fi;'
|
|
21
|
+
script:
|
|
22
|
+
- 'if [ -n "${PRETEST-}" ]; then npm run pretest ; fi'
|
|
23
|
+
- 'if [ -n "${POSTTEST-}" ]; then npm run posttest ; fi'
|
|
24
|
+
- 'if [ -n "${COVERAGE-}" ]; then npm run coverage ; fi'
|
|
25
|
+
- 'if [ -n "${TEST-}" ]; then npm run tests-only ; fi'
|
|
26
|
+
sudo: false
|
|
27
|
+
env:
|
|
28
|
+
- TEST=true
|
|
29
|
+
matrix:
|
|
30
|
+
fast_finish: true
|
|
31
|
+
include:
|
|
32
|
+
- node_js: "node"
|
|
33
|
+
env: PRETEST=true
|
|
34
|
+
- node_js: "4"
|
|
35
|
+
env: COVERAGE=true
|
|
36
|
+
- node_js: "8.3"
|
|
37
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
38
|
+
- node_js: "8.2"
|
|
39
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
40
|
+
- node_js: "8.1"
|
|
41
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
42
|
+
- node_js: "8.0"
|
|
43
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
44
|
+
- node_js: "7.9"
|
|
45
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
46
|
+
- node_js: "7.8"
|
|
47
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
48
|
+
- node_js: "7.7"
|
|
49
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
50
|
+
- node_js: "7.6"
|
|
51
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
52
|
+
- node_js: "7.5"
|
|
53
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
54
|
+
- node_js: "7.4"
|
|
55
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
56
|
+
- node_js: "7.3"
|
|
57
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
58
|
+
- node_js: "7.2"
|
|
59
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
60
|
+
- node_js: "7.1"
|
|
61
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
62
|
+
- node_js: "7.0"
|
|
63
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
64
|
+
- node_js: "6.10"
|
|
65
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
66
|
+
- node_js: "6.9"
|
|
67
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
68
|
+
- node_js: "6.8"
|
|
69
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
70
|
+
- node_js: "6.7"
|
|
71
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
72
|
+
- node_js: "6.6"
|
|
73
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
74
|
+
- node_js: "6.5"
|
|
75
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
76
|
+
- node_js: "6.4"
|
|
77
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
78
|
+
- node_js: "6.3"
|
|
79
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
80
|
+
- node_js: "6.2"
|
|
81
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
82
|
+
- node_js: "6.1"
|
|
83
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
84
|
+
- node_js: "6.0"
|
|
85
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
86
|
+
- node_js: "5.11"
|
|
87
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
88
|
+
- node_js: "5.10"
|
|
89
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
90
|
+
- node_js: "5.9"
|
|
91
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
92
|
+
- node_js: "5.8"
|
|
93
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
94
|
+
- node_js: "5.7"
|
|
95
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
96
|
+
- node_js: "5.6"
|
|
97
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
98
|
+
- node_js: "5.5"
|
|
99
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
100
|
+
- node_js: "5.4"
|
|
101
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
102
|
+
- node_js: "5.3"
|
|
103
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
104
|
+
- node_js: "5.2"
|
|
105
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
106
|
+
- node_js: "5.1"
|
|
107
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
108
|
+
- node_js: "5.0"
|
|
109
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
110
|
+
- node_js: "4.7"
|
|
111
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
112
|
+
- node_js: "4.6"
|
|
113
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
114
|
+
- node_js: "4.5"
|
|
115
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
116
|
+
- node_js: "4.4"
|
|
117
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
118
|
+
- node_js: "4.3"
|
|
119
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
120
|
+
- node_js: "4.2"
|
|
121
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
122
|
+
- node_js: "4.1"
|
|
123
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
124
|
+
- node_js: "4.0"
|
|
125
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
126
|
+
- node_js: "iojs-v3.2"
|
|
127
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
128
|
+
- node_js: "iojs-v3.1"
|
|
129
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
130
|
+
- node_js: "iojs-v3.0"
|
|
131
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
132
|
+
- node_js: "iojs-v2.4"
|
|
133
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
134
|
+
- node_js: "iojs-v2.3"
|
|
135
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
136
|
+
- node_js: "iojs-v2.2"
|
|
137
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
138
|
+
- node_js: "iojs-v2.1"
|
|
139
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
140
|
+
- node_js: "iojs-v2.0"
|
|
141
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
142
|
+
- node_js: "iojs-v1.7"
|
|
143
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
144
|
+
- node_js: "iojs-v1.6"
|
|
145
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
146
|
+
- node_js: "iojs-v1.5"
|
|
147
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
148
|
+
- node_js: "iojs-v1.4"
|
|
149
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
150
|
+
- node_js: "iojs-v1.3"
|
|
151
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
152
|
+
- node_js: "iojs-v1.2"
|
|
153
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
154
|
+
- node_js: "iojs-v1.1"
|
|
155
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
156
|
+
- node_js: "iojs-v1.0"
|
|
157
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
158
|
+
- node_js: "0.11"
|
|
159
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
160
|
+
- node_js: "0.9"
|
|
161
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
162
|
+
- node_js: "0.6"
|
|
163
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
164
|
+
- node_js: "0.4"
|
|
165
|
+
env: TEST=true ALLOW_FAILURE=true
|
|
166
|
+
allow_failures:
|
|
167
|
+
- os: osx
|
|
168
|
+
- env: TEST=true ALLOW_FAILURE=true
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright (c) 2013 Raynos.
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
5
|
+
in the Software without restriction, including without limitation the rights
|
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
furnished to do so, subject to the following conditions:
|
|
9
|
+
|
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
|
11
|
+
all copies or substantial portions of the Software.
|
|
12
|
+
|
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
19
|
+
THE SOFTWARE.
|
|
20
|
+
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# function-bind
|
|
2
|
+
|
|
3
|
+
<!--
|
|
4
|
+
[![build status][travis-svg]][travis-url]
|
|
5
|
+
[![NPM version][npm-badge-svg]][npm-url]
|
|
6
|
+
[![Coverage Status][5]][6]
|
|
7
|
+
[![gemnasium Dependency Status][7]][8]
|
|
8
|
+
[![Dependency status][deps-svg]][deps-url]
|
|
9
|
+
[![Dev Dependency status][dev-deps-svg]][dev-deps-url]
|
|
10
|
+
-->
|
|
11
|
+
|
|
12
|
+
<!-- [![browser support][11]][12] -->
|
|
13
|
+
|
|
14
|
+
Implementation of function.prototype.bind
|
|
15
|
+
|
|
16
|
+
## Example
|
|
17
|
+
|
|
18
|
+
I mainly do this for unit tests I run on phantomjs.
|
|
19
|
+
PhantomJS does not have Function.prototype.bind :(
|
|
20
|
+
|
|
21
|
+
```js
|
|
22
|
+
Function.prototype.bind = require("function-bind")
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Installation
|
|
26
|
+
|
|
27
|
+
`npm install function-bind`
|
|
28
|
+
|
|
29
|
+
## Contributors
|
|
30
|
+
|
|
31
|
+
- Raynos
|
|
32
|
+
|
|
33
|
+
## MIT Licenced
|
|
34
|
+
|
|
35
|
+
[travis-svg]: https://travis-ci.org/Raynos/function-bind.svg
|
|
36
|
+
[travis-url]: https://travis-ci.org/Raynos/function-bind
|
|
37
|
+
[npm-badge-svg]: https://badge.fury.io/js/function-bind.svg
|
|
38
|
+
[npm-url]: https://npmjs.org/package/function-bind
|
|
39
|
+
[5]: https://coveralls.io/repos/Raynos/function-bind/badge.png
|
|
40
|
+
[6]: https://coveralls.io/r/Raynos/function-bind
|
|
41
|
+
[7]: https://gemnasium.com/Raynos/function-bind.png
|
|
42
|
+
[8]: https://gemnasium.com/Raynos/function-bind
|
|
43
|
+
[deps-svg]: https://david-dm.org/Raynos/function-bind.svg
|
|
44
|
+
[deps-url]: https://david-dm.org/Raynos/function-bind
|
|
45
|
+
[dev-deps-svg]: https://david-dm.org/Raynos/function-bind/dev-status.svg
|
|
46
|
+
[dev-deps-url]: https://david-dm.org/Raynos/function-bind#info=devDependencies
|
|
47
|
+
[11]: https://ci.testling.com/Raynos/function-bind.png
|
|
48
|
+
[12]: https://ci.testling.com/Raynos/function-bind
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/* eslint no-invalid-this: 1 */
|
|
4
|
+
|
|
5
|
+
var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
|
|
6
|
+
var slice = Array.prototype.slice;
|
|
7
|
+
var toStr = Object.prototype.toString;
|
|
8
|
+
var funcType = '[object Function]';
|
|
9
|
+
|
|
10
|
+
module.exports = function bind(that) {
|
|
11
|
+
var target = this;
|
|
12
|
+
if (typeof target !== 'function' || toStr.call(target) !== funcType) {
|
|
13
|
+
throw new TypeError(ERROR_MESSAGE + target);
|
|
14
|
+
}
|
|
15
|
+
var args = slice.call(arguments, 1);
|
|
16
|
+
|
|
17
|
+
var bound;
|
|
18
|
+
var binder = function () {
|
|
19
|
+
if (this instanceof bound) {
|
|
20
|
+
var result = target.apply(
|
|
21
|
+
this,
|
|
22
|
+
args.concat(slice.call(arguments))
|
|
23
|
+
);
|
|
24
|
+
if (Object(result) === result) {
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
return this;
|
|
28
|
+
} else {
|
|
29
|
+
return target.apply(
|
|
30
|
+
that,
|
|
31
|
+
args.concat(slice.call(arguments))
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
var boundLength = Math.max(0, target.length - args.length);
|
|
37
|
+
var boundArgs = [];
|
|
38
|
+
for (var i = 0; i < boundLength; i++) {
|
|
39
|
+
boundArgs.push('$' + i);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);
|
|
43
|
+
|
|
44
|
+
if (target.prototype) {
|
|
45
|
+
var Empty = function Empty() {};
|
|
46
|
+
Empty.prototype = target.prototype;
|
|
47
|
+
bound.prototype = new Empty();
|
|
48
|
+
Empty.prototype = null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return bound;
|
|
52
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_from": "function-bind@^1.1.1",
|
|
3
|
+
"_id": "function-bind@1.1.1",
|
|
4
|
+
"_inBundle": false,
|
|
5
|
+
"_integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
|
|
6
|
+
"_location": "/function-bind",
|
|
7
|
+
"_phantomChildren": {},
|
|
8
|
+
"_requested": {
|
|
9
|
+
"type": "range",
|
|
10
|
+
"registry": true,
|
|
11
|
+
"raw": "function-bind@^1.1.1",
|
|
12
|
+
"name": "function-bind",
|
|
13
|
+
"escapedName": "function-bind",
|
|
14
|
+
"rawSpec": "^1.1.1",
|
|
15
|
+
"saveSpec": null,
|
|
16
|
+
"fetchSpec": "^1.1.1"
|
|
17
|
+
},
|
|
18
|
+
"_requiredBy": [
|
|
19
|
+
"/call-bind",
|
|
20
|
+
"/get-intrinsic",
|
|
21
|
+
"/has"
|
|
22
|
+
],
|
|
23
|
+
"_resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
|
|
24
|
+
"_shasum": "a56899d3ea3c9bab874bb9773b7c5ede92f4895d",
|
|
25
|
+
"_spec": "function-bind@^1.1.1",
|
|
26
|
+
"_where": "/Users/conway/Projects/worldmap/node_modules/call-bind",
|
|
27
|
+
"author": {
|
|
28
|
+
"name": "Raynos",
|
|
29
|
+
"email": "raynos2@gmail.com"
|
|
30
|
+
},
|
|
31
|
+
"bugs": {
|
|
32
|
+
"url": "https://github.com/Raynos/function-bind/issues",
|
|
33
|
+
"email": "raynos2@gmail.com"
|
|
34
|
+
},
|
|
35
|
+
"bundleDependencies": false,
|
|
36
|
+
"contributors": [
|
|
37
|
+
{
|
|
38
|
+
"name": "Raynos"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"name": "Jordan Harband",
|
|
42
|
+
"url": "https://github.com/ljharb"
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
"dependencies": {},
|
|
46
|
+
"deprecated": false,
|
|
47
|
+
"description": "Implementation of Function.prototype.bind",
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@ljharb/eslint-config": "^12.2.1",
|
|
50
|
+
"covert": "^1.1.0",
|
|
51
|
+
"eslint": "^4.5.0",
|
|
52
|
+
"jscs": "^3.0.7",
|
|
53
|
+
"tape": "^4.8.0"
|
|
54
|
+
},
|
|
55
|
+
"homepage": "https://github.com/Raynos/function-bind",
|
|
56
|
+
"keywords": [
|
|
57
|
+
"function",
|
|
58
|
+
"bind",
|
|
59
|
+
"shim",
|
|
60
|
+
"es5"
|
|
61
|
+
],
|
|
62
|
+
"license": "MIT",
|
|
63
|
+
"main": "index",
|
|
64
|
+
"name": "function-bind",
|
|
65
|
+
"repository": {
|
|
66
|
+
"type": "git",
|
|
67
|
+
"url": "git://github.com/Raynos/function-bind.git"
|
|
68
|
+
},
|
|
69
|
+
"scripts": {
|
|
70
|
+
"coverage": "covert test/*.js",
|
|
71
|
+
"eslint": "eslint *.js */*.js",
|
|
72
|
+
"jscs": "jscs *.js */*.js",
|
|
73
|
+
"lint": "npm run jscs && npm run eslint",
|
|
74
|
+
"posttest": "npm run coverage -- --quiet",
|
|
75
|
+
"pretest": "npm run lint",
|
|
76
|
+
"test": "npm run tests-only",
|
|
77
|
+
"tests-only": "node test"
|
|
78
|
+
},
|
|
79
|
+
"testling": {
|
|
80
|
+
"files": "test/index.js",
|
|
81
|
+
"browsers": [
|
|
82
|
+
"ie/8..latest",
|
|
83
|
+
"firefox/16..latest",
|
|
84
|
+
"firefox/nightly",
|
|
85
|
+
"chrome/22..latest",
|
|
86
|
+
"chrome/canary",
|
|
87
|
+
"opera/12..latest",
|
|
88
|
+
"opera/next",
|
|
89
|
+
"safari/5.1..latest",
|
|
90
|
+
"ipad/6.0..latest",
|
|
91
|
+
"iphone/6.0..latest",
|
|
92
|
+
"android-browser/4.2..latest"
|
|
93
|
+
]
|
|
94
|
+
},
|
|
95
|
+
"version": "1.1.1"
|
|
96
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
// jscs:disable requireUseStrict
|
|
2
|
+
|
|
3
|
+
var test = require('tape');
|
|
4
|
+
|
|
5
|
+
var functionBind = require('../implementation');
|
|
6
|
+
var getCurrentContext = function () { return this; };
|
|
7
|
+
|
|
8
|
+
test('functionBind is a function', function (t) {
|
|
9
|
+
t.equal(typeof functionBind, 'function');
|
|
10
|
+
t.end();
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
test('non-functions', function (t) {
|
|
14
|
+
var nonFunctions = [true, false, [], {}, 42, 'foo', NaN, /a/g];
|
|
15
|
+
t.plan(nonFunctions.length);
|
|
16
|
+
for (var i = 0; i < nonFunctions.length; ++i) {
|
|
17
|
+
try { functionBind.call(nonFunctions[i]); } catch (ex) {
|
|
18
|
+
t.ok(ex instanceof TypeError, 'throws when given ' + String(nonFunctions[i]));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
t.end();
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test('without a context', function (t) {
|
|
25
|
+
t.test('binds properly', function (st) {
|
|
26
|
+
var args, context;
|
|
27
|
+
var namespace = {
|
|
28
|
+
func: functionBind.call(function () {
|
|
29
|
+
args = Array.prototype.slice.call(arguments);
|
|
30
|
+
context = this;
|
|
31
|
+
})
|
|
32
|
+
};
|
|
33
|
+
namespace.func(1, 2, 3);
|
|
34
|
+
st.deepEqual(args, [1, 2, 3]);
|
|
35
|
+
st.equal(context, getCurrentContext.call());
|
|
36
|
+
st.end();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
t.test('binds properly, and still supplies bound arguments', function (st) {
|
|
40
|
+
var args, context;
|
|
41
|
+
var namespace = {
|
|
42
|
+
func: functionBind.call(function () {
|
|
43
|
+
args = Array.prototype.slice.call(arguments);
|
|
44
|
+
context = this;
|
|
45
|
+
}, undefined, 1, 2, 3)
|
|
46
|
+
};
|
|
47
|
+
namespace.func(4, 5, 6);
|
|
48
|
+
st.deepEqual(args, [1, 2, 3, 4, 5, 6]);
|
|
49
|
+
st.equal(context, getCurrentContext.call());
|
|
50
|
+
st.end();
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
t.test('returns properly', function (st) {
|
|
54
|
+
var args;
|
|
55
|
+
var namespace = {
|
|
56
|
+
func: functionBind.call(function () {
|
|
57
|
+
args = Array.prototype.slice.call(arguments);
|
|
58
|
+
return this;
|
|
59
|
+
}, null)
|
|
60
|
+
};
|
|
61
|
+
var context = namespace.func(1, 2, 3);
|
|
62
|
+
st.equal(context, getCurrentContext.call(), 'returned context is namespaced context');
|
|
63
|
+
st.deepEqual(args, [1, 2, 3], 'passed arguments are correct');
|
|
64
|
+
st.end();
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
t.test('returns properly with bound arguments', function (st) {
|
|
68
|
+
var args;
|
|
69
|
+
var namespace = {
|
|
70
|
+
func: functionBind.call(function () {
|
|
71
|
+
args = Array.prototype.slice.call(arguments);
|
|
72
|
+
return this;
|
|
73
|
+
}, null, 1, 2, 3)
|
|
74
|
+
};
|
|
75
|
+
var context = namespace.func(4, 5, 6);
|
|
76
|
+
st.equal(context, getCurrentContext.call(), 'returned context is namespaced context');
|
|
77
|
+
st.deepEqual(args, [1, 2, 3, 4, 5, 6], 'passed arguments are correct');
|
|
78
|
+
st.end();
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
t.test('called as a constructor', function (st) {
|
|
82
|
+
var thunkify = function (value) {
|
|
83
|
+
return function () { return value; };
|
|
84
|
+
};
|
|
85
|
+
st.test('returns object value', function (sst) {
|
|
86
|
+
var expectedReturnValue = [1, 2, 3];
|
|
87
|
+
var Constructor = functionBind.call(thunkify(expectedReturnValue), null);
|
|
88
|
+
var result = new Constructor();
|
|
89
|
+
sst.equal(result, expectedReturnValue);
|
|
90
|
+
sst.end();
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
st.test('does not return primitive value', function (sst) {
|
|
94
|
+
var Constructor = functionBind.call(thunkify(42), null);
|
|
95
|
+
var result = new Constructor();
|
|
96
|
+
sst.notEqual(result, 42);
|
|
97
|
+
sst.end();
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
st.test('object from bound constructor is instance of original and bound constructor', function (sst) {
|
|
101
|
+
var A = function (x) {
|
|
102
|
+
this.name = x || 'A';
|
|
103
|
+
};
|
|
104
|
+
var B = functionBind.call(A, null, 'B');
|
|
105
|
+
|
|
106
|
+
var result = new B();
|
|
107
|
+
sst.ok(result instanceof B, 'result is instance of bound constructor');
|
|
108
|
+
sst.ok(result instanceof A, 'result is instance of original constructor');
|
|
109
|
+
sst.end();
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
st.end();
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
t.end();
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test('with a context', function (t) {
|
|
119
|
+
t.test('with no bound arguments', function (st) {
|
|
120
|
+
var args, context;
|
|
121
|
+
var boundContext = {};
|
|
122
|
+
var namespace = {
|
|
123
|
+
func: functionBind.call(function () {
|
|
124
|
+
args = Array.prototype.slice.call(arguments);
|
|
125
|
+
context = this;
|
|
126
|
+
}, boundContext)
|
|
127
|
+
};
|
|
128
|
+
namespace.func(1, 2, 3);
|
|
129
|
+
st.equal(context, boundContext, 'binds a context properly');
|
|
130
|
+
st.deepEqual(args, [1, 2, 3], 'supplies passed arguments');
|
|
131
|
+
st.end();
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
t.test('with bound arguments', function (st) {
|
|
135
|
+
var args, context;
|
|
136
|
+
var boundContext = {};
|
|
137
|
+
var namespace = {
|
|
138
|
+
func: functionBind.call(function () {
|
|
139
|
+
args = Array.prototype.slice.call(arguments);
|
|
140
|
+
context = this;
|
|
141
|
+
}, boundContext, 1, 2, 3)
|
|
142
|
+
};
|
|
143
|
+
namespace.func(4, 5, 6);
|
|
144
|
+
st.equal(context, boundContext, 'binds a context properly');
|
|
145
|
+
st.deepEqual(args, [1, 2, 3, 4, 5, 6], 'supplies bound and passed arguments');
|
|
146
|
+
st.end();
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
t.test('returns properly', function (st) {
|
|
150
|
+
var boundContext = {};
|
|
151
|
+
var args;
|
|
152
|
+
var namespace = {
|
|
153
|
+
func: functionBind.call(function () {
|
|
154
|
+
args = Array.prototype.slice.call(arguments);
|
|
155
|
+
return this;
|
|
156
|
+
}, boundContext)
|
|
157
|
+
};
|
|
158
|
+
var context = namespace.func(1, 2, 3);
|
|
159
|
+
st.equal(context, boundContext, 'returned context is bound context');
|
|
160
|
+
st.notEqual(context, getCurrentContext.call(), 'returned context is not lexical context');
|
|
161
|
+
st.deepEqual(args, [1, 2, 3], 'passed arguments are correct');
|
|
162
|
+
st.end();
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
t.test('returns properly with bound arguments', function (st) {
|
|
166
|
+
var boundContext = {};
|
|
167
|
+
var args;
|
|
168
|
+
var namespace = {
|
|
169
|
+
func: functionBind.call(function () {
|
|
170
|
+
args = Array.prototype.slice.call(arguments);
|
|
171
|
+
return this;
|
|
172
|
+
}, boundContext, 1, 2, 3)
|
|
173
|
+
};
|
|
174
|
+
var context = namespace.func(4, 5, 6);
|
|
175
|
+
st.equal(context, boundContext, 'returned context is bound context');
|
|
176
|
+
st.notEqual(context, getCurrentContext.call(), 'returned context is not lexical context');
|
|
177
|
+
st.deepEqual(args, [1, 2, 3, 4, 5, 6], 'passed arguments are correct');
|
|
178
|
+
st.end();
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
t.test('passes the correct arguments when called as a constructor', function (st) {
|
|
182
|
+
var expected = { name: 'Correct' };
|
|
183
|
+
var namespace = {
|
|
184
|
+
Func: functionBind.call(function (arg) {
|
|
185
|
+
return arg;
|
|
186
|
+
}, { name: 'Incorrect' })
|
|
187
|
+
};
|
|
188
|
+
var returned = new namespace.Func(expected);
|
|
189
|
+
st.equal(returned, expected, 'returns the right arg when called as a constructor');
|
|
190
|
+
st.end();
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
t.test('has the new instance\'s context when called as a constructor', function (st) {
|
|
194
|
+
var actualContext;
|
|
195
|
+
var expectedContext = { foo: 'bar' };
|
|
196
|
+
var namespace = {
|
|
197
|
+
Func: functionBind.call(function () {
|
|
198
|
+
actualContext = this;
|
|
199
|
+
}, expectedContext)
|
|
200
|
+
};
|
|
201
|
+
var result = new namespace.Func();
|
|
202
|
+
st.equal(result instanceof namespace.Func, true);
|
|
203
|
+
st.notEqual(actualContext, expectedContext);
|
|
204
|
+
st.end();
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
t.end();
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
test('bound function length', function (t) {
|
|
211
|
+
t.test('sets a correct length without thisArg', function (st) {
|
|
212
|
+
var subject = functionBind.call(function (a, b, c) { return a + b + c; });
|
|
213
|
+
st.equal(subject.length, 3);
|
|
214
|
+
st.equal(subject(1, 2, 3), 6);
|
|
215
|
+
st.end();
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
t.test('sets a correct length with thisArg', function (st) {
|
|
219
|
+
var subject = functionBind.call(function (a, b, c) { return a + b + c; }, {});
|
|
220
|
+
st.equal(subject.length, 3);
|
|
221
|
+
st.equal(subject(1, 2, 3), 6);
|
|
222
|
+
st.end();
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
t.test('sets a correct length without thisArg and first argument', function (st) {
|
|
226
|
+
var subject = functionBind.call(function (a, b, c) { return a + b + c; }, undefined, 1);
|
|
227
|
+
st.equal(subject.length, 2);
|
|
228
|
+
st.equal(subject(2, 3), 6);
|
|
229
|
+
st.end();
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
t.test('sets a correct length with thisArg and first argument', function (st) {
|
|
233
|
+
var subject = functionBind.call(function (a, b, c) { return a + b + c; }, {}, 1);
|
|
234
|
+
st.equal(subject.length, 2);
|
|
235
|
+
st.equal(subject(2, 3), 6);
|
|
236
|
+
st.end();
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
t.test('sets a correct length without thisArg and too many arguments', function (st) {
|
|
240
|
+
var subject = functionBind.call(function (a, b, c) { return a + b + c; }, undefined, 1, 2, 3, 4);
|
|
241
|
+
st.equal(subject.length, 0);
|
|
242
|
+
st.equal(subject(), 6);
|
|
243
|
+
st.end();
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
t.test('sets a correct length with thisArg and too many arguments', function (st) {
|
|
247
|
+
var subject = functionBind.call(function (a, b, c) { return a + b + c; }, {}, 1, 2, 3, 4);
|
|
248
|
+
st.equal(subject.length, 0);
|
|
249
|
+
st.equal(subject(), 6);
|
|
250
|
+
st.end();
|
|
251
|
+
});
|
|
252
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"root": true,
|
|
3
|
+
|
|
4
|
+
"extends": "@ljharb",
|
|
5
|
+
|
|
6
|
+
"env": {
|
|
7
|
+
"es6": true,
|
|
8
|
+
"es2017": true,
|
|
9
|
+
"es2020": true,
|
|
10
|
+
"es2021": true,
|
|
11
|
+
"es2022": true,
|
|
12
|
+
},
|
|
13
|
+
|
|
14
|
+
"rules": {
|
|
15
|
+
"array-bracket-newline": 0,
|
|
16
|
+
"complexity": 0,
|
|
17
|
+
"eqeqeq": [2, "allow-null"],
|
|
18
|
+
"func-name-matching": 0,
|
|
19
|
+
"id-length": 0,
|
|
20
|
+
"max-lines-per-function": [2, 90],
|
|
21
|
+
"max-params": [2, 4],
|
|
22
|
+
"max-statements": 0,
|
|
23
|
+
"max-statements-per-line": [2, { "max": 2 }],
|
|
24
|
+
"multiline-comment-style": 0,
|
|
25
|
+
"no-magic-numbers": 0,
|
|
26
|
+
"sort-keys": 0,
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
"overrides": [
|
|
30
|
+
{
|
|
31
|
+
"files": "test/**",
|
|
32
|
+
"rules": {
|
|
33
|
+
"new-cap": 0,
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
}
|