@expo/devcert 1.1.4 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -34,15 +34,15 @@ return object itself, so that these programs can choose whether to trust it.
34
34
 
35
35
  ### getCaPath
36
36
 
37
- Set this option to `true` and the returned object will inlude a `caPath`
37
+ Set this option to `true` and the returned object will include a `caPath`
38
38
  property, set to the file path of the certificate authority file. Use this
39
39
  path to add the certificate to local trust stores which accept paths as
40
- arguments, such as NodeJS's builtin environment variable
40
+ arguments, such as NodeJS's built-in environment variable
41
41
  `NODE_EXTRA_CA_CERTS`..
42
42
 
43
43
  ### getCaBuffer
44
44
 
45
- Set this option to `true` and the returned object will inlude a `ca`
45
+ Set this option to `true` and the returned object will include a `ca`
46
46
  property, set to the UTF-8-encoded contents of the certificate authority
47
47
  file. Use this path to add the certificate to local trust stores which don't
48
48
  use OS settings, lke the examples mentioned above.
@@ -70,12 +70,12 @@ local machine (since the SSL certificate won't say `localhost`).
70
70
 
71
71
  This option will tell devcert to avoid installing `certutil` tooling.
72
72
 
73
- `certutil` is a tooling package used to automated the installation of SSL
73
+ `certutil` is a tooling package used to automate the installation of SSL
74
74
  certificates in certain circumstances; specifically, Firefox (for every OS)
75
75
  and Chrome (on Linux only).
76
76
 
77
- Normally, devcert will attempt to install `certutil` if it's need and not
78
- already present on your system. If don't want devcert to install this
77
+ Normally, devcert will attempt to install `certutil` if it's needed and not
78
+ already present on your system. If you don't want devcert to install this
79
79
  package, pass `skipCertutil: true`.
80
80
 
81
81
  If you decide to `skipCertutil`, the initial setup process for devcert
@@ -112,7 +112,7 @@ the new root CA.
112
112
  Since your machine now trusts this root CA, it will trust any certificates
113
113
  signed by it. So when you ask for a certificate for a new domain, devcert
114
114
  will use the root CA credentials to generate a certificate specific to the
115
- domain you requested, and returns the new certificate to you.
115
+ domain you requested, and return the new certificate to you.
116
116
 
117
117
  If you request a domain that has already had certificates generated for it,
118
118
  devcert will simply return the cached certificates.
@@ -124,7 +124,7 @@ certificates.
124
124
  ## Security Concerns
125
125
 
126
126
  There's a reason that your OS prompts you for your root password when devcert
127
- attempts to install it's root certificate authority. By adding it to your
127
+ attempts to install its root certificate authority. By adding it to your
128
128
  machine's trust stores, your browsers will automatically trust _any_ certificate
129
129
  generated with it.
130
130
 
@@ -181,7 +181,7 @@ With that in mind, if you'd like to use devcert in your library/framework/CLI,
181
181
  devcert makes that easy.
182
182
 
183
183
  In addition to the options above, devcert exposes a `ui` option. This option
184
- allows you to control all the points where devcert requries user interaction,
184
+ allows you to control all the points where devcert requires user interaction,
185
185
  substituting your own prompts and user interface. You can use this to brand
186
186
  the experience with your own tool's name, localize the messages, or integrate
187
187
  devcert into a larger existing workflow.
@@ -202,7 +202,7 @@ The `ui` option should be an object with the following methods:
202
202
  },
203
203
  async closeFirefoxBeforeContinuing() {
204
204
  // Invoked when devcert detects that Firefox is running while it is trying
205
- // to programmatically install it's certificate authority in the Firefox
205
+ // to programmatically install its certificate authority in the Firefox
206
206
  // trust store. Firefox appears to overwrite changes to the trust store on
207
207
  // exit, so Firefox must be closed before devcert can continue. devcert will
208
208
  // wait for Firefox to exit - this is just to prompt the user that they
@@ -230,7 +230,7 @@ The `ui` option should be an object with the following methods:
230
230
  // to the actual certificate. The Firefox tab must attempt to load this URL
231
231
  // to trigger the wizard.
232
232
  //
233
- // The default implemenation is a simple redirect to that URL. But you could
233
+ // The default implementation is a simple redirect to that URL. But you could
234
234
  // supply your own branded template here, with a button that says "Install
235
235
  // certificate" that is linked to the certificateURL, along with a more in
236
236
  // depth explanation of what is happening for example.
@@ -245,7 +245,7 @@ The `ui` option should be an object with the following methods:
245
245
  ```
246
246
 
247
247
  You can supply any or all of these methods - ones you do not supply will fall
248
- back to the default implemenation.
248
+ back to the default implementation.
249
249
 
250
250
  ## Testing
251
251
 
@@ -31,4 +31,4 @@ export declare function ensureCACertReadable(options?: Options): Promise<void>;
31
31
  * silently fail that as well; with no existing certificates anymore, the
32
32
  * security exposure there is minimal.
33
33
  */
34
- export declare function uninstall(): void;
34
+ export declare function uninstall(): Promise<void>;
@@ -1,14 +1,16 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.default = installCertificateAuthority;
4
7
  exports.withCertificateAuthorityCredentials = withCertificateAuthorityCredentials;
5
8
  exports.ensureCACertReadable = ensureCACertReadable;
6
9
  exports.uninstall = uninstall;
7
- const tslib_1 = require("tslib");
8
10
  const fs_1 = require("fs");
9
- const debug_1 = tslib_1.__importDefault(require("debug"));
11
+ const debug_1 = __importDefault(require("debug"));
10
12
  const constants_1 = require("./constants");
11
- const platforms_1 = tslib_1.__importDefault(require("./platforms"));
13
+ const platforms_1 = __importDefault(require("./platforms"));
12
14
  const utils_1 = require("./utils");
13
15
  const certificates_1 = require("./certificates");
14
16
  const debug = (0, debug_1.default)('devcert:certificate-authority');
@@ -16,24 +18,22 @@ const debug = (0, debug_1.default)('devcert:certificate-authority');
16
18
  * Install the once-per-machine trusted root CA. We'll use this CA to sign
17
19
  * per-app certs.
18
20
  */
19
- function installCertificateAuthority() {
20
- return tslib_1.__awaiter(this, arguments, void 0, function* (options = {}) {
21
- debug(`Uninstalling existing certificates, which will be void once any existing CA is gone`);
22
- uninstall();
23
- (0, constants_1.ensureConfigDirs)();
24
- debug(`Making a temp working directory for files to copied in`);
25
- let rootKeyPath = (0, utils_1.mktmp)();
26
- debug(`Generating the OpenSSL configuration needed to setup the certificate authority`);
27
- seedConfigFiles();
28
- debug(`Generating a private key`);
29
- (0, certificates_1.generateKey)(rootKeyPath);
30
- debug(`Generating a CA certificate`);
31
- (0, utils_1.openssl)(['req', '-new', '-x509', '-config', constants_1.caSelfSignConfig, '-key', rootKeyPath, '-out', constants_1.rootCACertPath, '-days', '825']);
32
- debug('Saving certificate authority credentials');
33
- yield saveCertificateAuthorityCredentials(rootKeyPath);
34
- debug(`Adding the root certificate authority to trust stores`);
35
- yield platforms_1.default.addToTrustStores(constants_1.rootCACertPath, options);
36
- });
21
+ async function installCertificateAuthority(options = {}) {
22
+ debug(`Uninstalling existing certificates, which will be void once any existing CA is gone`);
23
+ uninstall();
24
+ (0, constants_1.ensureConfigDirs)();
25
+ debug(`Making a temp working directory for files to copied in`);
26
+ let rootKeyPath = (0, utils_1.mktmp)();
27
+ debug(`Generating the OpenSSL configuration needed to setup the certificate authority`);
28
+ seedConfigFiles();
29
+ debug(`Generating a private key`);
30
+ (0, certificates_1.generateKey)(rootKeyPath);
31
+ debug(`Generating a CA certificate`);
32
+ (0, utils_1.openssl)(['req', '-new', '-x509', '-config', constants_1.caSelfSignConfig, '-key', rootKeyPath, '-out', constants_1.rootCACertPath, '-days', '825']);
33
+ debug('Saving certificate authority credentials');
34
+ await saveCertificateAuthorityCredentials(rootKeyPath);
35
+ debug(`Adding the root certificate authority to trust stores`);
36
+ await platforms_1.default.addToTrustStores(constants_1.rootCACertPath, options);
37
37
  }
38
38
  /**
39
39
  * Initializes the files OpenSSL needs to sign certificates as a certificate
@@ -46,22 +46,18 @@ function seedConfigFiles() {
46
46
  (0, fs_1.writeFileSync)(constants_1.opensslDatabaseFilePath, '');
47
47
  (0, fs_1.writeFileSync)(constants_1.opensslSerialFilePath, '01');
48
48
  }
49
- function withCertificateAuthorityCredentials(cb) {
50
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
51
- debug(`Retrieving devcert's certificate authority credentials`);
52
- let tmpCAKeyPath = (0, utils_1.mktmp)();
53
- let caKey = yield platforms_1.default.readProtectedFile(constants_1.rootCAKeyPath);
54
- (0, fs_1.writeFileSync)(tmpCAKeyPath, caKey);
55
- yield cb({ caKeyPath: tmpCAKeyPath, caCertPath: constants_1.rootCACertPath });
56
- (0, fs_1.unlinkSync)(tmpCAKeyPath);
57
- });
49
+ async function withCertificateAuthorityCredentials(cb) {
50
+ debug(`Retrieving devcert's certificate authority credentials`);
51
+ let tmpCAKeyPath = (0, utils_1.mktmp)();
52
+ let caKey = await platforms_1.default.readProtectedFile(constants_1.rootCAKeyPath);
53
+ (0, fs_1.writeFileSync)(tmpCAKeyPath, caKey);
54
+ await cb({ caKeyPath: tmpCAKeyPath, caCertPath: constants_1.rootCACertPath });
55
+ (0, fs_1.unlinkSync)(tmpCAKeyPath);
58
56
  }
59
- function saveCertificateAuthorityCredentials(keypath) {
60
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
61
- debug(`Saving devcert's certificate authority credentials`);
62
- let key = (0, fs_1.readFileSync)(keypath, 'utf-8');
63
- yield platforms_1.default.writeProtectedFile(constants_1.rootCAKeyPath, key);
64
- });
57
+ async function saveCertificateAuthorityCredentials(keypath) {
58
+ debug(`Saving devcert's certificate authority credentials`);
59
+ let key = (0, fs_1.readFileSync)(keypath, 'utf-8');
60
+ await platforms_1.default.writeProtectedFile(constants_1.rootCAKeyPath, key);
65
61
  }
