@appium/base-driver 8.7.3 → 9.0.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 (121) hide show
  1. package/build/lib/basedriver/capabilities.d.ts +11 -163
  2. package/build/lib/basedriver/capabilities.d.ts.map +1 -1
  3. package/build/lib/basedriver/capabilities.js +354 -236
  4. package/build/lib/basedriver/capabilities.js.map +1 -1
  5. package/build/lib/basedriver/commands/event.d.ts +7 -6
  6. package/build/lib/basedriver/commands/event.d.ts.map +1 -1
  7. package/build/lib/basedriver/commands/event.js +55 -35
  8. package/build/lib/basedriver/commands/event.js.map +1 -1
  9. package/build/lib/basedriver/commands/execute.d.ts +7 -6
  10. package/build/lib/basedriver/commands/execute.d.ts.map +1 -1
  11. package/build/lib/basedriver/commands/execute.js +66 -58
  12. package/build/lib/basedriver/commands/execute.js.map +1 -1
  13. package/build/lib/basedriver/commands/find.d.ts +9 -7
  14. package/build/lib/basedriver/commands/find.d.ts.map +1 -1
  15. package/build/lib/basedriver/commands/find.js +102 -54
  16. package/build/lib/basedriver/commands/find.js.map +1 -1
  17. package/build/lib/basedriver/commands/index.d.ts +3 -7
  18. package/build/lib/basedriver/commands/index.d.ts.map +1 -1
  19. package/build/lib/basedriver/commands/index.js +30 -33
  20. package/build/lib/basedriver/commands/index.js.map +1 -1
  21. package/build/lib/basedriver/commands/log.d.ts +8 -9
  22. package/build/lib/basedriver/commands/log.d.ts.map +1 -1
  23. package/build/lib/basedriver/commands/log.js +54 -38
  24. package/build/lib/basedriver/commands/log.js.map +1 -1
  25. package/build/lib/basedriver/commands/session.d.ts +7 -6
  26. package/build/lib/basedriver/commands/session.d.ts.map +1 -1
  27. package/build/lib/basedriver/commands/session.js +46 -39
  28. package/build/lib/basedriver/commands/session.js.map +1 -1
  29. package/build/lib/basedriver/commands/settings.d.ts +7 -7
  30. package/build/lib/basedriver/commands/settings.d.ts.map +1 -1
  31. package/build/lib/basedriver/commands/settings.js +35 -28
  32. package/build/lib/basedriver/commands/settings.js.map +1 -1
  33. package/build/lib/basedriver/commands/timeout.d.ts +7 -5
  34. package/build/lib/basedriver/commands/timeout.d.ts.map +1 -1
  35. package/build/lib/basedriver/commands/timeout.js +144 -162
  36. package/build/lib/basedriver/commands/timeout.js.map +1 -1
  37. package/build/lib/basedriver/core.d.ts +6 -157
  38. package/build/lib/basedriver/core.d.ts.map +1 -1
  39. package/build/lib/basedriver/core.js +361 -230
  40. package/build/lib/basedriver/core.js.map +1 -1
  41. package/build/lib/basedriver/desired-caps.js +80 -110
  42. package/build/lib/basedriver/desired-caps.js.map +1 -1
  43. package/build/lib/basedriver/device-settings.js +57 -62
  44. package/build/lib/basedriver/device-settings.js.map +1 -1
  45. package/build/lib/basedriver/driver.d.ts +11 -262
  46. package/build/lib/basedriver/driver.d.ts.map +1 -1
  47. package/build/lib/basedriver/driver.js +362 -262
  48. package/build/lib/basedriver/driver.js.map +1 -1
  49. package/build/lib/basedriver/helpers.js +500 -495
  50. package/build/lib/basedriver/helpers.js.map +1 -1
  51. package/build/lib/basedriver/logger.d.ts +1 -1
  52. package/build/lib/basedriver/logger.d.ts.map +1 -1
  53. package/build/lib/basedriver/logger.js +5 -15
  54. package/build/lib/basedriver/logger.js.map +1 -1
  55. package/build/lib/constants.js +14 -14
  56. package/build/lib/constants.js.map +1 -1
  57. package/build/lib/express/crash.js +8 -15
  58. package/build/lib/express/crash.js.map +1 -1
  59. package/build/lib/express/express-logging.js +49 -59
  60. package/build/lib/express/express-logging.js.map +1 -1
  61. package/build/lib/express/idempotency.js +125 -177
  62. package/build/lib/express/idempotency.js.map +1 -1
  63. package/build/lib/express/logger.d.ts +1 -1
  64. package/build/lib/express/logger.d.ts.map +1 -1
  65. package/build/lib/express/logger.js +5 -15
  66. package/build/lib/express/logger.js.map +1 -1
  67. package/build/lib/express/middleware.js +82 -107
  68. package/build/lib/express/middleware.js.map +1 -1
  69. package/build/lib/express/server.d.ts +17 -5
  70. package/build/lib/express/server.d.ts.map +1 -1
  71. package/build/lib/express/server.js +259 -224
  72. package/build/lib/express/server.js.map +1 -1
  73. package/build/lib/express/static.js +64 -81
  74. package/build/lib/express/static.js.map +1 -1
  75. package/build/lib/express/websocket.js +115 -87
  76. package/build/lib/express/websocket.js.map +1 -1
  77. package/build/lib/helpers/capabilities.d.ts +1 -59
  78. package/build/lib/helpers/capabilities.d.ts.map +1 -1
  79. package/build/lib/helpers/capabilities.js +72 -69
  80. package/build/lib/helpers/capabilities.js.map +1 -1
  81. package/build/lib/index.js +64 -180
  82. package/build/lib/index.js.map +1 -1
  83. package/build/lib/jsonwp-proxy/protocol-converter.js +215 -227
  84. package/build/lib/jsonwp-proxy/protocol-converter.js.map +1 -1
  85. package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -1
  86. package/build/lib/jsonwp-proxy/proxy.js +355 -393
  87. package/build/lib/jsonwp-proxy/proxy.js.map +1 -1
  88. package/build/lib/jsonwp-status/status.js +119 -130
  89. package/build/lib/jsonwp-status/status.js.map +1 -1
  90. package/build/lib/protocol/errors.d.ts +135 -32
  91. package/build/lib/protocol/errors.d.ts.map +1 -1
  92. package/build/lib/protocol/errors.js +871 -919
  93. package/build/lib/protocol/errors.js.map +1 -1
  94. package/build/lib/protocol/helpers.js +37 -37
  95. package/build/lib/protocol/helpers.js.map +1 -1
  96. package/build/lib/protocol/index.js +22 -109
  97. package/build/lib/protocol/index.js.map +1 -1
  98. package/build/lib/protocol/protocol.js +394 -350
  99. package/build/lib/protocol/protocol.js.map +1 -1
  100. package/build/lib/protocol/routes.d.ts +1238 -4
  101. package/build/lib/protocol/routes.d.ts.map +1 -1
  102. package/build/lib/protocol/routes.js +964 -1327
  103. package/build/lib/protocol/routes.js.map +1 -1
  104. package/build/lib/protocol/validators.js +32 -39
  105. package/build/lib/protocol/validators.js.map +1 -1
  106. package/build/tsconfig.tsbuildinfo +1 -1
  107. package/lib/basedriver/capabilities.js +80 -39
  108. package/lib/basedriver/commands/event.js +10 -5
  109. package/lib/basedriver/commands/execute.js +14 -9
  110. package/lib/basedriver/commands/find.js +18 -12
  111. package/lib/basedriver/commands/index.js +21 -16
  112. package/lib/basedriver/commands/log.js +24 -18
  113. package/lib/basedriver/commands/session.js +10 -5
  114. package/lib/basedriver/commands/settings.js +9 -6
  115. package/lib/basedriver/commands/timeout.js +10 -4
  116. package/lib/basedriver/core.js +2 -3
  117. package/lib/basedriver/driver.js +12 -16
  118. package/lib/express/server.js +6 -3
  119. package/lib/protocol/errors.js +155 -44
  120. package/lib/protocol/routes.js +11 -7
  121. package/package.json +14 -16
@@ -1,238 +1,369 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
2
+ /* eslint-disable no-unused-vars */
3
+ /* eslint-disable require-await */
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
6
8
  exports.DriverCore = void 0;
