appium-ios-simulator 4.1.3 → 4.1.5

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 (52) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/README.md +0 -2
  3. package/build/index.js +1 -7
  4. package/build/lib/calendar.js +4 -18
  5. package/build/lib/calendar.js.map +1 -0
  6. package/build/lib/certificate.js +2 -33
  7. package/build/lib/certificate.js.map +1 -0
  8. package/build/lib/defaults-utils.js +1 -26
  9. package/build/lib/defaults-utils.js.map +1 -0
  10. package/build/lib/extensions/index.js +1 -8
  11. package/build/lib/extensions/index.js.map +1 -0
  12. package/build/lib/extensions/isolate-sim.js +1 -11
  13. package/build/lib/extensions/isolate-sim.js.map +1 -0
  14. package/build/lib/extensions/prepare-apps.js +1 -23
  15. package/build/lib/extensions/prepare-apps.js.map +1 -0
  16. package/build/lib/geolocation.js +1 -14
  17. package/build/lib/geolocation.js.map +1 -0
  18. package/build/lib/logger.js +1 -9
  19. package/build/lib/logger.js.map +1 -0
  20. package/build/lib/permissions.js +1 -24
  21. package/build/lib/permissions.js.map +1 -0
  22. package/build/lib/settings.js +4 -70
  23. package/build/lib/settings.js.map +1 -0
  24. package/build/lib/simulator-xcode-10.js +1 -22
  25. package/build/lib/simulator-xcode-10.js.map +1 -0
  26. package/build/lib/simulator-xcode-11.4.js +3 -9
  27. package/build/lib/simulator-xcode-11.4.js.map +1 -0
  28. package/build/lib/simulator-xcode-11.js +1 -9
  29. package/build/lib/simulator-xcode-11.js.map +1 -0
  30. package/build/lib/simulator-xcode-14.js +1 -7
  31. package/build/lib/simulator-xcode-14.js.map +1 -0
  32. package/build/lib/simulator-xcode-6.js +12 -209
  33. package/build/lib/simulator-xcode-6.js.map +1 -0
  34. package/build/lib/simulator-xcode-7.3.js +1 -7
  35. package/build/lib/simulator-xcode-7.3.js.map +1 -0
  36. package/build/lib/simulator-xcode-7.js +1 -9
  37. package/build/lib/simulator-xcode-7.js.map +1 -0
  38. package/build/lib/simulator-xcode-8.js +7 -32
  39. package/build/lib/simulator-xcode-8.js.map +1 -0
  40. package/build/lib/simulator-xcode-9.3.js +1 -14
  41. package/build/lib/simulator-xcode-9.3.js.map +1 -0
  42. package/build/lib/simulator-xcode-9.js +1 -104
  43. package/build/lib/simulator-xcode-9.js.map +1 -0
  44. package/build/lib/simulator.js +1 -36
  45. package/build/lib/simulator.js.map +1 -0
  46. package/build/lib/tail-until.js +1 -8
  47. package/build/lib/tail-until.js.map +1 -0
  48. package/build/lib/tcc-db.js +1 -14
  49. package/build/lib/tcc-db.js.map +1 -0
  50. package/build/lib/utils.js +3 -71
  51. package/build/lib/utils.js.map +1 -0
  52. package/package.json +4 -2
