appium 2.0.0-beta.25 → 2.0.0-beta.28

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 (191) hide show
  1. package/build/lib/appium.d.ts +215 -0
  2. package/build/lib/appium.d.ts.map +1 -0
  3. package/build/lib/appium.js +94 -101
  4. package/build/lib/cli/args.d.ts +20 -0
  5. package/build/lib/cli/args.d.ts.map +1 -0
  6. package/build/lib/cli/args.js +19 -39
  7. package/build/lib/cli/driver-command.d.ts +36 -0
  8. package/build/lib/cli/driver-command.d.ts.map +1 -0
  9. package/build/lib/cli/driver-command.js +10 -13
  10. package/build/lib/cli/extension-command.d.ts +345 -0
  11. package/build/lib/cli/extension-command.d.ts.map +1 -0
  12. package/build/lib/cli/extension-command.js +117 -94
  13. package/build/lib/cli/extension.d.ts +14 -0
  14. package/build/lib/cli/extension.d.ts.map +1 -0
  15. package/build/lib/cli/extension.js +14 -22
  16. package/build/lib/cli/parser.d.ts +79 -0
  17. package/build/lib/cli/parser.d.ts.map +1 -0
  18. package/build/lib/cli/parser.js +9 -19
  19. package/build/lib/cli/plugin-command.d.ts +39 -0
  20. package/build/lib/cli/plugin-command.d.ts.map +1 -0
  21. package/build/lib/cli/plugin-command.js +9 -14
  22. package/build/lib/cli/utils.d.ts +29 -0
  23. package/build/lib/cli/utils.d.ts.map +1 -0
  24. package/build/lib/cli/utils.js +2 -4
  25. package/build/lib/config-file.d.ts +100 -0
  26. package/build/lib/config-file.d.ts.map +1 -0
  27. package/build/lib/config-file.js +2 -4
  28. package/build/lib/config.d.ts +40 -0
  29. package/build/lib/config.d.ts.map +1 -0
  30. package/build/lib/config.js +8 -7
  31. package/build/lib/constants.d.ts +48 -0
  32. package/build/lib/constants.d.ts.map +1 -0
  33. package/build/lib/constants.js +60 -0
  34. package/build/lib/extension/driver-config.d.ts +84 -0
  35. package/build/lib/extension/driver-config.d.ts.map +1 -0
  36. package/build/lib/extension/driver-config.js +190 -0
  37. package/build/lib/extension/extension-config.d.ts +170 -0
  38. package/build/lib/extension/extension-config.d.ts.map +1 -0
  39. package/build/lib/extension/extension-config.js +297 -0
  40. package/build/lib/extension/index.d.ts +39 -0
  41. package/build/lib/extension/index.d.ts.map +1 -0
  42. package/build/lib/extension/index.js +77 -0
  43. package/build/lib/extension/manifest.d.ts +174 -0
  44. package/build/lib/extension/manifest.d.ts.map +1 -0
  45. package/build/lib/extension/manifest.js +246 -0
  46. package/build/lib/extension/package-changed.d.ts +11 -0
  47. package/build/lib/extension/package-changed.d.ts.map +1 -0
  48. package/build/lib/extension/package-changed.js +68 -0
  49. package/build/lib/extension/plugin-config.d.ts +62 -0
  50. package/build/lib/extension/plugin-config.d.ts.map +1 -0
  51. package/build/lib/extension/plugin-config.js +87 -0
  52. package/build/lib/grid-register.d.ts +10 -0
  53. package/build/lib/grid-register.d.ts.map +1 -0
  54. package/build/lib/grid-register.js +2 -4
  55. package/build/lib/logger.d.ts +3 -0
  56. package/build/lib/logger.d.ts.map +1 -0
  57. package/build/lib/logger.js +2 -4
  58. package/build/lib/logsink.d.ts +4 -0
  59. package/build/lib/logsink.d.ts.map +1 -0
  60. package/build/lib/logsink.js +2 -4
  61. package/build/lib/main.d.ts +51 -0
  62. package/build/lib/main.d.ts.map +1 -0
  63. package/build/lib/main.js +40 -68
  64. package/build/lib/schema/arg-spec.d.ts +143 -0
  65. package/build/lib/schema/arg-spec.d.ts.map +1 -0
  66. package/build/lib/schema/arg-spec.js +11 -14
  67. package/build/lib/schema/cli-args.d.ts +19 -0
  68. package/build/lib/schema/cli-args.d.ts.map +1 -0
  69. package/build/lib/schema/cli-args.js +2 -4
  70. package/build/lib/schema/cli-transformers.d.ts +5 -0
  71. package/build/lib/schema/cli-transformers.d.ts.map +1 -0
  72. package/build/lib/schema/cli-transformers.js +2 -4
  73. package/build/lib/schema/index.d.ts +3 -0
  74. package/build/lib/schema/index.d.ts.map +1 -0
  75. package/build/lib/schema/index.js +2 -4
  76. package/build/lib/schema/keywords.d.ts +24 -0
  77. package/build/lib/schema/keywords.d.ts.map +1 -0
  78. package/build/lib/schema/keywords.js +2 -4
  79. package/build/lib/schema/schema.d.ts +259 -0
  80. package/build/lib/schema/schema.d.ts.map +1 -0
  81. package/build/lib/schema/schema.js +57 -39
  82. package/build/lib/utils.d.ts +66 -0
  83. package/build/lib/utils.d.ts.map +1 -0
  84. package/build/lib/utils.js +6 -35
  85. package/build/tsconfig.tsbuildinfo +1 -0
  86. package/lib/appium.js +188 -117
  87. package/lib/cli/args.js +19 -24
  88. package/lib/cli/driver-command.js +19 -8
  89. package/lib/cli/extension-command.js +314 -184
  90. package/lib/cli/extension.js +18 -16
  91. package/lib/cli/parser.js +7 -16
  92. package/lib/cli/plugin-command.js +16 -7
  93. package/lib/cli/utils.js +1 -1
  94. package/lib/config-file.js +6 -7
  95. package/lib/config.js +17 -12
  96. package/lib/constants.js +78 -0
  97. package/lib/extension/driver-config.js +249 -0
  98. package/lib/extension/extension-config.js +458 -0
  99. package/lib/extension/index.js +102 -0
  100. package/lib/extension/manifest.js +486 -0
  101. package/lib/extension/package-changed.js +63 -0
  102. package/lib/extension/plugin-config.js +113 -0
  103. package/lib/grid-register.js +4 -4
  104. package/lib/logsink.js +4 -0
  105. package/lib/main.js +54 -92
  106. package/lib/schema/arg-spec.js +11 -7
  107. package/lib/schema/cli-args.js +1 -1
  108. package/lib/schema/cli-transformers.js +0 -1
  109. package/lib/schema/keywords.js +1 -2
  110. package/lib/schema/schema.js +62 -31
  111. package/lib/utils.js +48 -45
  112. package/package.json +30 -24
  113. package/{postinstall.js → scripts/postinstall.js} +1 -1
  114. package/types/appium-manifest.d.ts +61 -0
  115. package/types/cli.d.ts +134 -0
  116. package/types/extension.d.ts +56 -0
  117. package/types/external-manifest.d.ts +58 -0
  118. package/types/index.d.ts +7 -0
  119. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  120. package/build/check-npm-pack-files.js +0 -23
  121. package/build/commands-yml/parse.js +0 -319
  122. package/build/commands-yml/validator.js +0 -130
  123. package/build/index.js +0 -19
  124. package/build/lib/appium-config.schema.json +0 -0
  125. package/build/lib/cli/npm.js +0 -220
  126. package/build/lib/driver-config.js +0 -100
  127. package/build/lib/drivers.js +0 -100
  128. package/build/lib/ext-config-io.js +0 -165
  129. package/build/lib/extension-config.js +0 -320
  130. package/build/lib/plugin-config.js +0 -69
  131. package/build/lib/plugins.js +0 -18
  132. package/build/lib/schema/appium-config-schema.js +0 -253
  133. package/build/postinstall.js +0 -90
  134. package/build/test/cli/cli-e2e-specs.js +0 -221
  135. package/build/test/cli/cli-helpers.js +0 -86
  136. package/build/test/cli/cli-specs.js +0 -71
  137. package/build/test/cli/fixtures/test-driver/package.json +0 -27
  138. package/build/test/cli/schema-args-specs.js +0 -48
  139. package/build/test/cli/schema-e2e-specs.js +0 -47
  140. package/build/test/config-e2e-specs.js +0 -112
  141. package/build/test/config-file-e2e-specs.js +0 -191
  142. package/build/test/config-file-specs.js +0 -281
  143. package/build/test/config-specs.js +0 -258
  144. package/build/test/driver-e2e-specs.js +0 -435
  145. package/build/test/driver-specs.js +0 -386
  146. package/build/test/ext-config-io-specs.js +0 -181
  147. package/build/test/extension-config-specs.js +0 -365
  148. package/build/test/fixtures/allow-feat.txt +0 -5
  149. package/build/test/fixtures/caps.json +0 -3
  150. package/build/test/fixtures/config/allow-insecure.txt +0 -3
  151. package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +0 -5
  152. package/build/test/fixtures/config/appium.config.bad.json +0 -32
  153. package/build/test/fixtures/config/appium.config.ext-good.json +0 -9
  154. package/build/test/fixtures/config/appium.config.ext-unknown-props.json +0 -10
  155. package/build/test/fixtures/config/appium.config.good.js +0 -40
  156. package/build/test/fixtures/config/appium.config.good.json +0 -33
  157. package/build/test/fixtures/config/appium.config.good.yaml +0 -30
  158. package/build/test/fixtures/config/appium.config.invalid.json +0 -31
  159. package/build/test/fixtures/config/appium.config.security-array.json +0 -5
  160. package/build/test/fixtures/config/appium.config.security-delimited.json +0 -5
  161. package/build/test/fixtures/config/appium.config.security-path.json +0 -5
  162. package/build/test/fixtures/config/driver-fake.config.json +0 -8
  163. package/build/test/fixtures/config/nodeconfig.json +0 -3
  164. package/build/test/fixtures/config/plugin-fake.config.json +0 -0
  165. package/build/test/fixtures/default-args.js +0 -35
  166. package/build/test/fixtures/deny-feat.txt +0 -5
  167. package/build/test/fixtures/driver.schema.js +0 -20
  168. package/build/test/fixtures/extensions.yaml +0 -27
  169. package/build/test/fixtures/flattened-schema.js +0 -532
  170. package/build/test/fixtures/plugin.schema.js +0 -20
  171. package/build/test/fixtures/schema-with-extensions.js +0 -28
  172. package/build/test/grid-register-specs.js +0 -74
  173. package/build/test/helpers.js +0 -75
  174. package/build/test/logger-specs.js +0 -76
  175. package/build/test/npm-specs.js +0 -20
  176. package/build/test/parser-specs.js +0 -319
  177. package/build/test/plugin-e2e-specs.js +0 -316
  178. package/build/test/schema/arg-spec-specs.js +0 -70
  179. package/build/test/schema/cli-args-specs.js +0 -408
  180. package/build/test/schema/schema-specs.js +0 -407
  181. package/build/test/utils-specs.js +0 -288
  182. package/lib/cli/npm.js +0 -251
  183. package/lib/driver-config.js +0 -101
  184. package/lib/drivers.js +0 -84
  185. package/lib/ext-config-io.js +0 -287
  186. package/lib/extension-config.js +0 -366
  187. package/lib/plugin-config.js +0 -63
  188. package/lib/plugins.js +0 -13
  189. package/lib/schema/appium-config-schema.js +0 -287
  190. package/types/appium-config.d.ts +0 -197
  191. package/types/types.d.ts +0 -206
@@ -5,9 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.validate = exports.resetSchema = exports.registerSchema = exports.isFinalized = exports.isAllowedSchemaFileExtension = exports.hasArgSpec = exports.getSchema = exports.getDefaultsForSchema = exports.getDefaultsForExtension = exports.getArgSpec = exports.getAllArgSpecs = exports.flattenSchema = exports.finalizeSchema = exports.SchemaUnsupportedSchemaError = exports.SchemaUnknownSchemaError = exports.SchemaNameConflictError = exports.SchemaFinalizationError = exports.ALLOWED_SCHEMA_EXTENSIONS = void 0;
9
-
10
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
+ exports.validate = exports.resetSchema = exports.registerSchema = exports.isFinalized = exports.isAllowedSchemaFileExtension = exports.hasArgSpec = exports.getSchema = exports.getDefaultsForSchema = exports.getDefaultsForExtension = exports.getArgSpec = exports.getAllArgSpecs = exports.flattenSchema = exports.finalizeSchema = exports.SchemaUnsupportedSchemaError = exports.SchemaUnknownSchemaError = exports.SchemaNameConflictError = exports.SchemaFinalizationError = exports.RoachHotelMap = exports.ALLOWED_SCHEMA_EXTENSIONS = void 0;
11
9
 
12
10
  require("source-map-support/register");
13
11
 
@@ -19,40 +17,60 @@ var _lodash = _interopRequireDefault(require("lodash"));
19
17
 
20
18
  var _path = _interopRequireDefault(require("path"));
21
19
 
22
- var _extensionConfig = require("../extension-config");
23
-
24
- var _utils = require("../utils");
20
+ var _constants = require("../constants");
25
21
 
26
- var _appiumConfigSchema = _interopRequireDefault(require("./appium-config-schema"));
22
+ var _schema = require("@appium/schema");
27
23
 
28
24
  var _argSpec = require("./arg-spec");
29
25
 
30
26
  var _keywords = require("./keywords");
31
27
 
28
+ class RoachHotelMap extends Map {
29
+ set(key, value) {
30
+ if (this.has(key)) {
31
+ throw new Error(`${key} is already set`);
32
+ }
33
+
34
+ return super.set(key, value);
35
+ }
36
+
37
+ delete(key) {
38
+ return false;
39
+ }
40
+
41
+ clear() {
42
+ throw new Error(`Cannot clear RoachHotelMap`);
43
+ }
44
+
45
+ }
46
+
47
+ exports.RoachHotelMap = RoachHotelMap;
32
48
  const ALLOWED_SCHEMA_EXTENSIONS = new Set(['.json', '.js', '.cjs']);
33
49
  exports.ALLOWED_SCHEMA_EXTENSIONS = ALLOWED_SCHEMA_EXTENSIONS;
34
50
 
