appium 2.0.0-beta.35 → 2.0.0-beta.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/appium.d.ts +41 -52
- package/build/lib/appium.d.ts.map +1 -1
- package/build/lib/appium.js +32 -15
- package/build/lib/cli/args.d.ts +1 -1
- package/build/lib/cli/args.d.ts.map +1 -1
- package/build/lib/cli/args.js +1 -1
- package/build/lib/cli/driver-command.d.ts +3 -3
- package/build/lib/cli/driver-command.d.ts.map +1 -1
- package/build/lib/cli/driver-command.js +1 -1
- package/build/lib/cli/extension-command.d.ts +60 -38
- package/build/lib/cli/extension-command.d.ts.map +1 -1
- package/build/lib/cli/extension-command.js +115 -59
- package/build/lib/cli/extension.d.ts +9 -5
- package/build/lib/cli/extension.d.ts.map +1 -1
- package/build/lib/cli/extension.js +5 -7
- package/build/lib/cli/parser.d.ts +3 -3
- package/build/lib/cli/parser.d.ts.map +1 -1
- package/build/lib/cli/parser.js +1 -1
- package/build/lib/cli/plugin-command.d.ts +1 -1
- package/build/lib/cli/plugin-command.d.ts.map +1 -1
- package/build/lib/cli/plugin-command.js +1 -1
- package/build/lib/cli/utils.js +1 -1
- package/build/lib/config-file.d.ts.map +1 -1
- package/build/lib/config-file.js +1 -1
- package/build/lib/config.d.ts +4 -4
- package/build/lib/config.d.ts.map +1 -1
- package/build/lib/config.js +1 -1
- package/build/lib/constants.d.ts.map +1 -1
- package/build/lib/constants.js +1 -1
- package/build/lib/extension/driver-config.d.ts +29 -32
- package/build/lib/extension/driver-config.d.ts.map +1 -1
- package/build/lib/extension/driver-config.js +7 -20
- package/build/lib/extension/extension-config.d.ts +108 -36
- package/build/lib/extension/extension-config.d.ts.map +1 -1
- package/build/lib/extension/extension-config.js +199 -60
- package/build/lib/extension/index.d.ts +16 -7
- package/build/lib/extension/index.d.ts.map +1 -1
- package/build/lib/extension/index.js +15 -18
- package/build/lib/extension/manifest.d.ts +12 -12
- package/build/lib/extension/manifest.d.ts.map +1 -1
- package/build/lib/extension/manifest.js +13 -3
- package/build/lib/extension/package-changed.d.ts.map +1 -1
- package/build/lib/extension/package-changed.js +1 -1
- package/build/lib/extension/plugin-config.d.ts +19 -24
- package/build/lib/extension/plugin-config.d.ts.map +1 -1
- package/build/lib/extension/plugin-config.js +9 -18
- package/build/lib/grid-register.d.ts.map +1 -1
- package/build/lib/grid-register.js +1 -1
- package/build/lib/logger.d.ts +1 -1
- package/build/lib/logger.d.ts.map +1 -1
- package/build/lib/logger.js +1 -1
- package/build/lib/logsink.d.ts.map +1 -1
- package/build/lib/logsink.js +3 -2
- package/build/lib/main.d.ts +13 -12
- package/build/lib/main.d.ts.map +1 -1
- package/build/lib/main.js +4 -4
- package/build/lib/schema/arg-spec.d.ts +4 -4
- package/build/lib/schema/arg-spec.d.ts.map +1 -1
- package/build/lib/schema/arg-spec.js +1 -1
- package/build/lib/schema/cli-args.d.ts.map +1 -1
- package/build/lib/schema/cli-args.js +1 -1
- package/build/lib/schema/cli-transformers.d.ts.map +1 -1
- package/build/lib/schema/cli-transformers.js +1 -1
- package/build/lib/schema/keywords.d.ts.map +1 -1
- package/build/lib/schema/keywords.js +1 -1
- package/build/lib/schema/schema.d.ts +2 -2
- package/build/lib/schema/schema.d.ts.map +1 -1
- package/build/lib/schema/schema.js +1 -1
- package/build/lib/utils.d.ts.map +1 -1
- package/build/lib/utils.js +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/appium-manifest.d.ts +23 -4
- package/build/types/appium-manifest.d.ts.map +1 -1
- package/build/types/cli.d.ts.map +1 -1
- package/build/types/{external-manifest.d.ts → extension-manifest.d.ts} +15 -7
- package/build/types/extension-manifest.d.ts.map +1 -0
- package/build/types/index.d.ts +6 -5
- package/build/types/index.d.ts.map +1 -1
- package/driver.d.ts +1 -0
- package/driver.js +14 -0
- package/lib/appium.js +208 -124
- package/lib/cli/args.js +143 -93
- package/lib/cli/driver-command.js +10 -15
- package/lib/cli/extension-command.js +226 -175
- package/lib/cli/extension.js +15 -19
- package/lib/cli/parser.js +19 -31
- package/lib/cli/plugin-command.js +8 -8
- package/lib/cli/utils.js +8 -14
- package/lib/config-file.js +21 -25
- package/lib/config.js +82 -64
- package/lib/constants.js +4 -13
- package/lib/extension/driver-config.js +171 -171
- package/lib/extension/extension-config.js +347 -126
- package/lib/extension/index.js +72 -58
- package/lib/extension/manifest.js +48 -57
- package/lib/extension/package-changed.js +9 -8
- package/lib/extension/plugin-config.js +62 -62
- package/lib/grid-register.js +29 -18
- package/lib/logger.js +1 -2
- package/lib/logsink.js +29 -31
- package/lib/main.js +111 -73
- package/lib/schema/arg-spec.js +10 -13
- package/lib/schema/cli-args.js +14 -37
- package/lib/schema/cli-transformers.js +7 -14
- package/lib/schema/keywords.js +15 -13
- package/lib/schema/schema.js +58 -75
- package/lib/utils.js +50 -25
- package/package.json +25 -18
- package/plugin.d.ts +1 -0
- package/plugin.js +13 -0
- package/scripts/autoinstall-extensions.js +177 -0
- package/support.d.ts +1 -0
- package/support.js +13 -0
- package/types/appium-manifest.ts +27 -15
- package/types/cli.ts +2 -9
- package/types/{external-manifest.ts → extension-manifest.ts} +21 -15
- package/types/index.ts +12 -5
- package/build/types/extension.d.ts +0 -43
- package/build/types/extension.d.ts.map +0 -1
- package/build/types/external-manifest.d.ts.map +0 -1
- package/scripts/postinstall.js +0 -71
- package/types/extension.ts +0 -56
|
@@ -11,10 +11,20 @@ require("source-map-support/register");
|
|
|
11
11
|
|
|
12
12
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
13
|
|
|
14
|
+
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
15
|
+
|
|
14
16
|
var _path = _interopRequireDefault(require("path"));
|
|
15
17
|
|
|
16
18
|
var _resolveFrom = _interopRequireDefault(require("resolve-from"));
|
|
17
19
|
|
|
20
|
+
var _semver = require("semver");
|
|
21
|
+
|
|
22
|
+
var _support = require("@appium/support");
|
|
23
|
+
|
|
24
|
+
var _extension = require("../cli/extension");
|
|
25
|
+
|
|
26
|
+
var _config = require("../config");
|
|
27
|
+
|
|
18
28
|
var _logger = _interopRequireDefault(require("../logger"));
|
|
19
29
|
|
|
20
30
|
var _schema = require("../schema/schema");
|
|
@@ -36,13 +46,12 @@ class ExtensionConfig {
|
|
|
36
46
|
installedExtensions;
|
|
37
47
|
log;
|
|
38
48
|
manifest;
|
|
49
|
+
_listDataCache;
|
|
39
50
|
|
|
40
|
-
constructor(extensionType, manifest
|
|
41
|
-
const logger = _lodash.default.isFunction(logFn) ? logFn : _logger.default.error.bind(_logger.default);
|
|
51
|
+
constructor(extensionType, manifest) {
|
|
42
52
|
this.extensionType = extensionType;
|
|
43
53
|
this.configKey = `${extensionType}s`;
|
|
44
54
|
this.installedExtensions = manifest.getExtensionData(extensionType);
|
|
45
|
-
this.log = logger;
|
|
46
55
|
this.manifest = manifest;
|
|
47
56
|
}
|
|
48
57
|
|
|
@@ -54,50 +63,185 @@ class ExtensionConfig {
|
|
|
54
63
|
return this.manifest.appiumHome;
|
|
55
64
|
}
|
|
56
65
|
|
|
57
|
-
|
|
58
|
-
|
|
66
|
+
getProblems(extName, extManifest) {
|
|
67
|
+
return [...this.getGenericConfigProblems(extManifest, extName), ...this.getConfigProblems(extManifest, extName), ...this.getSchemaProblems(extManifest, extName)];
|
|
68
|
+
}
|
|
59
69
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
70
|
+
async getWarnings(extName, extManifest) {
|
|
71
|
+
const [genericConfigWarnings, configWarnings] = await _bluebird.default.all([this.getGenericConfigWarnings(extManifest, extName), this.getConfigWarnings(extManifest, extName)]);
|
|
72
|
+
return [...genericConfigWarnings, ...configWarnings];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async getConfigWarnings(extManifest, extName) {
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
63
78
|
|
|
64
|
-
|
|
79
|
+
getValidationResultSummaries(errorMap = new Map(), warningMap = new Map()) {
|
|
80
|
+
const errorSummaries = [];
|
|
65
81
|
|
|
66
|
-
for (const [extName, problems] of
|
|
82
|
+
for (const [extName, problems] of errorMap.entries()) {
|
|
67
83
|
if (_lodash.default.isEmpty(problems)) {
|
|
68
84
|
continue;
|
|
69
85
|
}
|
|
70
86
|
|
|
71
|
-
|
|
72
|
-
problemSummaries.push(`${this.extensionType} ${extName} had errors and will not ` + `be available. Errors:`);
|
|
87
|
+
errorSummaries.push(`${this.extensionType} "${extName}" had ${_support.util.pluralize('error', problems.length)} and will not be available:`);
|
|
73
88
|
|
|
74
89
|
for (const problem of problems) {
|
|
75
|
-
|
|
90
|
+
errorSummaries.push(` - ${problem.err} (Actual value: ` + `${JSON.stringify(problem.val)})`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const warningSummaries = [];
|
|
95
|
+
|
|
96
|
+
for (const [extName, warnings] of warningMap.entries()) {
|
|
97
|
+
if (_lodash.default.isEmpty(warnings)) {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const extTypeText = _lodash.default.capitalize(this.extensionType);
|
|
102
|
+
|
|
103
|
+
const problemEnumerationText = _support.util.pluralize('potential problem', warnings.length, true);
|
|
104
|
+
|
|
105
|
+
warningSummaries.push(`${extTypeText} "${extName}" has ${problemEnumerationText}: `);
|
|
106
|
+
|
|
107
|
+
for (const warning of warnings) {
|
|
108
|
+
warningSummaries.push(` - ${warning}`);
|
|
76
109
|
}
|
|
77
110
|
}
|
|
78
111
|
|
|
79
|
-
|
|
80
|
-
|
|
112
|
+
return {
|
|
113
|
+
errorSummaries,
|
|
114
|
+
warningSummaries
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async _validate(exts) {
|
|
119
|
+
const errorMap = new Map();
|
|
120
|
+
const warningMap = new Map();
|
|
81
121
|
|
|
82
|
-
|
|
83
|
-
|
|
122
|
+
for (const [extName, extManifest] of _lodash.default.toPairs(exts)) {
|
|
123
|
+
const [errors, warnings] = await _bluebird.default.all([this.getProblems(extName, extManifest), this.getWarnings(extName, extManifest)]);
|
|
124
|
+
|
|
125
|
+
if (errors.length) {
|
|
126
|
+
delete exts[extName];
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
errorMap.set(extName, errors);
|
|
130
|
+
warningMap.set(extName, warnings);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const {
|
|
134
|
+
errorSummaries,
|
|
135
|
+
warningSummaries
|
|
136
|
+
} = this.getValidationResultSummaries(errorMap, warningMap);
|
|
137
|
+
|
|
138
|
+
if (!_lodash.default.isEmpty(errorSummaries)) {
|
|
139
|
+
_logger.default.error(`Appium encountered ${_support.util.pluralize('error', errorSummaries.length, true)} while validating ${this.configKey} found in manifest ${this.manifestPath}`);
|
|
140
|
+
|
|
141
|
+
for (const summary of errorSummaries) {
|
|
142
|
+
_logger.default.error(summary);
|
|
143
|
+
}
|
|
144
|
+
} else {
|
|
145
|
+
if (!_lodash.default.isEmpty(warningSummaries)) {
|
|
146
|
+
_logger.default.warn(`Appium encountered ${_support.util.pluralize('warning', warningSummaries.length, true)} while validating ${this.configKey} found in manifest ${this.manifestPath}`);
|
|
147
|
+
|
|
148
|
+
for (const summary of warningSummaries) {
|
|
149
|
+
_logger.default.warn(summary);
|
|
150
|
+
}
|
|
84
151
|
}
|
|
85
152
|
}
|
|
86
153
|
|
|
87
154
|
return exts;
|
|
88
155
|
}
|
|
89
156
|
|
|
90
|
-
|
|
157
|
+
async getListData() {
|
|
158
|
+
if (this._listDataCache) {
|
|
159
|
+
return this._listDataCache;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const CommandClass = _extension.commandClasses[this.extensionType];
|
|
163
|
+
const cmd = new CommandClass({
|
|
164
|
+
config: this,
|
|
165
|
+
json: true
|
|
166
|
+
});
|
|
167
|
+
const listData = await cmd.list({
|
|
168
|
+
showInstalled: true,
|
|
169
|
+
showUpdates: true
|
|
170
|
+
});
|
|
171
|
+
this._listDataCache = listData;
|
|
172
|
+
return listData;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
async getGenericConfigWarnings(extManifest, extName) {
|
|
176
|
+
const {
|
|
177
|
+
appiumVersion,
|
|
178
|
+
installSpec,
|
|
179
|
+
installType,
|
|
180
|
+
pkgName
|
|
181
|
+
} = extManifest;
|
|
182
|
+
const warnings = [];
|
|
183
|
+
const invalidFields = [];
|
|
184
|
+
|
|
185
|
+
if (!_lodash.default.isString(installSpec)) {
|
|
186
|
+
invalidFields.push('installSpec');
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (!INSTALL_TYPES.has(installType)) {
|
|
190
|
+
invalidFields.push('installType');
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const extTypeText = _lodash.default.capitalize(this.extensionType);
|
|
194
|
+
|
|
195
|
+
if (invalidFields.length) {
|
|
196
|
+
const invalidFieldsEnumerationText = _support.util.pluralize('invalid or missing field', invalidFields.length, true);
|
|
197
|
+
|
|
198
|
+
const invalidFieldsText = invalidFields.map(field => `"${field}"`).join(', ');
|
|
199
|
+
warnings.push(`${extTypeText} "${extName}" (package \`${pkgName}\`) has ${invalidFieldsEnumerationText} (${invalidFieldsText}) in \`extensions.yaml\`; this may cause upgrades done via the \`appium\` CLI tool to fail. Please reinstall with \`appium ${this.extensionType} uninstall ${extName}\` and \`appium ${this.extensionType} install ${extName}\` to attempt a fix.`);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const createPeerWarning = reason => `${extTypeText} "${extName}" (package \`${pkgName}\`) may be incompatible with the current version of Appium (v${_config.APPIUM_VER}) due to ${reason}`;
|
|
203
|
+
|
|
204
|
+
if (_lodash.default.isString(appiumVersion) && !(0, _semver.satisfies)(_config.APPIUM_VER, appiumVersion)) {
|
|
205
|
+
const listData = await this.getListData();
|
|
206
|
+
const extListData = listData[extName];
|
|
207
|
+
|
|
208
|
+
if (extListData !== null && extListData !== void 0 && extListData.installed) {
|
|
209
|
+
const {
|
|
210
|
+
updateVersion,
|
|
211
|
+
upToDate
|
|
212
|
+
} = extListData;
|
|
213
|
+
|
|
214
|
+
if (!upToDate) {
|
|
215
|
+
warnings.push(createPeerWarning(`its peer dependency on older Appium v${appiumVersion}. Please upgrade \`${pkgName}\` to v${updateVersion} or newer.`));
|
|
216
|
+
} else {
|
|
217
|
+
warnings.push(createPeerWarning(`its peer dependency on older Appium v${appiumVersion}. Please ask the developer of \`${pkgName}\` to update the peer dependency on Appium to v${_config.APPIUM_VER}.`));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
} else if (!_lodash.default.isString(appiumVersion)) {
|
|
221
|
+
const listData = await this.getListData();
|
|
222
|
+
const extListData = listData[extName];
|
|
223
|
+
|
|
224
|
+
if (!(extListData !== null && extListData !== void 0 && extListData.upToDate) && extListData !== null && extListData !== void 0 && extListData.updateVersion) {
|
|
225
|
+
warnings.push(createPeerWarning(`an invalid or missing peer dependency on Appium. A newer version of \`${pkgName}\` is available; please attempt to upgrade "${extName}" to v${extListData.updateVersion} or newer.`));
|
|
226
|
+
} else {
|
|
227
|
+
warnings.push(createPeerWarning(`an invalid or missing peer dependency on Appium. Please ask the developer of \`${pkgName}\` to add a peer dependency on \`^appium@${_config.APPIUM_VER}\`.`));
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return warnings;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
getSchemaProblems(extManifest, extName) {
|
|
91
235
|
const problems = [];
|
|
92
236
|
const {
|
|
93
237
|
schema: argSchemaPath
|
|
94
|
-
} =
|
|
238
|
+
} = extManifest;
|
|
95
239
|
|
|
96
|
-
if (ExtensionConfig.extDataHasSchema(
|
|
240
|
+
if (ExtensionConfig.extDataHasSchema(extManifest)) {
|
|
97
241
|
if (_lodash.default.isString(argSchemaPath)) {
|
|
98
242
|
if ((0, _schema.isAllowedSchemaFileExtension)(argSchemaPath)) {
|
|
99
243
|
try {
|
|
100
|
-
this.readExtensionSchema(extName,
|
|
244
|
+
this.readExtensionSchema(extName, extManifest);
|
|
101
245
|
} catch (err) {
|
|
102
246
|
problems.push({
|
|
103
247
|
err: `Unable to register schema at path ${argSchemaPath}; ${err.message}`,
|
|
@@ -112,7 +256,7 @@ class ExtensionConfig {
|
|
|
112
256
|
}
|
|
113
257
|
} else if (_lodash.default.isPlainObject(argSchemaPath)) {
|
|
114
258
|
try {
|
|
115
|
-
this.readExtensionSchema(extName,
|
|
259
|
+
this.readExtensionSchema(extName, extManifest);
|
|
116
260
|
} catch (err) {
|
|
117
261
|
problems.push({
|
|
118
262
|
err: `Unable to register embedded schema; ${err.message}`,
|
|
@@ -130,47 +274,31 @@ class ExtensionConfig {
|
|
|
130
274
|
return problems;
|
|
131
275
|
}
|
|
132
276
|
|
|
133
|
-
getGenericConfigProblems(
|
|
277
|
+
getGenericConfigProblems(extManifest, extName) {
|
|
134
278
|
const {
|
|
135
279
|
version,
|
|
136
280
|
pkgName,
|
|
137
|
-
installSpec,
|
|
138
|
-
installType,
|
|
139
281
|
mainClass
|
|
140
|
-
} =
|
|
282
|
+
} = extManifest;
|
|
141
283
|
const problems = [];
|
|
142
284
|
|
|
143
285
|
if (!_lodash.default.isString(version)) {
|
|
144
286
|
problems.push({
|
|
145
|
-
err:
|
|
287
|
+
err: `Invalid or missing \`version\` field in my \`package.json\` and/or \`extensions.yaml\` (must be a string)`,
|
|
146
288
|
val: version
|
|
147
289
|
});
|
|
148
290
|
}
|
|
149
291
|
|
|
150
292
|
if (!_lodash.default.isString(pkgName)) {
|
|
151
293
|
problems.push({
|
|
152
|
-
err:
|
|
294
|
+
err: `Invalid or missing \`name\` field in my \`package.json\` and/or \`extensions.yaml\` (must be a string)`,
|
|
153
295
|
val: pkgName
|
|
154
296
|
});
|
|
155
297
|
}
|
|
156
298
|
|
|
157
|
-
if (!_lodash.default.isString(installSpec)) {
|
|
158
|
-
problems.push({
|
|
159
|
-
err: 'Missing or incorrect installation spec',
|
|
160
|
-
val: installSpec
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
if (!INSTALL_TYPES.has(installType)) {
|
|
165
|
-
problems.push({
|
|
166
|
-
err: 'Missing or incorrect install type',
|
|
167
|
-
val: installType
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
|
|
171
299
|
if (!_lodash.default.isString(mainClass)) {
|
|
172
300
|
problems.push({
|
|
173
|
-
err:
|
|
301
|
+
err: `Invalid or missing \`appium.mainClass\` field in my \`package.json\` and/or \`mainClass\` field in \`extensions.yaml\` (must be a string)`,
|
|
174
302
|
val: mainClass
|
|
175
303
|
});
|
|
176
304
|
}
|
|
@@ -178,25 +306,25 @@ class ExtensionConfig {
|
|
|
178
306
|
return problems;
|
|
179
307
|
}
|
|
180
308
|
|
|
181
|
-
getConfigProblems(
|
|
309
|
+
getConfigProblems(extManifest, extName) {
|
|
182
310
|
return [];
|
|
183
311
|
}
|
|
184
312
|
|
|
185
|
-
async addExtension(extName,
|
|
313
|
+
async addExtension(extName, extManifest, {
|
|
186
314
|
write = true
|
|
187
315
|
} = {}) {
|
|
188
|
-
this.manifest.addExtension(this.extensionType, extName,
|
|
316
|
+
this.manifest.addExtension(this.extensionType, extName, extManifest);
|
|
189
317
|
|
|
190
318
|
if (write) {
|
|
191
319
|
await this.manifest.write();
|
|
192
320
|
}
|
|
193
321
|
}
|
|
194
322
|
|
|
195
|
-
async updateExtension(extName,
|
|
323
|
+
async updateExtension(extName, extManifest, {
|
|
196
324
|
write = true
|
|
197
325
|
} = {}) {
|
|
198
326
|
this.installedExtensions[extName] = { ...this.installedExtensions[extName],
|
|
199
|
-
...
|
|
327
|
+
...extManifest
|
|
200
328
|
};
|
|
201
329
|
|
|
202
330
|
if (write) {
|
|
@@ -223,12 +351,12 @@ class ExtensionConfig {
|
|
|
223
351
|
|
|
224
352
|
_logger.default.info(`Available ${this.configKey}:`);
|
|
225
353
|
|
|
226
|
-
for (const [extName,
|
|
227
|
-
_logger.default.info(` - ${this.extensionDesc(extName,
|
|
354
|
+
for (const [extName, extManifest] of _lodash.default.toPairs(this.installedExtensions)) {
|
|
355
|
+
_logger.default.info(` - ${this.extensionDesc(extName, extManifest)}`);
|
|
228
356
|
}
|
|
229
357
|
}
|
|
230
358
|
|
|
231
|
-
extensionDesc(extName,
|
|
359
|
+
extensionDesc(extName, extManifest) {
|
|
232
360
|
throw new Error('This must be implemented in a subclass');
|
|
233
361
|
}
|
|
234
362
|
|
|
@@ -241,8 +369,13 @@ class ExtensionConfig {
|
|
|
241
369
|
mainClass
|
|
242
370
|
} = this.installedExtensions[extName];
|
|
243
371
|
const reqPath = this.getInstallPath(extName);
|
|
372
|
+
let reqResolved;
|
|
244
373
|
|
|
245
|
-
|
|
374
|
+
try {
|
|
375
|
+
reqResolved = require.resolve(reqPath);
|
|
376
|
+
} catch (err) {
|
|
377
|
+
throw new ReferenceError(`Could not find a ${this.extensionType} installed at ${reqPath}`);
|
|
378
|
+
}
|
|
246
379
|
|
|
247
380
|
if (process.env.APPIUM_RELOAD_EXTENSIONS && require.cache[reqResolved]) {
|
|
248
381
|
_logger.default.debug(`Removing ${reqResolved} from require cache`);
|
|
@@ -252,18 +385,24 @@ class ExtensionConfig {
|
|
|
252
385
|
|
|
253
386
|
_logger.default.debug(`Requiring ${this.extensionType} at ${reqPath}`);
|
|
254
387
|
|
|
255
|
-
|
|
388
|
+
const MainClass = require(reqPath)[mainClass];
|
|
389
|
+
|
|
390
|
+
if (!MainClass) {
|
|
391
|
+
throw new ReferenceError(`Could not find a class named "${mainClass}" exported by ${this.extensionType} "${extName}"`);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
return MainClass;
|
|
256
395
|
}
|
|
257
396
|
|
|
258
397
|
isInstalled(extName) {
|
|
259
398
|
return _lodash.default.includes(Object.keys(this.installedExtensions), extName);
|
|
260
399
|
}
|
|
261
400
|
|
|
262
|
-
static _readExtensionSchema(appiumHome, extType, extName,
|
|
401
|
+
static _readExtensionSchema(appiumHome, extType, extName, extManifest) {
|
|
263
402
|
const {
|
|
264
403
|
pkgName,
|
|
265
404
|
schema: argSchemaPath
|
|
266
|
-
} =
|
|
405
|
+
} = extManifest;
|
|
267
406
|
|
|
268
407
|
if (!argSchemaPath) {
|
|
269
408
|
throw new TypeError(`No \`schema\` property found in config for ${extType} ${pkgName} -- why is this function being called?`);
|
|
@@ -283,15 +422,15 @@ class ExtensionConfig {
|
|
|
283
422
|
return schema;
|
|
284
423
|
}
|
|
285
424
|
|
|
286
|
-
static extDataHasSchema(
|
|
287
|
-
return _lodash.default.isString(
|
|
425
|
+
static extDataHasSchema(extManifest) {
|
|
426
|
+
return _lodash.default.isString(extManifest === null || extManifest === void 0 ? void 0 : extManifest.schema) || _lodash.default.isObject(extManifest === null || extManifest === void 0 ? void 0 : extManifest.schema);
|
|
288
427
|
}
|
|
289
428
|
|
|
290
|
-
readExtensionSchema(extName,
|
|
291
|
-
return ExtensionConfig._readExtensionSchema(this.appiumHome, this.extensionType, extName,
|
|
429
|
+
readExtensionSchema(extName, extManifest) {
|
|
430
|
+
return ExtensionConfig._readExtensionSchema(this.appiumHome, this.extensionType, extName, extManifest);
|
|
292
431
|
}
|
|
293
432
|
|
|
294
433
|
}
|
|
295
434
|
|
|
296
435
|
exports.ExtensionConfig = ExtensionConfig;
|
|
297
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJTlNUQUxMX1RZUEVfTlBNIiwiSU5TVEFMTF9UWVBFX0xPQ0FMIiwiSU5TVEFMTF9UWVBFX0dJVEhVQiIsIklOU1RBTExfVFlQRV9HSVQiLCJJTlNUQUxMX1RZUEVTIiwiU2V0IiwiRXh0ZW5zaW9uQ29uZmlnIiwiZXh0ZW5zaW9uVHlwZSIsImNvbmZpZ0tleSIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJsb2ciLCJtYW5pZmVzdCIsImNvbnN0cnVjdG9yIiwibG9nRm4iLCJsb2dnZXIiLCJfIiwiaXNGdW5jdGlvbiIsImVycm9yIiwiYmluZCIsImdldEV4dGVuc2lvbkRhdGEiLCJtYW5pZmVzdFBhdGgiLCJhcHBpdW1Ib21lIiwidmFsaWRhdGUiLCJleHRzIiwiZm91bmRQcm9ibGVtcyIsImV4dE5hbWUiLCJleHREYXRhIiwidG9QYWlycyIsImdldEdlbmVyaWNDb25maWdQcm9ibGVtcyIsImdldENvbmZpZ1Byb2JsZW1zIiwiZ2V0U2NoZW1hUHJvYmxlbXMiLCJwcm9ibGVtU3VtbWFyaWVzIiwicHJvYmxlbXMiLCJpc0VtcHR5IiwicHVzaCIsInByb2JsZW0iLCJlcnIiLCJKU09OIiwic3RyaW5naWZ5IiwidmFsIiwic3VtbWFyeSIsInNjaGVtYSIsImFyZ1NjaGVtYVBhdGgiLCJleHREYXRhSGFzU2NoZW1hIiwiaXNTdHJpbmciLCJyZWFkRXh0ZW5zaW9uU2NoZW1hIiwibWVzc2FnZSIsIkFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMiLCJqb2luIiwiaXNQbGFpbk9iamVjdCIsInZlcnNpb24iLCJwa2dOYW1lIiwiaW5zdGFsbFNwZWMiLCJpbnN0YWxsVHlwZSIsIm1haW5DbGFzcyIsImhhcyIsImFkZEV4dGVuc2lvbiIsIndyaXRlIiwidXBkYXRlRXh0ZW5zaW9uIiwicmVtb3ZlRXh0ZW5zaW9uIiwicHJpbnQiLCJhY3RpdmVOYW1lcyIsImluZm8iLCJleHRlbnNpb25EZXNjIiwiRXJyb3IiLCJnZXRJbnN0YWxsUGF0aCIsInBhdGgiLCJyZXF1aXJlIiwicmVxUGF0aCIsInJlcVJlc29sdmVkIiwicmVzb2x2ZSIsInByb2Nlc3MiLCJlbnYiLCJBUFBJVU1fUkVMT0FEX0VYVEVOU0lPTlMiLCJjYWNoZSIsImRlYnVnIiwiaXNJbnN0YWxsZWQiLCJpbmNsdWRlcyIsIk9iamVjdCIsImtleXMiLCJfcmVhZEV4dGVuc2lvblNjaGVtYSIsImV4dFR5cGUiLCJUeXBlRXJyb3IiLCJtb2R1bGVPYmplY3QiLCJzY2hlbWFQYXRoIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJpc09iamVjdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCByZXNvbHZlRnJvbSBmcm9tICdyZXNvbHZlLWZyb20nO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHtcbiAgQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyxcbiAgaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbixcbiAgcmVnaXN0ZXJTY2hlbWEsXG59IGZyb20gJy4uL3NjaGVtYS9zY2hlbWEnO1xuXG5jb25zdCBJTlNUQUxMX1RZUEVfTlBNID0gJ25wbSc7XG5jb25zdCBJTlNUQUxMX1RZUEVfTE9DQUwgPSAnbG9jYWwnO1xuY29uc3QgSU5TVEFMTF9UWVBFX0dJVEhVQiA9ICdnaXRodWInO1xuY29uc3QgSU5TVEFMTF9UWVBFX0dJVCA9ICdnaXQnO1xuXG4vKiogQHR5cGUge1NldDxJbnN0YWxsVHlwZT59ICovXG5jb25zdCBJTlNUQUxMX1RZUEVTID0gbmV3IFNldChbXG4gIElOU1RBTExfVFlQRV9HSVQsXG4gIElOU1RBTExfVFlQRV9HSVRIVUIsXG4gIElOU1RBTExfVFlQRV9MT0NBTCxcbiAgSU5TVEFMTF9UWVBFX05QTSxcbl0pO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgYWJzdHJhY3QuIEl0IHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LlxuICpcbiAqIFN1YmNsYXNzZXMgc2hvdWxkIHByb3ZpZGUgdGhlIGdlbmVyaWMgcGFyYW1ldGVyIHRvIGltcGxlbWVudC5cbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICovXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uQ29uZmlnIHtcbiAgLyoqIEB0eXBlIHtFeHRUeXBlfSAqL1xuICBleHRlbnNpb25UeXBlO1xuXG4gIC8qKiBAdHlwZSB7YCR7RXh0VHlwZX1zYH0gKi9cbiAgY29uZmlnS2V5O1xuXG4gIC8qKiBAdHlwZSB7RXh0UmVjb3JkPEV4dFR5cGU+fSAqL1xuICBpbnN0YWxsZWRFeHRlbnNpb25zO1xuXG4gIC8qKiBAdHlwZSB7RXh0ZW5zaW9uTG9nRm59ICovXG4gIGxvZztcblxuICAvKiogQHR5cGUge01hbmlmZXN0fSAqL1xuICBtYW5pZmVzdDtcblxuICAvKipcbiAgICogQHByb3RlY3RlZFxuICAgKiBAcGFyYW0ge0V4dFR5cGV9IGV4dGVuc2lvblR5cGUgLSBUeXBlIG9mIGV4dGVuc2lvblxuICAgKiBAcGFyYW0ge01hbmlmZXN0fSBtYW5pZmVzdCAtIGBNYW5pZmVzdGAgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Mb2dGbn0gW2xvZ0ZuXVxuICAgKi9cbiAgY29uc3RydWN0b3IgKGV4dGVuc2lvblR5cGUsIG1hbmlmZXN0LCBsb2dGbikge1xuICAgIGNvbnN0IGxvZ2dlciA9IF8uaXNGdW5jdGlvbihsb2dGbikgPyBsb2dGbiA6IGxvZy5lcnJvci5iaW5kKGxvZyk7XG4gICAgdGhpcy5leHRlbnNpb25UeXBlID0gZXh0ZW5zaW9uVHlwZTtcbiAgICB0aGlzLmNvbmZpZ0tleSA9IGAke2V4dGVuc2lvblR5cGV9c2A7XG4gICAgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zID0gbWFuaWZlc3QuZ2V0RXh0ZW5zaW9uRGF0YShleHRlbnNpb25UeXBlKTtcbiAgICB0aGlzLmxvZyA9IGxvZ2dlcjtcbiAgICB0aGlzLm1hbmlmZXN0ID0gbWFuaWZlc3Q7XG4gIH1cblxuICBnZXQgbWFuaWZlc3RQYXRoICgpIHtcbiAgICByZXR1cm4gdGhpcy5tYW5pZmVzdC5tYW5pZmVzdFBhdGg7XG4gIH1cblxuICBnZXQgYXBwaXVtSG9tZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFuaWZlc3QuYXBwaXVtSG9tZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgZXh0ZW5zaW9ucyBmb3IgcHJvYmxlbXNcbiAgICogQHBhcmFtIHtFeHRSZWNvcmQ8RXh0VHlwZT59IGV4dHMgLSBFeHRlbnNpb24gZGF0YVxuICAgKi9cbiAgdmFsaWRhdGUgKGV4dHMpIHtcbiAgICBjb25zdCBmb3VuZFByb2JsZW1zID1cbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPEV4dE5hbWU8RXh0VHlwZT4sUHJvYmxlbVtdPn0gKi8gKHt9KTtcbiAgICBmb3IgKGNvbnN0IFtcbiAgICAgIGV4dE5hbWUsXG4gICAgICBleHREYXRhLFxuICAgIF0gb2YgLyoqIEB0eXBlIHtbRXh0TmFtZTxFeHRUeXBlPiwgRXh0TWFuaWZlc3Q8RXh0VHlwZT5dW119ICovIChcbiAgICAgICAgXy50b1BhaXJzKGV4dHMpXG4gICAgICApKSB7XG4gICAgICBmb3VuZFByb2JsZW1zW2V4dE5hbWVdID0gW1xuICAgICAgICAuLi50aGlzLmdldEdlbmVyaWNDb25maWdQcm9ibGVtcyhleHREYXRhLCBleHROYW1lKSxcbiAgICAgICAgLi4udGhpcy5nZXRDb25maWdQcm9ibGVtcyhleHREYXRhKSxcbiAgICAgICAgLi4udGhpcy5nZXRTY2hlbWFQcm9ibGVtcyhleHREYXRhLCBleHROYW1lKSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgY29uc3QgcHJvYmxlbVN1bW1hcmllcyA9IFtdO1xuICAgIGZvciAoY29uc3QgW2V4dE5hbWUsIHByb2JsZW1zXSBvZiBfLnRvUGFpcnMoZm91bmRQcm9ibGVtcykpIHtcbiAgICAgIGlmIChfLmlzRW1wdHkocHJvYmxlbXMpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIHRoaXMgZXh0ZW5zaW9uIGZyb20gdGhlIGxpc3Qgc2luY2UgaXQncyBub3QgdmFsaWRcbiAgICAgIGRlbGV0ZSBleHRzW2V4dE5hbWVdO1xuICAgICAgcHJvYmxlbVN1bW1hcmllcy5wdXNoKFxuICAgICAgICBgJHt0aGlzLmV4dGVuc2lvblR5cGV9ICR7ZXh0TmFtZX0gaGFkIGVycm9ycyBhbmQgd2lsbCBub3QgYCArXG4gICAgICAgICAgYGJlIGF2YWlsYWJsZS4gRXJyb3JzOmAsXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBwcm9ibGVtIG9mIHByb2JsZW1zKSB7XG4gICAgICAgIHByb2JsZW1TdW1tYXJpZXMucHVzaChcbiAgICAgICAgICBgICAtICR7cHJvYmxlbS5lcnJ9IChBY3R1YWwgdmFsdWU6IGAgK1xuICAgICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkocHJvYmxlbS52YWwpfSlgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc0VtcHR5KHByb2JsZW1TdW1tYXJpZXMpKSB7XG4gICAgICB0aGlzLmxvZyhcbiAgICAgICAgYEFwcGl1bSBlbmNvdW50ZXJlZCBvbmUgb3IgbW9yZSBlcnJvcnMgd2hpbGUgdmFsaWRhdGluZyBgICtcbiAgICAgICAgICBgdGhlICR7dGhpcy5jb25maWdLZXl9IGV4dGVuc2lvbiBmaWxlICgke3RoaXMubWFuaWZlc3RQYXRofSk6YCxcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHN1bW1hcnkgb2YgcHJvYmxlbVN1bW1hcmllcykge1xuICAgICAgICB0aGlzLmxvZyhzdW1tYXJ5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXh0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0PEV4dFR5cGU+fSBleHREYXRhXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7UHJvYmxlbVtdfVxuICAgKi9cbiAgZ2V0U2NoZW1hUHJvYmxlbXMgKGV4dERhdGEsIGV4dE5hbWUpIHtcbiAgICBjb25zdCBwcm9ibGVtcyA9IFtdO1xuICAgIGNvbnN0IHtzY2hlbWE6IGFyZ1NjaGVtYVBhdGh9ID0gZXh0RGF0YTtcbiAgICBpZiAoRXh0ZW5zaW9uQ29uZmlnLmV4dERhdGFIYXNTY2hlbWEoZXh0RGF0YSkpIHtcbiAgICAgIGlmIChfLmlzU3RyaW5nKGFyZ1NjaGVtYVBhdGgpKSB7XG4gICAgICAgIGlmIChpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9uKGFyZ1NjaGVtYVBhdGgpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucmVhZEV4dGVuc2lvblNjaGVtYShleHROYW1lLCBleHREYXRhKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgICAgICBlcnI6IGBVbmFibGUgdG8gcmVnaXN0ZXIgc2NoZW1hIGF0IHBhdGggJHthcmdTY2hlbWFQYXRofTsgJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgICAgICB2YWw6IGFyZ1NjaGVtYVBhdGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgICAgICBlcnI6IGBTY2hlbWEgZmlsZSBoYXMgdW5zdXBwb3J0ZWQgZXh0ZW5zaW9uLiBBbGxvd2VkOiAke1tcbiAgICAgICAgICAgICAgLi4uQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyxcbiAgICAgICAgICAgIF0uam9pbignLCAnKX1gLFxuICAgICAgICAgICAgdmFsOiBhcmdTY2hlbWFQYXRoLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChhcmdTY2hlbWFQYXRoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMucmVhZEV4dGVuc2lvblNjaGVtYShleHROYW1lLCBleHREYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgICAgICBlcnI6IGBVbmFibGUgdG8gcmVnaXN0ZXIgZW1iZWRkZWQgc2NoZW1hOyAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgICB2YWw6IGFyZ1NjaGVtYVBhdGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgIGVycjogJ0luY29ycmVjdGx5IGZvcm1hdHRlZCBzY2hlbWEgZmllbGQ7IG11c3QgYmUgYSBwYXRoIHRvIGEgc2NoZW1hIGZpbGUgb3IgYSBzY2hlbWEgb2JqZWN0LicsXG4gICAgICAgICAgdmFsOiBhcmdTY2hlbWFQYXRoLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb2JsZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dERhdGFcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtQcm9ibGVtW119XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZ2V0R2VuZXJpY0NvbmZpZ1Byb2JsZW1zIChleHREYXRhLCBleHROYW1lKSB7XG4gICAgY29uc3Qge3ZlcnNpb24sIHBrZ05hbWUsIGluc3RhbGxTcGVjLCBpbnN0YWxsVHlwZSwgbWFpbkNsYXNzfSA9XG4gICAgICBleHREYXRhO1xuICAgIGNvbnN0IHByb2JsZW1zID0gW107XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcodmVyc2lvbikpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe2VycjogJ01pc3Npbmcgb3IgaW5jb3JyZWN0IHZlcnNpb24nLCB2YWw6IHZlcnNpb259KTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGtnTmFtZSkpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICBlcnI6ICdNaXNzaW5nIG9yIGluY29ycmVjdCBOUE0gcGFja2FnZSBuYW1lJyxcbiAgICAgICAgdmFsOiBwa2dOYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKGluc3RhbGxTcGVjKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgIGVycjogJ01pc3Npbmcgb3IgaW5jb3JyZWN0IGluc3RhbGxhdGlvbiBzcGVjJyxcbiAgICAgICAgdmFsOiBpbnN0YWxsU3BlYyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghSU5TVEFMTF9UWVBFUy5oYXMoaW5zdGFsbFR5cGUpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgaW5zdGFsbCB0eXBlJyxcbiAgICAgICAgdmFsOiBpbnN0YWxsVHlwZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhtYWluQ2xhc3MpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgZHJpdmVyIGNsYXNzIG5hbWUnLFxuICAgICAgICB2YWw6IG1haW5DbGFzcyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9ibGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gZXh0RGF0YVxuICAgKiBAcmV0dXJucyB7UHJvYmxlbVtdfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGdldENvbmZpZ1Byb2JsZW1zIChleHREYXRhKSB7XG4gICAgLy8gc2hvdWQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgc3BlY2lhbCB2YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSBmb3IgdGhpcyBleHRlbnNpb24gdHlwZVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0PEV4dFR5cGU+fSBleHREYXRhXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQ29uZmlnTXV0YXRpb25PcHRzfSBbb3B0c11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBhZGRFeHRlbnNpb24gKGV4dE5hbWUsIGV4dERhdGEsIHt3cml0ZSA9IHRydWV9ID0ge30pIHtcbiAgICB0aGlzLm1hbmlmZXN0LmFkZEV4dGVuc2lvbih0aGlzLmV4dGVuc2lvblR5cGUsIGV4dE5hbWUsIGV4dERhdGEpO1xuICAgIGlmICh3cml0ZSkge1xuICAgICAgYXdhaXQgdGhpcy5tYW5pZmVzdC53cml0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWVcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPnxpbXBvcnQoJy4uL2NsaS9leHRlbnNpb24tY29tbWFuZCcpLkV4dGVuc2lvbkZpZWxkczxFeHRUeXBlPn0gZXh0RGF0YVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvbkNvbmZpZ011dGF0aW9uT3B0c30gW29wdHNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlRXh0ZW5zaW9uIChleHROYW1lLCBleHREYXRhLCB7d3JpdGUgPSB0cnVlfSA9IHt9KSB7XG4gICAgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdID0ge1xuICAgICAgLi4udGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdLFxuICAgICAgLi4uZXh0RGF0YSxcbiAgICB9O1xuICAgIGlmICh3cml0ZSkge1xuICAgICAgYXdhaXQgdGhpcy5tYW5pZmVzdC53cml0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWVcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Db25maWdNdXRhdGlvbk9wdHN9IFtvcHRzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZUV4dGVuc2lvbiAoZXh0TmFtZSwge3dyaXRlID0gdHJ1ZX0gPSB7fSkge1xuICAgIGRlbGV0ZSB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV07XG4gICAgaWYgKHdyaXRlKSB7XG4gICAgICBhd2FpdCB0aGlzLm1hbmlmZXN0LndyaXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPltdfSBbYWN0aXZlTmFtZXNdXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIHByaW50IChhY3RpdmVOYW1lcykge1xuICAgIGlmIChfLmlzRW1wdHkodGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKSkge1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBObyAke3RoaXMuY29uZmlnS2V5fSBoYXZlIGJlZW4gaW5zdGFsbGVkIGluICR7dGhpcy5hcHBpdW1Ib21lfS4gVXNlIHRoZSBcImFwcGl1bSAke3RoaXMuZXh0ZW5zaW9uVHlwZX1cIiBgICtcbiAgICAgICAgICAnY29tbWFuZCB0byBpbnN0YWxsIHRoZSBvbmUocykgeW91IHdhbnQgdG8gdXNlLicsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZy5pbmZvKGBBdmFpbGFibGUgJHt0aGlzLmNvbmZpZ0tleX06YCk7XG4gICAgZm9yIChjb25zdCBbXG4gICAgICBleHROYW1lLFxuICAgICAgZXh0RGF0YSxcbiAgICBdIG9mIC8qKiBAdHlwZSB7W3N0cmluZywgRXh0TWFuaWZlc3Q8RXh0VHlwZT5dW119ICovIChcbiAgICAgICAgXy50b1BhaXJzKHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucylcbiAgICAgICkpIHtcbiAgICAgIGxvZy5pbmZvKGAgIC0gJHt0aGlzLmV4dGVuc2lvbkRlc2MoZXh0TmFtZSwgZXh0RGF0YSl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXh0ZW5zaW9uLiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50LlxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWUgLSBFeHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0PEV4dFR5cGU+fSBleHREYXRhIC0gRXh0ZW5zaW9uIGRhdGFcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZXh0ZW5zaW9uRGVzYyAoZXh0TmFtZSwgZXh0RGF0YSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtdXN0IGJlIGltcGxlbWVudGVkIGluIGEgc3ViY2xhc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0SW5zdGFsbFBhdGggKGV4dE5hbWUpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuYXBwaXVtSG9tZSwgJ25vZGVfbW9kdWxlcycsIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHROYW1lXS5wa2dOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBleHRlbnNpb24gYW5kIHJldHVybnMgaXRzIG1haW4gY2xhc3MgKGNvbnN0cnVjdG9yKVxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWVcbiAgICogQHJldHVybnMge0V4dENsYXNzPEV4dFR5cGU+fVxuICAgKi9cbiAgcmVxdWlyZSAoZXh0TmFtZSkge1xuICAgIGNvbnN0IHttYWluQ2xhc3N9ID0gdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdO1xuICAgIGNvbnN0IHJlcVBhdGggPSB0aGlzLmdldEluc3RhbGxQYXRoKGV4dE5hbWUpO1xuICAgIGNvbnN0IHJlcVJlc29sdmVkID0gcmVxdWlyZS5yZXNvbHZlKHJlcVBhdGgpO1xuICAgIC8vIG5vdGU6IHRoaXMgd2lsbCBvbmx5IHJlbG9hZCB0aGUgZW50cnkgcG9pbnRcbiAgICBpZiAocHJvY2Vzcy5lbnYuQVBQSVVNX1JFTE9BRF9FWFRFTlNJT05TICYmIHJlcXVpcmUuY2FjaGVbcmVxUmVzb2x2ZWRdKSB7XG4gICAgICBsb2cuZGVidWcoYFJlbW92aW5nICR7cmVxUmVzb2x2ZWR9IGZyb20gcmVxdWlyZSBjYWNoZWApO1xuICAgICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxUmVzb2x2ZWRdO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYFJlcXVpcmluZyAke3RoaXMuZXh0ZW5zaW9uVHlwZX0gYXQgJHtyZXFQYXRofWApO1xuICAgIHJldHVybiByZXF1aXJlKHJlcVBhdGgpW21haW5DbGFzc107XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0luc3RhbGxlZCAoZXh0TmFtZSkge1xuICAgIHJldHVybiBfLmluY2x1ZGVzKE9iamVjdC5rZXlzKHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyksIGV4dE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVuZGVkIHRvIGJlIGNhbGxlZCBieSBjb3JyZXNwb25kaW5nIGluc3RhbmNlIG1ldGhvZHMgb2Ygc3ViY2xhc3MuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZVxuICAgKiBAcGFyYW0ge0V4dFR5cGV9IGV4dFR5cGVcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lIC0gRXh0ZW5zaW9uIG5hbWUgKHVuaXF1ZSB0byBpdHMgdHlwZSlcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdFdpdGhTY2hlbWE8RXh0VHlwZT59IGV4dERhdGEgLSBFeHRlbnNpb24gY29uZmlnXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ2FqdicpLlNjaGVtYU9iamVjdHx1bmRlZmluZWR9XG4gICAqL1xuICBzdGF0aWMgX3JlYWRFeHRlbnNpb25TY2hlbWEgKGFwcGl1bUhvbWUsIGV4dFR5cGUsIGV4dE5hbWUsIGV4dERhdGEpIHtcbiAgICBjb25zdCB7cGtnTmFtZSwgc2NoZW1hOiBhcmdTY2hlbWFQYXRofSA9IGV4dERhdGE7XG4gICAgaWYgKCFhcmdTY2hlbWFQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgTm8gXFxgc2NoZW1hXFxgIHByb3BlcnR5IGZvdW5kIGluIGNvbmZpZyBmb3IgJHtleHRUeXBlfSAke3BrZ05hbWV9IC0tIHdoeSBpcyB0aGlzIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZD9gLFxuICAgICAgKTtcbiAgICB9XG4gICAgbGV0IG1vZHVsZU9iamVjdDtcbiAgICBpZiAoXy5pc1N0cmluZyhhcmdTY2hlbWFQYXRoKSkge1xuICAgICAgY29uc3Qgc2NoZW1hUGF0aCA9IHJlc29sdmVGcm9tKGFwcGl1bUhvbWUsIHBhdGguam9pbihwa2dOYW1lLCBhcmdTY2hlbWFQYXRoKSk7XG4gICAgICBtb2R1bGVPYmplY3QgPSByZXF1aXJlKHNjaGVtYVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb2R1bGVPYmplY3QgPSBhcmdTY2hlbWFQYXRoO1xuICAgIH1cbiAgICAvLyB0aGlzIHN1Y2tzLiBkZWZhdWx0IGV4cG9ydHMgc2hvdWxkIGJlIGRlc3Ryb3llZFxuICAgIGNvbnN0IHNjaGVtYSA9IG1vZHVsZU9iamVjdC5fX2VzTW9kdWxlXG4gICAgICA/IG1vZHVsZU9iamVjdC5kZWZhdWx0XG4gICAgICA6IG1vZHVsZU9iamVjdDtcbiAgICByZWdpc3RlclNjaGVtYShleHRUeXBlLCBleHROYW1lLCBzY2hlbWEpO1xuICAgIHJldHVybiBzY2hlbWE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYSBzcGVjaWZpYyB7QGxpbmsgRXh0TWFuaWZlc3R9IG9iamVjdCBoYXMgYSBgc2NoZW1hYCBwcm9wLlxuICAgKiBUaGUge0BsaW5rIEV4dE1hbmlmZXN0fSBvYmplY3QgYmVjb21lcyBhIHtAbGluayBFeHRNYW5pZmVzdFdpdGhTY2hlbWF9IG9iamVjdC5cbiAgICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dERhdGFcbiAgICogQHJldHVybnMge2V4dERhdGEgaXMgRXh0TWFuaWZlc3RXaXRoU2NoZW1hPEV4dFR5cGU+fVxuICAgKi9cbiAgc3RhdGljIGV4dERhdGFIYXNTY2hlbWEgKGV4dERhdGEpIHtcbiAgICByZXR1cm4gXy5pc1N0cmluZyhleHREYXRhPy5zY2hlbWEpIHx8IF8uaXNPYmplY3QoZXh0RGF0YT8uc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhbiBleHRlbnNpb24gcHJvdmlkZXMgYSBzY2hlbWEsIHRoaXMgd2lsbCBsb2FkIHRoZSBzY2hlbWEgYW5kIGF0dGVtcHQgdG9cbiAgICogcmVnaXN0ZXIgaXQgd2l0aCB0aGUgc2NoZW1hIHJlZ2lzdHJhci5cbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lIC0gTmFtZSBvZiBleHRlbnNpb25cbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdFdpdGhTY2hlbWE8RXh0VHlwZT59IGV4dERhdGEgLSBFeHRlbnNpb24gZGF0YVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KCdhanYnKS5TY2hlbWFPYmplY3R8dW5kZWZpbmVkfVxuICAgKi9cbiAgcmVhZEV4dGVuc2lvblNjaGVtYSAoZXh0TmFtZSwgZXh0RGF0YSkge1xuICAgIHJldHVybiBFeHRlbnNpb25Db25maWcuX3JlYWRFeHRlbnNpb25TY2hlbWEoXG4gICAgICB0aGlzLmFwcGl1bUhvbWUsXG4gICAgICB0aGlzLmV4dGVuc2lvblR5cGUsXG4gICAgICBleHROYW1lLFxuICAgICAgZXh0RGF0YSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIElOU1RBTExfVFlQRV9OUE0sXG4gIElOU1RBTExfVFlQRV9HSVQsXG4gIElOU1RBTExfVFlQRV9MT0NBTCxcbiAgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgSU5TVEFMTF9UWVBFUyxcbn07XG5cbi8qKlxuICogQ29uZmlnIHByb2JsZW1cbiAqIEB0eXBlZGVmIFByb2JsZW1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlcnIgLSBFcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge2FueX0gdmFsIC0gQXNzb2NpYXRlZCB2YWx1ZVxuICovXG5cbi8qKlxuICogQW4gb3B0aW9uYWwgbG9nZ2luZyBmdW5jdGlvbiBwcm92aWRlZCB0byBhbiB7QGxpbmsgRXh0ZW5zaW9uQ29uZmlnfSBzdWJjbGFzcy5cbiAqIEBjYWxsYmFjayBFeHRlbnNpb25Mb2dGblxuICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMnKS5FeHRlbnNpb25UeXBlfSBFeHRlbnNpb25UeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL21hbmlmZXN0JykuTWFuaWZlc3R9IE1hbmlmZXN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuRXh0TWFuaWZlc3Q8VD59IEV4dE1hbmlmZXN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuRXh0TWFuaWZlc3RXaXRoU2NoZW1hPFQ+fSBFeHRNYW5pZmVzdFdpdGhTY2hlbWFcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcy9hcHBpdW0tbWFuaWZlc3QnKS5FeHROYW1lPFQ+fSBFeHROYW1lXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvZXh0ZW5zaW9uJykuRXh0Q2xhc3M8VD59IEV4dENsYXNzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuRXh0UmVjb3JkPFQ+fSBFeHRSZWNvcmRcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHZhcmlvdXMgbWV0aG9kcyBpbiB7QGxpbmsgRXh0ZW5zaW9uQ29uZmlnfVxuICogQHR5cGVkZWYgRXh0ZW5zaW9uQ29uZmlnTXV0YXRpb25PcHRzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt3cml0ZT10cnVlXSBXaGV0aGVyIG9yIG5vdCB0byB3cml0ZSB0aGUgbWFuaWZlc3QgdG8gZGlzayBhZnRlciBhIG11dGF0aW9uIG9wZXJhdGlvblxuICovXG5cbi8qKlxuICogQSB2YWxpZCBpbnN0YWxsIHR5cGVcbiAqIEB0eXBlZGVmIHt0eXBlb2YgSU5TVEFMTF9UWVBFX05QTSB8IHR5cGVvZiBJTlNUQUxMX1RZUEVfR0lUIHwgdHlwZW9mIElOU1RBTExfVFlQRV9MT0NBTCB8IHR5cGVvZiBJTlNUQUxMX1RZUEVfR0lUSFVCfSBJbnN0YWxsVHlwZVxuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBTUEsTUFBTUEsZ0JB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
|
|
436
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJTlNUQUxMX1RZUEVfTlBNIiwiSU5TVEFMTF9UWVBFX0xPQ0FMIiwiSU5TVEFMTF9UWVBFX0dJVEhVQiIsIklOU1RBTExfVFlQRV9HSVQiLCJJTlNUQUxMX1RZUEVTIiwiU2V0IiwiRXh0ZW5zaW9uQ29uZmlnIiwiZXh0ZW5zaW9uVHlwZSIsImNvbmZpZ0tleSIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJsb2ciLCJtYW5pZmVzdCIsIl9saXN0RGF0YUNhY2hlIiwiY29uc3RydWN0b3IiLCJnZXRFeHRlbnNpb25EYXRhIiwibWFuaWZlc3RQYXRoIiwiYXBwaXVtSG9tZSIsImdldFByb2JsZW1zIiwiZXh0TmFtZSIsImV4dE1hbmlmZXN0IiwiZ2V0R2VuZXJpY0NvbmZpZ1Byb2JsZW1zIiwiZ2V0Q29uZmlnUHJvYmxlbXMiLCJnZXRTY2hlbWFQcm9ibGVtcyIsImdldFdhcm5pbmdzIiwiZ2VuZXJpY0NvbmZpZ1dhcm5pbmdzIiwiY29uZmlnV2FybmluZ3MiLCJCIiwiYWxsIiwiZ2V0R2VuZXJpY0NvbmZpZ1dhcm5pbmdzIiwiZ2V0Q29uZmlnV2FybmluZ3MiLCJnZXRWYWxpZGF0aW9uUmVzdWx0U3VtbWFyaWVzIiwiZXJyb3JNYXAiLCJNYXAiLCJ3YXJuaW5nTWFwIiwiZXJyb3JTdW1tYXJpZXMiLCJwcm9ibGVtcyIsImVudHJpZXMiLCJfIiwiaXNFbXB0eSIsInB1c2giLCJ1dGlsIiwicGx1cmFsaXplIiwibGVuZ3RoIiwicHJvYmxlbSIsImVyciIsIkpTT04iLCJzdHJpbmdpZnkiLCJ2YWwiLCJ3YXJuaW5nU3VtbWFyaWVzIiwid2FybmluZ3MiLCJleHRUeXBlVGV4dCIsImNhcGl0YWxpemUiLCJwcm9ibGVtRW51bWVyYXRpb25UZXh0Iiwid2FybmluZyIsIl92YWxpZGF0ZSIsImV4dHMiLCJ0b1BhaXJzIiwiZXJyb3JzIiwic2V0IiwiZXJyb3IiLCJzdW1tYXJ5Iiwid2FybiIsImdldExpc3REYXRhIiwiQ29tbWFuZENsYXNzIiwiY29tbWFuZENsYXNzZXMiLCJjbWQiLCJjb25maWciLCJqc29uIiwibGlzdERhdGEiLCJsaXN0Iiwic2hvd0luc3RhbGxlZCIsInNob3dVcGRhdGVzIiwiYXBwaXVtVmVyc2lvbiIsImluc3RhbGxTcGVjIiwiaW5zdGFsbFR5cGUiLCJwa2dOYW1lIiwiaW52YWxpZEZpZWxkcyIsImlzU3RyaW5nIiwiaGFzIiwiaW52YWxpZEZpZWxkc0VudW1lcmF0aW9uVGV4dCIsImludmFsaWRGaWVsZHNUZXh0IiwibWFwIiwiZmllbGQiLCJqb2luIiwiY3JlYXRlUGVlcldhcm5pbmciLCJyZWFzb24iLCJBUFBJVU1fVkVSIiwic2F0aXNmaWVzIiwiZXh0TGlzdERhdGEiLCJpbnN0YWxsZWQiLCJ1cGRhdGVWZXJzaW9uIiwidXBUb0RhdGUiLCJzY2hlbWEiLCJhcmdTY2hlbWFQYXRoIiwiZXh0RGF0YUhhc1NjaGVtYSIsImlzQWxsb3dlZFNjaGVtYUZpbGVFeHRlbnNpb24iLCJyZWFkRXh0ZW5zaW9uU2NoZW1hIiwibWVzc2FnZSIsIkFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMiLCJpc1BsYWluT2JqZWN0IiwidmVyc2lvbiIsIm1haW5DbGFzcyIsImFkZEV4dGVuc2lvbiIsIndyaXRlIiwidXBkYXRlRXh0ZW5zaW9uIiwicmVtb3ZlRXh0ZW5zaW9uIiwicHJpbnQiLCJhY3RpdmVOYW1lcyIsImluZm8iLCJleHRlbnNpb25EZXNjIiwiRXJyb3IiLCJnZXRJbnN0YWxsUGF0aCIsInBhdGgiLCJyZXF1aXJlIiwicmVxUGF0aCIsInJlcVJlc29sdmVkIiwicmVzb2x2ZSIsIlJlZmVyZW5jZUVycm9yIiwicHJvY2VzcyIsImVudiIsIkFQUElVTV9SRUxPQURfRVhURU5TSU9OUyIsImNhY2hlIiwiZGVidWciLCJNYWluQ2xhc3MiLCJpc0luc3RhbGxlZCIsImluY2x1ZGVzIiwiT2JqZWN0Iiwia2V5cyIsIl9yZWFkRXh0ZW5zaW9uU2NoZW1hIiwiZXh0VHlwZSIsIlR5cGVFcnJvciIsIm1vZHVsZU9iamVjdCIsInNjaGVtYVBhdGgiLCJyZXNvbHZlRnJvbSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwicmVnaXN0ZXJTY2hlbWEiLCJpc09iamVjdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgcmVzb2x2ZUZyb20gZnJvbSAncmVzb2x2ZS1mcm9tJztcbmltcG9ydCB7c2F0aXNmaWVzfSBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHt1dGlsfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHtjb21tYW5kQ2xhc3Nlc30gZnJvbSAnLi4vY2xpL2V4dGVuc2lvbic7XG5pbXBvcnQge0FQUElVTV9WRVJ9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQge1xuICBBTExPV0VEX1NDSEVNQV9FWFRFTlNJT05TLFxuICBpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9uLFxuICByZWdpc3RlclNjaGVtYSxcbn0gZnJvbSAnLi4vc2NoZW1hL3NjaGVtYSc7XG5cbmNvbnN0IElOU1RBTExfVFlQRV9OUE0gPSAnbnBtJztcbmNvbnN0IElOU1RBTExfVFlQRV9MT0NBTCA9ICdsb2NhbCc7XG5jb25zdCBJTlNUQUxMX1RZUEVfR0lUSFVCID0gJ2dpdGh1Yic7XG5jb25zdCBJTlNUQUxMX1RZUEVfR0lUID0gJ2dpdCc7XG5cbi8qKiBAdHlwZSB7U2V0PEluc3RhbGxUeXBlPn0gKi9cbmNvbnN0IElOU1RBTExfVFlQRVMgPSBuZXcgU2V0KFtcbiAgSU5TVEFMTF9UWVBFX0dJVCxcbiAgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgSU5TVEFMTF9UWVBFX0xPQ0FMLFxuICBJTlNUQUxMX1RZUEVfTlBNLFxuXSk7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyBhYnN0cmFjdC4gSXQgc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkuXG4gKlxuICogU3ViY2xhc3NlcyBzaG91bGQgcHJvdmlkZSB0aGUgZ2VuZXJpYyBwYXJhbWV0ZXIgdG8gaW1wbGVtZW50LlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25Db25maWcge1xuICAvKiogQHR5cGUge0V4dFR5cGV9ICovXG4gIGV4dGVuc2lvblR5cGU7XG5cbiAgLyoqIEB0eXBlIHtgJHtFeHRUeXBlfXNgfSAqL1xuICBjb25maWdLZXk7XG5cbiAgLyoqIEB0eXBlIHtFeHRSZWNvcmQ8RXh0VHlwZT59ICovXG4gIGluc3RhbGxlZEV4dGVuc2lvbnM7XG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5BcHBpdW1Mb2dnZXJ9ICovXG4gIGxvZztcblxuICAvKiogQHR5cGUge01hbmlmZXN0fSAqL1xuICBtYW5pZmVzdDtcblxuICAvKipcbiAgICogQHR5cGUge0V4dGVuc2lvbkxpc3REYXRhfVxuICAgKi9cbiAgX2xpc3REYXRhQ2FjaGU7XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHBhcmFtIHtFeHRUeXBlfSBleHRlbnNpb25UeXBlIC0gVHlwZSBvZiBleHRlbnNpb25cbiAgICogQHBhcmFtIHtNYW5pZmVzdH0gbWFuaWZlc3QgLSBgTWFuaWZlc3RgIGluc3RhbmNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihleHRlbnNpb25UeXBlLCBtYW5pZmVzdCkge1xuICAgIHRoaXMuZXh0ZW5zaW9uVHlwZSA9IGV4dGVuc2lvblR5cGU7XG4gICAgdGhpcy5jb25maWdLZXkgPSBgJHtleHRlbnNpb25UeXBlfXNgO1xuICAgIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyA9IG1hbmlmZXN0LmdldEV4dGVuc2lvbkRhdGEoZXh0ZW5zaW9uVHlwZSk7XG4gICAgdGhpcy5tYW5pZmVzdCA9IG1hbmlmZXN0O1xuICB9XG5cbiAgZ2V0IG1hbmlmZXN0UGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5tYW5pZmVzdC5tYW5pZmVzdFBhdGg7XG4gIH1cblxuICBnZXQgYXBwaXVtSG9tZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tYW5pZmVzdC5hcHBpdW1Ib21lO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIGVycm9ycyBmb3IgYSBnaXZlbiBleHRlbnNpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZVxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0PEV4dFR5cGU+fSBleHRNYW5pZmVzdFxuICAgKiBAcmV0dXJucyB7RXh0TWFuaWZlc3RQcm9ibGVtW119XG4gICAqL1xuICBnZXRQcm9ibGVtcyhleHROYW1lLCBleHRNYW5pZmVzdCkge1xuICAgIHJldHVybiBbXG4gICAgICAuLi50aGlzLmdldEdlbmVyaWNDb25maWdQcm9ibGVtcyhleHRNYW5pZmVzdCwgZXh0TmFtZSksXG4gICAgICAuLi50aGlzLmdldENvbmZpZ1Byb2JsZW1zKGV4dE1hbmlmZXN0LCBleHROYW1lKSxcbiAgICAgIC4uLnRoaXMuZ2V0U2NoZW1hUHJvYmxlbXMoZXh0TWFuaWZlc3QsIGV4dE5hbWUpLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2Ygd2FybmluZ3MgZm9yIGEgZ2l2ZW4gZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWVcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gZXh0TWFuaWZlc3RcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fVxuICAgKi9cbiAgYXN5bmMgZ2V0V2FybmluZ3MoZXh0TmFtZSwgZXh0TWFuaWZlc3QpIHtcbiAgICBjb25zdCBbZ2VuZXJpY0NvbmZpZ1dhcm5pbmdzLCBjb25maWdXYXJuaW5nc10gPSBhd2FpdCBCLmFsbChbXG4gICAgICB0aGlzLmdldEdlbmVyaWNDb25maWdXYXJuaW5ncyhleHRNYW5pZmVzdCwgZXh0TmFtZSksXG4gICAgICB0aGlzLmdldENvbmZpZ1dhcm5pbmdzKGV4dE1hbmlmZXN0LCBleHROYW1lKSxcbiAgICBdKTtcblxuICAgIHJldHVybiBbLi4uZ2VuZXJpY0NvbmZpZ1dhcm5pbmdzLCAuLi5jb25maWdXYXJuaW5nc107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgZXh0ZW5zaW9uLXR5cGUtc3BlY2lmaWMgaXNzdWVzLiBUbyBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gZXh0TWFuaWZlc3RcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn1cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyxyZXF1aXJlLWF3YWl0XG4gIGFzeW5jIGdldENvbmZpZ1dhcm5pbmdzKGV4dE1hbmlmZXN0LCBleHROYW1lKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7TWFwPEV4dE5hbWU8RXh0VHlwZT4sRXh0TWFuaWZlc3RQcm9ibGVtW10+fSBbZXJyb3JNYXBdXG4gICAqIEBwYXJhbSB7TWFwPEV4dE5hbWU8RXh0VHlwZT4sc3RyaW5nW10+fSBbd2FybmluZ01hcF1cbiAgICovXG4gIGdldFZhbGlkYXRpb25SZXN1bHRTdW1tYXJpZXMoZXJyb3JNYXAgPSBuZXcgTWFwKCksIHdhcm5pbmdNYXAgPSBuZXcgTWFwKCkpIHtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBjb21wdXRlZCBzdHJpbmdzXG4gICAgICogQHR5cGUge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGNvbnN0IGVycm9yU3VtbWFyaWVzID0gW107XG4gICAgZm9yIChjb25zdCBbZXh0TmFtZSwgcHJvYmxlbXNdIG9mIGVycm9yTWFwLmVudHJpZXMoKSkge1xuICAgICAgaWYgKF8uaXNFbXB0eShwcm9ibGVtcykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyByZW1vdmUgdGhpcyBleHRlbnNpb24gZnJvbSB0aGUgbGlzdCBzaW5jZSBpdCdzIG5vdCB2YWxpZFxuICAgICAgZXJyb3JTdW1tYXJpZXMucHVzaChcbiAgICAgICAgYCR7dGhpcy5leHRlbnNpb25UeXBlfSBcIiR7ZXh0TmFtZX1cIiBoYWQgJHt1dGlsLnBsdXJhbGl6ZShcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgIHByb2JsZW1zLmxlbmd0aFxuICAgICAgICApfSBhbmQgd2lsbCBub3QgYmUgYXZhaWxhYmxlOmBcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHByb2JsZW0gb2YgcHJvYmxlbXMpIHtcbiAgICAgICAgZXJyb3JTdW1tYXJpZXMucHVzaChcbiAgICAgICAgICBgICAtICR7cHJvYmxlbS5lcnJ9IChBY3R1YWwgdmFsdWU6IGAgKyBgJHtKU09OLnN0cmluZ2lmeShwcm9ibGVtLnZhbCl9KWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCB3YXJuaW5nU3VtbWFyaWVzID0gW107XG4gICAgZm9yIChjb25zdCBbZXh0TmFtZSwgd2FybmluZ3NdIG9mIHdhcm5pbmdNYXAuZW50cmllcygpKSB7XG4gICAgICBpZiAoXy5pc0VtcHR5KHdhcm5pbmdzKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4dFR5cGVUZXh0ID0gXy5jYXBpdGFsaXplKHRoaXMuZXh0ZW5zaW9uVHlwZSk7XG4gICAgICBjb25zdCBwcm9ibGVtRW51bWVyYXRpb25UZXh0ID0gdXRpbC5wbHVyYWxpemUoJ3BvdGVudGlhbCBwcm9ibGVtJywgd2FybmluZ3MubGVuZ3RoLCB0cnVlKTtcbiAgICAgIHdhcm5pbmdTdW1tYXJpZXMucHVzaChgJHtleHRUeXBlVGV4dH0gXCIke2V4dE5hbWV9XCIgaGFzICR7cHJvYmxlbUVudW1lcmF0aW9uVGV4dH06IGApO1xuICAgICAgZm9yIChjb25zdCB3YXJuaW5nIG9mIHdhcm5pbmdzKSB7XG4gICAgICAgIHdhcm5pbmdTdW1tYXJpZXMucHVzaChgICAtICR7d2FybmluZ31gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge2Vycm9yU3VtbWFyaWVzLCB3YXJuaW5nU3VtbWFyaWVzfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgZXh0ZW5zaW9ucyBmb3IgcHJvYmxlbXMuICBUbyBiZSBjYWxsZWQgYnkgc3ViY2xhc3NlcycgYHZhbGlkYXRlYCBtZXRob2QuXG4gICAqXG4gICAqIEVycm9ycyBhbmQgd2FybmluZ3Mgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGV4dHNgLlxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBwYXJhbSB7RXh0UmVjb3JkPEV4dFR5cGU+fSBleHRzIC0gTG9va3VwIG9mIGV4dGVuc2lvbiBuYW1lcyB0byB7QGxpbmtjb2RlIEV4dE1hbmlmZXN0fSBvYmplY3RzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEV4dFJlY29yZDxFeHRUeXBlPj59IFRoZSBzYW1lIGxvb2t1cCwgYnV0IHBpY2tpbmcgb25seSBlcnJvci1mcmVlIGV4dGVuc2lvbnNcbiAgICovXG4gIGFzeW5jIF92YWxpZGF0ZShleHRzKSB7XG4gICAgLyoqXG4gICAgICogTG9va3VwIG9mIGV4dGVuc2lvbiBuYW1lcyB0byB7QGxpbmtjb2RlIEV4dE1hbmlmZXN0UHJvYmxlbSBFeHRNYW5pZmVzdFByb2JsZW1zfVxuICAgICAqIEB0eXBlIHtNYXA8RXh0TmFtZTxFeHRUeXBlPixFeHRNYW5pZmVzdFByb2JsZW1bXT59XG4gICAgICovXG4gICAgY29uc3QgZXJyb3JNYXAgPSBuZXcgTWFwKCk7XG4gICAgLyoqXG4gICAgICogTG9va3VwIG9mIGV4dGVuc2lvbiBuYW1lcyB0byB3YXJuaW5ncy5cbiAgICAgKiBAdHlwZSB7TWFwPEV4dE5hbWU8RXh0VHlwZT4sc3RyaW5nW10+fVxuICAgICAqL1xuICAgIGNvbnN0IHdhcm5pbmdNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICBmb3IgKGNvbnN0IFtleHROYW1lLCBleHRNYW5pZmVzdF0gb2YgXy50b1BhaXJzKGV4dHMpKSB7XG4gICAgICBjb25zdCBbZXJyb3JzLCB3YXJuaW5nc10gPSBhd2FpdCBCLmFsbChbXG4gICAgICAgIHRoaXMuZ2V0UHJvYmxlbXMoZXh0TmFtZSwgZXh0TWFuaWZlc3QpLFxuICAgICAgICB0aGlzLmdldFdhcm5pbmdzKGV4dE5hbWUsIGV4dE1hbmlmZXN0KSxcbiAgICAgIF0pO1xuICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgZGVsZXRlIGV4dHNbZXh0TmFtZV07XG4gICAgICB9XG4gICAgICBlcnJvck1hcC5zZXQoZXh0TmFtZSwgZXJyb3JzKTtcbiAgICAgIHdhcm5pbmdNYXAuc2V0KGV4dE5hbWUsIHdhcm5pbmdzKTtcbiAgICB9XG5cbiAgICBjb25zdCB7ZXJyb3JTdW1tYXJpZXMsIHdhcm5pbmdTdW1tYXJpZXN9ID0gdGhpcy5nZXRWYWxpZGF0aW9uUmVzdWx0U3VtbWFyaWVzKFxuICAgICAgZXJyb3JNYXAsXG4gICAgICB3YXJuaW5nTWFwXG4gICAgKTtcblxuICAgIGlmICghXy5pc0VtcHR5KGVycm9yU3VtbWFyaWVzKSkge1xuICAgICAgbG9nLmVycm9yKFxuICAgICAgICBgQXBwaXVtIGVuY291bnRlcmVkICR7dXRpbC5wbHVyYWxpemUoXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICBlcnJvclN1bW1hcmllcy5sZW5ndGgsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApfSB3aGlsZSB2YWxpZGF0aW5nICR7dGhpcy5jb25maWdLZXl9IGZvdW5kIGluIG1hbmlmZXN0ICR7dGhpcy5tYW5pZmVzdFBhdGh9YFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3Qgc3VtbWFyeSBvZiBlcnJvclN1bW1hcmllcykge1xuICAgICAgICBsb2cuZXJyb3Ioc3VtbWFyeSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG9ubHkgZGlzcGxheSB3YXJuaW5ncyBpZiB0aGVyZSBhcmUgbm8gZXJyb3JzIVxuXG4gICAgICBpZiAoIV8uaXNFbXB0eSh3YXJuaW5nU3VtbWFyaWVzKSkge1xuICAgICAgICBsb2cud2FybihcbiAgICAgICAgICBgQXBwaXVtIGVuY291bnRlcmVkICR7dXRpbC5wbHVyYWxpemUoXG4gICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICB3YXJuaW5nU3VtbWFyaWVzLmxlbmd0aCxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgICApfSB3aGlsZSB2YWxpZGF0aW5nICR7dGhpcy5jb25maWdLZXl9IGZvdW5kIGluIG1hbmlmZXN0ICR7dGhpcy5tYW5pZmVzdFBhdGh9YFxuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IHN1bW1hcnkgb2Ygd2FybmluZ1N1bW1hcmllcykge1xuICAgICAgICAgIGxvZy53YXJuKHN1bW1hcnkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBleHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBsaXN0aW5nIGRhdGEgZm9yIGV4dGVuc2lvbnMgdmlhIGNvbW1hbmQgY2xhc3MuXG4gICAqIENhY2hlcyB0aGUgcmVzdWx0IGluIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29uZmlnLl9saXN0RGF0YUNhY2hlfVxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEV4dGVuc2lvbkxpc3REYXRhPn1cbiAgICovXG4gIGFzeW5jIGdldExpc3REYXRhKCkge1xuICAgIGlmICh0aGlzLl9saXN0RGF0YUNhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbGlzdERhdGFDYWNoZTtcbiAgICB9XG4gICAgY29uc3QgQ29tbWFuZENsYXNzID0gLyoqIEB0eXBlIHtFeHRDb21tYW5kPEV4dFR5cGU+fSAqLyAoY29tbWFuZENsYXNzZXNbdGhpcy5leHRlbnNpb25UeXBlXSk7XG4gICAgY29uc3QgY21kID0gbmV3IENvbW1hbmRDbGFzcyh7Y29uZmlnOiB0aGlzLCBqc29uOiB0cnVlfSk7XG4gICAgY29uc3QgbGlzdERhdGEgPSBhd2FpdCBjbWQubGlzdCh7c2hvd0luc3RhbGxlZDogdHJ1ZSwgc2hvd1VwZGF0ZXM6IHRydWV9KTtcbiAgICB0aGlzLl9saXN0RGF0YUNhY2hlID0gbGlzdERhdGE7XG4gICAgcmV0dXJuIGxpc3REYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIHdhcm5pbmdzIGZvciBhIHBhcnRpY3VsYXIgZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBCeSBkZWZpbml0aW9uLCBhIG5vbi1lbXB0eSBsaXN0IG9mIHdhcm5pbmdzIGRvZXMgX25vdF8gaW1wbHkgdGhlIGV4dGVuc2lvbiBjYW5ub3QgYmUgbG9hZGVkLFxuICAgKiBidXQgaXQgbWF5IG5vdCB3b3JrIGFzIGV4cGVjdGVkIG9yIG90aGVyd2lzZSB0aHJvdyBhbiBleGNlcHRpb24gYXQgcnVudGltZS5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gZXh0TWFuaWZlc3RcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn1cbiAgICovXG4gIGFzeW5jIGdldEdlbmVyaWNDb25maWdXYXJuaW5ncyhleHRNYW5pZmVzdCwgZXh0TmFtZSkge1xuICAgIGNvbnN0IHthcHBpdW1WZXJzaW9uLCBpbnN0YWxsU3BlYywgaW5zdGFsbFR5cGUsIHBrZ05hbWV9ID0gZXh0TWFuaWZlc3Q7XG4gICAgY29uc3Qgd2FybmluZ3MgPSBbXTtcblxuICAgIGNvbnN0IGludmFsaWRGaWVsZHMgPSBbXTtcbiAgICBpZiAoIV8uaXNTdHJpbmcoaW5zdGFsbFNwZWMpKSB7XG4gICAgICBpbnZhbGlkRmllbGRzLnB1c2goJ2luc3RhbGxTcGVjJyk7XG4gICAgfVxuXG4gICAgaWYgKCFJTlNUQUxMX1RZUEVTLmhhcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIGludmFsaWRGaWVsZHMucHVzaCgnaW5zdGFsbFR5cGUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRUeXBlVGV4dCA9IF8uY2FwaXRhbGl6ZSh0aGlzLmV4dGVuc2lvblR5cGUpO1xuXG4gICAgaWYgKGludmFsaWRGaWVsZHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpbnZhbGlkRmllbGRzRW51bWVyYXRpb25UZXh0ID0gdXRpbC5wbHVyYWxpemUoXG4gICAgICAgICdpbnZhbGlkIG9yIG1pc3NpbmcgZmllbGQnLFxuICAgICAgICBpbnZhbGlkRmllbGRzLmxlbmd0aCxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGludmFsaWRGaWVsZHNUZXh0ID0gaW52YWxpZEZpZWxkcy5tYXAoKGZpZWxkKSA9PiBgXCIke2ZpZWxkfVwiYCkuam9pbignLCAnKTtcblxuICAgICAgd2FybmluZ3MucHVzaChcbiAgICAgICAgYCR7ZXh0VHlwZVRleHR9IFwiJHtleHROYW1lfVwiIChwYWNrYWdlIFxcYCR7cGtnTmFtZX1cXGApIGhhcyAke2ludmFsaWRGaWVsZHNFbnVtZXJhdGlvblRleHR9ICgke2ludmFsaWRGaWVsZHNUZXh0fSkgaW4gXFxgZXh0ZW5zaW9ucy55YW1sXFxgOyB0aGlzIG1heSBjYXVzZSB1cGdyYWRlcyBkb25lIHZpYSB0aGUgXFxgYXBwaXVtXFxgIENMSSB0b29sIHRvIGZhaWwuIFBsZWFzZSByZWluc3RhbGwgd2l0aCBcXGBhcHBpdW0gJHt0aGlzLmV4dGVuc2lvblR5cGV9IHVuaW5zdGFsbCAke2V4dE5hbWV9XFxgIGFuZCBcXGBhcHBpdW0gJHt0aGlzLmV4dGVuc2lvblR5cGV9IGluc3RhbGwgJHtleHROYW1lfVxcYCB0byBhdHRlbXB0IGEgZml4LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscHMgY29uY2F0ZW5hdGUgd2FybmluZyBtZXNzYWdlcyByZWxhdGVkIHRvIHBlZXIgZGVwZW5kZW5jaWVzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvblxuICAgICAqIEByZXR1cm5zIHN0cmluZ1xuICAgICAqL1xuICAgIGNvbnN0IGNyZWF0ZVBlZXJXYXJuaW5nID0gKHJlYXNvbikgPT5cbiAgICAgIGAke2V4dFR5cGVUZXh0fSBcIiR7ZXh0TmFtZX1cIiAocGFja2FnZSBcXGAke3BrZ05hbWV9XFxgKSBtYXkgYmUgaW5jb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBBcHBpdW0gKHYke0FQUElVTV9WRVJ9KSBkdWUgdG8gJHtyZWFzb259YDtcblxuICAgIGlmIChfLmlzU3RyaW5nKGFwcGl1bVZlcnNpb24pICYmICFzYXRpc2ZpZXMoQVBQSVVNX1ZFUiwgYXBwaXVtVmVyc2lvbikpIHtcbiAgICAgIGNvbnN0IGxpc3REYXRhID0gYXdhaXQgdGhpcy5nZXRMaXN0RGF0YSgpO1xuICAgICAgY29uc3QgZXh0TGlzdERhdGEgPSAvKiogQHR5cGUge0luc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhfSAqLyAobGlzdERhdGFbZXh0TmFtZV0pO1xuICAgICAgaWYgKGV4dExpc3REYXRhPy5pbnN0YWxsZWQpIHtcbiAgICAgICAgY29uc3Qge3VwZGF0ZVZlcnNpb24sIHVwVG9EYXRlfSA9IGV4dExpc3REYXRhO1xuICAgICAgICBpZiAoIXVwVG9EYXRlKSB7XG4gICAgICAgICAgd2FybmluZ3MucHVzaChcbiAgICAgICAgICAgIGNyZWF0ZVBlZXJXYXJuaW5nKFxuICAgICAgICAgICAgICBgaXRzIHBlZXIgZGVwZW5kZW5jeSBvbiBvbGRlciBBcHBpdW0gdiR7YXBwaXVtVmVyc2lvbn0uIFBsZWFzZSB1cGdyYWRlIFxcYCR7cGtnTmFtZX1cXGAgdG8gdiR7dXBkYXRlVmVyc2lvbn0gb3IgbmV3ZXIuYFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2FybmluZ3MucHVzaChcbiAgICAgICAgICAgIGNyZWF0ZVBlZXJXYXJuaW5nKFxuICAgICAgICAgICAgICBgaXRzIHBlZXIgZGVwZW5kZW5jeSBvbiBvbGRlciBBcHBpdW0gdiR7YXBwaXVtVmVyc2lvbn0uIFBsZWFzZSBhc2sgdGhlIGRldmVsb3BlciBvZiBcXGAke3BrZ05hbWV9XFxgIHRvIHVwZGF0ZSB0aGUgcGVlciBkZXBlbmRlbmN5IG9uIEFwcGl1bSB0byB2JHtBUFBJVU1fVkVSfS5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIV8uaXNTdHJpbmcoYXBwaXVtVmVyc2lvbikpIHtcbiAgICAgIGNvbnN0IGxpc3REYXRhID0gYXdhaXQgdGhpcy5nZXRMaXN0RGF0YSgpO1xuICAgICAgY29uc3QgZXh0TGlzdERhdGEgPSAvKiogQHR5cGUge0luc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhfSAqLyAobGlzdERhdGFbZXh0TmFtZV0pO1xuICAgICAgaWYgKCFleHRMaXN0RGF0YT8udXBUb0RhdGUgJiYgZXh0TGlzdERhdGE/LnVwZGF0ZVZlcnNpb24pIHtcbiAgICAgICAgd2FybmluZ3MucHVzaChcbiAgICAgICAgICBjcmVhdGVQZWVyV2FybmluZyhcbiAgICAgICAgICAgIGBhbiBpbnZhbGlkIG9yIG1pc3NpbmcgcGVlciBkZXBlbmRlbmN5IG9uIEFwcGl1bS4gQSBuZXdlciB2ZXJzaW9uIG9mIFxcYCR7cGtnTmFtZX1cXGAgaXMgYXZhaWxhYmxlOyBwbGVhc2UgYXR0ZW1wdCB0byB1cGdyYWRlIFwiJHtleHROYW1lfVwiIHRvIHYke2V4dExpc3REYXRhLnVwZGF0ZVZlcnNpb259IG9yIG5ld2VyLmBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5ncy5wdXNoKFxuICAgICAgICAgIGNyZWF0ZVBlZXJXYXJuaW5nKFxuICAgICAgICAgICAgYGFuIGludmFsaWQgb3IgbWlzc2luZyBwZWVyIGRlcGVuZGVuY3kgb24gQXBwaXVtLiBQbGVhc2UgYXNrIHRoZSBkZXZlbG9wZXIgb2YgXFxgJHtwa2dOYW1lfVxcYCB0byBhZGQgYSBwZWVyIGRlcGVuZGVuY3kgb24gXFxgXmFwcGl1bUAke0FQUElVTV9WRVJ9XFxgLmBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3YXJuaW5ncztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBsaXN0IG9mIHVucmVjb3ZlcmFibGUgZXJyb3JzIChpZiBhbnkpIGZvciB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIF9pZl8gaXQgaGFzIGEgYHNjaGVtYWAgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dE1hbmlmZXN0IC0gRXh0ZW5zaW9uIGRhdGEgKGZyb20gbWFuaWZlc3QpXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZSAtIEV4dGVuc2lvbiBuYW1lIChmcm9tIG1hbmlmZXN0KVxuICAgKiBAcmV0dXJucyB7RXh0TWFuaWZlc3RQcm9ibGVtW119XG4gICAqL1xuICBnZXRTY2hlbWFQcm9ibGVtcyhleHRNYW5pZmVzdCwgZXh0TmFtZSkge1xuICAgIC8qKiBAdHlwZSB7RXh0TWFuaWZlc3RQcm9ibGVtW119ICovXG4gICAgY29uc3QgcHJvYmxlbXMgPSBbXTtcbiAgICBjb25zdCB7c2NoZW1hOiBhcmdTY2hlbWFQYXRofSA9IGV4dE1hbmlmZXN0O1xuICAgIGlmIChFeHRlbnNpb25Db25maWcuZXh0RGF0YUhhc1NjaGVtYShleHRNYW5pZmVzdCkpIHtcbiAgICAgIGlmIChfLmlzU3RyaW5nKGFyZ1NjaGVtYVBhdGgpKSB7XG4gICAgICAgIGlmIChpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9uKGFyZ1NjaGVtYVBhdGgpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucmVhZEV4dGVuc2lvblNjaGVtYShleHROYW1lLCBleHRNYW5pZmVzdCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgZXJyOiBgVW5hYmxlIHRvIHJlZ2lzdGVyIHNjaGVtYSBhdCBwYXRoICR7YXJnU2NoZW1hUGF0aH07ICR7ZXJyLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgdmFsOiBhcmdTY2hlbWFQYXRoLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgICAgZXJyOiBgU2NoZW1hIGZpbGUgaGFzIHVuc3VwcG9ydGVkIGV4dGVuc2lvbi4gQWxsb3dlZDogJHtbXG4gICAgICAgICAgICAgIC4uLkFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMsXG4gICAgICAgICAgICBdLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIHZhbDogYXJnU2NoZW1hUGF0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3QoYXJnU2NoZW1hUGF0aCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnJlYWRFeHRlbnNpb25TY2hlbWEoZXh0TmFtZSwgZXh0TWFuaWZlc3QpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgICAgIGVycjogYFVuYWJsZSB0byByZWdpc3RlciBlbWJlZGRlZCBzY2hlbWE7ICR7ZXJyLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgIHZhbDogYXJnU2NoZW1hUGF0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgICAgZXJyOiAnSW5jb3JyZWN0bHkgZm9ybWF0dGVkIHNjaGVtYSBmaWVsZDsgbXVzdCBiZSBhIHBhdGggdG8gYSBzY2hlbWEgZmlsZSBvciBhIHNjaGVtYSBvYmplY3QuJyxcbiAgICAgICAgICB2YWw6IGFyZ1NjaGVtYVBhdGgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvYmxlbXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbGlzdCBvZiBnZW5lcmljIHVucmVjb3ZlcmFibGUgZXJyb3JzIGZvciB0aGUgZ2l2ZW4gZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dE1hbmlmZXN0IC0gRXh0ZW5zaW9uIGRhdGEgKGZyb20gbWFuaWZlc3QpXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZSAtIEV4dGVuc2lvbiBuYW1lIChmcm9tIG1hbmlmZXN0KVxuICAgKiBAcmV0dXJucyB7RXh0TWFuaWZlc3RQcm9ibGVtW119XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZ2V0R2VuZXJpY0NvbmZpZ1Byb2JsZW1zKGV4dE1hbmlmZXN0LCBleHROYW1lKSB7XG4gICAgY29uc3Qge3ZlcnNpb24sIHBrZ05hbWUsIG1haW5DbGFzc30gPSBleHRNYW5pZmVzdDtcbiAgICBjb25zdCBwcm9ibGVtcyA9IFtdO1xuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHZlcnNpb24pKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgZXJyOiBgSW52YWxpZCBvciBtaXNzaW5nIFxcYHZlcnNpb25cXGAgZmllbGQgaW4gbXkgXFxgcGFja2FnZS5qc29uXFxgIGFuZC9vciBcXGBleHRlbnNpb25zLnlhbWxcXGAgKG11c3QgYmUgYSBzdHJpbmcpYCxcbiAgICAgICAgdmFsOiB2ZXJzaW9uLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBrZ05hbWUpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgZXJyOiBgSW52YWxpZCBvciBtaXNzaW5nIFxcYG5hbWVcXGAgZmllbGQgaW4gbXkgXFxgcGFja2FnZS5qc29uXFxgIGFuZC9vciBcXGBleHRlbnNpb25zLnlhbWxcXGAgKG11c3QgYmUgYSBzdHJpbmcpYCxcbiAgICAgICAgdmFsOiBwa2dOYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKG1haW5DbGFzcykpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICBlcnI6IGBJbnZhbGlkIG9yIG1pc3NpbmcgXFxgYXBwaXVtLm1haW5DbGFzc1xcYCBmaWVsZCBpbiBteSBcXGBwYWNrYWdlLmpzb25cXGAgYW5kL29yIFxcYG1haW5DbGFzc1xcYCBmaWVsZCBpbiBcXGBleHRlbnNpb25zLnlhbWxcXGAgKG11c3QgYmUgYSBzdHJpbmcpYCxcbiAgICAgICAgdmFsOiBtYWluQ2xhc3MsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvYmxlbXM7XG4gIH1cblxuICAvKipcbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dE1hbmlmZXN0XG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7RXh0TWFuaWZlc3RQcm9ibGVtW119XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZ2V0Q29uZmlnUHJvYmxlbXMoZXh0TWFuaWZlc3QsIGV4dE5hbWUpIHtcbiAgICAvLyBzaG91ZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiBzcGVjaWFsIHZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IGZvciB0aGlzIGV4dGVuc2lvbiB0eXBlXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dE1hbmlmZXN0XG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQ29uZmlnTXV0YXRpb25PcHRzfSBbb3B0c11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBhZGRFeHRlbnNpb24oZXh0TmFtZSwgZXh0TWFuaWZlc3QsIHt3cml0ZSA9IHRydWV9ID0ge30pIHtcbiAgICB0aGlzLm1hbmlmZXN0LmFkZEV4dGVuc2lvbih0aGlzLmV4dGVuc2lvblR5cGUsIGV4dE5hbWUsIGV4dE1hbmlmZXN0KTtcbiAgICBpZiAod3JpdGUpIHtcbiAgICAgIGF3YWl0IHRoaXMubWFuaWZlc3Qud3JpdGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lXG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT58aW1wb3J0KCcuLi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQnKS5FeHRlbnNpb25GaWVsZHM8RXh0VHlwZT59IGV4dE1hbmlmZXN0XG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQ29uZmlnTXV0YXRpb25PcHRzfSBbb3B0c11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB1cGRhdGVFeHRlbnNpb24oZXh0TmFtZSwgZXh0TWFuaWZlc3QsIHt3cml0ZSA9IHRydWV9ID0ge30pIHtcbiAgICB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV0gPSB7XG4gICAgICAuLi50aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV0sXG4gICAgICAuLi5leHRNYW5pZmVzdCxcbiAgICB9O1xuICAgIGlmICh3cml0ZSkge1xuICAgICAgYXdhaXQgdGhpcy5tYW5pZmVzdC53cml0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXh0ZW5zaW9uIGZyb20gdGhlIGxpc3Qgb2YgaW5zdGFsbGVkIGV4dGVuc2lvbnMsIGFuZCBvcHRpb25hbGx5IGF2b2lkIGEgd3JpdGUgdG8gdGhlIG1hbmlmZXN0IGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvbkNvbmZpZ011dGF0aW9uT3B0c30gW29wdHNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlRXh0ZW5zaW9uKGV4dE5hbWUsIHt3cml0ZSA9IHRydWV9ID0ge30pIHtcbiAgICBkZWxldGUgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdO1xuICAgIGlmICh3cml0ZSkge1xuICAgICAgYXdhaXQgdGhpcy5tYW5pZmVzdC53cml0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT5bXX0gW2FjdGl2ZU5hbWVzXVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBwcmludChhY3RpdmVOYW1lcykge1xuICAgIGlmIChfLmlzRW1wdHkodGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKSkge1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBObyAke3RoaXMuY29uZmlnS2V5fSBoYXZlIGJlZW4gaW5zdGFsbGVkIGluICR7dGhpcy5hcHBpdW1Ib21lfS4gVXNlIHRoZSBcImFwcGl1bSAke3RoaXMuZXh0ZW5zaW9uVHlwZX1cIiBgICtcbiAgICAgICAgICAnY29tbWFuZCB0byBpbnN0YWxsIHRoZSBvbmUocykgeW91IHdhbnQgdG8gdXNlLidcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nLmluZm8oYEF2YWlsYWJsZSAke3RoaXMuY29uZmlnS2V5fTpgKTtcbiAgICBmb3IgKGNvbnN0IFtleHROYW1lLCBleHRNYW5pZmVzdF0gb2YgLyoqIEB0eXBlIHtbc3RyaW5nLCBFeHRNYW5pZmVzdDxFeHRUeXBlPl1bXX0gKi8gKFxuICAgICAgXy50b1BhaXJzKHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucylcbiAgICApKSB7XG4gICAgICBsb2cuaW5mbyhgICAtICR7dGhpcy5leHRlbnNpb25EZXNjKGV4dE5hbWUsIGV4dE1hbmlmZXN0KX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBleHRlbnNpb24uIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQuXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZSAtIEV4dGVuc2lvbiBuYW1lXG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dE1hbmlmZXN0IC0gRXh0ZW5zaW9uIGRhdGFcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZXh0ZW5zaW9uRGVzYyhleHROYW1lLCBleHRNYW5pZmVzdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtdXN0IGJlIGltcGxlbWVudGVkIGluIGEgc3ViY2xhc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0SW5zdGFsbFBhdGgoZXh0TmFtZSkge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5hcHBpdW1Ib21lLCAnbm9kZV9tb2R1bGVzJywgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdLnBrZ05hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGV4dGVuc2lvbiBhbmQgcmV0dXJucyBpdHMgbWFpbiBjbGFzcyAoY29uc3RydWN0b3IpXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7RXh0Q2xhc3M8RXh0VHlwZT59XG4gICAqL1xuICByZXF1aXJlKGV4dE5hbWUpIHtcbiAgICBjb25zdCB7bWFpbkNsYXNzfSA9IHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHROYW1lXTtcbiAgICBjb25zdCByZXFQYXRoID0gdGhpcy5nZXRJbnN0YWxsUGF0aChleHROYW1lKTtcbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICBsZXQgcmVxUmVzb2x2ZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlcVJlc29sdmVkID0gcmVxdWlyZS5yZXNvbHZlKHJlcVBhdGgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGBDb3VsZCBub3QgZmluZCBhICR7dGhpcy5leHRlbnNpb25UeXBlfSBpbnN0YWxsZWQgYXQgJHtyZXFQYXRofWApO1xuICAgIH1cbiAgICAvLyBub3RlOiB0aGlzIHdpbGwgb25seSByZWxvYWQgdGhlIGVudHJ5IHBvaW50XG4gICAgaWYgKHByb2Nlc3MuZW52LkFQUElVTV9SRUxPQURfRVhURU5TSU9OUyAmJiByZXF1aXJlLmNhY2hlW3JlcVJlc29sdmVkXSkge1xuICAgICAgbG9nLmRlYnVnKGBSZW1vdmluZyAke3JlcVJlc29sdmVkfSBmcm9tIHJlcXVpcmUgY2FjaGVgKTtcbiAgICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW3JlcVJlc29sdmVkXTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBSZXF1aXJpbmcgJHt0aGlzLmV4dGVuc2lvblR5cGV9IGF0ICR7cmVxUGF0aH1gKTtcbiAgICBjb25zdCBNYWluQ2xhc3MgPSByZXF1aXJlKHJlcVBhdGgpW21haW5DbGFzc107XG4gICAgaWYgKCFNYWluQ2xhc3MpIHtcbiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIGEgY2xhc3MgbmFtZWQgXCIke21haW5DbGFzc31cIiBleHBvcnRlZCBieSAke3RoaXMuZXh0ZW5zaW9uVHlwZX0gXCIke2V4dE5hbWV9XCJgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gTWFpbkNsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNJbnN0YWxsZWQoZXh0TmFtZSkge1xuICAgIHJldHVybiBfLmluY2x1ZGVzKE9iamVjdC5rZXlzKHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyksIGV4dE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVuZGVkIHRvIGJlIGNhbGxlZCBieSBjb3JyZXNwb25kaW5nIGluc3RhbmNlIG1ldGhvZHMgb2Ygc3ViY2xhc3MuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZVxuICAgKiBAcGFyYW0ge0V4dFR5cGV9IGV4dFR5cGVcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lIC0gRXh0ZW5zaW9uIG5hbWUgKHVuaXF1ZSB0byBpdHMgdHlwZSlcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdFdpdGhTY2hlbWE8RXh0VHlwZT59IGV4dE1hbmlmZXN0IC0gRXh0ZW5zaW9uIGNvbmZpZ1xuICAgKiBAcmV0dXJucyB7aW1wb3J0KCdhanYnKS5TY2hlbWFPYmplY3R8dW5kZWZpbmVkfVxuICAgKi9cbiAgc3RhdGljIF9yZWFkRXh0ZW5zaW9uU2NoZW1hKGFwcGl1bUhvbWUsIGV4dFR5cGUsIGV4dE5hbWUsIGV4dE1hbmlmZXN0KSB7XG4gICAgY29uc3Qge3BrZ05hbWUsIHNjaGVtYTogYXJnU2NoZW1hUGF0aH0gPSBleHRNYW5pZmVzdDtcbiAgICBpZiAoIWFyZ1NjaGVtYVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBObyBcXGBzY2hlbWFcXGAgcHJvcGVydHkgZm91bmQgaW4gY29uZmlnIGZvciAke2V4dFR5cGV9ICR7cGtnTmFtZX0gLS0gd2h5IGlzIHRoaXMgZnVuY3Rpb24gYmVpbmcgY2FsbGVkP2BcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBtb2R1bGVPYmplY3Q7XG4gICAgaWYgKF8uaXNTdHJpbmcoYXJnU2NoZW1hUGF0aCkpIHtcbiAgICAgIGNvbnN0IHNjaGVtYVBhdGggPSByZXNvbHZlRnJvbShhcHBpdW1Ib21lLCBwYXRoLmpvaW4ocGtnTmFtZSwgYXJnU2NoZW1hUGF0aCkpO1xuICAgICAgbW9kdWxlT2JqZWN0ID0gcmVxdWlyZShzY2hlbWFQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kdWxlT2JqZWN0ID0gYXJnU2NoZW1hUGF0aDtcbiAgICB9XG4gICAgLy8gdGhpcyBzdWNrcy4gZGVmYXVsdCBleHBvcnRzIHNob3VsZCBiZSBkZXN0cm95ZWRcbiAgICBjb25zdCBzY2hlbWEgPSBtb2R1bGVPYmplY3QuX19lc01vZHVsZSA/IG1vZHVsZU9iamVjdC5kZWZhdWx0IDogbW9kdWxlT2JqZWN0O1xuICAgIHJlZ2lzdGVyU2NoZW1hKGV4dFR5cGUsIGV4dE5hbWUsIHNjaGVtYSk7XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBhIHNwZWNpZmljIHtAbGluayBFeHRNYW5pZmVzdH0gb2JqZWN0IGhhcyBhIGBzY2hlbWFgIHByb3AuXG4gICAqIFRoZSB7QGxpbmsgRXh0TWFuaWZlc3R9IG9iamVjdCBiZWNvbWVzIGEge0BsaW5rIEV4dE1hbmlmZXN0V2l0aFNjaGVtYX0gb2JqZWN0LlxuICAgKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gZXh0TWFuaWZlc3RcbiAgICogQHJldHVybnMge2V4dE1hbmlmZXN0IGlzIEV4dE1hbmlmZXN0V2l0aFNjaGVtYTxFeHRUeXBlPn1cbiAgICovXG4gIHN0YXRpYyBleHREYXRhSGFzU2NoZW1hKGV4dE1hbmlmZXN0KSB7XG4gICAgcmV0dXJuIF8uaXNTdHJpbmcoZXh0TWFuaWZlc3Q/LnNjaGVtYSkgfHwgXy5pc09iamVjdChleHRNYW5pZmVzdD8uc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhbiBleHRlbnNpb24gcHJvdmlkZXMgYSBzY2hlbWEsIHRoaXMgd2lsbCBsb2FkIHRoZSBzY2hlbWEgYW5kIGF0dGVtcHQgdG9cbiAgICogcmVnaXN0ZXIgaXQgd2l0aCB0aGUgc2NoZW1hIHJlZ2lzdHJhci5cbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lIC0gTmFtZSBvZiBleHRlbnNpb25cbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdFdpdGhTY2hlbWE8RXh0VHlwZT59IGV4dE1hbmlmZXN0IC0gRXh0ZW5zaW9uIGRhdGFcbiAgICogQHJldHVybnMge2ltcG9ydCgnYWp2JykuU2NoZW1hT2JqZWN0fHVuZGVmaW5lZH1cbiAgICovXG4gIHJlYWRFeHRlbnNpb25TY2hlbWEoZXh0TmFtZSwgZXh0TWFuaWZlc3QpIHtcbiAgICByZXR1cm4gRXh0ZW5zaW9uQ29uZmlnLl9yZWFkRXh0ZW5zaW9uU2NoZW1hKFxuICAgICAgdGhpcy5hcHBpdW1Ib21lLFxuICAgICAgdGhpcy5leHRlbnNpb25UeXBlLFxuICAgICAgZXh0TmFtZSxcbiAgICAgIGV4dE1hbmlmZXN0XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQge0lOU1RBTExfVFlQRV9OUE0sIElOU1RBTExfVFlQRV9HSVQsIElOU1RBTExfVFlQRV9MT0NBTCwgSU5TVEFMTF9UWVBFX0dJVEhVQiwgSU5TVEFMTF9UWVBFU307XG5cbi8qKlxuICogQW4gaXNzdWUgd2l0aCB0aGUge0BsaW5rY29kZSBFeHRNYW5pZmVzdH0gZm9yIGEgcGFydGljdWxhciBleHRlbnNpb24uXG4gKlxuICogVGhlIGV4aXN0YW5jZSBvZiBzdWNoIGFuIG9iamVjdCBpbXBsaWVzIHRoYXQgdGhlIGV4dGVuc2lvbiBjYW5ub3QgYmUgbG9hZGVkLlxuICogQHR5cGVkZWYgRXh0TWFuaWZlc3RQcm9ibGVtXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXJyIC0gRXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHthbnl9IHZhbCAtIEFzc29jaWF0ZWQgdmFsdWVcbiAqL1xuXG4vKipcbiAqIEFuIG9wdGlvbmFsIGxvZ2dpbmcgZnVuY3Rpb24gcHJvdmlkZWQgdG8gYW4ge0BsaW5rIEV4dGVuc2lvbkNvbmZpZ30gc3ViY2xhc3MuXG4gKiBAY2FsbGJhY2sgRXh0ZW5zaW9uTG9nRm5cbiAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5FeHRlbnNpb25UeXBlfSBFeHRlbnNpb25UeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL21hbmlmZXN0JykuTWFuaWZlc3R9IE1hbmlmZXN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuRXh0TWFuaWZlc3Q8VD59IEV4dE1hbmlmZXN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuRXh0TWFuaWZlc3RXaXRoU2NoZW1hPFQ+fSBFeHRNYW5pZmVzdFdpdGhTY2hlbWFcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5FeHROYW1lPFQ+fSBFeHROYW1lXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuRXh0Q2xhc3M8VD59IEV4dENsYXNzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuRXh0UmVjb3JkPFQ+fSBFeHRSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9jbGkvZXh0ZW5zaW9uJykuRXh0Q29tbWFuZDxUPn0gRXh0Q29tbWFuZFxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdmFyaW91cyBtZXRob2RzIGluIHtAbGluayBFeHRlbnNpb25Db25maWd9XG4gKiBAdHlwZWRlZiBFeHRlbnNpb25Db25maWdNdXRhdGlvbk9wdHNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3dyaXRlPXRydWVdIFdoZXRoZXIgb3Igbm90IHRvIHdyaXRlIHRoZSBtYW5pZmVzdCB0byBkaXNrIGFmdGVyIGEgbXV0YXRpb24gb3BlcmF0aW9uXG4gKi9cblxuLyoqXG4gKiBBIHZhbGlkIGluc3RhbGwgdHlwZVxuICogQHR5cGVkZWYge3R5cGVvZiBJTlNUQUxMX1RZUEVfTlBNIHwgdHlwZW9mIElOU1RBTExfVFlQRV9HSVQgfCB0eXBlb2YgSU5TVEFMTF9UWVBFX0xPQ0FMIHwgdHlwZW9mIElOU1RBTExfVFlQRV9HSVRIVUJ9IEluc3RhbGxUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQnKS5FeHRlbnNpb25MaXN0RGF0YX0gRXh0ZW5zaW9uTGlzdERhdGFcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2NsaS9leHRlbnNpb24tY29tbWFuZCcpLkluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhfSBJbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YVxuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBTUEsTUFBTUEsZ0JBQWdCLEdBQUcsS0FBekI7O0FBQ0EsTUFBTUMsa0JBQWtCLEdBQUcsT0FBM0I7O0FBQ0EsTUFB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
|
|
@@ -18,9 +18,9 @@ export function loadExtensions(appiumHome: string): Promise<ExtensionConfigs>;
|
|
|
18
18
|
*
|
|
19
19
|
* @param {import('./plugin-config').PluginConfig} pluginConfig - a plugin extension config
|
|
20
20
|
* @param {string[]} usePlugins
|
|
21
|
-
* @returns {
|
|
21
|
+
* @returns {PluginNameMap} Mapping of PluginClass to name
|
|
22
22
|
*/
|
|
23
|
-
export function getActivePlugins(pluginConfig: import('./plugin-config').PluginConfig, usePlugins?: string[]):
|
|
23
|
+
export function getActivePlugins(pluginConfig: import('./plugin-config').PluginConfig, usePlugins?: string[]): PluginNameMap;
|
|
24
24
|
/**
|
|
25
25
|
* Find any driver name which has been installed, and turn each one into its class, so we can send
|
|
26
26
|
* them as objects to the server init in case they need to add methods/routes or update the server.
|
|
@@ -28,12 +28,21 @@ export function getActivePlugins(pluginConfig: import('./plugin-config').PluginC
|
|
|
28
28
|
*
|
|
29
29
|
* @param {import('./driver-config').DriverConfig} driverConfig - a driver extension config
|
|
30
30
|
* @param {string[]} [useDrivers] - optional list of drivers to load
|
|
31
|
+
* @returns {DriverNameMap}
|
|
31
32
|
*/
|
|
32
|
-
export function getActiveDrivers(driverConfig: import('./driver-config').DriverConfig, useDrivers?: string[] | undefined):
|
|
33
|
+
export function getActiveDrivers(driverConfig: import('./driver-config').DriverConfig, useDrivers?: string[] | undefined): DriverNameMap;
|
|
34
|
+
/**
|
|
35
|
+
* A mapping of {@linkcode PluginClass } classes to their names.
|
|
36
|
+
*/
|
|
37
|
+
export type PluginNameMap = Map<PluginClass, string>;
|
|
38
|
+
/**
|
|
39
|
+
* A mapping of {@linkcode DriverClass } classes to their names.
|
|
40
|
+
*/
|
|
41
|
+
export type DriverNameMap = Map<DriverClass, string>;
|
|
42
|
+
export type PluginClass = import('@appium/types').PluginClass;
|
|
43
|
+
export type DriverClass = import('@appium/types').DriverClass;
|
|
33
44
|
export type ExtensionConfigs = {
|
|
34
|
-
driverConfig: DriverConfig;
|
|
35
|
-
pluginConfig: PluginConfig;
|
|
45
|
+
driverConfig: import('./driver-config').DriverConfig;
|
|
46
|
+
pluginConfig: import('./plugin-config').PluginConfig;
|
|
36
47
|
};
|
|
37
|
-
import { DriverConfig } from "./driver-config";
|
|
38
|
-
import { PluginConfig } from "./plugin-config";
|
|
39
48
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/extension/index.js"],"names":[],"mappings":"AAQA;;;;;;;;;;GAUG;AACH,2CAHW,MAAM,GACJ,QAAQ,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/extension/index.js"],"names":[],"mappings":"AAQA;;;;;;;;;;GAUG;AACH,2CAHW,MAAM,GACJ,QAAQ,gBAAgB,CAAC,CAUrC;AAED;;;;;;;;;GASG;AACH,+CAJW,OAAO,iBAAiB,EAAE,YAAY,eACtC,MAAM,EAAE,iBA2BlB;AAED;;;;;;;;GAQG;AACH,+CAJW,OAAO,iBAAiB,EAAE,YAAY,oDAwBhD;;;;4BAIY,IAAI,WAAW,EAAC,MAAM,CAAC;;;;4BAKvB,IAAI,WAAW,EAAC,MAAM,CAAC;0BAIvB,OAAO,eAAe,EAAE,WAAW;0BACnC,OAAO,eAAe,EAAE,WAAW;;kBAKlC,OAAO,iBAAiB,EAAE,YAAY;kBACtC,OAAO,iBAAiB,EAAE,YAAY"}
|