package/CHANGELOG.md ADDED
@@ -0,0 +1 @@
1
+ ## [4.1.5](https://github.com/appium/appium-ios-simulator/compare/v4.1.4...v4.1.5) (2022-11-06)
package/README.md CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  [![NPM version](http://img.shields.io/npm/v/appium-ios-simulator.svg)](https://npmjs.org/package/appium-ios-simulator)
4
4
  [![Downloads](http://img.shields.io/npm/dm/appium-ios-simulator.svg)](https://npmjs.org/package/appium-ios-simulator)
5
- [![Dependency Status](https://david-dm.org/appium/appium-ios-simulator/master.svg)](https://david-dm.org/appium/appium-ios-simulator/master)
6
- [![devDependency Status](https://david-dm.org/appium/appium-ios-simulator/master/dev-status.svg)](https://david-dm.org/appium/appium-ios-simulator/master#info=devDependencies)
7
5
 
8
6
  [![Build Status](https://api.travis-ci.org/appium/appium-ios-simulator.png?branch=master)](https://travis-ci.org/appium/appium-ios-simulator)
9
7
 
package/build/index.js CHANGED
@@ -4,17 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.uninstallSSLCert = exports.simExists = exports.killAllSimulators = exports.installSSLCert = exports.hasSSLCert = exports.getSimulator = exports.getDeviceString = exports.endAllSimulatorDaemons = exports.BOOT_COMPLETED_EVENT = void 0;
7
-
8
7
  require("source-map-support/register");
9
-
10
8
  var sim = _interopRequireWildcard(require("./lib/simulator"));
11
-
12
9
  var utils = _interopRequireWildcard(require("./lib/utils"));
13
-
14
10
  var sim6 = _interopRequireWildcard(require("./lib/simulator-xcode-6"));
15
-
16
11
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
-
18
12
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
13
 
20
14
  const {
@@ -41,4 +35,4 @@ const {
41
35
  BOOT_COMPLETED_EVENT
42
36
  } = sim6;
43
37
  exports.BOOT_COMPLETED_EVENT = BOOT_COMPLETED_EVENT;
44
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRTaW11bGF0b3IiLCJnZXREZXZpY2VTdHJpbmciLCJzaW0iLCJraWxsQWxsU2ltdWxhdG9ycyIsImVuZEFsbFNpbXVsYXRvckRhZW1vbnMiLCJzaW1FeGlzdHMiLCJpbnN0YWxsU1NMQ2VydCIsInVuaW5zdGFsbFNTTENlcnQiLCJoYXNTU0xDZXJ0IiwidXRpbHMiLCJCT09UX0NPTVBMRVRFRF9FVkVOVCIsInNpbTYiXSwic291cmNlcyI6WyIuLi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bWFpblxuXG5pbXBvcnQgKiBhcyBzaW0gZnJvbSAnLi9saWIvc2ltdWxhdG9yJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vbGliL3V0aWxzJztcbmltcG9ydCAqIGFzIHNpbTYgZnJvbSAnLi9saWIvc2ltdWxhdG9yLXhjb2RlLTYnO1xuXG5cbmNvbnN0IHsgZ2V0U2ltdWxhdG9yLCBnZXREZXZpY2VTdHJpbmcgfSA9IHNpbTtcbmNvbnN0IHsga2lsbEFsbFNpbXVsYXRvcnMsIGVuZEFsbFNpbXVsYXRvckRhZW1vbnMsIHNpbUV4aXN0cywgaW5zdGFsbFNTTENlcnQsIHVuaW5zdGFsbFNTTENlcnQsIGhhc1NTTENlcnQgfSA9IHV0aWxzO1xuY29uc3QgeyBCT09UX0NPTVBMRVRFRF9FVkVOVCB9ID0gc2ltNjtcblxuZXhwb3J0IHtcbiAgZ2V0U2ltdWxhdG9yLFxuICBnZXREZXZpY2VTdHJpbmcsXG4gIGtpbGxBbGxTaW11bGF0b3JzLFxuICBlbmRBbGxTaW11bGF0b3JEYWVtb25zLFxuICBzaW1FeGlzdHMsXG4gIGluc3RhbGxTU0xDZXJ0LFxuICB1bmluc3RhbGxTU0xDZXJ0LFxuICBoYXNTU0xDZXJ0LFxuICBCT09UX0NPTVBMRVRFRF9FVkVOVFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7Ozs7OztBQUdBLE1BQU07RUFBRUEsWUFBRjtFQUFnQkM7QUFBaEIsSUFBb0NDLEdBQTFDOzs7QUFDQSxNQUFNO0VBQUVDLGlCQUFGO0VBQXFCQyxzQkFBckI7RUFBNkNDLFNBQTdDO0VBQXdEQyxjQUF4RDtFQUF3RUMsZ0JBQXhFO0VBQTBGQztBQUExRixJQUF5R0MsS0FBL0c7Ozs7Ozs7QUFDQSxNQUFNO0VBQUVDO0FBQUYsSUFBMkJDLElBQWpDIn0=
38
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRTaW11bGF0b3IiLCJnZXREZXZpY2VTdHJpbmciLCJzaW0iLCJraWxsQWxsU2ltdWxhdG9ycyIsImVuZEFsbFNpbXVsYXRvckRhZW1vbnMiLCJzaW1FeGlzdHMiLCJpbnN0YWxsU1NMQ2VydCIsInVuaW5zdGFsbFNTTENlcnQiLCJoYXNTU0xDZXJ0IiwidXRpbHMiLCJCT09UX0NPTVBMRVRFRF9FVkVOVCIsInNpbTYiXSwic291cmNlcyI6WyIuLi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bWFpblxuXG5pbXBvcnQgKiBhcyBzaW0gZnJvbSAnLi9saWIvc2ltdWxhdG9yJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vbGliL3V0aWxzJztcbmltcG9ydCAqIGFzIHNpbTYgZnJvbSAnLi9saWIvc2ltdWxhdG9yLXhjb2RlLTYnO1xuXG5cbmNvbnN0IHsgZ2V0U2ltdWxhdG9yLCBnZXREZXZpY2VTdHJpbmcgfSA9IHNpbTtcbmNvbnN0IHsga2lsbEFsbFNpbXVsYXRvcnMsIGVuZEFsbFNpbXVsYXRvckRhZW1vbnMsIHNpbUV4aXN0cywgaW5zdGFsbFNTTENlcnQsIHVuaW5zdGFsbFNTTENlcnQsIGhhc1NTTENlcnQgfSA9IHV0aWxzO1xuY29uc3QgeyBCT09UX0NPTVBMRVRFRF9FVkVOVCB9ID0gc2ltNjtcblxuZXhwb3J0IHtcbiAgZ2V0U2ltdWxhdG9yLFxuICBnZXREZXZpY2VTdHJpbmcsXG4gIGtpbGxBbGxTaW11bGF0b3JzLFxuICBlbmRBbGxTaW11bGF0b3JEYWVtb25zLFxuICBzaW1FeGlzdHMsXG4gIGluc3RhbGxTU0xDZXJ0LFxuICB1bmluc3RhbGxTU0xDZXJ0LFxuICBoYXNTU0xDZXJ0LFxuICBCT09UX0NPTVBMRVRFRF9FVkVOVFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBO0FBQ0E7QUFDQTtBQUFnRDtBQUFBOztBQUdoRCxNQUFNO0VBQUVBLFlBQVk7RUFBRUM7QUFBZ0IsQ0FBQyxHQUFHQyxHQUFHO0FBQUM7QUFBQTtBQUM5QyxNQUFNO0VBQUVDLGlCQUFpQjtFQUFFQyxzQkFBc0I7RUFBRUMsU0FBUztFQUFFQyxjQUFjO0VBQUVDLGdCQUFnQjtFQUFFQztBQUFXLENBQUMsR0FBR0MsS0FBSztBQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNySCxNQUFNO0VBQUVDO0FBQXFCLENBQUMsR0FBR0MsSUFBSTtBQUFDIn0=
@@ -1,39 +1,29 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = void 0;
9
-
10
8
  require("source-map-support/register");
11
-
12
9
  var _lodash = _interopRequireDefault(require("lodash"));
13
-
14
10
  var _logger = _interopRequireDefault(require("./logger"));
15
-
16
11
  var _tccDb = _interopRequireDefault(require("./tcc-db"));
17
-
18
12
  class Calendar {
19
13
  constructor(xcodeVersion, sharedResourcesDir) {
20
14
  this.xcodeVersion = xcodeVersion;
21
15
  this.tccDb = new _tccDb.default(xcodeVersion, sharedResourcesDir);
22
16
  }
23
-
24
17
  async getCalendarRowCount(bundleID) {
25
18
  const count = await this.tccDb.execQuery(`SELECT count(*) FROM access WHERE client='?' AND service='kTCCServiceCalendar';`, bundleID);
26
19
  return parseInt(count.split('=')[1], 10);
27
20
  }
28
-
29
21
  async hasCalendarAccess(bundleID) {
30
22
  const count = await this.tccDb.execQuery(`SELECT count(*) FROM access WHERE client='?' AND allowed=1 AND service='kTCCServiceCalendar';`, bundleID);
31
23
  return parseInt(count.split('=')[1], 10) > 0;
32
24
  }
33
-
34
25
  async enableCalendarAccess(bundleID) {
35
26
  let query;
36
-
37
27
  if ((await this.getCalendarRowCount(bundleID)) > 0) {
38
28
  query = `UPDATE 'access' SET
39
29
  service='kTCCServiceCalendar',
@@ -44,32 +34,28 @@ class Calendar {
44
34
  WHERE client='?' AND service='kTCCServiceCalendar'`;
45
35
  } else {
46
36
  let count = this.columnCount;
47
-
48
37
  if (!_lodash.default.isNumber(this.columnCount)) {
49
38
  try {
50
39
  const stdout = await this.tccDb.execQuery(`pragma table_info('access')`);
51
- count = this.columnCount = stdout.trim().split('cid').filter(record => !_lodash.default.isEmpty(record)).length;
40
+ count = this.columnCount = stdout.trim()
41
+ .split('cid')
42
+ .filter(record => !_lodash.default.isEmpty(record)).length;
52
43
  } catch (err) {
53
44
  count = this.xcodeVersion.major < 10 ? 7 : 11;
54
-
55
45
  _logger.default.warn(`Unable to find Calendar access column count: ${err.message}`);
56
46
  }
57
47
  }
58
48
 
59
49
  query = `INSERT INTO 'access' VALUES ('kTCCServiceCalendar', '?', 0, 1, 1, ${_lodash.default.range(0, count - 5, 0).join(', ')});`;
60
50
  }
61
-
62
51
  await this.tccDb.execQuery(query, bundleID);
63
52
  }
64
-
65
53
  async disableCalendarAccess(bundleID) {
66
54
  if ((await this.getCalendarRowCount(bundleID)) > 0) {
67
55
  await this.tccDb.execQuery(`DELETE FROM 'access' WHERE client='?' AND service='kTCCServiceCalendar'`, bundleID);
68
56
  }
69
57
  }
70
-
71
58
  }
72
-
73
59
  var _default = Calendar;
74
60
  exports.default = _default;
75
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDYWxlbmRhciIsImNvbnN0cnVjdG9yIiwieGNvZGVWZXJzaW9uIiwic2hhcmVkUmVzb3VyY2VzRGlyIiwidGNjRGIiLCJUQ0NEQiIsImdldENhbGVuZGFyUm93Q291bnQiLCJidW5kbGVJRCIsImNvdW50IiwiZXhlY1F1ZXJ5IiwicGFyc2VJbnQiLCJzcGxpdCIsImhhc0NhbGVuZGFyQWNjZXNzIiwiZW5hYmxlQ2FsZW5kYXJBY2Nlc3MiLCJxdWVyeSIsImNvbHVtbkNvdW50IiwiXyIsImlzTnVtYmVyIiwic3Rkb3V0IiwidHJpbSIsImZpbHRlciIsInJlY29yZCIsImlzRW1wdHkiLCJsZW5ndGgiLCJlcnIiLCJtYWpvciIsImxvZyIsIndhcm4iLCJtZXNzYWdlIiwicmFuZ2UiLCJqb2luIiwiZGlzYWJsZUNhbGVuZGFyQWNjZXNzIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2NhbGVuZGFyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBUQ0NEQiBmcm9tICcuL3RjYy1kYic7XG5cblxuY2xhc3MgQ2FsZW5kYXIge1xuXG4gIGNvbnN0cnVjdG9yICh4Y29kZVZlcnNpb24sIHNoYXJlZFJlc291cmNlc0Rpcikge1xuICAgIHRoaXMueGNvZGVWZXJzaW9uID0geGNvZGVWZXJzaW9uO1xuICAgIHRoaXMudGNjRGIgPSBuZXcgVENDREIoeGNvZGVWZXJzaW9uLCBzaGFyZWRSZXNvdXJjZXNEaXIpO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q2FsZW5kYXJSb3dDb3VudCAoYnVuZGxlSUQpIHtcbiAgICBjb25zdCBjb3VudCA9IGF3YWl0IHRoaXMudGNjRGIuZXhlY1F1ZXJ5KGBTRUxFQ1QgY291bnQoKikgRlJPTSBhY2Nlc3MgV0hFUkUgY2xpZW50PSc/JyBBTkQgc2VydmljZT0na1RDQ1NlcnZpY2VDYWxlbmRhcic7YCwgYnVuZGxlSUQpO1xuICAgIHJldHVybiBwYXJzZUludChjb3VudC5zcGxpdCgnPScpWzFdLCAxMCk7XG4gIH1cblxuICBhc3luYyBoYXNDYWxlbmRhckFjY2VzcyAoYnVuZGxlSUQpIHtcbiAgICBjb25zdCBjb3VudCA9IGF3YWl0IHRoaXMudGNjRGIuZXhlY1F1ZXJ5KGBTRUxFQ1QgY291bnQoKikgRlJPTSBhY2Nlc3MgV0hFUkUgY2xpZW50PSc/JyBBTkQgYWxsb3dlZD0xIEFORCBzZXJ2aWNlPSdrVENDU2VydmljZUNhbGVuZGFyJztgLCBidW5kbGVJRCk7XG4gICAgcmV0dXJuIHBhcnNlSW50KGNvdW50LnNwbGl0KCc9JylbMV0sIDEwKSA+IDA7XG4gIH1cblxuICBhc3luYyBlbmFibGVDYWxlbmRhckFjY2VzcyAoYnVuZGxlSUQpIHtcbiAgICBsZXQgcXVlcnk7XG4gICAgaWYgKChhd2FpdCB0aGlzLmdldENhbGVuZGFyUm93Q291bnQoYnVuZGxlSUQpKSA+IDApIHtcbiAgICAgIHF1ZXJ5ID0gYFVQREFURSAnYWNjZXNzJyBTRVRcbiAgICAgICAgc2VydmljZT0na1RDQ1NlcnZpY2VDYWxlbmRhcicsXG4gICAgICAgIGNsaWVudF90eXBlPTAsXG4gICAgICAgIGFsbG93ZWQ9MSxcbiAgICAgICAgcHJvbXB0X2NvdW50PTEsXG4gICAgICAgIGNzcmVxPTBcbiAgICAgIFdIRVJFIGNsaWVudD0nPycgQU5EIHNlcnZpY2U9J2tUQ0NTZXJ2aWNlQ2FsZW5kYXInYDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGNvdW50ID0gdGhpcy5jb2x1bW5Db3VudDtcbiAgICAgIGlmICghXy5pc051bWJlcih0aGlzLmNvbHVtbkNvdW50KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMudGNjRGIuZXhlY1F1ZXJ5KGBwcmFnbWEgdGFibGVfaW5mbygnYWNjZXNzJylgKTtcbiAgICAgICAgICAvLyBzdGRvdXQgaGFzIGEgbnVtYmVyIG9mIHJlY29yZHMsIGVhY2ggc3RhcnRpbmcgd2l0aCBgY2lkYFxuICAgICAgICAgIC8vICAgICAgIGNpZCA9IDBcbiAgICAgICAgICAvLyAgICAgICBuYW1lID0gc2VydmljZVxuICAgICAgICAgIC8vICAgICAgIHR5cGUgPSBURVhUXG4gICAgICAgICAgLy8gICAgICAgbm90bnVsbCA9IDFcbiAgICAgICAgICAvLyAgICAgICBkZmx0X3ZhbHVlID1cbiAgICAgICAgICAvLyAgICAgICBwayA9IDFcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vICAgICAgIGNpZCA9IDFcbiAgICAgICAgICAvLyAgICAgICBuYW1lID0gY2xpZW50XG4gICAgICAgICAgLy8gICAgICAgdHlwZSA9IFRFWFRcbiAgICAgICAgICAvLyAgICAgICBub3RudWxsID0gMVxuICAgICAgICAgIC8vICAgICAgIGRmbHRfdmFsdWUgPVxuICAgICAgICAgIC8vICAgICAgIHBrID0gMlxuICAgICAgICAgIGNvdW50ID0gdGhpcy5jb2x1bW5Db3VudCA9XG4gICAgICAgICAgICBzdGRvdXRcbiAgICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgICAvLyBnZXQgZWFjaCByZWNvcmQncyBiZWdpbm5pbmdcbiAgICAgICAgICAgICAgLnNwbGl0KCdjaWQnKVxuICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGVtcHR5IHJvdyAodXN1YWxseSwgdGhlIGZpcnN0KVxuICAgICAgICAgICAgICAuZmlsdGVyKChyZWNvcmQpID0+ICFfLmlzRW1wdHkocmVjb3JkKSlcbiAgICAgICAgICAgICAgLmxlbmd0aDtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gdXNlIGRlZmF1bHRzLCBidXQgZG8gbm90IHNhdmVcbiAgICAgICAgICBjb3VudCA9IHRoaXMueGNvZGVWZXJzaW9uLm1ham9yIDwgMTAgPyA3IDogMTE7XG4gICAgICAgICAgbG9nLndhcm4oYFVuYWJsZSB0byBmaW5kIENhbGVuZGFyIGFjY2VzcyBjb2x1bW4gY291bnQ6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZmlsbCBpbiB0aGUgcXVlcnkgd2l0aCAwJ3MgZm9yIGNvbHVtbnMgYWZ0ZXIgdGhlIDUgd2UgY2FyZSBhYm91dFxuICAgICAgcXVlcnkgPSBgSU5TRVJUIElOVE8gJ2FjY2VzcycgVkFMVUVTICgna1RDQ1NlcnZpY2VDYWxlbmRhcicsICc/JywgMCwgMSwgMSwgJHtfLnJhbmdlKDAsIGNvdW50IC0gNSwgMCkuam9pbignLCAnKX0pO2A7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMudGNjRGIuZXhlY1F1ZXJ5KHF1ZXJ5LCBidW5kbGVJRCk7XG4gIH1cblxuICBhc3luYyBkaXNhYmxlQ2FsZW5kYXJBY2Nlc3MgKGJ1bmRsZUlEKSB7XG4gICAgaWYgKChhd2FpdCB0aGlzLmdldENhbGVuZGFyUm93Q291bnQoYnVuZGxlSUQpKSA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMudGNjRGIuZXhlY1F1ZXJ5KGBERUxFVEUgRlJPTSAnYWNjZXNzJyBXSEVSRSBjbGllbnQ9Jz8nIEFORCBzZXJ2aWNlPSdrVENDU2VydmljZUNhbGVuZGFyJ2AsIGJ1bmRsZUlEKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2FsZW5kYXI7Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLFFBQU4sQ0FBZTtFQUViQyxXQUFXLENBQUVDLFlBQUYsRUFBZ0JDLGtCQUFoQixFQUFvQztJQUM3QyxLQUFLRCxZQUFMLEdBQW9CQSxZQUFwQjtJQUNBLEtBQUtFLEtBQUwsR0FBYSxJQUFJQyxjQUFKLENBQVVILFlBQVYsRUFBd0JDLGtCQUF4QixDQUFiO0VBQ0Q7O0VBRXdCLE1BQW5CRyxtQkFBbUIsQ0FBRUMsUUFBRixFQUFZO0lBQ25DLE1BQU1DLEtBQUssR0FBRyxNQUFNLEtBQUtKLEtBQUwsQ0FBV0ssU0FBWCxDQUFzQixpRkFBdEIsRUFBd0dGLFFBQXhHLENBQXBCO0lBQ0EsT0FBT0csUUFBUSxDQUFDRixLQUFLLENBQUNHLEtBQU4sQ0FBWSxHQUFaLEVBQWlCLENBQWpCLENBQUQsRUFBc0IsRUFBdEIsQ0FBZjtFQUNEOztFQUVzQixNQUFqQkMsaUJBQWlCLENBQUVMLFFBQUYsRUFBWTtJQUNqQyxNQUFNQyxLQUFLLEdBQUcsTUFBTSxLQUFLSixLQUFMLENBQVdLLFNBQVgsQ0FBc0IsK0ZBQXRCLEVBQXNIRixRQUF0SCxDQUFwQjtJQUNBLE9BQU9HLFFBQVEsQ0FBQ0YsS0FBSyxDQUFDRyxLQUFOLENBQVksR0FBWixFQUFpQixDQUFqQixDQUFELEVBQXNCLEVBQXRCLENBQVIsR0FBb0MsQ0FBM0M7RUFDRDs7RUFFeUIsTUFBcEJFLG9CQUFvQixDQUFFTixRQUFGLEVBQVk7SUFDcEMsSUFBSU8sS0FBSjs7SUFDQSxJQUFJLENBQUMsTUFBTSxLQUFLUixtQkFBTCxDQUF5QkMsUUFBekIsQ0FBUCxJQUE2QyxDQUFqRCxFQUFvRDtNQUNsRE8sS0FBSyxHQUFJO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQU5NO0lBT0QsQ0FSRCxNQVFPO01BQ0wsSUFBSU4sS0FBSyxHQUFHLEtBQUtPLFdBQWpCOztNQUNBLElBQUksQ0FBQ0MsZUFBQSxDQUFFQyxRQUFGLENBQVcsS0FBS0YsV0FBaEIsQ0FBTCxFQUFtQztRQUNqQyxJQUFJO1VBQ0YsTUFBTUcsTUFBTSxHQUFHLE1BQU0sS0FBS2QsS0FBTCxDQUFXSyxTQUFYLENBQXNCLDZCQUF0QixDQUFyQjtVQWVBRCxLQUFLLEdBQUcsS0FBS08sV0FBTCxHQUNORyxNQUFNLENBQ0hDLElBREgsR0FHR1IsS0FISCxDQUdTLEtBSFQsRUFLR1MsTUFMSCxDQUtXQyxNQUFELElBQVksQ0FBQ0wsZUFBQSxDQUFFTSxPQUFGLENBQVVELE1BQVYsQ0FMdkIsRUFNR0UsTUFQTDtRQVFELENBeEJELENBd0JFLE9BQU9DLEdBQVAsRUFBWTtVQUVaaEIsS0FBSyxHQUFHLEtBQUtOLFlBQUwsQ0FBa0J1QixLQUFsQixHQUEwQixFQUExQixHQUErQixDQUEvQixHQUFtQyxFQUEzQzs7VUFDQUMsZUFBQSxDQUFJQyxJQUFKLENBQVUsZ0RBQStDSCxHQUFHLENBQUNJLE9BQVEsRUFBckU7UUFDRDtNQUNGOztNQUdEZCxLQUFLLEdBQUkscUVBQW9FRSxlQUFBLENBQUVhLEtBQUYsQ0FBUSxDQUFSLEVBQVdyQixLQUFLLEdBQUcsQ0FBbkIsRUFBc0IsQ0FBdEIsRUFBeUJzQixJQUF6QixDQUE4QixJQUE5QixDQUFvQyxJQUFqSDtJQUNEOztJQUNELE1BQU0sS0FBSzFCLEtBQUwsQ0FBV0ssU0FBWCxDQUFxQkssS0FBckIsRUFBNEJQLFFBQTVCLENBQU47RUFDRDs7RUFFMEIsTUFBckJ3QixxQkFBcUIsQ0FBRXhCLFFBQUYsRUFBWTtJQUNyQyxJQUFJLENBQUMsTUFBTSxLQUFLRCxtQkFBTCxDQUF5QkMsUUFBekIsQ0FBUCxJQUE2QyxDQUFqRCxFQUFvRDtNQUNsRCxNQUFNLEtBQUtILEtBQUwsQ0FBV0ssU0FBWCxDQUFzQix5RUFBdEIsRUFBZ0dGLFFBQWhHLENBQU47SUFDRDtFQUNGOztBQXZFWTs7ZUEwRUFQLFEifQ==
61
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDYWxlbmRhciIsImNvbnN0cnVjdG9yIiwieGNvZGVWZXJzaW9uIiwic2hhcmVkUmVzb3VyY2VzRGlyIiwidGNjRGIiLCJUQ0NEQiIsImdldENhbGVuZGFyUm93Q291bnQiLCJidW5kbGVJRCIsImNvdW50IiwiZXhlY1F1ZXJ5IiwicGFyc2VJbnQiLCJzcGxpdCIsImhhc0NhbGVuZGFyQWNjZXNzIiwiZW5hYmxlQ2FsZW5kYXJBY2Nlc3MiLCJxdWVyeSIsImNvbHVtbkNvdW50IiwiXyIsImlzTnVtYmVyIiwic3Rkb3V0IiwidHJpbSIsImZpbHRlciIsInJlY29yZCIsImlzRW1wdHkiLCJsZW5ndGgiLCJlcnIiLCJtYWpvciIsImxvZyIsIndhcm4iLCJtZXNzYWdlIiwicmFuZ2UiLCJqb2luIiwiZGlzYWJsZUNhbGVuZGFyQWNjZXNzIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2NhbGVuZGFyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBUQ0NEQiBmcm9tICcuL3RjYy1kYic7XG5cblxuY2xhc3MgQ2FsZW5kYXIge1xuXG4gIGNvbnN0cnVjdG9yICh4Y29kZVZlcnNpb24sIHNoYXJlZFJlc291cmNlc0Rpcikge1xuICAgIHRoaXMueGNvZGVWZXJzaW9uID0geGNvZGVWZXJzaW9uO1xuICAgIHRoaXMudGNjRGIgPSBuZXcgVENDREIoeGNvZGVWZXJzaW9uLCBzaGFyZWRSZXNvdXJjZXNEaXIpO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q2FsZW5kYXJSb3dDb3VudCAoYnVuZGxlSUQpIHtcbiAgICBjb25zdCBjb3VudCA9IGF3YWl0IHRoaXMudGNjRGIuZXhlY1F1ZXJ5KGBTRUxFQ1QgY291bnQoKikgRlJPTSBhY2Nlc3MgV0hFUkUgY2xpZW50PSc/JyBBTkQgc2VydmljZT0na1RDQ1NlcnZpY2VDYWxlbmRhcic7YCwgYnVuZGxlSUQpO1xuICAgIHJldHVybiBwYXJzZUludChjb3VudC5zcGxpdCgnPScpWzFdLCAxMCk7XG4gIH1cblxuICBhc3luYyBoYXNDYWxlbmRhckFjY2VzcyAoYnVuZGxlSUQpIHtcbiAgICBjb25zdCBjb3VudCA9IGF3YWl0IHRoaXMudGNjRGIuZXhlY1F1ZXJ5KGBTRUxFQ1QgY291bnQoKikgRlJPTSBhY2Nlc3MgV0hFUkUgY2xpZW50PSc/JyBBTkQgYWxsb3dlZD0xIEFORCBzZXJ2aWNlPSdrVENDU2VydmljZUNhbGVuZGFyJztgLCBidW5kbGVJRCk7XG4gICAgcmV0dXJuIHBhcnNlSW50KGNvdW50LnNwbGl0KCc9JylbMV0sIDEwKSA+IDA7XG4gIH1cblxuICBhc3luYyBlbmFibGVDYWxlbmRhckFjY2VzcyAoYnVuZGxlSUQpIHtcbiAgICBsZXQgcXVlcnk7XG4gICAgaWYgKChhd2FpdCB0aGlzLmdldENhbGVuZGFyUm93Q291bnQoYnVuZGxlSUQpKSA+IDApIHtcbiAgICAgIHF1ZXJ5ID0gYFVQREFURSAnYWNjZXNzJyBTRVRcbiAgICAgICAgc2VydmljZT0na1RDQ1NlcnZpY2VDYWxlbmRhcicsXG4gICAgICAgIGNsaWVudF90eXBlPTAsXG4gICAgICAgIGFsbG93ZWQ9MSxcbiAgICAgICAgcHJvbXB0X2NvdW50PTEsXG4gICAgICAgIGNzcmVxPTBcbiAgICAgIFdIRVJFIGNsaWVudD0nPycgQU5EIHNlcnZpY2U9J2tUQ0NTZXJ2aWNlQ2FsZW5kYXInYDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGNvdW50ID0gdGhpcy5jb2x1bW5Db3VudDtcbiAgICAgIGlmICghXy5pc051bWJlcih0aGlzLmNvbHVtbkNvdW50KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMudGNjRGIuZXhlY1F1ZXJ5KGBwcmFnbWEgdGFibGVfaW5mbygnYWNjZXNzJylgKTtcbiAgICAgICAgICAvLyBzdGRvdXQgaGFzIGEgbnVtYmVyIG9mIHJlY29yZHMsIGVhY2ggc3RhcnRpbmcgd2l0aCBgY2lkYFxuICAgICAgICAgIC8vICAgICAgIGNpZCA9IDBcbiAgICAgICAgICAvLyAgICAgICBuYW1lID0gc2VydmljZVxuICAgICAgICAgIC8vICAgICAgIHR5cGUgPSBURVhUXG4gICAgICAgICAgLy8gICAgICAgbm90bnVsbCA9IDFcbiAgICAgICAgICAvLyAgICAgICBkZmx0X3ZhbHVlID1cbiAgICAgICAgICAvLyAgICAgICBwayA9IDFcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vICAgICAgIGNpZCA9IDFcbiAgICAgICAgICAvLyAgICAgICBuYW1lID0gY2xpZW50XG4gICAgICAgICAgLy8gICAgICAgdHlwZSA9IFRFWFRcbiAgICAgICAgICAvLyAgICAgICBub3RudWxsID0gMVxuICAgICAgICAgIC8vICAgICAgIGRmbHRfdmFsdWUgPVxuICAgICAgICAgIC8vICAgICAgIHBrID0gMlxuICAgICAgICAgIGNvdW50ID0gdGhpcy5jb2x1bW5Db3VudCA9XG4gICAgICAgICAgICBzdGRvdXRcbiAgICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgICAvLyBnZXQgZWFjaCByZWNvcmQncyBiZWdpbm5pbmdcbiAgICAgICAgICAgICAgLnNwbGl0KCdjaWQnKVxuICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGVtcHR5IHJvdyAodXN1YWxseSwgdGhlIGZpcnN0KVxuICAgICAgICAgICAgICAuZmlsdGVyKChyZWNvcmQpID0+ICFfLmlzRW1wdHkocmVjb3JkKSlcbiAgICAgICAgICAgICAgLmxlbmd0aDtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gdXNlIGRlZmF1bHRzLCBidXQgZG8gbm90IHNhdmVcbiAgICAgICAgICBjb3VudCA9IHRoaXMueGNvZGVWZXJzaW9uLm1ham9yIDwgMTAgPyA3IDogMTE7XG4gICAgICAgICAgbG9nLndhcm4oYFVuYWJsZSB0byBmaW5kIENhbGVuZGFyIGFjY2VzcyBjb2x1bW4gY291bnQ6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZmlsbCBpbiB0aGUgcXVlcnkgd2l0aCAwJ3MgZm9yIGNvbHVtbnMgYWZ0ZXIgdGhlIDUgd2UgY2FyZSBhYm91dFxuICAgICAgcXVlcnkgPSBgSU5TRVJUIElOVE8gJ2FjY2VzcycgVkFMVUVTICgna1RDQ1NlcnZpY2VDYWxlbmRhcicsICc/JywgMCwgMSwgMSwgJHtfLnJhbmdlKDAsIGNvdW50IC0gNSwgMCkuam9pbignLCAnKX0pO2A7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMudGNjRGIuZXhlY1F1ZXJ5KHF1ZXJ5LCBidW5kbGVJRCk7XG4gIH1cblxuICBhc3luYyBkaXNhYmxlQ2FsZW5kYXJBY2Nlc3MgKGJ1bmRsZUlEKSB7XG4gICAgaWYgKChhd2FpdCB0aGlzLmdldENhbGVuZGFyUm93Q291bnQoYnVuZGxlSUQpKSA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMudGNjRGIuZXhlY1F1ZXJ5KGBERUxFVEUgRlJPTSAnYWNjZXNzJyBXSEVSRSBjbGllbnQ9Jz8nIEFORCBzZXJ2aWNlPSdrVENDU2VydmljZUNhbGVuZGFyJ2AsIGJ1bmRsZUlEKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2FsZW5kYXI7Il0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUdBLE1BQU1BLFFBQVEsQ0FBQztFQUViQyxXQUFXLENBQUVDLFlBQVksRUFBRUMsa0JBQWtCLEVBQUU7SUFDN0MsSUFBSSxDQUFDRCxZQUFZLEdBQUdBLFlBQVk7SUFDaEMsSUFBSSxDQUFDRSxLQUFLLEdBQUcsSUFBSUMsY0FBSyxDQUFDSCxZQUFZLEVBQUVDLGtCQUFrQixDQUFDO0VBQzFEO0VBRUEsTUFBTUcsbUJBQW1CLENBQUVDLFFBQVEsRUFBRTtJQUNuQyxNQUFNQyxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUNKLEtBQUssQ0FBQ0ssU0FBUyxDQUFFLGlGQUFnRixFQUFFRixRQUFRLENBQUM7SUFDckksT0FBT0csUUFBUSxDQUFDRixLQUFLLENBQUNHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7RUFDMUM7RUFFQSxNQUFNQyxpQkFBaUIsQ0FBRUwsUUFBUSxFQUFFO0lBQ2pDLE1BQU1DLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQ0osS0FBSyxDQUFDSyxTQUFTLENBQUUsK0ZBQThGLEVBQUVGLFFBQVEsQ0FBQztJQUNuSixPQUFPRyxRQUFRLENBQUNGLEtBQUssQ0FBQ0csS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUM7RUFDOUM7RUFFQSxNQUFNRSxvQkFBb0IsQ0FBRU4sUUFBUSxFQUFFO0lBQ3BDLElBQUlPLEtBQUs7SUFDVCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUNSLG1CQUFtQixDQUFDQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7TUFDbERPLEtBQUssR0FBSTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7SUFDckQsQ0FBQyxNQUFNO01BQ0wsSUFBSU4sS0FBSyxHQUFHLElBQUksQ0FBQ08sV0FBVztNQUM1QixJQUFJLENBQUNDLGVBQUMsQ0FBQ0MsUUFBUSxDQUFDLElBQUksQ0FBQ0YsV0FBVyxDQUFDLEVBQUU7UUFDakMsSUFBSTtVQUNGLE1BQU1HLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQ2QsS0FBSyxDQUFDSyxTQUFTLENBQUUsNkJBQTRCLENBQUM7VUFleEVELEtBQUssR0FBRyxJQUFJLENBQUNPLFdBQVcsR0FDdEJHLE1BQU0sQ0FDSEMsSUFBSTtVQUFFLENBRU5SLEtBQUssQ0FBQyxLQUFLO1VBQUMsQ0FFWlMsTUFBTSxDQUFFQyxNQUFNLElBQUssQ0FBQ0wsZUFBQyxDQUFDTSxPQUFPLENBQUNELE1BQU0sQ0FBQyxDQUFDLENBQ3RDRSxNQUFNO1FBQ2IsQ0FBQyxDQUFDLE9BQU9DLEdBQUcsRUFBRTtVQUVaaEIsS0FBSyxHQUFHLElBQUksQ0FBQ04sWUFBWSxDQUFDdUIsS0FBSyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRTtVQUM3Q0MsZUFBRyxDQUFDQyxJQUFJLENBQUUsZ0RBQStDSCxHQUFHLENBQUNJLE9BQVEsRUFBQyxDQUFDO1FBQ3pFO01BQ0Y7O01BR0FkLEtBQUssR0FBSSxxRUFBb0VFLGVBQUMsQ0FBQ2EsS0FBSyxDQUFDLENBQUMsRUFBRXJCLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUNzQixJQUFJLENBQUMsSUFBSSxDQUFFLElBQUc7SUFDdEg7SUFDQSxNQUFNLElBQUksQ0FBQzFCLEtBQUssQ0FBQ0ssU0FBUyxDQUFDSyxLQUFLLEVBQUVQLFFBQVEsQ0FBQztFQUM3QztFQUVBLE1BQU13QixxQkFBcUIsQ0FBRXhCLFFBQVEsRUFBRTtJQUNyQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUNELG1CQUFtQixDQUFDQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7TUFDbEQsTUFBTSxJQUFJLENBQUNILEtBQUssQ0FBQ0ssU0FBUyxDQUFFLHlFQUF3RSxFQUFFRixRQUFRLENBQUM7SUFDakg7RUFDRjtBQUNGO0FBQUMsZUFFY1AsUUFBUTtBQUFBIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","names":["Calendar","constructor","xcodeVersion","sharedResourcesDir","tccDb","TCCDB","getCalendarRowCount","bundleID","count","execQuery","parseInt","split","hasCalendarAccess","enableCalendarAccess","query","columnCount","_","isNumber","stdout","trim","filter","record","isEmpty","length","err","major","log","warn","message","range","join","disableCalendarAccess"],"sources":["../../lib/calendar.js"],"sourcesContent":["import _ from 'lodash';\nimport log from './logger';\nimport TCCDB from './tcc-db';\n\n\nclass Calendar {\n\n constructor (xcodeVersion, sharedResourcesDir) {\n this.xcodeVersion = xcodeVersion;\n this.tccDb = new TCCDB(xcodeVersion, sharedResourcesDir);\n }\n\n async getCalendarRowCount (bundleID) {\n const count = await this.tccDb.execQuery(`SELECT count(*) FROM access WHERE client='?' AND service='kTCCServiceCalendar';`, bundleID);\n return parseInt(count.split('=')[1], 10);\n }\n\n async hasCalendarAccess (bundleID) {\n const count = await this.tccDb.execQuery(`SELECT count(*) FROM access WHERE client='?' AND allowed=1 AND service='kTCCServiceCalendar';`, bundleID);\n return parseInt(count.split('=')[1], 10) > 0;\n }\n\n async enableCalendarAccess (bundleID) {\n let query;\n if ((await this.getCalendarRowCount(bundleID)) > 0) {\n query = `UPDATE 'access' SET\n service='kTCCServiceCalendar',\n client_type=0,\n allowed=1,\n prompt_count=1,\n csreq=0\n WHERE client='?' AND service='kTCCServiceCalendar'`;\n } else {\n let count = this.columnCount;\n if (!_.isNumber(this.columnCount)) {\n try {\n const stdout = await this.tccDb.execQuery(`pragma table_info('access')`);\n // stdout has a number of records, each starting with `cid`\n // cid = 0\n // name = service\n // type = TEXT\n // notnull = 1\n // dflt_value =\n // pk = 1\n //\n // cid = 1\n // name = client\n // type = TEXT\n // notnull = 1\n // dflt_value =\n // pk = 2\n count = this.columnCount =\n stdout\n .trim()\n // get each record's beginning\n .split('cid')\n // remove the empty row (usually, the first)\n .filter((record) => !_.isEmpty(record))\n .length;\n } catch (err) {\n // use defaults, but do not save\n count = this.xcodeVersion.major < 10 ? 7 : 11;\n log.warn(`Unable to find Calendar access column count: ${err.message}`);\n }\n }\n\n // fill in the query with 0's for columns after the 5 we care about\n query = `INSERT INTO 'access' VALUES ('kTCCServiceCalendar', '?', 0, 1, 1, ${_.range(0, count - 5, 0).join(', ')});`;\n }\n await this.tccDb.execQuery(query, bundleID);\n }\n\n async disableCalendarAccess (bundleID) {\n if ((await this.getCalendarRowCount(bundleID)) > 0) {\n await this.tccDb.execQuery(`DELETE FROM 'access' WHERE client='?' AND service='kTCCServiceCalendar'`, bundleID);\n }\n }\n}\n\nexport default Calendar;"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAGA,MAAMA,QAAQ,CAAC;EAEbC,WAAW,CAAEC,YAAY,EAAEC,kBAAkB,EAAE;IAC7C,IAAI,CAACD,YAAY,GAAGA,YAAY;IAChC,IAAI,CAACE,KAAK,GAAG,IAAIC,cAAK,CAACH,YAAY,EAAEC,kBAAkB,CAAC;EAC1D;EAEA,MAAMG,mBAAmB,CAAEC,QAAQ,EAAE;IACnC,MAAMC,KAAK,GAAG,MAAM,IAAI,CAACJ,KAAK,CAACK,SAAS,CAAE,iFAAgF,EAAEF,QAAQ,CAAC;IACrI,OAAOG,QAAQ,CAACF,KAAK,CAACG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;EAC1C;EAEA,MAAMC,iBAAiB,CAAEL,QAAQ,EAAE;IACjC,MAAMC,KAAK,GAAG,MAAM,IAAI,CAACJ,KAAK,CAACK,SAAS,CAAE,+FAA8F,EAAEF,QAAQ,CAAC;IACnJ,OAAOG,QAAQ,CAACF,KAAK,CAACG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;EAC9C;EAEA,MAAME,oBAAoB,CAAEN,QAAQ,EAAE;IACpC,IAAIO,KAAK;IACT,IAAI,CAAC,MAAM,IAAI,CAACR,mBAAmB,CAACC,QAAQ,CAAC,IAAI,CAAC,EAAE;MAClDO,KAAK,GAAI;AACf;AACA;AACA;AACA;AACA;AACA,yDAAyD;IACrD,CAAC,MAAM;MACL,IAAIN,KAAK,GAAG,IAAI,CAACO,WAAW;MAC5B,IAAI,CAACC,eAAC,CAACC,QAAQ,CAAC,IAAI,CAACF,WAAW,CAAC,EAAE;QACjC,IAAI;UACF,MAAMG,MAAM,GAAG,MAAM,IAAI,CAACd,KAAK,CAACK,SAAS,CAAE,6BAA4B,CAAC;UAexED,KAAK,GAAG,IAAI,CAACO,WAAW,GACtBG,MAAM,CACHC,IAAI;UAAE,CAENR,KAAK,CAAC,KAAK;UAAC,CAEZS,MAAM,CAAEC,MAAM,IAAK,CAACL,eAAC,CAACM,OAAO,CAACD,MAAM,CAAC,CAAC,CACtCE,MAAM;QACb,CAAC,CAAC,OAAOC,GAAG,EAAE;UAEZhB,KAAK,GAAG,IAAI,CAACN,YAAY,CAACuB,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;UAC7CC,eAAG,CAACC,IAAI,CAAE,gDAA+CH,GAAG,CAACI,OAAQ,EAAC,CAAC;QACzE;MACF;;MAGAd,KAAK,GAAI,qEAAoEE,eAAC,CAACa,KAAK,CAAC,CAAC,EAAErB,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAACsB,IAAI,CAAC,IAAI,CAAE,IAAG;IACtH;IACA,MAAM,IAAI,CAAC1B,KAAK,CAACK,SAAS,CAACK,KAAK,EAAEP,QAAQ,CAAC;EAC7C;EAEA,MAAMwB,qBAAqB,CAAExB,QAAQ,EAAE;IACrC,IAAI,CAAC,MAAM,IAAI,CAACD,mBAAmB,CAACC,QAAQ,CAAC,IAAI,CAAC,EAAE;MAClD,MAAM,IAAI,CAACH,KAAK,CAACK,SAAS,CAAE,yEAAwE,EAAEF,QAAQ,CAAC;IACjH;EACF;AACF;AAAC,eAEcP,QAAQ;AAAA"}
@@ -1,28 +1,18 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = exports.TrustStore = exports.Certificate = void 0;
9
-
10
8
  require("source-map-support/register");
11
-
12
9
  var _crypto = _interopRequireDefault(require("crypto"));
13
-
14
10
  var _teen_process = require("teen_process");
15
-
16
11
  var _path = _interopRequireDefault(require("path"));
17
-
18
12
  var _support = require("@appium/support");
19
-
20
13
  var _utils = require("./utils");
21
-
22
14
  var _logger = _interopRequireDefault(require("./logger"));
23
-
24
15
  var _lodash = _interopRequireDefault(require("lodash"));
25
-
26
16
  const tset = `<?xml version="1.0" encoding="UTF-8"?>\n
27
17
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
28
18
  <plist version="1.0">
@@ -37,7 +27,6 @@ class Certificate {
37
27
  this.data = null;
38
28
  this.subject = null;
39
29
  }
40
-
41
30
  async openssl(...args) {
42
31
  if (!this.opensslBinary) {
43
32
  try {
@@ -46,11 +35,8 @@ class Certificate {
46
35
  throw new Error('openssl executable cannot be found in PATH. Make sure it is installed');
47
36
  }
48
37
  }
49
-
50
38
  _logger.default.debug(`Executing ${this.opensslBinary} with arguments: ${args}`);
51
-
52
39
  let result;
53
-
54
40
  try {
55
41
  const {
56
42
  stdout
@@ -60,10 +46,8 @@ class Certificate {
60
46
  if (e.stderr) {
61
47
  throw new Error(e.stderr);
62
48
  }
63
-
64
49
  throw e;
65
50
  }
66
-
67
51
  return result;
68
52
  }
69
53
 
@@ -108,11 +92,8 @@ class Certificate {
108
92
  if (this.fingerprint) {
109
93
  return this.fingerprint;
110
94
  }
111
-
112
95
  let data = await this.getDerData();
113
-
114
96
  let shasum = _crypto.default.createHash('sha1');
115
-
116
97
  shasum.update(data);
117
98
  this.fingerprint = shasum.digest();
118
99
  return this.fingerprint;
@@ -122,24 +103,18 @@ class Certificate {
122
103
  if (this.subject) {
123
104
  return this.subject;
124
105
  }
125
-
126
106
  const subject = await this.openssl('x509', '-noout', '-subject', '-in', this.pemFilename);
127
107
  const match = /^\s*subject=.*\bCN\b\s*=\s*([^\n]+)$/m.exec(subject);
128
-
129
108
  if (!match) {
130
109
  _logger.default.debug(subject);
131
-
132
110
  throw new Error(`Cannot parse certificate subject from the openssl output`);
133
111
  }
134
-
135
112
  this.subject = match[1];
136
113
  return this.subject;
137
114
  }
138
-
139
115
  }
140
116
 
141
117
  exports.Certificate = Certificate;
142
-
143
118
  class TrustStore {
144
119
  constructor(sharedResourceDir) {
145
120
  this.sharedResourceDir = sharedResourceDir;
@@ -151,24 +126,21 @@ class TrustStore {
151
126
  }
152
127
 
153
128
  let keychainsPath = _path.default.resolve(this.sharedResourceDir, 'Library', 'Keychains');
154
-
155
129
  if (!(await _support.fs.exists(keychainsPath))) {
156
130
  await (0, _support.mkdirp)(keychainsPath);
157
131
  }
158
132
 
159
133
  this.db = _path.default.resolve(keychainsPath, 'TrustStore.sqlite3');
160
- await (0, _utils.execSQLiteQuery)(this.db, `CREATE TABLE IF NOT EXISTS tsettings (sha1 BLOB NOT NULL DEFAULT '', subj BLOB NOT NULL DEFAULT '', tset BLOB, data BLOB, PRIMARY KEY(sha1));`);
161
134
 
135
+ await (0, _utils.execSQLiteQuery)(this.db, `CREATE TABLE IF NOT EXISTS tsettings (sha1 BLOB NOT NULL DEFAULT '', subj BLOB NOT NULL DEFAULT '', tset BLOB, data BLOB, PRIMARY KEY(sha1));`);
162
136
  try {
163
137
  await (0, _utils.execSQLiteQuery)(this.db, 'CREATE INDEX isubj ON tsettings(subj);');
164
138
  } catch (e) {}
165
-
166
139
  return this.db;
167
140
  }
168
141
 
169
142
  async addRecord(sha1, tset, subj, data) {
170
143
  let db = await this.getDB();
171
-
172
144
  if (await this.hasRecords(subj)) {
173
145
  return await (0, _utils.execSQLiteQuery)(db, `UPDATE tsettings SET sha1=x'?', tset='?', data=x'?' WHERE subj='?'`, sha1, tset, data, subj);
174
146
  } else {
@@ -191,15 +163,12 @@ class TrustStore {
191
163
 
192
164
  async getFingerPrintFromRecord(subj) {
193
165
  let result = await (0, _utils.execSQLiteQuery)(await this.getDB(), `SELECT sha1 FROM tsettings WHERE subj='?'`, subj);
194
-
195
166
  if (result) {
196
167
  return Buffer.from(result.split('=')[1].trim());
197
168
  }
198
169
  }
199
-
200
170
  }
201
-
202
171
  exports.TrustStore = TrustStore;
203
172
  var _default = Certificate;
204
173
  exports.default = _default;
205
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0c2V0IiwiQ2VydGlmaWNhdGUiLCJjb25zdHJ1Y3RvciIsInBlbUZpbGVuYW1lIiwib3BlbnNzbEJpbmFyeSIsImZpbmdlcnByaW50IiwiZGF0YSIsInN1YmplY3QiLCJvcGVuc3NsIiwiYXJncyIsImZzIiwid2hpY2giLCJlIiwiRXJyb3IiLCJsb2ciLCJkZWJ1ZyIsInJlc3VsdCIsInN0ZG91dCIsImV4ZWMiLCJzdGRlcnIiLCJhZGQiLCJkaXIiLCJnZXREZXJEYXRhIiwidG9TdHJpbmciLCJnZXRTdWJqZWN0Iiwic2hhMSIsImdldEZpbmdlclByaW50IiwidHJ1c3RTdG9yZSIsIlRydXN0U3RvcmUiLCJhZGRSZWNvcmQiLCJoYXMiLCJoYXNSZWNvcmRzIiwicHJldmlvdXNGaW5nZXJwcmludCIsImdldEZpbmdlclByaW50RnJvbVJlY29yZCIsImN1cnJlbnRGaW5nZXJwcmludCIsInJlbW92ZSIsInJlbW92ZVJlY29yZCIsIm91dHB1dCIsIkJ1ZmZlciIsImZyb20iLCJfIiwidHJpbSIsInNoYXN1bSIsImNyeXB0byIsImNyZWF0ZUhhc2giLCJ1cGRhdGUiLCJkaWdlc3QiLCJtYXRjaCIsInNoYXJlZFJlc291cmNlRGlyIiwiZ2V0REIiLCJkYiIsImtleWNoYWluc1BhdGgiLCJwYXRoIiwicmVzb2x2ZSIsImV4aXN0cyIsIm1rZGlycCIsImV4ZWNTUUxpdGVRdWVyeSIsInN1YmoiLCJnZXRSZWNvcmRDb3VudCIsInBhcnNlSW50Iiwic3BsaXQiXSwic291cmNlcyI6WyIuLi8uLi9saWIvY2VydGlmaWNhdGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGZzLCBta2RpcnAgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgZXhlY1NRTGl0ZVF1ZXJ5IH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmNvbnN0IHRzZXQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XFxuXG4gICAgPCFET0NUWVBFIHBsaXN0IFBVQkxJQyBcIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTlwiIFwiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZFwiPlxuICAgIDxwbGlzdCB2ZXJzaW9uPVwiMS4wXCI+XG4gICAgPGFycmF5Lz5cbjwvcGxpc3Q+YDtcblxuLyoqXG4gKiBMaWJyYXJ5IGZvciBwcm9ncmFtYXRpY2FsbHkgYWRkaW5nIGNlcnRpZmljYXRlc1xuICovXG5jbGFzcyBDZXJ0aWZpY2F0ZSB7XG5cbiAgY29uc3RydWN0b3IgKHBlbUZpbGVuYW1lKSB7XG4gICAgdGhpcy5wZW1GaWxlbmFtZSA9IHBlbUZpbGVuYW1lO1xuICAgIHRoaXMub3BlbnNzbEJpbmFyeSA9IG51bGw7XG4gICAgdGhpcy5maW5nZXJwcmludCA9IG51bGw7XG4gICAgdGhpcy5kYXRhID0gbnVsbDtcbiAgICB0aGlzLnN1YmplY3QgPSBudWxsO1xuICB9XG5cbiAgYXN5bmMgb3BlbnNzbCAoLi4uYXJncykge1xuICAgIGlmICghdGhpcy5vcGVuc3NsQmluYXJ5KSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm9wZW5zc2xCaW5hcnkgPSBhd2FpdCBmcy53aGljaCgnb3BlbnNzbCcpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wZW5zc2wgZXhlY3V0YWJsZSBjYW5ub3QgYmUgZm91bmQgaW4gUEFUSC4gTWFrZSBzdXJlIGl0IGlzIGluc3RhbGxlZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvZy5kZWJ1ZyhgRXhlY3V0aW5nICR7dGhpcy5vcGVuc3NsQmluYXJ5fSB3aXRoIGFyZ3VtZW50czogJHthcmdzfWApO1xuICAgIGxldCByZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYyh0aGlzLm9wZW5zc2xCaW5hcnksIGFyZ3MpO1xuICAgICAgcmVzdWx0ID0gc3Rkb3V0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLnN0ZGVycikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZS5zdGRlcnIpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjZXJ0aWZpY2F0ZSB0byB0aGUgVHJ1c3RTdG9yZVxuICAgKi9cbiAgYXN5bmMgYWRkIChkaXIpIHtcbiAgICBsZXQgZGF0YSA9IChhd2FpdCB0aGlzLmdldERlckRhdGEodGhpcy5wZW1GaWxlbmFtZSkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBsZXQgc3ViamVjdCA9IChhd2FpdCB0aGlzLmdldFN1YmplY3QodGhpcy5wZW1GaWxlbmFtZSkpO1xuICAgIGxldCBzaGExID0gKGF3YWl0IHRoaXMuZ2V0RmluZ2VyUHJpbnQodGhpcy5kYXRhKSkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgbGV0IHRydXN0U3RvcmUgPSBuZXcgVHJ1c3RTdG9yZShkaXIpO1xuICAgIHJldHVybiBhd2FpdCB0cnVzdFN0b3JlLmFkZFJlY29yZChzaGExLCB0c2V0LCBzdWJqZWN0LCBkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYga2V5Y2hhaW4gYXQgZ2l2ZW4gZGlyZWN0b3J5IGhhcyB0aGlzIGNlcnRpZmljYXRlXG4gICAqL1xuICBhc3luYyBoYXMgKGRpcikge1xuICAgIGxldCBzdWJqZWN0ID0gYXdhaXQgdGhpcy5nZXRTdWJqZWN0KHRoaXMucGVtRmlsZW5hbWUpO1xuICAgIGxldCB0cnVzdFN0b3JlID0gbmV3IFRydXN0U3RvcmUoZGlyKTtcblxuICAgIC8vIFJldHVybiBmYWxzZSBpZiByZWNvcmQgd2l0aCB0aGlzIHN1YmplY3QgaXMgbm90IGZvdW5kXG4gICAgaWYgKCFhd2FpdCB0cnVzdFN0b3JlLmhhc1JlY29yZHMoc3ViamVjdCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBJZiByZWNvcmQgaXMgZm91bmQsIGNoZWNrIGZpbmdlcnByaW50cyB0byB2ZXJpZnkgdGhhdCB0aGV5IGRpZG4ndCBjaGFuZ2VcbiAgICBsZXQgcHJldmlvdXNGaW5nZXJwcmludCA9IGF3YWl0IHRydXN0U3RvcmUuZ2V0RmluZ2VyUHJpbnRGcm9tUmVjb3JkKHN1YmplY3QpO1xuICAgIGxldCBjdXJyZW50RmluZ2VycHJpbnQgPSBhd2FpdCB0aGlzLmdldEZpbmdlclByaW50KCk7XG4gICAgcmV0dXJuIHByZXZpb3VzRmluZ2VycHJpbnQudG9TdHJpbmcoKSA9PT0gY3VycmVudEZpbmdlcnByaW50LnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGNlcnRpZmljYXRlIGZyb20gdGhlIFRydXN0U3RvcmVcbiAgICovXG4gIGFzeW5jIHJlbW92ZSAoZGlyKSB7XG4gICAgbGV0IHN1YmplY3QgPSBhd2FpdCB0aGlzLmdldFN1YmplY3QodGhpcy5wZW1GaWxlbmFtZSk7XG4gICAgbGV0IHRydXN0U3RvcmUgPSBuZXcgVHJ1c3RTdG9yZShkaXIpO1xuICAgIHJldHVybiBhd2FpdCB0cnVzdFN0b3JlLnJlbW92ZVJlY29yZChzdWJqZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2xhdGUgUEVNIGZpbGUgdG8gREVSIGJ1ZmZlclxuICAgKi9cbiAgYXN5bmMgZ2V0RGVyRGF0YSAoKSB7XG4gICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YTtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0ICdwZW0nIGZpbGUgdG8gJ2RlcidcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLm9wZW5zc2woJ3g1MDknLFxuICAgICAgJy1vdXRmb3JtJywgJ2RlcicsXG4gICAgICAnLWluJywgdGhpcy5wZW1GaWxlbmFtZVxuICAgICk7XG4gICAgdGhpcy5kYXRhID0gQnVmZmVyLmZyb20oXy50cmltKG91dHB1dCkpO1xuICAgIHJldHVybiB0aGlzLmRhdGE7XG4gIH1cblxuICAvKipcbiAgICogR2V0IFNIQTEgZmluZ2VycHJpbnQgZnJvbSBkZXIgZGF0YSBiZWZvcmVcbiAgICovXG4gIGFzeW5jIGdldEZpbmdlclByaW50ICgpIHtcbiAgICBpZiAodGhpcy5maW5nZXJwcmludCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmluZ2VycHJpbnQ7XG4gICAgfVxuXG4gICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmdldERlckRhdGEoKTtcbiAgICBsZXQgc2hhc3VtID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTEnKTtcbiAgICBzaGFzdW0udXBkYXRlKGRhdGEpO1xuICAgIHRoaXMuZmluZ2VycHJpbnQgPSBzaGFzdW0uZGlnZXN0KCk7XG4gICAgcmV0dXJuIHRoaXMuZmluZ2VycHJpbnQ7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgdGhlIHN1YmplY3QgZnJvbSB0aGUgZGVyIGRhdGFcbiAgICovXG4gIGFzeW5jIGdldFN1YmplY3QgKCkge1xuICAgIGlmICh0aGlzLnN1YmplY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLnN1YmplY3Q7XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViamVjdCA9IGF3YWl0IHRoaXMub3BlbnNzbCgneDUwOScsXG4gICAgICAnLW5vb3V0JywgJy1zdWJqZWN0JyxcbiAgICAgICctaW4nLCB0aGlzLnBlbUZpbGVuYW1lLFxuICAgICk7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE0NjY2XG4gICAgY29uc3QgbWF0Y2ggPSAvXlxccypzdWJqZWN0PS4qXFxiQ05cXGJcXHMqPVxccyooW15cXG5dKykkL20uZXhlYyhzdWJqZWN0KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBsb2cuZGVidWcoc3ViamVjdCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSBjZXJ0aWZpY2F0ZSBzdWJqZWN0IGZyb20gdGhlIG9wZW5zc2wgb3V0cHV0YCk7XG4gICAgfVxuICAgIHRoaXMuc3ViamVjdCA9IG1hdGNoWzFdO1xuICAgIHJldHVybiB0aGlzLnN1YmplY3Q7XG4gIH1cblxufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyByZWNvcmRzIHRvIFRydXN0U3RvcmUuc3FsaXRlMyBkYXRhYmFzZXMgdGhhdCBLZXljaGFpbnMgdXNlXG4gKi9cbmNsYXNzIFRydXN0U3RvcmUge1xuICBjb25zdHJ1Y3RvciAoc2hhcmVkUmVzb3VyY2VEaXIpIHtcbiAgICB0aGlzLnNoYXJlZFJlc291cmNlRGlyID0gc2hhcmVkUmVzb3VyY2VEaXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IFRydXN0U3RvcmUgZGF0YWJhc2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2ltdWxhdG9yXG4gICAqL1xuICBhc3luYyBnZXREQiAoKSB7XG4gICAgaWYgKHRoaXMuZGIpIHtcbiAgICAgIHJldHVybiB0aGlzLmRiO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBzaW0gZG9lc24ndCBoYXZlIGEga2V5Y2hhaW5zIGRpcmVjdG9yeSwgY3JlYXRlIG9uZVxuICAgIGxldCBrZXljaGFpbnNQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuc2hhcmVkUmVzb3VyY2VEaXIsICdMaWJyYXJ5JywgJ0tleWNoYWlucycpO1xuICAgIGlmICghKGF3YWl0IGZzLmV4aXN0cyhrZXljaGFpbnNQYXRoKSkpIHtcbiAgICAgIGF3YWl0IG1rZGlycChrZXljaGFpbnNQYXRoKTtcbiAgICB9XG5cbiAgICAvLyBPcGVuIHNxbGl0ZSBkYXRhYmFzZVxuICAgIHRoaXMuZGIgPSBwYXRoLnJlc29sdmUoa2V5Y2hhaW5zUGF0aCwgJ1RydXN0U3RvcmUuc3FsaXRlMycpO1xuXG4gICAgLy8gSWYgaXQgZG9lc24ndCBoYXZlIGEgdHNldHRpbmdzIHRhYmxlLCBjcmVhdGUgb25lXG4gICAgYXdhaXQgZXhlY1NRTGl0ZVF1ZXJ5KHRoaXMuZGIsIGBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyB0c2V0dGluZ3MgKHNoYTEgQkxPQiBOT1QgTlVMTCBERUZBVUxUICcnLCBzdWJqIEJMT0IgTk9UIE5VTEwgREVGQVVMVCAnJywgdHNldCBCTE9CLCBkYXRhIEJMT0IsIFBSSU1BUlkgS0VZKHNoYTEpKTtgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlY1NRTGl0ZVF1ZXJ5KHRoaXMuZGIsICdDUkVBVEUgSU5ERVggaXN1YmogT04gdHNldHRpbmdzKHN1YmopOycpO1xuICAgIH0gY2F0Y2ggKGUpIHsgfVxuXG5cbiAgICByZXR1cm4gdGhpcy5kYjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgcmVjb3JkIHRvIHRzZXR0aW5nc1xuICAgKi9cbiAgYXN5bmMgYWRkUmVjb3JkIChzaGExLCB0c2V0LCBzdWJqLCBkYXRhKSB7XG4gICAgbGV0IGRiID0gYXdhaXQgdGhpcy5nZXREQigpO1xuICAgIGlmIChhd2FpdCB0aGlzLmhhc1JlY29yZHMoc3ViaikpIHtcbiAgICAgIHJldHVybiBhd2FpdCBleGVjU1FMaXRlUXVlcnkoZGIsIGBVUERBVEUgdHNldHRpbmdzIFNFVCBzaGExPXgnPycsIHRzZXQ9Jz8nLCBkYXRhPXgnPycgV0hFUkUgc3Viaj0nPydgLCBzaGExLCB0c2V0LCBkYXRhLCBzdWJqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGF3YWl0IGV4ZWNTUUxpdGVRdWVyeShkYiwgYElOU0VSVCBJTlRPIHRzZXR0aW5ncyAoc2hhMSwgc3ViaiwgdHNldCwgZGF0YSkgVkFMVUVTICh4Jz8nLCAnPycsICc/JywgeCc/JylgLCBzaGExLCBzdWJqLCB0c2V0LCBkYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHJlY29yZCBmcm9tIHRzZXR0aW5ncyB0aGF0IG1hdGNoZXMgdGhlIHN1YmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1YmpcbiAgICovXG4gIGFzeW5jIHJlbW92ZVJlY29yZCAoc3Viaikge1xuICAgIHJldHVybiBhd2FpdCBleGVjU1FMaXRlUXVlcnkoYXdhaXQgdGhpcy5nZXREQigpLCBgREVMRVRFIEZST00gdHNldHRpbmdzIFdIRVJFIHN1YmogPSAnPydgLCBzdWJqKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSByZWNvcmQgZnJvbSB0c2V0dGluZ3MgdGhhdCBtYXRjaGVzIHRoZSBzdWJqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWJqXG4gICAqL1xuICBhc3luYyBoYXNSZWNvcmRzIChzdWJqKSB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldFJlY29yZENvdW50KHN1YmopKSA+IDA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvdW50IG9mIGhvdyBtYW55IHJlY29yZHMgaGF2ZSB0aGlzIHN1YmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1YmpcbiAgICovXG4gIGFzeW5jIGdldFJlY29yZENvdW50IChzdWJqKSB7XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IGV4ZWNTUUxpdGVRdWVyeShhd2FpdCB0aGlzLmdldERCKCksIGBTRUxFQ1QgY291bnQoKikgRlJPTSB0c2V0dGluZ3MgV0hFUkUgc3ViaiA9ICc/J2AsIHN1YmopO1xuICAgIHJldHVybiBwYXJzZUludChyZXN1bHQuc3BsaXQoJz0nKVsxXSwgMTApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgU0hBMSBmaW5nZXJwcmludCBmb3IgdGhlIHJlY29yZCB0aGF0IGhhcyB0aGlzIHN1YmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1YmpcbiAgICovXG4gIGFzeW5jIGdldEZpbmdlclByaW50RnJvbVJlY29yZCAoc3Viaikge1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBleGVjU1FMaXRlUXVlcnkoYXdhaXQgdGhpcy5nZXREQigpLCBgU0VMRUNUIHNoYTEgRlJPTSB0c2V0dGluZ3MgV0hFUkUgc3Viaj0nPydgLCBzdWJqKTtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20ocmVzdWx0LnNwbGl0KCc9JylbMV0udHJpbSgpKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2VydGlmaWNhdGU7XG5leHBvcnQgeyBDZXJ0aWZpY2F0ZSwgVHJ1c3RTdG9yZSB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLElBQUksR0FBSTtBQUNkO0FBQ0E7QUFDQTtBQUNBLFNBSkE7O0FBU0EsTUFBTUMsV0FBTixDQUFrQjtFQUVoQkMsV0FBVyxDQUFFQyxXQUFGLEVBQWU7SUFDeEIsS0FBS0EsV0FBTCxHQUFtQkEsV0FBbkI7SUFDQSxLQUFLQyxhQUFMLEdBQXFCLElBQXJCO0lBQ0EsS0FBS0MsV0FBTCxHQUFtQixJQUFuQjtJQUNBLEtBQUtDLElBQUwsR0FBWSxJQUFaO0lBQ0EsS0FBS0MsT0FBTCxHQUFlLElBQWY7RUFDRDs7RUFFWSxNQUFQQyxPQUFPLENBQUUsR0FBR0MsSUFBTCxFQUFXO0lBQ3RCLElBQUksQ0FBQyxLQUFLTCxhQUFWLEVBQXlCO01BQ3ZCLElBQUk7UUFDRixLQUFLQSxhQUFMLEdBQXFCLE1BQU1NLFdBQUEsQ0FBR0MsS0FBSCxDQUFTLFNBQVQsQ0FBM0I7TUFDRCxDQUZELENBRUUsT0FBT0MsQ0FBUCxFQUFVO1FBQ1YsTUFBTSxJQUFJQyxLQUFKLENBQVUsdUVBQVYsQ0FBTjtNQUNEO0lBQ0Y7O0lBRURDLGVBQUEsQ0FBSUMsS0FBSixDQUFXLGFBQVksS0FBS1gsYUFBYyxvQkFBbUJLLElBQUssRUFBbEU7O0lBQ0EsSUFBSU8sTUFBSjs7SUFDQSxJQUFJO01BQ0YsTUFBTTtRQUFDQztNQUFELElBQVcsTUFBTSxJQUFBQyxrQkFBQSxFQUFLLEtBQUtkLGFBQVYsRUFBeUJLLElBQXpCLENBQXZCO01BQ0FPLE1BQU0sR0FBR0MsTUFBVDtJQUNELENBSEQsQ0FHRSxPQUFPTCxDQUFQLEVBQVU7TUFDVixJQUFJQSxDQUFDLENBQUNPLE1BQU4sRUFBYztRQUNaLE1BQU0sSUFBSU4sS0FBSixDQUFVRCxDQUFDLENBQUNPLE1BQVosQ0FBTjtNQUNEOztNQUNELE1BQU1QLENBQU47SUFDRDs7SUFDRCxPQUFPSSxNQUFQO0VBQ0Q7O0VBS1EsTUFBSEksR0FBRyxDQUFFQyxHQUFGLEVBQU87SUFDZCxJQUFJZixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUtnQixVQUFMLENBQWdCLEtBQUtuQixXQUFyQixDQUFQLEVBQTBDb0IsUUFBMUMsQ0FBbUQsS0FBbkQsQ0FBWDtJQUNBLElBQUloQixPQUFPLEdBQUksTUFBTSxLQUFLaUIsVUFBTCxDQUFnQixLQUFLckIsV0FBckIsQ0FBckI7SUFDQSxJQUFJc0IsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLQyxjQUFMLENBQW9CLEtBQUtwQixJQUF6QixDQUFQLEVBQXVDaUIsUUFBdkMsQ0FBZ0QsS0FBaEQsQ0FBWDtJQUVBLElBQUlJLFVBQVUsR0FBRyxJQUFJQyxVQUFKLENBQWVQLEdBQWYsQ0FBakI7SUFDQSxPQUFPLE1BQU1NLFVBQVUsQ0FBQ0UsU0FBWCxDQUFxQkosSUFBckIsRUFBMkJ6QixJQUEzQixFQUFpQ08sT0FBakMsRUFBMENELElBQTFDLENBQWI7RUFDRDs7RUFLUSxNQUFId0IsR0FBRyxDQUFFVCxHQUFGLEVBQU87SUFDZCxJQUFJZCxPQUFPLEdBQUcsTUFBTSxLQUFLaUIsVUFBTCxDQUFnQixLQUFLckIsV0FBckIsQ0FBcEI7SUFDQSxJQUFJd0IsVUFBVSxHQUFHLElBQUlDLFVBQUosQ0FBZVAsR0FBZixDQUFqQjs7SUFHQSxJQUFJLEVBQUMsTUFBTU0sVUFBVSxDQUFDSSxVQUFYLENBQXNCeEIsT0FBdEIsQ0FBUCxDQUFKLEVBQTJDO01BQ3pDLE9BQU8sS0FBUDtJQUNEOztJQUdELElBQUl5QixtQkFBbUIsR0FBRyxNQUFNTCxVQUFVLENBQUNNLHdCQUFYLENBQW9DMUIsT0FBcEMsQ0FBaEM7SUFDQSxJQUFJMkIsa0JBQWtCLEdBQUcsTUFBTSxLQUFLUixjQUFMLEVBQS9CO0lBQ0EsT0FBT00sbUJBQW1CLENBQUNULFFBQXBCLE9BQW1DVyxrQkFBa0IsQ0FBQ1gsUUFBbkIsRUFBMUM7RUFDRDs7RUFLVyxNQUFOWSxNQUFNLENBQUVkLEdBQUYsRUFBTztJQUNqQixJQUFJZCxPQUFPLEdBQUcsTUFBTSxLQUFLaUIsVUFBTCxDQUFnQixLQUFLckIsV0FBckIsQ0FBcEI7SUFDQSxJQUFJd0IsVUFBVSxHQUFHLElBQUlDLFVBQUosQ0FBZVAsR0FBZixDQUFqQjtJQUNBLE9BQU8sTUFBTU0sVUFBVSxDQUFDUyxZQUFYLENBQXdCN0IsT0FBeEIsQ0FBYjtFQUNEOztFQUtlLE1BQVZlLFVBQVUsR0FBSTtJQUNsQixJQUFJLEtBQUtoQixJQUFULEVBQWU7TUFDYixPQUFPLEtBQUtBLElBQVo7SUFDRDs7SUFHRCxNQUFNK0IsTUFBTSxHQUFHLE1BQU0sS0FBSzdCLE9BQUwsQ0FBYSxNQUFiLEVBQ25CLFVBRG1CLEVBQ1AsS0FETyxFQUVuQixLQUZtQixFQUVaLEtBQUtMLFdBRk8sQ0FBckI7SUFJQSxLQUFLRyxJQUFMLEdBQVlnQyxNQUFNLENBQUNDLElBQVAsQ0FBWUMsZUFBQSxDQUFFQyxJQUFGLENBQU9KLE1BQVAsQ0FBWixDQUFaO0lBQ0EsT0FBTyxLQUFLL0IsSUFBWjtFQUNEOztFQUttQixNQUFkb0IsY0FBYyxHQUFJO0lBQ3RCLElBQUksS0FBS3JCLFdBQVQsRUFBc0I7TUFDcEIsT0FBTyxLQUFLQSxXQUFaO0lBQ0Q7O0lBRUQsSUFBSUMsSUFBSSxHQUFHLE1BQU0sS0FBS2dCLFVBQUwsRUFBakI7O0lBQ0EsSUFBSW9CLE1BQU0sR0FBR0MsZUFBQSxDQUFPQyxVQUFQLENBQWtCLE1BQWxCLENBQWI7O0lBQ0FGLE1BQU0sQ0FBQ0csTUFBUCxDQUFjdkMsSUFBZDtJQUNBLEtBQUtELFdBQUwsR0FBbUJxQyxNQUFNLENBQUNJLE1BQVAsRUFBbkI7SUFDQSxPQUFPLEtBQUt6QyxXQUFaO0VBQ0Q7O0VBS2UsTUFBVm1CLFVBQVUsR0FBSTtJQUNsQixJQUFJLEtBQUtqQixPQUFULEVBQWtCO01BQ2hCLE9BQU8sS0FBS0EsT0FBWjtJQUNEOztJQUVELE1BQU1BLE9BQU8sR0FBRyxNQUFNLEtBQUtDLE9BQUwsQ0FBYSxNQUFiLEVBQ3BCLFFBRG9CLEVBQ1YsVUFEVSxFQUVwQixLQUZvQixFQUViLEtBQUtMLFdBRlEsQ0FBdEI7SUFLQSxNQUFNNEMsS0FBSyxHQUFHLHdDQUF3QzdCLElBQXhDLENBQTZDWCxPQUE3QyxDQUFkOztJQUNBLElBQUksQ0FBQ3dDLEtBQUwsRUFBWTtNQUNWakMsZUFBQSxDQUFJQyxLQUFKLENBQVVSLE9BQVY7O01BQ0EsTUFBTSxJQUFJTSxLQUFKLENBQVcsMERBQVgsQ0FBTjtJQUNEOztJQUNELEtBQUtOLE9BQUwsR0FBZXdDLEtBQUssQ0FBQyxDQUFELENBQXBCO0lBQ0EsT0FBTyxLQUFLeEMsT0FBWjtFQUNEOztBQTVIZTs7OztBQW1JbEIsTUFBTXFCLFVBQU4sQ0FBaUI7RUFDZjFCLFdBQVcsQ0FBRThDLGlCQUFGLEVBQXFCO0lBQzlCLEtBQUtBLGlCQUFMLEdBQXlCQSxpQkFBekI7RUFDRDs7RUFLVSxNQUFMQyxLQUFLLEdBQUk7SUFDYixJQUFJLEtBQUtDLEVBQVQsRUFBYTtNQUNYLE9BQU8sS0FBS0EsRUFBWjtJQUNEOztJQUdELElBQUlDLGFBQWEsR0FBR0MsYUFBQSxDQUFLQyxPQUFMLENBQWEsS0FBS0wsaUJBQWxCLEVBQXFDLFNBQXJDLEVBQWdELFdBQWhELENBQXBCOztJQUNBLElBQUksRUFBRSxNQUFNdEMsV0FBQSxDQUFHNEMsTUFBSCxDQUFVSCxhQUFWLENBQVIsQ0FBSixFQUF1QztNQUNyQyxNQUFNLElBQUFJLGVBQUEsRUFBT0osYUFBUCxDQUFOO0lBQ0Q7O0lBR0QsS0FBS0QsRUFBTCxHQUFVRSxhQUFBLENBQUtDLE9BQUwsQ0FBYUYsYUFBYixFQUE0QixvQkFBNUIsQ0FBVjtJQUdBLE1BQU0sSUFBQUssc0JBQUEsRUFBZ0IsS0FBS04sRUFBckIsRUFBMEIsK0lBQTFCLENBQU47O0lBQ0EsSUFBSTtNQUNGLE1BQU0sSUFBQU0sc0JBQUEsRUFBZ0IsS0FBS04sRUFBckIsRUFBeUIsd0NBQXpCLENBQU47SUFDRCxDQUZELENBRUUsT0FBT3RDLENBQVAsRUFBVSxDQUFHOztJQUdmLE9BQU8sS0FBS3NDLEVBQVo7RUFDRDs7RUFLYyxNQUFUckIsU0FBUyxDQUFFSixJQUFGLEVBQVF6QixJQUFSLEVBQWN5RCxJQUFkLEVBQW9CbkQsSUFBcEIsRUFBMEI7SUFDdkMsSUFBSTRDLEVBQUUsR0FBRyxNQUFNLEtBQUtELEtBQUwsRUFBZjs7SUFDQSxJQUFJLE1BQU0sS0FBS2xCLFVBQUwsQ0FBZ0IwQixJQUFoQixDQUFWLEVBQWlDO01BQy9CLE9BQU8sTUFBTSxJQUFBRCxzQkFBQSxFQUFnQk4sRUFBaEIsRUFBcUIsb0VBQXJCLEVBQTBGekIsSUFBMUYsRUFBZ0d6QixJQUFoRyxFQUFzR00sSUFBdEcsRUFBNEdtRCxJQUE1RyxDQUFiO0lBQ0QsQ0FGRCxNQUVPO01BQ0wsT0FBTyxNQUFNLElBQUFELHNCQUFBLEVBQWdCTixFQUFoQixFQUFxQiw4RUFBckIsRUFBb0d6QixJQUFwRyxFQUEwR2dDLElBQTFHLEVBQWdIekQsSUFBaEgsRUFBc0hNLElBQXRILENBQWI7SUFDRDtFQUNGOztFQU1pQixNQUFaOEIsWUFBWSxDQUFFcUIsSUFBRixFQUFRO0lBQ3hCLE9BQU8sTUFBTSxJQUFBRCxzQkFBQSxFQUFnQixNQUFNLEtBQUtQLEtBQUwsRUFBdEIsRUFBcUMsd0NBQXJDLEVBQThFUSxJQUE5RSxDQUFiO0VBQ0Q7O0VBTWUsTUFBVjFCLFVBQVUsQ0FBRTBCLElBQUYsRUFBUTtJQUN0QixPQUFPLENBQUMsTUFBTSxLQUFLQyxjQUFMLENBQW9CRCxJQUFwQixDQUFQLElBQW9DLENBQTNDO0VBQ0Q7O0VBTW1CLE1BQWRDLGNBQWMsQ0FBRUQsSUFBRixFQUFRO0lBQzFCLElBQUl6QyxNQUFNLEdBQUcsTUFBTSxJQUFBd0Msc0JBQUEsRUFBZ0IsTUFBTSxLQUFLUCxLQUFMLEVBQXRCLEVBQXFDLGlEQUFyQyxFQUF1RlEsSUFBdkYsQ0FBbkI7SUFDQSxPQUFPRSxRQUFRLENBQUMzQyxNQUFNLENBQUM0QyxLQUFQLENBQWEsR0FBYixFQUFrQixDQUFsQixDQUFELEVBQXVCLEVBQXZCLENBQWY7RUFDRDs7RUFNNkIsTUFBeEIzQix3QkFBd0IsQ0FBRXdCLElBQUYsRUFBUTtJQUNwQyxJQUFJekMsTUFBTSxHQUFHLE1BQU0sSUFBQXdDLHNCQUFBLEVBQWdCLE1BQU0sS0FBS1AsS0FBTCxFQUF0QixFQUFxQywyQ0FBckMsRUFBaUZRLElBQWpGLENBQW5COztJQUNBLElBQUl6QyxNQUFKLEVBQVk7TUFDVixPQUFPc0IsTUFBTSxDQUFDQyxJQUFQLENBQVl2QixNQUFNLENBQUM0QyxLQUFQLENBQWEsR0FBYixFQUFrQixDQUFsQixFQUFxQm5CLElBQXJCLEVBQVosQ0FBUDtJQUNEO0VBQ0Y7O0FBOUVjOzs7ZUFpRkZ4QyxXIn0=
174
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0c2V0IiwiQ2VydGlmaWNhdGUiLCJjb25zdHJ1Y3RvciIsInBlbUZpbGVuYW1lIiwib3BlbnNzbEJpbmFyeSIsImZpbmdlcnByaW50IiwiZGF0YSIsInN1YmplY3QiLCJvcGVuc3NsIiwiYXJncyIsImZzIiwid2hpY2giLCJlIiwiRXJyb3IiLCJsb2ciLCJkZWJ1ZyIsInJlc3VsdCIsInN0ZG91dCIsImV4ZWMiLCJzdGRlcnIiLCJhZGQiLCJkaXIiLCJnZXREZXJEYXRhIiwidG9TdHJpbmciLCJnZXRTdWJqZWN0Iiwic2hhMSIsImdldEZpbmdlclByaW50IiwidHJ1c3RTdG9yZSIsIlRydXN0U3RvcmUiLCJhZGRSZWNvcmQiLCJoYXMiLCJoYXNSZWNvcmRzIiwicHJldmlvdXNGaW5nZXJwcmludCIsImdldEZpbmdlclByaW50RnJvbVJlY29yZCIsImN1cnJlbnRGaW5nZXJwcmludCIsInJlbW92ZSIsInJlbW92ZVJlY29yZCIsIm91dHB1dCIsIkJ1ZmZlciIsImZyb20iLCJfIiwidHJpbSIsInNoYXN1bSIsImNyeXB0byIsImNyZWF0ZUhhc2giLCJ1cGRhdGUiLCJkaWdlc3QiLCJtYXRjaCIsInNoYXJlZFJlc291cmNlRGlyIiwiZ2V0REIiLCJkYiIsImtleWNoYWluc1BhdGgiLCJwYXRoIiwicmVzb2x2ZSIsImV4aXN0cyIsIm1rZGlycCIsImV4ZWNTUUxpdGVRdWVyeSIsInN1YmoiLCJnZXRSZWNvcmRDb3VudCIsInBhcnNlSW50Iiwic3BsaXQiXSwic291cmNlcyI6WyIuLi8uLi9saWIvY2VydGlmaWNhdGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGZzLCBta2RpcnAgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgZXhlY1NRTGl0ZVF1ZXJ5IH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmNvbnN0IHRzZXQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XFxuXG4gICAgPCFET0NUWVBFIHBsaXN0IFBVQkxJQyBcIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTlwiIFwiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZFwiPlxuICAgIDxwbGlzdCB2ZXJzaW9uPVwiMS4wXCI+XG4gICAgPGFycmF5Lz5cbjwvcGxpc3Q+YDtcblxuLyoqXG4gKiBMaWJyYXJ5IGZvciBwcm9ncmFtYXRpY2FsbHkgYWRkaW5nIGNlcnRpZmljYXRlc1xuICovXG5jbGFzcyBDZXJ0aWZpY2F0ZSB7XG5cbiAgY29uc3RydWN0b3IgKHBlbUZpbGVuYW1lKSB7XG4gICAgdGhpcy5wZW1GaWxlbmFtZSA9IHBlbUZpbGVuYW1lO1xuICAgIHRoaXMub3BlbnNzbEJpbmFyeSA9IG51bGw7XG4gICAgdGhpcy5maW5nZXJwcmludCA9IG51bGw7XG4gICAgdGhpcy5kYXRhID0gbnVsbDtcbiAgICB0aGlzLnN1YmplY3QgPSBudWxsO1xuICB9XG5cbiAgYXN5bmMgb3BlbnNzbCAoLi4uYXJncykge1xuICAgIGlmICghdGhpcy5vcGVuc3NsQmluYXJ5KSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm9wZW5zc2xCaW5hcnkgPSBhd2FpdCBmcy53aGljaCgnb3BlbnNzbCcpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wZW5zc2wgZXhlY3V0YWJsZSBjYW5ub3QgYmUgZm91bmQgaW4gUEFUSC4gTWFrZSBzdXJlIGl0IGlzIGluc3RhbGxlZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvZy5kZWJ1ZyhgRXhlY3V0aW5nICR7dGhpcy5vcGVuc3NsQmluYXJ5fSB3aXRoIGFyZ3VtZW50czogJHthcmdzfWApO1xuICAgIGxldCByZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYyh0aGlzLm9wZW5zc2xCaW5hcnksIGFyZ3MpO1xuICAgICAgcmVzdWx0ID0gc3Rkb3V0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLnN0ZGVycikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZS5zdGRlcnIpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjZXJ0aWZpY2F0ZSB0byB0aGUgVHJ1c3RTdG9yZVxuICAgKi9cbiAgYXN5bmMgYWRkIChkaXIpIHtcbiAgICBsZXQgZGF0YSA9IChhd2FpdCB0aGlzLmdldERlckRhdGEodGhpcy5wZW1GaWxlbmFtZSkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBsZXQgc3ViamVjdCA9IChhd2FpdCB0aGlzLmdldFN1YmplY3QodGhpcy5wZW1GaWxlbmFtZSkpO1xuICAgIGxldCBzaGExID0gKGF3YWl0IHRoaXMuZ2V0RmluZ2VyUHJpbnQodGhpcy5kYXRhKSkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgbGV0IHRydXN0U3RvcmUgPSBuZXcgVHJ1c3RTdG9yZShkaXIpO1xuICAgIHJldHVybiBhd2FpdCB0cnVzdFN0b3JlLmFkZFJlY29yZChzaGExLCB0c2V0LCBzdWJqZWN0LCBkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYga2V5Y2hhaW4gYXQgZ2l2ZW4gZGlyZWN0b3J5IGhhcyB0aGlzIGNlcnRpZmljYXRlXG4gICAqL1xuICBhc3luYyBoYXMgKGRpcikge1xuICAgIGxldCBzdWJqZWN0ID0gYXdhaXQgdGhpcy5nZXRTdWJqZWN0KHRoaXMucGVtRmlsZW5hbWUpO1xuICAgIGxldCB0cnVzdFN0b3JlID0gbmV3IFRydXN0U3RvcmUoZGlyKTtcblxuICAgIC8vIFJldHVybiBmYWxzZSBpZiByZWNvcmQgd2l0aCB0aGlzIHN1YmplY3QgaXMgbm90IGZvdW5kXG4gICAgaWYgKCFhd2FpdCB0cnVzdFN0b3JlLmhhc1JlY29yZHMoc3ViamVjdCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBJZiByZWNvcmQgaXMgZm91bmQsIGNoZWNrIGZpbmdlcnByaW50cyB0byB2ZXJpZnkgdGhhdCB0aGV5IGRpZG4ndCBjaGFuZ2VcbiAgICBsZXQgcHJldmlvdXNGaW5nZXJwcmludCA9IGF3YWl0IHRydXN0U3RvcmUuZ2V0RmluZ2VyUHJpbnRGcm9tUmVjb3JkKHN1YmplY3QpO1xuICAgIGxldCBjdXJyZW50RmluZ2VycHJpbnQgPSBhd2FpdCB0aGlzLmdldEZpbmdlclByaW50KCk7XG4gICAgcmV0dXJuIHByZXZpb3VzRmluZ2VycHJpbnQudG9TdHJpbmcoKSA9PT0gY3VycmVudEZpbmdlcnByaW50LnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGNlcnRpZmljYXRlIGZyb20gdGhlIFRydXN0U3RvcmVcbiAgICovXG4gIGFzeW5jIHJlbW92ZSAoZGlyKSB7XG4gICAgbGV0IHN1YmplY3QgPSBhd2FpdCB0aGlzLmdldFN1YmplY3QodGhpcy5wZW1GaWxlbmFtZSk7XG4gICAgbGV0IHRydXN0U3RvcmUgPSBuZXcgVHJ1c3RTdG9yZShkaXIpO1xuICAgIHJldHVybiBhd2FpdCB0cnVzdFN0b3JlLnJlbW92ZVJlY29yZChzdWJqZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2xhdGUgUEVNIGZpbGUgdG8gREVSIGJ1ZmZlclxuICAgKi9cbiAgYXN5bmMgZ2V0RGVyRGF0YSAoKSB7XG4gICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YTtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0ICdwZW0nIGZpbGUgdG8gJ2RlcidcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLm9wZW5zc2woJ3g1MDknLFxuICAgICAgJy1vdXRmb3JtJywgJ2RlcicsXG4gICAgICAnLWluJywgdGhpcy5wZW1GaWxlbmFtZVxuICAgICk7XG4gICAgdGhpcy5kYXRhID0gQnVmZmVyLmZyb20oXy50cmltKG91dHB1dCkpO1xuICAgIHJldHVybiB0aGlzLmRhdGE7XG4gIH1cblxuICAvKipcbiAgICogR2V0IFNIQTEgZmluZ2VycHJpbnQgZnJvbSBkZXIgZGF0YSBiZWZvcmVcbiAgICovXG4gIGFzeW5jIGdldEZpbmdlclByaW50ICgpIHtcbiAgICBpZiAodGhpcy5maW5nZXJwcmludCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmluZ2VycHJpbnQ7XG4gICAgfVxuXG4gICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmdldERlckRhdGEoKTtcbiAgICBsZXQgc2hhc3VtID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTEnKTtcbiAgICBzaGFzdW0udXBkYXRlKGRhdGEpO1xuICAgIHRoaXMuZmluZ2VycHJpbnQgPSBzaGFzdW0uZGlnZXN0KCk7XG4gICAgcmV0dXJuIHRoaXMuZmluZ2VycHJpbnQ7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgdGhlIHN1YmplY3QgZnJvbSB0aGUgZGVyIGRhdGFcbiAgICovXG4gIGFzeW5jIGdldFN1YmplY3QgKCkge1xuICAgIGlmICh0aGlzLnN1YmplY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLnN1YmplY3Q7XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViamVjdCA9IGF3YWl0IHRoaXMub3BlbnNzbCgneDUwOScsXG4gICAgICAnLW5vb3V0JywgJy1zdWJqZWN0JyxcbiAgICAgICctaW4nLCB0aGlzLnBlbUZpbGVuYW1lLFxuICAgICk7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE0NjY2XG4gICAgY29uc3QgbWF0Y2ggPSAvXlxccypzdWJqZWN0PS4qXFxiQ05cXGJcXHMqPVxccyooW15cXG5dKykkL20uZXhlYyhzdWJqZWN0KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBsb2cuZGVidWcoc3ViamVjdCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSBjZXJ0aWZpY2F0ZSBzdWJqZWN0IGZyb20gdGhlIG9wZW5zc2wgb3V0cHV0YCk7XG4gICAgfVxuICAgIHRoaXMuc3ViamVjdCA9IG1hdGNoWzFdO1xuICAgIHJldHVybiB0aGlzLnN1YmplY3Q7XG4gIH1cblxufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyByZWNvcmRzIHRvIFRydXN0U3RvcmUuc3FsaXRlMyBkYXRhYmFzZXMgdGhhdCBLZXljaGFpbnMgdXNlXG4gKi9cbmNsYXNzIFRydXN0U3RvcmUge1xuICBjb25zdHJ1Y3RvciAoc2hhcmVkUmVzb3VyY2VEaXIpIHtcbiAgICB0aGlzLnNoYXJlZFJlc291cmNlRGlyID0gc2hhcmVkUmVzb3VyY2VEaXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IFRydXN0U3RvcmUgZGF0YWJhc2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2ltdWxhdG9yXG4gICAqL1xuICBhc3luYyBnZXREQiAoKSB7XG4gICAgaWYgKHRoaXMuZGIpIHtcbiAgICAgIHJldHVybiB0aGlzLmRiO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBzaW0gZG9lc24ndCBoYXZlIGEga2V5Y2hhaW5zIGRpcmVjdG9yeSwgY3JlYXRlIG9uZVxuICAgIGxldCBrZXljaGFpbnNQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuc2hhcmVkUmVzb3VyY2VEaXIsICdMaWJyYXJ5JywgJ0tleWNoYWlucycpO1xuICAgIGlmICghKGF3YWl0IGZzLmV4aXN0cyhrZXljaGFpbnNQYXRoKSkpIHtcbiAgICAgIGF3YWl0IG1rZGlycChrZXljaGFpbnNQYXRoKTtcbiAgICB9XG5cbiAgICAvLyBPcGVuIHNxbGl0ZSBkYXRhYmFzZVxuICAgIHRoaXMuZGIgPSBwYXRoLnJlc29sdmUoa2V5Y2hhaW5zUGF0aCwgJ1RydXN0U3RvcmUuc3FsaXRlMycpO1xuXG4gICAgLy8gSWYgaXQgZG9lc24ndCBoYXZlIGEgdHNldHRpbmdzIHRhYmxlLCBjcmVhdGUgb25lXG4gICAgYXdhaXQgZXhlY1NRTGl0ZVF1ZXJ5KHRoaXMuZGIsIGBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyB0c2V0dGluZ3MgKHNoYTEgQkxPQiBOT1QgTlVMTCBERUZBVUxUICcnLCBzdWJqIEJMT0IgTk9UIE5VTEwgREVGQVVMVCAnJywgdHNldCBCTE9CLCBkYXRhIEJMT0IsIFBSSU1BUlkgS0VZKHNoYTEpKTtgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlY1NRTGl0ZVF1ZXJ5KHRoaXMuZGIsICdDUkVBVEUgSU5ERVggaXN1YmogT04gdHNldHRpbmdzKHN1YmopOycpO1xuICAgIH0gY2F0Y2ggKGUpIHsgfVxuXG5cbiAgICByZXR1cm4gdGhpcy5kYjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgcmVjb3JkIHRvIHRzZXR0aW5nc1xuICAgKi9cbiAgYXN5bmMgYWRkUmVjb3JkIChzaGExLCB0c2V0LCBzdWJqLCBkYXRhKSB7XG4gICAgbGV0IGRiID0gYXdhaXQgdGhpcy5nZXREQigpO1xuICAgIGlmIChhd2FpdCB0aGlzLmhhc1JlY29yZHMoc3ViaikpIHtcbiAgICAgIHJldHVybiBhd2FpdCBleGVjU1FMaXRlUXVlcnkoZGIsIGBVUERBVEUgdHNldHRpbmdzIFNFVCBzaGExPXgnPycsIHRzZXQ9Jz8nLCBkYXRhPXgnPycgV0hFUkUgc3Viaj0nPydgLCBzaGExLCB0c2V0LCBkYXRhLCBzdWJqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGF3YWl0IGV4ZWNTUUxpdGVRdWVyeShkYiwgYElOU0VSVCBJTlRPIHRzZXR0aW5ncyAoc2hhMSwgc3ViaiwgdHNldCwgZGF0YSkgVkFMVUVTICh4Jz8nLCAnPycsICc/JywgeCc/JylgLCBzaGExLCBzdWJqLCB0c2V0LCBkYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHJlY29yZCBmcm9tIHRzZXR0aW5ncyB0aGF0IG1hdGNoZXMgdGhlIHN1YmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1YmpcbiAgICovXG4gIGFzeW5jIHJlbW92ZVJlY29yZCAoc3Viaikge1xuICAgIHJldHVybiBhd2FpdCBleGVjU1FMaXRlUXVlcnkoYXdhaXQgdGhpcy5nZXREQigpLCBgREVMRVRFIEZST00gdHNldHRpbmdzIFdIRVJFIHN1YmogPSAnPydgLCBzdWJqKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSByZWNvcmQgZnJvbSB0c2V0dGluZ3MgdGhhdCBtYXRjaGVzIHRoZSBzdWJqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWJqXG4gICAqL1xuICBhc3luYyBoYXNSZWNvcmRzIChzdWJqKSB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldFJlY29yZENvdW50KHN1YmopKSA+IDA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvdW50IG9mIGhvdyBtYW55IHJlY29yZHMgaGF2ZSB0aGlzIHN1YmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1YmpcbiAgICovXG4gIGFzeW5jIGdldFJlY29yZENvdW50IChzdWJqKSB7XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IGV4ZWNTUUxpdGVRdWVyeShhd2FpdCB0aGlzLmdldERCKCksIGBTRUxFQ1QgY291bnQoKikgRlJPTSB0c2V0dGluZ3MgV0hFUkUgc3ViaiA9ICc/J2AsIHN1YmopO1xuICAgIHJldHVybiBwYXJzZUludChyZXN1bHQuc3BsaXQoJz0nKVsxXSwgMTApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgU0hBMSBmaW5nZXJwcmludCBmb3IgdGhlIHJlY29yZCB0aGF0IGhhcyB0aGlzIHN1YmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1YmpcbiAgICovXG4gIGFzeW5jIGdldEZpbmdlclByaW50RnJvbVJlY29yZCAoc3Viaikge1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBleGVjU1FMaXRlUXVlcnkoYXdhaXQgdGhpcy5nZXREQigpLCBgU0VMRUNUIHNoYTEgRlJPTSB0c2V0dGluZ3MgV0hFUkUgc3Viaj0nPydgLCBzdWJqKTtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20ocmVzdWx0LnNwbGl0KCc9JylbMV0udHJpbSgpKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2VydGlmaWNhdGU7XG5leHBvcnQgeyBDZXJ0aWZpY2F0ZSwgVHJ1c3RTdG9yZSB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEsSUFBSSxHQUFJO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFLVCxNQUFNQyxXQUFXLENBQUM7RUFFaEJDLFdBQVcsQ0FBRUMsV0FBVyxFQUFFO0lBQ3hCLElBQUksQ0FBQ0EsV0FBVyxHQUFHQSxXQUFXO0lBQzlCLElBQUksQ0FBQ0MsYUFBYSxHQUFHLElBQUk7SUFDekIsSUFBSSxDQUFDQyxXQUFXLEdBQUcsSUFBSTtJQUN2QixJQUFJLENBQUNDLElBQUksR0FBRyxJQUFJO0lBQ2hCLElBQUksQ0FBQ0MsT0FBTyxHQUFHLElBQUk7RUFDckI7RUFFQSxNQUFNQyxPQUFPLENBQUUsR0FBR0MsSUFBSSxFQUFFO0lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUNMLGFBQWEsRUFBRTtNQUN2QixJQUFJO1FBQ0YsSUFBSSxDQUFDQSxhQUFhLEdBQUcsTUFBTU0sV0FBRSxDQUFDQyxLQUFLLENBQUMsU0FBUyxDQUFDO01BQ2hELENBQUMsQ0FBQyxPQUFPQyxDQUFDLEVBQUU7UUFDVixNQUFNLElBQUlDLEtBQUssQ0FBQyx1RUFBdUUsQ0FBQztNQUMxRjtJQUNGO0lBRUFDLGVBQUcsQ0FBQ0MsS0FBSyxDQUFFLGFBQVksSUFBSSxDQUFDWCxhQUFjLG9CQUFtQkssSUFBSyxFQUFDLENBQUM7SUFDcEUsSUFBSU8sTUFBTTtJQUNWLElBQUk7TUFDRixNQUFNO1FBQUNDO01BQU0sQ0FBQyxHQUFHLE1BQU0sSUFBQUMsa0JBQUksRUFBQyxJQUFJLENB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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"certificate.js","names":["tset","Certificate","constructor","pemFilename","opensslBinary","fingerprint","data","subject","openssl","args","fs","which","e","Error","log","debug","result","stdout","exec","stderr","add","dir","getDerData","toString","getSubject","sha1","getFingerPrint","trustStore","TrustStore","addRecord","has","hasRecords","previousFingerprint","getFingerPrintFromRecord","currentFingerprint","remove","removeRecord","output","Buffer","from","_","trim","shasum","crypto","createHash","update","digest","match","sharedResourceDir","getDB","db","keychainsPath","path","resolve","exists","mkdirp","execSQLiteQuery","subj","getRecordCount","parseInt","split"],"sources":["../../lib/certificate.js"],"sourcesContent":["import crypto from 'crypto';\nimport { exec } from 'teen_process';\nimport path from 'path';\nimport { fs, mkdirp } from '@appium/support';\nimport { execSQLiteQuery } from './utils';\nimport log from './logger';\nimport _ from 'lodash';\n\nconst tset = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n\n <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n <plist version=\"1.0\">\n <array/>\n</plist>`;\n\n/**\n * Library for programatically adding certificates\n */\nclass Certificate {\n\n constructor (pemFilename) {\n this.pemFilename = pemFilename;\n this.opensslBinary = null;\n this.fingerprint = null;\n this.data = null;\n this.subject = null;\n }\n\n async openssl (...args) {\n if (!this.opensslBinary) {\n try {\n this.opensslBinary = await fs.which('openssl');\n } catch (e) {\n throw new Error('openssl executable cannot be found in PATH. Make sure it is installed');\n }\n }\n\n log.debug(`Executing ${this.opensslBinary} with arguments: ${args}`);\n let result;\n try {\n const {stdout} = await exec(this.opensslBinary, args);\n result = stdout;\n } catch (e) {\n if (e.stderr) {\n throw new Error(e.stderr);\n }\n throw e;\n }\n return result;\n }\n\n /**\n * Add a certificate to the TrustStore\n */\n async add (dir) {\n let data = (await this.getDerData(this.pemFilename)).toString('hex');\n let subject = (await this.getSubject(this.pemFilename));\n let sha1 = (await this.getFingerPrint(this.data)).toString('hex');\n\n let trustStore = new TrustStore(dir);\n return await trustStore.addRecord(sha1, tset, subject, data);\n }\n\n /**\n * Checks if keychain at given directory has this certificate\n */\n async has (dir) {\n let subject = await this.getSubject(this.pemFilename);\n let trustStore = new TrustStore(dir);\n\n // Return false if record with this subject is not found\n if (!await trustStore.hasRecords(subject)) {\n return false;\n }\n\n // If record is found, check fingerprints to verify that they didn't change\n let previousFingerprint = await trustStore.getFingerPrintFromRecord(subject);\n let currentFingerprint = await this.getFingerPrint();\n return previousFingerprint.toString() === currentFingerprint.toString();\n }\n\n /**\n * Remove certificate from the TrustStore\n */\n async remove (dir) {\n let subject = await this.getSubject(this.pemFilename);\n let trustStore = new TrustStore(dir);\n return await trustStore.removeRecord(subject);\n }\n\n /**\n * Translate PEM file to DER buffer\n */\n async getDerData () {\n if (this.data) {\n return this.data;\n }\n\n // Convert 'pem' file to 'der'\n const output = await this.openssl('x509',\n '-outform', 'der',\n '-in', this.pemFilename\n );\n this.data = Buffer.from(_.trim(output));\n return this.data;\n }\n\n /**\n * Get SHA1 fingerprint from der data before\n */\n async getFingerPrint () {\n if (this.fingerprint) {\n return this.fingerprint;\n }\n\n let data = await this.getDerData();\n let shasum = crypto.createHash('sha1');\n shasum.update(data);\n this.fingerprint = shasum.digest();\n return this.fingerprint;\n }\n\n /**\n * Parse the subject from the der data\n */\n async getSubject () {\n if (this.subject) {\n return this.subject;\n }\n\n const subject = await this.openssl('x509',\n '-noout', '-subject',\n '-in', this.pemFilename,\n );\n // https://github.com/appium/appium/issues/14666\n const match = /^\\s*subject=.*\\bCN\\b\\s*=\\s*([^\\n]+)$/m.exec(subject);\n if (!match) {\n log.debug(subject);\n throw new Error(`Cannot parse certificate subject from the openssl output`);\n }\n this.subject = match[1];\n return this.subject;\n }\n\n}\n\n/**\n * Interface for adding and removing records to TrustStore.sqlite3 databases that Keychains use\n */\nclass TrustStore {\n constructor (sharedResourceDir) {\n this.sharedResourceDir = sharedResourceDir;\n }\n\n /**\n * Get TrustStore database associated with this simulator\n */\n async getDB () {\n if (this.db) {\n return this.db;\n }\n\n // If the sim doesn't have a keychains directory, create one\n let keychainsPath = path.resolve(this.sharedResourceDir, 'Library', 'Keychains');\n if (!(await fs.exists(keychainsPath))) {\n await mkdirp(keychainsPath);\n }\n\n // Open sqlite database\n this.db = path.resolve(keychainsPath, 'TrustStore.sqlite3');\n\n // If it doesn't have a tsettings table, create one\n await execSQLiteQuery(this.db, `CREATE TABLE IF NOT EXISTS tsettings (sha1 BLOB NOT NULL DEFAULT '', subj BLOB NOT NULL DEFAULT '', tset BLOB, data BLOB, PRIMARY KEY(sha1));`);\n try {\n await execSQLiteQuery(this.db, 'CREATE INDEX isubj ON tsettings(subj);');\n } catch (e) { }\n\n\n return this.db;\n }\n\n /**\n * Add record to tsettings\n */\n async addRecord (sha1, tset, subj, data) {\n let db = await this.getDB();\n if (await this.hasRecords(subj)) {\n return await execSQLiteQuery(db, `UPDATE tsettings SET sha1=x'?', tset='?', data=x'?' WHERE subj='?'`, sha1, tset, data, subj);\n } else {\n return await execSQLiteQuery(db, `INSERT INTO tsettings (sha1, subj, tset, data) VALUES (x'?', '?', '?', x'?')`, sha1, subj, tset, data);\n }\n }\n\n /**\n * Remove record from tsettings that matches the subject\n * @param {string} subj\n */\n async removeRecord (subj) {\n return await execSQLiteQuery(await this.getDB(), `DELETE FROM tsettings WHERE subj = '?'`, subj);\n }\n\n /**\n * Get a record from tsettings that matches the subj\n * @param {string} subj\n */\n async hasRecords (subj) {\n return (await this.getRecordCount(subj)) > 0;\n }\n\n /**\n * Get count of how many records have this subject\n * @param {string} subj\n */\n async getRecordCount (subj) {\n let result = await execSQLiteQuery(await this.getDB(), `SELECT count(*) FROM tsettings WHERE subj = '?'`, subj);\n return parseInt(result.split('=')[1], 10);\n }\n\n /**\n * Get the SHA1 fingerprint for the record that has this subject\n * @param {string} subj\n */\n async getFingerPrintFromRecord (subj) {\n let result = await execSQLiteQuery(await this.getDB(), `SELECT sha1 FROM tsettings WHERE subj='?'`, subj);\n if (result) {\n return Buffer.from(result.split('=')[1].trim());\n }\n }\n}\n\nexport default Certificate;\nexport { Certificate, TrustStore };\n"],"mappings":"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"}
@@ -1,32 +1,22 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.NSUserDefaults = void 0;
9
8
  exports.generateDefaultsCommandArgs = generateDefaultsCommandArgs;
10
9
  exports.toXmlArg = toXmlArg;
11
-
12
10
  require("source-map-support/register");
13
-
14
11
  var _lodash = _interopRequireDefault(require("lodash"));
15
-
16
12
  var _xmldom = require("@xmldom/xmldom");
17
-
18
13
  var _teen_process = require("teen_process");
19
-
20
14
  var _bluebird = _interopRequireDefault(require("bluebird"));
21
-
22
15
  var _logger = _interopRequireDefault(require("./logger"));
23
-
24
16
  function toXmlArg(value, serialize = true) {
25
17
  let xmlDoc = null;
26
-
27
18
  if (_lodash.default.isPlainObject(value)) {
28
19
  xmlDoc = new _xmldom.DOMParser().parseFromString('<dict></dict>', 'text/xml');
29
-
30
20
  for (const [subKey, subValue] of _lodash.default.toPairs(value)) {
31
21
  const keyEl = xmlDoc.createElement('key');
32
22
  const keyTextEl = xmlDoc.createTextNode(subKey);
@@ -37,7 +27,6 @@ function toXmlArg(value, serialize = true) {
37
27
  }
38
28
  } else if (_lodash.default.isArray(value)) {
39
29
  xmlDoc = new _xmldom.DOMParser().parseFromString('<array></array>', 'text/xml');
40
-
41
30
  for (const subValue of value) {
42
31
  const subValueEl = xmlDoc.importNode(toXmlArg(subValue, false), true);
43
32
  xmlDoc.documentElement.appendChild(subValueEl);
@@ -53,34 +42,27 @@ function toXmlArg(value, serialize = true) {
53
42
  const valueTextEl = xmlDoc.createTextNode(value);
54
43
  xmlDoc.documentElement.appendChild(valueTextEl);
55
44
  }
56
-
57
45
  if (!xmlDoc) {
58
46
  throw new TypeError(`The defaults value ${JSON.stringify(value)} cannot be written, ` + `because it is not known how to handle its type`);
59
47
  }
60
-
61
48
  return serialize ? new _xmldom.XMLSerializer().serializeToString(xmlDoc.documentElement) : xmlDoc.documentElement;
62
49
  }
63
50
 
64
51
  function generateDefaultsCommandArgs(valuesMap, replace = false) {
65
52
  const resultArgs = [];
66
-
67
53
  for (const [key, value] of _lodash.default.toPairs(valuesMap)) {
68
54
  try {
69
55
  if (!replace && _lodash.default.isPlainObject(value)) {
70
56
  const dictArgs = [key, '-dict-add'];
71
-
72
57
  for (const [subKey, subValue] of _lodash.default.toPairs(value)) {
73
58
  dictArgs.push(subKey, toXmlArg(subValue));
74
59
  }
75
-
76
60
  resultArgs.push(dictArgs);
77
61
  } else if (!replace && _lodash.default.isArray(value)) {
78
62
  const arrayArgs = [key, '-array-add'];
79
-
80
63
  for (const subValue of value) {
81
64
  arrayArgs.push(toXmlArg(subValue));
82
65
  }
83
-
84
66
  resultArgs.push(arrayArgs);
85
67
  } else {
86
68
  resultArgs.push([key, toXmlArg(value)]);
@@ -93,10 +75,8 @@ function generateDefaultsCommandArgs(valuesMap, replace = false) {
93
75
  }
94
76
  }
95
77
  }
96
-
97
78
  return resultArgs;
98
79
  }
99
-
100
80
  class NSUserDefaults {
101
81
  constructor(plist) {
102
82
  this.plist = plist;
@@ -117,21 +97,16 @@ class NSUserDefaults {
117
97
  if (!_lodash.default.isPlainObject(valuesMap)) {
118
98
  throw new TypeError(`plist values must be a map. '${valuesMap}' is given instead`);
119
99
  }
120
-
121
100
  if (_lodash.default.isEmpty(valuesMap)) {
122
101
  return;
123
102
  }
124
-
125
103
  const commandArgs = generateDefaultsCommandArgs(valuesMap);
126
-
127
104
  try {
128
105
  await _bluebird.default.all(commandArgs.map(args => (0, _teen_process.exec)('defaults', ['write', this.plist, ...args])));
129
106
  } catch (e) {
130
107
  throw new Error(`Could not write defaults into '${this.plist}'. Original error: ${e.stderr || e.message}`);
131
108
  }
132
109
  }
133
-
134
110
  }
135
-
136
111
  exports.NSUserDefaults = NSUserDefaults;
137
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0b1htbEFyZyIsInZhbHVlIiwic2VyaWFsaXplIiwieG1sRG9jIiwiXyIsImlzUGxhaW5PYmplY3QiLCJET01QYXJzZXIiLCJwYXJzZUZyb21TdHJpbmciLCJzdWJLZXkiLCJzdWJWYWx1ZSIsInRvUGFpcnMiLCJrZXlFbCIsImNyZWF0ZUVsZW1lbnQiLCJrZXlUZXh0RWwiLCJjcmVhdGVUZXh0Tm9kZSIsImFwcGVuZENoaWxkIiwiZG9jdW1lbnRFbGVtZW50Iiwic3ViVmFsdWVFbCIsImltcG9ydE5vZGUiLCJpc0FycmF5IiwiaXNCb29sZWFuIiwiaXNJbnRlZ2VyIiwiaXNOdW1iZXIiLCJpc1N0cmluZyIsInZhbHVlVGV4dEVsIiwiVHlwZUVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsIlhNTFNlcmlhbGl6ZXIiLCJzZXJpYWxpemVUb1N0cmluZyIsImdlbmVyYXRlRGVmYXVsdHNDb21tYW5kQXJncyIsInZhbHVlc01hcCIsInJlcGxhY2UiLCJyZXN1bHRBcmdzIiwia2V5IiwiZGljdEFyZ3MiLCJwdXNoIiwiYXJyYXlBcmdzIiwiZSIsImxvZyIsIndhcm4iLCJtZXNzYWdlIiwiTlNVc2VyRGVmYXVsdHMiLCJjb25zdHJ1Y3RvciIsInBsaXN0IiwiYXNKc29uIiwic3Rkb3V0IiwiZXhlYyIsInBhcnNlIiwiRXJyb3IiLCJzdGRlcnIiLCJ1cGRhdGUiLCJpc0VtcHR5IiwiY29tbWFuZEFyZ3MiLCJCIiwiYWxsIiwibWFwIiwiYXJncyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9kZWZhdWx0cy11dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRE9NUGFyc2VyLCBYTUxTZXJpYWxpemVyIH0gZnJvbSAnQHhtbGRvbS94bWxkb20nO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBnaXZlbiB2YWx1ZSB0byBwbGlzdC1jb21wYXRpYmxlXG4gKiBYTUwgcmVwcmVzZW50YXRpb24sIHdoaWNoIGlzIHJlYWR5IGZvciBmdXJ0aGVyIHVzYWdlXG4gKiB3aXRoIGBkZWZhdWx0c2AgY29tbWFuZCBsaW5lIHRvb2wgYXJndW1lbnRzXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgc2VyaWFsaXplZFxuICogQHBhcmFtIHtib29sZWFufSBzZXJpYWxpemUgW3RydWVdIFdoZXRoZXIgdG8gc2VyaWFsaXplIHRoZSByZXN1bHRpbmdcbiAqIFhNTCB0byBzdHJpbmcgb3IgdG8gcmV0dXJuIHJhdyBIVE1MRWxlbWVudCBpbnN0YW5jZVxuICogQHJldHVybnMge0hUTUxFbGVtZW50fHN0cmluZ30gRWl0aGVyIHN0cmluZyBvciByYXcgbm9kZSByZXByZXNlbnRhdGlvbiBvZlxuICogdGhlIGdpdmVuIHZhbHVlXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIGl0IGlzIG5vdCBrbm93biBob3cgdG8gc2VyaWFsaXplIHRoZSBnaXZlbiB2YWx1ZVxuICovXG5mdW5jdGlvbiB0b1htbEFyZyAodmFsdWUsIHNlcmlhbGl6ZSA9IHRydWUpIHtcbiAgbGV0IHhtbERvYyA9IG51bGw7XG5cbiAgaWYgKF8uaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICB4bWxEb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKCc8ZGljdD48L2RpY3Q+JywgJ3RleHQveG1sJyk7XG4gICAgZm9yIChjb25zdCBbc3ViS2V5LCBzdWJWYWx1ZV0gb2YgXy50b1BhaXJzKHZhbHVlKSkge1xuICAgICAgY29uc3Qga2V5RWwgPSB4bWxEb2MuY3JlYXRlRWxlbWVudCgna2V5Jyk7XG4gICAgICBjb25zdCBrZXlUZXh0RWwgPSB4bWxEb2MuY3JlYXRlVGV4dE5vZGUoc3ViS2V5KTtcbiAgICAgIGtleUVsLmFwcGVuZENoaWxkKGtleVRleHRFbCk7XG4gICAgICB4bWxEb2MuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGtleUVsKTtcbiAgICAgIGNvbnN0IHN1YlZhbHVlRWwgPSB4bWxEb2MuaW1wb3J0Tm9kZSh0b1htbEFyZyhzdWJWYWx1ZSwgZmFsc2UpLCB0cnVlKTtcbiAgICAgIHhtbERvYy5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoc3ViVmFsdWVFbCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKF8uaXNBcnJheSh2YWx1ZSkpIHtcbiAgICB4bWxEb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKCc8YXJyYXk+PC9hcnJheT4nLCAndGV4dC94bWwnKTtcbiAgICBmb3IgKGNvbnN0IHN1YlZhbHVlIG9mIHZhbHVlKSB7XG4gICAgICBjb25zdCBzdWJWYWx1ZUVsID0geG1sRG9jLmltcG9ydE5vZGUodG9YbWxBcmcoc3ViVmFsdWUsIGZhbHNlKSwgdHJ1ZSk7XG4gICAgICB4bWxEb2MuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHN1YlZhbHVlRWwpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChfLmlzQm9vbGVhbih2YWx1ZSkpIHtcbiAgICB4bWxEb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHZhbHVlID8gJzx0cnVlLz4nIDogJzxmYWxzZS8+JywgJ3RleHQveG1sJyk7XG4gIH0gZWxzZSBpZiAoXy5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgeG1sRG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhgPGludGVnZXI+JHt2YWx1ZX08L2ludGVnZXI+YCwgJ3RleHQveG1sJyk7XG4gIH0gZWxzZSBpZiAoXy5pc051bWJlcih2YWx1ZSkpIHtcbiAgICB4bWxEb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGA8cmVhbD4ke3ZhbHVlfTwvcmVhbD5gLCAndGV4dC94bWwnKTtcbiAgfSBlbHNlIGlmIChfLmlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHhtbERvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoYDxzdHJpbmc+PC9zdHJpbmc+YCwgJ3RleHQveG1sJyk7XG4gICAgY29uc3QgdmFsdWVUZXh0RWwgPSB4bWxEb2MuY3JlYXRlVGV4dE5vZGUodmFsdWUpO1xuICAgIHhtbERvYy5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodmFsdWVUZXh0RWwpO1xuICB9XG5cbiAgaWYgKCF4bWxEb2MpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBUaGUgZGVmYXVsdHMgdmFsdWUgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9IGNhbm5vdCBiZSB3cml0dGVuLCBgICtcbiAgICAgIGBiZWNhdXNlIGl0IGlzIG5vdCBrbm93biBob3cgdG8gaGFuZGxlIGl0cyB0eXBlYCk7XG4gIH1cblxuICByZXR1cm4gc2VyaWFsaXplXG4gICAgPyBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHhtbERvYy5kb2N1bWVudEVsZW1lbnQpXG4gICAgOiB4bWxEb2MuZG9jdW1lbnRFbGVtZW50O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBjb21tYW5kIGxpbmUgYXJncyBmb3IgdGhlIGBkZWZhdWx0c2BcbiAqIGNvbW1hbmQgbGluZSB1dGlsaXR5IGJhc2VkIG9uIHRoZSBnaXZlbiBwcmVmZXJlbmNlIHZhbHVlcyBtYXBwaW5nLlxuICogU2VlIGh0dHBzOi8vc2hhZG93ZmlsZS5pbm9kZS5saW5rL2Jsb2cvMjAxOC8wNi9hZHZhbmNlZC1kZWZhdWx0czEtdXNhZ2UvXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXNNYXAgUHJlZmVyZW5jZXMgbWFwcGluZ1xuICogQHBhcmFtIHtCb29sZWFufSByZXBsYWNlIFtmYWxzZV0gV2hldGhlciB0byBnZW5lcmF0ZSBhcmd1bWVudHMgdGhhdCByZXBsYWNlXG4gKiBjb21wbGV4IHR5cGVkIHZhbHVlcyBsaWtlIGFycmF5cyBvciBkaWN0aW9uYXJpZXMgaW4gdGhlIGN1cnJlbnQgcGxpc3Qgb3JcbiAqIHVwZGF0ZSB0aGVtICh0aGUgZGVmYXVsdCBzZXR0aW5ncylcbiAqIEByZXR1cm5zIHtBcnJheTxBcnJheTxzdHJpbmc+Pn0gRWFjaCBpdGVtIGluIHRoZSBhcnJheVxuICogaXMgdGhlIGBkZWZhdWx0cyB3cml0ZSA8cGxpc3Q+YCBjb21tYW5kIHN1ZmZpeFxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZURlZmF1bHRzQ29tbWFuZEFyZ3MgKHZhbHVlc01hcCwgcmVwbGFjZSA9IGZhbHNlKSB7XG4gIGNvbnN0IHJlc3VsdEFyZ3MgPSBbXTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKHZhbHVlc01hcCkpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFyZXBsYWNlICYmIF8uaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgZGljdEFyZ3MgPSBba2V5LCAnLWRpY3QtYWRkJ107XG4gICAgICAgIGZvciAoY29uc3QgW3N1YktleSwgc3ViVmFsdWVdIG9mIF8udG9QYWlycyh2YWx1ZSkpIHtcbiAgICAgICAgICBkaWN0QXJncy5wdXNoKHN1YktleSwgdG9YbWxBcmcoc3ViVmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRBcmdzLnB1c2goZGljdEFyZ3MpO1xuICAgICAgfSBlbHNlIGlmICghcmVwbGFjZSAmJiBfLmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGFycmF5QXJncyA9IFtrZXksICctYXJyYXktYWRkJ107XG4gICAgICAgIGZvciAoY29uc3Qgc3ViVmFsdWUgb2YgdmFsdWUpIHtcbiAgICAgICAgICBhcnJheUFyZ3MucHVzaCh0b1htbEFyZyhzdWJWYWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdEFyZ3MucHVzaChhcnJheUFyZ3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0QXJncy5wdXNoKFtrZXksIHRvWG1sQXJnKHZhbHVlKV0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgVHlwZUVycm9yKSB7XG4gICAgICAgIGxvZy53YXJuKGUubWVzc2FnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0QXJncztcbn1cblxuXG5jbGFzcyBOU1VzZXJEZWZhdWx0cyB7XG4gIGNvbnN0cnVjdG9yIChwbGlzdCkge1xuICAgIHRoaXMucGxpc3QgPSBwbGlzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gcGxpc3QgZmlsZSB1c2luZyBwbHV0aWwgY29tbWFuZCBsaW5lIHRvb2xcbiAgICogYW5kIHNlcmlhbGl6ZXMgaXQgdG8gYSBKU09OIHJlcHJlc2VudGF0aW9uXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBzZXJpYWxpemVkIHBsaXN0IGNvbnRlbnRcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciBkdXJpbmcgc2VyaWFsaXphdGlvblxuICAgKi9cbiAgYXN5bmMgYXNKc29uICgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKCdwbHV0aWwnLCBbJy1jb252ZXJ0JywgJ2pzb24nLCAnLW8nLCAnLScsIHRoaXMucGxpc3RdKTtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHN0ZG91dCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHt0aGlzLnBsaXN0fScgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBKU09OLiBPcmlnaW5hbCBlcnJvcjogJHtlLnN0ZGVyciB8fCBlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIHBsaXN0IGZpbGUuXG4gICAqIElmIHRoZSBwbGlzdCBkb2VzIG5vdCBleGlzdCB5ZXQgdGhlbiBpdCBpcyBnb2luZyB0byBiZSBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzTWFwIE1hcHBpbmcgb2YgcHJlZmVyZW5jZSB2YWx1ZXMgdG8gdXBkYXRlLlxuICAgKiBJZiBhbnkgb2YgaXRlbSB2YWx1ZXMgYXJlIG9mIGRpY3Rpb25hcnkgdHlwZSB0aGVuIG9ubHkgdGhlIGZpcnN0IGxldmVsIGRpY3Rpb25hcnkgZ2V0c1xuICAgKiB1cGRhdGVkLiBFdmVyeXRoaW5nIGJlbG93IHRoaXMgbGV2ZWwgd2lsbCBiZSByZXBsYWNlZC4gVGhpcyBpcyB0aGUga25vd24gbGltaXRhdGlvblxuICAgKiBvZiB0aGUgYGRlZmF1bHRzYCBjb21tYW5kIGxpbmUgdG9vbC4gQSB3b3JrYXJvdW5kIGZvciBpdCB3b3VsZCBiZSB0byByZWFkIHRoZSBjdXJyZW50XG4gICAqIHByZWZlcmVuY2VzIG1hcHBpbmcgZmlyc3QgYW5kIG1lcmdlIGl0IHdpdGggdGhpcyB2YWx1ZS5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSB1cGRhdGluZyB0aGUgcGxpc3RcbiAgICovXG4gIGFzeW5jIHVwZGF0ZSAodmFsdWVzTWFwKSB7XG4gICAgaWYgKCFfLmlzUGxhaW5PYmplY3QodmFsdWVzTWFwKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgcGxpc3QgdmFsdWVzIG11c3QgYmUgYSBtYXAuICcke3ZhbHVlc01hcH0nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eSh2YWx1ZXNNYXApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZEFyZ3MgPSBnZW5lcmF0ZURlZmF1bHRzQ29tbWFuZEFyZ3ModmFsdWVzTWFwKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgQi5hbGwoY29tbWFuZEFyZ3MubWFwKChhcmdzKSA9PiBleGVjKCdkZWZhdWx0cycsIFsnd3JpdGUnLCB0aGlzLnBsaXN0LCAuLi5hcmdzXSkpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCB3cml0ZSBkZWZhdWx0cyBpbnRvICcke3RoaXMucGxpc3R9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufVxuXG5cbmV4cG9ydCB7XG4gIE5TVXNlckRlZmF1bHRzLFxuICB0b1htbEFyZywgZ2VuZXJhdGVEZWZhdWx0c0NvbW1hbmRBcmdzLFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQWNBLFNBQVNBLFFBQVQsQ0FBbUJDLEtBQW5CLEVBQTBCQyxTQUFTLEdBQUcsSUFBdEMsRUFBNEM7RUFDMUMsSUFBSUMsTUFBTSxHQUFHLElBQWI7O0VBRUEsSUFBSUMsZUFBQSxDQUFFQyxhQUFGLENBQWdCSixLQUFoQixDQUFKLEVBQTRCO0lBQzFCRSxNQUFNLEdBQUcsSUFBSUcsaUJBQUosR0FBZ0JDLGVBQWhCLENBQWdDLGVBQWhDLEVBQWlELFVBQWpELENBQVQ7O0lBQ0EsS0FBSyxNQUFNLENBQUNDLE1BQUQsRUFBU0MsUUFBVCxDQUFYLElBQWlDTCxlQUFBLENBQUVNLE9BQUYsQ0FBVVQsS0FBVixDQUFqQyxFQUFtRDtNQUNqRCxNQUFNVSxLQUFLLEdBQUdSLE1BQU0sQ0FBQ1MsYUFBUCxDQUFxQixLQUFyQixDQUFkO01BQ0EsTUFBTUMsU0FBUyxHQUFHVixNQUFNLENBQUNXLGNBQVAsQ0FBc0JOLE1BQXRCLENBQWxCO01BQ0FHLEtBQUssQ0FBQ0ksV0FBTixDQUFrQkYsU0FBbEI7TUFDQVYsTUFBTSxDQUFDYSxlQUFQLENBQXVCRCxXQUF2QixDQUFtQ0osS0FBbkM7TUFDQSxNQUFNTSxVQUFVLEdBQUdkLE1BQU0sQ0FBQ2UsVUFBUCxDQUFrQmxCLFFBQVEsQ0FBQ1MsUUFBRCxFQUFXLEtBQVgsQ0FB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
112
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0b1htbEFyZyIsInZhbHVlIiwic2VyaWFsaXplIiwieG1sRG9jIiwiXyIsImlzUGxhaW5PYmplY3QiLCJET01QYXJzZXIiLCJwYXJzZUZyb21TdHJpbmciLCJzdWJLZXkiLCJzdWJWYWx1ZSIsInRvUGFpcnMiLCJrZXlFbCIsImNyZWF0ZUVsZW1lbnQiLCJrZXlUZXh0RWwiLCJjcmVhdGVUZXh0Tm9kZSIsImFwcGVuZENoaWxkIiwiZG9jdW1lbnRFbGVtZW50Iiwic3ViVmFsdWVFbCIsImltcG9ydE5vZGUiLCJpc0FycmF5IiwiaXNCb29sZWFuIiwiaXNJbnRlZ2VyIiwiaXNOdW1iZXIiLCJpc1N0cmluZyIsInZhbHVlVGV4dEVsIiwiVHlwZUVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsIlhNTFNlcmlhbGl6ZXIiLCJzZXJpYWxpemVUb1N0cmluZyIsImdlbmVyYXRlRGVmYXVsdHNDb21tYW5kQXJncyIsInZhbHVlc01hcCIsInJlcGxhY2UiLCJyZXN1bHRBcmdzIiwia2V5IiwiZGljdEFyZ3MiLCJwdXNoIiwiYXJyYXlBcmdzIiwiZSIsImxvZyIsIndhcm4iLCJtZXNzYWdlIiwiTlNVc2VyRGVmYXVsdHMiLCJjb25zdHJ1Y3RvciIsInBsaXN0IiwiYXNKc29uIiwic3Rkb3V0IiwiZXhlYyIsInBhcnNlIiwiRXJyb3IiLCJzdGRlcnIiLCJ1cGRhdGUiLCJpc0VtcHR5IiwiY29tbWFuZEFyZ3MiLCJCIiwiYWxsIiwibWFwIiwiYXJncyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9kZWZhdWx0cy11dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRE9NUGFyc2VyLCBYTUxTZXJpYWxpemVyIH0gZnJvbSAnQHhtbGRvbS94bWxkb20nO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBnaXZlbiB2YWx1ZSB0byBwbGlzdC1jb21wYXRpYmxlXG4gKiBYTUwgcmVwcmVzZW50YXRpb24sIHdoaWNoIGlzIHJlYWR5IGZvciBmdXJ0aGVyIHVzYWdlXG4gKiB3aXRoIGBkZWZhdWx0c2AgY29tbWFuZCBsaW5lIHRvb2wgYXJndW1lbnRzXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgc2VyaWFsaXplZFxuICogQHBhcmFtIHtib29sZWFufSBzZXJpYWxpemUgW3RydWVdIFdoZXRoZXIgdG8gc2VyaWFsaXplIHRoZSByZXN1bHRpbmdcbiAqIFhNTCB0byBzdHJpbmcgb3IgdG8gcmV0dXJuIHJhdyBIVE1MRWxlbWVudCBpbnN0YW5jZVxuICogQHJldHVybnMge0hUTUxFbGVtZW50fHN0cmluZ30gRWl0aGVyIHN0cmluZyBvciByYXcgbm9kZSByZXByZXNlbnRhdGlvbiBvZlxuICogdGhlIGdpdmVuIHZhbHVlXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIGl0IGlzIG5vdCBrbm93biBob3cgdG8gc2VyaWFsaXplIHRoZSBnaXZlbiB2YWx1ZVxuICovXG5mdW5jdGlvbiB0b1htbEFyZyAodmFsdWUsIHNlcmlhbGl6ZSA9IHRydWUpIHtcbiAgbGV0IHhtbERvYyA9IG51bGw7XG5cbiAgaWYgKF8uaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICB4bWxEb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKCc8ZGljdD48L2RpY3Q+JywgJ3RleHQveG1sJyk7XG4gICAgZm9yIChjb25zdCBbc3ViS2V5LCBzdWJWYWx1ZV0gb2YgXy50b1BhaXJzKHZhbHVlKSkge1xuICAgICAgY29uc3Qga2V5RWwgPSB4bWxEb2MuY3JlYXRlRWxlbWVudCgna2V5Jyk7XG4gICAgICBjb25zdCBrZXlUZXh0RWwgPSB4bWxEb2MuY3JlYXRlVGV4dE5vZGUoc3ViS2V5KTtcbiAgICAgIGtleUVsLmFwcGVuZENoaWxkKGtleVRleHRFbCk7XG4gICAgICB4bWxEb2MuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGtleUVsKTtcbiAgICAgIGNvbnN0IHN1YlZhbHVlRWwgPSB4bWxEb2MuaW1wb3J0Tm9kZSh0b1htbEFyZyhzdWJWYWx1ZSwgZmFsc2UpLCB0cnVlKTtcbiAgICAgIHhtbERvYy5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoc3ViVmFsdWVFbCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKF8uaXNBcnJheSh2YWx1ZSkpIHtcbiAgICB4bWxEb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKCc8YXJyYXk+PC9hcnJheT4nLCAndGV4dC94bWwnKTtcbiAgICBmb3IgKGNvbnN0IHN1YlZhbHVlIG9mIHZhbHVlKSB7XG4gICAgICBjb25zdCBzdWJWYWx1ZUVsID0geG1sRG9jLmltcG9ydE5vZGUodG9YbWxBcmcoc3ViVmFsdWUsIGZhbHNlKSwgdHJ1ZSk7XG4gICAgICB4bWxEb2MuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHN1YlZhbHVlRWwpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChfLmlzQm9vbGVhbih2YWx1ZSkpIHtcbiAgICB4bWxEb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHZhbHVlID8gJzx0cnVlLz4nIDogJzxmYWxzZS8+JywgJ3RleHQveG1sJyk7XG4gIH0gZWxzZSBpZiAoXy5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgeG1sRG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhgPGludGVnZXI+JHt2YWx1ZX08L2ludGVnZXI+YCwgJ3RleHQveG1sJyk7XG4gIH0gZWxzZSBpZiAoXy5pc051bWJlcih2YWx1ZSkpIHtcbiAgICB4bWxEb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGA8cmVhbD4ke3ZhbHVlfTwvcmVhbD5gLCAndGV4dC94bWwnKTtcbiAgfSBlbHNlIGlmIChfLmlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHhtbERvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoYDxzdHJpbmc+PC9zdHJpbmc+YCwgJ3RleHQveG1sJyk7XG4gICAgY29uc3QgdmFsdWVUZXh0RWwgPSB4bWxEb2MuY3JlYXRlVGV4dE5vZGUodmFsdWUpO1xuICAgIHhtbERvYy5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodmFsdWVUZXh0RWwpO1xuICB9XG5cbiAgaWYgKCF4bWxEb2MpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBUaGUgZGVmYXVsdHMgdmFsdWUgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9IGNhbm5vdCBiZSB3cml0dGVuLCBgICtcbiAgICAgIGBiZWNhdXNlIGl0IGlzIG5vdCBrbm93biBob3cgdG8gaGFuZGxlIGl0cyB0eXBlYCk7XG4gIH1cblxuICByZXR1cm4gc2VyaWFsaXplXG4gICAgPyBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHhtbERvYy5kb2N1bWVudEVsZW1lbnQpXG4gICAgOiB4bWxEb2MuZG9jdW1lbnRFbGVtZW50O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBjb21tYW5kIGxpbmUgYXJncyBmb3IgdGhlIGBkZWZhdWx0c2BcbiAqIGNvbW1hbmQgbGluZSB1dGlsaXR5IGJhc2VkIG9uIHRoZSBnaXZlbiBwcmVmZXJlbmNlIHZhbHVlcyBtYXBwaW5nLlxuICogU2VlIGh0dHBzOi8vc2hhZG93ZmlsZS5pbm9kZS5saW5rL2Jsb2cvMjAxOC8wNi9hZHZhbmNlZC1kZWZhdWx0czEtdXNhZ2UvXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXNNYXAgUHJlZmVyZW5jZXMgbWFwcGluZ1xuICogQHBhcmFtIHtCb29sZWFufSByZXBsYWNlIFtmYWxzZV0gV2hldGhlciB0byBnZW5lcmF0ZSBhcmd1bWVudHMgdGhhdCByZXBsYWNlXG4gKiBjb21wbGV4IHR5cGVkIHZhbHVlcyBsaWtlIGFycmF5cyBvciBkaWN0aW9uYXJpZXMgaW4gdGhlIGN1cnJlbnQgcGxpc3Qgb3JcbiAqIHVwZGF0ZSB0aGVtICh0aGUgZGVmYXVsdCBzZXR0aW5ncylcbiAqIEByZXR1cm5zIHtBcnJheTxBcnJheTxzdHJpbmc+Pn0gRWFjaCBpdGVtIGluIHRoZSBhcnJheVxuICogaXMgdGhlIGBkZWZhdWx0cyB3cml0ZSA8cGxpc3Q+YCBjb21tYW5kIHN1ZmZpeFxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZURlZmF1bHRzQ29tbWFuZEFyZ3MgKHZhbHVlc01hcCwgcmVwbGFjZSA9IGZhbHNlKSB7XG4gIGNvbnN0IHJlc3VsdEFyZ3MgPSBbXTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKHZhbHVlc01hcCkpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFyZXBsYWNlICYmIF8uaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgZGljdEFyZ3MgPSBba2V5LCAnLWRpY3QtYWRkJ107XG4gICAgICAgIGZvciAoY29uc3QgW3N1YktleSwgc3ViVmFsdWVdIG9mIF8udG9QYWlycyh2YWx1ZSkpIHtcbiAgICAgICAgICBkaWN0QXJncy5wdXNoKHN1YktleSwgdG9YbWxBcmcoc3ViVmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRBcmdzLnB1c2goZGljdEFyZ3MpO1xuICAgICAgfSBlbHNlIGlmICghcmVwbGFjZSAmJiBfLmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGFycmF5QXJncyA9IFtrZXksICctYXJyYXktYWRkJ107XG4gICAgICAgIGZvciAoY29uc3Qgc3ViVmFsdWUgb2YgdmFsdWUpIHtcbiAgICAgICAgICBhcnJheUFyZ3MucHVzaCh0b1htbEFyZyhzdWJWYWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdEFyZ3MucHVzaChhcnJheUFyZ3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0QXJncy5wdXNoKFtrZXksIHRvWG1sQXJnKHZhbHVlKV0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgVHlwZUVycm9yKSB7XG4gICAgICAgIGxvZy53YXJuKGUubWVzc2FnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0QXJncztcbn1cblxuXG5jbGFzcyBOU1VzZXJEZWZhdWx0cyB7XG4gIGNvbnN0cnVjdG9yIChwbGlzdCkge1xuICAgIHRoaXMucGxpc3QgPSBwbGlzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gcGxpc3QgZmlsZSB1c2luZyBwbHV0aWwgY29tbWFuZCBsaW5lIHRvb2xcbiAgICogYW5kIHNlcmlhbGl6ZXMgaXQgdG8gYSBKU09OIHJlcHJlc2VudGF0aW9uXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBzZXJpYWxpemVkIHBsaXN0IGNvbnRlbnRcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciBkdXJpbmcgc2VyaWFsaXphdGlvblxuICAgKi9cbiAgYXN5bmMgYXNKc29uICgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKCdwbHV0aWwnLCBbJy1jb252ZXJ0JywgJ2pzb24nLCAnLW8nLCAnLScsIHRoaXMucGxpc3RdKTtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHN0ZG91dCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHt0aGlzLnBsaXN0fScgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBKU09OLiBPcmlnaW5hbCBlcnJvcjogJHtlLnN0ZGVyciB8fCBlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIHBsaXN0IGZpbGUuXG4gICAqIElmIHRoZSBwbGlzdCBkb2VzIG5vdCBleGlzdCB5ZXQgdGhlbiBpdCBpcyBnb2luZyB0byBiZSBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzTWFwIE1hcHBpbmcgb2YgcHJlZmVyZW5jZSB2YWx1ZXMgdG8gdXBkYXRlLlxuICAgKiBJZiBhbnkgb2YgaXRlbSB2YWx1ZXMgYXJlIG9mIGRpY3Rpb25hcnkgdHlwZSB0aGVuIG9ubHkgdGhlIGZpcnN0IGxldmVsIGRpY3Rpb25hcnkgZ2V0c1xuICAgKiB1cGRhdGVkLiBFdmVyeXRoaW5nIGJlbG93IHRoaXMgbGV2ZWwgd2lsbCBiZSByZXBsYWNlZC4gVGhpcyBpcyB0aGUga25vd24gbGltaXRhdGlvblxuICAgKiBvZiB0aGUgYGRlZmF1bHRzYCBjb21tYW5kIGxpbmUgdG9vbC4gQSB3b3JrYXJvdW5kIGZvciBpdCB3b3VsZCBiZSB0byByZWFkIHRoZSBjdXJyZW50XG4gICAqIHByZWZlcmVuY2VzIG1hcHBpbmcgZmlyc3QgYW5kIG1lcmdlIGl0IHdpdGggdGhpcyB2YWx1ZS5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSB1cGRhdGluZyB0aGUgcGxpc3RcbiAgICovXG4gIGFzeW5jIHVwZGF0ZSAodmFsdWVzTWFwKSB7XG4gICAgaWYgKCFfLmlzUGxhaW5PYmplY3QodmFsdWVzTWFwKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgcGxpc3QgdmFsdWVzIG11c3QgYmUgYSBtYXAuICcke3ZhbHVlc01hcH0nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eSh2YWx1ZXNNYXApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZEFyZ3MgPSBnZW5lcmF0ZURlZmF1bHRzQ29tbWFuZEFyZ3ModmFsdWVzTWFwKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgQi5hbGwoY29tbWFuZEFyZ3MubWFwKChhcmdzKSA9PiBleGVjKCdkZWZhdWx0cycsIFsnd3JpdGUnLCB0aGlzLnBsaXN0LCAuLi5hcmdzXSkpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCB3cml0ZSBkZWZhdWx0cyBpbnRvICcke3RoaXMucGxpc3R9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufVxuXG5cbmV4cG9ydCB7XG4gIE5TVXNlckRlZmF1bHRzLFxuICB0b1htbEFyZywgZ2VuZXJhdGVEZWZhdWx0c0NvbW1hbmRBcmdzLFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFjQSxTQUFTQSxRQUFRLENBQUVDLEtBQUssRUFBRUMsU0FBUyxHQUFHLElBQUksRUFBRTtFQUMxQyxJQUFJQyxNQUFNLEdBQUcsSUFBSTtFQUVqQixJQUFJQyxlQUFDLENBQUNDLGFBQWEsQ0FBQ0osS0FBSyxDQUFDLEVBQUU7SUFDMUJFLE1BQU0sR0FBRyxJQUFJRyxpQkFBUyxFQUFFLENBQUNDLGVBQWUsQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDO0lBQ3JFLEtBQUssTUFBTSxDQUFDQyxNQUFNLEVBQUVDLFFBQVEsQ0FBQyxJQUFJTCxlQUFDLENBQUNNLE9BQU8sQ0FBQ1QsS0FBSyxDQUFDLEVBQUU7TUFDakQsTUFBTVUsS0FBSyxHQUFHUixNQUFNLENBQUNTLGFBQWEsQ0FBQyxLQUFLLENBQUM7TUFDekMsTUFBTUMsU0FBUyxHQUFHVixNQUFNLENBQUNXLGNBQWMsQ0FBQ04sTUFBTSxDQUFDO01BQy9DRyxLQUFLLENBQUNJLFdBQVcsQ0FBQ0YsU0FBUyxDQUFDO01BQzVCVixNQUFNLENBQUNhLGVBQWUsQ0FBQ0QsV0FBVyxDQUFDSixLQUFLLENBQUM7TUFDekMsTUFBTU0sVUFBVSxHQUFHZCxNQUFNLENBQUNlLFVBQVUsQ0FBQ2xCLFFBQVEsQ0FBQ1MsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQztN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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults-utils.js","names":["toXmlArg","value","serialize","xmlDoc","_","isPlainObject","DOMParser","parseFromString","subKey","subValue","toPairs","keyEl","createElement","keyTextEl","createTextNode","appendChild","documentElement","subValueEl","importNode","isArray","isBoolean","isInteger","isNumber","isString","valueTextEl","TypeError","JSON","stringify","XMLSerializer","serializeToString","generateDefaultsCommandArgs","valuesMap","replace","resultArgs","key","dictArgs","push","arrayArgs","e","log","warn","message","NSUserDefaults","constructor","plist","asJson","stdout","exec","parse","Error","stderr","update","isEmpty","commandArgs","B","all","map","args"],"sources":["../../lib/defaults-utils.js"],"sourcesContent":["import _ from 'lodash';\nimport { DOMParser, XMLSerializer } from '@xmldom/xmldom';\nimport { exec } from 'teen_process';\nimport B from 'bluebird';\nimport log from './logger';\n\n/**\n * Serializes the given value to plist-compatible\n * XML representation, which is ready for further usage\n * with `defaults` command line tool arguments\n *\n * @param {*} value The value to be serialized\n * @param {boolean} serialize [true] Whether to serialize the resulting\n * XML to string or to return raw HTMLElement instance\n * @returns {HTMLElement|string} Either string or raw node representation of\n * the given value\n * @throws {TypeError} If it is not known how to serialize the given value\n */\nfunction toXmlArg (value, serialize = true) {\n let xmlDoc = null;\n\n if (_.isPlainObject(value)) {\n xmlDoc = new DOMParser().parseFromString('<dict></dict>', 'text/xml');\n for (const [subKey, subValue] of _.toPairs(value)) {\n const keyEl = xmlDoc.createElement('key');\n const keyTextEl = xmlDoc.createTextNode(subKey);\n keyEl.appendChild(keyTextEl);\n xmlDoc.documentElement.appendChild(keyEl);\n const subValueEl = xmlDoc.importNode(toXmlArg(subValue, false), true);\n xmlDoc.documentElement.appendChild(subValueEl);\n }\n } else if (_.isArray(value)) {\n xmlDoc = new DOMParser().parseFromString('<array></array>', 'text/xml');\n for (const subValue of value) {\n const subValueEl = xmlDoc.importNode(toXmlArg(subValue, false), true);\n xmlDoc.documentElement.appendChild(subValueEl);\n }\n } else if (_.isBoolean(value)) {\n xmlDoc = new DOMParser().parseFromString(value ? '<true/>' : '<false/>', 'text/xml');\n } else if (_.isInteger(value)) {\n xmlDoc = new DOMParser().parseFromString(`<integer>${value}</integer>`, 'text/xml');\n } else if (_.isNumber(value)) {\n xmlDoc = new DOMParser().parseFromString(`<real>${value}</real>`, 'text/xml');\n } else if (_.isString(value)) {\n xmlDoc = new DOMParser().parseFromString(`<string></string>`, 'text/xml');\n const valueTextEl = xmlDoc.createTextNode(value);\n xmlDoc.documentElement.appendChild(valueTextEl);\n }\n\n if (!xmlDoc) {\n throw new TypeError(`The defaults value ${JSON.stringify(value)} cannot be written, ` +\n `because it is not known how to handle its type`);\n }\n\n return serialize\n ? new XMLSerializer().serializeToString(xmlDoc.documentElement)\n : xmlDoc.documentElement;\n}\n\n/**\n * Generates command line args for the `defaults`\n * command line utility based on the given preference values mapping.\n * See https://shadowfile.inode.link/blog/2018/06/advanced-defaults1-usage/\n * for more details.\n *\n * @param {Object} valuesMap Preferences mapping\n * @param {Boolean} replace [false] Whether to generate arguments that replace\n * complex typed values like arrays or dictionaries in the current plist or\n * update them (the default settings)\n * @returns {Array<Array<string>>} Each item in the array\n * is the `defaults write <plist>` command suffix\n */\nfunction generateDefaultsCommandArgs (valuesMap, replace = false) {\n const resultArgs = [];\n for (const [key, value] of _.toPairs(valuesMap)) {\n try {\n if (!replace && _.isPlainObject(value)) {\n const dictArgs = [key, '-dict-add'];\n for (const [subKey, subValue] of _.toPairs(value)) {\n dictArgs.push(subKey, toXmlArg(subValue));\n }\n resultArgs.push(dictArgs);\n } else if (!replace && _.isArray(value)) {\n const arrayArgs = [key, '-array-add'];\n for (const subValue of value) {\n arrayArgs.push(toXmlArg(subValue));\n }\n resultArgs.push(arrayArgs);\n } else {\n resultArgs.push([key, toXmlArg(value)]);\n }\n } catch (e) {\n if (e instanceof TypeError) {\n log.warn(e.message);\n } else {\n throw e;\n }\n }\n }\n return resultArgs;\n}\n\n\nclass NSUserDefaults {\n constructor (plist) {\n this.plist = plist;\n }\n\n /**\n * Reads the content of the given plist file using plutil command line tool\n * and serializes it to a JSON representation\n *\n * @returns {Object} The serialized plist content\n * @throws {Error} If there was an error during serialization\n */\n async asJson () {\n try {\n const {stdout} = await exec('plutil', ['-convert', 'json', '-o', '-', this.plist]);\n return JSON.parse(stdout);\n } catch (e) {\n throw new Error(`'${this.plist}' cannot be converted to JSON. Original error: ${e.stderr || e.message}`);\n }\n }\n\n /**\n * Updates the content of the given plist file.\n * If the plist does not exist yet then it is going to be created.\n *\n * @param {Object} valuesMap Mapping of preference values to update.\n * If any of item values are of dictionary type then only the first level dictionary gets\n * updated. Everything below this level will be replaced. This is the known limitation\n * of the `defaults` command line tool. A workaround for it would be to read the current\n * preferences mapping first and merge it with this value.\n * @throws {Error} If there was an error while updating the plist\n */\n async update (valuesMap) {\n if (!_.isPlainObject(valuesMap)) {\n throw new TypeError(`plist values must be a map. '${valuesMap}' is given instead`);\n }\n if (_.isEmpty(valuesMap)) {\n return;\n }\n\n const commandArgs = generateDefaultsCommandArgs(valuesMap);\n try {\n await B.all(commandArgs.map((args) => exec('defaults', ['write', this.plist, ...args])));\n } catch (e) {\n throw new Error(`Could not write defaults into '${this.plist}'. Original error: ${e.stderr || e.message}`);\n }\n }\n}\n\n\nexport {\n NSUserDefaults,\n toXmlArg, generateDefaultsCommandArgs,\n};\n"],"mappings":"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"}