66
62
  function certErrors() {
67
63
  try {
@@ -82,30 +78,28 @@ function certErrors() {
82
78
  * platform.writeProtectedFile(), so an unprivileged readFile cannot access it.
83
79
  * Pre-detect and remedy this; it should only happen once per installation.
84
80
  */
85
- function ensureCACertReadable() {
86
- return tslib_1.__awaiter(this, arguments, void 0, function* (options = {}) {
87
- if (!certErrors()) {
88
- return;
89
- }
90
- /**
91
- * on windows, writeProtectedFile left the cert encrypted on *nix, the cert
92
- * has no read permissions either way, openssl will fail and that means we
93
- * have to fix it
94
- */
95
- try {
96
- const caFileContents = yield platforms_1.default.readProtectedFile(constants_1.rootCACertPath);
97
- platforms_1.default.deleteProtectedFiles(constants_1.rootCACertPath);
98
- (0, fs_1.writeFileSync)(constants_1.rootCACertPath, caFileContents);
99
- }
100
- catch (e) {
101
- return installCertificateAuthority(options);
102
- }
103
- // double check that we have a live one
104
- const remainingErrors = certErrors();
105
- if (remainingErrors) {
106
- return installCertificateAuthority(options);
107
- }
108
- });
81
+ async function ensureCACertReadable(options = {}) {
82
+ if (!certErrors()) {
83
+ return;
84
+ }
85
+ /**
86
+ * on windows, writeProtectedFile left the cert encrypted on *nix, the cert
87
+ * has no read permissions either way, openssl will fail and that means we
88
+ * have to fix it
89
+ */
90
+ try {
91
+ const caFileContents = await platforms_1.default.readProtectedFile(constants_1.rootCACertPath);
92
+ await platforms_1.default.deleteProtectedFiles(constants_1.rootCACertPath);
93
+ (0, fs_1.writeFileSync)(constants_1.rootCACertPath, caFileContents);
94
+ }
95
+ catch (e) {
96
+ return await installCertificateAuthority(options);
97
+ }
98
+ // double check that we have a live one
99
+ const remainingErrors = certErrors();
100
+ if (remainingErrors) {
101
+ return await installCertificateAuthority(options);
102
+ }
109
103
  }
110
104
  /**
111
105
  * Remove as much of the devcert files and state as we can. This is necessary
@@ -120,10 +114,10 @@ function ensureCACertReadable() {
120
114
  * silently fail that as well; with no existing certificates anymore, the
121
115
  * security exposure there is minimal.
122
116
  */
123
- function uninstall() {
124
- platforms_1.default.removeFromTrustStores(constants_1.rootCACertPath);
125
- platforms_1.default.deleteProtectedFiles(constants_1.domainsDir);
126
- platforms_1.default.deleteProtectedFiles(constants_1.rootCADir);
127
- platforms_1.default.deleteProtectedFiles((0, constants_1.getLegacyConfigDir)());
117
+ async function uninstall() {
118
+ await platforms_1.default.removeFromTrustStores(constants_1.rootCACertPath);
119
+ await platforms_1.default.deleteProtectedFiles(constants_1.domainsDir);
120
+ await platforms_1.default.deleteProtectedFiles(constants_1.rootCADir);
121
+ await platforms_1.default.deleteProtectedFiles((0, constants_1.getLegacyConfigDir)());
128
122
  }
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGUtYXV0aG9yaXR5LmpzIiwic291cmNlUm9vdCI6Ii4vIiwic291cmNlcyI6WyJjZXJ0aWZpY2F0ZS1hdXRob3JpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE4QkEsOENBc0JDO0FBY0Qsa0ZBT0M7QUE0QkQsb0RBc0JDO0FBZUQsOEJBS0M7O0FBL0lELDJCQUlZO0FBQ1osMERBQWdDO0FBRWhDLDJDQVdxQjtBQUNyQixvRUFBMEM7QUFDMUMsbUNBQXlDO0FBQ3pDLGlEQUE2QztBQUc3QyxNQUFNLEtBQUssR0FBRyxJQUFBLGVBQVcsRUFBQywrQkFBK0IsQ0FBQyxDQUFDO0FBRTNEOzs7R0FHRztBQUNILFNBQThCLDJCQUEyQjtpRUFBQyxVQUFtQixFQUFFO1FBQzdFLEtBQUssQ0FBQyxxRkFBcUYsQ0FBQyxDQUFDO1FBQzdGLFNBQVMsRUFBRSxDQUFDO1FBQ1osSUFBQSw0QkFBZ0IsR0FBRSxDQUFDO1FBRW5CLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO1FBQ2hFLElBQUksV0FBVyxHQUFHLElBQUEsYUFBSyxHQUFFLENBQUM7UUFFMUIsS0FBSyxDQUFDLGdGQUFnRixDQUFDLENBQUM7UUFDeEYsZUFBZSxFQUFFLENBQUM7UUFFbEIsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDbEMsSUFBQSwwQkFBVyxFQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXpCLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ3JDLElBQUEsZUFBTyxFQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLDRCQUFnQixFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLDBCQUFjLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFNUgsS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDbEQsTUFBTSxtQ0FBbUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV2RCxLQUFLLENB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QUFBLDhCQUFrQixHQUFFLENBQUMsQ0FBQztBQUM3RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdW5saW5rU3luYyBhcyBybSxcbiAgcmVhZEZpbGVTeW5jIGFzIHJlYWRGaWxlLFxuICB3cml0ZUZpbGVTeW5jIGFzIHdyaXRlRmlsZVxufSBmcm9tICdmcyc7XG5pbXBvcnQgY3JlYXRlRGVidWcgZnJvbSAnZGVidWcnO1xuXG5pbXBvcnQge1xuICBkb21haW5zRGlyLFxuICByb290Q0FEaXIsXG4gIGVuc3VyZUNvbmZpZ0RpcnMsXG4gIGdldExlZ2FjeUNvbmZpZ0RpcixcbiAgcm9vdENBS2V5UGF0aCxcbiAgcm9vdENBQ2VydFBhdGgsXG4gIGNhU2VsZlNpZ25Db25maWcsXG4gIG9wZW5zc2xTZXJpYWxGaWxlUGF0aCxcbiAgb3BlbnNzbERhdGFiYXNlRmlsZVBhdGgsXG4gIGNhVmVyc2lvbkZpbGVcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IGN1cnJlbnRQbGF0Zm9ybSBmcm9tICcuL3BsYXRmb3Jtcyc7XG5pbXBvcnQgeyBvcGVuc3NsLCBta3RtcCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVLZXkgfSBmcm9tICcuL2NlcnRpZmljYXRlcyc7XG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAnLi9pbmRleCc7XG5cbmNvbnN0IGRlYnVnID0gY3JlYXRlRGVidWcoJ2RldmNlcnQ6Y2VydGlmaWNhdGUtYXV0aG9yaXR5Jyk7XG5cbi8qKlxuICogSW5zdGFsbCB0aGUgb25jZS1wZXItbWFjaGluZSB0cnVzdGVkIHJvb3QgQ0EuIFdlJ2xsIHVzZSB0aGlzIENBIHRvIHNpZ25cbiAqIHBlci1hcHAgY2VydHMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxDZXJ0aWZpY2F0ZUF1dGhvcml0eShvcHRpb25zOiBPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZGVidWcoYFVuaW5zdGFsbGluZyBleGlzdGluZyBjZXJ0aWZpY2F0ZXMsIHdoaWNoIHdpbGwgYmUgdm9pZCBvbmNlIGFueSBleGlzdGluZyBDQSBpcyBnb25lYCk7XG4gIHVuaW5zdGFsbCgpO1xuICBlbnN1cmVDb25maWdEaXJzKCk7XG5cbiAgZGVidWcoYE1ha2luZyBhIHRlbXAgd29ya2luZyBkaXJlY3RvcnkgZm9yIGZpbGVzIHRvIGNvcGllZCBpbmApO1xuICBsZXQgcm9vdEtleVBhdGggPSBta3RtcCgpO1xuXG4gIGRlYnVnKGBHZW5lcmF0aW5nIHRoZSBPcGVuU1NMIGNvbmZpZ3VyYXRpb24gbmVlZGVkIHRvIHNldHVwIHRoZSBjZXJ0aWZpY2F0ZSBhdXRob3JpdHlgKTtcbiAgc2VlZENvbmZpZ0ZpbGVzKCk7XG5cbiAgZGVidWcoYEdlbmVyYXRpbmcgYSBwcml2YXRlIGtleWApO1xuICBnZW5lcmF0ZUtleShyb290S2V5UGF0aCk7XG5cbiAgZGVidWcoYEdlbmVyYXRpbmcgYSBDQSBjZXJ0aWZpY2F0ZWApO1xuICBvcGVuc3NsKFsncmVxJywgJy1uZXcnLCAnLXg1MDknLCAnLWNvbmZpZycsIGNhU2VsZlNpZ25Db25maWcsICcta2V5Jywgcm9vdEtleVBhdGgsICctb3V0Jywgcm9vdENBQ2VydFBhdGgsICctZGF5cycsICc4MjUnXSk7XG5cbiAgZGVidWcoJ1NhdmluZyBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgY3JlZGVudGlhbHMnKTtcbiAgYXdhaXQgc2F2ZUNlcnRpZmljYXRlQXV0aG9yaXR5Q3JlZGVudGlhbHMocm9vdEtleVBhdGgpO1xuXG4gIGRlYnVnKGBBZGRpbmcgdGhlIHJvb3QgY2VydGlmaWNhdGUgYXV0aG9yaXR5IHRvIHRydXN0IHN0b3Jlc2ApO1xuICBhd2FpdCBjdXJyZW50UGxhdGZvcm0uYWRkVG9UcnVzdFN0b3Jlcyhyb290Q0FDZXJ0UGF0aCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgdGhlIGZpbGVzIE9wZW5TU0wgbmVlZHMgdG8gc2lnbiBjZXJ0aWZpY2F0ZXMgYXMgYSBjZXJ0aWZpY2F0ZVxuICogYXV0aG9yaXR5LCBhcyB3ZWxsIGFzIG91ciBDQSBzZXR1cCB2ZXJzaW9uXG4gKi9cbmZ1bmN0aW9uIHNlZWRDb25maWdGaWxlcygpIHtcbiAgLy8gVGhpcyBpcyB2MiBvZiB0aGUgZGV2Y2VydCBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgc2V0dXBcbiAgd3JpdGVGaWxlKGNhVmVyc2lvbkZpbGUsICcyJyk7XG4gIC8vIE9wZW5TU0wgQ0EgZmlsZXNcbiAgd3JpdGVGaWxlKG9wZW5zc2xEYXRhYmFzZUZpbGVQYXRoLCAnJyk7XG4gIHdyaXRlRmlsZShvcGVuc3NsU2VyaWFsRmlsZVBhdGgsICcwMScpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aENlcnRpZmljYXRlQXV0aG9yaXR5Q3JlZGVudGlhbHMoY2I6ICh7IGNhS2V5UGF0aCwgY2FDZXJ0UGF0aCB9OiB7IGNhS2V5UGF0aDogc3RyaW5nLCBjYUNlcnRQYXRoOiBzdHJpbmcgfSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQpIHtcbiAgZGVidWcoYFJldHJpZXZpbmcgZGV2Y2VydCdzIGNlcnRpZmljYXRlIGF1dGhvcml0eSBjcmVkZW50aWFsc2ApO1xuICBsZXQgdG1wQ0FLZXlQYXRoID0gbWt0bXAoKTtcbiAgbGV0IGNhS2V5ID0gYXdhaXQgY3VycmVudFBsYXRmb3JtLnJlYWRQcm90ZWN0ZWRGaWxlKHJvb3RDQUtleVBhdGgpO1xuICB3cml0ZUZpbGUodG1wQ0FLZXlQYXRoLCBjYUtleSk7XG4gIGF3YWl0IGNiKHsgY2FLZXlQYXRoOiB0bXBDQUtleVBhdGgsIGNhQ2VydFBhdGg6IHJvb3RDQUNlcnRQYXRoIH0pO1xuICBybSh0bXBDQUtleVBhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlQ2VydGlmaWNhdGVBdXRob3JpdHlDcmVkZW50aWFscyhrZXlwYXRoOiBzdHJpbmcpIHtcbiAgZGVidWcoYFNhdmluZyBkZXZjZXJ0J3MgY2VydGlmaWNhdGUgYXV0aG9yaXR5IGNyZWRlbnRpYWxzYCk7XG4gIGxldCBrZXkgPSByZWFkRmlsZShrZXlwYXRoLCAndXRmLTgnKTtcbiAgYXdhaXQgY3VycmVudFBsYXRmb3JtLndyaXRlUHJvdGVjdGVkRmlsZShyb290Q0FLZXlQYXRoLCBrZXkpO1xufVxuXG5cbmZ1bmN0aW9uIGNlcnRFcnJvcnMoKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBvcGVuc3NsKFsneDUwOScsICctaW4nLCByb290Q0FDZXJ0UGF0aCwgJy1ub291dCddKTtcbiAgICByZXR1cm4gJyc7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZS50b1N0cmluZygpO1xuICB9XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaGVscHMgdG8gbWlncmF0ZSBmcm9tIHYxLjAueCB0byA+PSB2MS4xLjAuXG4vKipcbiAqIFNtb290aGx5IG1pZ3JhdGUgdGhlIGNlcnRpZmljYXRlIHN0b3JhZ2UgZnJvbSB2MS4wLnggdG8gPj0gdjEuMS4wLlxuICogSW4gdjEuMS4wIHRoZXJlIGFyZSBuZXcgb3B0aW9ucyBmb3IgcmV0cmlldmluZyB0aGUgQ0EgY2VydCBkaXJlY3RseSxcbiAqIHRvIGhlbHAgdGhpcmQtcGFydHkgTm9kZSBhcHBzIHRydXN0IHRoZSByb290IENBLlxuICogXG4gKiBJZiBhIHYxLjAueCBjZXJ0IGFscmVhZHkgZXhpc3RzLCB0aGVuIGRldmNlcnQgaGFzIHdyaXR0ZW4gaXQgd2l0aFxuICogcGxhdGZvcm0ud3JpdGVQcm90ZWN0ZWRGaWxlKCksIHNvIGFuIHVucHJpdmlsZWdlZCByZWFkRmlsZSBjYW5ub3QgYWNjZXNzIGl0LlxuICogUHJlLWRldGVjdCBhbmQgcmVtZWR5IHRoaXM7IGl0IHNob3VsZCBvbmx5IGhhcHBlbiBvbmNlIHBlciBpbnN0YWxsYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVDQUNlcnRSZWFkYWJsZShvcHRpb25zOiBPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFjZXJ0RXJyb3JzKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLyoqXG4gICAqIG9uIHdpbmRvd3MsIHdyaXRlUHJvdGVjdGVkRmlsZSBsZWZ0IHRoZSBjZXJ0IGVuY3J5cHRlZCBvbiAqbml4LCB0aGUgY2VydFxuICAgKiBoYXMgbm8gcmVhZCBwZXJtaXNzaW9ucyBlaXRoZXIgd2F5LCBvcGVuc3NsIHdpbGwgZmFpbCBhbmQgdGhhdCBtZWFucyB3ZVxuICAgKiBoYXZlIHRvIGZpeCBpdFxuICAgKi9cbiAgdHJ5IHtcbiAgICBjb25zdCBjYUZpbGVDb250ZW50cyA9IGF3YWl0IGN1cnJlbnRQbGF0Zm9ybS5yZWFkUHJvdGVjdGVkRmlsZShyb290Q0FDZXJ0UGF0aCk7XG4gICAgY3VycmVudFBsYXRmb3JtLmRlbGV0ZVByb3RlY3RlZEZpbGVzKHJvb3RDQUNlcnRQYXRoKTtcbiAgICB3cml0ZUZpbGUocm9vdENBQ2VydFBhdGgsIGNhRmlsZUNvbnRlbnRzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBpbnN0YWxsQ2VydGlmaWNhdGVBdXRob3JpdHkob3B0aW9ucyk7XG4gIH1cbiAgXG4gIC8vIGRvdWJsZSBjaGVjayB0aGF0IHdlIGhhdmUgYSBsaXZlIG9uZVxuICBjb25zdCByZW1haW5pbmdFcnJvcnMgPSBjZXJ0RXJyb3JzKCk7XG4gIGlmIChyZW1haW5pbmdFcnJvcnMpIHtcbiAgICByZXR1cm4gaW5zdGFsbENlcnRpZmljYXRlQXV0aG9yaXR5KG9wdGlvbnMpO1xuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlIGFzIG11Y2ggb2YgdGhlIGRldmNlcnQgZmlsZXMgYW5kIHN0YXRlIGFzIHdlIGNhbi4gVGhpcyBpcyBuZWNlc3NhcnlcbiAqIHdoZW4gZ2VuZXJhdGluZyBhIG5ldyByb290IGNlcnRpZmljYXRlLCBhbmQgc2hvdWxkIGJlIGF2YWlsYWJsZSB0byBBUElcbiAqIGNvbnN1bWVycyBhcyB3ZWxsLlxuICogXG4gKiBOb3QgYWxsIG9mIGl0IHdpbGwgYmUgcmVtb3ZhYmxlLiBJZiBjZXJ0dXRpbCBpcyBub3QgaW5zdGFsbGVkLCB3ZSdsbCBsZWF2ZVxuICogRmlyZWZveCBhbG9uZS4gV2UgdHJ5IHRvIHJlbW92ZSBmaWxlcyB3aXRoIG1heGltdW0gcGVybWlzc2lvbnMsIGFuZCBpZiB0aGF0XG4gKiBmYWlscywgd2UnbGwgc2lsZW50bHkgZmFpbC5cbiAqIFxuICogSXQncyBhbHNvIHBvc3NpYmxlIHRoYXQgdGhlIGNvbW1hbmQgdG8gdW50cnVzdCB3aWxsIG5vdCB3b3JrLCBhbmQgd2UnbGxcbiAqIHNpbGVudGx5IGZhaWwgdGhhdCBhcyB3ZWxsOyB3aXRoIG5vIGV4aXN0aW5nIGNlcnRpZmljYXRlcyBhbnltb3JlLCB0aGVcbiAqIHNlY3VyaXR5IGV4cG9zdXJlIHRoZXJlIGlzIG1pbmltYWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmluc3RhbGwoKTogdm9pZCB7XG4gIGN1cnJlbnRQbGF0Zm9ybS5yZW1vdmVGcm9tVHJ1c3RTdG9yZXMocm9vdENBQ2VydFBhdGgpO1xuICBjdXJyZW50UGxhdGZvcm0uZGVsZXRlUHJvdGVjdGVkRmlsZXMoZG9tYWluc0Rpcik7XG4gIGN1cnJlbnRQbGF0Zm9ybS5kZWxldGVQcm90ZWN0ZWRGaWxlcyhyb290Q0FEaXIpO1xuICBjdXJyZW50UGxhdGZvcm0uZGVsZXRlUHJvdGVjdGVkRmlsZXMoZ2V0TGVnYWN5Q29uZmlnRGlyKCkpO1xufSJdfQ==
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGUtYXV0aG9yaXR5LmpzIiwic291cmNlUm9vdCI6Ii4vIiwic291cmNlcyI6WyJjZXJ0aWZpY2F0ZS1hdXRob3JpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUE4QkEsOENBc0JDO0FBY0Qsa0ZBT0M7QUE0QkQsb0RBc0JDO0FBZUQsOEJBS0M7QUEvSUQsMkJBSVk7QUFDWixrREFBZ0M7QUFFaEMsMkNBV3FCO0FBQ3JCLDREQUEwQztBQUMxQyxtQ0FBeUM7QUFDekMsaURBQTZDO0FBRzdDLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBVyxFQUFDLCtCQUErQixDQUFDLENBQUM7QUFFM0Q7OztHQUdHO0FBQ1ksS0FBSyxVQUFVLDJCQUEyQixDQUFDLFVBQW1CLEVBQUU7SUFDN0UsS0FBSyxDQUFDLHFGQUFxRixDQUFDLENBQUM7SUFDN0YsU0FBUyxFQUFFLENBQUM7SUFDWixJQUFBLDRCQUFnQixHQUFFLENBQUM7SUFFbkIsS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7SUFDaEUsSUFBSSxXQUFXLEdBQUcsSUFBQSxhQUFLLEdBQUUsQ0FBQztJQUUxQixLQUFLLENBQUMsZ0ZBQWdGLENBQUMsQ0FBQztJQUN4RixlQUFlLEVBQUUsQ0FBQztJQUVsQixLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUNsQyxJQUFBLDBCQUFXLEVBQUMsV0FBVyxDQUFDLENBQUM7SUFFekIsS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDckMsSUFBQSxlQUFPLEVBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsNEJBQWdCLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsMEJBQWMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUU1SCxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUNsRCxNQUFNLG1DQUFtQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRXZELEtB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QUN0RCxNQUFNLG1CQUFlLENBQUMsb0JBQW9CLENBQUMsSUFBQSw4QkFBa0IsR0FBRSxDQUFDLENBQUM7QUFDbkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHVubGlua1N5bmMgYXMgcm0sXG4gIHJlYWRGaWxlU3luYyBhcyByZWFkRmlsZSxcbiAgd3JpdGVGaWxlU3luYyBhcyB3cml0ZUZpbGVcbn0gZnJvbSAnZnMnO1xuaW1wb3J0IGNyZWF0ZURlYnVnIGZyb20gJ2RlYnVnJztcblxuaW1wb3J0IHtcbiAgZG9tYWluc0RpcixcbiAgcm9vdENBRGlyLFxuICBlbnN1cmVDb25maWdEaXJzLFxuICBnZXRMZWdhY3lDb25maWdEaXIsXG4gIHJvb3RDQUtleVBhdGgsXG4gIHJvb3RDQUNlcnRQYXRoLFxuICBjYVNlbGZTaWduQ29uZmlnLFxuICBvcGVuc3NsU2VyaWFsRmlsZVBhdGgsXG4gIG9wZW5zc2xEYXRhYmFzZUZpbGVQYXRoLFxuICBjYVZlcnNpb25GaWxlXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBjdXJyZW50UGxhdGZvcm0gZnJvbSAnLi9wbGF0Zm9ybXMnO1xuaW1wb3J0IHsgb3BlbnNzbCwgbWt0bXAgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IGdlbmVyYXRlS2V5IH0gZnJvbSAnLi9jZXJ0aWZpY2F0ZXMnO1xuaW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gJy4vaW5kZXgnO1xuXG5jb25zdCBkZWJ1ZyA9IGNyZWF0ZURlYnVnKCdkZXZjZXJ0OmNlcnRpZmljYXRlLWF1dGhvcml0eScpO1xuXG4vKipcbiAqIEluc3RhbGwgdGhlIG9uY2UtcGVyLW1hY2hpbmUgdHJ1c3RlZCByb290IENBLiBXZSdsbCB1c2UgdGhpcyBDQSB0byBzaWduXG4gKiBwZXItYXBwIGNlcnRzLlxuICovXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQ2VydGlmaWNhdGVBdXRob3JpdHkob3B0aW9uczogT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGRlYnVnKGBVbmluc3RhbGxpbmcgZXhpc3RpbmcgY2VydGlmaWNhdGVzLCB3aGljaCB3aWxsIGJlIHZvaWQgb25jZSBhbnkgZXhpc3RpbmcgQ0EgaXMgZ29uZWApO1xuICB1bmluc3RhbGwoKTtcbiAgZW5zdXJlQ29uZmlnRGlycygpO1xuXG4gIGRlYnVnKGBNYWtpbmcgYSB0ZW1wIHdvcmtpbmcgZGlyZWN0b3J5IGZvciBmaWxlcyB0byBjb3BpZWQgaW5gKTtcbiAgbGV0IHJvb3RLZXlQYXRoID0gbWt0bXAoKTtcblxuICBkZWJ1ZyhgR2VuZXJhdGluZyB0aGUgT3BlblNTTCBjb25maWd1cmF0aW9uIG5lZWRlZCB0byBzZXR1cCB0aGUgY2VydGlmaWNhdGUgYXV0aG9yaXR5YCk7XG4gIHNlZWRDb25maWdGaWxlcygpO1xuXG4gIGRlYnVnKGBHZW5lcmF0aW5nIGEgcHJpdmF0ZSBrZXlgKTtcbiAgZ2VuZXJhdGVLZXkocm9vdEtleVBhdGgpO1xuXG4gIGRlYnVnKGBHZW5lcmF0aW5nIGEgQ0EgY2VydGlmaWNhdGVgKTtcbiAgb3BlbnNzbChbJ3JlcScsICctbmV3JywgJy14NTA5JywgJy1jb25maWcnLCBjYVNlbGZTaWduQ29uZmlnLCAnLWtleScsIHJvb3RLZXlQYXRoLCAnLW91dCcsIHJvb3RDQUNlcnRQYXRoLCAnLWRheXMnLCAnODI1J10pO1xuXG4gIGRlYnVnKCdTYXZpbmcgY2VydGlmaWNhdGUgYXV0aG9yaXR5IGNyZWRlbnRpYWxzJyk7XG4gIGF3YWl0IHNhdmVDZXJ0aWZpY2F0ZUF1dGhvcml0eUNyZWRlbnRpYWxzKHJvb3RLZXlQYXRoKTtcblxuICBkZWJ1ZyhgQWRkaW5nIHRoZSByb290IGNlcnRpZmljYXRlIGF1dGhvcml0eSB0byB0cnVzdCBzdG9yZXNgKTtcbiAgYXdhaXQgY3VycmVudFBsYXRmb3JtLmFkZFRvVHJ1c3RTdG9yZXMocm9vdENBQ2VydFBhdGgsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIHRoZSBmaWxlcyBPcGVuU1NMIG5lZWRzIHRvIHNpZ24gY2VydGlmaWNhdGVzIGFzIGEgY2VydGlmaWNhdGVcbiAqIGF1dGhvcml0eSwgYXMgd2VsbCBhcyBvdXIgQ0Egc2V0dXAgdmVyc2lvblxuICovXG5mdW5jdGlvbiBzZWVkQ29uZmlnRmlsZXMoKSB7XG4gIC8vIFRoaXMgaXMgdjIgb2YgdGhlIGRldmNlcnQgY2VydGlmaWNhdGUgYXV0aG9yaXR5IHNldHVwXG4gIHdyaXRlRmlsZShjYVZlcnNpb25GaWxlLCAnMicpO1xuICAvLyBPcGVuU1NMIENBIGZpbGVzXG4gIHdyaXRlRmlsZShvcGVuc3NsRGF0YWJhc2VGaWxlUGF0aCwgJycpO1xuICB3cml0ZUZpbGUob3BlbnNzbFNlcmlhbEZpbGVQYXRoLCAnMDEnKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhDZXJ0aWZpY2F0ZUF1dGhvcml0eUNyZWRlbnRpYWxzKGNiOiAoeyBjYUtleVBhdGgsIGNhQ2VydFBhdGggfTogeyBjYUtleVBhdGg6IHN0cmluZywgY2FDZXJ0UGF0aDogc3RyaW5nIH0pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKSB7XG4gIGRlYnVnKGBSZXRyaWV2aW5nIGRldmNlcnQncyBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgY3JlZGVudGlhbHNgKTtcbiAgbGV0IHRtcENBS2V5UGF0aCA9IG1rdG1wKCk7XG4gIGxldCBjYUtleSA9IGF3YWl0IGN1cnJlbnRQbGF0Zm9ybS5yZWFkUHJvdGVjdGVkRmlsZShyb290Q0FLZXlQYXRoKTtcbiAgd3JpdGVGaWxlKHRtcENBS2V5UGF0aCwgY2FLZXkpO1xuICBhd2FpdCBjYih7IGNhS2V5UGF0aDogdG1wQ0FLZXlQYXRoLCBjYUNlcnRQYXRoOiByb290Q0FDZXJ0UGF0aCB9KTtcbiAgcm0odG1wQ0FLZXlQYXRoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZUNlcnRpZmljYXRlQXV0aG9yaXR5Q3JlZGVudGlhbHMoa2V5cGF0aDogc3RyaW5nKSB7XG4gIGRlYnVnKGBTYXZpbmcgZGV2Y2VydCdzIGNlcnRpZmljYXRlIGF1dGhvcml0eSBjcmVkZW50aWFsc2ApO1xuICBsZXQga2V5ID0gcmVhZEZpbGUoa2V5cGF0aCwgJ3V0Zi04Jyk7XG4gIGF3YWl0IGN1cnJlbnRQbGF0Zm9ybS53cml0ZVByb3RlY3RlZEZpbGUocm9vdENBS2V5UGF0aCwga2V5KTtcbn1cblxuXG5mdW5jdGlvbiBjZXJ0RXJyb3JzKCk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgb3BlbnNzbChbJ3g1MDknLCAnLWluJywgcm9vdENBQ2VydFBhdGgsICctbm9vdXQnXSk7XG4gICAgcmV0dXJuICcnO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGUudG9TdHJpbmcoKTtcbiAgfVxufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGhlbHBzIHRvIG1pZ3JhdGUgZnJvbSB2MS4wLnggdG8gPj0gdjEuMS4wLlxuLyoqXG4gKiBTbW9vdGhseSBtaWdyYXRlIHRoZSBjZXJ0aWZpY2F0ZSBzdG9yYWdlIGZyb20gdjEuMC54IHRvID49IHYxLjEuMC5cbiAqIEluIHYxLjEuMCB0aGVyZSBhcmUgbmV3IG9wdGlvbnMgZm9yIHJldHJpZXZpbmcgdGhlIENBIGNlcnQgZGlyZWN0bHksXG4gKiB0byBoZWxwIHRoaXJkLXBhcnR5IE5vZGUgYXBwcyB0cnVzdCB0aGUgcm9vdCBDQS5cbiAqIFxuICogSWYgYSB2MS4wLnggY2VydCBhbHJlYWR5IGV4aXN0cywgdGhlbiBkZXZjZXJ0IGhhcyB3cml0dGVuIGl0IHdpdGhcbiAqIHBsYXRmb3JtLndyaXRlUHJvdGVjdGVkRmlsZSgpLCBzbyBhbiB1bnByaXZpbGVnZWQgcmVhZEZpbGUgY2Fubm90IGFjY2VzcyBpdC5cbiAqIFByZS1kZXRlY3QgYW5kIHJlbWVkeSB0aGlzOyBpdCBzaG91bGQgb25seSBoYXBwZW4gb25jZSBwZXIgaW5zdGFsbGF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlQ0FDZXJ0UmVhZGFibGUob3B0aW9uczogT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY2VydEVycm9ycygpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8qKlxuICAgKiBvbiB3aW5kb3dzLCB3cml0ZVByb3RlY3RlZEZpbGUgbGVmdCB0aGUgY2VydCBlbmNyeXB0ZWQgb24gKm5peCwgdGhlIGNlcnRcbiAgICogaGFzIG5vIHJlYWQgcGVybWlzc2lvbnMgZWl0aGVyIHdheSwgb3BlbnNzbCB3aWxsIGZhaWwgYW5kIHRoYXQgbWVhbnMgd2VcbiAgICogaGF2ZSB0byBmaXggaXRcbiAgICovXG4gIHRyeSB7XG4gICAgY29uc3QgY2FGaWxlQ29udGVudHMgPSBhd2FpdCBjdXJyZW50UGxhdGZvcm0ucmVhZFByb3RlY3RlZEZpbGUocm9vdENBQ2VydFBhdGgpO1xuICAgIGF3YWl0IGN1cnJlbnRQbGF0Zm9ybS5kZWxldGVQcm90ZWN0ZWRGaWxlcyhyb290Q0FDZXJ0UGF0aCk7XG4gICAgd3JpdGVGaWxlKHJvb3RDQUNlcnRQYXRoLCBjYUZpbGVDb250ZW50cyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gYXdhaXQgaW5zdGFsbENlcnRpZmljYXRlQXV0aG9yaXR5KG9wdGlvbnMpO1xuICB9XG4gIFxuICAvLyBkb3VibGUgY2hlY2sgdGhhdCB3ZSBoYXZlIGEgbGl2ZSBvbmVcbiAgY29uc3QgcmVtYWluaW5nRXJyb3JzID0gY2VydEVycm9ycygpO1xuICBpZiAocmVtYWluaW5nRXJyb3JzKSB7XG4gICAgcmV0dXJuIGF3YWl0IGluc3RhbGxDZXJ0aWZpY2F0ZUF1dGhvcml0eShvcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZSBhcyBtdWNoIG9mIHRoZSBkZXZjZXJ0IGZpbGVzIGFuZCBzdGF0ZSBhcyB3ZSBjYW4uIFRoaXMgaXMgbmVjZXNzYXJ5XG4gKiB3aGVuIGdlbmVyYXRpbmcgYSBuZXcgcm9vdCBjZXJ0aWZpY2F0ZSwgYW5kIHNob3VsZCBiZSBhdmFpbGFibGUgdG8gQVBJXG4gKiBjb25zdW1lcnMgYXMgd2VsbC5cbiAqIFxuICogTm90IGFsbCBvZiBpdCB3aWxsIGJlIHJlbW92YWJsZS4gSWYgY2VydHV0aWwgaXMgbm90IGluc3RhbGxlZCwgd2UnbGwgbGVhdmVcbiAqIEZpcmVmb3ggYWxvbmUuIFdlIHRyeSB0byByZW1vdmUgZmlsZXMgd2l0aCBtYXhpbXVtIHBlcm1pc3Npb25zLCBhbmQgaWYgdGhhdFxuICogZmFpbHMsIHdlJ2xsIHNpbGVudGx5IGZhaWwuXG4gKiBcbiAqIEl0J3MgYWxzbyBwb3NzaWJsZSB0aGF0IHRoZSBjb21tYW5kIHRvIHVudHJ1c3Qgd2lsbCBub3Qgd29yaywgYW5kIHdlJ2xsXG4gKiBzaWxlbnRseSBmYWlsIHRoYXQgYXMgd2VsbDsgd2l0aCBubyBleGlzdGluZyBjZXJ0aWZpY2F0ZXMgYW55bW9yZSwgdGhlXG4gKiBzZWN1cml0eSBleHBvc3VyZSB0aGVyZSBpcyBtaW5pbWFsLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdW5pbnN0YWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBjdXJyZW50UGxhdGZvcm0ucmVtb3ZlRnJvbVRydXN0U3RvcmVzKHJvb3RDQUNlcnRQYXRoKTtcbiAgYXdhaXQgY3VycmVudFBsYXRmb3JtLmRlbGV0ZVByb3RlY3RlZEZpbGVzKGRvbWFpbnNEaXIpO1xuICBhd2FpdCBjdXJyZW50UGxhdGZvcm0uZGVsZXRlUHJvdGVjdGVkRmlsZXMocm9vdENBRGlyKTtcbiAgYXdhaXQgY3VycmVudFBsYXRmb3JtLmRlbGV0ZVByb3RlY3RlZEZpbGVzKGdldExlZ2FjeUNvbmZpZ0RpcigpKTtcbn1cbiJdfQ==
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.default = generateDomainCertificate;
4
7
  exports.generateKey = generateKey;
5
- const tslib_1 = require("tslib");
6
8
  // import path from 'path';
7
- const debug_1 = tslib_1.__importDefault(require("debug"));
8
- const mkdirp_1 = require("mkdirp");
9
- const fs_1 = require("fs");
9
+ const debug_1 = __importDefault(require("debug"));
10
+ const fs_1 = __importDefault(require("fs"));
10
11
  const constants_1 = require("./constants");
11
12
  const utils_1 = require("./utils");
12
13
  const certificate_authority_1 = require("./certificate-authority");
@@ -18,23 +19,21 @@ const debug = (0, debug_1.default)('devcert:certificates');
18
19
  * individual domain certificates are signed by the devcert root CA (which was
19
20
  * added to the OS/browser trust stores), they are trusted.
20
21
  */
21
- function generateDomainCertificate(domain) {
22
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
23
- (0, mkdirp_1.sync)((0, constants_1.pathForDomain)(domain));
24
- debug(`Generating private key for ${domain}`);
25
- let domainKeyPath = (0, constants_1.pathForDomain)(domain, 'private-key.key');
26
- generateKey(domainKeyPath);
27
- debug(`Generating certificate signing request for ${domain}`);
28
- let csrFile = (0, constants_1.pathForDomain)(domain, `certificate-signing-request.csr`);
29
- (0, constants_1.withDomainSigningRequestConfig)(domain, (configpath) => {
30
- (0, utils_1.openssl)(['req', '-new', '-config', configpath, '-key', domainKeyPath, '-out', csrFile]);
31
- });
32
- debug(`Generating certificate for ${domain} from signing request and signing with root CA`);
33
- let domainCertPath = (0, constants_1.pathForDomain)(domain, `certificate.crt`);
34
- yield (0, certificate_authority_1.withCertificateAuthorityCredentials)(({ caKeyPath, caCertPath }) => {
35
- (0, constants_1.withDomainCertificateConfig)(domain, (domainCertConfigPath) => {
36
- (0, utils_1.openssl)(['ca', '-config', domainCertConfigPath, '-in', csrFile, '-out', domainCertPath, '-keyfile', caKeyPath, '-cert', caCertPath, '-days', '825', '-batch']);
37
- });
22
+ async function generateDomainCertificate(domain) {
23
+ await fs_1.default.promises.mkdir((0, constants_1.pathForDomain)(domain), { recursive: true });
24
+ debug(`Generating private key for ${domain}`);
25
+ let domainKeyPath = (0, constants_1.pathForDomain)(domain, 'private-key.key');
26
+ generateKey(domainKeyPath);
27
+ debug(`Generating certificate signing request for ${domain}`);
28
+ let csrFile = (0, constants_1.pathForDomain)(domain, `certificate-signing-request.csr`);
29
+ (0, constants_1.withDomainSigningRequestConfig)(domain, (configpath) => {
30
+ (0, utils_1.openssl)(['req', '-new', '-config', configpath, '-key', domainKeyPath, '-out', csrFile]);
31
+ });
32
+ debug(`Generating certificate for ${domain} from signing request and signing with root CA`);
33
+ let domainCertPath = (0, constants_1.pathForDomain)(domain, `certificate.crt`);
34
+ await (0, certificate_authority_1.withCertificateAuthorityCredentials)(({ caKeyPath, caCertPath }) => {
35
+ (0, constants_1.withDomainCertificateConfig)(domain, (domainCertConfigPath) => {
36
+ (0, utils_1.openssl)(['ca', '-config', domainCertConfigPath, '-in', csrFile, '-out', domainCertPath, '-keyfile', caKeyPath, '-cert', caCertPath, '-days', '825', '-batch']);
38
37
  });
39
38
  });
40
39
  }
@@ -42,6 +41,6 @@ function generateDomainCertificate(domain) {
42
41
  function generateKey(filename) {
43
42
  debug(`generateKey: ${filename}`);
44
43
  (0, utils_1.openssl)(['genrsa', '-out', filename, '2048']);
45
- (0, fs_1.chmodSync)(filename, 400);
44
+ fs_1.default.chmodSync(filename, 400);
46
45
  }
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGVzLmpzIiwic291cmNlUm9vdCI6Ii4vIiwic291cmNlcyI6WyJjZXJ0aWZpY2F0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFpQkEsNENBcUJDO0FBR0Qsa0NBSUM7O0FBN0NELDJCQUEyQjtBQUMzQiwwREFBZ0M7QUFDaEMsbUNBQXdDO0FBQ3hDLDJCQUF3QztBQUN4QywyQ0FBeUc7QUFDekcsbUNBQWtDO0FBQ2xDLG1FQUE4RTtBQUU5RSxNQUFNLEtBQUssR0FBRyxJQUFBLGVBQVcsRUFBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBRWxEOzs7Ozs7R0FNRztBQUNILFNBQThCLHlCQUF5QixDQUFDLE1BQWM7O1FBQ3BFLElBQUEsYUFBTSxFQUFDLElBQUEseUJBQWEsRUFBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRTlCLEtBQUssQ0FBQyw4QkFBK0IsTUFBTyxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLGFBQWEsR0FBRyxJQUFBLHlCQUFhLEVBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDN0QsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTNCLEtBQUssQ0FBQyw4Q0FBK0MsTUFBTyxFQUFFLENBQUMsQ0FBQztRQUNoRSxJQUFJLE9BQU8sR0FBRyxJQUFBLHlCQUFhLEVBQUMsTUFBTSxFQUFFLGlDQUFpQyxDQUFDLENBQUM7UUFDdkUsSUFBQSwwQ0FBOEIsRUFBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUNwRCxJQUFBLGVBQU8sRUFBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzFGLENBQUMsQ0FBQyxDQUFDO1FBRUgsS0FBSyxDQUFDLDhCQUErQixNQUFPLGdEQUFnRCxDQUFDLENBQUM7UUFDOUYsSUFBSSxjQUFjLEdBQUcsSUFBQSx5QkFBYSxFQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRTlELE1BQU0sSUFBQSwyREFBbUMsRUFBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUU7WUFDdEUsSUFBQSx1Q0FBMkIsRUFBQyxNQUFNLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO2dCQUMzRCxJQUFBLGVBQU8sRUFBQyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7WUFDaEssQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FBQTtBQUVELDJGQUEyRjtBQUMzRixTQUFnQixXQUFXLENBQUMsUUFBZ0I7SUFDMUMsS0FBSyxDQUFDLGdCQUFpQixRQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLElBQUEsZUFBTyxFQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM5QyxJQUFBLGNBQUssRUFBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGNyZWF0ZURlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IHN5bmMgYXMgbWtkaXJwIH0gZnJvbSAnbWtkaXJwJztcbmltcG9ydCB7IGNobW9kU3luYyBhcyBjaG1vZCB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IHBhdGhGb3JEb21haW4sIHdpdGhEb21haW5TaWduaW5nUmVxdWVzdENvbmZpZywgd2l0aERvbWFpbkNlcnRpZmljYXRlQ29uZmlnIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgb3BlbnNzbCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgd2l0aENlcnRpZmljYXRlQXV0aG9yaXR5Q3JlZGVudGlhbHMgfSBmcm9tICcuL2NlcnRpZmljYXRlLWF1dGhvcml0eSc7XG5cbmNvbnN0IGRlYnVnID0gY3JlYXRlRGVidWcoJ2RldmNlcnQ6Y2VydGlmaWNhdGVzJyk7XG5cbi8qKlxuICogR2VuZXJhdGUgYSBkb21haW4gY2VydGlmaWNhdGUgc2lnbmVkIGJ5IHRoZSBkZXZjZXJ0IHJvb3QgQ0EuIERvbWFpblxuICogY2VydGlmaWNhdGVzIGFyZSBjYWNoZWQgaW4gdGhlaXIgb3duIGRpcmVjdG9yaWVzIHVuZGVyXG4gKiBDT05GSUdfUk9PVC9kb21haW5zLzxkb21haW4+LCBhbmQgcmV1c2VkIG9uIHN1YnNlcXVlbnQgcmVxdWVzdHMuIEJlY2F1c2UgdGhlXG4gKiBpbmRpdmlkdWFsIGRvbWFpbiBjZXJ0aWZpY2F0ZXMgYXJlIHNpZ25lZCBieSB0aGUgZGV2Y2VydCByb290IENBICh3aGljaCB3YXNcbiAqIGFkZGVkIHRvIHRoZSBPUy9icm93c2VyIHRydXN0IHN0b3JlcyksIHRoZXkgYXJlIHRydXN0ZWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9tYWluQ2VydGlmaWNhdGUoZG9tYWluOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbWtkaXJwKHBhdGhGb3JEb21haW4oZG9tYWluKSk7XG5cbiAgZGVidWcoYEdlbmVyYXRpbmcgcHJpdmF0ZSBrZXkgZm9yICR7IGRvbWFpbiB9YCk7XG4gIGxldCBkb21haW5LZXlQYXRoID0gcGF0aEZvckRvbWFpbihkb21haW4sICdwcml2YXRlLWtleS5rZXknKTtcbiAgZ2VuZXJhdGVLZXkoZG9tYWluS2V5UGF0aCk7XG5cbiAgZGVidWcoYEdlbmVyYXRpbmcgY2VydGlmaWNhdGUgc2lnbmluZyByZXF1ZXN0IGZvciAkeyBkb21haW4gfWApO1xuICBsZXQgY3NyRmlsZSA9IHBhdGhGb3JEb21haW4oZG9tYWluLCBgY2VydGlmaWNhdGUtc2lnbmluZy1yZXF1ZXN0LmNzcmApO1xuICB3aXRoRG9tYWluU2lnbmluZ1JlcXVlc3RDb25maWcoZG9tYWluLCAoY29uZmlncGF0aCkgPT4ge1xuICAgIG9wZW5zc2woWydyZXEnLCAnLW5ldycsICctY29uZmlnJywgY29uZmlncGF0aCwgJy1rZXknLCBkb21haW5LZXlQYXRoLCAnLW91dCcsIGNzckZpbGVdKTtcbiAgfSk7XG5cbiAgZGVidWcoYEdlbmVyYXRpbmcgY2VydGlmaWNhdGUgZm9yICR7IGRvbWFpbiB9IGZyb20gc2lnbmluZyByZXF1ZXN0IGFuZCBzaWduaW5nIHdpdGggcm9vdCBDQWApO1xuICBsZXQgZG9tYWluQ2VydFBhdGggPSBwYXRoRm9yRG9tYWluKGRvbWFpbiwgYGNlcnRpZmljYXRlLmNydGApO1xuXG4gIGF3YWl0IHdpdGhDZXJ0aWZpY2F0ZUF1dGhvcml0eUNyZWRlbnRpYWxzKCh7IGNhS2V5UGF0aCwgY2FDZXJ0UGF0aCB9KSA9PiB7XG4gICAgd2l0aERvbWFpbkNlcnRpZmljYXRlQ29uZmlnKGRvbWFpbiwgKGRvbWFpbkNlcnRDb25maWdQYXRoKSA9PiB7XG4gICAgICBvcGVuc3NsKFsnY2EnLCAnLWNvbmZpZycsIGRvbWFpbkNlcnRDb25maWdQYXRoLCAnLWluJywgY3NyRmlsZSwgJy1vdXQnLCBkb21haW5DZXJ0UGF0aCwgJy1rZXlmaWxlJywgY2FLZXlQYXRoLCAnLWNlcnQnLCBjYUNlcnRQYXRoLCAnLWRheXMnLCAnODI1JywgJy1iYXRjaCddKVxuICAgIH0pO1xuICB9KTtcbn1cblxuLy8gR2VuZXJhdGUgYSBjcnlwdG9ncmFwaGljIGtleSwgdXNlZCB0byBzaWduIGNlcnRpZmljYXRlcyBvciBjZXJ0aWZpY2F0ZSBzaWduaW5nIHJlcXVlc3RzLlxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlS2V5KGZpbGVuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgZGVidWcoYGdlbmVyYXRlS2V5OiAkeyBmaWxlbmFtZSB9YCk7XG4gIG9wZW5zc2woWydnZW5yc2EnLCAnLW91dCcsIGZpbGVuYW1lLCAnMjA0OCddKTtcbiAgY2htb2QoZmlsZW5hbWUsIDQwMCk7XG59Il19
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGVzLmpzIiwic291cmNlUm9vdCI6Ii4vIiwic291cmNlcyI6WyJjZXJ0aWZpY2F0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFnQkEsNENBcUJDO0FBR0Qsa0NBSUM7QUE1Q0QsMkJBQTJCO0FBQzNCLGtEQUFnQztBQUNoQyw0Q0FBb0I7QUFDcEIsMkNBQXlHO0FBQ3pHLG1DQUFrQztBQUNsQyxtRUFBOEU7QUFFOUUsTUFBTSxLQUFLLEdBQUcsSUFBQSxlQUFXLEVBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUVsRDs7Ozs7O0dBTUc7QUFDWSxLQUFLLFVBQVUseUJBQXlCLENBQUMsTUFBYztJQUNwRSxNQUFNLFlBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUEseUJBQWEsRUFBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRXBFLEtBQUssQ0FBQyw4QkFBK0IsTUFBTyxFQUFFLENBQUMsQ0FBQztJQUNoRCxJQUFJLGFBQWEsR0FBRyxJQUFBLHlCQUFhLEVBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDN0QsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRTNCLEtBQUssQ0FBQyw4Q0FBK0MsTUFBTyxFQUFFLENBQUMsQ0FBQztJQUNoRSxJQUFJLE9BQU8sR0FBRyxJQUFBLHlCQUFhLEVBQUMsTUFBTSxFQUFFLGlDQUFpQyxDQUFDLENBQUM7SUFDdkUsSUFBQSwwQ0FBOEIsRUFBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRTtRQUNwRCxJQUFBLGVBQU8sRUFBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQyxDQUFDO0lBRUgsS0FBSyxDQUFDLDhCQUErQixNQUFPLGdEQUFnRCxDQUFDLENBQUM7SUFDOUYsSUFBSSxjQUFjLEdBQUcsSUFBQSx5QkFBYSxFQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBRTlELE1BQU0sSUFBQSwyREFBbUMsRUFBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUU7UUFDdEUsSUFBQSx1Q0FBMkIsRUFBQyxNQUFNLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO1lBQzNELElBQUEsZUFBTyxFQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUNoSyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELDJGQUEyRjtBQUMzRixTQUFnQixXQUFXLENBQUMsUUFBZ0I7SUFDMUMsS0FBSyxDQUFDLGdCQUFpQixRQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLElBQUEsZUFBTyxFQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM5QyxZQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgY3JlYXRlRGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IHBhdGhGb3JEb21haW4sIHdpdGhEb21haW5TaWduaW5nUmVxdWVzdENvbmZpZywgd2l0aERvbWFpbkNlcnRpZmljYXRlQ29uZmlnIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgb3BlbnNzbCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgd2l0aENlcnRpZmljYXRlQXV0aG9yaXR5Q3JlZGVudGlhbHMgfSBmcm9tICcuL2NlcnRpZmljYXRlLWF1dGhvcml0eSc7XG5cbmNvbnN0IGRlYnVnID0gY3JlYXRlRGVidWcoJ2RldmNlcnQ6Y2VydGlmaWNhdGVzJyk7XG5cbi8qKlxuICogR2VuZXJhdGUgYSBkb21haW4gY2VydGlmaWNhdGUgc2lnbmVkIGJ5IHRoZSBkZXZjZXJ0IHJvb3QgQ0EuIERvbWFpblxuICogY2VydGlmaWNhdGVzIGFyZSBjYWNoZWQgaW4gdGhlaXIgb3duIGRpcmVjdG9yaWVzIHVuZGVyXG4gKiBDT05GSUdfUk9PVC9kb21haW5zLzxkb21haW4+LCBhbmQgcmV1c2VkIG9uIHN1YnNlcXVlbnQgcmVxdWVzdHMuIEJlY2F1c2UgdGhlXG4gKiBpbmRpdmlkdWFsIGRvbWFpbiBjZXJ0aWZpY2F0ZXMgYXJlIHNpZ25lZCBieSB0aGUgZGV2Y2VydCByb290IENBICh3aGljaCB3YXNcbiAqIGFkZGVkIHRvIHRoZSBPUy9icm93c2VyIHRydXN0IHN0b3JlcyksIHRoZXkgYXJlIHRydXN0ZWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9tYWluQ2VydGlmaWNhdGUoZG9tYWluOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aEZvckRvbWFpbihkb21haW4pLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBkZWJ1ZyhgR2VuZXJhdGluZyBwcml2YXRlIGtleSBmb3IgJHsgZG9tYWluIH1gKTtcbiAgbGV0IGRvbWFpbktleVBhdGggPSBwYXRoRm9yRG9tYWluKGRvbWFpbiwgJ3ByaXZhdGUta2V5LmtleScpO1xuICBnZW5lcmF0ZUtleShkb21haW5LZXlQYXRoKTtcblxuICBkZWJ1ZyhgR2VuZXJhdGluZyBjZXJ0aWZpY2F0ZSBzaWduaW5nIHJlcXVlc3QgZm9yICR7IGRvbWFpbiB9YCk7XG4gIGxldCBjc3JGaWxlID0gcGF0aEZvckRvbWFpbihkb21haW4sIGBjZXJ0aWZpY2F0ZS1zaWduaW5nLXJlcXVlc3QuY3NyYCk7XG4gIHdpdGhEb21haW5TaWduaW5nUmVxdWVzdENvbmZpZyhkb21haW4sIChjb25maWdwYXRoKSA9PiB7XG4gICAgb3BlbnNzbChbJ3JlcScsICctbmV3JywgJy1jb25maWcnLCBjb25maWdwYXRoLCAnLWtleScsIGRvbWFpbktleVBhdGgsICctb3V0JywgY3NyRmlsZV0pO1xuICB9KTtcblxuICBkZWJ1ZyhgR2VuZXJhdGluZyBjZXJ0aWZpY2F0ZSBmb3IgJHsgZG9tYWluIH0gZnJvbSBzaWduaW5nIHJlcXVlc3QgYW5kIHNpZ25pbmcgd2l0aCByb290IENBYCk7XG4gIGxldCBkb21haW5DZXJ0UGF0aCA9IHBhdGhGb3JEb21haW4oZG9tYWluLCBgY2VydGlmaWNhdGUuY3J0YCk7XG5cbiAgYXdhaXQgd2l0aENlcnRpZmljYXRlQXV0aG9yaXR5Q3JlZGVudGlhbHMoKHsgY2FLZXlQYXRoLCBjYUNlcnRQYXRoIH0pID0+IHtcbiAgICB3aXRoRG9tYWluQ2VydGlmaWNhdGVDb25maWcoZG9tYWluLCAoZG9tYWluQ2VydENvbmZpZ1BhdGgpID0+IHtcbiAgICAgIG9wZW5zc2woWydjYScsICctY29uZmlnJywgZG9tYWluQ2VydENvbmZpZ1BhdGgsICctaW4nLCBjc3JGaWxlLCAnLW91dCcsIGRvbWFpbkNlcnRQYXRoLCAnLWtleWZpbGUnLCBjYUtleVBhdGgsICctY2VydCcsIGNhQ2VydFBhdGgsICctZGF5cycsICc4MjUnLCAnLWJhdGNoJ10pXG4gICAgfSk7XG4gIH0pO1xufVxuXG4vLyBHZW5lcmF0ZSBhIGNyeXB0b2dyYXBoaWMga2V5LCB1c2VkIHRvIHNpZ24gY2VydGlmaWNhdGVzIG9yIGNlcnRpZmljYXRlIHNpZ25pbmcgcmVxdWVzdHMuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVLZXkoZmlsZW5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBkZWJ1ZyhgZ2VuZXJhdGVLZXk6ICR7IGZpbGVuYW1lIH1gKTtcbiAgb3BlbnNzbChbJ2dlbnJzYScsICctb3V0JywgZmlsZW5hbWUsICcyMDQ4J10pO1xuICBmcy5jaG1vZFN5bmMoZmlsZW5hbWUsIDQwMCk7XG59XG4iXX0=
@@ -3,7 +3,7 @@ export declare const VALID_DOMAIN: RegExp;
3
3
  export declare const isMac: boolean;
4
4
  export declare const isLinux: boolean;
5
5
  export declare const isWindows: boolean;
6
- export declare const configDir: any;
6
+ export declare const configDir: string;
7
7
  export declare const configPath: (...pathSegments: string[]) => string;
8
8
  export declare const domainsDir: string;
9
9
  export declare const pathForDomain: (domain: string, ...pathSegments: string[]) => string;
package/dist/constants.js CHANGED
@@ -1,18 +1,31 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.rootCACertPath = exports.rootCAKeyPath = exports.rootCADir = exports.caSelfSignConfig = exports.opensslDatabaseFilePath = exports.opensslSerialFilePath = exports.caVersionFile = exports.pathForDomain = exports.domainsDir = exports.configPath = exports.configDir = exports.isWindows = exports.isLinux = exports.isMac = exports.VALID_DOMAIN = exports.VALID_IP = void 0;
4
7
  exports.withDomainSigningRequestConfig = withDomainSigningRequestConfig;
5
8
  exports.withDomainCertificateConfig = withDomainCertificateConfig;
6
9
  exports.getLegacyConfigDir = getLegacyConfigDir;
7
10
  exports.ensureConfigDirs = ensureConfigDirs;
8
- const tslib_1 = require("tslib");
9
- const path_1 = tslib_1.__importDefault(require("path"));
10
- const fs_1 = require("fs");
11
- const mkdirp_1 = require("mkdirp");
12
- const lodash_1 = require("lodash");
13
- const applicationConfigPath = require("application-config-path");
14
- const eol_1 = tslib_1.__importDefault(require("eol"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const fs_1 = __importDefault(require("fs"));
15
13
  const utils_1 = require("./utils");
14
+ function applicationConfigPath(name) {
15
+ switch (process.platform) {
16
+ case 'darwin':
17
+ return path_1.default.join(process.env.HOME, 'Library', 'Application Support', name);
18
+ case 'win32':
19
+ return process.env.LOCALAPPDATA
20
+ ? path_1.default.join(process.env.LOCALAPPDATA, name)
21
+ : path_1.default.join(process.env.USERPROFILE, 'Local Settings', 'Application Data', name);
22
+ case 'linux':
23
+ default:
24
+ return process.env.XDG_CONFIG_HOME
25
+ ? path_1.default.join(process.env.XDG_CONFIG_HOME, name)
26
+ : path_1.default.join(process.env.HOME, '.config', name);
27
+ }
28
+ }
16
29
  exports.VALID_IP = /(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}/;
17
30
  exports.VALID_DOMAIN = /^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.?)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$/i;
18
31
  // Platform shortcuts
@@ -28,32 +41,32 @@ exports.caVersionFile = (0, exports.configPath)('devcert-ca-version');
28
41
  exports.opensslSerialFilePath = (0, exports.configPath)('certificate-authority', 'serial');
29
42
  exports.opensslDatabaseFilePath = (0, exports.configPath)('certificate-authority', 'index.txt');
30
43
  exports.caSelfSignConfig = path_1.default.join(__dirname, '../openssl-configurations/certificate-authority-self-signing.conf');
44
+ function eolAuto(str) {
45
+ return str.replace(/\r?\n|\r/g, exports.isWindows ? '\r\n' : '\n');
46
+ }
31
47
  function withDomainSigningRequestConfig(domain, cb) {
32
48
  let tmpFile = (0, utils_1.mktmp)();
33
- let source = (0, fs_1.readFileSync)(path_1.default.join(__dirname, '../openssl-configurations/domain-certificate-signing-requests.conf'), 'utf-8');
34
- let template = (0, lodash_1.template)(source);
35
- let result = template({ domain });
36
- (0, fs_1.writeFileSync)(tmpFile, eol_1.default.auto(result));
49
+ let source = fs_1.default.readFileSync(path_1.default.join(__dirname, '../openssl-configurations/domain-certificate-signing-requests.conf'), 'utf-8');
50
+ let result = source.replace(/%DOMAIN%/g, domain);
51
+ fs_1.default.writeFileSync(tmpFile, eolAuto(result));
37
52
  cb(tmpFile);
38
- (0, fs_1.unlinkSync)(tmpFile);
53
+ fs_1.default.rmSync(tmpFile);
39
54
  }
40
55
  function withDomainCertificateConfig(domain, cb) {
41
56
  let tmpFile = (0, utils_1.mktmp)();
42
- let source = (0, fs_1.readFileSync)(path_1.default.join(__dirname, '../openssl-configurations/domain-certificates.conf'), 'utf-8');
43
- let template = (0, lodash_1.template)(source);
44
- let result = template({
45
- domain,
46
- serialFile: exports.opensslSerialFilePath,
47
- databaseFile: exports.opensslDatabaseFilePath,
48
- domainDir: (0, exports.pathForDomain)(domain)
49
- });
50
- (0, fs_1.writeFileSync)(tmpFile, eol_1.default.auto(result));
57
+ let source = fs_1.default.readFileSync(path_1.default.join(__dirname, '../openssl-configurations/domain-certificates.conf'), 'utf-8');
58
+ let result = source
59
+ .replace(/%DOMAIN%/g, domain)
60
+ .replace(/%SERIALFILE%/g, exports.opensslSerialFilePath.replace(/\\/g, '\\\\'))
61
+ .replace(/%DATABASEFILE%/g, exports.opensslDatabaseFilePath.replace(/\\/g, '\\\\'))
62
+ .replace(/%DOMAINDIR%/g, (0, exports.pathForDomain)(domain).replace(/\\/g, '\\\\'));
63
+ fs_1.default.writeFileSync(tmpFile, eolAuto(result));
51
64
  cb(tmpFile);
52
- (0, fs_1.unlinkSync)(tmpFile);
65
+ fs_1.default.rmSync(tmpFile);
53
66
  }
54
67
  // confTemplate = confTemplate.replace(/DATABASE_PATH/, configPath('index.txt').replace(/\\/g, '\\\\'));
55
68
  // confTemplate = confTemplate.replace(/SERIAL_PATH/, configPath('serial').replace(/\\/g, '\\\\'));
56
- // confTemplate = eol.auto(confTemplate);
69
+ // confTemplate = eolAuto(confTemplate);
57
70
  exports.rootCADir = (0, exports.configPath)('certificate-authority');
58
71
  exports.rootCAKeyPath = (0, exports.configPath)('certificate-authority', 'private-key.key');
59
72
  exports.rootCACertPath = (0, exports.configPath)('certificate-authority', 'certificate.cert');
@@ -69,9 +82,9 @@ function getLegacyConfigDir() {
69
82
  }
70
83
  }
71
84
  function ensureConfigDirs() {
72
- (0, mkdirp_1.sync)(exports.configDir);
73
- (0, mkdirp_1.sync)(exports.domainsDir);
74
- (0, mkdirp_1.sync)(exports.rootCADir);
85
+ fs_1.default.mkdirSync(exports.configDir, { recursive: true });
86
+ fs_1.default.mkdirSync(exports.domainsDir, { recursive: true });
87
+ fs_1.default.mkdirSync(exports.rootCADir, { recursive: true });
75
88
  }
76
89
  ensureConfigDirs();
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6Ii4vIiwic291cmNlcyI6WyJjb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBNEJBLHdFQVFDO0FBRUQsa0VBYUM7QUFhRCxnREFRQztBQUVELDRDQUlDOztBQTlFRCx3REFBd0I7QUFDeEIsMkJBQTRGO0FBQzVGLG1DQUF3QztBQUN4QyxtQ0FBa0Q7QUFDbEQsaUVBQWtFO0FBQ2xFLHNEQUFzQjtBQUN0QixtQ0FBZ0M7QUFFbkIsUUFBQSxRQUFRLEdBQUcscUZBQXFGLENBQUM7QUFDakcsUUFBQSxZQUFZLEdBQUcsZ0ZBQWdGLENBQUM7QUFFN0cscUJBQXFCO0FBQ1IsUUFBQSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUM7QUFDdEMsUUFBQSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUM7QUFDdkMsUUFBQSxTQUFTLEdBQUcsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUM7QUFFdEQsZUFBZTtBQUNGLFFBQUEsU0FBUyxHQUFHLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzdDLFFBQUEsVUFBVSxHQUEwQyxjQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFJLEVBQUUsaUJBQVMsQ0FBQyxDQUFDO0FBRXBGLFFBQUEsVUFBVSxHQUFHLElBQUEsa0JBQVUsRUFBQyxTQUFTLENBQUMsQ0FBQztBQUNuQyxRQUFBLGFBQWEsR0FBMEQsY0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBSSxFQUFFLGtCQUFVLENBQUMsQ0FBQTtBQUV2RyxRQUFBLGFBQWEsR0FBRyxJQUFBLGtCQUFVLEVBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUNqRCxRQUFBLHFCQUFxQixHQUFHLElBQUEsa0JBQVUsRUFBQyx1QkFBdUIsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUN0RSxRQUFBLHVCQUF1QixHQUFHLElBQUEsa0JBQVUsRUFBQyx1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Z0I7SUFDOUIsSUFBQSxhQUFNLEVBQUMsaUJBQVMsQ0FBQyxDQUFDO0lBQ2xCLElBQUEsYUFBTSxFQUFDLGtCQUFVLENBQUMsQ0FBQztJQUNuQixJQUFBLGFBQU0sRUFBQyxpQkFBUyxDQUFDLENBQUM7QUFDcEIsQ0FBQztBQUVELGdCQUFnQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHVubGlua1N5bmMgYXMgcm0sIHdyaXRlRmlsZVN5bmMgYXMgd3JpdGVGaWxlLCByZWFkRmlsZVN5bmMgYXMgcmVhZEZpbGUgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBzeW5jIGFzIG1rZGlycCB9IGZyb20gJ21rZGlycCc7XG5pbXBvcnQgeyB0ZW1wbGF0ZSBhcyBtYWtlVGVtcGxhdGUgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGFwcGxpY2F0aW9uQ29uZmlnUGF0aCA9IHJlcXVpcmUoJ2FwcGxpY2F0aW9uLWNvbmZpZy1wYXRoJyk7XG5pbXBvcnQgZW9sIGZyb20gJ2VvbCc7XG5pbXBvcnQgeyBta3RtcCB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgVkFMSURfSVAgPSAvKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XVxcZHxcXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XVxcZHxcXGQpKXszfS87XG5leHBvcnQgY29uc3QgVkFMSURfRE9NQUlOID0gL14oPzpbYS16MC05XSg/OlthLXowLTktXXswLDYxfVthLXowLTldKT9cXC4/KStbYS16MC05XVthLXowLTktXXswLDYxfVthLXowLTldJC9pO1xuXG4vLyBQbGF0Zm9ybSBzaG9ydGN1dHNcbmV4cG9ydCBjb25zdCBpc01hYyA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nO1xuZXhwb3J0IGNvbnN0IGlzTGludXggPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnbGludXgnO1xuZXhwb3J0IGNvbnN0IGlzV2luZG93cyA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG5cbi8vIENvbW1vbiBwYXRoc1xuZXhwb3J0IGNvbnN0IGNvbmZpZ0RpciA9IGFwcGxpY2F0aW9uQ29uZmlnUGF0aCgnZGV2Y2VydCcpO1xuZXhwb3J0IGNvbnN0IGNvbmZpZ1BhdGg6ICguLi5wYXRoU2VnbWVudHM6IHN0cmluZ1tdKSA9PiBzdHJpbmcgPSBwYXRoLmpvaW4uYmluZChwYXRoLCBjb25maWdEaXIpO1xuXG5leHBvcnQgY29uc3QgZG9tYWluc0RpciA9IGNvbmZpZ1BhdGgoJ2RvbWFpbnMnKTtcbmV4cG9ydCBjb25zdCBwYXRoRm9yRG9tYWluOiAoZG9tYWluOiBzdHJpbmcsIC4uLnBhdGhTZWdtZW50czogc3RyaW5nW10pID0+IHN0cmluZyA9IHBhdGguam9pbi5iaW5kKHBhdGgsIGRvbWFpbnNEaXIpXG5cbmV4cG9ydCBjb25zdCBjYVZlcnNpb25GaWxlID0gY29uZmlnUGF0aCgnZGV2Y2VydC1jYS12ZXJzaW9uJyk7XG5leHBvcnQgY29uc3Qgb3BlbnNzbFNlcmlhbEZpbGVQYXRoID0gY29uZmlnUGF0aCgnY2VydGlmaWNhdGUtYXV0aG9yaXR5JywgJ3NlcmlhbCcpO1xuZXhwb3J0IGNvbnN0IG9wZW5zc2xEYXRhYmFzZUZpbGVQYXRoID0gY29uZmlnUGF0aCgnY2VydGlmaWNhdGUtYXV0aG9yaXR5JywgJ2luZGV4LnR4dCcpO1xuZXhwb3J0IGNvbnN0IGNhU2VsZlNpZ25Db25maWcgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vb3BlbnNzbC1jb25maWd1cmF0aW9ucy9jZXJ0aWZpY2F0ZS1hdXRob3JpdHktc2VsZi1zaWduaW5nLmNvbmYnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEb21haW5TaWduaW5nUmVxdWVzdENvbmZpZyhkb21haW46IHN0cmluZywgY2I6IChmaWxlcGF0aDogc3RyaW5nKSA9PiB2b2lkKSB7XG4gIGxldCB0bXBGaWxlID0gbWt0bXAoKTtcbiAgbGV0IHNvdXJjZSA9IHJlYWRGaWxlKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9vcGVuc3NsLWNvbmZpZ3VyYXRpb25zL2RvbWFpbi1jZXJ0aWZpY2F0ZS1zaWduaW5nLXJlcXVlc3RzLmNvbmYnKSwgJ3V0Zi04Jyk7XG4gIGxldCB0ZW1wbGF0ZSA9IG1ha2VUZW1wbGF0ZShzb3VyY2UpO1xuICBsZXQgcmVzdWx0ID0gdGVtcGxhdGUoeyBkb21haW4gfSk7XG4gIHdyaXRlRmlsZSh0bXBGaWxlLCBlb2wuYXV0byhyZXN1bHQpKTtcbiAgY2IodG1wRmlsZSk7XG4gIHJtKHRtcEZpbGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aERvbWFpbkNlcnRpZmljYXRlQ29uZmlnKGRvbWFpbjogc3RyaW5nLCBjYjogKGZpbGVwYXRoOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IHRtcEZpbGUgPSBta3RtcCgpO1xuICBsZXQgc291cmNlID0gcmVhZEZpbGUocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL29wZW5zc2wtY29uZmlndXJhdGlvbnMvZG9tYWluLWNlcnRpZmljYXRlcy5jb25mJyksICd1dGYtOCcpO1xuICBsZXQgdGVtcGxhdGUgPSBtYWtlVGVtcGxhdGUoc291cmNlKTtcbiAgbGV0IHJlc3VsdCA9IHRlbXBsYXRlKHtcbiAgICBkb21haW4sXG4gICAgc2VyaWFsRmlsZTogb3BlbnNzbFNlcmlhbEZpbGVQYXRoLFxuICAgIGRhdGFiYXNlRmlsZTogb3BlbnNzbERhdGFiYXNlRmlsZVBhdGgsXG4gICAgZG9tYWluRGlyOiBwYXRoRm9yRG9tYWluKGRvbWFpbilcbiAgfSk7XG4gIHdyaXRlRmlsZSh0bXBGaWxlLCBlb2wuYXV0byhyZXN1bHQpKTtcbiAgY2IodG1wRmlsZSk7XG4gIHJtKHRtcEZpbGUpO1xufVxuXG4gIC8vIGNvbmZUZW1wbGF0ZSA9IGNvbmZUZW1wbGF0ZS5yZXBsYWNlKC9EQVRBQkFTRV9QQVRILywgY29uZmlnUGF0aCgnaW5kZXgudHh0JykucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKSk7XG4gIC8vIGNvbmZUZW1wbGF0ZSA9IGNvbmZUZW1wbGF0ZS5yZXBsYWNlKC9TRVJJQUxfUEFUSC8sIGNvbmZpZ1BhdGgoJ3NlcmlhbCcpLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykpO1xuICAvLyBjb25mVGVtcGxhdGUgPSBlb2wuYXV0byhjb25mVGVtcGxhdGUpO1xuXG5leHBvcnQgY29uc3Qgcm9vdENBRGlyID0gY29uZmlnUGF0aCgnY2VydGlmaWNhdGUtYXV0aG9yaXR5Jyk7XG5leHBvcnQgY29uc3Qgcm9vdENBS2V5UGF0aCA9IGNvbmZpZ1BhdGgoJ2NlcnRpZmljYXRlLWF1dGhvcml0eScsICdwcml2YXRlLWtleS5rZXknKTtcbmV4cG9ydCBjb25zdCByb290Q0FDZXJ0UGF0aCA9IGNvbmZpZ1BhdGgoJ2NlcnRpZmljYXRlLWF1dGhvcml0eScsICdjZXJ0aWZpY2F0ZS5jZXJ0Jyk7XG5cblxuXG4vLyBFeHBvc2VkIGZvciB1bmluc3RhbGxhdGlvbiBwdXJwb3Nlcy5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMZWdhY3lDb25maWdEaXIoKTogc3RyaW5nIHtcbiAgaWYgKGlzV2luZG93cyAmJiBwcm9jZXNzLmVudi5MT0NBTEFQUERBVEEpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHByb2Nlc3MuZW52LkxPQ0FMQVBQREFUQSwgJ2RldmNlcnQnLCAnY29uZmlnJyk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHVpZCA9IHByb2Nlc3MuZ2V0dWlkICYmIHByb2Nlc3MuZ2V0dWlkKCk7XG4gICAgbGV0IHVzZXJIb21lID0gKGlzTGludXggJiYgdWlkID09PSAwKSA/IHBhdGgucmVzb2x2ZSgnL3Vzci9sb2NhbC9zaGFyZScpIDogcmVxdWlyZSgnb3MnKS5ob21lZGlyKCk7XG4gICAgcmV0dXJuIHBhdGguam9pbih1c2VySG9tZSwgJy5jb25maWcnLCAnZGV2Y2VydCcpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVDb25maWdEaXJzKCkge1xuICBta2RpcnAoY29uZmlnRGlyKTtcbiAgbWtkaXJwKGRvbWFpbnNEaXIpO1xuICBta2RpcnAocm9vdENBRGlyKTtcbn1cblxuZW5zdXJlQ29uZmlnRGlycygpO1xuIl19
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6Ii4vIiwic291cmNlcyI6WyJjb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBNENBLHdFQU9DO0FBRUQsa0VBV0M7QUFhRCxnREFRQztBQUVELDRDQUlDO0FBM0ZELGdEQUF3QjtBQUN4Qiw0Q0FBb0I7QUFDcEIsbUNBQWdDO0FBRWhDLFNBQVMscUJBQXFCLENBQUMsSUFBWTtJQUN6QyxRQUFRLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixLQUFLLFFBQVE7WUFDWCxPQUFPLGNBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdFLEtBQUssT0FBTztZQUNWLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZO2dCQUM3QixDQUFDLENBQUMsY0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7Z0JBQzNDLENBQUMsQ0FBQyxjQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JGLEtBQUssT0FBTyxDQUFDO1FBQ2I7WUFDRSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZTtnQkFDaEMsQ0FBQyxDQUFDLGNBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDO2dCQUM5QyxDQUFDLENBQUMsY0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckQsQ0FBQztBQUNILENBQUM7QUFFWSxRQUFBLFFBQVEsR0FBRyxxRkFBcUYsQ0FBQztBQUNqRyxRQUFBLFlB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QyxZQUFFLENBQUMsU0FBUyxDQUFDLGtCQUFVLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5QyxZQUFFLENBQUMsU0FBUyxDQUFDLGlCQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsZ0JBQWdCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IG1rdG1wIH0gZnJvbSAnLi91dGlscyc7XG5cbmZ1bmN0aW9uIGFwcGxpY2F0aW9uQ29uZmlnUGF0aChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHByb2Nlc3MucGxhdGZvcm0pIHtcbiAgICBjYXNlICdkYXJ3aW4nOlxuICAgICAgcmV0dXJuIHBhdGguam9pbihwcm9jZXNzLmVudi5IT01FLCAnTGlicmFyeScsICdBcHBsaWNhdGlvbiBTdXBwb3J0JywgbmFtZSk7XG4gICAgY2FzZSAnd2luMzInOlxuICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LkxPQ0FMQVBQREFUQVxuICAgICAgICA/IHBhdGguam9pbihwcm9jZXNzLmVudi5MT0NBTEFQUERBVEEsIG5hbWUpXG4gICAgICAgIDogcGF0aC5qb2luKHByb2Nlc3MuZW52LlVTRVJQUk9GSUxFLCAnTG9jYWwgU2V0dGluZ3MnLCAnQXBwbGljYXRpb24gRGF0YScsIG5hbWUpO1xuICAgIGNhc2UgJ2xpbnV4JzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LlhER19DT05GSUdfSE9NRVxuICAgICAgICA/IHBhdGguam9pbihwcm9jZXNzLmVudi5YREdfQ09ORklHX0hPTUUsIG5hbWUpXG4gICAgICAgIDogcGF0aC5qb2luKHByb2Nlc3MuZW52LkhPTUUsICcuY29uZmlnJywgbmFtZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFZBTElEX0lQID0gLyg/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV1cXGR8XFxkKSg/OlxcLig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV1cXGR8XFxkKSl7M30vO1xuZXhwb3J0IGNvbnN0IFZBTElEX0RPTUFJTiA9IC9eKD86W2EtejAtOV0oPzpbYS16MC05LV17MCw2MX1bYS16MC05XSk/XFwuPykrW2EtejAtOV1bYS16MC05LV17MCw2MX1bYS16MC05XSQvaTtcblxuLy8gUGxhdGZvcm0gc2hvcnRjdXRzXG5leHBvcnQgY29uc3QgaXNNYWMgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJztcbmV4cG9ydCBjb25zdCBpc0xpbnV4ID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2xpbnV4JztcbmV4cG9ydCBjb25zdCBpc1dpbmRvd3MgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuXG4vLyBDb21tb24gcGF0aHNcbmV4cG9ydCBjb25zdCBjb25maWdEaXIgPSBhcHBsaWNhdGlvbkNvbmZpZ1BhdGgoJ2RldmNlcnQnKTtcbmV4cG9ydCBjb25zdCBjb25maWdQYXRoOiAoLi4ucGF0aFNlZ21lbnRzOiBzdHJpbmdbXSkgPT4gc3RyaW5nID0gcGF0aC5qb2luLmJpbmQocGF0aCwgY29uZmlnRGlyKTtcblxuZXhwb3J0IGNvbnN0IGRvbWFpbnNEaXIgPSBjb25maWdQYXRoKCdkb21haW5zJyk7XG5leHBvcnQgY29uc3QgcGF0aEZvckRvbWFpbjogKGRvbWFpbjogc3RyaW5nLCAuLi5wYXRoU2VnbWVudHM6IHN0cmluZ1tdKSA9PiBzdHJpbmcgPSBwYXRoLmpvaW4uYmluZChwYXRoLCBkb21haW5zRGlyKVxuXG5leHBvcnQgY29uc3QgY2FWZXJzaW9uRmlsZSA9IGNvbmZpZ1BhdGgoJ2RldmNlcnQtY2EtdmVyc2lvbicpO1xuZXhwb3J0IGNvbnN0IG9wZW5zc2xTZXJpYWxGaWxlUGF0aCA9IGNvbmZpZ1BhdGgoJ2NlcnRpZmljYXRlLWF1dGhvcml0eScsICdzZXJpYWwnKTtcbmV4cG9ydCBjb25zdCBvcGVuc3NsRGF0YWJhc2VGaWxlUGF0aCA9IGNvbmZpZ1BhdGgoJ2NlcnRpZmljYXRlLWF1dGhvcml0eScsICdpbmRleC50eHQnKTtcbmV4cG9ydCBjb25zdCBjYVNlbGZTaWduQ29uZmlnID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL29wZW5zc2wtY29uZmlndXJhdGlvbnMvY2VydGlmaWNhdGUtYXV0aG9yaXR5LXNlbGYtc2lnbmluZy5jb25mJyk7XG5cbmZ1bmN0aW9uIGVvbEF1dG8oc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL1xccj9cXG58XFxyL2csIGlzV2luZG93cyA/ICdcXHJcXG4nIDogJ1xcbicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aERvbWFpblNpZ25pbmdSZXF1ZXN0Q29uZmlnKGRvbWFpbjogc3RyaW5nLCBjYjogKGZpbGVwYXRoOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IHRtcEZpbGUgPSBta3RtcCgpO1xuICBsZXQgc291cmNlID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9vcGVuc3NsLWNvbmZpZ3VyYXRpb25zL2RvbWFpbi1jZXJ0aWZpY2F0ZS1zaWduaW5nLXJlcXVlc3RzLmNvbmYnKSwgJ3V0Zi04Jyk7XG4gIGxldCByZXN1bHQgPSBzb3VyY2UucmVwbGFjZSgvJURPTUFJTiUvZywgZG9tYWluKTtcbiAgZnMud3JpdGVGaWxlU3luYyh0bXBGaWxlLCBlb2xBdXRvKHJlc3VsdCkpO1xuICBjYih0bXBGaWxlKTtcbiAgZnMucm1TeW5jKHRtcEZpbGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aERvbWFpbkNlcnRpZmljYXRlQ29uZmlnKGRvbWFpbjogc3RyaW5nLCBjYjogKGZpbGVwYXRoOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IHRtcEZpbGUgPSBta3RtcCgpO1xuICBsZXQgc291cmNlID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9vcGVuc3NsLWNvbmZpZ3VyYXRpb25zL2RvbWFpbi1jZXJ0aWZpY2F0ZXMuY29uZicpLCAndXRmLTgnKTtcbiAgbGV0IHJlc3VsdCA9IHNvdXJjZVxuICAgIC5yZXBsYWNlKC8lRE9NQUlOJS9nLCBkb21haW4pXG4gICAgLnJlcGxhY2UoLyVTRVJJQUxGSUxFJS9nLCBvcGVuc3NsU2VyaWFsRmlsZVBhdGgucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKSlcbiAgICAucmVwbGFjZSgvJURBVEFCQVNFRklMRSUvZywgb3BlbnNzbERhdGFiYXNlRmlsZVBhdGgucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKSlcbiAgICAucmVwbGFjZSgvJURPTUFJTkRJUiUvZywgcGF0aEZvckRvbWFpbihkb21haW4pLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykpXG4gIGZzLndyaXRlRmlsZVN5bmModG1wRmlsZSwgZW9sQXV0byhyZXN1bHQpKTtcbiAgY2IodG1wRmlsZSk7XG4gIGZzLnJtU3luYyh0bXBGaWxlKTtcbn1cblxuICAvLyBjb25mVGVtcGxhdGUgPSBjb25mVGVtcGxhdGUucmVwbGFjZSgvREFUQUJBU0VfUEFUSC8sIGNvbmZpZ1BhdGgoJ2luZGV4LnR4dCcpLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykpO1xuICAvLyBjb25mVGVtcGxhdGUgPSBjb25mVGVtcGxhdGUucmVwbGFjZSgvU0VSSUFMX1BBVEgvLCBjb25maWdQYXRoKCdzZXJpYWwnKS5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpKTtcbiAgLy8gY29uZlRlbXBsYXRlID0gZW9sQXV0byhjb25mVGVtcGxhdGUpO1xuXG5leHBvcnQgY29uc3Qgcm9vdENBRGlyID0gY29uZmlnUGF0aCgnY2VydGlmaWNhdGUtYXV0aG9yaXR5Jyk7XG5leHBvcnQgY29uc3Qgcm9vdENBS2V5UGF0aCA9IGNvbmZpZ1BhdGgoJ2NlcnRpZmljYXRlLWF1dGhvcml0eScsICdwcml2YXRlLWtleS5rZXknKTtcbmV4cG9ydCBjb25zdCByb290Q0FDZXJ0UGF0aCA9IGNvbmZpZ1BhdGgoJ2NlcnRpZmljYXRlLWF1dGhvcml0eScsICdjZXJ0aWZpY2F0ZS5jZXJ0Jyk7XG5cblxuXG4vLyBFeHBvc2VkIGZvciB1bmluc3RhbGxhdGlvbiBwdXJwb3Nlcy5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMZWdhY3lDb25maWdEaXIoKTogc3RyaW5nIHtcbiAgaWYgKGlzV2luZG93cyAmJiBwcm9jZXNzLmVudi5MT0NBTEFQUERBVEEpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHByb2Nlc3MuZW52LkxPQ0FMQVBQREFUQSwgJ2RldmNlcnQnLCAnY29uZmlnJyk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHVpZCA9IHByb2Nlc3MuZ2V0dWlkICYmIHByb2Nlc3MuZ2V0dWlkKCk7XG4gICAgbGV0IHVzZXJIb21lID0gKGlzTGludXggJiYgdWlkID09PSAwKSA/IHBhdGgucmVzb2x2ZSgnL3Vzci9sb2NhbC9zaGFyZScpIDogcmVxdWlyZSgnb3MnKS5ob21lZGlyKCk7XG4gICAgcmV0dXJuIHBhdGguam9pbih1c2VySG9tZSwgJy5jb25maWcnLCAnZGV2Y2VydCcpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVDb25maWdEaXJzKCkge1xuICBmcy5ta2RpclN5bmMoY29uZmlnRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZnMubWtkaXJTeW5jKGRvbWFpbnNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBmcy5ta2RpclN5bmMocm9vdENBRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbn1cblxuZW5zdXJlQ29uZmlnRGlycygpO1xuIl19