7
-
8
- require("source-map-support/register");
9
-
10
- var _support = require("@appium/support");
11
-
12
- var _asyncLock = _interopRequireDefault(require("async-lock"));
13
-
14
- var _events = require("events");
15
-
16
- var _lodash = _interopRequireDefault(require("lodash"));
17
-
18
- var _os = _interopRequireDefault(require("os"));
19
-
20
- var _constants = require("../constants");
21
-
22
- var _protocol = require("../protocol");
23
-
24
- var _deviceSettings = _interopRequireDefault(require("./device-settings"));
25
-
26
- var _helpers = _interopRequireDefault(require("./helpers"));
27
-
28
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
-
30
- const {
31
- version: BASEDRIVER_VER
32
- } = _support.fs.readPackageJsonFrom(__dirname);
33
-
9
+ const support_1 = require("@appium/support");
10
+ const async_lock_1 = __importDefault(require("async-lock"));
11
+ const events_1 = require("events");
12
+ const lodash_1 = __importDefault(require("lodash"));
13
+ const os_1 = __importDefault(require("os"));
14
+ const constants_1 = require("../constants");
15
+ const protocol_1 = require("../protocol");
16
+ const device_settings_1 = __importDefault(require("./device-settings"));
17
+ const helpers_1 = __importDefault(require("./helpers"));
18
+ // for compat with running tests transpiled and in-place
19
+ const { version: BASEDRIVER_VER } = support_1.fs.readPackageJsonFrom(__dirname);
34
20
  const NEW_COMMAND_TIMEOUT_MS = 60 * 1000;
35
21
  const ON_UNEXPECTED_SHUTDOWN_EVENT = 'onUnexpectedShutdown';
