@appium/base-driver 8.2.4 → 8.4.0

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.
Files changed (206) hide show
  1. package/build/lib/basedriver/capabilities.d.ts +80 -0
  2. package/build/lib/basedriver/capabilities.d.ts.map +1 -0
  3. package/build/lib/basedriver/capabilities.js +12 -13
  4. package/build/lib/basedriver/commands/event.d.ts +9 -0
  5. package/build/lib/basedriver/commands/event.d.ts.map +1 -0
  6. package/build/lib/basedriver/commands/event.js +21 -23
  7. package/build/lib/basedriver/commands/find.d.ts +11 -0
  8. package/build/lib/basedriver/commands/find.d.ts.map +1 -0
  9. package/build/lib/basedriver/commands/find.js +41 -43
  10. package/build/lib/basedriver/commands/index.d.ts +8 -0
  11. package/build/lib/basedriver/commands/index.d.ts.map +1 -0
  12. package/build/lib/basedriver/commands/index.js +17 -16
  13. package/build/lib/basedriver/commands/log.d.ts +12 -0
  14. package/build/lib/basedriver/commands/log.d.ts.map +1 -0
  15. package/build/lib/basedriver/commands/log.js +23 -30
  16. package/build/lib/basedriver/commands/session.d.ts +11 -0
  17. package/build/lib/basedriver/commands/session.d.ts.map +1 -0
  18. package/build/lib/basedriver/commands/session.js +21 -158
  19. package/build/lib/basedriver/commands/settings.d.ts +10 -0
  20. package/build/lib/basedriver/commands/settings.d.ts.map +1 -0
  21. package/build/lib/basedriver/commands/settings.js +18 -22
  22. package/build/lib/basedriver/commands/timeout.d.ts +8 -0
  23. package/build/lib/basedriver/commands/timeout.d.ts.map +1 -0
  24. package/build/lib/basedriver/commands/timeout.js +118 -144
  25. package/build/lib/basedriver/core.d.ts +235 -0
  26. package/build/lib/basedriver/core.d.ts.map +1 -0
  27. package/build/lib/basedriver/core.js +283 -0
  28. package/build/lib/basedriver/desired-caps.d.ts +5 -0
  29. package/build/lib/basedriver/desired-caps.d.ts.map +1 -0
  30. package/build/lib/basedriver/desired-caps.js +2 -4
  31. package/build/lib/basedriver/device-settings.d.ts +32 -0
  32. package/build/lib/basedriver/device-settings.d.ts.map +1 -0
  33. package/build/lib/basedriver/device-settings.js +33 -15
  34. package/build/lib/basedriver/driver.d.ts +83 -0
  35. package/build/lib/basedriver/driver.d.ts.map +1 -0
  36. package/build/lib/basedriver/driver.js +104 -257
  37. package/build/lib/basedriver/helpers.d.ts +132 -0
  38. package/build/lib/basedriver/helpers.d.ts.map +1 -0
  39. package/build/lib/basedriver/helpers.js +24 -10
  40. package/build/lib/basedriver/logger.d.ts +3 -0
  41. package/build/lib/basedriver/logger.d.ts.map +1 -0
  42. package/build/lib/basedriver/logger.js +2 -4
  43. package/build/lib/constants.d.ts +9 -0
  44. package/build/lib/constants.d.ts.map +1 -0
  45. package/build/lib/constants.js +2 -4
  46. package/build/lib/express/crash.d.ts +3 -0
  47. package/build/lib/express/crash.d.ts.map +1 -0
  48. package/build/lib/express/crash.js +2 -4
  49. package/build/lib/express/express-logging.d.ts +3 -0
  50. package/build/lib/express/express-logging.d.ts.map +1 -0
  51. package/build/lib/express/express-logging.js +3 -5
  52. package/build/lib/express/idempotency.d.ts +2 -0
  53. package/build/lib/express/idempotency.d.ts.map +1 -0
  54. package/build/lib/express/idempotency.js +3 -5
  55. package/build/lib/express/logger.d.ts +3 -0
  56. package/build/lib/express/logger.d.ts.map +1 -0
  57. package/build/lib/express/logger.js +2 -4
  58. package/build/lib/express/middleware.d.ts +9 -0
  59. package/build/lib/express/middleware.d.ts.map +1 -0
  60. package/build/lib/express/middleware.js +2 -4
  61. package/build/lib/express/server.d.ts +10 -0
  62. package/build/lib/express/server.d.ts.map +1 -0
  63. package/build/lib/express/server.js +2 -4
  64. package/build/lib/express/static.d.ts +6 -0
  65. package/build/lib/express/static.d.ts.map +1 -0
  66. package/build/lib/express/static.js +2 -4
  67. package/build/lib/express/websocket.d.ts +64 -0
  68. package/build/lib/express/websocket.d.ts.map +1 -0
  69. package/build/lib/express/websocket.js +2 -4
  70. package/build/lib/helpers/capabilities.d.ts +13 -0
  71. package/build/lib/helpers/capabilities.d.ts.map +1 -0
  72. package/build/lib/helpers/capabilities.js +77 -0
  73. package/build/lib/index.d.ts +183 -0
  74. package/build/lib/index.d.ts.map +1 -0
  75. package/build/lib/index.js +41 -25
  76. package/build/lib/jsonwp-proxy/protocol-converter.d.ts +48 -0
  77. package/build/lib/jsonwp-proxy/protocol-converter.d.ts.map +1 -0
  78. package/build/lib/jsonwp-proxy/protocol-converter.js +19 -15
  79. package/build/lib/jsonwp-proxy/proxy.d.ts +41 -0
  80. package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -0
  81. package/build/lib/jsonwp-proxy/proxy.js +20 -15
  82. package/build/lib/jsonwp-status/status.d.ts +159 -0
  83. package/build/lib/jsonwp-status/status.d.ts.map +1 -0
  84. package/build/lib/jsonwp-status/status.js +2 -4
  85. package/build/lib/protocol/errors.d.ts +310 -0
  86. package/build/lib/protocol/errors.d.ts.map +1 -0
  87. package/build/lib/protocol/errors.js +82 -5
  88. package/build/lib/protocol/helpers.d.ts +22 -0
  89. package/build/lib/protocol/helpers.d.ts.map +1 -0
  90. package/build/lib/protocol/helpers.js +2 -4
  91. package/build/lib/protocol/index.d.ts +16 -0
  92. package/build/lib/protocol/index.d.ts.map +1 -0
  93. package/build/lib/protocol/index.js +8 -10
  94. package/build/lib/protocol/protocol.d.ts +11 -0
  95. package/build/lib/protocol/protocol.d.ts.map +1 -0
  96. package/build/lib/protocol/protocol.js +38 -35
  97. package/build/lib/protocol/routes.d.ts +6 -0
  98. package/build/lib/protocol/routes.d.ts.map +1 -0
  99. package/build/lib/protocol/routes.js +84 -4
  100. package/build/lib/protocol/validators.d.ts +8 -0
  101. package/build/lib/protocol/validators.d.ts.map +1 -0
  102. package/build/lib/protocol/validators.js +2 -4
  103. package/build/test/basedriver/README.md +5 -0
  104. package/build/test/basedriver/driver-e2e-tests.js +2 -4
  105. package/build/test/basedriver/driver-tests.js +41 -19
  106. package/build/test/basedriver/index.js +2 -4
  107. package/build/test/e2e/basedriver/driver.e2e.spec.js +15 -0
  108. package/build/test/e2e/basedriver/helpers.e2e.spec.js +192 -0
  109. package/build/test/e2e/basedriver/websockets.e2e.spec.js +82 -0
  110. package/build/test/e2e/express/server.e2e.spec.js +159 -0
  111. package/build/test/e2e/jsonwp-proxy/proxy.e2e.spec.js +59 -0
  112. package/build/test/e2e/protocol/fake-driver.js +163 -0
  113. package/build/test/e2e/protocol/helpers.js +25 -0
  114. package/build/test/e2e/protocol/protocol.e2e.spec.js +1186 -0
  115. package/build/test/helpers.js +2 -4
  116. package/build/test/unit/basedriver/capabilities.spec.js +672 -0
  117. package/build/test/unit/basedriver/capability.spec.js +353 -0
  118. package/build/test/unit/basedriver/commands/event.spec.js +110 -0
  119. package/build/test/unit/basedriver/commands/log.spec.js +92 -0
  120. package/build/test/unit/basedriver/driver.spec.js +15 -0
  121. package/build/test/unit/basedriver/helpers.spec.js +151 -0
  122. package/build/test/unit/basedriver/timeout.spec.js +135 -0
  123. package/build/test/unit/express/server.spec.js +155 -0
  124. package/build/test/unit/express/static.spec.js +26 -0
  125. package/build/test/unit/jsonwp-proxy/mock-request.js +91 -0
  126. package/build/test/unit/jsonwp-proxy/protocol-converter.spec.js +171 -0
  127. package/build/test/unit/jsonwp-proxy/proxy.spec.js +292 -0
  128. package/build/test/unit/jsonwp-proxy/url.spec.js +165 -0
  129. package/build/test/unit/jsonwp-status/status.spec.js +34 -0
  130. package/build/test/unit/protocol/errors.spec.js +390 -0
  131. package/build/test/unit/protocol/routes.spec.js +80 -0
  132. package/build/test/unit/protocol/validator.spec.js +149 -0
  133. package/build/tsconfig.tsbuildinfo +1 -0
  134. package/lib/basedriver/capabilities.js +49 -10
  135. package/lib/basedriver/commands/event.js +49 -31
  136. package/lib/basedriver/commands/find.js +107 -45
  137. package/lib/basedriver/commands/index.js +25 -19
  138. package/lib/basedriver/commands/log.js +59 -34
  139. package/lib/basedriver/commands/session.js +39 -142
  140. package/lib/basedriver/commands/settings.js +32 -14
  141. package/lib/basedriver/commands/timeout.js +153 -154
  142. package/lib/basedriver/core.js +497 -0
  143. package/lib/basedriver/desired-caps.js +1 -1
  144. package/lib/basedriver/device-settings.js +57 -13
  145. package/lib/basedriver/driver.js +277 -375
  146. package/lib/basedriver/helpers.js +31 -13
  147. package/lib/express/express-logging.js +1 -1
  148. package/lib/express/idempotency.js +1 -1
  149. package/lib/helpers/capabilities.js +84 -0
  150. package/lib/index.js +17 -13
  151. package/lib/jsonwp-proxy/protocol-converter.js +14 -13
  152. package/lib/jsonwp-proxy/proxy.js +16 -12
  153. package/lib/protocol/errors.js +42 -42
  154. package/lib/protocol/index.js +4 -4
  155. package/lib/protocol/protocol.js +35 -32
  156. package/lib/protocol/routes.js +69 -1
  157. package/package.json +37 -24
  158. package/test/basedriver/README.md +5 -0
  159. package/test/basedriver/driver-e2e-tests.js +1 -1
  160. package/test/basedriver/driver-tests.js +43 -9
  161. package/build/lib/protocol/sessions-cache.js +0 -88
  162. package/build/test/basedriver/capabilities-specs.js +0 -632
  163. package/build/test/basedriver/capability-specs.js +0 -396
  164. package/build/test/basedriver/commands/event-specs.js +0 -112
  165. package/build/test/basedriver/commands/log-specs.js +0 -80
  166. package/build/test/basedriver/driver-e2e-specs.js +0 -17
  167. package/build/test/basedriver/driver-specs.js +0 -17
  168. package/build/test/basedriver/helpers-e2e-specs.js +0 -194
  169. package/build/test/basedriver/helpers-specs.js +0 -153
  170. package/build/test/basedriver/timeout-specs.js +0 -139
  171. package/build/test/basedriver/websockets-e2e-specs.js +0 -84
  172. package/build/test/express/server-e2e-specs.js +0 -156
  173. package/build/test/express/server-specs.js +0 -151
  174. package/build/test/express/static-specs.js +0 -23
  175. package/build/test/jsonwp-proxy/mock-request.js +0 -93
  176. package/build/test/jsonwp-proxy/protocol-converter-specs.js +0 -173
  177. package/build/test/jsonwp-proxy/proxy-e2e-specs.js +0 -61
  178. package/build/test/jsonwp-proxy/proxy-specs.js +0 -294
  179. package/build/test/jsonwp-proxy/url-specs.js +0 -167
  180. package/build/test/jsonwp-status/status-specs.js +0 -36
  181. package/build/test/protocol/errors-specs.js +0 -388
  182. package/build/test/protocol/fake-driver.js +0 -168
  183. package/build/test/protocol/helpers.js +0 -27
  184. package/build/test/protocol/protocol-e2e-specs.js +0 -1182
  185. package/build/test/protocol/routes-specs.js +0 -82
  186. package/build/test/protocol/validator-specs.js +0 -151
  187. package/index.d.ts +0 -386
  188. package/lib/protocol/sessions-cache.js +0 -74
  189. package/test/basedriver/capabilities-specs.js +0 -505
  190. package/test/basedriver/capability-specs.js +0 -409
  191. package/test/basedriver/commands/event-specs.js +0 -74
  192. package/test/basedriver/commands/log-specs.js +0 -70
  193. package/test/basedriver/driver-e2e-specs.js +0 -8
  194. package/test/basedriver/driver-specs.js +0 -8
  195. package/test/basedriver/fixtures/BadZippedApp.zip +0 -1
  196. package/test/basedriver/fixtures/FakeAndroidApp.apk +0 -1
  197. package/test/basedriver/fixtures/FakeAndroidApp.asd +0 -0
  198. package/test/basedriver/fixtures/FakeIOSApp.app +0 -1
  199. package/test/basedriver/fixtures/FakeIOSApp.app.zip +0 -0
  200. package/test/basedriver/fixtures/FakeIOSApp.ipa +0 -0
  201. package/test/basedriver/fixtures/custom-element-finder-bad.js +0 -5
  202. package/test/basedriver/fixtures/custom-element-finder.js +0 -29
  203. package/test/basedriver/helpers-e2e-specs.js +0 -187
  204. package/test/basedriver/helpers-specs.js +0 -137
  205. package/test/basedriver/timeout-specs.js +0 -133
  206. package/test/basedriver/websockets-e2e-specs.js +0 -75