35
51
  class AppiumSchema {
52
+ _argSpecs = new RoachHotelMap();
53
+ _registeredSchemas = {
54
+ [_constants.DRIVER_TYPE]: new Map(),
55
+ [_constants.PLUGIN_TYPE]: new Map()
56
+ };
57
+ _ajv;
58
+ static _instance;
59
+ _finalizedSchemas = null;
60
+
36
61
  constructor() {
37
- (0, _defineProperty2.default)(this, "_argSpecs", new _utils.ReadonlyMap());
38
- (0, _defineProperty2.default)(this, "_registeredSchemas", {
39
- [_extensionConfig.DRIVER_TYPE]: new Map(),
40
- [_extensionConfig.PLUGIN_TYPE]: new Map()
41
- });
42
- (0, _defineProperty2.default)(this, "_ajv", void 0);
43
- (0, _defineProperty2.default)(this, "_finalizedSchemas", null);
44
62
  this._ajv = AppiumSchema._instantiateAjv();
45
63
  }
46
64
 
47
65
  static create() {
48
- var _AppiumSchema$_instan;
49
-
50
- const instance = (_AppiumSchema$_instan = AppiumSchema._instance) !== null && _AppiumSchema$_instan !== void 0 ? _AppiumSchema$_instan : new AppiumSchema();
51
- AppiumSchema._instance = instance;
66
+ if (!AppiumSchema._instance) {
67
+ const instance = new AppiumSchema();
68
+ AppiumSchema._instance = instance;
52
69
 
53
- _lodash.default.bindAll(instance, ['finalize', 'flatten', 'getAllArgSpecs', 'getArgSpec', 'getDefaults', 'getDefaultsForExtension', 'getSchema', 'hasArgSpec', 'isFinalized', 'registerSchema', 'reset', 'validate']);
70
+ _lodash.default.bindAll(instance, ['finalize', 'flatten', 'getAllArgSpecs', 'getArgSpec', 'getDefaults', 'getDefaultsForExtension', 'getSchema', 'hasArgSpec', 'isFinalized', 'registerSchema', 'hasRegisteredSchema', 'reset', 'validate']);
71
+ }
54
72
 
55
- return instance;
73
+ return AppiumSchema._instance;
56
74
  }
57
75
 
58
76
  hasRegisteredSchema(extType, extName) {
@@ -74,7 +92,7 @@ class AppiumSchema {
74
92
 
75
93
  const ajv = this._ajv;
76
94
 
77
- const baseSchema = _lodash.default.cloneDeep(_appiumConfigSchema.default);
95
+ const baseSchema = _lodash.default.cloneDeep(_schema.AppiumConfigJsonSchema);
78
96
 
79
97
  const addArgSpecs = (schema, extType, extName) => {
80
98
  for (let [propName, propSchema] of Object.entries(schema)) {
@@ -93,7 +111,7 @@ class AppiumSchema {
93
111
  }
94
112
  };
95
113
 
96
- addArgSpecs(_lodash.default.omit(baseSchema.properties.server.properties, [_extensionConfig.DRIVER_TYPE, _extensionConfig.PLUGIN_TYPE]));
114
+ addArgSpecs(_lodash.default.omit(baseSchema.properties.server.properties, [_constants.DRIVER_TYPE, _constants.PLUGIN_TYPE]));
97
115
  const finalizedSchemas = {};
98
116
 
99
117
  const finalSchema = _lodash.default.reduce(this._registeredSchemas, (baseSchema, extensionSchemas, extType) => {
@@ -140,10 +158,10 @@ class AppiumSchema {
140
158
  this._ajv.removeSchema(schemaId);
141
159
  }
142
160
 
143
- this._argSpecs = new _utils.ReadonlyMap();
161
+ this._argSpecs = new RoachHotelMap();
144
162
  this._registeredSchemas = {
145
- [_extensionConfig.DRIVER_TYPE]: new Map(),
146
- [_extensionConfig.PLUGIN_TYPE]: new Map()
163
+ [_constants.DRIVER_TYPE]: new Map(),
164
+ [_constants.PLUGIN_TYPE]: new Map()
147
165
  };
148
166
  this._finalizedSchemas = null;
149
167
  this._ajv = AppiumSchema._instantiateAjv();
@@ -273,7 +291,7 @@ class AppiumSchema {
273
291
  properties: refSchema.properties,
274
292
  prefix: [...prefix, key, normalizedExtName]
275
293
  });
276
- } else if (key !== _extensionConfig.DRIVER_TYPE && key !== _extensionConfig.PLUGIN_TYPE) {
294
+ } else if (key !== _constants.DRIVER_TYPE && key !== _constants.PLUGIN_TYPE) {
277
295
  const [extType, extName] = prefix;
278
296
  const argSpec = this.getArgSpec(key, extType, extName);
279
297
 
@@ -326,12 +344,11 @@ class AppiumSchema {
326
344
 
327
345
  }
328
346
 
329
- (0, _defineProperty2.default)(AppiumSchema, "_instance", void 0);
330
-
331
347
  class SchemaFinalizationError extends Error {
348
+ code = 'APPIUMERR_SCHEMA_FINALIZATION';
349
+
332
350
  constructor() {
333
351
  super('Schema not yet finalized; `finalize()` must be called first.');
334
- (0, _defineProperty2.default)(this, "code", 'APPIUMERR_SCHEMA_FINALIZATION');
335
352
  }
336
353
 
337
354
  }
@@ -339,10 +356,11 @@ class SchemaFinalizationError extends Error {
339
356
  exports.SchemaFinalizationError = SchemaFinalizationError;
340
357
 
341
358
  class SchemaNameConflictError extends Error {
359
+ code = 'APPIUMERR_SCHEMA_NAME_CONFLICT';
360
+ data;
361
+
342
362
  constructor(extType, extName) {
343
363
  super(`Name for ${extType} schema "${extName}" conflicts with an existing schema`);
344
- (0, _defineProperty2.default)(this, "code", 'APPIUMERR_SCHEMA_NAME_CONFLICT');
345
- (0, _defineProperty2.default)(this, "data", void 0);
346
364
  this.data = {
347
365
  extType,
348
366
  extName
@@ -354,10 +372,11 @@ class SchemaNameConflictError extends Error {
354
372
  exports.SchemaNameConflictError = SchemaNameConflictError;
355
373
 
356
374
  class SchemaUnknownSchemaError extends ReferenceError {
375
+ code = 'APPIUMERR_SCHEMA_UNKNOWN_SCHEMA';
376
+ data;
377
+
357
378
  constructor(schemaId) {
358
379
  super(`Unknown schema: "${schemaId}"`);
359
- (0, _defineProperty2.default)(this, "code", 'APPIUMERR_SCHEMA_UNKNOWN_SCHEMA');
360
- (0, _defineProperty2.default)(this, "data", void 0);
361
380
  this.data = {
362
381
  schemaId
363
382
  };
@@ -368,6 +387,9 @@ class SchemaUnknownSchemaError extends ReferenceError {
368
387
  exports.SchemaUnknownSchemaError = SchemaUnknownSchemaError;
369
388
 
370
389
  class SchemaUnsupportedSchemaError extends TypeError {
390
+ code = 'APPIUMERR_SCHEMA_UNSUPPORTED_SCHEMA';
391
+ data;
392
+
371
393
  constructor(schema, extType, extName) {
372
394
  super((() => {
373
395
  let msg = `Unsupported schema from ${extType} "${extName}":`;
@@ -386,8 +408,6 @@ class SchemaUnsupportedSchemaError extends TypeError {
386
408
 
387
409
  return `${msg} schema must be a plain object without a true "$async" property`;
388
410
  })());
389
- (0, _defineProperty2.default)(this, "code", 'APPIUMERR_SCHEMA_UNSUPPORTED_SCHEMA');
390
- (0, _defineProperty2.default)(this, "data", void 0);
391
411
  this.data = {
392
412
  schema,
393
413
  extType,
@@ -428,7 +448,5 @@ exports.registerSchema = registerSchema;
428
448
  const {
429
449
  isAllowedSchemaFileExtension
430
450
  } = AppiumSchema;
431
- exports.isAllowedSchemaFileExtension = isAllowedSchemaFileExtension;require('source-map-support').install();
432
-
433
-
434
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zY2hlbWEvc2NoZW1hLmpzIl0sIm5hbWVzIjpbIkFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMiLCJTZXQiLCJBcHBpdW1TY2hlbWEiLCJjb25zdHJ1Y3RvciIsIlJlYWRvbmx5TWFwIiwiRFJJVkVSX1RZUEUiLCJNYXAiLCJQTFVHSU5fVFlQRSIsIl9hanYiLCJfaW5zdGFudGlhdGVBanYiLCJjcmVhdGUiLCJpbnN0YW5jZSIsIl9pbnN0YW5jZSIsIl8iLCJiaW5kQWxsIiwiaGFzUmVnaXN0ZXJlZFNjaGVtYSIsImV4dFR5cGUiLCJleHROYW1lIiwiX3JlZ2lzdGVyZWRTY2hlbWFzIiwiaGFzIiwiaXNGaW5hbGl6ZWQiLCJCb29sZWFuIiwiX2ZpbmFsaXplZFNjaGVtYXMiLCJnZXRBbGxBcmdTcGVjcyIsIl9hcmdTcGVjcyIsImZpbmFsaXplIiwiYWp2IiwiYmFzZVNjaGVtYSIsImNsb25lRGVlcCIsImFwcGl1bUNvbmZpZ1NjaGVtYSIsImFkZEFyZ1NwZWNzIiwic2NoZW1hIiwicHJvcE5hbWUiLCJwcm9wU2NoZW1hIiwiT2JqZWN0IiwiZW50cmllcyIsImFyZ1NwZWMiLCJBcmdTcGVjIiwiZGVzdCIsImFwcGl1bUNsaURlc3QiLCJkZWZhdWx0VmFsdWUiLCJkZWZhdWx0IiwiYXJnIiwic2V0Iiwib21pdCIsInByb3BlcnRpZXMiLCJzZXJ2ZXIiLCJmaW5hbGl6ZWRTY2hlbWFzIiwiZmluYWxTY2hlbWEiLCJyZWR1Y2UiLCJleHRlbnNpb25TY2hlbWFzIiwiZm9yRWFjaCIsIiRyZWYiLCJ0b1NjaGVtYUJhc2VSZWYiLCIkaWQiLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsIiRjb21tZW50IiwidmFsaWRhdGVTY2hlbWEiLCJhZGRTY2hlbWEiLCJBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCIsImZyZWV6ZSIsIkFqdiIsImFsbEVycm9ycyIsImtleXdvcmRzIiwia2V5d29yZCIsImFkZEtleXdvcmQiLCJyZXNldCIsInNjaGVtYUlkIiwia2V5cyIsInJlbW92ZVNjaGVtYSIsInJlZ2lzdGVyU2NoZW1hIiwiaXNVbmRlZmluZWQiLCJUeXBlRXJyb3IiLCJpc1N1cHBvcnRlZFNjaGVtYVR5cGUiLCJTY2hlbWFVbnN1cHBvcnRlZFNjaGVtYUVycm9yIiwibm9ybWFsaXplZEV4dE5hbWUiLCJrZWJhYkNhc2UiLCJnZXQiLCJTY2hlbWFOYW1lQ29uZmxpY3RFcnJvciIsImdldEFyZ1NwZWMiLCJuYW1lIiwidG9BcmciLCJoYXNBcmdTcGVjIiwiZ2V0RGVmYXVsdHMiLCJmbGF0dGVuIiwiU2NoZW1hRmluYWxpemF0aW9uRXJyb3IiLCJyZWR1Y2VyIiwiZGVmYXVsdHMiLCJyZXR2YWwiLCJ2YWx1ZXMiLCJnZXREZWZhdWx0c0ZvckV4dGVuc2lvbiIsInNwZWNzIiwiZmlsdGVyIiwic3BlYyIsInJhd0Rlc3QiLCJnZXRTY2hlbWEiLCJzdGFjayIsInByZWZpeCIsImZsYXR0ZW5lZCIsInBhaXJzIiwidG9QYWlycyIsImtleSIsInZhbHVlIiwicHVzaCIsIlNFUlZFUl9QUk9QX05BTUUiLCJyZWZTY2hlbWEiLCJlcnIiLCJTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IiLCJleHRlbnNpb25JbmZvRnJvbVJvb3RTY2hlbWFJZCIsIlJlZmVyZW5jZUVycm9yIiwicmVmIiwiX2dldFZhbGlkYXRvciIsImlkIiwidmFsaWRhdG9yIiwidmFsaWRhdGUiLCJpc0FycmF5IiwiZXJyb3JzIiwiaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbiIsImZpbGVuYW1lIiwicGF0aCIsImV4dG5hbWUiLCJpc1BsYWluT2JqZWN0IiwiJGFzeW5jIiwiRXJyb3IiLCJkYXRhIiwibXNnIiwiaXNCb29sZWFuIiwiSlNPTiIsInN0cmluZ2lmeSIsImFwcGl1bVNjaGVtYSIsImZpbmFsaXplU2NoZW1hIiwicmVzZXRTY2hlbWEiLCJmbGF0dGVuU2NoZW1hIiwiZ2V0RGVmYXVsdHNGb3JTY2hlbWEiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFD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Q0FBSixFQUE2QjtBQUMzQixZQUFJQSxNQUFNLENBQUMyRixNQUFYLEVBQW1CO0FBQ2pCLGlCQUFRLEdBQUVHLEdBQUksbUNBQWQ7QUFDRDs7QUFFRCxjQUFNLElBQUlyRCxTQUFKLENBQ0gsMEZBQXlGdUQsSUFBSSxDQUFDQyxTQUFMLENBQ3hGakcsTUFEd0YsQ0FFeEYsRUFIRSxDQUFOO0FBS0Q7O0FBQ0QsYUFBUSxHQUFFOEYsR0FBSSxpRUFBZDtBQUNELEtBakJELEdBREY7QUFGcUMsZ0RBWmhDLHFDQVlnQztBQUFBO0FBc0JyQyxTQUFLRCxJQUFMLEdBQVk7QUFBQzdGLE1BQUFBLE1BQUQ7QUFBU2YsTUFBQUEsT0FBVDtBQUFrQkMsTUFBQUE7QUFBbEIsS0FBWjtBQUNEOztBQXZDeUQ7OztBQTBDNUQsTUFBTWdILFlBQVksR0FBRy9ILFlBQVksQ0FBQ1EsTUFBYixFQUFyQjtBQUVPLE1BQU07QUFDWDRELEVBQUFBLGNBRFc7QUFFWC9DLEVBQUFBLGNBRlc7QUFHWHdELEVBQUFBLFVBSFc7QUFJWEcsRUFBQUEsVUFKVztBQUtYOUQsRUFBQUEsV0FMVztBQU1YSyxFQUFBQSxRQUFRLEVBQUV5RyxjQU5DO0FBT1hoRSxFQUFBQSxLQUFLLEVBQUVpRSxXQVBJO0FBUVhqQixFQUFBQSxRQVJXO0FBU1huQixFQUFBQSxTQVRXO0FBVVhYLEVBQUFBLE9BQU8sRUFBRWdELGFBVkU7QUFXWGpELEVBQUFBLFdBQVcsRUFBRWtELG9CQVhGO0FBWVgzQyxFQUFBQTtBQVpXLElBYVR1QyxZQWJHOzs7Ozs7Ozs7Ozs7O0FBY0EsTUFBTTtBQUFDWixFQUFBQTtBQUFELElBQWlDbkgsWUFBdkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IEFqdiBmcm9tICdhanYnO1xuaW1wb3J0IGFkZEZvcm1hdHMgZnJvbSAnYWp2LWZvcm1hdHMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgRFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQgeyBSZWFkb25seU1hcCB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCBhcHBpdW1Db25maWdTY2hlbWEgZnJvbSAnLi9hcHBpdW0tY29uZmlnLXNjaGVtYSc7XG5pbXBvcnQgeyBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCwgQXJnU3BlYywgU0VSVkVSX1BST1BfTkFNRSB9IGZyb20gJy4vYXJnLXNwZWMnO1xuaW1wb3J0IHsga2V5d29yZHMgfSBmcm9tICcuL2tleXdvcmRzJztcblxuLyoqXG4gKiBFeHRlbnNpb25zIHRoYXQgYW4gZXh0ZW5zaW9uIHNjaGVtYSBmaWxlIGNhbiBoYXZlLlxuICovXG5leHBvcnQgY29uc3QgQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyA9IG5ldyBTZXQoWycuanNvbicsICcuanMnLCAnLmNqcyddKTtcblxuLyoqXG4gKiBBIHdyYXBwZXIgYXJvdW5kIEFqdiBhbmQgc2NoZW1hLXJlbGF0ZWQgZnVuY3Rpb25zLlxuICpcbiAqIFNob3VsZCBoYXZlIGJlZW4gbmFtZWQgSGlnaGxhbmRlciwgYmVjYXVzZSBfdGhlcmUgY2FuIG9ubHkgYmUgb25lX1xuICovXG5jbGFzcyBBcHBpdW1TY2hlbWEge1xuICAvKipcbiAgICogQSBtYXBwaW5nIG9mIHVuaXF1ZSBhcmd1bWVudCBJRHMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyB7QGxpbmsgQXJnU3BlY31zLlxuICAgKlxuICAgKiBBbiBcImFyZ3VtZW50XCIgaXMgYSBDTEkgYXJndW1lbnQgb3IgYSBjb25maWcgcHJvcGVydHkuXG4gICAqXG4gICAqIFVzZWQgdG8gcHJvdmlkZSBlYXN5IGxvb2t1cHMgb2YgYXJndW1lbnQgbWV0YWRhdGEgd2hlbiBjb252ZXJ0aW5nIGJldHdlZW4gZGlmZmVyZW50IHJlcHJlc2VudGF0aW9ucyBvZiB0aG9zZSBhcmd1bWVudHMuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSZWFkb25seU1hcDxzdHJpbmcsQXJnU3BlYz59XG4gICAqL1xuICBfYXJnU3BlY3MgPSBuZXcgUmVhZG9ubHlNYXAoKTtcblxuICAvKipcbiAgICogQSBtYXAgb2YgZXh0ZW5zaW9uIHR5cGVzIHRvIGV4dGVuc2lvbiBuYW1lcyB0byBzY2hlbWEgb2JqZWN0cy5cbiAgICpcbiAgICogVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGVuc3VyZSB0aGVyZSBhcmUgbm8gbmFtaW5nIGNvbmZsaWN0cy4gVGhlIHNjaGVtYXNcbiAgICogYXJlIHN0b3JlZCBoZXJlIGluIG1lbW9yeSB1bnRpbCB0aGUgaW5zdGFuY2UgaXMgX2ZpbmFsaXplZF8uXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSZWNvcmQ8RXh0ZW5zaW9uVHlwZSxNYXA8c3RyaW5nLFNjaGVtYU9iamVjdD4+fVxuICAgKi9cbiAgX3JlZ2lzdGVyZWRTY2hlbWFzID0ge1tEUklWRVJfVFlQRV06IG5ldyBNYXAoKSwgW1BMVUdJTl9UWVBFXTogbmV3IE1hcCgpfTtcblxuICAvKipcbiAgICogQWp2IGluc3RhbmNlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtBanZ9XG4gICAqL1xuICBfYWp2O1xuXG4gIC8qKlxuICAgKiBTaW5nbGV0b24gaW5zdGFuY2UuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtBcHBpdW1TY2hlbWF9XG4gICAqL1xuICBzdGF0aWMgX2luc3RhbmNlO1xuXG4gIC8qKlxuICAgKiBMb29rdXAgb2Ygc2NoZW1hIElEcyB0byBmaW5hbGl6ZWQgc2NoZW1hcy5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHJlZmVyZW5jZXMsIGJ1dCByYXRoZXIgdGhlIHJvb3Qgc2NoZW1hcyB0aGVtc2VsdmVzLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxTdHJpY3RTY2hlbWFPYmplY3Q+P31cbiAgICovXG4gIF9maW5hbGl6ZWRTY2hlbWFzID0gbnVsbDtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgQWp2LCBhZGRzIHN0YW5kYXJkIGZvcm1hdHMgYW5kIG91ciBjdXN0b20ga2V5d29yZHMuXG4gICAqIEBzZWUgaHR0cHM6Ly9ucG0uaW0vYWp2LWZvcm1hdHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICB0aGlzLl9hanYgPSBBcHBpdW1TY2hlbWEuX2luc3RhbnRpYXRlQWp2KCk7XG4gIH1cblxuICAvKipcbiAgICogRmFjdG9yeSBmdW5jdGlvbiBmb3Ige0BsaW5rIEFwcGl1bVNjaGVtYX0gaW5zdGFuY2VzLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSBjcmVhdGVzIGEgbmV3IG9uZS5cbiAgICogQmluZHMgcHVibGljIG1ldGhvZHMgdG8gdGhlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7QXBwaXVtU2NoZW1hfVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZSAoKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBBcHBpdW1TY2hlbWEuX2luc3RhbmNlID8/IG5ldyBBcHBpdW1TY2hlbWEoKTtcbiAgICBBcHBpdW1TY2hlbWEuX2luc3RhbmNlID0gaW5zdGFuY2U7XG5cbiAgICBfLmJpbmRBbGwoaW5zdGFuY2UsIFtcbiAgICAgICdmaW5hbGl6ZScsXG4gICAgICAnZmxhdHRlbicsXG4gICAgICAnZ2V0QWxsQXJnU3BlY3MnLFxuICAgICAgJ2dldEFyZ1NwZWMnLFxuICAgICAgJ2dldERlZmF1bHRzJyxcbiAgICAgICdnZXREZWZhdWx0c0ZvckV4dGVuc2lvbicsXG4gICAgICAnZ2V0U2NoZW1hJyxcbiAgICAgICdoYXNBcmdTcGVjJyxcbiAgICAgICdpc0ZpbmFsaXplZCcsXG4gICAgICAncmVnaXN0ZXJTY2hlbWEnLFxuICAgICAgJ3Jlc2V0JyxcbiAgICAgICd2YWxpZGF0ZScsXG4gICAgXSk7XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYSBzY2hlbWEgaGFzIGJlZW4gcmVnaXN0ZXJlZCB1c2luZyBnaXZlbiBleHRlbnNpb24gdHlwZSBhbmQgbmFtZS5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCBkZXBlbmQgb24gd2hldGhlciBvciBub3QgdGhlIGluc3RhbmNlIGhhcyBiZWVuIF9maW5hbGl6ZWRfLlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGUgLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZSAtIE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IElmIHJlZ2lzdGVyZWRcbiAgICovXG4gIGhhc1JlZ2lzdGVyZWRTY2hlbWEgKGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJlZFNjaGVtYXNbZXh0VHlwZV0uaGFzKGV4dE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBgdHJ1ZWAgaWYge0BsaW5rIEFwcGl1bVNjaGVtYS5maW5hbGl6ZSBmaW5hbGl6ZX0gaGFzIGJlZW4gY2FsbGVkXG4gICAqIHN1Y2Nlc3NmdWxseSBhbmQge0BsaW5rIEFwcGl1bVNjaGVtYS5yZXNldCByZXNldH0gaGFzIG5vdCBiZWVuIGNhbGxlZCBzaW5jZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IElmIGZpbmFsaXplZFxuICAgKi9cbiAgaXNGaW5hbGl6ZWQgKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuX2ZpbmFsaXplZFNjaGVtYXMpO1xuICB9XG5cbiAgZ2V0QWxsQXJnU3BlY3MgKCkge1xuICAgIHJldHVybiB0aGlzLl9hcmdTcGVjcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgd2hlbiBubyBtb3JlIHNjaGVtYXMgd2lsbCBiZSByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBUaGlzIGRvZXMgdGhyZWUgdGhpbmdzOlxuICAgKiAxLiBJdCBjb21iaW5lcyBhbGwgc2NoZW1hcyBmcm9tIGV4dGVuc2lvbnMgaW50byB0aGUgQXBwaXVtIGNvbmZpZyBzY2hlbWEsXG4gICAqICAgIHRoZW4gYWRkcyB0aGUgcmVzdWx0IHRvIHRoZSBgQWp2YCBpbnN0YW5jZS5cbiAgICogMi4gSXQgYWRkcyBzY2hlbWFzIGZvciBfZWFjaF8gYXJndW1lbnQvcHJvcGVydHkgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMuXG4gICAqICAgIFRoZSBDTEkgdXNlcyB0aGVzZSBzY2hlbWFzIHRvIHZhbGlkYXRlIHNwZWNpZmljIGFyZ3VtZW50cy5cbiAgICogMy4gVGhlIHNjaGVtYXMgYXJlIHZhbGlkYXRlZCBhZ2FpbnN0IEpTT04gc2NoZW1hIGRyYWZ0LTA3ICh3aGljaCBpcyB0aGVcbiAgICogICAgb25seSBvbmUgc3VwcG9ydGVkIGF0IHRoaXMgdGltZSlcbiAgICpcbiAgICogQW55IG1ldGhvZCBpbiB0aGlzIGluc3RhbmNlIHRoYXQgbmVlZHMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgYEFqdmAgaW5zdGFuY2VcbiAgICogd2lsbCB0aHJvdyBpZiB0aGlzIG1ldGhvZCBoYXMgbm90IGJlZW4gY2FsbGVkLlxuICAgKlxuICAgKiBJZiB0aGUgaW5zdGFuY2UgaGFzIGFscmVhZHkgYmVlbiBmaW5hbGl6ZWQsIHRoaXMgaXMgYSBuby1vcC5cbiAgICogQHB1YmxpY1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHNjaGVtYSBpcyBub3QgdmFsaWRcbiAgICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsU3RyaWN0U2NoZW1hT2JqZWN0Pj59IFJlY29yZCBvZiBzY2hlbWEgSURzIHRvIGZ1bGwgc2NoZW1hIG9iamVjdHNcbiAgICovXG4gIGZpbmFsaXplICgpIHtcbiAgICBpZiAodGhpcy5pc0ZpbmFsaXplZCgpKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLFN0cmljdFNjaGVtYU9iamVjdD59ICovIChcbiAgICAgICAgdGhpcy5fZmluYWxpemVkU2NoZW1hc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhanYgPSB0aGlzLl9hanY7XG5cbiAgICAvLyBBanYgd2lsbCBfbXV0YXRlXyB0aGUgc2NoZW1hLCBzbyB3ZSBuZWVkIHRvIGNsb25lIGl0LlxuICAgIGNvbnN0IGJhc2VTY2hlbWEgPSBfLmNsb25lRGVlcChhcHBpdW1Db25maWdTY2hlbWEpO1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1NjaGVtYU9iamVjdH0gc2NoZW1hXG4gICAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBbZXh0VHlwZV1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dE5hbWVdXG4gICAgICovXG4gICAgY29uc3QgYWRkQXJnU3BlY3MgPSAoc2NoZW1hLCBleHRUeXBlLCBleHROYW1lKSA9PiB7XG4gICAgICBmb3IgKGxldCBbcHJvcE5hbWUsIHByb3BTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYSkpIHtcbiAgICAgICAgY29uc3QgYXJnU3BlYyA9IEFyZ1NwZWMuY3JlYXRlKHByb3BOYW1lLCB7XG4gICAgICAgICAgZGVzdDogcHJvcFNjaGVtYS5hcHBpdW1DbGlEZXN0LFxuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogcHJvcFNjaGVtYS5kZWZhdWx0LFxuICAgICAgICAgIGV4dFR5cGUsXG4gICAgICAgICAgZXh0TmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHthcmd9ID0gYXJnU3BlYztcbiAgICAgICAgdGhpcy5fYXJnU3BlY3Muc2V0KGFyZywgYXJnU3BlYyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGFkZEFyZ1NwZWNzKFxuICAgICAgXy5vbWl0KGJhc2VTY2hlbWEucHJvcGVydGllcy5zZXJ2ZXIucHJvcGVydGllcywgW1xuICAgICAgICBEUklWRVJfVFlQRSxcbiAgICAgICAgUExVR0lOX1RZUEUsXG4gICAgICBdKSxcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsU3RyaWN0U2NoZW1hT2JqZWN0Pn1cbiAgICAgKi9cbiAgICBjb25zdCBmaW5hbGl6ZWRTY2hlbWFzID0ge307XG5cbiAgICBjb25zdCBmaW5hbFNjaGVtYSA9IF8ucmVkdWNlKFxuICAgICAgdGhpcy5fcmVnaXN0ZXJlZFNjaGVtYXMsXG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7dHlwZW9mIGJhc2VTY2hlbWF9IGJhc2VTY2hlbWFcbiAgICAgICAqIEBwYXJhbSB7TWFwPHN0cmluZyxTY2hlbWFPYmplY3Q+fSBleHRlbnNpb25TY2hlbWFzXG4gICAgICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGVcbiAgICAgICAqL1xuICAgICAgKGJhc2VTY2hlbWEsIGV4dGVuc2lvblNjaGVtYXMsIGV4dFR5cGUpID0+IHtcbiAgICAgICAgZXh0ZW5zaW9uU2NoZW1hcy5mb3JFYWNoKChzY2hlbWEsIGV4dE5hbWUpID0+IHtcbiAgICAgICAgICBjb25zdCAkcmVmID0gQXJnU3BlYy50b1NjaGVtYUJhc2VSZWYoZXh0VHlwZSwgZXh0TmFtZSk7XG4gICAgICAgICAgc2NoZW1hLiRpZCA9ICRyZWY7XG4gICAgICAgICAgc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gZmFsc2U7IC8vIHRoaXMgbWFrZXMgYHNjaGVtYWAgYmVjb21lIGEgYFN0cmljdFNjaGVtYU9iamVjdGBcbiAgICAgICAgICBiYXNlU2NoZW1hLnByb3BlcnRpZXMuc2VydmVyLnByb3BlcnRpZXNbZXh0VHlwZV0ucHJvcGVydGllc1tleHROYW1lXSA9XG4gICAgICAgICAgICB7JHJlZiwgJGNvbW1lbnQ6IGV4dE5hbWV9O1xuICAgICAgICAgIGFqdi52YWxpZGF0ZVNjaGVtYShzY2hlbWEsIHRydWUpO1xuICAgICAgICAgIGFkZEFyZ1NwZWNzKHNjaGVtYS5wcm9wZXJ0aWVzLCBleHRUeXBlLCBleHROYW1lKTtcbiAgICAgICAgICBhanYuYWRkU2NoZW1hKHNjaGVtYSwgJHJlZik7XG4gICAgICAgICAgZmluYWxpemVkU2NoZW1hc1skcmVmXSA9IC8qKiBAdHlwZSB7U3RyaWN0U2NoZW1hT2JqZWN0fSAqLyAoc2NoZW1hKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBiYXNlU2NoZW1hO1xuICAgICAgfSxcbiAgICAgIGJhc2VTY2hlbWEsXG4gICAgKTtcblxuICAgIGFqdi5hZGRTY2hlbWEoZmluYWxTY2hlbWEsIEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKTtcbiAgICBmaW5hbGl6ZWRTY2hlbWFzW0FQUElVTV9DT05GSUdfU0NIRU1BX0lEXSA9IGZpbmFsU2NoZW1hO1xuICAgIGFqdi52YWxpZGF0ZVNjaGVtYShmaW5hbFNjaGVtYSwgdHJ1ZSk7XG5cbiAgICB0aGlzLl9maW5hbGl6ZWRTY2hlbWFzID0gZmluYWxpemVkU2NoZW1hcztcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShmaW5hbGl6ZWRTY2hlbWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmVzIGFuZCBjcmVhdGVzIGFuIEFqdiBpbnN0YW5jZS5cbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge0Fqdn1cbiAgICovXG4gIHN0YXRpYyBfaW5zdGFudGlhdGVBanYgKCkge1xuICAgIGNvbnN0IGFqdiA9IGFkZEZvcm1hdHMoXG4gICAgICBuZXcgQWp2KHtcbiAgICAgICAgLy8gd2l0aG91dCB0aGlzIG5vdCBtdWNoIHZhbGlkYXRpb24gYWN0dWFsbHkgaGFwcGVuc1xuICAgICAgICBhbGxFcnJvcnM6IHRydWUsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gYWRkIGN1c3RvbSBrZXl3b3JkcyB0byBhanYuIHNlZSBzY2hlbWEta2V5d29yZHMuanNcbiAgICBfLmZvckVhY2goa2V5d29yZHMsIChrZXl3b3JkKSA9PiB7XG4gICAgICBhanYuYWRkS2V5d29yZChrZXl3b3JkKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBhanY7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoaXMgaW5zdGFuY2UgdG8gaXRzIG9yaWdpbmFsIHN0YXRlLlxuICAgKlxuICAgKiAtIFJlbW92ZXMgYWxsIGFkZGVkIHNjaGVtYXMgZnJvbSB0aGUgYEFqdmAgaW5zdGFuY2VcbiAgICogLSBSZXNldHMgdGhlIG1hcCBvZiB7QGxpbmsgQXJnU3BlYyBBcmdTcGVjc31cbiAgICogLSBSZXNldHMgdGhlIG1hcCBvZiByZWdpc3RlcmVkIHNjaGVtYXNcbiAgICogLSBTZXRzIHRoZSB7QGxpbmsgQXBwaXVtU2NoZW1hLl9maW5hbGl6ZWQgX2ZpbmFsaXplZH0gZmxhZyB0byBgZmFsc2VgXG4gICAqXG4gICAqIElmIHlvdSBuZWVkIHRvIGNhbGwge0BsaW5rIEFwcGl1bVNjaGVtYS5maW5hbGl6ZX0gYWdhaW4sIHlvdSdsbCB3YW50IHRvIGNhbGwgdGhpcyBmaXJzdC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZXNldCAoKSB7XG4gICAgZm9yIChjb25zdCBzY2hlbWFJZCBvZiBPYmplY3Qua2V5cyh0aGlzLl9maW5hbGl6ZWRTY2hlbWFzID8/IHt9KSkge1xuICAgICAgdGhpcy5fYWp2LnJlbW92ZVNjaGVtYShzY2hlbWFJZCk7XG4gICAgfVxuICAgIHRoaXMuX2FyZ1NwZWNzID0gbmV3IFJlYWRvbmx5TWFwKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJlZFNjaGVtYXMgPSB7XG4gICAgICBbRFJJVkVSX1RZUEVdOiBuZXcgTWFwKCksXG4gICAgICBbUExVR0lOX1RZUEVdOiBuZXcgTWFwKCksXG4gICAgfTtcbiAgICB0aGlzLl9maW5hbGl6ZWRTY2hlbWFzID0gbnVsbDtcblxuICAgIC8vIEFqdiBzZWVtcyB0byBoYXZlIGFuIG92ZXItZWFnZXIgY2FjaGUsIHNvIHdlIGhhdmUgdG8gZHVtcCB0aGUgb2JqZWN0IGVudGlyZWx5LlxuICAgIHRoaXMuX2FqdiA9IEFwcGl1bVNjaGVtYS5faW5zdGFudGlhdGVBanYoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBzY2hlbWEgZnJvbSBhbiBleHRlbnNpb24uXG4gICAqXG4gICAqIFRoaXMgaXMgXCJmYWlsLWZhc3RcIiBpbiB0aGF0IHRoZSBzY2hlbWEgd2lsbCBpbW1lZGlhdGVseSBiZSB2YWxpZGF0ZWQgYWdhaW5zdCBKU09OIHNjaGVtYSBkcmFmdC0wNyBfb3JfIHdoYXRldmVyIHRoZSB2YWx1ZSBvZiB0aGUgc2NoZW1hJ3MgYCRzY2hlbWFgIHByb3AgaXMuXG4gICAqXG4gICAqIERvZXMgX25vdF8gYWRkIHRoZSBzY2hlbWEgdG8gdGhlIGBhanZgIGluc3RhbmNlICh0aGlzIGlzIGRvbmUgYnkge0BsaW5rIEFwcGl1bVNjaGVtYS5maW5hbGl6ZX0pLlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnLi4vZXh0LWNvbmZpZy1pbycpLkV4dGVuc2lvblR5cGV9IGV4dFR5cGUgLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZSAtIFVuaXF1ZSBleHRlbnNpb24gbmFtZSBmb3IgYHR5cGVgXG4gICAqIEBwYXJhbSB7U2NoZW1hT2JqZWN0fSBzY2hlbWEgLSBTY2hlbWEgb2JqZWN0XG4gICAqIEB0aHJvd3Mge1NjaGVtYU5hbWVDb25mbGljdEVycm9yfSBJZiB0aGUgc2NoZW1hIGlzIGFuIGludmFsaWRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZWdpc3RlclNjaGVtYSAoZXh0VHlwZSwgZXh0TmFtZSwgc2NoZW1hKSB7XG4gICAgaWYgKCEoZXh0VHlwZSAmJiBleHROYW1lKSB8fCBfLmlzVW5kZWZpbmVkKHNjaGVtYSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdFeHBlY3RlZCBleHRlbnNpb24gdHlwZSwgZXh0ZW5zaW9uIG5hbWUsIGFuZCBhIGRlZmluZWQgc2NoZW1hJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghQXBwaXVtU2NoZW1hLmlzU3VwcG9ydGVkU2NoZW1hVHlwZShzY2hlbWEpKSB7XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hVW5zdXBwb3J0ZWRTY2hlbWFFcnJvcihzY2hlbWEsIGV4dFR5cGUsIGV4dE5hbWUpO1xuICAgIH1cbiAgICBjb25zdCBub3JtYWxpemVkRXh0TmFtZSA9IF8ua2ViYWJDYXNlKGV4dE5hbWUpO1xuICAgIGlmICh0aGlzLmhhc1JlZ2lzdGVyZWRTY2hlbWEoZXh0VHlwZSwgbm9ybWFsaXplZEV4dE5hbWUpKSB7XG4gICAgICBpZiAodGhpcy5fcmVnaXN0ZXJlZFNjaGVtYXNbZXh0VHlwZV0uZ2V0KG5vcm1hbGl6ZWRFeHROYW1lKSA9PT0gc2NoZW1hKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBTY2hlbWFOYW1lQ29uZmxpY3RFcnJvcihleHRUeXBlLCBleHROYW1lKTtcbiAgICB9XG4gICAgdGhpcy5fYWp2LnZhbGlkYXRlU2NoZW1hKHNjaGVtYSwgdHJ1ZSk7XG5cbiAgICB0aGlzLl9yZWdpc3RlcmVkU2NoZW1hc1tleHRUeXBlXS5zZXQobm9ybWFsaXplZEV4dE5hbWUsIHNjaGVtYSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHtAbGluayBBcmdTcGVjfSBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50IG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQ0xJIGFyZ3VtZW50IG5hbWVcbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBbZXh0VHlwZV0gLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dE5hbWVdIC0gRXh0ZW5zaW9uIG5hbWVcbiAgICogQHJldHVybnMge0FyZ1NwZWN8dW5kZWZpbmVkfSBBcmdTcGVjIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgZ2V0QXJnU3BlYyAobmFtZSwgZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9hcmdTcGVjcy5nZXQoQXJnU3BlYy50b0FyZyhuYW1lLCBleHRUeXBlLCBleHROYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGluc3RhbmNlIGtub3dzIGFib3V0IGFuIGFyZ3VtZW50IGJ5IHRoZSBnaXZlbiBgbmFtZWAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQ0xJIGFyZ3VtZW50IG5hbWVcbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBbZXh0VHlwZV0gLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dE5hbWVdIC0gRXh0ZW5zaW9uIG5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBzdWNoIGFuIHtAbGluayBBcmdTcGVjfSBleGlzdHNcbiAgICovXG4gIGhhc0FyZ1NwZWMgKG5hbWUsIGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYXJnU3BlY3MuaGFzKEFyZ1NwZWMudG9BcmcobmFtZSwgZXh0VHlwZSwgZXh0TmFtZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBgUmVjb3JkYCBvZiBhcmd1bWVudCBcImRlc3RcIiBzdHJpbmdzIHRvIGRlZmF1bHQgdmFsdWVzLlxuICAgKlxuICAgKiBUaGUgXCJkZXN0XCIgc3RyaW5nIGlzIHRoZSBwcm9wZXJ0eSBuYW1lIGluIG9iamVjdCByZXR1cm5lZCBieVxuICAgKiBgYXJncGFyc2UuQXJndW1lbnRQYXJzZXJbJ3BhcnNlX2FyZ3MnXWAuXG4gICAqIEB0ZW1wbGF0ZSB7Ym9vbGVhbnx1bmRlZmluZWR9IEZsYXR0ZW5lZFxuICAgKiBAcGFyYW0ge0ZsYXR0ZW5lZH0gW2ZsYXR0ZW49dHJ1ZV0gLSBJZiBgdHJ1ZWAsIGZsYXR0ZW5zIHRoZSByZXR1cm5lZCBvYmplY3RcbiAgICogdXNpbmcgXCJrZXlwYXRoXCItc3R5bGUga2V5cyBvZiB0aGUgZm9ybWF0IGA8ZXh0VHlwZT4uPGV4dE5hbWU+LjxhcmdOYW1lPmAuXG4gICAqIE90aGVyd2lzZSwgcmV0dXJucyBhIG5lc3RlZCBvYmplY3QgdXNpbmcgYGV4dFR5cGVgIGFuZCBgZXh0TmFtZWAgYXNcbiAgICogcHJvcGVydGllcy4gQmFzZSBhcmd1bWVudHMgKHNlcnZlciBhcmd1bWVudHMpIGFyZSBhbHdheXMgYXQgdGhlIHRvcCBsZXZlbC5cbiAgICogQHJldHVybnMge0RlZmF1bHRWYWx1ZXM8RmxhdHRlbmVkPn1cbiAgICovXG4gIGdldERlZmF1bHRzIChmbGF0dGVuID0gLyoqIEB0eXBlIHtGbGF0dGVuZWR9ICovICh0cnVlKSkge1xuICAgIGlmICghdGhpcy5pc0ZpbmFsaXplZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hRmluYWxpemF0aW9uRXJyb3IoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjYWxsYmFjayBEZWZhdWx0UmVkdWNlclxuICAgICAqIEBwYXJhbSB7RGVmYXVsdFZhbHVlczxGbGF0dGVuZWQ+fSBkZWZhdWx0c1xuICAgICAqIEBwYXJhbSB7QXJnU3BlY30gYXJnU3BlY1xuICAgICAqIEByZXR1cm5zIHtEZWZhdWx0VmFsdWVzPEZsYXR0ZW5lZD59XG4gICAgICovXG4gICAgLyoqIEB0eXBlIHtEZWZhdWx0UmVkdWNlcn0gKi9cbiAgICBjb25zdCByZWR1Y2VyID0gZmxhdHRlblxuICAgICAgPyAoZGVmYXVsdHMsIHtkZWZhdWx0VmFsdWUsIGRlc3R9KSA9PiB7XG4gICAgICAgIGlmICghXy5pc1VuZGVmaW5lZChkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgICAgZGVmYXVsdHNbZGVzdF0gPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgICAgfVxuICAgICAgOiAoZGVmYXVsdHMsIHtkZWZhdWx0VmFsdWUsIGRlc3R9KSA9PiB7XG4gICAgICAgIGlmICghXy5pc1VuZGVmaW5lZChkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgICAgXy5zZXQoZGVmYXVsdHMsIGRlc3QsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgICAgfTtcblxuICAgIC8qKiBAdHlwZSB7RGVmYXVsdFZhbHVlczxGbGF0dGVuZWQ+fSAqL1xuICAgIGNvbnN0IHJldHZhbCA9IHt9O1xuICAgIHJldHVybiBbLi4udGhpcy5fYXJnU3BlY3MudmFsdWVzKCldLnJlZHVjZShyZWR1Y2VyLCByZXR2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBmbGF0dGVuZWQgUmVjb3JkIG9mIGRlZmF1bHRzIGZvciBhIHNwZWNpZmljIGV4dGVuc2lvbi4gS2V5cyB3aWxsXG4gICAqIGJlIG9mIGZvcm1hdCBgPGFyZ05hbWU+YC5cbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBleHRUeXBlIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBFeHRlbnNpb24gbmFtZVxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZyxBcmdTcGVjRGVmYXVsdFZhbHVlPn1cbiAgICovXG4gIGdldERlZmF1bHRzRm9yRXh0ZW5zaW9uIChleHRUeXBlLCBleHROYW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzRmluYWxpemVkKCkpIHtcbiAgICAgIHRocm93IG5ldyBTY2hlbWFGaW5hbGl6YXRpb25FcnJvcigpO1xuICAgIH1cbiAgICBjb25zdCBzcGVjcyA9IFsuLi50aGlzLl9hcmdTcGVjcy52YWx1ZXMoKV0uZmlsdGVyKFxuICAgICAgKHNwZWMpID0+IHNwZWMuZXh0VHlwZSA9PT0gZXh0VHlwZSAmJiBzcGVjLmV4dE5hbWUgPT09IGV4dE5hbWUsXG4gICAgKTtcbiAgICByZXR1cm4gc3BlY3MucmVkdWNlKChkZWZhdWx0cywge2RlZmF1bHRWYWx1ZSwgcmF3RGVzdH0pID0+IHtcbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgIGRlZmF1bHRzW3Jhd0Rlc3RdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGF0dGVuIHNjaGVtYSBpbnRvIGFuIGFycmF5IG9mIGBTY2hlbWFPYmplY3RgcyBhbmQgYXNzb2NpYXRlZFxuICAgKiB7QGxpbmsgQXJnU3BlYyBBcmdTcGVjc30uXG4gICAqXG4gICAqIENvbnZlcnRzIG5lc3RlZCBleHRlbnNpb24gc2NoZW1hcyB0byBrZXlzIGJhc2VkIG9uIHRoZSBleHRlbnNpb24gdHlwZSBhbmRcbiAgICogbmFtZS4gVXNlZCB3aGVuIHRyYW5zbGF0aW5nIHRvIGBhcmdwYXJzZWAgb3B0aW9ucyBvciBnZXR0aW5nIHRoZSBsaXN0IG9mXG4gICAqIGRlZmF1bHQgdmFsdWVzIChzZWUge0BsaW5rIEFwcGl1bVNjaGVtYS5nZXREZWZhdWx0c30pIGZvciBDTEkgb3Igb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFuIGludGVybWVkaWF0ZSByZXByc2VudGF0aW9uIHVzZWQgYnkgYGNsaS1hcmdzYFxuICAgKiBtb2R1bGUncyBgdG9QYXJzZXJBcmdzYCwgd2hpY2ggY29udmVydHMgdGhlIGZpbmFsaXplZCBzY2hlbWEgdG8gcGFyYW1ldGVyc1xuICAgKiB1c2VkIGJ5IGBhcmdwYXJzZWAuXG4gICAqIEB0aHJvd3MgSWYge0BsaW5rIEFwcGl1bVNjaGVtYS5maW5hbGl6ZX0gaGFzIG5vdCBiZWVuIGNhbGxlZCB5ZXQuXG4gICAqIEByZXR1cm5zIHtGbGF0dGVuZWRTY2hlbWF9XG4gICAqL1xuICBmbGF0dGVuICgpIHtcbiAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmdldFNjaGVtYSgpO1xuXG4gICAgLyoqIEB0eXBlIHsge3Byb3BlcnRpZXM6IFNjaGVtYU9iamVjdCwgcHJlZml4OiBzdHJpbmdbXX1bXSB9ICovXG4gICAgY29uc3Qgc3RhY2sgPSBbe3Byb3BlcnRpZXM6IHNjaGVtYS5wcm9wZXJ0aWVzLCBwcmVmaXg6IFtdfV07XG4gICAgLyoqIEB0eXBlIHtGbGF0dGVuZWRTY2hlbWF9ICovXG4gICAgY29uc3QgZmxhdHRlbmVkID0gW107XG5cbiAgICAvLyB0aGlzIGJpdCBpcyBhIHJlY3Vyc2l2ZSBhbGdvcml0aG0gcmV3cml0dGVuIGFzIGEgZm9yIGxvb3AuXG4gICAgLy8gd2hlbiB3ZSBmaW5kIHNvbWV0aGluZyB3ZSB3YW50IHRvIHRyYXZlcnNlLCB3ZSBhZGQgaXQgdG8gYHN0YWNrYFxuICAgIGZvciAoY29uc3Qge3Byb3BlcnRpZXMsIHByZWZpeH0gb2Ygc3RhY2spIHtcbiAgICAgIGNvbnN0IHBhaXJzID0gXy50b1BhaXJzKHByb3BlcnRpZXMpO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcGFpcnMpIHtcbiAgICAgICAgY29uc3Qge3Byb3BlcnRpZXMsICRyZWZ9ID0gdmFsdWU7XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgcHJlZml4OiBrZXkgPT09IFNFUlZFUl9QUk9QX05BTUUgPyBbXSA6IFsuLi5wcmVmaXgsIGtleV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoJHJlZikge1xuICAgICAgICAgIGxldCByZWZTY2hlbWE7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlZlNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hKCRyZWYpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gdGhpcyBjYW4gaGFwcGVuIGlmIGFuIGV4dGVuc2lvbiBzY2hlbWEgc3VwcGxpZXMgYSAkcmVmIHRvIGEgbm9uLWV4aXN0ZW50IHNjaGVtYVxuICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVVua25vd25TY2hlbWFFcnJvcigkcmVmKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qge25vcm1hbGl6ZWRFeHROYW1lfSA9XG4gICAgICAgICAgICBBcmdTcGVjLmV4dGVuc2lvbkluZm9Gcm9tUm9vdFNjaGVtYUlkKCRyZWYpO1xuICAgICAgICAgIGlmICghbm9ybWFsaXplZEV4dE5hbWUpIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXG4gICAgICAgICAgICAgIGBDb3VsZCBub3QgZGV0ZXJtaW5lIGV4dGVuc2lvbiBuYW1lIGZyb20gc2NoZW1hIElEICR7JHJlZn0uIFRoaXMgaXMgYSBidWcuYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgcHJvcGVydGllczogcmVmU2NoZW1hLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBwcmVmaXg6IFsuLi5wcmVmaXgsIGtleSwgbm9ybWFsaXplZEV4dE5hbWVdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSAhPT0gRFJJVkVSX1RZUEUgJiYga2V5ICE9PSBQTFVHSU5fVFlQRSkge1xuICAgICAgICAgIGNvbnN0IFtleHRUeXBlLCBleHROYW1lXSA9IHByZWZpeDtcbiAgICAgICAgICBjb25zdCBhcmdTcGVjID0gdGhpcy5nZXRBcmdTcGVjKFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtFeHRlbnNpb25UeXBlfSAqLyAoZXh0VHlwZSksXG4gICAgICAgICAgICBleHROYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFhcmdTcGVjKSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICAgICAgICBgVW5rbm93biBhcmd1bWVudCB3aXRoIGtleSAke2tleX0sIGV4dFR5cGUgJHtleHRUeXBlfSBhbmQgZXh0TmFtZSAke2V4dE5hbWV9LiBUaGlzIGlzIGEgYnVnLmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbGF0dGVuZWQucHVzaCh7c2NoZW1hOiBfLmNsb25lRGVlcCh2YWx1ZSksIGFyZ1NwZWN9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmbGF0dGVuZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBzY2hlbWEgaXRzZWxmXG4gICAqIEBwdWJsaWNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWZdIC0gU2NoZW1hIElEXG4gICAqIEB0aHJvd3MgSWYgdGhlIHNjaGVtYSBoYXMgbm90IHlldCBiZWVuIGZpbmFsaXplZFxuICAgKiBAcmV0dXJucyB7U2NoZW1hT2JqZWN0fVxuICAgKi9cbiAgZ2V0U2NoZW1hIChyZWYgPSBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCkge1xuICAgIHJldHVybiAvKiogQHR5cGUge1NjaGVtYU9iamVjdH0gKi8gKHRoaXMuX2dldFZhbGlkYXRvcihyZWYpLnNjaGVtYSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHNjaGVtYSB2YWxpZGF0b3IgZnVuY3Rpb24gZnJvbSBBanZcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtpZF0gLSBTY2hlbWEgSURcbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge2ltcG9ydCgnYWp2JykuVmFsaWRhdGVGdW5jdGlvbn1cbiAgICovXG4gIF9nZXRWYWxpZGF0b3IgKGlkID0gQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQpIHtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSB0aGlzLl9hanYuZ2V0U2NoZW1hKGlkKTtcbiAgICBpZiAoIXZhbGlkYXRvcikge1xuICAgICAgaWYgKGlkID09PSBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCkge1xuICAgICAgICB0aHJvdyBuZXcgU2NoZW1hRmluYWxpemF0aW9uRXJyb3IoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGFuIG9iamVjdCwgdmFsaWRhdGVzIGl0IGFnYWluc3QgdGhlIEFwcGl1bSBjb25maWcgc2NoZW1hLlxuICAgKiBJZiBlcnJvcnMgb2NjdXIsIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGJlIG5vbi1lbXB0eS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIChob3BlZnVsbHkgYW4gb2JqZWN0KSB0byB2YWxpZGF0ZSBhZ2FpbnN0IHRoZSBzY2hlbWFcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWZdIC0gU2NoZW1hIElEIG9yIHJlZi5cbiAgICogQHB1YmxpY1xuICAgKiBAcmV0dXJucyB7aW1wb3J0KCdhanYnKS5FcnJvck9iamVjdFtdfSBBcnJheSBvZiBlcnJvcnMsIGlmIGFueS5cbiAgICovXG4gIHZhbGlkYXRlICh2YWx1ZSwgcmVmID0gQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQpIHtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSB0aGlzLl9nZXRWYWxpZGF0b3IocmVmKTtcbiAgICByZXR1cm4gIXZhbGlkYXRvcih2YWx1ZSkgJiYgXy5pc0FycmF5KHZhbGlkYXRvci5lcnJvcnMpXG4gICAgICA/IFsuLi52YWxpZGF0b3IuZXJyb3JzXVxuICAgICAgOiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBgZmlsZW5hbWVgJ3MgZmlsZSBleHRlbnNpb24gaXMgYWxsb3dlZCAoaW4ge0BsaW5rIEFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlN9KS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzQWxsb3dlZFNjaGVtYUZpbGVFeHRlbnNpb24gKGZpbGVuYW1lKSB7XG4gICAgcmV0dXJuIEFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMuaGFzKHBhdGguZXh0bmFtZShmaWxlbmFtZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIGBzY2hlbWFgIGlzIGEgcGxhaW4gb2JqZWN0IHdpdGggYSBub24tdHJ1ZSBgJGFzeW5jYCBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHthbnl9IHNjaGVtYSAtIFNjaGVtYSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB7c2NoZW1hIGlzIFNjaGVtYU9iamVjdH1cbiAgICovXG4gIHN0YXRpYyBpc1N1cHBvcnRlZFNjaGVtYVR5cGUgKHNjaGVtYSkge1xuICAgIHJldHVybiBfLmlzUGxhaW5PYmplY3Qoc2NoZW1hKSAmJiBzY2hlbWEuJGFzeW5jICE9PSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gdGhlIHtAbGluayBBcHBpdW1TY2hlbWF9IGluc3RhbmNlIGhhcyBub3QgeWV0IGJlZW4gZmluYWxpemVkLCBidXRcbiAqIHRoZSBtZXRob2QgY2FsbGVkIHJlcXVpcmVzIGl0LlxuICovXG5leHBvcnQgY2xhc3MgU2NoZW1hRmluYWxpemF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9GSU5BTElaQVRJT04nO1xuXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcignU2NoZW1hIG5vdCB5ZXQgZmluYWxpemVkOyBgZmluYWxpemUoKWAgbXVzdCBiZSBjYWxsZWQgZmlyc3QuJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIFwidW5pcXVlXCIgc2NoZW1hIElEIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHNjaGVtYSBJRC5cbiAqXG4gKiBUaGlzIGlzIGxpa2VseSBnb2luZyB0byBiZSBjYXVzZWQgYnkgYXR0ZW1wdGluZyB0byByZWdpc3RlciB0aGUgc2FtZSBzY2hlbWEgdHdpY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFOYW1lQ29uZmxpY3RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTxzdHJpbmc+fVxuICAgKi9cbiAgY29kZSA9ICdBUFBJVU1FUlJfU0NIRU1BX05BTUVfQ09ORkxJQ1QnO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8e2V4dFR5cGU6IEV4dGVuc2lvblR5cGUsIGV4dE5hbWU6IHN0cmluZ30+fVxuICAgKi9cbiAgZGF0YTtcblxuICAvKipcbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBleHRUeXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIHN1cGVyKFxuICAgICAgYE5hbWUgZm9yICR7ZXh0VHlwZX0gc2NoZW1hIFwiJHtleHROYW1lfVwiIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHNjaGVtYWAsXG4gICAgKTtcbiAgICB0aGlzLmRhdGEgPSB7ZXh0VHlwZSwgZXh0TmFtZX07XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHNjaGVtYSBJRCB3YXMgZXhwZWN0ZWQsIGJ1dCBpdCBkb2Vzbid0IGV4aXN0IG9uIHRoZSB7QGxpbmsgQWp2fSBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjaGVtYVVua25vd25TY2hlbWFFcnJvciBleHRlbmRzIFJlZmVyZW5jZUVycm9yIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTxzdHJpbmc+fVxuICAgKi9cbiAgY29kZSA9ICdBUFBJVU1FUlJfU0NIRU1BX1VOS05PV05fU0NIRU1BJztcblxuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHtzY2hlbWFJZDogc3RyaW5nfT59XG4gICAqL1xuICBkYXRhO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZW1hSWRcbiAgICovXG4gIGNvbnN0cnVjdG9yIChzY2hlbWFJZCkge1xuICAgIHN1cGVyKGBVbmtub3duIHNjaGVtYTogXCIke3NjaGVtYUlkfVwiYCk7XG4gICAgdGhpcy5kYXRhID0ge3NjaGVtYUlkfTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgc2NoZW1hIGlzIHByb3ZpZGVkLCBidXQgaXQncyBvZiBhbiB1bnN1cHBvcnRlZCB0eXBlLlxuICpcbiAqIFwiVmFsaWRcIiBzY2hlbWFzIHdoaWNoIGFyZSB1bnN1cHBvcnRlZCBpbmNsdWRlIGJvb2xlYW4gc2NoZW1hcyBhbmQgYXN5bmMgc2NoZW1hc1xuICogKGhhdmluZyBhIGB0cnVlYCBgJGFzeW5jYCBwcm9wZXJ0eSkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFVbnN1cHBvcnRlZFNjaGVtYUVycm9yIGV4dGVuZHMgVHlwZUVycm9yIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTxzdHJpbmc+fVxuICAgKi9cbiAgY29kZSA9ICdBUFBJVU1FUlJfU0NIRU1BX1VOU1VQUE9SVEVEX1NDSEVNQSc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTx7c2NoZW1hOiBhbnksIGV4dFR5cGU6IEV4dGVuc2lvblR5cGUsIGV4dE5hbWU6IHN0cmluZ30+fVxuICAgKi9cbiAgZGF0YTtcblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHNjaGVtYVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yIChzY2hlbWEsIGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzgyNzdcbiAgICBzdXBlcihcbiAgICAgICgoKSA9PiB7XG4gICAgICAgIGxldCBtc2cgPSBgVW5zdXBwb3J0ZWQgc2NoZW1hIGZyb20gJHtleHRUeXBlfSBcIiR7ZXh0TmFtZX1cIjpgO1xuICAgICAgICBpZiAoXy5pc0Jvb2xlYW4oc2NoZW1hKSkge1xuICAgICAgICAgIHJldHVybiBgJHttc2d9IHNjaGVtYSBjYW5ub3QgYmUgYSBib29sZWFuYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXy5pc1BsYWluT2JqZWN0KHNjaGVtYSkpIHtcbiAgICAgICAgICBpZiAoc2NoZW1hLiRhc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIGAke21zZ30gc2NoZW1hIGNhbm5vdCBiZSBhbiBhc3luYyBzY2hlbWFgO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICBgc2NoZW1hIElTIHN1cHBvcnRlZDsgdGhpcyBlcnJvciBzaG91bGQgbm90IGJlIHRocm93biAodGhpcyBpcyBhIGJ1ZykuIHZhbHVlIG9mIHNjaGVtYTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke21zZ30gc2NoZW1hIG11c3QgYmUgYSBwbGFpbiBvYmplY3Qgd2l0aG91dCBhIHRydWUgXCIkYXN5bmNcIiBwcm9wZXJ0eWA7XG4gICAgICB9KSgpLFxuICAgICk7XG4gICAgdGhpcy5kYXRhID0ge3NjaGVtYSwgZXh0VHlwZSwgZXh0TmFtZX07XG4gIH1cbn1cblxuY29uc3QgYXBwaXVtU2NoZW1hID0gQXBwaXVtU2NoZW1hLmNyZWF0ZSgpO1xuXG5leHBvcnQgY29uc3Qge1xuICByZWdpc3RlclNjaGVtYSxcbiAgZ2V0QWxsQXJnU3BlY3MsXG4gIGdldEFyZ1NwZWMsXG4gIGhhc0FyZ1NwZWMsXG4gIGlzRmluYWxpemVkLFxuICBmaW5hbGl6ZTogZmluYWxpemVTY2hlbWEsXG4gIHJlc2V0OiByZXNldFNjaGVtYSxcbiAgdmFsaWRhdGUsXG4gIGdldFNjaGVtYSxcbiAgZmxhdHRlbjogZmxhdHRlblNjaGVtYSxcbiAgZ2V0RGVmYXVsdHM6IGdldERlZmF1bHRzRm9yU2NoZW1hLFxuICBnZXREZWZhdWx0c0ZvckV4dGVuc2lvbixcbn0gPSBhcHBpdW1TY2hlbWE7XG5leHBvcnQgY29uc3Qge2lzQWxsb3dlZFNjaGVtYUZpbGVFeHRlbnNpb259ID0gQXBwaXVtU2NoZW1hO1xuXG4vKipcbiAqIEFwcGl1bSBvbmx5IHN1cHBvcnRzIHNjaGVtYXMgdGhhdCBhcmUgcGxhaW4gb2JqZWN0czsgbm90IGFycmF5cy5cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FqdicpLlNjaGVtYU9iamVjdCAmIHtba2V5OiBudW1iZXJdOiBuZXZlcn19IFNjaGVtYU9iamVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vZXh0LWNvbmZpZy1pbycpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqL1xuXG4vKipcbiAqIEFuIG9iamVjdCBoYXZpbmcgcHJvcGVydHkgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZWBcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0cmljdFByb3BcbiAqIEBwcm9wZXJ0eSB7ZmFsc2V9IGFkZGl0aW9uYWxQcm9wZXJ0aWVzXG4gKi9cblxuLyoqXG4gKiBBIHtAbGluayBTY2hlbWFPYmplY3R9IHdpdGggYGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZWBcbiAqIEB0eXBlZGVmIHtTY2hlbWFPYmplY3QgJiBTdHJpY3RQcm9wfSBTdHJpY3RTY2hlbWFPYmplY3RcbiAqL1xuXG4vKipcbiAqIEEgbGlzdCBvZiBzY2hlbWFzIGFzc29jaWF0ZWQgd2l0aCBwcm9wZXJ0aWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHtAbGluayBBcmdTcGVjfSBvYmplY3RzLlxuICpcbiAqIEludGVybWVkaWF0ZSBkYXRhIHN0cnVjdHVyZSB1c2VkIHdoZW4gY29udmVydGluZyB0aGUgZW50aXJlIHNjaGVtYSBkb3duIHRvIENMSSBhcmd1bWVudHMuXG4gKiBAdHlwZWRlZiB7IHtzY2hlbWE6IFNjaGVtYU9iamVjdCwgYXJnU3BlYzogQXJnU3BlY31bXSB9IEZsYXR0ZW5lZFNjaGVtYVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0FyZ1NwZWNbJ2RlZmF1bHRWYWx1ZSddfSBBcmdTcGVjRGVmYXVsdFZhbHVlXG4gKi9cblxuLyoqXG4gKiBlLmcuIGB7ZHJpdmVyOiB7Zm9vOiAnYmFyJ319YCB3aGVyZSBgZm9vYCBpcyB0aGUgYXJnIG5hbWUgYW5kIGBiYXJgIGlzIHRoZSBkZWZhdWx0IHZhbHVlLlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsUmVjb3JkPHN0cmluZyxBcmdTcGVjRGVmYXVsdFZhbHVlPj59IE5lc3RlZEFyZ1NwZWNEZWZhdWx0VmFsdWVcbiAqL1xuXG4vKipcbiAqIEhlbHBlciB0eXBlIGZvciB0aGUgcmV0dXJuIHZhbHVlIG9mIHtAbGluayBBcHBpdW1TY2hlbWEuZ2V0RGVmYXVsdHN9XG4gKiBAdGVtcGxhdGUge2Jvb2xlYW58dW5kZWZpbmVkfSBGbGF0dGVuZWRcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLEZsYXR0ZW5lZCBleHRlbmRzIHRydWUgPyBBcmdTcGVjRGVmYXVsdFZhbHVlIDogQXJnU3BlY0RlZmF1bHRWYWx1ZSB8IE5lc3RlZEFyZ1NwZWNEZWZhdWx0VmFsdWU+fSBEZWZhdWx0VmFsdWVzXG4gKi9cbiJdLCJmaWxlIjoibGliL3NjaGVtYS9zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
451
+ exports.isAllowedSchemaFileExtension = isAllowedSchemaFileExtension;
452
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9zY2hlbWEvc2NoZW1hLmpzIl0sIm5hbWVzIjpbIlJvYWNoSG90ZWxNYXAiLCJNYXAiLCJzZXQiLCJrZXkiLCJ2YWx1ZSIsImhhcyIsIkVycm9yIiwiZGVsZXRlIiwiY2xlYXIiLCJBTExPV0VEX1NDSEVNQV9FWFRFTlNJT05TIiwiU2V0IiwiQXBwaXVtU2NoZW1hIiwiX2FyZ1NwZWNzIiwiX3JlZ2lzdGVyZWRTY2hlbWFzIiwiRFJJVkVSX1RZUEUiLCJQTFVHSU5fVFlQRSIsIl9hanYiLCJfaW5zdGFuY2UiLCJfZmluYWxpemVkU2NoZW1hcyIsImNvbnN0cnVjdG9yIiwiX2luc3RhbnRpYXRlQWp2IiwiY3JlYXRlIiwiaW5zdGFuY2UiLCJfIiwiYmluZEFsbCIsImhhc1JlZ2lzdGVyZWRTY2hlbWEiLCJleHRUeXBlIiwiZXh0TmFtZSIsImlzRmluYWxpemVkIiwiQm9vbGVhbiIsImdldEFsbEFyZ1NwZWNzIiwiZmluYWxpemUiLCJhanYiLCJiYXNlU2NoZW1hIiwiY2xvbmVEZWVwIiwiQXBwaXVtQ29uZmlnSnNvblNjaGVtYSIsImFkZEFyZ1NwZWNzIiwic2NoZW1hIiwicHJvcE5hbWUiLCJwcm9wU2NoZW1hIiwiT2JqZWN0IiwiZW50cmllcyIsImFyZ1NwZWMiLCJBcmdTcGVjIiwiZGVzdCIsImFwcGl1bUNsaURlc3QiLCJkZWZhdWx0VmFsdWUiLCJkZWZhdWx0IiwiYXJnIiwib21pdCIsInByb3BlcnRpZXMiLCJzZXJ2ZXIiLCJmaW5hbGl6ZWRTY2hlbWFzIiwiZmluYWxTY2hlbWEiLCJyZWR1Y2UiLCJleHRlbnNpb25TY2hlbWFzIiwiZm9yRWFjaCIsIiRyZWYiLCJ0b1NjaGVtYUJhc2VSZWYiLCIkaWQiLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsIiRjb21tZW50IiwidmFsaWRhdGVTY2hlbWEiLCJhZGRTY2hlbWEiLCJBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCIsImZyZWV6ZSIsIkFqdiIsImFsbEVycm9ycyIsImtleXdvcmRzIiwia2V5d29yZCIsImFkZEtleXdvcmQiLCJyZXNldCIsInNjaGVtYUlkIiwia2V5cyIsInJlbW92ZVNjaGVtYSIsInJlZ2lzdGVyU2NoZW1hIiwiaXNVbmRlZmluZWQiLCJUeXBlRXJyb3IiLCJpc1N1cHBvcnRlZFNjaGVtYVR5cGUiLCJTY2hlbWFVbnN1cHBvcnRlZFNjaGVtYUVycm9yIiwibm9ybWFsaXplZEV4dE5hbWUiLCJrZWJhYkNhc2UiLCJnZXQiLCJTY2hlbWFOYW1lQ29uZmxpY3RFcnJvciIsImdldEFyZ1NwZWMiLCJuYW1lIiwidG9BcmciLCJoYXNBcmdTcGVjIiwiZ2V0RGVmYXVsdHMiLCJmbGF0dGVuIiwiU2NoZW1hRmluYWxpemF0aW9uRXJyb3IiLCJyZWR1Y2VyIiwiZGVmYXVsdHMiLCJyZXR2YWwiLCJ2YWx1ZXMiLCJnZXREZWZhdWx0c0ZvckV4dGVuc2lvbiIsInNwZWNzIiwiZmlsdGVyIiwic3BlYyIsInJhd0Rlc3QiLCJnZXRTY2hlbWEiLCJzdGFjayIsInByZWZpeCIsImZsYXR0ZW5lZCIsInBhaXJzIiwidG9QYWlycyIsInB1c2giLCJTRVJWRVJfUFJPUF9OQU1FIiwicmVmU2NoZW1hIiwiZXJyIiwiU2NoZW1hVW5rbm93blNjaGVtYUVycm9yIiwiZXh0ZW5zaW9uSW5mb0Zyb21Sb290U2NoZW1hSWQiLCJSZWZlcmVuY2VFcnJvciIsInJlZiIsIl9nZXRWYWxpZGF0b3IiLCJpZCIsInZhbGlkYXRvciIsInZhbGlkYXRlIiwiaXNBcnJheSIsImVycm9ycyIsImlzQWxsb3dlZFNjaGVtYUZpbGVFeHRlbnNpb24iLCJmaWxlbmFtZSIsInBhdGgiLCJleHRuYW1lIiwiaXNQbGFpbk9iamVjdCIsIiRhc3luYyIsImNvZGUiLCJkYXRhIiwibXNnIiwiaXNCb29sZWFuIiwiSlNPTiIsInN0cmluZ2lmeSIsImFwcGl1bVNjaGVtYSIsImZpbmFsaXplU2NoZW1hIiwicmVzZXRTY2hlbWEiLCJmbGF0dGVuU2NoZW1hIiwiZ2V0RGVmYXVsdHNGb3JTY2hlbWEiXSwibWFwcGluZ3MiOiI7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NUQsTUFBTXlHLFlBQVksR0FBR3pILFlBQVksQ0FBQ1UsTUFBYixFQUFyQjtBQUVPLE1BQU07QUFDWHNELEVBQUFBLGNBRFc7QUFFWDdDLEVBQUFBLGNBRlc7QUFHWHNELEVBQUFBLFVBSFc7QUFJWEcsRUFBQUEsVUFKVztBQUtYM0QsRUFBQUEsV0FMVztBQU1YRyxFQUFBQSxRQUFRLEVBQUVzRyxjQU5DO0FBT1g5RCxFQUFBQSxLQUFLLEVBQUUrRCxXQVBJO0FBUVhqQixFQUFBQSxRQVJXO0FBU1hqQixFQUFBQSxTQVRXO0FBVVhYLEVBQUFBLE9BQU8sRUFBRThDLGFBVkU7QUFXWC9DLEVBQUFBLFdBQVcsRUFBRWdELG9CQVhGO0FBWVh6QyxFQUFBQTtBQVpXLElBYVRxQyxZQWJHOzs7Ozs7Ozs7Ozs7O0FBY0EsTUFBTTtBQUFDWixFQUFBQTtBQUFELElBQWlDN0csWUFBdkMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBBanYgZnJvbSAnYWp2JztcbmltcG9ydCBhZGRGb3JtYXRzIGZyb20gJ2Fqdi1mb3JtYXRzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IERSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBcHBpdW1Db25maWdKc29uU2NoZW1hIH0gZnJvbSAnQGFwcGl1bS9zY2hlbWEnO1xuaW1wb3J0IHsgQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQsIEFyZ1NwZWMsIFNFUlZFUl9QUk9QX05BTUUgfSBmcm9tICcuL2FyZy1zcGVjJztcbmltcG9ydCB7IGtleXdvcmRzIH0gZnJvbSAnLi9rZXl3b3Jkcyc7XG5cbi8qKlxuICogS2V5L3ZhbHVlIHBhaXJzIGdvIGluLi4uIGJ1dCB0aGV5IGRvbid0IGNvbWUgb3V0LlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBleHRlbmRzIHtNYXA8SyxWPn1cbiAqL1xuZXhwb3J0IGNsYXNzIFJvYWNoSG90ZWxNYXAgZXh0ZW5kcyBNYXAge1xuICAvKipcbiAgICogQHBhcmFtIHtLfSBrZXlcbiAgICogQHBhcmFtIHtWfSB2YWx1ZVxuICAgKi9cbiAgc2V0IChrZXksIHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuaGFzKGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtrZXl9IGlzIGFscmVhZHkgc2V0YCk7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5zZXQoa2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtLfSBrZXlcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBkZWxldGUgKGtleSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNsZWFyICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjbGVhciBSb2FjaEhvdGVsTWFwYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRlbnNpb25zIHRoYXQgYW4gZXh0ZW5zaW9uIHNjaGVtYSBmaWxlIGNhbiBoYXZlLlxuICovXG5leHBvcnQgY29uc3QgQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyA9IG5ldyBTZXQoWycuanNvbicsICcuanMnLCAnLmNqcyddKTtcblxuLyoqXG4gKiBBIHdyYXBwZXIgYXJvdW5kIEFqdiBhbmQgc2NoZW1hLXJlbGF0ZWQgZnVuY3Rpb25zLlxuICpcbiAqIFNob3VsZCBoYXZlIGJlZW4gbmFtZWQgSGlnaGxhbmRlciwgYmVjYXVzZSBfdGhlcmUgY2FuIG9ubHkgYmUgb25lX1xuICovXG5jbGFzcyBBcHBpdW1TY2hlbWEge1xuICAvKipcbiAgICogQSBtYXBwaW5nIG9mIHVuaXF1ZSBhcmd1bWVudCBJRHMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyB7QGxpbmsgQXJnU3BlY31zLlxuICAgKlxuICAgKiBBbiBcImFyZ3VtZW50XCIgaXMgYSBDTEkgYXJndW1lbnQgb3IgYSBjb25maWcgcHJvcGVydHkuXG4gICAqXG4gICAqIFVzZWQgdG8gcHJvdmlkZSBlYXN5IGxvb2t1cHMgb2YgYXJndW1lbnQgbWV0YWRhdGEgd2hlbiBjb252ZXJ0aW5nIGJldHdlZW4gZGlmZmVyZW50IHJlcHJlc2VudGF0aW9ucyBvZiB0aG9zZSBhcmd1bWVudHMuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSb2FjaEhvdGVsTWFwPHN0cmluZyxBcmdTcGVjPn1cbiAgICovXG4gIF9hcmdTcGVjcyA9IG5ldyBSb2FjaEhvdGVsTWFwKCk7XG5cbiAgLyoqXG4gICAqIEEgbWFwIG9mIGV4dGVuc2lvbiB0eXBlcyB0byBleHRlbnNpb24gbmFtZXMgdG8gc2NoZW1hIG9iamVjdHMuXG4gICAqXG4gICAqIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBlbnN1cmUgdGhlcmUgYXJlIG5vIG5hbWluZyBjb25mbGljdHMuIFRoZSBzY2hlbWFzXG4gICAqIGFyZSBzdG9yZWQgaGVyZSBpbiBtZW1vcnkgdW50aWwgdGhlIGluc3RhbmNlIGlzIF9maW5hbGl6ZWRfLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7UmVjb3JkPEV4dGVuc2lvblR5cGUsTWFwPHN0cmluZyxTY2hlbWFPYmplY3Q+Pn1cbiAgICovXG4gIF9yZWdpc3RlcmVkU2NoZW1hcyA9IHtbRFJJVkVSX1RZUEVdOiBuZXcgTWFwKCksIFtQTFVHSU5fVFlQRV06IG5ldyBNYXAoKX07XG5cbiAgLyoqXG4gICAqIEFqdiBpbnN0YW5jZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7QWp2fVxuICAgKi9cbiAgX2FqdjtcblxuICAvKipcbiAgICogU2luZ2xldG9uIGluc3RhbmNlLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7QXBwaXVtU2NoZW1hfVxuICAgKi9cbiAgc3RhdGljIF9pbnN0YW5jZTtcblxuICAvKipcbiAgICogTG9va3VwIG9mIHNjaGVtYSBJRHMgdG8gZmluYWxpemVkIHNjaGVtYXMuXG4gICAqXG4gICAqIFRoaXMgZG9lcyBub3QgaW5jbHVkZSByZWZlcmVuY2VzLCBidXQgcmF0aGVyIHRoZSByb290IHNjaGVtYXMgdGhlbXNlbHZlcy5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsU3RyaWN0U2NoZW1hT2JqZWN0Pj99XG4gICAqL1xuICBfZmluYWxpemVkU2NoZW1hcyA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIEFqdiwgYWRkcyBzdGFuZGFyZCBmb3JtYXRzIGFuZCBvdXIgY3VzdG9tIGtleXdvcmRzLlxuICAgKiBAc2VlIGh0dHBzOi8vbnBtLmltL2Fqdi1mb3JtYXRzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5fYWp2ID0gQXBwaXVtU2NoZW1hLl9pbnN0YW50aWF0ZUFqdigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHtAbGluayBBcHBpdW1TY2hlbWF9IGluc3RhbmNlcy5cbiAgICpcbiAgICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBpZiBvbmUgZXhpc3RzLCBvdGhlcndpc2UgY3JlYXRlcyBhIG5ldyBvbmUuXG4gICAqIEJpbmRzIHB1YmxpYyBtZXRob2RzIHRvIHRoZSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge0FwcGl1bVNjaGVtYX1cbiAgICovXG4gIHN0YXRpYyBjcmVhdGUgKCkge1xuICAgIGlmICghQXBwaXVtU2NoZW1hLl9pbnN0YW5jZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQXBwaXVtU2NoZW1hKCk7XG4gICAgICBBcHBpdW1TY2hlbWEuX2luc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICBfLmJpbmRBbGwoaW5zdGFuY2UsIFtcbiAgICAgICAgJ2ZpbmFsaXplJyxcbiAgICAgICAgJ2ZsYXR0ZW4nLFxuICAgICAgICAnZ2V0QWxsQXJnU3BlY3MnLFxuICAgICAgICAnZ2V0QXJnU3BlYycsXG4gICAgICAgICdnZXREZWZhdWx0cycsXG4gICAgICAgICdnZXREZWZhdWx0c0ZvckV4dGVuc2lvbicsXG4gICAgICAgICdnZXRTY2hlbWEnLFxuICAgICAgICAnaGFzQXJnU3BlYycsXG4gICAgICAgICdpc0ZpbmFsaXplZCcsXG4gICAgICAgICdyZWdpc3RlclNjaGVtYScsXG4gICAgICAgICdoYXNSZWdpc3RlcmVkU2NoZW1hJyxcbiAgICAgICAgJ3Jlc2V0JyxcbiAgICAgICAgJ3ZhbGlkYXRlJyxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIHJldHVybiBBcHBpdW1TY2hlbWEuX2luc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIGEgc2NoZW1hIGhhcyBiZWVuIHJlZ2lzdGVyZWQgdXNpbmcgZ2l2ZW4gZXh0ZW5zaW9uIHR5cGUgYW5kIG5hbWUuXG4gICAqXG4gICAqIFRoaXMgZG9lcyBub3QgZGVwZW5kIG9uIHdoZXRoZXIgb3Igbm90IHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBfZmluYWxpemVkXy5cbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBleHRUeXBlIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBOYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBJZiByZWdpc3RlcmVkXG4gICAqL1xuICBoYXNSZWdpc3RlcmVkU2NoZW1hIChleHRUeXBlLCBleHROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyZWRTY2hlbWFzW2V4dFR5cGVdLmhhcyhleHROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYHRydWVgIGlmIHtAbGluayBBcHBpdW1TY2hlbWEuZmluYWxpemUgZmluYWxpemV9IGhhcyBiZWVuIGNhbGxlZFxuICAgKiBzdWNjZXNzZnVsbHkgYW5kIHtAbGluayBBcHBpdW1TY2hlbWEucmVzZXQgcmVzZXR9IGhhcyBub3QgYmVlbiBjYWxsZWQgc2luY2UuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBJZiBmaW5hbGl6ZWRcbiAgICovXG4gIGlzRmluYWxpemVkICgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9maW5hbGl6ZWRTY2hlbWFzKTtcbiAgfVxuXG4gIGdldEFsbEFyZ1NwZWNzICgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXJnU3BlY3M7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCB0aGlzIHdoZW4gbm8gbW9yZSBzY2hlbWFzIHdpbGwgYmUgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogVGhpcyBkb2VzIHRocmVlIHRoaW5nczpcbiAgICogMS4gSXQgY29tYmluZXMgYWxsIHNjaGVtYXMgZnJvbSBleHRlbnNpb25zIGludG8gdGhlIEFwcGl1bSBjb25maWcgc2NoZW1hLFxuICAgKiAgICB0aGVuIGFkZHMgdGhlIHJlc3VsdCB0byB0aGUgYEFqdmAgaW5zdGFuY2UuXG4gICAqIDIuIEl0IGFkZHMgc2NoZW1hcyBmb3IgX2VhY2hfIGFyZ3VtZW50L3Byb3BlcnR5IGZvciB2YWxpZGF0aW9uIHB1cnBvc2VzLlxuICAgKiAgICBUaGUgQ0xJIHVzZXMgdGhlc2Ugc2NoZW1hcyB0byB2YWxpZGF0ZSBzcGVjaWZpYyBhcmd1bWVudHMuXG4gICAqIDMuIFRoZSBzY2hlbWFzIGFyZSB2YWxpZGF0ZWQgYWdhaW5zdCBKU09OIHNjaGVtYSBkcmFmdC0wNyAod2hpY2ggaXMgdGhlXG4gICAqICAgIG9ubHkgb25lIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUpXG4gICAqXG4gICAqIEFueSBtZXRob2QgaW4gdGhpcyBpbnN0YW5jZSB0aGF0IG5lZWRzIHRvIGludGVyYWN0IHdpdGggdGhlIGBBanZgIGluc3RhbmNlXG4gICAqIHdpbGwgdGhyb3cgaWYgdGhpcyBtZXRob2QgaGFzIG5vdCBiZWVuIGNhbGxlZC5cbiAgICpcbiAgICogSWYgdGhlIGluc3RhbmNlIGhhcyBhbHJlYWR5IGJlZW4gZmluYWxpemVkLCB0aGlzIGlzIGEgbm8tb3AuXG4gICAqIEBwdWJsaWNcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBzY2hlbWEgaXMgbm90IHZhbGlkXG4gICAqIEByZXR1cm5zIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLFN0cmljdFNjaGVtYU9iamVjdD4+fSBSZWNvcmQgb2Ygc2NoZW1hIElEcyB0byBmdWxsIHNjaGVtYSBvYmplY3RzXG4gICAqL1xuICBmaW5hbGl6ZSAoKSB7XG4gICAgaWYgKHRoaXMuaXNGaW5hbGl6ZWQoKSkge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIHRoaXMuX2ZpbmFsaXplZFNjaGVtYXM+fSAqLyAoXG4gICAgICAgIHRoaXMuX2ZpbmFsaXplZFNjaGVtYXNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYWp2ID0gdGhpcy5fYWp2O1xuXG4gICAgLy8gQWp2IHdpbGwgX211dGF0ZV8gdGhlIHNjaGVtYSwgc28gd2UgbmVlZCB0byBjbG9uZSBpdC5cbiAgICBjb25zdCBiYXNlU2NoZW1hID0gXy5jbG9uZURlZXAoQXBwaXVtQ29uZmlnSnNvblNjaGVtYSk7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U2NoZW1hT2JqZWN0fSBzY2hlbWFcbiAgICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IFtleHRUeXBlXVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZXh0TmFtZV1cbiAgICAgKi9cbiAgICBjb25zdCBhZGRBcmdTcGVjcyA9IChzY2hlbWEsIGV4dFR5cGUsIGV4dE5hbWUpID0+IHtcbiAgICAgIGZvciAobGV0IFtwcm9wTmFtZSwgcHJvcFNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgICAgICBjb25zdCBhcmdTcGVjID0gQXJnU3BlYy5jcmVhdGUocHJvcE5hbWUsIHtcbiAgICAgICAgICBkZXN0OiBwcm9wU2NoZW1hLmFwcGl1bUNsaURlc3QsXG4gICAgICAgICAgZGVmYXVsdFZhbHVlOiBwcm9wU2NoZW1hLmRlZmF1bHQsXG4gICAgICAgICAgZXh0VHlwZSxcbiAgICAgICAgICBleHROYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qge2FyZ30gPSBhcmdTcGVjO1xuICAgICAgICB0aGlzLl9hcmdTcGVjcy5zZXQoYXJnLCBhcmdTcGVjKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgYWRkQXJnU3BlY3MoXG4gICAgICBfLm9taXQoYmFzZVNjaGVtYS5wcm9wZXJ0aWVzLnNlcnZlci5wcm9wZXJ0aWVzLCBbXG4gICAgICAgIERSSVZFUl9UWVBFLFxuICAgICAgICBQTFVHSU5fVFlQRSxcbiAgICAgIF0pLFxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxTdHJpY3RTY2hlbWFPYmplY3Q+fVxuICAgICAqL1xuICAgIGNvbnN0IGZpbmFsaXplZFNjaGVtYXMgPSB7fTtcblxuICAgIGNvbnN0IGZpbmFsU2NoZW1hID0gXy5yZWR1Y2UoXG4gICAgICB0aGlzLl9yZWdpc3RlcmVkU2NoZW1hcyxcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHt0eXBlb2YgYmFzZVNjaGVtYX0gYmFzZVNjaGVtYVxuICAgICAgICogQHBhcmFtIHtNYXA8c3RyaW5nLFNjaGVtYU9iamVjdD59IGV4dGVuc2lvblNjaGVtYXNcbiAgICAgICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZVxuICAgICAgICovXG4gICAgICAoYmFzZVNjaGVtYSwgZXh0ZW5zaW9uU2NoZW1hcywgZXh0VHlwZSkgPT4ge1xuICAgICAgICBleHRlbnNpb25TY2hlbWFzLmZvckVhY2goKHNjaGVtYSwgZXh0TmFtZSkgPT4ge1xuICAgICAgICAgIGNvbnN0ICRyZWYgPSBBcmdTcGVjLnRvU2NoZW1hQmFzZVJlZihleHRUeXBlLCBleHROYW1lKTtcbiAgICAgICAgICBzY2hlbWEuJGlkID0gJHJlZjtcbiAgICAgICAgICBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPSBmYWxzZTsgLy8gdGhpcyBtYWtlcyBgc2NoZW1hYCBiZWNvbWUgYSBgU3RyaWN0U2NoZW1hT2JqZWN0YFxuICAgICAgICAgIGJhc2VTY2hlbWEucHJvcGVydGllcy5zZXJ2ZXIucHJvcGVydGllc1tleHRUeXBlXS5wcm9wZXJ0aWVzW2V4dE5hbWVdID1cbiAgICAgICAgICAgIHskcmVmLCAkY29tbWVudDogZXh0TmFtZX07XG4gICAgICAgICAgYWp2LnZhbGlkYXRlU2NoZW1hKHNjaGVtYSwgdHJ1ZSk7XG4gICAgICAgICAgYWRkQXJnU3BlY3Moc2NoZW1hLnByb3BlcnRpZXMsIGV4dFR5cGUsIGV4dE5hbWUpO1xuICAgICAgICAgIGFqdi5hZGRTY2hlbWEoc2NoZW1hLCAkcmVmKTtcbiAgICAgICAgICBmaW5hbGl6ZWRTY2hlbWFzWyRyZWZdID0gLyoqIEB0eXBlIHtTdHJpY3RTY2hlbWFPYmplY3R9ICovIChzY2hlbWEpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGJhc2VTY2hlbWE7XG4gICAgICB9LFxuICAgICAgYmFzZVNjaGVtYSxcbiAgICApO1xuXG4gICAgYWp2LmFkZFNjaGVtYShmaW5hbFNjaGVtYSwgQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQpO1xuICAgIGZpbmFsaXplZFNjaGVtYXNbQVBQSVVNX0NPTkZJR19TQ0hFTUFfSURdID0gZmluYWxTY2hlbWE7XG4gICAgYWp2LnZhbGlkYXRlU2NoZW1hKGZpbmFsU2NoZW1hLCB0cnVlKTtcblxuICAgIHRoaXMuX2ZpbmFsaXplZFNjaGVtYXMgPSBmaW5hbGl6ZWRTY2hlbWFzO1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKGZpbmFsaXplZFNjaGVtYXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgYW5kIGNyZWF0ZXMgYW4gQWp2IGluc3RhbmNlLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJucyB7QWp2fVxuICAgKi9cbiAgc3RhdGljIF9pbnN0YW50aWF0ZUFqdiAoKSB7XG4gICAgY29uc3QgYWp2ID0gYWRkRm9ybWF0cyhcbiAgICAgIG5ldyBBanYoe1xuICAgICAgICAvLyB3aXRob3V0IHRoaXMgbm90IG11Y2ggdmFsaWRhdGlvbiBhY3R1YWxseSBoYXBwZW5zXG4gICAgICAgIGFsbEVycm9yczogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBhZGQgY3VzdG9tIGtleXdvcmRzIHRvIGFqdi4gc2VlIHNjaGVtYS1rZXl3b3Jkcy5qc1xuICAgIF8uZm9yRWFjaChrZXl3b3JkcywgKGtleXdvcmQpID0+IHtcbiAgICAgIGFqdi5hZGRLZXl3b3JkKGtleXdvcmQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFqdjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhpcyBpbnN0YW5jZSB0byBpdHMgb3JpZ2luYWwgc3RhdGUuXG4gICAqXG4gICAqIC0gUmVtb3ZlcyBhbGwgYWRkZWQgc2NoZW1hcyBmcm9tIHRoZSBgQWp2YCBpbnN0YW5jZVxuICAgKiAtIFJlc2V0cyB0aGUgbWFwIG9mIHtAbGluayBBcmdTcGVjIEFyZ1NwZWNzfVxuICAgKiAtIFJlc2V0cyB0aGUgbWFwIG9mIHJlZ2lzdGVyZWQgc2NoZW1hc1xuICAgKiAtIFNldHMgdGhlIHtAbGluayBBcHBpdW1TY2hlbWEuX2ZpbmFsaXplZCBfZmluYWxpemVkfSBmbGFnIHRvIGBmYWxzZWBcbiAgICpcbiAgICogSWYgeW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgQXBwaXVtU2NoZW1hLmZpbmFsaXplfSBhZ2FpbiwgeW91J2xsIHdhbnQgdG8gY2FsbCB0aGlzIGZpcnN0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJlc2V0ICgpIHtcbiAgICBmb3IgKGNvbnN0IHNjaGVtYUlkIG9mIE9iamVjdC5rZXlzKHRoaXMuX2ZpbmFsaXplZFNjaGVtYXMgPz8ge30pKSB7XG4gICAgICB0aGlzLl9hanYucmVtb3ZlU2NoZW1hKHNjaGVtYUlkKTtcbiAgICB9XG4gICAgdGhpcy5fYXJnU3BlY3MgPSBuZXcgUm9hY2hIb3RlbE1hcCgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyZWRTY2hlbWFzID0ge1xuICAgICAgW0RSSVZFUl9UWVBFXTogbmV3IE1hcCgpLFxuICAgICAgW1BMVUdJTl9UWVBFXTogbmV3IE1hcCgpLFxuICAgIH07XG4gICAgdGhpcy5fZmluYWxpemVkU2NoZW1hcyA9IG51bGw7XG5cbiAgICAvLyBBanYgc2VlbXMgdG8gaGF2ZSBhbiBvdmVyLWVhZ2VyIGNhY2hlLCBzbyB3ZSBoYXZlIHRvIGR1bXAgdGhlIG9iamVjdCBlbnRpcmVseS5cbiAgICB0aGlzLl9hanYgPSBBcHBpdW1TY2hlbWEuX2luc3RhbnRpYXRlQWp2KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgc2NoZW1hIGZyb20gYW4gZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIFwiZmFpbC1mYXN0XCIgaW4gdGhhdCB0aGUgc2NoZW1hIHdpbGwgaW1tZWRpYXRlbHkgYmUgdmFsaWRhdGVkIGFnYWluc3QgSlNPTiBzY2hlbWEgZHJhZnQtMDcgX29yXyB3aGF0ZXZlciB0aGUgdmFsdWUgb2YgdGhlIHNjaGVtYSdzIGAkc2NoZW1hYCBwcm9wIGlzLlxuICAgKlxuICAgKiBEb2VzIF9ub3RfIGFkZCB0aGUgc2NoZW1hIHRvIHRoZSBgYWp2YCBpbnN0YW5jZSAodGhpcyBpcyBkb25lIGJ5IHtAbGluayBBcHBpdW1TY2hlbWEuZmluYWxpemV9KS5cbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBleHRUeXBlIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBVbmlxdWUgZXh0ZW5zaW9uIG5hbWUgZm9yIGB0eXBlYFxuICAgKiBAcGFyYW0ge1NjaGVtYU9iamVjdH0gc2NoZW1hIC0gU2NoZW1hIG9iamVjdFxuICAgKiBAdGhyb3dzIHtTY2hlbWFOYW1lQ29uZmxpY3RFcnJvcn0gSWYgdGhlIHNjaGVtYSBpcyBhbiBpbnZhbGlkXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcmVnaXN0ZXJTY2hlbWEgKGV4dFR5cGUsIGV4dE5hbWUsIHNjaGVtYSkge1xuICAgIGlmICghKGV4dFR5cGUgJiYgZXh0TmFtZSkgfHwgXy5pc1VuZGVmaW5lZChzY2hlbWEpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnRXhwZWN0ZWQgZXh0ZW5zaW9uIHR5cGUsIGV4dGVuc2lvbiBuYW1lLCBhbmQgYSBkZWZpbmVkIHNjaGVtYScsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIUFwcGl1bVNjaGVtYS5pc1N1cHBvcnRlZFNjaGVtYVR5cGUoc2NoZW1hKSkge1xuICAgICAgdGhyb3cgbmV3IFNjaGVtYVVuc3VwcG9ydGVkU2NoZW1hRXJyb3Ioc2NoZW1hLCBleHRUeXBlLCBleHROYW1lKTtcbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsaXplZEV4dE5hbWUgPSBfLmtlYmFiQ2FzZShleHROYW1lKTtcbiAgICBpZiAodGhpcy5oYXNSZWdpc3RlcmVkU2NoZW1hKGV4dFR5cGUsIG5vcm1hbGl6ZWRFeHROYW1lKSkge1xuICAgICAgaWYgKHRoaXMuX3JlZ2lzdGVyZWRTY2hlbWFzW2V4dFR5cGVdLmdldChub3JtYWxpemVkRXh0TmFtZSkgPT09IHNjaGVtYSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hTmFtZUNvbmZsaWN0RXJyb3IoZXh0VHlwZSwgZXh0TmFtZSk7XG4gICAgfVxuICAgIHRoaXMuX2Fqdi52YWxpZGF0ZVNjaGVtYShzY2hlbWEsIHRydWUpO1xuXG4gICAgdGhpcy5fcmVnaXN0ZXJlZFNjaGVtYXNbZXh0VHlwZV0uc2V0KG5vcm1hbGl6ZWRFeHROYW1lLCBzY2hlbWEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB7QGxpbmsgQXJnU3BlY30gZm9yIHRoZSBnaXZlbiBhcmd1bWVudCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIENMSSBhcmd1bWVudCBuYW1lXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gW2V4dFR5cGVdIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHROYW1lXSAtIEV4dGVuc2lvbiBuYW1lXG4gICAqIEByZXR1cm5zIHtBcmdTcGVjfHVuZGVmaW5lZH0gQXJnU3BlYyBvciBgdW5kZWZpbmVkYCBpZiBub3QgZm91bmRcbiAgICovXG4gIGdldEFyZ1NwZWMgKG5hbWUsIGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYXJnU3BlY3MuZ2V0KEFyZ1NwZWMudG9BcmcobmFtZSwgZXh0VHlwZSwgZXh0TmFtZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBpbnN0YW5jZSBrbm93cyBhYm91dCBhbiBhcmd1bWVudCBieSB0aGUgZ2l2ZW4gYG5hbWVgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIENMSSBhcmd1bWVudCBuYW1lXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gW2V4dFR5cGVdIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHROYW1lXSAtIEV4dGVuc2lvbiBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgc3VjaCBhbiB7QGxpbmsgQXJnU3BlY30gZXhpc3RzXG4gICAqL1xuICBoYXNBcmdTcGVjIChuYW1lLCBleHRUeXBlLCBleHROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FyZ1NwZWNzLmhhcyhBcmdTcGVjLnRvQXJnKG5hbWUsIGV4dFR5cGUsIGV4dE5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgYFJlY29yZGAgb2YgYXJndW1lbnQgXCJkZXN0XCIgc3RyaW5ncyB0byBkZWZhdWx0IHZhbHVlcy5cbiAgICpcbiAgICogVGhlIFwiZGVzdFwiIHN0cmluZyBpcyB0aGUgcHJvcGVydHkgbmFtZSBpbiBvYmplY3QgcmV0dXJuZWQgYnlcbiAgICogYGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyWydwYXJzZV9hcmdzJ11gLlxuICAgKiBAdGVtcGxhdGUge2Jvb2xlYW58dW5kZWZpbmVkfSBGbGF0dGVuZWRcbiAgICogQHBhcmFtIHtGbGF0dGVuZWR9IFtmbGF0dGVuPXRydWVdIC0gSWYgYHRydWVgLCBmbGF0dGVucyB0aGUgcmV0dXJuZWQgb2JqZWN0XG4gICAqIHVzaW5nIFwia2V5cGF0aFwiLXN0eWxlIGtleXMgb2YgdGhlIGZvcm1hdCBgPGV4dFR5cGU+LjxleHROYW1lPi48YXJnTmFtZT5gLlxuICAgKiBPdGhlcndpc2UsIHJldHVybnMgYSBuZXN0ZWQgb2JqZWN0IHVzaW5nIGBleHRUeXBlYCBhbmQgYGV4dE5hbWVgIGFzXG4gICAqIHByb3BlcnRpZXMuIEJhc2UgYXJndW1lbnRzIChzZXJ2ZXIgYXJndW1lbnRzKSBhcmUgYWx3YXlzIGF0IHRoZSB0b3AgbGV2ZWwuXG4gICAqIEByZXR1cm5zIHtEZWZhdWx0VmFsdWVzPEZsYXR0ZW5lZD59XG4gICAqL1xuICBnZXREZWZhdWx0cyAoZmxhdHRlbiA9IC8qKiBAdHlwZSB7RmxhdHRlbmVkfSAqLyAodHJ1ZSkpIHtcbiAgICBpZiAoIXRoaXMuaXNGaW5hbGl6ZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IFNjaGVtYUZpbmFsaXphdGlvbkVycm9yKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY2FsbGJhY2sgRGVmYXVsdFJlZHVjZXJcbiAgICAgKiBAcGFyYW0ge0RlZmF1bHRWYWx1ZXM8RmxhdHRlbmVkPn0gZGVmYXVsdHNcbiAgICAgKiBAcGFyYW0ge0FyZ1NwZWN9IGFyZ1NwZWNcbiAgICAgKiBAcmV0dXJucyB7RGVmYXVsdFZhbHVlczxGbGF0dGVuZWQ+fVxuICAgICAqL1xuICAgIC8qKiBAdHlwZSB7RGVmYXVsdFJlZHVjZXJ9ICovXG4gICAgY29uc3QgcmVkdWNlciA9IGZsYXR0ZW5cbiAgICAgID8gKGRlZmF1bHRzLCB7ZGVmYXVsdFZhbHVlLCBkZXN0fSkgPT4ge1xuICAgICAgICBpZiAoIV8uaXNVbmRlZmluZWQoZGVmYXVsdFZhbHVlKSkge1xuICAgICAgICAgIGRlZmF1bHRzW2Rlc3RdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICAgIH1cbiAgICAgIDogKGRlZmF1bHRzLCB7ZGVmYXVsdFZhbHVlLCBkZXN0fSkgPT4ge1xuICAgICAgICBpZiAoIV8uaXNVbmRlZmluZWQoZGVmYXVsdFZhbHVlKSkge1xuICAgICAgICAgIF8uc2V0KGRlZmF1bHRzLCBkZXN0LCBkZWZhdWx0VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICAgIH07XG5cbiAgICAvKiogQHR5cGUge0RlZmF1bHRWYWx1ZXM8RmxhdHRlbmVkPn0gKi9cbiAgICBjb25zdCByZXR2YWwgPSB7fTtcbiAgICByZXR1cm4gWy4uLnRoaXMuX2FyZ1NwZWNzLnZhbHVlcygpXS5yZWR1Y2UocmVkdWNlciwgcmV0dmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZmxhdHRlbmVkIFJlY29yZCBvZiBkZWZhdWx0cyBmb3IgYSBzcGVjaWZpYyBleHRlbnNpb24uIEtleXMgd2lsbFxuICAgKiBiZSBvZiBmb3JtYXQgYDxhcmdOYW1lPmAuXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZSAtIEV4dGVuc2lvbiB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lIC0gRXh0ZW5zaW9uIG5hbWVcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsQXJnU3BlY0RlZmF1bHRWYWx1ZT59XG4gICAqL1xuICBnZXREZWZhdWx0c0ZvckV4dGVuc2lvbiAoZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIGlmICghdGhpcy5pc0ZpbmFsaXplZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hRmluYWxpemF0aW9uRXJyb3IoKTtcbiAgICB9XG4gICAgY29uc3Qgc3BlY3MgPSBbLi4udGhpcy5fYXJnU3BlY3MudmFsdWVzKCldLmZpbHRlcihcbiAgICAgIChzcGVjKSA9PiBzcGVjLmV4dFR5cGUgPT09IGV4dFR5cGUgJiYgc3BlYy5leHROYW1lID09PSBleHROYW1lLFxuICAgICk7XG4gICAgcmV0dXJuIHNwZWNzLnJlZHVjZSgoZGVmYXVsdHMsIHtkZWZhdWx0VmFsdWUsIHJhd0Rlc3R9KSA9PiB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQoZGVmYXVsdFZhbHVlKSkge1xuICAgICAgICBkZWZhdWx0c1tyYXdEZXN0XSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9LCB7fSk7XG4gIH1cblxuICAvKipcbiAgICogRmxhdHRlbiBzY2hlbWEgaW50byBhbiBhcnJheSBvZiBgU2NoZW1hT2JqZWN0YHMgYW5kIGFzc29jaWF0ZWRcbiAgICoge0BsaW5rIEFyZ1NwZWMgQXJnU3BlY3N9LlxuICAgKlxuICAgKiBDb252ZXJ0cyBuZXN0ZWQgZXh0ZW5zaW9uIHNjaGVtYXMgdG8ga2V5cyBiYXNlZCBvbiB0aGUgZXh0ZW5zaW9uIHR5cGUgYW5kXG4gICAqIG5hbWUuIFVzZWQgd2hlbiB0cmFuc2xhdGluZyB0byBgYXJncGFyc2VgIG9wdGlvbnMgb3IgZ2V0dGluZyB0aGUgbGlzdCBvZlxuICAgKiBkZWZhdWx0IHZhbHVlcyAoc2VlIHtAbGluayBBcHBpdW1TY2hlbWEuZ2V0RGVmYXVsdHN9KSBmb3IgQ0xJIG9yIG90aGVyd2lzZS5cbiAgICpcbiAgICogVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBpbnRlcm1lZGlhdGUgcmVwcnNlbnRhdGlvbiB1c2VkIGJ5IGBjbGktYXJnc2BcbiAgICogbW9kdWxlJ3MgYHRvUGFyc2VyQXJnc2AsIHdoaWNoIGNvbnZlcnRzIHRoZSBmaW5hbGl6ZWQgc2NoZW1hIHRvIHBhcmFtZXRlcnNcbiAgICogdXNlZCBieSBgYXJncGFyc2VgLlxuICAgKiBAdGhyb3dzIElmIHtAbGluayBBcHBpdW1TY2hlbWEuZmluYWxpemV9IGhhcyBub3QgYmVlbiBjYWxsZWQgeWV0LlxuICAgKiBAcmV0dXJucyB7RmxhdHRlbmVkU2NoZW1hfVxuICAgKi9cbiAgZmxhdHRlbiAoKSB7XG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5nZXRTY2hlbWEoKTtcblxuICAgIC8qKiBAdHlwZSB7IHtwcm9wZXJ0aWVzOiBTY2hlbWFPYmplY3QsIHByZWZpeDogc3RyaW5nW119W10gfSAqL1xuICAgIGNvbnN0IHN0YWNrID0gW3twcm9wZXJ0aWVzOiBzY2hlbWEucHJvcGVydGllcywgcHJlZml4OiBbXX1dO1xuICAgIC8qKiBAdHlwZSB7RmxhdHRlbmVkU2NoZW1hfSAqL1xuICAgIGNvbnN0IGZsYXR0ZW5lZCA9IFtdO1xuXG4gICAgLy8gdGhpcyBiaXQgaXMgYSByZWN1cnNpdmUgYWxnb3JpdGhtIHJld3JpdHRlbiBhcyBhIGZvciBsb29wLlxuICAgIC8vIHdoZW4gd2UgZmluZCBzb21ldGhpbmcgd2Ugd2FudCB0byB0cmF2ZXJzZSwgd2UgYWRkIGl0IHRvIGBzdGFja2BcbiAgICBmb3IgKGNvbnN0IHtwcm9wZXJ0aWVzLCBwcmVmaXh9IG9mIHN0YWNrKSB7XG4gICAgICBjb25zdCBwYWlycyA9IF8udG9QYWlycyhwcm9wZXJ0aWVzKTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHBhaXJzKSB7XG4gICAgICAgIGNvbnN0IHtwcm9wZXJ0aWVzLCAkcmVmfSA9IHZhbHVlO1xuICAgICAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgcHJvcGVydGllcyxcbiAgICAgICAgICAgIHByZWZpeDoga2V5ID09PSBTRVJWRVJfUFJPUF9OQU1FID8gW10gOiBbLi4ucHJlZml4LCBrZXldLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCRyZWYpIHtcbiAgICAgICAgICBsZXQgcmVmU2NoZW1hO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZWZTY2hlbWEgPSB0aGlzLmdldFNjaGVtYSgkcmVmKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgY2FuIGhhcHBlbiBpZiBhbiBleHRlbnNpb24gc2NoZW1hIHN1cHBsaWVzIGEgJHJlZiB0byBhIG5vbi1leGlzdGVudCBzY2hlbWFcbiAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IoJHJlZik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHtub3JtYWxpemVkRXh0TmFtZX0gPVxuICAgICAgICAgICAgQXJnU3BlYy5leHRlbnNpb25JbmZvRnJvbVJvb3RTY2hlbWFJZCgkcmVmKTtcbiAgICAgICAgICBpZiAoIW5vcm1hbGl6ZWRFeHROYW1lKSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICAgICAgICBgQ291bGQgbm90IGRldGVybWluZSBleHRlbnNpb24gbmFtZSBmcm9tIHNjaGVtYSBJRCAkeyRyZWZ9LiBUaGlzIGlzIGEgYnVnLmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHJlZlNjaGVtYS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgcHJlZml4OiBbLi4ucHJlZml4LCBrZXksIG5vcm1hbGl6ZWRFeHROYW1lXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgIT09IERSSVZFUl9UWVBFICYmIGtleSAhPT0gUExVR0lOX1RZUEUpIHtcbiAgICAgICAgICBjb25zdCBbZXh0VHlwZSwgZXh0TmFtZV0gPSBwcmVmaXg7XG4gICAgICAgICAgY29uc3QgYXJnU3BlYyA9IHRoaXMuZ2V0QXJnU3BlYyhcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7RXh0ZW5zaW9uVHlwZX0gKi8gKGV4dFR5cGUpLFxuICAgICAgICAgICAgZXh0TmFtZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghYXJnU3BlYykge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcbiAgICAgICAgICAgICAgYFVua25vd24gYXJndW1lbnQgd2l0aCBrZXkgJHtrZXl9LCBleHRUeXBlICR7ZXh0VHlwZX0gYW5kIGV4dE5hbWUgJHtleHROYW1lfS4gVGhpcyBpcyBhIGJ1Zy5gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmxhdHRlbmVkLnB1c2goe3NjaGVtYTogXy5jbG9uZURlZXAodmFsdWUpLCBhcmdTcGVjfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdHRlbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgc2NoZW1hIGl0c2VsZlxuICAgKiBAcHVibGljXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVmXSAtIFNjaGVtYSBJRFxuICAgKiBAdGhyb3dzIElmIHRoZSBzY2hlbWEgaGFzIG5vdCB5ZXQgYmVlbiBmaW5hbGl6ZWRcbiAgICogQHJldHVybnMge1NjaGVtYU9iamVjdH1cbiAgICovXG4gIGdldFNjaGVtYSAocmVmID0gQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtTY2hlbWFPYmplY3R9ICovICh0aGlzLl9nZXRWYWxpZGF0b3IocmVmKS5zY2hlbWEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBzY2hlbWEgdmFsaWRhdG9yIGZ1bmN0aW9uIGZyb20gQWp2XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbaWRdIC0gU2NoZW1hIElEXG4gICAqIEBwcml2YXRlXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ2FqdicpLlZhbGlkYXRlRnVuY3Rpb259XG4gICAqL1xuICBfZ2V0VmFsaWRhdG9yIChpZCA9IEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKSB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5fYWp2LmdldFNjaGVtYShpZCk7XG4gICAgaWYgKCF2YWxpZGF0b3IpIHtcbiAgICAgIGlmIChpZCA9PT0gQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUZpbmFsaXphdGlvbkVycm9yKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVW5rbm93blNjaGVtYUVycm9yKGlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBvYmplY3QsIHZhbGlkYXRlcyBpdCBhZ2FpbnN0IHRoZSBBcHBpdW0gY29uZmlnIHNjaGVtYS5cbiAgICogSWYgZXJyb3JzIG9jY3VyLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBiZSBub24tZW1wdHkuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSAoaG9wZWZ1bGx5IGFuIG9iamVjdCkgdG8gdmFsaWRhdGUgYWdhaW5zdCB0aGUgc2NoZW1hXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVmXSAtIFNjaGVtYSBJRCBvciByZWYuXG4gICAqIEBwdWJsaWNcbiAgICogQHJldHVybnMge2ltcG9ydCgnYWp2JykuRXJyb3JPYmplY3RbXX0gQXJyYXkgb2YgZXJyb3JzLCBpZiBhbnkuXG4gICAqL1xuICB2YWxpZGF0ZSAodmFsdWUsIHJlZiA9IEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKSB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5fZ2V0VmFsaWRhdG9yKHJlZik7XG4gICAgcmV0dXJuICF2YWxpZGF0b3IodmFsdWUpICYmIF8uaXNBcnJheSh2YWxpZGF0b3IuZXJyb3JzKVxuICAgICAgPyBbLi4udmFsaWRhdG9yLmVycm9yc11cbiAgICAgIDogW107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYGZpbGVuYW1lYCdzIGZpbGUgZXh0ZW5zaW9uIGlzIGFsbG93ZWQgKGluIHtAbGluayBBTExPV0VEX1NDSEVNQV9FWFRFTlNJT05TfSkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9uIChmaWxlbmFtZSkge1xuICAgIHJldHVybiBBTExPV0VEX1NDSEVNQV9FWFRFTlNJT05TLmhhcyhwYXRoLmV4dG5hbWUoZmlsZW5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBgc2NoZW1hYCBpcyBhIHBsYWluIG9iamVjdCB3aXRoIGEgbm9uLXRydWUgYCRhc3luY2AgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7YW55fSBzY2hlbWEgLSBTY2hlbWEgdG8gY2hlY2tcbiAgICogQHJldHVybnMge3NjaGVtYSBpcyBTY2hlbWFPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgaXNTdXBwb3J0ZWRTY2hlbWFUeXBlIChzY2hlbWEpIHtcbiAgICByZXR1cm4gXy5pc1BsYWluT2JqZWN0KHNjaGVtYSkgJiYgc2NoZW1hLiRhc3luYyAhPT0gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSB7QGxpbmsgQXBwaXVtU2NoZW1hfSBpbnN0YW5jZSBoYXMgbm90IHlldCBiZWVuIGZpbmFsaXplZCwgYnV0XG4gKiB0aGUgbWV0aG9kIGNhbGxlZCByZXF1aXJlcyBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjaGVtYUZpbmFsaXphdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHN0cmluZz59XG4gICAqL1xuICBjb2RlID0gJ0FQUElVTUVSUl9TQ0hFTUFfRklOQUxJWkFUSU9OJztcblxuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoJ1NjaGVtYSBub3QgeWV0IGZpbmFsaXplZDsgYGZpbmFsaXplKClgIG11c3QgYmUgY2FsbGVkIGZpcnN0LicpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBcInVuaXF1ZVwiIHNjaGVtYSBJRCBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBzY2hlbWEgSUQuXG4gKlxuICogVGhpcyBpcyBsaWtlbHkgZ29pbmcgdG8gYmUgY2F1c2VkIGJ5IGF0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgdGhlIHNhbWUgc2NoZW1hIHR3aWNlLlxuICovXG5leHBvcnQgY2xhc3MgU2NoZW1hTmFtZUNvbmZsaWN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9OQU1FX0NPTkZMSUNUJztcblxuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHtleHRUeXBlOiBFeHRlbnNpb25UeXBlLCBleHROYW1lOiBzdHJpbmd9Pn1cbiAgICovXG4gIGRhdGE7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IgKGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICBzdXBlcihcbiAgICAgIGBOYW1lIGZvciAke2V4dFR5cGV9IHNjaGVtYSBcIiR7ZXh0TmFtZX1cIiBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBzY2hlbWFgLFxuICAgICk7XG4gICAgdGhpcy5kYXRhID0ge2V4dFR5cGUsIGV4dE5hbWV9O1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBzY2hlbWEgSUQgd2FzIGV4cGVjdGVkLCBidXQgaXQgZG9lc24ndCBleGlzdCBvbiB0aGUge0BsaW5rIEFqdn0gaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IgZXh0ZW5kcyBSZWZlcmVuY2VFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9VTktOT1dOX1NDSEVNQSc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTx7c2NoZW1hSWQ6IHN0cmluZ30+fVxuICAgKi9cbiAgZGF0YTtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVtYUlkXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoc2NoZW1hSWQpIHtcbiAgICBzdXBlcihgVW5rbm93biBzY2hlbWE6IFwiJHtzY2hlbWFJZH1cImApO1xuICAgIHRoaXMuZGF0YSA9IHtzY2hlbWFJZH07XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHNjaGVtYSBpcyBwcm92aWRlZCwgYnV0IGl0J3Mgb2YgYW4gdW5zdXBwb3J0ZWQgdHlwZS5cbiAqXG4gKiBcIlZhbGlkXCIgc2NoZW1hcyB3aGljaCBhcmUgdW5zdXBwb3J0ZWQgaW5jbHVkZSBib29sZWFuIHNjaGVtYXMgYW5kIGFzeW5jIHNjaGVtYXNcbiAqIChoYXZpbmcgYSBgdHJ1ZWAgYCRhc3luY2AgcHJvcGVydHkpLlxuICovXG5leHBvcnQgY2xhc3MgU2NoZW1hVW5zdXBwb3J0ZWRTY2hlbWFFcnJvciBleHRlbmRzIFR5cGVFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9VTlNVUFBPUlRFRF9TQ0hFTUEnO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8e3NjaGVtYTogYW55LCBleHRUeXBlOiBFeHRlbnNpb25UeXBlLCBleHROYW1lOiBzdHJpbmd9Pn1cbiAgICovXG4gIGRhdGE7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBzY2hlbWFcbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBleHRUeXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoc2NoZW1hLCBleHRUeXBlLCBleHROYW1lKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy84Mjc3XG4gICAgc3VwZXIoXG4gICAgICAoKCkgPT4ge1xuICAgICAgICBsZXQgbXNnID0gYFVuc3VwcG9ydGVkIHNjaGVtYSBmcm9tICR7ZXh0VHlwZX0gXCIke2V4dE5hbWV9XCI6YDtcbiAgICAgICAgaWYgKF8uaXNCb29sZWFuKHNjaGVtYSkpIHtcbiAgICAgICAgICByZXR1cm4gYCR7bXNnfSBzY2hlbWEgY2Fubm90IGJlIGEgYm9vbGVhbmA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF8uaXNQbGFpbk9iamVjdChzY2hlbWEpKSB7XG4gICAgICAgICAgaWYgKHNjaGVtYS4kYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHttc2d9IHNjaGVtYSBjYW5ub3QgYmUgYW4gYXN5bmMgc2NoZW1hYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgYHNjaGVtYSBJUyBzdXBwb3J0ZWQ7IHRoaXMgZXJyb3Igc2hvdWxkIG5vdCBiZSB0aHJvd24gKHRoaXMgaXMgYSBidWcpLiB2YWx1ZSBvZiBzY2hlbWE6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHttc2d9IHNjaGVtYSBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0IHdpdGhvdXQgYSB0cnVlIFwiJGFzeW5jXCIgcHJvcGVydHlgO1xuICAgICAgfSkoKSxcbiAgICApO1xuICAgIHRoaXMuZGF0YSA9IHtzY2hlbWEsIGV4dFR5cGUsIGV4dE5hbWV9O1xuICB9XG59XG5cbmNvbnN0IGFwcGl1bVNjaGVtYSA9IEFwcGl1bVNjaGVtYS5jcmVhdGUoKTtcblxuZXhwb3J0IGNvbnN0IHtcbiAgcmVnaXN0ZXJTY2hlbWEsXG4gIGdldEFsbEFyZ1NwZWNzLFxuICBnZXRBcmdTcGVjLFxuICBoYXNBcmdTcGVjLFxuICBpc0ZpbmFsaXplZCxcbiAgZmluYWxpemU6IGZpbmFsaXplU2NoZW1hLFxuICByZXNldDogcmVzZXRTY2hlbWEsXG4gIHZhbGlkYXRlLFxuICBnZXRTY2hlbWEsXG4gIGZsYXR0ZW46IGZsYXR0ZW5TY2hlbWEsXG4gIGdldERlZmF1bHRzOiBnZXREZWZhdWx0c0ZvclNjaGVtYSxcbiAgZ2V0RGVmYXVsdHNGb3JFeHRlbnNpb24sXG59ID0gYXBwaXVtU2NoZW1hO1xuZXhwb3J0IGNvbnN0IHtpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9ufSA9IEFwcGl1bVNjaGVtYTtcblxuLyoqXG4gKiBBcHBpdW0gb25seSBzdXBwb3J0cyBzY2hlbWFzIHRoYXQgYXJlIHBsYWluIG9iamVjdHM7IG5vdCBhcnJheXMuXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhanYnKS5TY2hlbWFPYmplY3QgJiB7W2tleTogbnVtYmVyXTogbmV2ZXJ9fSBTY2hlbWFPYmplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2V4dGVuc2lvbi9tYW5pZmVzdCcpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqL1xuXG4vKipcbiAqIEFuIG9iamVjdCBoYXZpbmcgcHJvcGVydHkgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZWBcbiAqIEB0eXBlZGVmIFN0cmljdFByb3BcbiAqIEBwcm9wZXJ0eSB7ZmFsc2V9IGFkZGl0aW9uYWxQcm9wZXJ0aWVzXG4gKi9cblxuLyoqXG4gKiBBIHtAbGluayBTY2hlbWFPYmplY3R9IHdpdGggYGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZWBcbiAqIEB0eXBlZGVmIHtTY2hlbWFPYmplY3QgJiBTdHJpY3RQcm9wfSBTdHJpY3RTY2hlbWFPYmplY3RcbiAqL1xuXG4vKipcbiAqIEEgbGlzdCBvZiBzY2hlbWFzIGFzc29jaWF0ZWQgd2l0aCBwcm9wZXJ0aWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHtAbGluayBBcmdTcGVjfSBvYmplY3RzLlxuICpcbiAqIEludGVybWVkaWF0ZSBkYXRhIHN0cnVjdHVyZSB1c2VkIHdoZW4gY29udmVydGluZyB0aGUgZW50aXJlIHNjaGVtYSBkb3duIHRvIENMSSBhcmd1bWVudHMuXG4gKiBAdHlwZWRlZiB7IHtzY2hlbWE6IFNjaGVtYU9iamVjdCwgYXJnU3BlYzogQXJnU3BlY31bXSB9IEZsYXR0ZW5lZFNjaGVtYVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0FyZ1NwZWNbJ2RlZmF1bHRWYWx1ZSddfSBBcmdTcGVjRGVmYXVsdFZhbHVlXG4gKi9cblxuLyoqXG4gKiBlLmcuIGB7ZHJpdmVyOiB7Zm9vOiAnYmFyJ319YCB3aGVyZSBgZm9vYCBpcyB0aGUgYXJnIG5hbWUgYW5kIGBiYXJgIGlzIHRoZSBkZWZhdWx0IHZhbHVlLlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsUmVjb3JkPHN0cmluZyxBcmdTcGVjRGVmYXVsdFZhbHVlPj59IE5lc3RlZEFyZ1NwZWNEZWZhdWx0VmFsdWVcbiAqL1xuXG4vKipcbiAqIEhlbHBlciB0eXBlIGZvciB0aGUgcmV0dXJuIHZhbHVlIG9mIHtAbGluayBBcHBpdW1TY2hlbWEuZ2V0RGVmYXVsdHN9XG4gKiBAdGVtcGxhdGUge2Jvb2xlYW58dW5kZWZpbmVkfSBGbGF0dGVuZWRcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLEZsYXR0ZW5lZCBleHRlbmRzIHRydWUgPyBBcmdTcGVjRGVmYXVsdFZhbHVlIDogQXJnU3BlY0RlZmF1bHRWYWx1ZSB8IE5lc3RlZEFyZ1NwZWNEZWZhdWx0VmFsdWU+fSBEZWZhdWx0VmFsdWVzXG4gKi9cbiJdfQ==
@@ -0,0 +1,66 @@
1
+ export type ParsedDriverCaps = {
2
+ desiredCaps: Capabilities;
3
+ protocol: string;
4
+ processedJsonwpCapabilities?: any;
5
+ processedW3CCapabilities?: W3CCapabilities | undefined;
6
+ };
7
+ export type InvalidCaps = {
8
+ error: Error;
9
+ protocol: string;
10
+ desiredCaps?: Partial<import("@wdio/types/build/Capabilities").Capabilities & import("@wdio/types/build/Capabilities").AppiumCapabilities & {
11
+ [x: string]: any;
12
+ }> | undefined;
13
+ processedJsonwpCapabilities?: any;
14
+ processedW3CCapabilities?: W3CCapabilities | undefined;
15
+ };
16
+ export type W3CCapabilities = import('@appium/types').W3CCapabilities;
17
+ export type Capabilities = import('@appium/types').Capabilities;
18
+ export type AppiumW3CCapabilities = import('@appium/types').AppiumW3CCapabilities;
19
+ /**
20
+ * Dumps to value to the console using `info` logger.
21
+ *
22
+ * @todo May want to force color to be `false` if {@link isStdoutTTY} is `false`.
23
+ */
24
+ export const inspect: (t1: any) => void;
25
+ /**
26
+ * Takes the caps that were provided in the request and translates them
27
+ * into caps that can be used by the inner drivers.
28
+ *
29
+ * @param {any} jsonwpCapabilities
30
+ * @param {W3CCapabilities} w3cCapabilities
31
+ * @param {import('@appium/types').Constraints} constraints
32
+ * @param {import('@appium/types').DefaultCapabilitiesConfig} [defaultCapabilities]
33
+ * @returns {ParsedDriverCaps|InvalidCaps}
34
+ */
35
+ export function parseCapsForInnerDriver(jsonwpCapabilities: any, w3cCapabilities: W3CCapabilities, constraints?: import('@appium/types').Constraints, defaultCapabilities?: import("@appium/types").DefaultCapabilitiesConfig | undefined): ParsedDriverCaps | InvalidCaps;
36
+ /**
37
+ * Takes a capabilities objects and prefixes capabilities with `appium:`
38
+ * @param {Capabilities} caps Desired capabilities object
39
+ * @returns {AppiumW3CCapabilities}
40
+ */
41
+ export function insertAppiumPrefixes(caps: Capabilities): AppiumW3CCapabilities;
42
+ export function getPackageVersion(pkgName: any): any;
43
+ /**
44
+ * Pulls the initial values of Appium settings from the given capabilities argument.
45
+ * Each setting item must satisfy the following format:
46
+ * `setting[setting_name]: setting_value`
47
+ * The capabilities argument itself gets mutated, so it does not contain parsed
48
+ * settings anymore to avoid further parsing issues.
49
+ * Check
50
+ * https://github.com/appium/appium/blob/master/docs/en/advanced-concepts/settings.md
51
+ * for more details on the available settings.
52
+ *
53
+ * @param {?Object} caps - Capabilities dictionary. It is mutated if
54
+ * one or more settings have been pulled from it
55
+ * @return {Object} - An empty dictionary if the given caps contains no
56
+ * setting items or a dictionary containing parsed Appium setting names along with
57
+ * their values.
58
+ */
59
+ export function pullSettings(caps: any | null): any;
60
+ /**
61
+ *
62
+ * @param {AppiumW3CCapabilities} caps
63
+ * @returns {Capabilities}
64
+ */
65
+ export function removeAppiumPrefixes(caps: AppiumW3CCapabilities): Capabilities;
66
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../lib/utils.js"],"names":[],"mappings":";iBAwOc,YAAY;cACZ,MAAM;kCACN,GAAG;;;;WAOH,KAAK;cACL,MAAM;;;;kCAEN,GAAG;;;8BAKJ,OAAO,eAAe,EAAE,eAAe;2BACvC,OAAO,eAAe,EAAE,YAAY;oCACpC,OAAO,eAAe,EAAE,qBAAqB;AA1O1D;;;;GAIG;AACH,wCAOK;AAEL;;;;;;;;;GASG;AACH,4DANW,GAAG,mBACH,eAAe,gBACf,OAAO,eAAe,EAAE,WAAW,wFAEjC,gBAAgB,GAAC,WAAW,CA2FxC;AAED;;;;GAIG;AACH,2CAHW,YAAY,GACV,qBAAqB,CAyBjC;AAyBD,qDAGC;AAED;;;;;;;;;;;;;;;GAeG;AACH,oDAgBC;AA5DD;;;;GAIG;AACH,2CAHW,qBAAqB,GACnB,YAAY,CAaxB"}
@@ -5,14 +5,12 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.ReadonlyMap = void 0;
9
8
  exports.getPackageVersion = getPackageVersion;
10
9
  exports.insertAppiumPrefixes = insertAppiumPrefixes;
11
10
  exports.inspect = void 0;
12
11
  exports.parseCapsForInnerDriver = parseCapsForInnerDriver;
13
12
  exports.pullSettings = pullSettings;
14
13
  exports.removeAppiumPrefixes = removeAppiumPrefixes;
15
- exports.rootDir = void 0;
16
14
 
17
15
  require("source-map-support/register");
18
16
 
@@ -22,8 +20,6 @@ var _logger = _interopRequireDefault(require("./logger"));
22
20
 
23
21
  var _baseDriver = require("@appium/base-driver");
24
22
 
25
- var _support = require("@appium/support");
26
-
27
23
  var _util = require("util");
28
24
 
29
25
  const W3C_APPIUM_PREFIX = 'appium';
@@ -45,8 +41,8 @@ function parseCapsForInnerDriver(jsonwpCapabilities, w3cCapabilities, constraint
45
41
  const hasJSONWPCaps = _lodash.default.isPlainObject(jsonwpCapabilities);
46
42
 
47
43
  let desiredCaps = {};
48
- let processedW3CCapabilities = null;
49
- let processedJsonwpCapabilities = null;
44
+ let processedW3CCapabilities;
45
+ let processedJsonwpCapabilities;
50
46
 
51
47
  if (!hasW3CCaps) {
52
48
  return {
@@ -92,7 +88,9 @@ function parseCapsForInnerDriver(jsonwpCapabilities, w3cCapabilities, constraint
92
88
  }
93
89
 
94
90
  if (hasJSONWPCaps) {
95
- jsonwpCapabilities = Object.assign({}, removeAppiumPrefixes(defaultCapabilities), jsonwpCapabilities);
91
+ jsonwpCapabilities = { ...removeAppiumPrefixes(defaultCapabilities),
92
+ ...jsonwpCapabilities
93
+ };
96
94
  }
97
95
  }
98
96
 
@@ -190,31 +188,4 @@ function pullSettings(caps) {
190
188
 
191
189
  return result;
192
190
  }
193
-
194
- const rootDir = _support.fs.findRoot(__dirname);
195
-
196
- exports.rootDir = rootDir;
197
-
198
- class ReadonlyMap extends Map {
199
- set(key, value) {
200
- if (this.has(key)) {
201
- throw new Error(`${key} is already set`);
202
- }
203
-
204
- return super.set(key, value);
205
- }
206
-
207
- delete() {
208
- return false;
209
- }
210
-
211
- clear() {
212
- throw new Error(`Cannot clear ReadonlyMap`);
213
- }
214
-
215
- }
216
-
217
- exports.ReadonlyMap = ReadonlyMap;require('source-map-support').install();
218
-
219
-
220
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJXM0NfQVBQSVVNX1BSRUZJWCIsImlzU3Rkb3V0VFRZIiwicHJvY2VzcyIsInN0ZG91dCIsImlzVFRZIiwiaW5zcGVjdCIsIl8iLCJmbG93IiwicGFydGlhbFJpZ2h0IiwiZHVtcCIsImNvbG9ycyIsImRlcHRoIiwiY29tcGFjdCIsImFyZ3MiLCJsb2dnZXIiLCJpbmZvIiwicGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIiLCJqc29ud3BDYXBhYmlsaXRpZXMiLCJ3M2NDYXBhYmlsaXRpZXMiLCJjb25zdHJhaW50cyIsImRlZmF1bHRDYXBhYmlsaXRpZXMiLCJoYXNXM0NDYXBzIiwiaXNQbGFpbk9iamVjdCIsImhhcyIsImhhc0pTT05XUENhcHMiLCJkZXNpcmVkQ2FwcyIsInByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcyIsInByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyIsInByb3RvY29sIiwiUFJPVE9DT0xTIiwiVzNDIiwiZXJyb3IiLCJFcnJvciIsImNsb25lRGVlcCIsImlzRW1wdHkiLCJkZWZhdWx0Q2FwS2V5IiwiZGVmYXVsdENhcFZhbHVlIiwidG9QYWlycyIsImlzQ2FwQWxyZWFkeVNldCIsImZpcnN0TWF0Y2hFbnRyeSIsImZpcnN0TWF0Y2giLCJyZW1vdmVBcHBpdW1QcmVmaXhlcyIsInJlbW92ZUFwcGl1bVByZWZpeCIsImFsd2F5c01hdGNoIiwiT2JqZWN0IiwiYXNzaWduIiwibWVzc2FnZSIsImluc2VydEFwcGl1bVByZWZpeGVzIiwiY2FwcyIsIlNUQU5EQVJEX0NBUFMiLCJwcmVmaXhlZENhcHMiLCJuYW1lIiwidmFsdWUiLCJpbmNsdWRlcyIsImZpeGVkQ2FwcyIsImtleSIsInByZWZpeCIsInN0YXJ0c1dpdGgiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJnZXRQYWNrYWdlVmVyc2lvbiIsInBrZ05hbWUiLCJwa2dJbmZvIiwicmVxdWlyZSIsInZlcnNpb24iLCJwdWxsU2V0dGluZ3MiLCJyZXN1bHQiLCJtYXRjaCIsImV4ZWMiLCJyb290RGlyIiwiZnMiLCJmaW5kUm9vdCIsIl9fZGlybmFtZSIsIlJlYWRvbmx5TWFwIiwiTWFwIiwic2V0IiwiZGVsZXRlIiwiY2xlYXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGlCQUFpQixHQUFHLFFBQTFCO0FBU0EsTUFBTUMsV0FBVyxHQUFHQyxPQUFPLENBQUNDLE1BQVIsQ0FBZUMsS0FBbkM7O0FBT0EsTUFBTUMsT0FBTyxHQUFHQyxnQkFBRUMsSUFBRixDQUNkRCxnQkFBRUUsWUFBRixDQUNpRkMsYUFEakYsRUFFRTtBQUFDQyxFQUFBQSxNQUFNLEVBQUUsSUFBVDtBQUFlQyxFQUFBQSxLQUFLLEVBQUUsSUFBdEI7QUFBNEJDLEVBQUFBLE9BQU8sRUFBRSxDQUFDWDtBQUF0QyxDQUZGLENBRGMsRUFLZCxDQUFDLEdBQUdZLElBQUosS0FBYTtBQUNYQyxrQkFBT0MsSUFBUCxDQUFZLEdBQUdGLElBQWY7QUFDRCxDQVBhLENBQWhCOzs7O0FBa0JBLFNBQVNHLHVCQUFULENBQWtDQyxrQkFBbEMsRUFBc0RDLGVBQXRELEVBQXVFQyxXQUFXLEdBQUcsRUFBckYsRUFBeUZDLG1CQUFtQixHQUFHLEVBQS9HLEVBQW1IO0FBRWpILFFBQU1DLFVBQVUsR0FBR2YsZ0JBQUVnQixhQUFGLENBQWdCSixlQUFoQixNQUNoQlosZ0JBQUVpQixHQUFGLENBQU1MLGVBQU4sRUFBdUIsYUFBdkIsS0FBeUNaLGdCQUFFaUIsR0FBRixDQUFNTCxlQUFOLEVBQXVCLFlBQXZCLENBRHpCLENBQW5COztBQUVBLFFBQU1NLGFBQWEsR0FBR2xCLGdCQUFFZ0IsYUFBRixDQUFnQkwsa0JBQWhCLENBQXRCOztBQUNBLE1BQUlRLFdBQVcsR0FBRyxFQUFsQjtBQUNBLE1BQUlDLHdCQUF3QixHQUFHLElBQS9CO0FBQ0EsTUFBSUMsMkJBQTJCLEdBQUcsSUFBbEM7O0FBRUEsTUFBSSxDQUFDTixVQUFM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QUFDQSxXQUFPSixJQUFJLENBQUNPLEdBQUQsQ0FBWDtBQUNEOztBQUNELFNBQU9XLE1BQVA7QUFDRDs7QUFFRCxNQUFNRyxPQUFPLEdBQUdDLFlBQUdDLFFBQUgsQ0FBWUMsU0FBWixDQUFoQjs7OztBQVFBLE1BQU1DLFdBQU4sU0FBMEJDLEdBQTFCLENBQThCO0FBSzVCQyxFQUFBQSxHQUFHLENBQUVwQixHQUFGLEVBQU9ILEtBQVAsRUFBYztBQUNmLFFBQUksS0FBSzdCLEdBQUwsQ0FBU2dDLEdBQVQsQ0FBSixFQUFtQjtBQUNqQixZQUFNLElBQUl2QixLQUFKLENBQVcsR0FBRXVCLEdBQUksaUJBQWpCLENBQU47QUFDRDs7QUFDRCxXQUFPLE1BQU1vQixHQUFOLENBQVVwQixHQUFWLEVBQWVILEtBQWYsQ0FBUDtBQUNEOztBQUVEd0IsRUFBQUEsTUFBTSxHQUFJO0FBQ1IsV0FBTyxLQUFQO0FBQ0Q7O0FBRURDLEVBQUFBLEtBQUssR0FBSTtBQUNQLFVBQU0sSUFBSTdDLEtBQUosQ0FBVywwQkFBWCxDQUFOO0FBQ0Q7O0FBbEIyQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBwcm9jZXNzQ2FwYWJpbGl0aWVzLCBQUk9UT0NPTFMgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCB7IGZzIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IGluc3BlY3QgYXMgZHVtcCB9IGZyb20gJ3V0aWwnO1xuXG5jb25zdCBXM0NfQVBQSVVNX1BSRUZJWCA9ICdhcHBpdW0nO1xuXG4vKipcbiAqXG4gKiBJZiBgc3Rkb3V0YCBpcyBhIFRUWSwgdGhpcyBpcyBgdHJ1ZWAuXG4gKlxuICogVXNlZCBmb3IgdGlnaHRlciBjb250cm9sIG92ZXIgbG9nIG91dHB1dC5cbiAqIEB0eXBlIHtib29sZWFufVxuICovXG5jb25zdCBpc1N0ZG91dFRUWSA9IHByb2Nlc3Muc3Rkb3V0LmlzVFRZO1xuXG4vKipcbiAqIER1bXBzIHRvIHZhbHVlIHRvIHRoZSBjb25zb2xlIHVzaW5nIGBpbmZvYCBsb2dnZXIuXG4gKlxuICogQHRvZG8gTWF5IHdhbnQgdG8gZm9yY2UgY29sb3IgdG8gYmUgYGZhbHNlYCBpZiB7QGxpbmsgaXNTdGRvdXRUVFl9IGlzIGBmYWxzZWAuXG4gKi9cbmNvbnN0IGluc3BlY3QgPSBfLmZsb3coXG4gIF8ucGFydGlhbFJpZ2h0KFxuICAgIC8qKiBAdHlwZSB7KG9iamVjdDogYW55LCBvcHRpb25zOiBpbXBvcnQoJ3V0aWwnKS5JbnNwZWN0T3B0aW9ucykgPT4gc3RyaW5nfSAqLyhkdW1wKSxcbiAgICB7Y29sb3JzOiB0cnVlLCBkZXB0aDogbnVsbCwgY29tcGFjdDogIWlzU3Rkb3V0VFRZfVxuICApLFxuICAoLi4uYXJncykgPT4ge1xuICAgIGxvZ2dlci5pbmZvKC4uLmFyZ3MpO1xuICB9KTtcblxuLyoqXG4gKiBUYWtlcyB0aGUgY2FwcyB0aGF0IHdlcmUgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QgYW5kIHRyYW5zbGF0ZXMgdGhlbVxuICogaW50byBjYXBzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIGlubmVyIGRyaXZlcnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGpzb253cENhcGFiaWxpdGllc1xuICogQHBhcmFtIHtPYmplY3R9IHczY0NhcGFiaWxpdGllc1xuICogQHBhcmFtIHtPYmplY3R9IGNvbnN0cmFpbnRzXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENhcGFiaWxpdGllc1xuICovXG5mdW5jdGlvbiBwYXJzZUNhcHNGb3JJbm5lckRyaXZlciAoanNvbndwQ2FwYWJpbGl0aWVzLCB3M2NDYXBhYmlsaXRpZXMsIGNvbnN0cmFpbnRzID0ge30sIGRlZmF1bHRDYXBhYmlsaXRpZXMgPSB7fSkge1xuICAvLyBDaGVjayBpZiB0aGUgY2FsbGVyIHNlbnQgSlNPTldQIGNhcHMsIFczQyBjYXBzLCBvciBib3RoXG4gIGNvbnN0IGhhc1czQ0NhcHMgPSBfLmlzUGxhaW5PYmplY3QodzNjQ2FwYWJpbGl0aWVzKSAmJlxuICAgIChfLmhhcyh3M2NDYXBhYmlsaXRpZXMsICdhbHdheXNNYXRjaCcpIHx8IF8uaGFzKHczY0NhcGFiaWxpdGllcywgJ2ZpcnN0TWF0Y2gnKSk7XG4gIGNvbnN0IGhhc0pTT05XUENhcHMgPSBfLmlzUGxhaW5PYmplY3QoanNvbndwQ2FwYWJpbGl0aWVzKTtcbiAgbGV0IGRlc2lyZWRDYXBzID0ge307XG4gIGxldCBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMgPSBudWxsO1xuICBsZXQgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzID0gbnVsbDtcblxuICBpZiAoIWhhc1czQ0NhcHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvdG9jb2w6IFBST1RPQ09MUy5XM0MsXG4gICAgICBlcnJvcjogbmV3IEVycm9yKCdXM0MgY2FwYWJpbGl0aWVzIHNob3VsZCBiZSBwcm92aWRlZCcpLFxuICAgIH07XG4gIH1cblxuICBjb25zdCB7VzNDfSA9IFBST1RPQ09MUztcbiAgY29uc3QgcHJvdG9jb2wgPSBXM0M7XG5cbiAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IG11dGF0ZSB0aGUgb3JpZ2luYWwgYXJndW1lbnRzXG4gIGpzb253cENhcGFiaWxpdGllcyA9IF8uY2xvbmVEZWVwKGpzb253cENhcGFiaWxpdGllcyk7XG4gIHczY0NhcGFiaWxpdGllcyA9IF8uY2xvbmVEZWVwKHczY0NhcGFiaWxpdGllcyk7XG4gIGRlZmF1bHRDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcChkZWZhdWx0Q2FwYWJpbGl0aWVzKTtcblxuICBpZiAoIV8uaXNFbXB0eShkZWZhdWx0Q2FwYWJpbGl0aWVzKSkge1xuICAgIGlmIChoYXNXM0NDYXBzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtkZWZhdWx0Q2FwS2V5LCBkZWZhdWx0Q2FwVmFsdWVdIG9mIF8udG9QYWlycyhkZWZhdWx0Q2FwYWJpbGl0aWVzKSkge1xuICAgICAgICBsZXQgaXNDYXBBbHJlYWR5U2V0ID0gZmFsc2U7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBwcmVzZW50IGluIGZpcnN0TWF0Y2ggZW50cmllc1xuICAgICAgICBmb3IgKGNvbnN0IGZpcnN0TWF0Y2hFbnRyeSBvZiAodzNjQ2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2ggfHwgW10pKSB7XG4gICAgICAgICAgaWYgKF8uaXNQbGFpbk9iamVjdChmaXJzdE1hdGNoRW50cnkpXG4gICAgICAgICAgICAgICYmIF8uaGFzKHJlbW92ZUFwcGl1bVByZWZpeGVzKGZpcnN0TWF0Y2hFbnRyeSksIHJlbW92ZUFwcGl1bVByZWZpeChkZWZhdWx0Q2FwS2V5KSkpIHtcbiAgICAgICAgICAgIGlzQ2FwQWxyZWFkeVNldCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGtleSBpcyBhbHJlYWR5IHByZXNlbnQgaW4gYWx3YXlzTWF0Y2ggZW50cmllc1xuICAgICAgICBpc0NhcEFscmVhZHlTZXQgPSBpc0NhcEFscmVhZHlTZXQgfHwgKF8uaXNQbGFpbk9iamVjdCh3M2NDYXBhYmlsaXRpZXMuYWx3YXlzTWF0Y2gpXG4gICAgICAgICAgJiYgXy5oYXMocmVtb3ZlQXBwaXVtUHJlZml4ZXModzNjQ2FwYWJpbGl0aWVzLmFsd2F5c01hdGNoKSwgcmVtb3ZlQXBwaXVtUHJlZml4KGRlZmF1bHRDYXBLZXkpKSk7XG4gICAgICAgIGlmIChpc0NhcEFscmVhZHlTZXQpIHtcbiAgICAgICAgICAvLyBTa2lwIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBwcm92aWRlZCBjYXBzXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IGFkZCB0aGUgZGVmYXVsdCBjYXBhYmlsaXR5IGlmIGl0IGlzIG5vdCBvdmVycmlkZGVuXG4gICAgICAgIGlmIChfLmlzRW1wdHkodzNjQ2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2gpKSB7XG4gICAgICAgICAgdzNjQ2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2ggPSBbe1tkZWZhdWx0Q2FwS2V5XTogZGVmYXVsdENhcFZhbHVlfV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdzNjQ2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2hbMF1bZGVmYXVsdENhcEtleV0gPSBkZWZhdWx0Q2FwVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0pTT05XUENhcHMpIHtcbiAgICAgIGpzb253cENhcGFiaWxpdGllcyA9IE9iamVjdC5hc3NpZ24oe30sIHJlbW92ZUFwcGl1bVByZWZpeGVzKGRlZmF1bHRDYXBhYmlsaXRpZXMpLCBqc29ud3BDYXBhYmlsaXRpZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdldCBNSlNPTldQIGNhcHNcbiAgaWYgKGhhc0pTT05XUENhcHMpIHtcbiAgICBwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMgPSB7Li4uanNvbndwQ2FwYWJpbGl0aWVzfTtcbiAgfVxuXG4gIC8vIEdldCBXM0MgY2Fwc1xuICBpZiAoaGFzVzNDQ2Fwcykge1xuICAgIC8vIENhbGwgdGhlIHByb2Nlc3MgY2FwYWJpbGl0aWVzIGFsZ29yaXRobSB0byBmaW5kIG1hdGNoaW5nIGNhcHMgb24gdGhlIFczQ1xuICAgIC8vIChzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9qbGlwcHMvc2ltcGxlLXdkLXNwZWMjcHJvY2Vzc2luZy1jYXBhYmlsaXRpZXMpXG4gICAgdHJ5IHtcbiAgICAgIGRlc2lyZWRDYXBzID0gcHJvY2Vzc0NhcGFiaWxpdGllcyh3M2NDYXBhYmlsaXRpZXMsIGNvbnN0cmFpbnRzLCB0cnVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmluZm8oYENvdWxkIG5vdCBwYXJzZSBXM0MgY2FwYWJpbGl0aWVzOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZXNpcmVkQ2FwcyxcbiAgICAgICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLFxuICAgICAgICBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMsXG4gICAgICAgIHByb3RvY29sLFxuICAgICAgICBlcnJvcixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHczYyBjYXBhYmlsaXRpZXMgcGF5bG9hZCB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIG1hdGNoaW5nIGNhcHMgaW4gYGFsd2F5c01hdGNoYFxuICAgIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcyA9IHtcbiAgICAgIGFsd2F5c01hdGNoOiB7Li4uaW5zZXJ0QXBwaXVtUHJlZml4ZXMoZGVzaXJlZENhcHMpfSxcbiAgICAgIGZpcnN0TWF0Y2g6IFt7fV0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7ZGVzaXJlZENhcHMsIHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcywgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzLCBwcm90b2NvbH07XG59XG5cbi8qKlxuICogVGFrZXMgYSBjYXBhYmlsaXRpZXMgb2JqZWN0cyBhbmQgcHJlZml4ZXMgY2FwYWJpbGl0aWVzIHdpdGggYGFwcGl1bTpgXG4gKiBAcGFyYW0ge09iamVjdH0gY2FwcyBEZXNpcmVkIGNhcGFiaWxpdGllcyBvYmplY3RcbiAqL1xuZnVuY3Rpb24gaW5zZXJ0QXBwaXVtUHJlZml4ZXMgKGNhcHMpIHtcbiAgLy8gU3RhbmRhcmQsIG5vbi1wcmVmaXhlZCBjYXBhYmlsaXRpZXMgKHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvd2ViZHJpdmVyLyNkZm4tdGFibGUtb2Ytc3RhbmRhcmQtY2FwYWJpbGl0aWVzKVxuICBjb25zdCBTVEFOREFSRF9DQVBTID0gW1xuICAgICdicm93c2VyTmFtZScsXG4gICAgJ2Jyb3dzZXJWZXJzaW9uJyxcbiAgICAncGxhdGZvcm1OYW1lJyxcbiAgICAnYWNjZXB0SW5zZWN1cmVDZXJ0cycsXG4gICAgJ3BhZ2VMb2FkU3RyYXRlZ3knLFxuICAgICdwcm94eScsXG4gICAgJ3NldFdpbmRvd1JlY3QnLFxuICAgICd0aW1lb3V0cycsXG4gICAgJ3VuaGFuZGxlZFByb21wdEJlaGF2aW9yJ1xuICBdO1xuXG4gIGxldCBwcmVmaXhlZENhcHMgPSB7fTtcbiAgZm9yIChsZXQgW25hbWUsIHZhbHVlXSBvZiBfLnRvUGFpcnMoY2FwcykpIHtcbiAgICBpZiAoU1RBTkRBUkRfQ0FQUy5pbmNsdWRlcyhuYW1lKSB8fCBuYW1lLmluY2x1ZGVzKCc6JykpIHtcbiAgICAgIHByZWZpeGVkQ2Fwc1tuYW1lXSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmVmaXhlZENhcHNbYCR7VzNDX0FQUElVTV9QUkVGSVh9OiR7bmFtZX1gXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJlZml4ZWRDYXBzO1xufVxuXG5mdW5jdGlvbiByZW1vdmVBcHBpdW1QcmVmaXhlcyAoY2Fwcykge1xuICBpZiAoIV8uaXNQbGFpbk9iamVjdChjYXBzKSkge1xuICAgIHJldHVybiBjYXBzO1xuICB9XG5cbiAgY29uc3QgZml4ZWRDYXBzID0ge307XG4gIGZvciAobGV0IFtuYW1lLCB2YWx1ZV0gb2YgXy50b1BhaXJzKGNhcHMpKSB7XG4gICAgZml4ZWRDYXBzW3JlbW92ZUFwcGl1bVByZWZpeChuYW1lKV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gZml4ZWRDYXBzO1xufVxuXG5mdW5jdGlvbiByZW1vdmVBcHBpdW1QcmVmaXggKGtleSkge1xuICBjb25zdCBwcmVmaXggPSBgJHtXM0NfQVBQSVVNX1BSRUZJWH06YDtcbiAgcmV0dXJuIF8uc3RhcnRzV2l0aChrZXksIHByZWZpeCkgPyBrZXkuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpIDoga2V5O1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlVmVyc2lvbiAocGtnTmFtZSkge1xuICBjb25zdCBwa2dJbmZvID0gcmVxdWlyZShgJHtwa2dOYW1lfS9wYWNrYWdlLmpzb25gKSB8fCB7fTtcbiAgcmV0dXJuIHBrZ0luZm8udmVyc2lvbjtcbn1cblxuLyoqXG4gKiBQdWxscyB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgQXBwaXVtIHNldHRpbmdzIGZyb20gdGhlIGdpdmVuIGNhcGFiaWxpdGllcyBhcmd1bWVudC5cbiAqIEVhY2ggc2V0dGluZyBpdGVtIG11c3Qgc2F0aXNmeSB0aGUgZm9sbG93aW5nIGZvcm1hdDpcbiAqIGBzZXR0aW5nW3NldHRpbmdfbmFtZV06IHNldHRpbmdfdmFsdWVgXG4gKiBUaGUgY2FwYWJpbGl0aWVzIGFyZ3VtZW50IGl0c2VsZiBnZXRzIG11dGF0ZWQsIHNvIGl0IGRvZXMgbm90IGNvbnRhaW4gcGFyc2VkXG4gKiBzZXR0aW5ncyBhbnltb3JlIHRvIGF2b2lkIGZ1cnRoZXIgcGFyc2luZyBpc3N1ZXMuXG4gKiBDaGVja1xuICogaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vYmxvYi9tYXN0ZXIvZG9jcy9lbi9hZHZhbmNlZC1jb25jZXB0cy9zZXR0aW5ncy5tZFxuICogZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgYXZhaWxhYmxlIHNldHRpbmdzLlxuICpcbiAqIEBwYXJhbSB7P09iamVjdH0gY2FwcyAtIENhcGFiaWxpdGllcyBkaWN0aW9uYXJ5LiBJdCBpcyBtdXRhdGVkIGlmXG4gKiBvbmUgb3IgbW9yZSBzZXR0aW5ncyBoYXZlIGJlZW4gcHVsbGVkIGZyb20gaXRcbiAqIEByZXR1cm4ge09iamVjdH0gLSBBbiBlbXB0eSBkaWN0aW9uYXJ5IGlmIHRoZSBnaXZlbiBjYXBzIGNvbnRhaW5zIG5vXG4gKiBzZXR0aW5nIGl0ZW1zIG9yIGEgZGljdGlvbmFyeSBjb250YWluaW5nIHBhcnNlZCBBcHBpdW0gc2V0dGluZyBuYW1lcyBhbG9uZyB3aXRoXG4gKiB0aGVpciB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIHB1bGxTZXR0aW5ncyAoY2Fwcykge1xuICBpZiAoIV8uaXNQbGFpbk9iamVjdChjYXBzKSB8fCBfLmlzRW1wdHkoY2FwcykpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKGNhcHMpKSB7XG4gICAgY29uc3QgbWF0Y2ggPSAvXFxic2V0dGluZ3NcXFsoXFxTKylcXF0kLy5leGVjKGtleSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzdWx0W21hdGNoWzFdXSA9IHZhbHVlO1xuICAgIGRlbGV0ZSBjYXBzW2tleV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3Qgcm9vdERpciA9IGZzLmZpbmRSb290KF9fZGlybmFtZSk7XG5cblxuLyoqXG4gKiBBIE1hcCB3aGVyZSB5b3UgY2FuIHNldCBwcm9wZXJ0aWVzLCBidXQgb25seSBvbmNlLiBBbmQgeW91IGNhbid0IHJlbW92ZSBhbnl0aGluZy4gU28gdGhlcmUuXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAZXh0ZW5kcyB7TWFwPEssVj59XG4gKi9cbmNsYXNzIFJlYWRvbmx5TWFwIGV4dGVuZHMgTWFwIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7S30ga2V5XG4gICAqIEBwYXJhbSB7Vn0gdmFsdWVcbiAgICovXG4gIHNldCAoa2V5LCB2YWx1ZSkge1xuICAgIGlmICh0aGlzLmhhcyhrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7a2V5fSBpcyBhbHJlYWR5IHNldGApO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuc2V0KGtleSwgdmFsdWUpO1xuICB9XG5cbiAgZGVsZXRlICgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjbGVhciAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY2xlYXIgUmVhZG9ubHlNYXBgKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBpbnNwZWN0LCBwYXJzZUNhcHNGb3JJbm5lckRyaXZlciwgaW5zZXJ0QXBwaXVtUHJlZml4ZXMsIHJvb3REaXIsXG4gIGdldFBhY2thZ2VWZXJzaW9uLCBwdWxsU2V0dGluZ3MsIHJlbW92ZUFwcGl1bVByZWZpeGVzLCBSZWFkb25seU1hcFxufTtcbiJdLCJmaWxlIjoibGliL3V0aWxzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
191
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJXM0NfQVBQSVVNX1BSRUZJWCIsImlzU3Rkb3V0VFRZIiwicHJvY2VzcyIsInN0ZG91dCIsImlzVFRZIiwiaW5zcGVjdCIsIl8iLCJmbG93IiwicGFydGlhbFJpZ2h0IiwiZHVtcCIsImNvbG9ycyIsImRlcHRoIiwiY29tcGFjdCIsImFyZ3MiLCJsb2dnZXIiLCJpbmZvIiwicGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIiLCJqc29ud3BDYXBhYmlsaXRpZXMiLCJ3M2NDYXBhYmlsaXRpZXMiLCJjb25zdHJhaW50cyIsImRlZmF1bHRDYXBhYmlsaXRpZXMiLCJoYXNXM0NDYXBzIiwiaXNQbGFpbk9iamVjdCIsImhhcyIsImhhc0pTT05XUENhcHMiLCJkZXNpcmVkQ2FwcyIsInByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcyIsInByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyIsInByb3RvY29sIiwiUFJPVE9DT0xTIiwiVzNDIiwiZXJyb3IiLCJFcnJvciIsImNsb25lRGVlcCIsImlzRW1wdHkiLCJkZWZhdWx0Q2FwS2V5IiwiZGVmYXVsdENhcFZhbHVlIiwidG9QYWlycyIsImlzQ2FwQWxyZWFkeVNldCIsImZpcnN0TWF0Y2hFbnRyeSIsImZpcnN0TWF0Y2giLCJyZW1vdmVBcHBpdW1QcmVmaXhlcyIsInJlbW92ZUFwcGl1bVByZWZpeCIsImFsd2F5c01hdGNoIiwibWVzc2FnZSIsImluc2VydEFwcGl1bVByZWZpeGVzIiwiY2FwcyIsIlNUQU5EQVJEX0NBUFMiLCJwcmVmaXhlZENhcHMiLCJuYW1lIiwidmFsdWUiLCJpbmNsdWRlcyIsImZpeGVkQ2FwcyIsImtleSIsInByZWZpeCIsInN0YXJ0c1dpdGgiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJnZXRQYWNrYWdlVmVyc2lvbiIsInBrZ05hbWUiLCJwa2dJbmZvIiwicmVxdWlyZSIsInZlcnNpb24iLCJwdWxsU2V0dGluZ3MiLCJyZXN1bHQiLCJtYXRjaCIs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ICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBwcm9jZXNzQ2FwYWJpbGl0aWVzLCBQUk9UT0NPTFMgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCB7IGluc3BlY3QgYXMgZHVtcCB9IGZyb20gJ3V0aWwnO1xuXG5jb25zdCBXM0NfQVBQSVVNX1BSRUZJWCA9ICdhcHBpdW0nO1xuXG4vKipcbiAqXG4gKiBJZiBgc3Rkb3V0YCBpcyBhIFRUWSwgdGhpcyBpcyBgdHJ1ZWAuXG4gKlxuICogVXNlZCBmb3IgdGlnaHRlciBjb250cm9sIG92ZXIgbG9nIG91dHB1dC5cbiAqIEB0eXBlIHtib29sZWFufVxuICovXG5jb25zdCBpc1N0ZG91dFRUWSA9IHByb2Nlc3Muc3Rkb3V0LmlzVFRZO1xuXG4vKipcbiAqIER1bXBzIHRvIHZhbHVlIHRvIHRoZSBjb25zb2xlIHVzaW5nIGBpbmZvYCBsb2dnZXIuXG4gKlxuICogQHRvZG8gTWF5IHdhbnQgdG8gZm9yY2UgY29sb3IgdG8gYmUgYGZhbHNlYCBpZiB7QGxpbmsgaXNTdGRvdXRUVFl9IGlzIGBmYWxzZWAuXG4gKi9cbmNvbnN0IGluc3BlY3QgPSBfLmZsb3coXG4gIF8ucGFydGlhbFJpZ2h0KFxuICAgIC8qKiBAdHlwZSB7KG9iamVjdDogYW55LCBvcHRpb25zOiBpbXBvcnQoJ3V0aWwnKS5JbnNwZWN0T3B0aW9ucykgPT4gc3RyaW5nfSAqLyhkdW1wKSxcbiAgICB7Y29sb3JzOiB0cnVlLCBkZXB0aDogbnVsbCwgY29tcGFjdDogIWlzU3Rkb3V0VFRZfVxuICApLFxuICAoLi4uYXJncykgPT4ge1xuICAgIGxvZ2dlci5pbmZvKC4uLmFyZ3MpO1xuICB9KTtcblxuLyoqXG4gKiBUYWtlcyB0aGUgY2FwcyB0aGF0IHdlcmUgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QgYW5kIHRyYW5zbGF0ZXMgdGhlbVxuICogaW50byBjYXBzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIGlubmVyIGRyaXZlcnMuXG4gKlxuICogQHBhcmFtIHthbnl9IGpzb253cENhcGFiaWxpdGllc1xuICogQHBhcmFtIHtXM0NDYXBhYmlsaXRpZXN9IHczY0NhcGFiaWxpdGllc1xuICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Db25zdHJhaW50c30gY29uc3RyYWludHNcbiAqIEBwYXJhbSB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRGVmYXVsdENhcGFiaWxpdGllc0NvbmZpZ30gW2RlZmF1bHRDYXBhYmlsaXRpZXNdXG4gKiBAcmV0dXJucyB7UGFyc2VkRHJpdmVyQ2Fwc3xJbnZhbGlkQ2Fwc31cbiAqL1xuZnVuY3Rpb24gcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIgKGpzb253cENhcGFiaWxpdGllcywgdzNjQ2FwYWJpbGl0aWVzLCBjb25zdHJhaW50cyA9IHt9LCBkZWZhdWx0Q2FwYWJpbGl0aWVzID0ge30pIHtcbiAgLy8gQ2hlY2sgaWYgdGhlIGNhbGxlciBzZW50IEpTT05XUCBjYXBzLCBXM0MgY2Fwcywgb3IgYm90aFxuICBjb25zdCBoYXNXM0NDYXBzID0gXy5pc1BsYWluT2JqZWN0KHczY0NhcGFiaWxpdGllcykgJiZcbiAgICAoXy5oYXModzNjQ2FwYWJpbGl0aWVzLCAnYWx3YXlzTWF0Y2gnKSB8fCBfLmhhcyh3M2NDYXBhYmlsaXRpZXMsICdmaXJzdE1hdGNoJykpO1xuICBjb25zdCBoYXNKU09OV1BDYXBzID0gXy5pc1BsYWluT2JqZWN0KGpzb253cENhcGFiaWxpdGllcyk7XG4gIGxldCBkZXNpcmVkQ2FwcyA9IC8qKiBAdHlwZSB7UGFyc2VkRHJpdmVyQ2Fwc1snZGVzaXJlZENhcHMnXX0gKi8oe30pO1xuICAvKiogQHR5cGUge1BhcnNlZERyaXZlckNhcHNbJ3Byb2Nlc3NlZFczQ0NhcGFiaWxpdGllcyddfSAqL1xuICBsZXQgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzO1xuICAvKiogQHR5cGUge1BhcnNlZERyaXZlckNhcHNbJ3Byb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyddfSAqL1xuICBsZXQgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzO1xuXG4gIGlmICghaGFzVzNDQ2Fwcykge1xuICAgIHJldHVybiAvKiogQHR5cGUge0ludmFsaWRDYXBzfSAqLyh7XG4gICAgICBwcm90b2NvbDogUFJPVE9DT0xTLlczQyxcbiAgICAgIGVycm9yOiBuZXcgRXJyb3IoJ1czQyBjYXBhYmlsaXRpZXMgc2hvdWxkIGJlIHByb3ZpZGVkJyksXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCB7VzNDfSA9IFBST1RPQ09MUztcbiAgY29uc3QgcHJvdG9jb2wgPSBXM0M7XG5cbiAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IG11dGF0ZSB0aGUgb3JpZ2luYWwgYXJndW1lbnRzXG4gIGpzb253cENhcGFiaWxpdGllcyA9IF8uY2xvbmVEZWVwKGpzb253cENhcGFiaWxpdGllcyk7XG4gIHczY0NhcGFiaWxpdGllcyA9IF8uY2xvbmVEZWVwKHczY0NhcGFiaWxpdGllcyk7XG4gIGRlZmF1bHRDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcChkZWZhdWx0Q2FwYWJpbGl0aWVzKTtcblxuICBpZiAoIV8uaXNFbXB0eShkZWZhdWx0Q2FwYWJpbGl0aWVzKSkge1xuICAgIGlmIChoYXNXM0NDYXBzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtkZWZhdWx0Q2FwS2V5LCBkZWZhdWx0Q2FwVmFsdWVdIG9mIF8udG9QYWlycyhkZWZhdWx0Q2FwYWJpbGl0aWVzKSkge1xuICAgICAgICBsZXQgaXNDYXBBbHJlYWR5U2V0ID0gZmFsc2U7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBwcmVzZW50IGluIGZpcnN0TWF0Y2ggZW50cmllc1xuICAgICAgICBmb3IgKGNvbnN0IGZpcnN0TWF0Y2hFbnRyeSBvZiAodzNjQ2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2ggfHwgW10pKSB7XG4gICAgICAgICAgaWYgKF8uaXNQbGFpbk9iamVjdChmaXJzdE1hdGNoRW50cnkpXG4gICAgICAgICAgICAgICYmIF8uaGFzKHJlbW92ZUFwcGl1bVByZWZpeGVzKGZpcnN0TWF0Y2hFbnRyeSksIHJlbW92ZUFwcGl1bVByZWZpeChkZWZhdWx0Q2FwS2V5KSkpIHtcbiAgICAgICAgICAgIGlzQ2FwQWxyZWFkeVNldCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGtleSBpcyBhbHJlYWR5IHByZXNlbnQgaW4gYWx3YXlzTWF0Y2ggZW50cmllc1xuICAgICAgICBpc0NhcEFscmVhZHlTZXQgPSBpc0NhcEFscmVhZHlTZXQgfHwgKF8uaXNQbGFpbk9iamVjdCh3M2NDYXBhYmlsaXRpZXMuYWx3YXlzTWF0Y2gpXG4gICAgICAgICAgJiYgXy5oYXMocmVtb3ZlQXBwaXVtUHJlZml4ZXModzNjQ2FwYWJpbGl0aWVzLmFsd2F5c01hdGNoKSwgcmVtb3ZlQXBwaXVtUHJlZml4KGRlZmF1bHRDYXBLZXkpKSk7XG4gICAgICAgIGlmIChpc0NhcEFscmVhZHlTZXQpIHtcbiAgICAgICAgICAvLyBTa2lwIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBwcm92aWRlZCBjYXBzXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IGFkZCB0aGUgZGVmYXVsdCBjYXBhYmlsaXR5IGlmIGl0IGlzIG5vdCBvdmVycmlkZGVuXG4gICAgICAgIGlmIChfLmlzRW1wdHkodzNjQ2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2gpKSB7XG4gICAgICAgICAgdzNjQ2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2ggPSBbe1tkZWZhdWx0Q2FwS2V5XTogZGVmYXVsdENhcFZhbHVlfV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdzNjQ2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2hbMF1bZGVmYXVsdENhcEtleV0gPSBkZWZhdWx0Q2FwVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0pTT05XUENhcHMpIHtcbiAgICAgIGpzb253cENhcGFiaWxpdGllcyA9IHsuLi5yZW1vdmVBcHBpdW1QcmVmaXhlcyhkZWZhdWx0Q2FwYWJpbGl0aWVzKSwgLi4uanNvbndwQ2FwYWJpbGl0aWVzfTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgTUpTT05XUCBjYXBzXG4gIGlmIChoYXNKU09OV1BDYXBzKSB7XG4gICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzID0gey4uLmpzb253cENhcGFiaWxpdGllc307XG4gIH1cblxuICAvLyBHZXQgVzNDIGNhcHNcbiAgaWYgKGhhc1czQ0NhcHMpIHtcbiAgICAvLyBDYWxsIHRoZSBwcm9jZXNzIGNhcGFiaWxpdGllcyBhbGdvcml0aG0gdG8gZmluZCBtYXRjaGluZyBjYXBzIG9uIHRoZSBXM0NcbiAgICAvLyAoc2VlOiBodHRwczovL2dpdGh1Yi5jb20vamxpcHBzL3NpbXBsZS13ZC1zcGVjI3Byb2Nlc3NpbmctY2FwYWJpbGl0aWVzKVxuICAgIHRyeSB7XG4gICAgICBkZXNpcmVkQ2FwcyA9IHByb2Nlc3NDYXBhYmlsaXRpZXModzNjQ2FwYWJpbGl0aWVzLCBjb25zdHJhaW50cywgdHJ1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBDb3VsZCBub3QgcGFyc2UgVzNDIGNhcGFiaWxpdGllczogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7SW52YWxpZENhcHN9ICovKHtcbiAgICAgICAgZGVzaXJlZENhcHMsXG4gICAgICAgIHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyxcbiAgICAgICAgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzLFxuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgdzNjIGNhcGFiaWxpdGllcyBwYXlsb2FkIHRoYXQgY29udGFpbnMgb25seSB0aGUgbWF0Y2hpbmcgY2FwcyBpbiBgYWx3YXlzTWF0Y2hgXG4gICAgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzID0ge1xuICAgICAgYWx3YXlzTWF0Y2g6IHsuLi5pbnNlcnRBcHBpdW1QcmVmaXhlcyhkZXNpcmVkQ2Fwcyl9LFxuICAgICAgZmlyc3RNYXRjaDogW3t9XSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7UGFyc2VkRHJpdmVyQ2Fwc30gKi8oe2Rlc2lyZWRDYXBzLCBwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMsIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcywgcHJvdG9jb2x9KTtcbn1cblxuLyoqXG4gKiBUYWtlcyBhIGNhcGFiaWxpdGllcyBvYmplY3RzIGFuZCBwcmVmaXhlcyBjYXBhYmlsaXRpZXMgd2l0aCBgYXBwaXVtOmBcbiAqIEBwYXJhbSB7Q2FwYWJpbGl0aWVzfSBjYXBzIERlc2lyZWQgY2FwYWJpbGl0aWVzIG9iamVjdFxuICogQHJldHVybnMge0FwcGl1bVczQ0NhcGFiaWxpdGllc31cbiAqL1xuZnVuY3Rpb24gaW5zZXJ0QXBwaXVtUHJlZml4ZXMgKGNhcHMpIHtcbiAgLy8gU3RhbmRhcmQsIG5vbi1wcmVmaXhlZCBjYXBhYmlsaXRpZXMgKHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvd2ViZHJpdmVyLyNkZm4tdGFibGUtb2Ytc3RhbmRhcmQtY2FwYWJpbGl0aWVzKVxuICBjb25zdCBTVEFOREFSRF9DQVBTID0gW1xuICAgICdicm93c2VyTmFtZScsXG4gICAgJ2Jyb3dzZXJWZXJzaW9uJyxcbiAgICAncGxhdGZvcm1OYW1lJyxcbiAgICAnYWNjZXB0SW5zZWN1cmVDZXJ0cycsXG4gICAgJ3BhZ2VMb2FkU3RyYXRlZ3knLFxuICAgICdwcm94eScsXG4gICAgJ3NldFdpbmRvd1JlY3QnLFxuICAgICd0aW1lb3V0cycsXG4gICAgJ3VuaGFuZGxlZFByb21wdEJlaGF2aW9yJ1xuICBdO1xuXG4gIGxldCBwcmVmaXhlZENhcHMgPSB7fTtcbiAgZm9yIChsZXQgW25hbWUsIHZhbHVlXSBvZiBfLnRvUGFpcnMoY2FwcykpIHtcbiAgICBpZiAoU1RBTkRBUkRfQ0FQUy5pbmNsdWRlcyhuYW1lKSB8fCBuYW1lLmluY2x1ZGVzKCc6JykpIHtcbiAgICAgIHByZWZpeGVkQ2Fwc1tuYW1lXSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmVmaXhlZENhcHNbYCR7VzNDX0FQUElVTV9QUkVGSVh9OiR7bmFtZX1gXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJlZml4ZWRDYXBzO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0FwcGl1bVczQ0NhcGFiaWxpdGllc30gY2Fwc1xuICogQHJldHVybnMge0NhcGFiaWxpdGllc31cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQXBwaXVtUHJlZml4ZXMgKGNhcHMpIHtcbiAgaWYgKCFfLmlzUGxhaW5PYmplY3QoY2FwcykpIHtcbiAgICByZXR1cm4gY2FwcztcbiAgfVxuXG4gIC8qKiBAdHlwZSB7Q2FwYWJpbGl0aWVzfSAqL1xuICBjb25zdCBmaXhlZENhcHMgPSB7fTtcbiAgZm9yIChsZXQgW25hbWUsIHZhbHVlXSBvZiBfLnRvUGFpcnMoY2FwcykpIHtcbiAgICBmaXhlZENhcHNbcmVtb3ZlQXBwaXVtUHJlZml4KG5hbWUpXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBmaXhlZENhcHM7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUFwcGl1bVByZWZpeCAoa2V5KSB7XG4gIGNvbnN0IHByZWZpeCA9IGAke1czQ19BUFBJVU1fUFJFRklYfTpgO1xuICByZXR1cm4gXy5zdGFydHNXaXRoKGtleSwgcHJlZml4KSA/IGtleS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkgOiBrZXk7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2thZ2VWZXJzaW9uIChwa2dOYW1lKSB7XG4gIGNvbnN0IHBrZ0luZm8gPSByZXF1aXJlKGAke3BrZ05hbWV9L3BhY2thZ2UuanNvbmApIHx8IHt9O1xuICByZXR1cm4gcGtnSW5mby52ZXJzaW9uO1xufVxuXG4vKipcbiAqIFB1bGxzIHRoZSBpbml0aWFsIHZhbHVlcyBvZiBBcHBpdW0gc2V0dGluZ3MgZnJvbSB0aGUgZ2l2ZW4gY2FwYWJpbGl0aWVzIGFyZ3VtZW50LlxuICogRWFjaCBzZXR0aW5nIGl0ZW0gbXVzdCBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuICogYHNldHRpbmdbc2V0dGluZ19uYW1lXTogc2V0dGluZ192YWx1ZWBcbiAqIFRoZSBjYXBhYmlsaXRpZXMgYXJndW1lbnQgaXRzZWxmIGdldHMgbXV0YXRlZCwgc28gaXQgZG9lcyBub3QgY29udGFpbiBwYXJzZWRcbiAqIHNldHRpbmdzIGFueW1vcmUgdG8gYXZvaWQgZnVydGhlciBwYXJzaW5nIGlzc3Vlcy5cbiAqIENoZWNrXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9ibG9iL21hc3Rlci9kb2NzL2VuL2FkdmFuY2VkLWNvbmNlcHRzL3NldHRpbmdzLm1kXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBhdmFpbGFibGUgc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtIHs/T2JqZWN0fSBjYXBzIC0gQ2FwYWJpbGl0aWVzIGRpY3Rpb25hcnkuIEl0IGlzIG11dGF0ZWQgaWZcbiAqIG9uZSBvciBtb3JlIHNldHRpbmdzIGhhdmUgYmVlbiBwdWxsZWQgZnJvbSBpdFxuICogQHJldHVybiB7T2JqZWN0fSAtIEFuIGVtcHR5IGRpY3Rpb25hcnkgaWYgdGhlIGdpdmVuIGNhcHMgY29udGFpbnMgbm9cbiAqIHNldHRpbmcgaXRlbXMgb3IgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgcGFyc2VkIEFwcGl1bSBzZXR0aW5nIG5hbWVzIGFsb25nIHdpdGhcbiAqIHRoZWlyIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gcHVsbFNldHRpbmdzIChjYXBzKSB7XG4gIGlmICghXy5pc1BsYWluT2JqZWN0KGNhcHMpIHx8IF8uaXNFbXB0eShjYXBzKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMoY2FwcykpIHtcbiAgICBjb25zdCBtYXRjaCA9IC9cXGJzZXR0aW5nc1xcWyhcXFMrKVxcXSQvLmV4ZWMoa2V5KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXN1bHRbbWF0Y2hbMV1dID0gdmFsdWU7XG4gICAgZGVsZXRlIGNhcHNba2V5XTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQge1xuICBpbnNwZWN0LCBwYXJzZUNhcHNGb3JJbm5lckRyaXZlciwgaW5zZXJ0QXBwaXVtUHJlZml4ZXMsXG4gIGdldFBhY2thZ2VWZXJzaW9uLCBwdWxsU2V0dGluZ3MsIHJlbW92ZUFwcGl1bVByZWZpeGVzXG59O1xuXG4vKipcbiAqIEB0b2RvIHByb3RvY29sIGlzIG1vcmUgc3BlY2lmaWNcbiAqIEB0eXBlZGVmIFBhcnNlZERyaXZlckNhcHNcbiAqIEBwcm9wZXJ0eSB7Q2FwYWJpbGl0aWVzfSBkZXNpcmVkQ2Fwc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb3RvY29sXG4gKiBAcHJvcGVydHkge2FueX0gW3Byb2Nlc3NlZEpzb253cENhcGFiaWxpdGllc11cbiAqIEBwcm9wZXJ0eSB7VzNDQ2FwYWJpbGl0aWVzfSBbcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzXVxuICovXG5cbi8qKlxuICogQHRvZG8gcHJvdG9jb2wgaXMgbW9yZSBzcGVjaWZpY1xuICogQHR5cGVkZWYgSW52YWxpZENhcHNcbiAqIEBwcm9wZXJ0eSB7RXJyb3J9IGVycm9yXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvdG9jb2xcbiAqIEBwcm9wZXJ0eSB7Q2FwYWJpbGl0aWVzfSBbZGVzaXJlZENhcHNdXG4gKiBAcHJvcGVydHkge2FueX0gW3Byb2Nlc3NlZEpzb253cENhcGFiaWxpdGllc11cbiAqIEBwcm9wZXJ0eSB7VzNDQ2FwYWJpbGl0aWVzfSBbcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlczQ0NhcGFiaWxpdGllc30gVzNDQ2FwYWJpbGl0aWVzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ2FwYWJpbGl0aWVzfSBDYXBhYmlsaXRpZXNcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5BcHBpdW1XM0NDYXBhYmlsaXRpZXN9IEFwcGl1bVczQ0NhcGFiaWxpdGllc1xuICovXG4iXX0=