36
-
22
+ /**
23
+ * @template {Constraints} [C=BaseDriverCapConstraints]
24
+ * @implements {Core<C>}
25
+ */
37
26
  class DriverCore {
38
- static baseVersion = BASEDRIVER_VER;
39
- static executeMethodMap = {};
40
- sessionId = null;
41
- opts;
42
- initialOpts;
43
- helpers = _helpers.default;
44
- basePath = _constants.DEFAULT_BASE_PATH;
45
- relaxedSecurityEnabled = false;
46
- allowInsecure = [];
47
- denyInsecure = [];
48
- newCommandTimeoutMs = NEW_COMMAND_TIMEOUT_MS;
49
- implicitWaitMs = 0;
50
- locatorStrategies = [];
51
- webLocatorStrategies = [];
52
- managedDrivers = [];
53
- noCommandTimer = null;
54
- _eventHistory = {
55
- commands: []
56
- };
57
- eventEmitter = new _events.EventEmitter();
58
- _log;
59
- shutdownUnexpectedly = false;
60
- shouldValidateCaps;
61
- commandsQueueGuard = new _asyncLock.default();
62
- settings = new _deviceSettings.default();
63
-
64
- constructor(opts = {}, shouldValidateCaps = true) {
65
- this._log = _support.logger.getLogger(_helpers.default.generateDriverLogPrefix(this));
66
- this.opts = opts;
67
- this.opts.tmpDir = this.opts.tmpDir || process.env.APPIUM_TMP_DIR || _os.default.tmpdir();
68
- this.shouldValidateCaps = shouldValidateCaps;
69
- this.initialOpts = _lodash.default.cloneDeep(opts);
70
- this.sessionId = null;
71
- }
72
-
73
- get log() {
74
- return this._log;
75
- }
76
-
77
- onUnexpectedShutdown(handler) {
78
- this.eventEmitter.on(ON_UNEXPECTED_SHUTDOWN_EVENT, handler);
79
- }
80
-
81
- get driverData() {
82
- return {};
83
- }
84
-
85
- get isCommandsQueueEnabled() {
86
- return true;
87
- }
88
-
89
- get eventHistory() {
90
- return _lodash.default.cloneDeep(this._eventHistory);
91
- }
92
-
93
- logEvent(eventName) {
94
- if (eventName === 'commands') {
95
- throw new Error('Cannot log commands directly');
96
- }
97
-
98
- if (typeof eventName !== 'string') {
99
- throw new Error(`Invalid eventName ${eventName}`);
100
- }
101
-
102
- if (!this._eventHistory[eventName]) {
103
- this._eventHistory[eventName] = [];
104
- }
105
-
106
- const ts = Date.now();
107
- const logTime = new Date(ts).toTimeString();
108
-
109
- this._eventHistory[eventName].push(ts);
110
-
111
- this.log.debug(`Event '${eventName}' logged at ${ts} (${logTime})`);
112
- }
113
-
114
- async getStatus() {
115
- return {};
116
- }
117
-
118
- sessionExists(sessionId) {
119
- if (!sessionId) return false;
120
- return sessionId === this.sessionId;
121
- }
122
-
123
- driverForSession(sessionId) {
124
- return this;
125
- }
126
-
127
- isMjsonwpProtocol() {
128
- return this.protocol === _constants.PROTOCOLS.MJSONWP;
129
- }
130
-
131
- isW3CProtocol() {
132
- return this.protocol === _constants.PROTOCOLS.W3C;
133
- }
134
-
135
- setProtocolMJSONWP() {
136
- this.protocol = _constants.PROTOCOLS.MJSONWP;
137
- }
138
-
139
- setProtocolW3C() {
140
- this.protocol = _constants.PROTOCOLS.W3C;
141
- }
142
-
143
- isFeatureEnabled(name) {
144
- if (this.denyInsecure && _lodash.default.includes(this.denyInsecure, name)) {
145
- return false;
146
- }
147
-
148
- if (this.allowInsecure && _lodash.default.includes(this.allowInsecure, name)) {
149
- return true;
150
- }
151
-
152
- if (this.relaxedSecurityEnabled) {
153
- return true;
154
- }
155
-
156
- return false;
157
- }
158
-
159
- ensureFeatureEnabled(name) {
160
- this.assertFeatureEnabled(name);
161
- }
162
-
163
- assertFeatureEnabled(name) {
164
- if (!this.isFeatureEnabled(name)) {
165
- throw new Error(`Potentially insecure feature '${name}' has not been ` + `enabled. If you want to enable this feature and accept ` + `the security ramifications, please do so by following ` + `the documented instructions at https://github.com/appium` + `/appium/blob/master/docs/en/writing-running-appium/security.md`);
166
- }
167
- }
168
-
169
- validateLocatorStrategy(strategy, webContext = false) {
170
- let validStrategies = this.locatorStrategies;
171
- this.log.debug(`Valid locator strategies for this request: ${validStrategies.join(', ')}`);
172
-
173
- if (webContext) {
174
- validStrategies = validStrategies.concat(this.webLocatorStrategies);
175
- }
176
-
177
- if (!_lodash.default.includes(validStrategies, strategy)) {
178
- throw new _protocol.errors.InvalidSelectorError(`Locator Strategy '${strategy}' is not supported for this session`);
179
- }
180
- }
181
-
182
- proxyActive(sessionId) {
183
- return false;
184
- }
185
-
186
- getProxyAvoidList(sessionId) {
187
- return [];
188
- }
189
-
190
- canProxy(sessionId) {
191
- return false;
192
- }
193
-
194
- proxyRouteIsAvoided(sessionId, method, url, body) {
195
- for (let avoidSchema of this.getProxyAvoidList(sessionId)) {
196
- if (!_lodash.default.isArray(avoidSchema) || avoidSchema.length !== 2) {
197
- throw new Error('Proxy avoidance must be a list of pairs');
198
- }
199
-
200
- let [avoidMethod, avoidPathRegex] = avoidSchema;
201
-
202
- if (!_lodash.default.includes(['GET', 'POST', 'DELETE'], avoidMethod)) {
203
- throw new Error(`Unrecognized proxy avoidance method '${avoidMethod}'`);
204
- }
205
-
206
- if (!_lodash.default.isRegExp(avoidPathRegex)) {
207
- throw new Error('Proxy avoidance path must be a regular expression');
208
- }
209
-
210
- let normalizedUrl = url.replace(new RegExp(`^${_lodash.default.escapeRegExp(this.basePath)}`), '');
211
-
212
- if (avoidMethod === method && avoidPathRegex.test(normalizedUrl)) {
27
+ /**
28
+ * @param {DriverOpts<C>} opts
29
+ * @param {boolean} [shouldValidateCaps]
30
+ */
31
+ constructor(opts = /** @type {DriverOpts<C>} */ ({}), shouldValidateCaps = true) {
32
+ /**
33
+ * @type {string?}
34
+ */
35
+ this.sessionId = null;
36
+ this.helpers = helpers_1.default;
37
+ /**
38
+ * basePath is used for several purposes, for example in setting up
39
+ * proxying to other drivers, since we need to know what the base path
40
+ * of any incoming request might look like. We set it to the default
41
+ * initially but it is automatically updated during any actual program
42
+ * execution by the routeConfiguringFunction, which is necessarily run as
43
+ * the entrypoint for any Appium server
44
+ */
45
+ this.basePath = constants_1.DEFAULT_BASE_PATH;
46
+ this.relaxedSecurityEnabled = false;
47
+ /** @type {string[]} */
48
+ this.allowInsecure = [];
49
+ /** @type {string[]} */
50
+ this.denyInsecure = [];
51
+ this.newCommandTimeoutMs = NEW_COMMAND_TIMEOUT_MS;
52
+ this.implicitWaitMs = 0;
53
+ /** @type {string[]} */
54
+ this.locatorStrategies = [];
55
+ /** @type {string[]} */
56
+ this.webLocatorStrategies = [];
57
+ /** @type {Driver[]} */
58
+ this.managedDrivers = [];
59
+ /** @type {NodeJS.Timeout?} */
60
+ this.noCommandTimer = null;
61
+ /** @type {EventHistory} */
62
+ this._eventHistory = { commands: [] };
63
+ // used to handle driver events
64
+ /** @type {NodeJS.EventEmitter} */
65
+ this.eventEmitter = new events_1.EventEmitter();
66
+ /**
67
+ * @protected
68
+ */
69
+ this.shutdownUnexpectedly = false;
70
+ /**
71
+ * @protected
72
+ */
73
+ this.commandsQueueGuard = new async_lock_1.default();
74
+ /**
75
+ * settings should be instantiated by drivers which extend BaseDriver, but
76
+ * we set it to an empty DeviceSettings instance here to make sure that the
77
+ * default settings are applied even if an extending driver doesn't utilize
78
+ * the settings functionality itself
79
+ */
80
+ this.settings = new device_settings_1.default();
81
+ this._log = support_1.logger.getLogger(helpers_1.default.generateDriverLogPrefix(this));
82
+ // setup state
83
+ this.opts = opts;
84
+ // use a custom tmp dir to avoid losing data and app when computer is
85
+ // restarted
86
+ this.opts.tmpDir = this.opts.tmpDir || process.env.APPIUM_TMP_DIR || os_1.default.tmpdir();
87
+ // base-driver internals
88
+ this.shouldValidateCaps = shouldValidateCaps;
89
+ // keeping track of initial opts
90
+ this.initialOpts = lodash_1.default.cloneDeep(opts);
91
+ this.sessionId = null;
92
+ }
93
+ get log() {
94
+ return this._log;
95
+ }
96
+ /**
97
+ * Set a callback handler if needed to execute a custom piece of code
98
+ * when the driver is shut down unexpectedly. Multiple calls to this method
99
+ * will cause the handler to be executed mutiple times
100
+ *
101
+ * @param {(...args: any[]) => void} handler The code to be executed on unexpected shutdown.
102
+ * The function may accept one argument, which is the actual error instance, which
103
+ * caused the driver to shut down.
104
+ */
105
+ onUnexpectedShutdown(handler) {
106
+ this.eventEmitter.on(ON_UNEXPECTED_SHUTDOWN_EVENT, handler);
107
+ }
108
+ /**
109
+ * This property is used by AppiumDriver to store the data of the
110
+ * specific driver sessions. This data can be later used to adjust
111
+ * properties for driver instances running in parallel.
112
+ * Override it in inherited driver classes if necessary.
113
+ *
114
+ * @return {Record<string,unknown>} Driver properties mapping
115
+ */
116
+ get driverData() {
117
+ return {};
118
+ }
119
+ /**
120
+ * This property controls the way the `executeCommand` method
121
+ * handles new driver commands received from the client.
122
+ * Override it for inherited classes only in special cases.
123
+ *
124
+ * @return {boolean} If the returned value is true (default) then all the commands
125
+ * received by the particular driver instance are going to be put into the queue,
126
+ * so each following command will not be executed until the previous command
127
+ * execution is completed. False value disables that queue, so each driver command
128
+ * is executed independently and does not wait for anything.
129
+ */
130
+ get isCommandsQueueEnabled() {
213
131
  return true;
214
- }
215
- }
216
-
217
- return false;
218
- }
219
-
220
- addManagedDriver(driver) {
221
- this.managedDrivers.push(driver);
222
- }
223
-
224
- getManagedDrivers() {
225
- return this.managedDrivers;
226
- }
227
-
228
- async clearNewCommandTimeout() {
229
- if (this.noCommandTimer) {
230
- clearTimeout(this.noCommandTimer);
231
- this.noCommandTimer = null;
232
- }
233
- }
234
-
132
+ }
133
+ /*
134
+ * make eventHistory a property and return a cloned object so a consumer can't
135
+ * inadvertently change data outside of logEvent
136
+ */
137
+ get eventHistory() {
138
+ return lodash_1.default.cloneDeep(this._eventHistory);
139
+ }
140
+ /**
141
+ * API method for driver developers to log timings for important events
142
+ * @param {string} eventName
143
+ */
144
+ logEvent(eventName) {
145
+ if (eventName === 'commands') {
146
+ throw new Error('Cannot log commands directly');
147
+ }
148
+ if (typeof eventName !== 'string') {
149
+ throw new Error(`Invalid eventName ${eventName}`);
150
+ }
151
+ if (!this._eventHistory[eventName]) {
152
+ this._eventHistory[eventName] = [];
153
+ }
154
+ const ts = Date.now();
155
+ const logTime = new Date(ts).toTimeString();
156
+ this._eventHistory[eventName].push(ts);
157
+ this.log.debug(`Event '${eventName}' logged at ${ts} (${logTime})`);
158
+ }
159
+ /**
160
+ * Overridden in appium driver, but here so that individual drivers can be
161
+ * tested with clients that poll
162
+ */
163
+ async getStatus() {
164
+ return {};
165
+ }
166
+ /**
167
+ * method required by MJSONWP in order to determine whether it should
168
+ * respond with an invalid session response
169
+ * @param {string} [sessionId]
170
+ * @returns {boolean}
171
+ */
172
+ sessionExists(sessionId) {
173
+ if (!sessionId)
174
+ return false; // eslint-disable-line curly
175
+ return sessionId === this.sessionId;
176
+ }
177
+ /**
178
+ * method required by MJSONWP in order to determine if the command should
179
+ * be proxied directly to the driver
180
+ * @param {string} sessionId
181
+ * @returns {Core<C> | null}
182
+ */
183
+ driverForSession(sessionId) {
184
+ return this;
185
+ }
186
+ isMjsonwpProtocol() {
187
+ return this.protocol === constants_1.PROTOCOLS.MJSONWP;
188
+ }
189
+ isW3CProtocol() {
190
+ return this.protocol === constants_1.PROTOCOLS.W3C;
191
+ }
192
+ setProtocolMJSONWP() {
193
+ this.protocol = constants_1.PROTOCOLS.MJSONWP;
194
+ }
195
+ setProtocolW3C() {
196
+ this.protocol = constants_1.PROTOCOLS.W3C;
197
+ }
198
+ /**
199
+ * Check whether a given feature is enabled via its name
200
+ *
201
+ * @param {string} name - name of feature/command
202
+ *
203
+ * @returns {Boolean}
204
+ */
205
+ isFeatureEnabled(name) {
206
+ // if we have explicitly denied this feature, return false immediately
207
+ if (this.denyInsecure && lodash_1.default.includes(this.denyInsecure, name)) {
208
+ return false;
209
+ }
210
+ // if we specifically have allowed the feature, return true
211
+ if (this.allowInsecure && lodash_1.default.includes(this.allowInsecure, name)) {
212
+ return true;
213
+ }
214
+ // otherwise, if we've globally allowed insecure features and not denied
215
+ // this one, return true
216
+ if (this.relaxedSecurityEnabled) {
217
+ return true;
218
+ }
219
+ // if we haven't allowed anything insecure, then reject
220
+ return false;
221
+ }
222
+ /**
223
+ * Assert that a given feature is enabled and throw a helpful error if it's
224
+ * not
225
+ *
226
+ * @param {string} name - name of feature/command
227
+ * @deprecated
228
+ */
229
+ ensureFeatureEnabled(name) {
230
+ this.assertFeatureEnabled(name);
231
+ }
232
+ /**
233
+ * Assert that a given feature is enabled and throw a helpful error if it's
234
+ * not
235
+ *
236
+ * @param {string} name - name of feature/command
237
+ */
238
+ assertFeatureEnabled(name) {
239
+ if (!this.isFeatureEnabled(name)) {
240
+ throw new Error(`Potentially insecure feature '${name}' has not been ` +
241
+ `enabled. If you want to enable this feature and accept ` +
242
+ `the security ramifications, please do so by following ` +
243
+ `the documented instructions at https://github.com/appium` +
244
+ `/appium/blob/master/docs/en/writing-running-appium/security.md`);
245
+ }
246
+ }
247
+ /**
248
+ *
249
+ * @param {string} strategy
250
+ * @param {boolean} [webContext]
251
+ */
252
+ validateLocatorStrategy(strategy, webContext = false) {
253
+ let validStrategies = this.locatorStrategies;
254
+ this.log.debug(`Valid locator strategies for this request: ${validStrategies.join(', ')}`);
255
+ if (webContext) {
256
+ validStrategies = validStrategies.concat(this.webLocatorStrategies);
257
+ }
258
+ if (!lodash_1.default.includes(validStrategies, strategy)) {
259
+ throw new protocol_1.errors.InvalidSelectorError(`Locator Strategy '${strategy}' is not supported for this session`);
260
+ }
261
+ }
262
+ /**
263
+ *
264
+ * @param {string} [sessionId]
265
+ * @returns {boolean}
266
+ */
267
+ proxyActive(sessionId) {
268
+ return false;
269
+ }
270
+ /**
271
+ *
272
+ * @param {string} sessionId
273
+ * @returns {import('@appium/types').RouteMatcher[]}
274
+ */
275
+ getProxyAvoidList(sessionId) {
276
+ return [];
277
+ }
278
+ /**
279
+ *
280
+ * @param {string} [sessionId]
281
+ * @returns {boolean}
282
+ */
283
+ canProxy(sessionId) {
284
+ return false;
285
+ }
286
+ /**
287
+ * Whether a given command route (expressed as method and url) should not be
288
+ * proxied according to this driver
289
+ *
290
+ * @param {string} sessionId - the current sessionId (in case the driver runs
291
+ * multiple session ids and requires it). This is not used in this method but
292
+ * should be made available to overridden methods.
293
+ * @param {import('@appium/types').HTTPMethod} method - HTTP method of the route
294
+ * @param {string} url - url of the route
295
+ * @param {any} [body] - webdriver request body
296
+ *
297
+ * @returns {boolean} - whether the route should be avoided
298
+ */
299
+ proxyRouteIsAvoided(sessionId, method, url, body) {
300
+ for (let avoidSchema of this.getProxyAvoidList(sessionId)) {
301
+ if (!lodash_1.default.isArray(avoidSchema) || avoidSchema.length !== 2) {
302
+ throw new Error('Proxy avoidance must be a list of pairs');
303
+ }
304
+ let [avoidMethod, avoidPathRegex] = avoidSchema;
305
+ if (!lodash_1.default.includes(['GET', 'POST', 'DELETE'], avoidMethod)) {
306
+ throw new Error(`Unrecognized proxy avoidance method '${avoidMethod}'`);
307
+ }
308
+ if (!lodash_1.default.isRegExp(avoidPathRegex)) {
309
+ throw new Error('Proxy avoidance path must be a regular expression');
310
+ }
311
+ let normalizedUrl = url.replace(new RegExp(`^${lodash_1.default.escapeRegExp(this.basePath)}`), '');
312
+ if (avoidMethod === method && avoidPathRegex.test(normalizedUrl)) {
313
+ return true;
314
+ }
315
+ }
316
+ return false;
317
+ }
318
+ /**
319
+ *
320
+ * @param {Driver} driver
321
+ */
322
+ addManagedDriver(driver) {
323
+ this.managedDrivers.push(driver);
324
+ }
325
+ getManagedDrivers() {
326
+ return this.managedDrivers;
327
+ }
328
+ async clearNewCommandTimeout() {
329
+ if (this.noCommandTimer) {
330
+ clearTimeout(this.noCommandTimer);
331
+ this.noCommandTimer = null;
332
+ }
333
+ }
235
334
  }