@@ -1,388 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- require("source-map-support/register");
6
-
7
- var _lib = require("../../lib");
8
-
9
- var _errors = require("../../lib/protocol/errors");
10
-
11
- var _lodash = _interopRequireDefault(require("lodash"));
12
-
13
- var _httpStatusCodes = require("http-status-codes");
14
-
15
- let errorsList = [{
16
- errorName: 'NoSuchDriverError',
17
- errorMsg: 'A session is either terminated or not started',
18
- error: 'invalid session id',
19
- errorCode: 6
20
- }, {
21
- errorName: 'ElementClickInterceptedError',
22
- errorMsg: 'The Element Click command could not be completed because the element receiving the events is obscuring the element that was requested clicked',
23
- error: 'element click intercepted'
24
- }, {
25
- errorName: 'ElementNotInteractableError',
26
- errorMsg: 'A command could not be completed because the element is not pointer- or keyboard interactable',
27
- error: 'element not interactable'
28
- }, {
29
- errorName: 'InsecureCertificateError',
30
- errorMsg: 'Navigation caused the user agent to hit a certificate warning, which is usually the result of an expired or invalid TLS certificate',
31
- error: 'insecure certificate'
32
- }, {
33
- errorName: 'InvalidArgumentError',
34
- errorMsg: 'The arguments passed to the command are either invalid or malformed',
35
- error: 'invalid argument'
36
- }, {
37
- errorName: 'NoSuchElementError',
38
- errorMsg: 'An element could not be located on the page using the ' + 'given search parameters.',
39
- error: 'no such element',
40
- errorCode: 7
41
- }, {
42
- errorName: 'NoSuchFrameError',
43
- errorMsg: 'A request to switch to a frame could not be satisfied ' + 'because the frame could not be found.',
44
- error: 'no such frame',
45
- errorCode: 8
46
- }, {
47
- errorName: 'UnknownCommandError',
48
- errorMsg: 'The requested resource could not be found, or a request ' + 'was received using an HTTP method that is not supported by ' + 'the mapped resource.',
49
- error: 'unknown command',
50
- errorCode: 9
51
- }, {
52
- errorName: 'StaleElementReferenceError',
53
- errorMsg: 'An element command failed because the referenced element is ' + 'no longer attached to the DOM.',
54
- error: 'stale element reference',
55
- errorCode: 10
56
- }, {
57
- errorName: 'ElementNotVisibleError',
58
- errorMsg: 'An element command could not be completed because the ' + 'element is not visible on the page.',
59
- errorCode: 11
60
- }, {
61
- errorName: 'InvalidElementStateError',
62
- errorMsg: 'An element command could not be completed because the element ' + 'is in an invalid state (e.g. attempting to click a disabled ' + 'element).',
63
- error: 'invalid element state',
64
- errorCode: 12
65
- }, {
66
- errorName: 'UnknownError',
67
- errorMsg: 'An unknown server-side error occurred while processing the ' + 'command.',
68
- error: 'unknown error',
69
- errorCode: 13
70
- }, {
71
- errorName: 'ElementIsNotSelectableError',
72
- errorMsg: 'An attempt was made to select an element that cannot ' + 'be selected.',
73
- error: 'element not selectable',
74
- errorCode: 15
75
- }, {
76
- errorName: 'JavaScriptError',
77
- errorMsg: 'An error occurred while executing user supplied JavaScript.',
78
- error: 'javascript error',
79
- errorCode: 17
80
- }, {
81
- errorName: 'XPathLookupError',
82
- errorMsg: 'An error occurred while searching for an element by XPath.',
83
- errorCode: 19
84
- }, {
85
- errorName: 'TimeoutError',
86
- errorMsg: 'An operation did not complete before its timeout expired.',
87
- error: 'timeout',
88
- errorCode: 21
89
- }, {
90
- errorName: 'NoSuchWindowError',
91
- errorMsg: 'A request to switch to a different window could not be ' + 'satisfied because the window could not be found.',
92
- error: 'no such window',
93
- errorCode: 23
94
- }, {
95
- errorName: 'InvalidCookieDomainError',
96
- errorMsg: 'An illegal attempt was made to set a cookie under a different ' + 'domain than the current page.',
97
- error: 'invalid cookie domain',
98
- errorCode: 24
99
- }, {
100
- errorName: 'InvalidCoordinatesError',
101
- errorMsg: 'The coordinates provided to an interactions operation are invalid.',
102
- error: 'invalid coordinates'
103
- }, {
104
- errorName: 'UnableToSetCookieError',
105
- errorMsg: `A request to set a cookie's value could not be satisfied.`,
106
- error: 'unable to set cookie',
107
- errorCode: 25
108
- }, {
109
- errorName: 'UnexpectedAlertOpenError',
110
- errorMsg: 'A modal dialog was open, blocking this operation',
111
- error: 'unexpected alert open',
112
- errorCode: 26
113
- }, {
114
- errorName: 'NoAlertOpenError',
115
- errorMsg: 'An attempt was made to operate on a modal dialog when one was ' + 'not open.',
116
- errorCode: 27
117
- }, {
118
- errorName: 'ScriptTimeoutError',
119
- errorMsg: 'A script did not complete before its timeout expired.',
120
- error: 'script timeout',
121
- errorCode: 28
122
- }, {
123
- errorName: 'InvalidElementCoordinatesError',
124
- errorMsg: 'The coordinates provided to an interactions operation are ' + 'invalid.',
125
- errorCode: 29
126
- }, {
127
- errorName: 'IMENotAvailableError',
128
- errorMsg: 'IME was not available.',
129
- errorCode: 30
130
- }, {
131
- errorName: 'IMEEngineActivationFailedError',
132
- errorMsg: 'An IME engine could not be started.',
133
- errorCode: 31
134
- }, {
135
- errorName: 'InvalidSelectorError',
136
- errorMsg: 'Argument was an invalid selector (e.g. XPath/CSS).',
137
- error: 'invalid selector',
138
- errorCode: 32
139
- }, {
140
- errorName: 'SessionNotCreatedError',
141
- errorMsg: 'A new session could not be created.',
142
- error: 'session not created',
143
- errorCode: 33
144
- }, {
145
- errorName: 'MoveTargetOutOfBoundsError',
146
- errorMsg: 'Target provided for a move action is out of bounds.',
147
- error: 'move target out of bounds',
148
- errorCode: 34
149
- }, {
150
- errorName: 'NoSuchAlertError',
151
- errorMsg: 'An attempt was made to operate on a modal dialog when one was not open.',
152
- error: 'no such alert'
153
- }, {
154
- errorName: 'NoSuchCookieError',
155
- errorMsg: 'No cookie matching the given path name was found amongst the associated cookies of the current browsing context’s active document',
156
- error: 'no such cookie'
157
- }, {
158
- errorName: 'NotYetImplementedError',
159
- errorMsg: 'Method has not yet been implemented',
160
- error: 'unknown method',
161
- errorCode: 405
162
- }, {
163
- errorName: 'UnknownCommandError',
164
- errorMsg: 'The requested resource could not be found, or a request was received using an HTTP method that is not supported by the mapped resource.',
165
- error: 'unknown command'
166
- }, {
167
- errorName: 'UnknownMethodError',
168
- errorMsg: 'The requested command matched a known URL but did not match an method for that URL',
169
- error: 'unknown method'
170
- }, {
171
- errorName: 'UnsupportedOperationError',
172
- errorMsg: 'A server-side error occurred. Command cannot be supported.',
173
- error: 'unsupported operation'
174
- }];
175
- describe('errors', function () {
176
- for (let error of errorsList) {
177
- it(error.errorName + ' should have a JSONWP code or W3C code and message', function () {
178
- if (error.errorCode) {
179
- new _lib.errors[error.errorName]().should.have.property('jsonwpCode', error.errorCode);
180
- } else {
181
- new _lib.errors[error.errorName]().should.have.property('error', error.error);
182
- }
183
-
184
- new _lib.errors[error.errorName]().should.have.property('message', error.errorMsg);
185
- });
186
- }
187
-
188
- it('BadParametersError should not have code and should have messg', function () {
189
- new _lib.errors.BadParametersError().should.not.have.property('jsonwpCode');
190
- new _lib.errors.BadParametersError().should.have.property('message');
191
- });
192
- it('ProxyRequestError should have message and jsonwp', function () {
193
- new _lib.errors.ProxyRequestError().should.have.property('jsonwp');
194
- new _lib.errors.ProxyRequestError().should.have.property('message');
195
- });
196
- });
197
- describe('errorFromMJSONWPStatusCode', function () {
198
- for (let error of errorsList) {
199
- if (error.errorName !== 'NotYetImplementedError') {
200
- it(error.errorCode + ' should return correct error', function () {
201
- if (error.errorCode) {
202
- (0, _lib.errorFromMJSONWPStatusCode)(error.errorCode).should.have.property('jsonwpCode', error.errorCode);
203
- (0, _lib.errorFromMJSONWPStatusCode)(error.errorCode).should.have.property('message', error.errorMsg);
204
-
205
- if (!_lodash.default.includes([13, 33], error.errorCode)) {
206
- (0, _lib.errorFromMJSONWPStatusCode)(error.errorCode, 'abcd').should.have.property('jsonwpCode', error.errorCode);
207
- (0, _lib.errorFromMJSONWPStatusCode)(error.errorCode, 'abcd').should.have.property('message', 'abcd');
208
- }
209
- } else {
210
- (0, _lib.isErrorType)((0, _lib.errorFromMJSONWPStatusCode)(error.errorCode), _lib.errors.UnknownError).should.be.true;
211
- }
212
- });
213
- }
214
- }
215
-
216
- it('should throw unknown error for unknown code', function () {
217
- (0, _lib.errorFromMJSONWPStatusCode)(99).should.have.property('jsonwpCode', 13);
218
- (0, _lib.errorFromMJSONWPStatusCode)(99).should.have.property('message', 'An unknown server-side error occurred ' + 'while processing the command.');
219
- });
220
- });
221
- describe('errorFromW3CJsonCode', function () {
222
- for (let error of errorsList) {
223
- if (error.errorName !== 'NotYetImplementedError') {
224
- it(error.errorName + ' should return correct error', function () {
225
- const {
226
- error: w3cError
227
- } = error;
228
-
229
- if (w3cError) {
230
- (0, _lib.errorFromW3CJsonCode)(w3cError).error.should.equal(error.error);
231
- (0, _lib.errorFromW3CJsonCode)(w3cError).should.have.property('message', error.errorMsg);
232
- } else {
233
- (0, _lib.isErrorType)((0, _lib.errorFromW3CJsonCode)(w3cError), _lib.errors.UnknownError).should.be.true;
234
- }
235
- });
236
- }
237
- }
238
-
239
- it('should parse unknown errors', function () {
240
- (0, _lib.isErrorType)((0, _lib.errorFromW3CJsonCode)('not a real error code'), _lib.errors.UnknownError).should.be.true;
241
- (0, _lib.errorFromW3CJsonCode)('not a real error code').message.should.match(/An unknown server-side error occurred/);
242
- (0, _lib.errorFromW3CJsonCode)('not a real error code').error.should.equal('unknown error');
243
- });
244
- });
245
- describe('w3c Status Codes', function () {
246
- it('should match the correct error codes', function () {
247
- let non400Errors = [['NoSuchDriverError', 404], ['NoSuchFrameError', 404], ['NoAlertOpenError', 404], ['NoSuchWindowError', 404], ['StaleElementReferenceError', 404], ['JavaScriptError', 500], ['MoveTargetOutOfBoundsError', 500], ['NoSuchCookieError', 404], ['NoSuchElementError', 404], ['ScriptTimeoutError', 408], ['SessionNotCreatedError', 500], ['TimeoutError', 408], ['UnableToSetCookieError', 500], ['UnableToCaptureScreen', 500], ['UnexpectedAlertOpenError', 500], ['UnknownCommandError', 404], ['UnknownError', 500], ['UnknownMethodError', 405], ['UnsupportedOperationError', 500]];
248
-
249
- for (let [errorName, expectedErrorCode] of non400Errors) {
250
- _lib.errors[errorName].should.exist;
251
- new _lib.errors[errorName]().should.have.property('w3cStatus', expectedErrorCode);
252
- }
253
-
254
- new _lib.errors.ElementClickInterceptedError().should.have.property('w3cStatus', 400);
255
- });
256
- });
257
- describe('.getResponseForW3CError', function () {
258
- it('should return an error, message and stacktrace for just a generic exception', function () {
259
- try {
260
- throw new Error('Some random error');
261
- } catch (e) {
262
- const [httpStatus, httpResponseBody] = (0, _errors.getResponseForW3CError)(e);
263
- httpStatus.should.equal(500);
264
- const {
265
- error,
266
- message,
267
- stacktrace
268
- } = httpResponseBody.value;
269
- message.should.match(/Some random error/);
270
- error.should.equal('unknown error');
271
- stacktrace.should.match(/at getResponseForW3CError/);
272
- stacktrace.should.match(/Some random error/);
273
- stacktrace.should.match(/errors-specs.js/);
274
- }
275
- });
276
- it('should return an error, message and stacktrace for a NoSuchElementError', function () {
277
- const noSuchElementError = new _lib.errors.NoSuchElementError('specific error message');
278
- const [httpStatus, httpResponseBody] = (0, _errors.getResponseForW3CError)(noSuchElementError);
279
- httpStatus.should.equal(404);
280
- const {
281
- error,
282
- message,
283
- stacktrace
284
- } = httpResponseBody.value;
285
- error.should.equal('no such element');
286
- message.should.match(/specific error message/);
287
- stacktrace.should.match(/errors-specs.js/);
288
- });
289
- it('should handle BadParametersError', function () {
290
- const badParamsError = new _lib.errors.BadParametersError('__FOO__', '__BAR__', '__HELLO_WORLD__');
291
- const [httpStatus, httpResponseBody] = (0, _errors.getResponseForW3CError)(badParamsError);
292
- httpStatus.should.equal(400);
293
- const {
294
- error,
295
- message,
296
- stacktrace
297
- } = httpResponseBody.value;
298
- error.should.equal('invalid argument');
299
- message.should.match(/__BAR__/);
300
- message.should.match(/__HELLO_WORLD__/);
301
- stacktrace.should.match(/errors-specs.js/);
302
- });
303
- it('should translate JSONWP errors', function () {
304
- const [httpStatus, httpResponseBody] = (0, _errors.getResponseForW3CError)({
305
- status: 7,
306
- value: 'My custom message',
307
- sessionId: 'Fake Session Id'
308
- });
309
- httpStatus.should.equal(404);
310
- const {
311
- error,
312
- message,
313
- stacktrace
314
- } = httpResponseBody.value;
315
- message.should.equal('My custom message');
316
- error.should.equal('no such element');
317
- stacktrace.should.exist;
318
- });
319
- });
320
- describe('.getActualError', function () {
321
- describe('MJSONWP', function () {
322
- it('should map a status code 7 no such element error as a NoSuchElementError', function () {
323
- const actualError = new _lib.errors.ProxyRequestError('Error message does not matter', {
324
- value: 'does not matter',
325
- status: 7
326
- }).getActualError();
327
- (0, _lib.isErrorType)(actualError, _lib.errors.NoSuchElementError).should.be.true;
328
- });
329
- it('should map a status code 10, StaleElementReferenceError', function () {
330
- const actualError = new _lib.errors.ProxyRequestError('Error message does not matter', {
331
- value: 'Does not matter',
332
- status: 10
333
- }).getActualError();
334
- (0, _lib.isErrorType)(actualError, _lib.errors.StaleElementReferenceError).should.be.true;
335
- });
336
- it('should map an unknown error to UnknownError', function () {
337
- const actualError = new _lib.errors.ProxyRequestError('Error message does not matter', {
338
- value: 'Does not matter',
339
- status: -100
340
- }).getActualError();
341
- (0, _lib.isErrorType)(actualError, _lib.errors.UnknownError).should.be.true;
342
- });
343
- it('should parse a JSON string', function () {
344
- const actualError = new _lib.errors.ProxyRequestError('Error message does not matter', JSON.stringify({
345
- value: 'Does not matter',
346
- status: -100
347
- })).getActualError();
348
- (0, _lib.isErrorType)(actualError, _lib.errors.UnknownError).should.be.true;
349
- });
350
- });
351
- describe('W3C', function () {
352
- it('should map a 404 no such element error as a NoSuchElementError', function () {
353
- const actualError = new _lib.errors.ProxyRequestError('Error message does not matter', {
354
- value: {
355
- error: _lib.errors.NoSuchElementError.error()
356
- }
357
- }, _httpStatusCodes.StatusCodes.NOT_FOUND).getActualError();
358
- (0, _lib.isErrorType)(actualError, _lib.errors.NoSuchElementError).should.be.true;
359
- });
360
- it('should map a 400 StaleElementReferenceError', function () {
361
- const actualError = new _lib.errors.ProxyRequestError('Error message does not matter', {
362
- value: {
363
- error: _lib.errors.StaleElementReferenceError.error()
364
- }
365
- }, _httpStatusCodes.StatusCodes.BAD_REQUEST).getActualError();
366
- (0, _lib.isErrorType)(actualError, _lib.errors.StaleElementReferenceError).should.be.true;
367
- });
368
- it('should map an unknown error to UnknownError', function () {
369
- const actualError = new _lib.errors.ProxyRequestError('Error message does not matter', null, {
370
- value: {
371
- error: 'Not a valid w3c JSON code'
372
- }
373
- }, 456).getActualError();
374
- (0, _lib.isErrorType)(actualError, _lib.errors.UnknownError).should.be.true;
375
- });
376
- it('should parse a JSON string', function () {
377
- const actualError = new _lib.errors.ProxyRequestError('Error message does not matter', JSON.stringify({
378
- value: {
379
- error: _lib.errors.StaleElementReferenceError.error()
380
- }
381
- }), _httpStatusCodes.StatusCodes.BAD_REQUEST).getActualError();
382
- (0, _lib.isErrorType)(actualError, _lib.errors.StaleElementReferenceError).should.be.true;
383
- });
384
- });
385
- });require('source-map-support').install();
386
-
387
-
388
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvcHJvdG9jb2wvZXJyb3JzLXNwZWNzLmpzIl0sIm5hbWVzIjpbImVycm9yc0xpc3QiLCJlcnJvck5hbWUiLCJlcnJvck1zZyIsImVycm9yIiwiZXJyb3JDb2RlIiwiZGVzY3JpYmUiLCJpdCIsImVycm9ycyIsInNob3VsZCIsImhhdmUiLCJwcm9wZXJ0eSIsIkJhZFBhcmFtZXRlcnNFcnJvciIsIm5vdCIsIlByb3h5UmVxdWVzdEVycm9yIiwiXyIsImluY2x1ZGVzIiwiVW5rbm93bkVycm9yIiwiYmUiLCJ0cnVlIiwidzNjRXJyb3IiLCJlcXVhbCIsIm1lc3NhZ2UiLCJtYXRjaCIsIm5vbjQwMEVycm9ycyIsImV4cGVjdGVkRXJyb3JDb2RlIiwiZXhpc3QiLCJFbGVtZW50Q2xpY2tJbnRlcmNlcHRlZEVycm9yIiwiRXJyb3IiLCJlIiwiaHR0cFN0YXR1cyIsImh0dHBSZXNwb25zZUJvZHkiLCJzdGFja3RyYWNlIiwidmFsdWUiLCJub1N1Y2hFbGVtZW50RXJyb3IiLCJOb1N1Y2hFbGVtZW50RXJyb3IiLCJiYWRQYXJhbXNFcnJvciIsInN0YXR1cyIsInNlc3Npb25JZCIsImFjdHVhbEVycm9yIiwiZ2V0QWN0dWFsRXJyb3IiLCJTdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJIVFRQU3RhdHVzQ29kZXMiLCJOT1RfRk9VTkQiLCJCQURfUkVRVUVTVCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBS0EsSUFBSUEsVUFBVSxHQUFHLENBQ2Y7QUFDRUMsRUFBQUEsU0FBUyxFQUFFLG1CQURiO0FBRUVDLEVBQUFBLFFBQVEsRUFBRSwrQ0FGWjtBQUdFQyxFQUFBQSxLQUFLLEVBQUUsb0JBSFQ7QUFJRUMsRUFBQUEsU0FBUyxFQUFFO0FBSmIsQ0FEZSxFQU9mO0FBQ0VILEVBQUFBLFNBQVMsRUFBRSw4QkFEYjtBQUVFQyxFQUFBQSxRQUFRLEVBQUUsK0lBRlo7QUFHRUMsRUFBQUEs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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBlcnJvcnMsIGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlLCBlcnJvckZyb21XM0NKc29uQ29kZSwgaXNFcnJvclR5cGVcbn0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCB7IGdldFJlc3BvbnNlRm9yVzNDRXJyb3IgfSBmcm9tICcuLi8uLi9saWIvcHJvdG9jb2wvZXJyb3JzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBTdGF0dXNDb2RlcyBhcyBIVFRQU3RhdHVzQ29kZXMgfSBmcm9tICdodHRwLXN0YXR1cy1jb2Rlcyc7XG5cblxuLy8gRXJyb3IgY29kZXMgYW5kIG1lc3NhZ2VzIGhhdmUgYmVlbiBhZGRlZCBhY2NvcmRpbmcgdG8gSnNvbldpcmVQcm90b2NvbCBzZWVcbi8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3Avc2VsZW5pdW0vd2lraS9Kc29uV2lyZVByb3RvY29sI1Jlc3BvbnNlX1N0YXR1c19Db2Rlc1xubGV0IGVycm9yc0xpc3QgPSBbXG4gIHtcbiAgICBlcnJvck5hbWU6ICdOb1N1Y2hEcml2ZXJFcnJvcicsXG4gICAgZXJyb3JNc2c6ICdBIHNlc3Npb24gaXMgZWl0aGVyIHRlcm1pbmF0ZWQgb3Igbm90IHN0YXJ0ZWQnLFxuICAgIGVycm9yOiAnaW52YWxpZCBzZXNzaW9uIGlkJyxcbiAgICBlcnJvckNvZGU6IDZcbiAgfSxcbiAge1xuICAgIGVycm9yTmFtZTogJ0VsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3InLFxuICAgIGVycm9yTXNnOiAnVGhlIEVsZW1lbnQgQ2xpY2sgY29tbWFuZCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGJlY2F1c2UgdGhlIGVsZW1lbnQgcmVjZWl2aW5nIHRoZSBldmVudHMgaXMgb2JzY3VyaW5nIHRoZSBlbGVtZW50IHRoYXQgd2FzIHJlcXVlc3RlZCBjbGlja2VkJyxcbiAgICBlcnJvcjogJ2VsZW1lbnQgY2xpY2sgaW50ZXJjZXB0ZWQnLFxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnRWxlbWVudE5vdEludGVyYWN0YWJsZUVycm9yJyxcbiAgICBlcnJvck1zZzogJ0EgY29tbWFuZCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGJlY2F1c2UgdGhlIGVsZW1lbnQgaXMgbm90IHBvaW50ZXItIG9yIGtleWJvYXJkIGludGVyYWN0YWJsZScsXG4gICAgZXJyb3I6ICdlbGVtZW50IG5vdCBpbnRlcmFjdGFibGUnLFxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnSW5zZWN1cmVDZXJ0aWZpY2F0ZUVycm9yJyxcbiAgICBlcnJvck1zZzogJ05hdmlnYXRpb24gY2F1c2VkIHRoZSB1c2VyIGFnZW50IHRvIGhpdCBhIGNlcnRpZmljYXRlIHdhcm5pbmcsIHdoaWNoIGlzIHVzdWFsbHkgdGhlIHJlc3VsdCBvZiBhbiBleHBpcmVkIG9yIGludmFsaWQgVExTIGNlcnRpZmljYXRlJyxcbiAgICBlcnJvcjogJ2luc2VjdXJlIGNlcnRpZmljYXRlJyxcbiAgfSxcbiAge1xuICAgIGVycm9yTmFtZTogJ0ludmFsaWRBcmd1bWVudEVycm9yJyxcbiAgICBlcnJvck1zZzogJ1RoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBjb21tYW5kIGFyZSBlaXRoZXIgaW52YWxpZCBvciBtYWxmb3JtZWQnLFxuICAgIGVycm9yOiAnaW52YWxpZCBhcmd1bWVudCcsXG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdOb1N1Y2hFbGVtZW50RXJyb3InLFxuICAgIGVycm9yTXNnOiAnQW4gZWxlbWVudCBjb3VsZCBub3QgYmUgbG9jYXRlZCBvbiB0aGUgcGFnZSB1c2luZyB0aGUgJyArXG4gICAgICAgICdnaXZlbiBzZWFyY2ggcGFyYW1ldGVycy4nLFxuICAgIGVycm9yOiAnbm8gc3VjaCBlbGVtZW50JyxcbiAgICBlcnJvckNvZGU6IDdcbiAgfSxcbiAge1xuICAgIGVycm9yTmFtZTogJ05vU3VjaEZyYW1lRXJyb3InLFxuICAgIGVycm9yTXNnOiAnQSByZXF1ZXN0IHRvIHN3aXRjaCB0byBhIGZyYW1lIGNvdWxkIG5vdCBiZSBzYXRpc2ZpZWQgJyArXG4gICAgICAgICdiZWNhdXNlIHRoZSBmcmFtZSBjb3VsZCBub3QgYmUgZm91bmQuJyxcbiAgICBlcnJvcjogJ25vIHN1Y2ggZnJhbWUnLFxuICAgIGVycm9yQ29kZTogOFxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnVW5rbm93bkNvbW1hbmRFcnJvcicsXG4gICAgZXJyb3JNc2c6ICdUaGUgcmVxdWVzdGVkIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZCwgb3IgYSByZXF1ZXN0ICcgK1xuICAgICAgICAnd2FzIHJlY2VpdmVkIHVzaW5nIGFuIEhUVFAgbWV0aG9kIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSAnICtcbiAgICAgICAgJ3RoZSBtYXBwZWQgcmVzb3VyY2UuJyxcbiAgICBlcnJvcjogJ3Vua25vd24gY29tbWFuZCcsXG4gICAgZXJyb3JDb2RlOiA5XG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdTdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvcicsXG4gICAgZXJyb3JNc2c6ICdBbiBlbGVtZW50IGNvbW1hbmQgZmFpbGVkIGJlY2F1c2UgdGhlIHJlZmVyZW5jZWQgZWxlbWVudCBpcyAnICtcbiAgICAgICAgJ25vIGxvbmdlciBhdHRhY2hlZCB0byB0aGUgRE9NLicsXG4gICAgZXJyb3I6ICdzdGFsZSBlbGVtZW50IHJlZmVyZW5jZScsXG4gICAgZXJyb3JDb2RlOiAxMFxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnRWxlbWVudE5vdFZpc2libGVFcnJvcicsXG4gICAgZXJyb3JNc2c6ICdBbiBlbGVtZW50IGNvbW1hbmQgY291bGQgbm90IGJlIGNvbXBsZXRlZCBiZWNhdXNlIHRoZSAnICtcbiAgICAgICAgJ2VsZW1lbnQgaXMgbm90IHZpc2libGUgb24gdGhlIHBhZ2UuJyxcbiAgICBlcnJvckNvZGU6IDExXG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdJbnZhbGlkRWxlbWVudFN0YXRlRXJyb3InLFxuICAgIGVycm9yTXNnOiAnQW4gZWxlbWVudCBjb21tYW5kIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgYmVjYXVzZSB0aGUgZWxlbWVudCAnICtcbiAgICAgICAgJ2lzIGluIGFuIGludmFsaWQgc3RhdGUgKGUuZy4gYXR0ZW1wdGluZyB0byBjbGljayBhIGRpc2FibGVkICcgK1xuICAgICAgICAnZWxlbWVudCkuJyxcbiAgICBlcnJvcjogJ2ludmFsaWQgZWxlbWVudCBzdGF0ZScsXG4gICAgZXJyb3JDb2RlOiAxMlxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnVW5rbm93bkVycm9yJyxcbiAgICBlcnJvck1zZzogJ0FuIHVua25vd24gc2VydmVyLXNpZGUgZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgJyArXG4gICAgICAgICdjb21tYW5kLicsXG4gICAgZXJyb3I6ICd1bmtub3duIGVycm9yJyxcbiAgICBlcnJvckNvZGU6IDEzXG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdFbGVtZW50SXNOb3RTZWxlY3RhYmxlRXJyb3InLFxuICAgIGVycm9yTXNnOiAnQW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBzZWxlY3QgYW4gZWxlbWVudCB0aGF0IGNhbm5vdCAnICtcbiAgICAgICAgJ2JlIHNlbGVjdGVkLicsXG4gICAgZXJyb3I6ICdlbGVtZW50IG5vdCBzZWxlY3RhYmxlJyxcbiAgICBlcnJvckNvZGU6IDE1XG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdKYXZhU2NyaXB0RXJyb3InLFxuICAgIGVycm9yTXNnOiAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZXhlY3V0aW5nIHVzZXIgc3VwcGxpZWQgSmF2YVNjcmlwdC4nLFxuICAgIGVycm9yOiAnamF2YXNjcmlwdCBlcnJvcicsXG4gICAgZXJyb3JDb2RlOiAxN1xuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnWFBhdGhMb29rdXBFcnJvcicsXG4gICAgZXJyb3JNc2c6ICdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzZWFyY2hpbmcgZm9yIGFuIGVsZW1lbnQgYnkgWFBhdGguJyxcbiAgICBlcnJvckNvZGU6IDE5XG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdUaW1lb3V0RXJyb3InLFxuICAgIGVycm9yTXNnOiAnQW4gb3BlcmF0aW9uIGRpZCBub3QgY29tcGxldGUgYmVmb3JlIGl0cyB0aW1lb3V0IGV4cGlyZWQuJyxcbiAgICBlcnJvcjogJ3RpbWVvdXQnLFxuICAgIGVycm9yQ29kZTogMjFcbiAgfSxcbiAge1xuICAgIGVycm9yTmFtZTogJ05vU3VjaFdpbmRvd0Vycm9yJyxcbiAgICBlcnJvck1zZzogJ0EgcmVxdWVzdCB0byBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgd2luZG93IGNvdWxkIG5vdCBiZSAnICtcbiAgICAgICAgJ3NhdGlzZmllZCBiZWNhdXNlIHRoZSB3aW5kb3cgY291bGQgbm90IGJlIGZvdW5kLicsXG4gICAgZXJyb3I6ICdubyBzdWNoIHdpbmRvdycsXG4gICAgZXJyb3JDb2RlOiAyM1xuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnSW52YWxpZENvb2tpZURvbWFpbkVycm9yJyxcbiAgICBlcnJvck1zZzogJ0FuIGlsbGVnYWwgYXR0ZW1wdCB3YXMgbWFkZSB0byBzZXQgYSBjb29raWUgdW5kZXIgYSBkaWZmZXJlbnQgJyArXG4gICAgICAgICdkb21haW4gdGhhbiB0aGUgY3VycmVudCBwYWdlLicsXG4gICAgZXJyb3I6ICdpbnZhbGlkIGNvb2tpZSBkb21haW4nLFxuICAgIGVycm9yQ29kZTogMjRcbiAgfSxcbiAge1xuICAgIGVycm9yTmFtZTogJ0ludmFsaWRDb29yZGluYXRlc0Vycm9yJyxcbiAgICBlcnJvck1zZzogJ1RoZSBjb29yZGluYXRlcyBwcm92aWRlZCB0byBhbiBpbnRlcmFjdGlvbnMgb3BlcmF0aW9uIGFyZSBpbnZhbGlkLicsXG4gICAgZXJyb3I6ICdpbnZhbGlkIGNvb3JkaW5hdGVzJyxcbiAgfSxcbiAge1xuICAgIGVycm9yTmFtZTogJ1VuYWJsZVRvU2V0Q29va2llRXJyb3InLFxuICAgIGVycm9yTXNnOiBgQSByZXF1ZXN0IHRvIHNldCBhIGNvb2tpZSdzIHZhbHVlIGNvdWxkIG5vdCBiZSBzYXRpc2ZpZWQuYCxcbiAgICBlcnJvcjogJ3VuYWJsZSB0byBzZXQgY29va2llJyxcbiAgICBlcnJvckNvZGU6IDI1XG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdVbmV4cGVjdGVkQWxlcnRPcGVuRXJyb3InLFxuICAgIGVycm9yTXNnOiAnQSBtb2RhbCBkaWFsb2cgd2FzIG9wZW4sIGJsb2NraW5nIHRoaXMgb3BlcmF0aW9uJyxcbiAgICBlcnJvcjogJ3VuZXhwZWN0ZWQgYWxlcnQgb3BlbicsXG4gICAgZXJyb3JDb2RlOiAyNlxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnTm9BbGVydE9wZW5FcnJvcicsXG4gICAgZXJyb3JNc2c6ICdBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIG9wZXJhdGUgb24gYSBtb2RhbCBkaWFsb2cgd2hlbiBvbmUgd2FzICcgK1xuICAgICAgICAnbm90IG9wZW4uJyxcbiAgICBlcnJvckNvZGU6IDI3XG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdTY3JpcHRUaW1lb3V0RXJyb3InLFxuICAgIGVycm9yTXNnOiAnQSBzY3JpcHQgZGlkIG5vdCBjb21wbGV0ZSBiZWZvcmUgaXRzIHRpbWVvdXQgZXhwaXJlZC4nLFxuICAgIGVycm9yOiAnc2NyaXB0IHRpbWVvdXQnLFxuICAgIGVycm9yQ29kZTogMjhcbiAgfSxcbiAge1xuICAgIGVycm9yTmFtZTogJ0ludmFsaWRFbGVtZW50Q29vcmRpbmF0ZXNFcnJvcicsXG4gICAgZXJyb3JNc2c6ICdUaGUgY29vcmRpbmF0ZXMgcHJvdmlkZWQgdG8gYW4gaW50ZXJhY3Rpb25zIG9wZXJhdGlvbiBhcmUgJyArXG4gICAgICAgICdpbnZhbGlkLicsXG4gICAgZXJyb3JDb2RlOiAyOVxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnSU1FTm90QXZhaWxhYmxlRXJyb3InLFxuICAgIGVycm9yTXNnOiAnSU1FIHdhcyBub3QgYXZhaWxhYmxlLicsXG4gICAgZXJyb3JDb2RlOiAzMFxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnSU1FRW5naW5lQWN0aXZhdGlvbkZhaWxlZEVycm9yJyxcbiAgICBlcnJvck1zZzogJ0FuIElNRSBlbmdpbmUgY291bGQgbm90IGJlIHN0YXJ0ZWQuJyxcbiAgICBlcnJvckNvZGU6IDMxXG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdJbnZhbGlkU2VsZWN0b3JFcnJvcicsXG4gICAgZXJyb3JNc2c6ICdBcmd1bWVudCB3YXMgYW4gaW52YWxpZCBzZWxlY3RvciAoZS5nLiBYUGF0aC9DU1MpLicsXG4gICAgZXJyb3I6ICdpbnZhbGlkIHNlbGVjdG9yJyxcbiAgICBlcnJvckNvZGU6IDMyXG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdTZXNzaW9uTm90Q3JlYXRlZEVycm9yJyxcbiAgICBlcnJvck1zZzogJ0EgbmV3IHNlc3Npb24gY291bGQgbm90IGJlIGNyZWF0ZWQuJyxcbiAgICBlcnJvcjogJ3Nlc3Npb24gbm90IGNyZWF0ZWQnLFxuICAgIGVycm9yQ29kZTogMzNcbiAgfSxcbiAge1xuICAgIGVycm9yTmFtZTogJ01vdmVUYXJnZXRPdXRPZkJvdW5kc0Vycm9yJyxcbiAgICBlcnJvck1zZzogJ1RhcmdldCBwcm92aWRlZCBmb3IgYSBtb3ZlIGFjdGlvbiBpcyBvdXQgb2YgYm91bmRzLicsXG4gICAgZXJyb3I6ICdtb3ZlIHRhcmdldCBvdXQgb2YgYm91bmRzJyxcbiAgICBlcnJvckNvZGU6IDM0XG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdOb1N1Y2hBbGVydEVycm9yJyxcbiAgICBlcnJvck1zZzogJ0FuIGF0dGVtcHQgd2FzIG1hZGUgdG8gb3BlcmF0ZSBvbiBhIG1vZGFsIGRpYWxvZyB3aGVuIG9uZSB3YXMgbm90IG9wZW4uJyxcbiAgICBlcnJvcjogJ25vIHN1Y2ggYWxlcnQnLFxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnTm9TdWNoQ29va2llRXJyb3InLFxuICAgIGVycm9yTXNnOiAnTm8gY29va2llIG1hdGNoaW5nIHRoZSBnaXZlbiBwYXRoIG5hbWUgd2FzIGZvdW5kIGFtb25nc3QgdGhlIGFzc29jaWF0ZWQgY29va2llcyBvZiB0aGUgY3VycmVudCBicm93c2luZyBjb250ZXh04oCZcyBhY3RpdmUgZG9jdW1lbnQnLFxuICAgIGVycm9yOiAnbm8gc3VjaCBjb29raWUnLFxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnTm90WWV0SW1wbGVtZW50ZWRFcnJvcicsXG4gICAgZXJyb3JNc2c6ICdNZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZCcsXG4gICAgZXJyb3I6ICd1bmtub3duIG1ldGhvZCcsXG4gICAgZXJyb3JDb2RlOiA0MDVcbiAgfSxcbiAge1xuICAgIGVycm9yTmFtZTogJ1Vua25vd25Db21tYW5kRXJyb3InLFxuICAgIGVycm9yTXNnOiAnVGhlIHJlcXVlc3RlZCByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQsIG9yIGEgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgdXNpbmcgYW4gSFRUUCBtZXRob2QgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBtYXBwZWQgcmVzb3VyY2UuJyxcbiAgICBlcnJvcjogJ3Vua25vd24gY29tbWFuZCcsXG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdVbmtub3duTWV0aG9kRXJyb3InLFxuICAgIGVycm9yTXNnOiAnVGhlIHJlcXVlc3RlZCBjb21tYW5kIG1hdGNoZWQgYSBrbm93biBVUkwgYnV0IGRpZCBub3QgbWF0Y2ggYW4gbWV0aG9kIGZvciB0aGF0IFVSTCcsXG4gICAgZXJyb3I6ICd1bmtub3duIG1ldGhvZCcsXG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yJyxcbiAgICBlcnJvck1zZzogJ0Egc2VydmVyLXNpZGUgZXJyb3Igb2NjdXJyZWQuIENvbW1hbmQgY2Fubm90IGJlIHN1cHBvcnRlZC4nLFxuICAgIGVycm9yOiAndW5zdXBwb3J0ZWQgb3BlcmF0aW9uJyxcbiAgfSxcbl07XG5cbmRlc2NyaWJlKCdlcnJvcnMnLCBmdW5jdGlvbiAoKSB7XG4gIGZvciAobGV0IGVycm9yIG9mIGVycm9yc0xpc3QpIHtcbiAgICBpdChlcnJvci5lcnJvck5hbWUgKyAnIHNob3VsZCBoYXZlIGEgSlNPTldQIGNvZGUgb3IgVzNDIGNvZGUgYW5kIG1lc3NhZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZXJyb3IuZXJyb3JDb2RlKSB7XG4gICAgICAgIG5ldyBlcnJvcnNbZXJyb3IuZXJyb3JOYW1lXSgpXG4gICAgICAgICAgLnNob3VsZC5oYXZlLnByb3BlcnR5KCdqc29ud3BDb2RlJywgZXJyb3IuZXJyb3JDb2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ldyBlcnJvcnNbZXJyb3IuZXJyb3JOYW1lXSgpXG4gICAgICAgICAgLnNob3VsZC5oYXZlLnByb3BlcnR5KCdlcnJvcicsIGVycm9yLmVycm9yKTtcbiAgICAgIH1cbiAgICAgIG5ldyBlcnJvcnNbZXJyb3IuZXJyb3JOYW1lXSgpXG4gICAgICAgIC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbWVzc2FnZScsIGVycm9yLmVycm9yTXNnKTtcbiAgICB9KTtcbiAgfVxuICBpdCgnQmFkUGFyYW1ldGVyc0Vycm9yIHNob3VsZCBub3QgaGF2ZSBjb2RlIGFuZCBzaG91bGQgaGF2ZSBtZXNzZycsIGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgZXJyb3JzLkJhZFBhcmFtZXRlcnNFcnJvcigpXG4gICAgICAuc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCdqc29ud3BDb2RlJyk7XG4gICAgbmV3IGVycm9ycy5CYWRQYXJhbWV0ZXJzRXJyb3IoKVxuICAgICAgLnNob3VsZC5oYXZlLnByb3BlcnR5KCdtZXNzYWdlJyk7XG4gIH0pO1xuICBpdCgnUHJveHlSZXF1ZXN0RXJyb3Igc2hvdWxkIGhhdmUgbWVzc2FnZSBhbmQganNvbndwJywgZnVuY3Rpb24gKCkge1xuICAgIG5ldyBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IoKVxuICAgICAgICAuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2pzb253cCcpO1xuICAgIG5ldyBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IoKVxuICAgICAgICAuc2hvdWxkLmhhdmUucHJvcGVydHkoJ21lc3NhZ2UnKTtcbiAgfSk7XG59KTtcbmRlc2NyaWJlKCdlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZScsIGZ1bmN0aW9uICgpIHtcbiAgZm9yIChsZXQgZXJyb3Igb2YgZXJyb3JzTGlzdCkge1xuICAgIGlmIChlcnJvci5lcnJvck5hbWUgIT09ICdOb3RZZXRJbXBsZW1lbnRlZEVycm9yJykge1xuICAgICAgaXQoZXJyb3IuZXJyb3JDb2RlICsgJyBzaG91bGQgcmV0dXJuIGNvcnJlY3QgZXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChlcnJvci5lcnJvckNvZGUpIHtcbiAgICAgICAgICBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZShlcnJvci5lcnJvckNvZGUpXG4gICAgICAgICAgICAuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2pzb253cENvZGUnLCBlcnJvci5lcnJvckNvZGUpO1xuICAgICAgICAgIGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlKGVycm9yLmVycm9yQ29kZSlcbiAgICAgICAgICAgIC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbWVzc2FnZScsIGVycm9yLmVycm9yTXNnKTtcbiAgICAgICAgICBpZiAoIV8uaW5jbHVkZXMoWzEzLCAzM10sIGVycm9yLmVycm9yQ29kZSkpIHtcbiAgICAgICAgICAgIGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlKGVycm9yLmVycm9yQ29kZSwgJ2FiY2QnKVxuICAgICAgICAgICAgICAuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2pzb253cENvZGUnLCBlcnJvci5lcnJvckNvZGUpO1xuICAgICAgICAgICAgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUoZXJyb3IuZXJyb3JDb2RlLCAnYWJjZCcpXG4gICAgICAgICAgICAgIC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbWVzc2FnZScsICdhYmNkJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzRXJyb3JUeXBlKGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlKGVycm9yLmVycm9yQ29kZSksIGVycm9ycy5Vbmtub3duRXJyb3IpLnNob3VsZC5iZS50cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaXQoJ3Nob3VsZCB0aHJvdyB1bmtub3duIGVycm9yIGZvciB1bmtub3duIGNvZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUoOTkpXG4gICAgICAuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2pzb253cENvZGUnLCAxMyk7XG4gICAgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUoOTkpXG4gICAgICAuc2hvdWxkLmhhdmUucHJvcGVydHkoJ21lc3NhZ2UnLCAnQW4gdW5rbm93biBzZXJ2ZXItc2lkZSBlcnJvciBvY2N1cnJlZCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGlsZSBwcm9jZXNzaW5nIHRoZSBjb21tYW5kLicpO1xuICB9KTtcbn0pO1xuZGVzY3JpYmUoJ2Vycm9yRnJvbVczQ0pzb25Db2RlJywgZnVuY3Rpb24gKCkge1xuICBmb3IgKGxldCBlcnJvciBvZiBlcnJvcnNMaXN0KSB7XG4gICAgaWYgKGVycm9yLmVycm9yTmFtZSAhPT0gJ05vdFlldEltcGxlbWVudGVkRXJyb3InKSB7XG4gICAgICBpdChlcnJvci5lcnJvck5hbWUgKyAnIHNob3VsZCByZXR1cm4gY29ycmVjdCBlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qge2Vycm9yOiB3M2NFcnJvcn0gPSBlcnJvcjtcbiAgICAgICAgaWYgKHczY0Vycm9yKSB7XG4gICAgICAgICAgZXJyb3JGcm9tVzNDSnNvbkNvZGUodzNjRXJyb3IpLmVycm9yLnNob3VsZC5lcXVhbChlcnJvci5lcnJvcik7XG4gICAgICAgICAgZXJyb3JGcm9tVzNDSnNvbkNvZGUodzNjRXJyb3IpLnNob3VsZC5oYXZlLnByb3BlcnR5KCdtZXNzYWdlJywgZXJyb3IuZXJyb3JNc2cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzRXJyb3JUeXBlKGVycm9yRnJvbVczQ0pzb25Db2RlKHczY0Vycm9yKSwgZXJyb3JzLlVua25vd25FcnJvcikuc2hvdWxkLmJlLnRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpdCgnc2hvdWxkIHBhcnNlIHVua25vd24gZXJyb3JzJywgZnVuY3Rpb24gKCkge1xuICAgIGlzRXJyb3JUeXBlKGVycm9yRnJvbVczQ0pzb25Db2RlKCdub3QgYSByZWFsIGVycm9yIGNvZGUnKSwgZXJyb3JzLlVua25vd25FcnJvcikuc2hvdWxkLmJlLnRydWU7XG4gICAgZXJyb3JGcm9tVzNDSnNvbkNvZGUoJ25vdCBhIHJlYWwgZXJyb3IgY29kZScpLm1lc3NhZ2Uuc2hvdWxkLm1hdGNoKC9BbiB1bmtub3duIHNlcnZlci1zaWRlIGVycm9yIG9jY3VycmVkLyk7XG4gICAgZXJyb3JGcm9tVzNDSnNvbkNvZGUoJ25vdCBhIHJlYWwgZXJyb3IgY29kZScpLmVycm9yLnNob3VsZC5lcXVhbCgndW5rbm93biBlcnJvcicpO1xuICB9KTtcbn0pO1xuZGVzY3JpYmUoJ3czYyBTdGF0dXMgQ29kZXMnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdzaG91bGQgbWF0Y2ggdGhlIGNvcnJlY3QgZXJyb3IgY29kZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IG5vbjQwMEVycm9ycyA9IFtcbiAgICAgIFsnTm9TdWNoRHJpdmVyRXJyb3InLCA0MDRdLFxuICAgICAgWydOb1N1Y2hGcmFtZUVycm9yJywgNDA0XSxcbiAgICAgIFsnTm9BbGVydE9wZW5FcnJvcicsIDQwNF0sXG4gICAgICBbJ05vU3VjaFdpbmRvd0Vycm9yJywgNDA0XSxcbiAgICAgIFsnU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3InLCA0MDRdLFxuICAgICAgWydKYXZhU2NyaXB0RXJyb3InLCA1MDBdLFxuICAgICAgWydNb3ZlVGFyZ2V0T3V0T2ZCb3VuZHNFcnJvcicsIDUwMF0sXG4gICAgICBbJ05vU3VjaENvb2tpZUVycm9yJywgNDA0XSxcbiAgICAgIFsnTm9TdWNoRWxlbWVudEVycm9yJywgNDA0XSxcbiAgICAgIFsnU2NyaXB0VGltZW91dEVycm9yJywgNDA4XSxcbiAgICAgIFsnU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcicsIDUwMF0sXG4gICAgICBbJ1RpbWVvdXRFcnJvcicsIDQwOF0sXG4gICAgICBbJ1VuYWJsZVRvU2V0Q29va2llRXJyb3InLCA1MDBdLFxuICAgICAgWydVbmFibGVUb0NhcHR1cmVTY3JlZW4nLCA1MDBdLFxuICAgICAgWydVbmV4cGVjdGVkQWxlcnRPcGVuRXJyb3InLCA1MDBdLFxuICAgICAgWydVbmtub3duQ29tbWFuZEVycm9yJywgNDA0XSxcbiAgICAgIFsnVW5rbm93bkVycm9yJywgNTAwXSxcbiAgICAgIFsnVW5rbm93bk1ldGhvZEVycm9yJywgNDA1XSxcbiAgICAgIFsnVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcicsIDUwMF0sXG4gICAgXTtcblxuICAgIC8vIFRlc3QgdGhlIGVycm9ycyB0aGF0IHdlIGRvbid0IGV4cGVjdCB0byByZXR1cm4gNDAwIGNvZGVcbiAgICBmb3IgKGxldCBbZXJyb3JOYW1lLCBleHBlY3RlZEVycm9yQ29kZV0gb2Ygbm9uNDAwRXJyb3JzKSB7XG4gICAgICBlcnJvcnNbZXJyb3JOYW1lXS5zaG91bGQuZXhpc3Q7XG4gICAgICAobmV3IGVycm9yc1tlcnJvck5hbWVdKCkpLnNob3VsZC5oYXZlLnByb3BlcnR5KCd3M2NTdGF0dXMnLCBleHBlY3RlZEVycm9yQ29kZSk7XG4gICAgfVxuXG4gICAgLy8gVGVzdCBhbiBlcnJvciB0aGF0IHdlIGV4cGVjdCB0byByZXR1cm4gNDAwIGNvZGVcbiAgICAobmV3IGVycm9ycy5FbGVtZW50Q2xpY2tJbnRlcmNlcHRlZEVycm9yKCkpLnNob3VsZC5oYXZlLnByb3BlcnR5KCd3M2NTdGF0dXMnLCA0MDApO1xuICB9KTtcbn0pO1xuZGVzY3JpYmUoJy5nZXRSZXNwb25zZUZvclczQ0Vycm9yJywgZnVuY3Rpb24gKCkge1xuICBpdCgnc2hvdWxkIHJldHVybiBhbiBlcnJvciwgbWVzc2FnZSBhbmQgc3RhY2t0cmFjZSBmb3IganVzdCBhIGdlbmVyaWMgZXhjZXB0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvbWUgcmFuZG9tIGVycm9yJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgW2h0dHBTdGF0dXMsIGh0dHBSZXNwb25zZUJvZHldID0gZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcihlKTtcbiAgICAgIGh0dHBTdGF0dXMuc2hvdWxkLmVxdWFsKDUwMCk7XG4gICAgICBjb25zdCB7ZXJyb3IsIG1lc3NhZ2UsIHN0YWNrdHJhY2V9ID0gaHR0cFJlc3BvbnNlQm9keS52YWx1ZTtcbiAgICAgIG1lc3NhZ2Uuc2hvdWxkLm1hdGNoKC9Tb21lIHJhbmRvbSBlcnJvci8pO1xuICAgICAgZXJyb3Iuc2hvdWxkLmVxdWFsKCd1bmtub3duIGVycm9yJyk7XG4gICAgICBzdGFja3RyYWNlLnNob3VsZC5tYXRjaCgvYXQgZ2V0UmVzcG9uc2VGb3JXM0NFcnJvci8pO1xuICAgICAgc3RhY2t0cmFjZS5zaG91bGQubWF0Y2goL1NvbWUgcmFuZG9tIGVycm9yLyk7XG4gICAgICBzdGFja3RyYWNlLnNob3VsZC5tYXRjaCgvZXJyb3JzLXNwZWNzLmpzLyk7XG4gICAgfVxuICB9KTtcbiAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gZXJyb3IsIG1lc3NhZ2UgYW5kIHN0YWNrdHJhY2UgZm9yIGEgTm9TdWNoRWxlbWVudEVycm9yJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG5vU3VjaEVsZW1lbnRFcnJvciA9IG5ldyBlcnJvcnMuTm9TdWNoRWxlbWVudEVycm9yKCdzcGVjaWZpYyBlcnJvciBtZXNzYWdlJyk7XG4gICAgY29uc3QgW2h0dHBTdGF0dXMsIGh0dHBSZXNwb25zZUJvZHldID0gZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcihub1N1Y2hFbGVtZW50RXJyb3IpO1xuICAgIGh0dHBTdGF0dXMuc2hvdWxkLmVxdWFsKDQwNCk7XG4gICAgY29uc3Qge2Vycm9yLCBtZXNzYWdlLCBzdGFja3RyYWNlfSA9IGh0dHBSZXNwb25zZUJvZHkudmFsdWU7XG4gICAgZXJyb3Iuc2hvdWxkLmVxdWFsKCdubyBzdWNoIGVsZW1lbnQnKTtcbiAgICBtZXNzYWdlLnNob3VsZC5tYXRjaCgvc3BlY2lmaWMgZXJyb3IgbWVzc2FnZS8pO1xuICAgIHN0YWNrdHJhY2Uuc2hvdWxkLm1hdGNoKC9lcnJvcnMtc3BlY3MuanMvKTtcbiAgfSk7XG4gIGl0KCdzaG91bGQgaGFuZGxlIEJhZFBhcmFtZXRlcnNFcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBiYWRQYXJhbXNFcnJvciA9IG5ldyBlcnJvcnMuQmFkUGFyYW1ldGVyc0Vycm9yKCdfX0ZPT19fJywgJ19fQkFSX18nLCAnX19IRUxMT19XT1JMRF9fJyk7XG4gICAgY29uc3QgW2h0dHBTdGF0dXMsIGh0dHBSZXNwb25zZUJvZHldID0gZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcihiYWRQYXJhbXNFcnJvcik7XG4gICAgaHR0cFN0YXR1cy5zaG91bGQuZXF1YWwoNDAwKTtcbiAgICBjb25zdCB7ZXJyb3IsIG1lc3NhZ2UsIHN0YWNrdHJhY2V9ID0gaHR0cFJlc3BvbnNlQm9keS52YWx1ZTtcbiAgICBlcnJvci5zaG91bGQuZXF1YWwoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICBtZXNzYWdlLnNob3VsZC5tYXRjaCgvX19CQVJfXy8pO1xuICAgIG1lc3NhZ2Uuc2hvdWxkLm1hdGNoKC9fX0hFTExPX1dPUkxEX18vKTtcbiAgICBzdGFja3RyYWNlLnNob3VsZC5tYXRjaCgvZXJyb3JzLXNwZWNzLmpzLyk7XG4gIH0pO1xuICBpdCgnc2hvdWxkIHRyYW5zbGF0ZSBKU09OV1AgZXJyb3JzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IFtodHRwU3RhdHVzLCBodHRwUmVzcG9uc2VCb2R5XSA9IGdldFJlc3BvbnNlRm9yVzNDRXJyb3Ioe1xuICAgICAgc3RhdHVzOiA3LFxuICAgICAgdmFsdWU6ICdNeSBjdXN0b20gbWVzc2FnZScsXG4gICAgICBzZXNzaW9uSWQ6ICdGYWtlIFNlc3Npb24gSWQnLFxuICAgIH0pO1xuICAgIGh0dHBTdGF0dXMuc2hvdWxkLmVxdWFsKDQwNCk7XG4gICAgY29uc3Qge2Vycm9yLCBtZXNzYWdlLCBzdGFja3RyYWNlfSA9IGh0dHBSZXNwb25zZUJvZHkudmFsdWU7XG4gICAgbWVzc2FnZS5zaG91bGQuZXF1YWwoJ015IGN1c3RvbSBtZXNzYWdlJyk7XG4gICAgZXJyb3Iuc2hvdWxkLmVxdWFsKCdubyBzdWNoIGVsZW1lbnQnKTtcbiAgICBzdGFja3RyYWNlLnNob3VsZC5leGlzdDtcbiAgfSk7XG59KTtcbmRlc2NyaWJlKCcuZ2V0QWN0dWFsRXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdNSlNPTldQJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgbWFwIGEgc3RhdHVzIGNvZGUgNyBubyBzdWNoIGVsZW1lbnQgZXJyb3IgYXMgYSBOb1N1Y2hFbGVtZW50RXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhY3R1YWxFcnJvciA9IG5ldyBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IoJ0Vycm9yIG1lc3NhZ2UgZG9lcyBub3QgbWF0dGVyJywge1xuICAgICAgICB2YWx1ZTogJ2RvZXMgbm90IG1hdHRlcicsXG4gICAgICAgIHN0YXR1czogNyxcbiAgICAgIH0pLmdldEFjdHVhbEVycm9yKCk7XG4gICAgICBpc0Vycm9yVHlwZShhY3R1YWxFcnJvciwgZXJyb3JzLk5vU3VjaEVsZW1lbnRFcnJvcikuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBtYXAgYSBzdGF0dXMgY29kZSAxMCwgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhY3R1YWxFcnJvciA9IG5ldyBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IoJ0Vycm9yIG1lc3NhZ2UgZG9lcyBub3QgbWF0dGVyJywge1xuICAgICAgICB2YWx1ZTogJ0RvZXMgbm90IG1hdHRlcicsXG4gICAgICAgIHN0YXR1czogMTAsXG4gICAgICB9KS5nZXRBY3R1YWxFcnJvcigpO1xuICAgICAgaXNFcnJvclR5cGUoYWN0dWFsRXJyb3IsIGVycm9ycy5TdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvcikuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBtYXAgYW4gdW5rbm93biBlcnJvciB0byBVbmtub3duRXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhY3R1YWxFcnJvciA9IG5ldyBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IoJ0Vycm9yIG1lc3NhZ2UgZG9lcyBub3QgbWF0dGVyJywge1xuICAgICAgICB2YWx1ZTogJ0RvZXMgbm90IG1hdHRlcicsXG4gICAgICAgIHN0YXR1czogLTEwMFxuICAgICAgfSkuZ2V0QWN0dWFsRXJyb3IoKTtcbiAgICAgIGlzRXJyb3JUeXBlKGFjdHVhbEVycm9yLCBlcnJvcnMuVW5rbm93bkVycm9yKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHBhcnNlIGEgSlNPTiBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhY3R1YWxFcnJvciA9IG5ldyBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IoJ0Vycm9yIG1lc3NhZ2UgZG9lcyBub3QgbWF0dGVyJywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB2YWx1ZTogJ0RvZXMgbm90IG1hdHRlcicsXG4gICAgICAgIHN0YXR1czogLTEwMFxuICAgICAgfSkpLmdldEFjdHVhbEVycm9yKCk7XG4gICAgICBpc0Vycm9yVHlwZShhY3R1YWxFcnJvciwgZXJyb3JzLlVua25vd25FcnJvcikuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdXM0MnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBtYXAgYSA0MDQgbm8gc3VjaCBlbGVtZW50IGVycm9yIGFzIGEgTm9TdWNoRWxlbWVudEVycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWN0dWFsRXJyb3IgPSBuZXcgZXJyb3JzLlByb3h5UmVxdWVzdEVycm9yKCdFcnJvciBtZXNzYWdlIGRvZXMgbm90IG1hdHRlcicsIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBlcnJvcjogZXJyb3JzLk5vU3VjaEVsZW1lbnRFcnJvci5lcnJvcigpLFxuICAgICAgICB9LFxuICAgICAgfSwgSFRUUFN0YXR1c0NvZGVzLk5PVF9GT1VORCkuZ2V0QWN0dWFsRXJyb3IoKTtcbiAgICAgIGlzRXJyb3JUeXBlKGFjdHVhbEVycm9yLCBlcnJvcnMuTm9TdWNoRWxlbWVudEVycm9yKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG1hcCBhIDQwMCBTdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFjdHVhbEVycm9yID0gbmV3IGVycm9ycy5Qcm94eVJlcXVlc3RFcnJvcignRXJyb3IgbWVzc2FnZSBkb2VzIG5vdCBtYXR0ZXInLCB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZXJyb3I6IGVycm9ycy5TdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvci5lcnJvcigpLFxuXG4gICAgICAgIH0sXG4gICAgICB9LCBIVFRQU3RhdHVzQ29kZXMuQkFEX1JFUVVFU1QpLmdldEFjdHVhbEVycm9yKCk7XG4gICAgICBpc0Vycm9yVHlwZShhY3R1YWxFcnJvciwgZXJyb3JzLlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG1hcCBhbiB1bmtub3duIGVycm9yIHRvIFVua25vd25FcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFjdHVhbEVycm9yID0gbmV3IGVycm9ycy5Qcm94eVJlcXVlc3RFcnJvcignRXJyb3IgbWVzc2FnZSBkb2VzIG5vdCBtYXR0ZXInLCBudWxsLCB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZXJyb3I6ICdOb3QgYSB2YWxpZCB3M2MgSlNPTiBjb2RlJ1xuXG4gICAgICAgIH0sXG4gICAgICB9LCA0NTYpLmdldEFjdHVhbEVycm9yKCk7XG4gICAgICBpc0Vycm9yVHlwZShhY3R1YWxFcnJvciwgZXJyb3JzLlVua25vd25FcnJvcikuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBhIEpTT04gc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWN0dWFsRXJyb3IgPSBuZXcgZXJyb3JzLlByb3h5UmVxdWVzdEVycm9yKCdFcnJvciBtZXNzYWdlIGRvZXMgbm90IG1hdHRlcicsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBlcnJvcjogZXJyb3JzLlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yLmVycm9yKCksXG5cbiAgICAgICAgfSxcbiAgICAgIH0pLCBIVFRQU3RhdHVzQ29kZXMuQkFEX1JFUVVFU1QpLmdldEFjdHVhbEVycm9yKCk7XG4gICAgICBpc0Vycm9yVHlwZShhY3R1YWxFcnJvciwgZXJyb3JzLlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJmaWxlIjoidGVzdC9wcm90b2NvbC9lcnJvcnMtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -1,168 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.FakeDriver = void 0;
9
-
10
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
-
12
- require("source-map-support/register");
13
-
14
- var _lib = require("../../lib");
15
-
16
- var _constants = require("../../lib/constants");
17
-
18
- var _support = require("@appium/support");
19
-
20
- class FakeDriver extends _lib.BaseDriver {
21
- constructor() {
22
- super();
23
- this.protocol = _constants.PROTOCOLS.MJSONWP;
24
- this.sessionId = null;
25
- this.jwpProxyActive = false;
26
- }
27
-
28
- sessionExists(sessionId) {
29
- if (!sessionId) {
30
- return false;
31
- }
32
-
33
- return sessionId === this.sessionId;
34
- }
35
-
36
- driverForSession() {
37
- return this;
38
- }
39
-
40
- async createSession(desiredCapabilities, requiredCapabilities, capabilities) {
41
- this.sessionId = `fakeSession_${_support.util.uuidV4()}`;
42
- return [this.sessionId, capabilities];
43
- }
44
-
45
- async executeCommand(cmd, ...args) {
46
- if (!this[cmd]) {
47
- throw new _lib.errors.NotYetImplementedError();
48
- }
49
-
50
- if (cmd === 'createSession') {
51
- this.protocol = (0, _lib.determineProtocol)(...args);
52
- }
53
-
54
- return await this[cmd](...args);
55
- }
56
-
57
- async deleteSession() {
58
- this.jwpProxyActive = false;
59
- this.sessionId = null;
60
- }
61
-
62
- async getStatus() {
63
- return "I'm fine";
64
- }
65
-
66
- async setUrl(url) {
67
- return `Navigated to: ${url}`;
68
- }
69
-
70
- async getUrl() {
71
- return 'http://foobar.com';
72
- }
73
-
74
- async back(sessionId) {
75
- return sessionId;
76
- }
77
-
78
- async forward() {}
79
-
80
- async refresh() {
81
- throw new Error('Too Fresh!');
82
- }
83
-
84
- async getSession() {
85
- throw new _lib.errors.NoSuchDriverError();
86
- }
87
-
88
- async click(elementId, sessionId) {
89
- return [elementId, sessionId];
90
- }
91
-
92
- async implicitWait(ms) {
93
- return ms;
94
- }
95
-
96
- async clickCurrent(button) {
97
- return button;
98
- }
99
-
100
- async setNetworkConnection(type) {
101
- return type;
102
- }
103
-
104
- async moveTo(element, xOffset, yOffset) {
105
- return [element, xOffset, yOffset];
106
- }
107
-
108
- async getText() {
109
- return '';
110
- }
111
-
112
- async getAttribute(attr, elementId, sessionId) {
113
- return [attr, elementId, sessionId];
114
- }
115
-
116
- async setValue(value, elementId) {
117
- return [value, elementId];
118
- }
119
-
120
- async performTouch(...args) {
121
- return args;
122
- }
123
-
124
- async setFrame(frameId) {
125
- return frameId;
126
- }
127
-
128
- async removeApp(app) {
129
- return app;
130
- }
131
-
132
- async receiveAsyncResponse() {
133
- return {
134
- status: 13,
135
- value: 'Mishandled Driver Error'
136
- };
137
- }
138
-
139
- proxyActive() {
140
- return false;
141
- }
142
-
143
- getProxyAvoidList() {
144
- return [];
145
- }
146
-
147
- canProxy() {
148
- return false;
149
- }
150
-
151
- async notProxiedCommand() {
152
- return 'This was not proxied';
153
- }
154
-
155
- }
156
-
157
- exports.FakeDriver = FakeDriver;
158
- (0, _defineProperty2.default)(FakeDriver, "newMethodMap", {
159
- '/session/:sessionId/noproxy': {
160
- GET: {
161
- command: 'notProxiedCommand',
162
- neverProxy: true
163
- }
164
- }
165
- });require('source-map-support').install();
166
-
167
-
168
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvcHJvdG9jb2wvZmFrZS1kcml2ZXIuanMiXSwibmFtZXMiOlsiRmFrZURyaXZlciIsIkJhc2VEcml2ZXIiLCJjb25zdHJ1Y3RvciIsInByb3RvY29sIiwiUFJPVE9DT0xTIiwiTUpTT05XUCIsInNlc3Npb25JZCIsImp3cFByb3h5QWN0aXZlIiwic2Vzc2lvbkV4aXN0cyIsImRyaXZlckZvclNlc3Npb24iLCJjcmVhdGVTZXNzaW9uIiwiZGVzaXJlZENhcGFiaWxpdGllcyIsInJlcXVpcmVkQ2FwYWJpbGl0aWVzIiwiY2FwYWJpbGl0aWVzIiwidXRpbCIsInV1aWRWNCIsImV4ZWN1dGVDb21tYW5kIiwiY21kIiwiYXJncyIsImVycm9ycyIsIk5vdFlldEltcGxlbWVudGVkRXJyb3IiLCJkZWxldGVTZXNzaW9uIiwiZ2V0U3RhdHVzIiwic2V0VXJsIiwidXJsIiwiZ2V0VXJsIiwiYmFjayIsImZvcndhcmQiLCJyZWZyZXNoIiwiRXJyb3IiLCJnZXRTZXNzaW9uIiwiTm9TdWNoRHJpdmVyRXJyb3IiLCJjbGljayIsImVsZW1lbnRJZCIsImltcGxpY2l0V2FpdCIsIm1zIiwiY2xpY2tDdXJyZW50IiwiYnV0dG9uIiwic2V0TmV0d29ya0Nvbm5lY3Rpb24iLCJ0eXBlIiwibW92ZVRvIiwiZWxlbWVudCIsInhPZmZzZXQiLCJ5T2Zmc2V0IiwiZ2V0VGV4dCIsImdldEF0dHJpYnV0ZSIsImF0dHIiLCJzZXRWYWx1ZSIsInZhbHVlIiwicGVyZm9ybVRvdWNoIiwic2V0RnJhbWUiLCJmcmFtZUlkIiwicmVtb3ZlQXBwIiwiYXBwIiwicmVjZWl2ZUFzeW5jUmVzcG9uc2UiLCJzdGF0dXMiLCJwcm94eUFjdGl2ZSIsImdldFByb3h5QXZvaWRMaXN0IiwiY2FuUHJveHkiLCJub3RQcm94aWVkQ29tbWFuZCIsIkdFVCIsImNvbW1hbmQiLCJuZXZlclByb3h5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsVUFB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ZixTQUFSLENBQVA7QUFDRDs7QUFFaUIsUUFBWmdCLFlBQVksQ0FBRSxHQUFHL0IsSUFBTCxFQUFXO0FBQzNCLFdBQU9BLElBQVA7QUFDRDs7QUFFYSxRQUFSZ0MsUUFBUSxDQUFFQyxPQUFGLEVBQVc7QUFDdkIsV0FBT0EsT0FBUDtBQUNEOztBQUVjLFFBQVRDLFNBQVMsQ0FBRUMsR0FBRixFQUFPO0FBQ3BCLFdBQU9BLEdBQVA7QUFDRDs7QUFFeUIsUUFBcEJDLG9CQUFvQixHQUFJO0FBRTVCLFdBQU87QUFBQ0MsTUFBQUEsTUFBTSxFQUFFLEVBQVQ7QUFBYVAsTUFBQUEsS0FBSyxFQUFFO0FBQXBCLEtBQVA7QUFDRDs7QUFFRFEsRUFBQUEsV0FBVyxHQUFpQjtBQUMxQixXQUFPLEtBQVA7QUFDRDs7QUFFREMsRUFBQUEsaUJBQWlCLEdBQWlCO0FBQ2hDLFdBQU8sRUFBUDtBQUNEOztBQUVEQyxFQUFBQSxRQUFRLEdBQWlCO0FBQ3ZCLFdBQU8sS0FBUDtBQUNEOztBQUVzQixRQUFqQkMsaUJBQWlCLEdBQUk7QUFDekIsV0FBTyxzQkFBUDtBQUNEOztBQXhJaUM7Ozs4QkFBOUIzRCxVLGtCQUVrQjtBQUNwQixpQ0FBK0I7QUFDN0I0RCxJQUFBQSxHQUFHLEVBQUU7QUFBQ0MsTUFBQUEsT0FBTyxFQUFFLG1CQUFWO0FBQStCQyxNQUFBQSxVQUFVLEVBQUU7QUFBM0M7QUFEd0I7QUFEWCxDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgcmVxdWlyZS1hd2FpdCAqL1xuaW1wb3J0IHsgZXJyb3JzLCBCYXNlRHJpdmVyLCBkZXRlcm1pbmVQcm90b2NvbCB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgeyBQUk9UT0NPTFMgfSBmcm9tICcuLi8uLi9saWIvY29uc3RhbnRzJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuXG5cbmNsYXNzIEZha2VEcml2ZXIgZXh0ZW5kcyBCYXNlRHJpdmVyIHtcblxuICBzdGF0aWMgbmV3TWV0aG9kTWFwID0ge1xuICAgICcvc2Vzc2lvbi86c2Vzc2lvbklkL25vcHJveHknOiB7XG4gICAgICBHRVQ6IHtjb21tYW5kOiAnbm90UHJveGllZENvbW1hbmQnLCBuZXZlclByb3h5OiB0cnVlfVxuICAgIH1cbiAgfTtcblxuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnByb3RvY29sID0gUFJPVE9DT0xTLk1KU09OV1A7XG4gICAgdGhpcy5zZXNzaW9uSWQgPSBudWxsO1xuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcbiAgfVxuXG4gIHNlc3Npb25FeGlzdHMgKHNlc3Npb25JZCkge1xuICAgIGlmICghc2Vzc2lvbklkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBzZXNzaW9uSWQgPT09IHRoaXMuc2Vzc2lvbklkO1xuICB9XG5cbiAgZHJpdmVyRm9yU2Vzc2lvbiAoLypzZXNzaW9uSWQqLykge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlU2Vzc2lvbiAoZGVzaXJlZENhcGFiaWxpdGllcywgcmVxdWlyZWRDYXBhYmlsaXRpZXMsIGNhcGFiaWxpdGllcykge1xuICAgIC8vIFVzZSBhIGNvdW50ZXIgdG8gbWFrZSBzdXJlIGVhY2ggc2Vzc2lvbiBoYXMgYSB1bmlxdWUgaWRcbiAgICB0aGlzLnNlc3Npb25JZCA9IGBmYWtlU2Vzc2lvbl8ke3V0aWwudXVpZFY0KCl9YDtcbiAgICByZXR1cm4gW3RoaXMuc2Vzc2lvbklkLCBjYXBhYmlsaXRpZXNdO1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZUNvbW1hbmQgKGNtZCwgLi4uYXJncykge1xuICAgIGlmICghdGhpc1tjbWRdKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdFlldEltcGxlbWVudGVkRXJyb3IoKTtcbiAgICB9XG4gICAgaWYgKGNtZCA9PT0gJ2NyZWF0ZVNlc3Npb24nKSB7XG4gICAgICB0aGlzLnByb3RvY29sID0gZGV0ZXJtaW5lUHJvdG9jb2woLi4uYXJncyk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzW2NtZF0oLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBkZWxldGVTZXNzaW9uICgpIHtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5zZXNzaW9uSWQgPSBudWxsO1xuICB9XG5cbiAgYXN5bmMgZ2V0U3RhdHVzICgpIHtcbiAgICByZXR1cm4gXCJJJ20gZmluZVwiO1xuICB9XG5cbiAgYXN5bmMgc2V0VXJsICh1cmwpIHtcbiAgICByZXR1cm4gYE5hdmlnYXRlZCB0bzogJHt1cmx9YDtcbiAgfVxuXG4gIGFzeW5jIGdldFVybCAoKSB7XG4gICAgcmV0dXJuICdodHRwOi8vZm9vYmFyLmNvbSc7XG4gIH1cblxuICBhc3luYyBiYWNrIChzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gc2Vzc2lvbklkO1xuICB9XG5cbiAgYXN5bmMgZm9yd2FyZCAoKSB7fVxuXG4gIGFzeW5jIHJlZnJlc2ggKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVG9vIEZyZXNoIScpO1xuICB9XG5cbiAgYXN5bmMgZ2V0U2Vzc2lvbiAoKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob1N1Y2hEcml2ZXJFcnJvcigpO1xuICB9XG5cbiAgYXN5bmMgY2xpY2sgKGVsZW1lbnRJZCwgc2Vzc2lvbklkKSB7XG4gICAgcmV0dXJuIFtlbGVtZW50SWQsIHNlc3Npb25JZF07XG4gIH1cblxuICBhc3luYyBpbXBsaWNpdFdhaXQgKG1zKSB7XG4gICAgcmV0dXJuIG1zO1xuICB9XG5cbiAgYXN5bmMgY2xpY2tDdXJyZW50IChidXR0b24pIHtcbiAgICByZXR1cm4gYnV0dG9uO1xuICB9XG5cbiAgYXN5bmMgc2V0TmV0d29ya0Nvbm5lY3Rpb24gKHR5cGUpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIGFzeW5jIG1vdmVUbyAoZWxlbWVudCwgeE9mZnNldCwgeU9mZnNldCkge1xuICAgIHJldHVybiBbZWxlbWVudCwgeE9mZnNldCwgeU9mZnNldF07XG4gIH1cblxuICBhc3luYyBnZXRUZXh0ICgpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBhc3luYyBnZXRBdHRyaWJ1dGUgKGF0dHIsIGVsZW1lbnRJZCwgc2Vzc2lvbklkKSB7XG4gICAgcmV0dXJuIFthdHRyLCBlbGVtZW50SWQsIHNlc3Npb25JZF07XG4gIH1cblxuICBhc3luYyBzZXRWYWx1ZSAodmFsdWUsIGVsZW1lbnRJZCkge1xuICAgIHJldHVybiBbdmFsdWUsIGVsZW1lbnRJZF07XG4gIH1cblxuICBhc3luYyBwZXJmb3JtVG91Y2ggKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIGFzeW5jIHNldEZyYW1lIChmcmFtZUlkKSB7XG4gICAgcmV0dXJuIGZyYW1lSWQ7XG4gIH1cblxuICBhc3luYyByZW1vdmVBcHAgKGFwcCkge1xuICAgIHJldHVybiBhcHA7XG4gIH1cblxuICBhc3luYyByZWNlaXZlQXN5bmNSZXNwb25zZSAoKSB7XG4gICAgLy8gdGhpcyBpcyBoZXJlIHRvIHRlc3QgYSBmYWlsaW5nIGNvbW1hbmQgdGhhdCBkb2VzIG5vdCB0aHJvdyBhbiBlcnJvclxuICAgIHJldHVybiB7c3RhdHVzOiAxMywgdmFsdWU6ICdNaXNoYW5kbGVkIERyaXZlciBFcnJvcid9O1xuICB9XG5cbiAgcHJveHlBY3RpdmUgKC8qc2Vzc2lvbklkKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRQcm94eUF2b2lkTGlzdCAoLypzZXNzaW9uSWQqLykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNhblByb3h5ICgvKnNlc3Npb25JZCovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgbm90UHJveGllZENvbW1hbmQgKCkge1xuICAgIHJldHVybiAnVGhpcyB3YXMgbm90IHByb3hpZWQnO1xuICB9XG59XG5cbmV4cG9ydCB7IEZha2VEcml2ZXIgfTtcbiJdLCJmaWxlIjoidGVzdC9wcm90b2NvbC9mYWtlLWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9