236
-
237
335
  exports.DriverCore = DriverCore;
238
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ2ZXJzaW9uIiwiQkFTRURSSVZFUl9WRVIiLCJmcyIsInJlYWRQYWNrYWdlSnNvbkZyb20iLCJfX2Rpcm5hbWUiLCJORVdfQ09NTUFORF9USU1FT1VUX01TIiwiT05fVU5FWFBFQ1RFRF9TSFVURE9XTl9FVkVOVCIsIkRyaXZlckNvcmUiLCJiYXNlVmVyc2lvbiIsImV4ZWN1dGVNZXRob2RNYXAiLCJzZXNzaW9uSWQiLCJvcHRzIiwiaW5pdGlhbE9wdHMiLCJoZWxwZXJzIiwiYmFzZVBhdGgiLCJERUZBVUxUX0JBU0VfUEFUSCIsInJlbGF4ZWRTZWN1cml0eUVuYWJsZWQiLCJhbGxvd0luc2VjdXJlIiwiZGVueUluc2VjdXJlIiwibmV3Q29tbWFuZFRpbWVvdXRNcyIsImltcGxpY2l0V2FpdE1zIiwibG9jYXRvclN0cmF0ZWdpZXMiLCJ3ZWJMb2NhdG9yU3RyYXRlZ2llcyIsIm1hbmFnZWREcml2ZXJzIiwibm9Db21tYW5kVGltZXIiLCJfZXZlbnRIaXN0b3J5IiwiY29tbWFuZHMiLCJldmVudEVtaXR0ZXIiLCJFdmVudEVtaXR0ZXIiLCJfbG9nIiwic2h1dGRvd25VbmV4cGVjdGVkbHkiLCJzaG91bGRWYWxpZGF0ZUNhcHMiLCJjb21tYW5kc1F1ZXVlR3VhcmQiLCJBc3luY0xvY2siLCJzZXR0aW5ncyIsIkRldmljZVNldHRpbmdzIiwiY29uc3RydWN0b3IiLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJnZW5lcmF0ZURyaXZlckxvZ1ByZWZpeCIsInRtcERpciIsInByb2Nlc3MiLCJlbnYiLCJBUFBJVU1fVE1QX0RJUiIsIm9zIiwidG1wZGlyIiwiXyIsImNsb25lRGVlcCIsImxvZyIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiaGFuZGxlciIsIm9uIiwiZHJpdmVyRGF0YSIsImlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQiLCJldmVudEhpc3RvcnkiLCJsb2dFdmVudCIsImV2ZW50TmFtZSIsIkVycm9yIiwidHMiLCJEYXRlIiwibm93IiwibG9nVGltZSIsInRvVGltZVN0cmluZyIsInB1c2giLCJkZWJ1ZyIsImdldFN0YXR1cyIsInNlc3Npb25FeGlzdHMiLCJkcml2ZXJGb3JTZXNzaW9uIiwiaXNNanNvbndwUHJvdG9jb2wiLCJwcm90b2NvbCIsIlBST1RPQ09MUyIsIk1KU09OV1AiLCJpc1czQ1Byb3RvY29sIiwiVzNDIiwic2V0UHJvdG9jb2xNSlNPTldQIiwic2V0UHJvdG9jb2xXM0MiLCJpc0ZlYXR1cmVFbmFibGVkIiwibmFtZSIsImluY2x1ZGVzIiwiZW5zdXJlRmVhdHVyZUVuYWJsZWQiLCJhc3NlcnRGZWF0dXJlRW5hYmxlZCIsInZhbGlkYXRlTG9jYXRvclN0cmF0ZWd5Iiwic3RyYXRlZ3kiLCJ3ZWJDb250ZXh0IiwidmFsaWRTdHJhdGVnaWVzIiwiam9pbiIsImNvbmNhdCIsImVycm9ycyIsIkludmFsaWRTZWxlY3RvckVycm9yIiwicHJveHlBY3RpdmUiLCJnZXRQcm94eUF2b2lkTGlzdCIsImNhblByb3h5IiwicHJveHlSb3V0ZUlzQXZvaWRlZCIsIm1ldGhvZCIsInVybCIsImJvZHkiLCJhdm9pZFNjaGVtYSIsImlzQXJyYXkiLCJsZW5ndGgiLCJhdm9pZE1ldGhvZCIsImF2b2lkUGF0aFJlZ2V4IiwiaXNSZWdFeHAiLCJub3JtYWxpemVkVXJsIiwicmVwbGFjZSIsIlJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsInRlc3QiLCJhZGRNYW5hZ2VkRHJpdmVyIiwiZHJpdmVyIiwiZ2V0TWFuYWdlZERyaXZlcnMiLCJjbGVhck5ld0NvbW1hbmRUaW1lb3V0IiwiY2xlYXJUaW1lb3V0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2Jhc2Vkcml2ZXIvY29yZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVxdWlyZS1hd2FpdCAqL1xuXG5pbXBvcnQge2ZzLCBsb2dnZXJ9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgQXN5bmNMb2NrIGZyb20gJ2FzeW5jLWxvY2snO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCB7REVGQVVMVF9CQVNFX1BBVEgsIFBST1RPQ09MU30gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7ZXJyb3JzfSBmcm9tICcuLi9wcm90b2NvbCc7XG5pbXBvcnQgRGV2aWNlU2V0dGluZ3MgZnJvbSAnLi9kZXZpY2Utc2V0dGluZ3MnO1xuaW1wb3J0IGhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzJztcblxuLy8gZm9yIGNvbXBhdCB3aXRoIHJ1bm5pbmcgdGVzdHMgdHJhbnNwaWxlZCBhbmQgaW4tcGxhY2VcbmNvbnN0IHt2ZXJzaW9uOiBCQVNFRFJJVkVSX1ZFUn0gPSBmcy5yZWFkUGFja2FnZUpzb25Gcm9tKF9fZGlybmFtZSk7XG5cbmNvbnN0IE5FV19DT01NQU5EX1RJTUVPVVRfTVMgPSA2MCAqIDEwMDA7XG5cbmNvbnN0IE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQgPSAnb25VbmV4cGVjdGVkU2h1dGRvd24nO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPUJhc2VEcml2ZXJDYXBDb25zdHJhaW50c11cbiAqIEBpbXBsZW1lbnRzIHtDb3JlPEM+fVxuICovXG5jbGFzcyBEcml2ZXJDb3JlIHtcbiAgLyoqXG4gICAqIE1ha2UgdGhlIGJhc2Vkcml2ZXIgdmVyc2lvbiBhdmFpbGFibGUgc28gZm9yIGFueSBkcml2ZXIgd2hpY2ggaW5oZXJpdHMgZnJvbSB0aGlzIHBhY2thZ2UsIHdlXG4gICAqIGtub3cgd2hpY2ggdmVyc2lvbiBvZiBiYXNlZHJpdmVyIGl0IGluaGVyaXRlZCBmcm9tXG4gICAqL1xuICBzdGF0aWMgYmFzZVZlcnNpb24gPSBCQVNFRFJJVkVSX1ZFUjtcblxuICAvKiogQHR5cGUge0V4ZWN1dGVNZXRob2RNYXB9ICovXG4gIHN0YXRpYyBleGVjdXRlTWV0aG9kTWFwID0ge307XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtzdHJpbmc/fVxuICAgKi9cbiAgc2Vzc2lvbklkID0gbnVsbDtcblxuICAvKipcbiAgICogQHR5cGUge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlck9wdHM8Qz59XG4gICAqL1xuICBvcHRzO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7U2VydmVyQXJnc31cbiAgICovXG4gIGluaXRpYWxPcHRzO1xuXG4gIGhlbHBlcnMgPSBoZWxwZXJzO1xuXG4gIC8qKlxuICAgKiBiYXNlUGF0aCBpcyB1c2VkIGZvciBzZXZlcmFsIHB1cnBvc2VzLCBmb3IgZXhhbXBsZSBpbiBzZXR0aW5nIHVwXG4gICAqIHByb3h5aW5nIHRvIG90aGVyIGRyaXZlcnMsIHNpbmNlIHdlIG5lZWQgdG8ga25vdyB3aGF0IHRoZSBiYXNlIHBhdGhcbiAgICogb2YgYW55IGluY29taW5nIHJlcXVlc3QgbWlnaHQgbG9vayBsaWtlLiBXZSBzZXQgaXQgdG8gdGhlIGRlZmF1bHRcbiAgICogaW5pdGlhbGx5IGJ1dCBpdCBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIGFueSBhY3R1YWwgcHJvZ3JhbVxuICAgKiBleGVjdXRpb24gYnkgdGhlIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiwgd2hpY2ggaXMgbmVjZXNzYXJpbHkgcnVuIGFzXG4gICAqIHRoZSBlbnRyeXBvaW50IGZvciBhbnkgQXBwaXVtIHNlcnZlclxuICAgKi9cbiAgYmFzZVBhdGggPSBERUZBVUxUX0JBU0VfUEFUSDtcblxuICByZWxheGVkU2VjdXJpdHlFbmFibGVkID0gZmFsc2U7XG5cbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgYWxsb3dJbnNlY3VyZSA9IFtdO1xuXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGRlbnlJbnNlY3VyZSA9IFtdO1xuXG4gIG5ld0NvbW1hbmRUaW1lb3V0TXMgPSBORVdfQ09NTUFORF9USU1FT1VUX01TO1xuXG4gIGltcGxpY2l0V2FpdE1zID0gMDtcblxuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBsb2NhdG9yU3RyYXRlZ2llcyA9IFtdO1xuXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIHdlYkxvY2F0b3JTdHJhdGVnaWVzID0gW107XG5cbiAgLyoqIEB0eXBlIHtEcml2ZXJbXX0gKi9cbiAgbWFuYWdlZERyaXZlcnMgPSBbXTtcblxuICAvKiogQHR5cGUge05vZGVKUy5UaW1lb3V0P30gKi9cbiAgbm9Db21tYW5kVGltZXIgPSBudWxsO1xuXG4gIC8qKiBAdHlwZSB7RXZlbnRIaXN0b3J5fSAqL1xuICBfZXZlbnRIaXN0b3J5ID0ge2NvbW1hbmRzOiBbXX07XG5cbiAgLy8gdXNlZCB0byBoYW5kbGUgZHJpdmVyIGV2ZW50c1xuICAvKiogQHR5cGUge05vZGVKUy5FdmVudEVtaXR0ZXJ9ICovXG4gIGV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogQHR5cGUge0FwcGl1bUxvZ2dlcn1cbiAgICovXG4gIF9sb2c7XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHNodXRkb3duVW5leHBlY3RlZGx5ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKi9cbiAgc2hvdWxkVmFsaWRhdGVDYXBzO1xuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBjb21tYW5kc1F1ZXVlR3VhcmQgPSBuZXcgQXN5bmNMb2NrKCk7XG5cbiAgLyoqXG4gICAqIHNldHRpbmdzIHNob3VsZCBiZSBpbnN0YW50aWF0ZWQgYnkgZHJpdmVycyB3aGljaCBleHRlbmQgQmFzZURyaXZlciwgYnV0XG4gICAqIHdlIHNldCBpdCB0byBhbiBlbXB0eSBEZXZpY2VTZXR0aW5ncyBpbnN0YW5jZSBoZXJlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZVxuICAgKiBkZWZhdWx0IHNldHRpbmdzIGFyZSBhcHBsaWVkIGV2ZW4gaWYgYW4gZXh0ZW5kaW5nIGRyaXZlciBkb2Vzbid0IHV0aWxpemVcbiAgICogdGhlIHNldHRpbmdzIGZ1bmN0aW9uYWxpdHkgaXRzZWxmXG4gICAqL1xuICBzZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncygpO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RyaXZlck9wdHM8Qz59IG9wdHNcbiAgICogQHBhcmFtIHtib29sZWFufSBbc2hvdWxkVmFsaWRhdGVDYXBzXVxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0cyA9IC8qKiBAdHlwZSB7RHJpdmVyT3B0czxDPn0gKi8gKHt9KSwgc2hvdWxkVmFsaWRhdGVDYXBzID0gdHJ1ZSkge1xuICAgIHRoaXMuX2xvZyA9IGxvZ2dlci5nZXRMb2dnZXIoaGVscGVycy5nZW5lcmF0ZURyaXZlckxvZ1ByZWZpeCh0aGlzKSk7XG5cbiAgICAvLyBzZXR1cCBzdGF0ZVxuICAgIHRoaXMub3B0cyA9IG9wdHM7XG5cbiAgICAvLyB1c2UgYSBjdXN0b20gdG1wIGRpciB0byBhdm9pZCBsb3NpbmcgZGF0YSBhbmQgYXBwIHdoZW4gY29tcHV0ZXIgaXNcbiAgICAvLyByZXN0YXJ0ZWRcbiAgICB0aGlzLm9wdHMudG1wRGlyID0gdGhpcy5vcHRzLnRtcERpciB8fCBwcm9jZXNzLmVudi5BUFBJVU1fVE1QX0RJUiB8fCBvcy50bXBkaXIoKTtcblxuICAgIC8vIGJhc2UtZHJpdmVyIGludGVybmFsc1xuICAgIHRoaXMuc2hvdWxkVmFsaWRhdGVDYXBzID0gc2hvdWxkVmFsaWRhdGVDYXBzO1xuXG4gICAgLy8ga2VlcGluZyB0cmFjayBvZiBpbml0aWFsIG9wdHNcbiAgICB0aGlzLmluaXRpYWxPcHRzID0gXy5jbG9uZURlZXAob3B0cyk7XG5cbiAgICB0aGlzLnNlc3Npb25JZCA9IG51bGw7XG4gIH1cblxuICBnZXQgbG9nKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2c7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgY2FsbGJhY2sgaGFuZGxlciBpZiBuZWVkZWQgdG8gZXhlY3V0ZSBhIGN1c3RvbSBwaWVjZSBvZiBjb2RlXG4gICAqIHdoZW4gdGhlIGRyaXZlciBpcyBzaHV0IGRvd24gdW5leHBlY3RlZGx5LiBNdWx0aXBsZSBjYWxscyB0byB0aGlzIG1ldGhvZFxuICAgKiB3aWxsIGNhdXNlIHRoZSBoYW5kbGVyIHRvIGJlIGV4ZWN1dGVkIG11dGlwbGUgdGltZXNcbiAgICpcbiAgICogQHBhcmFtIHsoLi4uYXJnczogYW55W10pID0+IHZvaWR9IGhhbmRsZXIgVGhlIGNvZGUgdG8gYmUgZXhlY3V0ZWQgb24gdW5leHBlY3RlZCBzaHV0ZG93bi5cbiAgICogVGhlIGZ1bmN0aW9uIG1heSBhY2NlcHQgb25lIGFyZ3VtZW50LCB3aGljaCBpcyB0aGUgYWN0dWFsIGVycm9yIGluc3RhbmNlLCB3aGljaFxuICAgKiBjYXVzZWQgdGhlIGRyaXZlciB0byBzaHV0IGRvd24uXG4gICAqL1xuICBvblVuZXhwZWN0ZWRTaHV0ZG93bihoYW5kbGVyKSB7XG4gICAgdGhpcy5ldmVudEVtaXR0ZXIub24oT05fVU5FWFBFQ1RFRF9TSFVURE9XTl9FVkVOVCwgaGFuZGxlcik7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGJ5IEFwcGl1bURyaXZlciB0byBzdG9yZSB0aGUgZGF0YSBvZiB0aGVcbiAgICogc3BlY2lmaWMgZHJpdmVyIHNlc3Npb25zLiBUaGlzIGRhdGEgY2FuIGJlIGxhdGVyIHVzZWQgdG8gYWRqdXN0XG4gICAqIHByb3BlcnRpZXMgZm9yIGRyaXZlciBpbnN0YW5jZXMgcnVubmluZyBpbiBwYXJhbGxlbC5cbiAgICogT3ZlcnJpZGUgaXQgaW4gaW5oZXJpdGVkIGRyaXZlciBjbGFzc2VzIGlmIG5lY2Vzc2FyeS5cbiAgICpcbiAgICogQHJldHVybiB7UmVjb3JkPHN0cmluZyx1bmtub3duPn0gRHJpdmVyIHByb3BlcnRpZXMgbWFwcGluZ1xuICAgKi9cbiAgZ2V0IGRyaXZlckRhdGEoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgcHJvcGVydHkgY29udHJvbHMgdGhlIHdheSB7I2V4ZWN1dGVDb21tYW5kfSBtZXRob2RcbiAgICogaGFuZGxlcyBuZXcgZHJpdmVyIGNvbW1hbmRzIHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudC5cbiAgICogT3ZlcnJpZGUgaXQgZm9yIGluaGVyaXRlZCBjbGFzc2VzIG9ubHkgaW4gc3BlY2lhbCBjYXNlcy5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gSWYgdGhlIHJldHVybmVkIHZhbHVlIGlzIHRydWUgKGRlZmF1bHQpIHRoZW4gYWxsIHRoZSBjb21tYW5kc1xuICAgKiAgIHJlY2VpdmVkIGJ5IHRoZSBwYXJ0aWN1bGFyIGRyaXZlciBpbnN0YW5jZSBhcmUgZ29pbmcgdG8gYmUgcHV0IGludG8gdGhlIHF1ZXVlLFxuICAgKiAgIHNvIGVhY2ggZm9sbG93aW5nIGNvbW1hbmQgd2lsbCBub3QgYmUgZXhlY3V0ZWQgdW50aWwgdGhlIHByZXZpb3VzIGNvbW1hbmRcbiAgICogICBleGVjdXRpb24gaXMgY29tcGxldGVkLiBGYWxzZSB2YWx1ZSBkaXNhYmxlcyB0aGF0IHF1ZXVlLCBzbyBlYWNoIGRyaXZlciBjb21tYW5kXG4gICAqICAgaXMgZXhlY3V0ZWQgaW5kZXBlbmRlbnRseSBhbmQgZG9lcyBub3Qgd2FpdCBmb3IgYW55dGhpbmcuXG4gICAqL1xuICBnZXQgaXNDb21tYW5kc1F1ZXVlRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qXG4gICAqIG1ha2UgZXZlbnRIaXN0b3J5IGEgcHJvcGVydHkgYW5kIHJldHVybiBhIGNsb25lZCBvYmplY3Qgc28gYSBjb25zdW1lciBjYW4ndFxuICAgKiBpbmFkdmVydGVudGx5IGNoYW5nZSBkYXRhIG91dHNpZGUgb2YgbG9nRXZlbnRcbiAgICovXG4gIGdldCBldmVudEhpc3RvcnkoKSB7XG4gICAgcmV0dXJuIF8uY2xvbmVEZWVwKHRoaXMuX2V2ZW50SGlzdG9yeSk7XG4gIH1cblxuICAvKipcbiAgICogQVBJIG1ldGhvZCBmb3IgZHJpdmVyIGRldmVsb3BlcnMgdG8gbG9nIHRpbWluZ3MgZm9yIGltcG9ydGFudCBldmVudHNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKi9cbiAgbG9nRXZlbnQoZXZlbnROYW1lKSB7XG4gICAgaWYgKGV2ZW50TmFtZSA9PT0gJ2NvbW1hbmRzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbG9nIGNvbW1hbmRzIGRpcmVjdGx5Jyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZXZlbnROYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGV2ZW50TmFtZSAke2V2ZW50TmFtZX1gKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9ldmVudEhpc3RvcnlbZXZlbnROYW1lXSkge1xuICAgICAgdGhpcy5fZXZlbnRIaXN0b3J5W2V2ZW50TmFtZV0gPSBbXTtcbiAgICB9XG4gICAgY29uc3QgdHMgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGxvZ1RpbWUgPSBuZXcgRGF0ZSh0cykudG9UaW1lU3RyaW5nKCk7XG4gICAgdGhpcy5fZXZlbnRIaXN0b3J5W2V2ZW50TmFtZV0ucHVzaCh0cyk7XG4gICAgdGhpcy5sb2cuZGVidWcoYEV2ZW50ICcke2V2ZW50TmFtZX0nIGxvZ2dlZCBhdCAke3RzfSAoJHtsb2dUaW1lfSlgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZGVuIGluIGFwcGl1bSBkcml2ZXIsIGJ1dCBoZXJlIHNvIHRoYXQgaW5kaXZpZHVhbCBkcml2ZXJzIGNhbiBiZVxuICAgKiB0ZXN0ZWQgd2l0aCBjbGllbnRzIHRoYXQgcG9sbFxuICAgKi9cbiAgYXN5bmMgZ2V0U3RhdHVzKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXRob2QgcmVxdWlyZWQgYnkgTUpTT05XUCBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBzaG91bGRcbiAgICogcmVzcG9uZCB3aXRoIGFuIGludmFsaWQgc2Vzc2lvbiByZXNwb25zZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3Nlc3Npb25JZF1cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBzZXNzaW9uRXhpc3RzKHNlc3Npb25JZCkge1xuICAgIGlmICghc2Vzc2lvbklkKSByZXR1cm4gZmFsc2U7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcbiAgICByZXR1cm4gc2Vzc2lvbklkID09PSB0aGlzLnNlc3Npb25JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXRob2QgcmVxdWlyZWQgYnkgTUpTT05XUCBpbiBvcmRlciB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbW1hbmQgc2hvdWxkXG4gICAqIGJlIHByb3hpZWQgZGlyZWN0bHkgdG8gdGhlIGRyaXZlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvbklkXG4gICAqIEByZXR1cm5zIHtDb3JlPEM+IHwgbnVsbH1cbiAgICovXG4gIGRyaXZlckZvclNlc3Npb24oc2Vzc2lvbklkKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpc01qc29ud3BQcm90b2NvbCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm90b2NvbCA9PT0gUFJPVE9DT0xTLk1KU09OV1A7XG4gIH1cblxuICBpc1czQ1Byb3RvY29sKCkge1xuICAgIHJldHVybiB0aGlzLnByb3RvY29sID09PSBQUk9UT0NPTFMuVzNDO1xuICB9XG5cbiAgc2V0UHJvdG9jb2xNSlNPTldQKCkge1xuICAgIHRoaXMucHJvdG9jb2wgPSBQUk9UT0NPTFMuTUpTT05XUDtcbiAgfVxuXG4gIHNldFByb3RvY29sVzNDKCkge1xuICAgIHRoaXMucHJvdG9jb2wgPSBQUk9UT0NPTFMuVzNDO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlIGlzIGVuYWJsZWQgdmlhIGl0cyBuYW1lXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gbmFtZSBvZiBmZWF0dXJlL2NvbW1hbmRcbiAgICpcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBpc0ZlYXR1cmVFbmFibGVkKG5hbWUpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGV4cGxpY2l0bHkgZGVuaWVkIHRoaXMgZmVhdHVyZSwgcmV0dXJuIGZhbHNlIGltbWVkaWF0ZWx5XG4gICAgaWYgKHRoaXMuZGVueUluc2VjdXJlICYmIF8uaW5jbHVkZXModGhpcy5kZW55SW5zZWN1cmUsIG5hbWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gaWYgd2Ugc3BlY2lmaWNhbGx5IGhhdmUgYWxsb3dlZCB0aGUgZmVhdHVyZSwgcmV0dXJuIHRydWVcbiAgICBpZiAodGhpcy5hbGxvd0luc2VjdXJlICYmIF8uaW5jbHVkZXModGhpcy5hbGxvd0luc2VjdXJlLCBuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gb3RoZXJ3aXNlLCBpZiB3ZSd2ZSBnbG9iYWxseSBhbGxvd2VkIGluc2VjdXJlIGZlYXR1cmVzIGFuZCBub3QgZGVuaWVkXG4gICAgLy8gdGhpcyBvbmUsIHJldHVybiB0cnVlXG4gICAgaWYgKHRoaXMucmVsYXhlZFNlY3VyaXR5RW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgaGF2ZW4ndCBhbGxvd2VkIGFueXRoaW5nIGluc2VjdXJlLCB0aGVuIHJlamVjdFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlcnQgdGhhdCBhIGdpdmVuIGZlYXR1cmUgaXMgZW5hYmxlZCBhbmQgdGhyb3cgYSBoZWxwZnVsIGVycm9yIGlmIGl0J3NcbiAgICogbm90XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gbmFtZSBvZiBmZWF0dXJlL2NvbW1hbmRcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGVuc3VyZUZlYXR1cmVFbmFibGVkKG5hbWUpIHtcbiAgICB0aGlzLmFzc2VydEZlYXR1cmVFbmFibGVkKG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VydCB0aGF0IGEgZ2l2ZW4gZmVhdHVyZSBpcyBlbmFibGVkIGFuZCB0aHJvdyBhIGhlbHBmdWwgZXJyb3IgaWYgaXQnc1xuICAgKiBub3RcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBuYW1lIG9mIGZlYXR1cmUvY29tbWFuZFxuICAgKi9cbiAgYXNzZXJ0RmVhdHVyZUVuYWJsZWQobmFtZSkge1xuICAgIGlmICghdGhpcy5pc0ZlYXR1cmVFbmFibGVkKG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBQb3RlbnRpYWxseSBpbnNlY3VyZSBmZWF0dXJlICcke25hbWV9JyBoYXMgbm90IGJlZW4gYCArXG4gICAgICAgICAgYGVuYWJsZWQuIElmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIGZlYXR1cmUgYW5kIGFjY2VwdCBgICtcbiAgICAgICAgICBgdGhlIHNlY3VyaXR5IHJhbWlmaWNhdGlvbnMsIHBsZWFzZSBkbyBzbyBieSBmb2xsb3dpbmcgYCArXG4gICAgICAgICAgYHRoZSBkb2N1bWVudGVkIGluc3RydWN0aW9ucyBhdCBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtYCArXG4gICAgICAgICAgYC9hcHBpdW0vYmxvYi9tYXN0ZXIvZG9jcy9lbi93cml0aW5nLXJ1bm5pbmctYXBwaXVtL3NlY3VyaXR5Lm1kYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmF0ZWd5XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3dlYkNvbnRleHRdXG4gICAqL1xuICB2YWxpZGF0ZUxvY2F0b3JTdHJhdGVneShzdHJhdGVneSwgd2ViQ29udGV4dCA9IGZhbHNlKSB7XG4gICAgbGV0IHZhbGlkU3RyYXRlZ2llcyA9IHRoaXMubG9jYXRvclN0cmF0ZWdpZXM7XG4gICAgdGhpcy5sb2cuZGVidWcoYFZhbGlkIGxvY2F0b3Igc3RyYXRlZ2llcyBmb3IgdGhpcyByZXF1ZXN0OiAke3ZhbGlkU3RyYXRlZ2llcy5qb2luKCcsICcpfWApO1xuXG4gICAgaWYgKHdlYkNvbnRleHQpIHtcbiAgICAgIHZhbGlkU3RyYXRlZ2llcyA9IHZhbGlkU3RyYXRlZ2llcy5jb25jYXQodGhpcy53ZWJMb2NhdG9yU3RyYXRlZ2llcyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmluY2x1ZGVzKHZhbGlkU3RyYXRlZ2llcywgc3RyYXRlZ3kpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRTZWxlY3RvckVycm9yKFxuICAgICAgICBgTG9jYXRvciBTdHJhdGVneSAnJHtzdHJhdGVneX0nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgc2Vzc2lvbmBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2Vzc2lvbklkXVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHByb3h5QWN0aXZlKHNlc3Npb25JZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvbklkXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Sb3V0ZU1hdGNoZXJbXX1cbiAgICovXG4gIGdldFByb3h5QXZvaWRMaXN0KHNlc3Npb25JZCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3Nlc3Npb25JZF1cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBjYW5Qcm94eShzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIGdpdmVuIGNvbW1hbmQgcm91dGUgKGV4cHJlc3NlZCBhcyBtZXRob2QgYW5kIHVybCkgc2hvdWxkIG5vdCBiZVxuICAgKiBwcm94aWVkIGFjY29yZGluZyB0byB0aGlzIGRyaXZlclxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvbklkIC0gdGhlIGN1cnJlbnQgc2Vzc2lvbklkIChpbiBjYXNlIHRoZSBkcml2ZXIgcnVuc1xuICAgKiBtdWx0aXBsZSBzZXNzaW9uIGlkcyBhbmQgcmVxdWlyZXMgaXQpLiBUaGlzIGlzIG5vdCB1c2VkIGluIHRoaXMgbWV0aG9kIGJ1dFxuICAgKiBzaG91bGQgYmUgbWFkZSBhdmFpbGFibGUgdG8gb3ZlcnJpZGRlbiBtZXRob2RzLlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkhUVFBNZXRob2R9IG1ldGhvZCAtIEhUVFAgbWV0aG9kIG9mIHRoZSByb3V0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gdXJsIG9mIHRoZSByb3V0ZVxuICAgKiBAcGFyYW0ge2FueX0gW2JvZHldIC0gd2ViZHJpdmVyIHJlcXVlc3QgYm9keVxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB3aGV0aGVyIHRoZSByb3V0ZSBzaG91bGQgYmUgYXZvaWRlZFxuICAgKi9cbiAgcHJveHlSb3V0ZUlzQXZvaWRlZChzZXNzaW9uSWQsIG1ldGhvZCwgdXJsLCBib2R5KSB7XG4gICAgZm9yIChsZXQgYXZvaWRTY2hlbWEgb2YgdGhpcy5nZXRQcm94eUF2b2lkTGlzdChzZXNzaW9uSWQpKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheShhdm9pZFNjaGVtYSkgfHwgYXZvaWRTY2hlbWEubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUHJveHkgYXZvaWRhbmNlIG11c3QgYmUgYSBsaXN0IG9mIHBhaXJzJyk7XG4gICAgICB9XG4gICAgICBsZXQgW2F2b2lkTWV0aG9kLCBhdm9pZFBhdGhSZWdleF0gPSBhdm9pZFNjaGVtYTtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhbJ0dFVCcsICdQT1NUJywgJ0RFTEVURSddLCBhdm9pZE1ldGhvZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgcHJveHkgYXZvaWRhbmNlIG1ldGhvZCAnJHthdm9pZE1ldGhvZH0nYCk7XG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNSZWdFeHAoYXZvaWRQYXRoUmVnZXgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUHJveHkgYXZvaWRhbmNlIHBhdGggbXVzdCBiZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbicpO1xuICAgICAgfVxuICAgICAgbGV0IG5vcm1hbGl6ZWRVcmwgPSB1cmwucmVwbGFjZShuZXcgUmVnRXhwKGBeJHtfLmVzY2FwZVJlZ0V4cCh0aGlzLmJhc2VQYXRoKX1gKSwgJycpO1xuICAgICAgaWYgKGF2b2lkTWV0aG9kID09PSBtZXRob2QgJiYgYXZvaWRQYXRoUmVnZXgudGVzdChub3JtYWxpemVkVXJsKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RHJpdmVyfSBkcml2ZXJcbiAgICovXG4gIGFkZE1hbmFnZWREcml2ZXIoZHJpdmVyKSB7XG4gICAgdGhpcy5tYW5hZ2VkRHJpdmVycy5wdXNoKGRyaXZlcik7XG4gIH1cblxuICBnZXRNYW5hZ2VkRHJpdmVycygpIHtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VkRHJpdmVycztcbiAgfVxuXG4gIGFzeW5jIGNsZWFyTmV3Q29tbWFuZFRpbWVvdXQoKSB7XG4gICAgaWYgKHRoaXMubm9Db21tYW5kVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLm5vQ29tbWFuZFRpbWVyKTtcbiAgICAgIHRoaXMubm9Db21tYW5kVGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQge0RyaXZlckNvcmV9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJ9IERyaXZlclxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvbnN0cmFpbnRzfSBDb25zdHJhaW50c1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkV4ZWN1dGVNZXRob2RNYXB9IEV4ZWN1dGVNZXRob2RNYXBcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5TZXJ2ZXJBcmdzfSBTZXJ2ZXJBcmdzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRXZlbnRIaXN0b3J5fSBFdmVudEhpc3RvcnlcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5BcHBpdW1Mb2dnZXJ9IEFwcGl1bUxvZ2dlclxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlN0cmluZ1JlY29yZH0gU3RyaW5nUmVjb3JkXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQmFzZURyaXZlckNhcENvbnN0cmFpbnRzfSBCYXNlRHJpdmVyQ2FwQ29uc3RyYWludHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPUJhc2VEcml2ZXJDYXBDb25zdHJhaW50c11cbiAqIEB0ZW1wbGF0ZSB7U3RyaW5nUmVjb3JkfHZvaWR9IFtFeHRyYT12b2lkXVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNhcGFiaWxpdGllczxDLCBFeHRyYT59IENhcGFiaWxpdGllc1xuICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7U3RyaW5nUmVjb3JkfSBbVD17fV1cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5XM0NDYXBhYmlsaXRpZXM8VD59IFczQ0NhcGFiaWxpdGllc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gQ1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvcmU8Qz59IENvcmVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IENcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJPcHRzPEM+fSBEcml2ZXJPcHRzXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFHQSxNQUFNO0VBQUNBLE9BQU8sRUFBRUM7QUFBVixJQUE0QkMsV0FBQSxDQUFHQyxtQkFBSCxDQUF1QkMsU0FBdkIsQ0FBbEM7O0FBRUEsTUFBTUMsc0JBQXNCLEdBQUcsS0FBSyxJQUFwQztBQUVBLE1BQU1DLDRCQUE0QixHQUFHLHNCQUFyQzs7QUFNQSxNQUFNQyxVQUFOLENBQWlCO0VBS0csT0FBWEMsV0FBVyxHQUFHUCxjQUFIO0VBR0ssT0FBaEJRLGdCQUFnQixHQUFHLEVBQUg7RUFLdkJDLFNBQVMsR0FBRyxJQUFIO0VBS1RDLElBQUk7RUFLSkMsV0FBVztFQUVYQyxPQUFPLEdBQUdBLGdCQUFIO0VBVVBDLFFBQVEsR0FBR0MsNEJBQUg7RUFFUkMsc0JBQXNCLEdBQUcsS0FBSDtFQUd0QkMsYUFBYSxHQUFHLEVBQUg7RUFHYkMsWUFBWSxHQUFHLEVBQUg7RUFFWkMsbUJBQW1CLEdBQUdkLHNCQUFIO0VBRW5CZSxjQUFjLEdBQUcsQ0FBSDtFQUdkQyxpQkFBaUIsR0FBRyxFQUFIO0VBR2pCQyxvQkFBb0IsR0FBRyxFQUFIO0VBR3BCQyxjQUFjLEdBQUcsRUFBSDtFQUdkQyxjQUFjLEdBQUcsSUFBSDtFQUdkQyxhQUFhLEdBQUc7SUFBQ0MsUUFBUSxFQUFFO0VBQVgsQ0FBSDtFQUliQyxZQUFZLEdBQUcsSUFBSUMsb0JBQUosRUFBSDtFQUtaQyxJQUFJO0VBS0pDLG9CQUFvQixHQUFHLEtBQUg7RUFLcEJDLGtCQUFrQjtFQUtsQkMsa0JBQWtCLEdBQUcsSUFBSUMsa0JBQUosRUFBSDtFQVFsQkMsUUFBUSxHQUFHLElBQUlDLHVCQUFKLEVBQUg7O0VBTVJDLFdBQVcsQ0FBQ3pCLElBQUksR0FBaUMsRUFBdEMsRUFBMkNvQixr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
336
+ /**
337
+ * Make the basedriver version available so for any driver which inherits from this package, we
338
+ * know which version of basedriver it inherited from
339
+ */
340
+ DriverCore.baseVersion = BASEDRIVER_VER;
341
+ /** @type {import('@appium/types').ExecuteMethodMap<DriverCore>} */
342
+ DriverCore.executeMethodMap = {};
343
+ /**
344
+ * @typedef {import('@appium/types').Driver} Driver
345
+ * @typedef {import('@appium/types').Constraints} Constraints
346
+ * @typedef {import('@appium/types').ServerArgs} ServerArgs
347
+ * @typedef {import('@appium/types').EventHistory} EventHistory
348
+ * @typedef {import('@appium/types').AppiumLogger} AppiumLogger
349
+ * @typedef {import('@appium/types').StringRecord} StringRecord
350
+ * @typedef {import('@appium/types').BaseDriverCapConstraints} BaseDriverCapConstraints
351
+ */
352
+ /**
353
+ * @template {Constraints} [C=BaseDriverCapConstraints]
354
+ * @template {StringRecord|void} [Extra=void]
355
+ * @typedef {import('@appium/types').Capabilities<C, Extra>} Capabilities
356
+ */
357
+ /**
358
+ * @template {StringRecord} [T={}]
359
+ * @typedef {import('@appium/types').W3CCapabilities<T>} W3CCapabilities
360
+ */
361
+ /**
362
+ * @template {Constraints} C
363
+ * @typedef {import('@appium/types').Core<C>} Core
364
+ */
365
+ /**
366
+ * @template {Constraints} C
367
+ * @typedef {import('@appium/types').DriverOpts<C>} DriverOpts
368
+ */
369
+ //# sourceMappingURL=core.js.map