@appium/support 2.55.4 → 2.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/build/lib/env.js +102 -0
  2. package/build/lib/fs.js +74 -56
  3. package/build/lib/image-util.js +2 -4
  4. package/build/lib/index.js +18 -6
  5. package/build/lib/log-internal.js +2 -4
  6. package/build/lib/logger.js +2 -4
  7. package/build/lib/logging.js +2 -4
  8. package/build/lib/mjpeg.js +2 -4
  9. package/build/lib/mkdirp.js +7 -11
  10. package/build/lib/net.js +2 -4
  11. package/build/lib/node.js +99 -2
  12. package/build/lib/npm.js +240 -0
  13. package/build/lib/plist.js +2 -4
  14. package/build/lib/process.js +2 -4
  15. package/build/lib/system.js +2 -4
  16. package/build/lib/tempdir.js +2 -4
  17. package/build/lib/timing.js +2 -4
  18. package/build/lib/util.js +6 -8
  19. package/build/lib/zip.js +4 -8
  20. package/lib/env.js +162 -0
  21. package/lib/fs.js +193 -69
  22. package/lib/index.js +8 -2
  23. package/lib/log-internal.js +2 -2
  24. package/lib/logging.js +1 -1
  25. package/lib/mkdirp.js +3 -6
  26. package/lib/net.js +4 -4
  27. package/lib/node.js +104 -1
  28. package/lib/npm.js +335 -0
  29. package/lib/tempdir.js +6 -6
  30. package/lib/util.js +28 -24
  31. package/lib/zip.js +7 -8
  32. package/package.json +20 -10
  33. package/build/test/assets/sample_binary.plist +0 -0
  34. package/build/test/assets/sample_text.plist +0 -28
  35. package/build/test/fs-specs.js +0 -264
  36. package/build/test/helpers.js +0 -35
  37. package/build/test/image-util-e2e-specs.js +0 -78
  38. package/build/test/index-specs.js +0 -49
  39. package/build/test/log-internals-specs.js +0 -97
  40. package/build/test/logger/helpers.js +0 -71
  41. package/build/test/logger/logger-force-specs.js +0 -41
  42. package/build/test/logger/logger-normal-specs.js +0 -113
  43. package/build/test/logger/logger-test-specs.js +0 -40
  44. package/build/test/mjpeg-e2e-specs.js +0 -96
  45. package/build/test/net-e2e-specs.js +0 -32
  46. package/build/test/node-e2e-specs.js +0 -22
  47. package/build/test/plist-specs.js +0 -54
  48. package/build/test/process-specs.js +0 -104
  49. package/build/test/system-specs.js +0 -136
  50. package/build/test/tempdir-specs.js +0 -86
  51. package/build/test/timing-specs.js +0 -125
  52. package/build/test/util-e2e-specs.js +0 -136
  53. package/build/test/util-specs.js +0 -537
  54. package/build/test/zip-e2e-specs.js +0 -233
@@ -1,28 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
- <plist version="1.0">
4
- <dict>
5
- <key>com.apple.locationd.bundle-/System/Library/PrivateFrameworks/Parsec.framework</key>
6
- <dict>
7
- <key>Whitelisted</key>
8
- <false/>
9
- <key>Executable</key>
10
- <string></string>
11
- <key>BundlePath</key>
12
- <string>/System/Library/PrivateFrameworks/Parsec.framework</string>
13
- <key>Registered</key>
14
- <string></string>
15
- </dict>
16
- <key>com.apple.locationd.bundle-/System/Library/PrivateFrameworks/WirelessDiagnostics.framework</key>
17
- <dict>
18
- <key>Whitelisted</key>
19
- <false/>
20
- <key>Executable</key>
21
- <string></string>
22
- <key>BundlePath</key>
23
- <string>/System/Library/PrivateFrameworks/WirelessDiagnostics.framework</string>
24
- <key>Registered</key>
25
- <string></string>
26
- </dict>
27
- </dict>
28
- </plist>
@@ -1,264 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- require("source-map-support/register");
6
-
7
- var _index = require("../lib/index.js");
8
-
9
- var _path = _interopRequireDefault(require("path"));
10
-
11
- var _teen_process = require("teen_process");
12
-
13
- var _bluebird = _interopRequireDefault(require("bluebird"));
14
-
15
- var _lodash = _interopRequireDefault(require("lodash"));
16
-
17
- const MOCHA_TIMEOUT = 20000;
18
- describe('fs', function () {
19
- this.timeout(MOCHA_TIMEOUT);
20
-
21
- const existingPath = _path.default.resolve(__dirname, 'fs-specs.js');
22
-
23
- it('should have expected methods', function () {
24
- should.exist(_index.fs.open);
25
- should.exist(_index.fs.close);
26
- should.exist(_index.fs.access);
27
- should.exist(_index.fs.mkdir);
28
- should.exist(_index.fs.readlink);
29
- should.exist(_index.fs.exists);
30
- should.exist(_index.fs.rimraf);
31
- should.exist(_index.fs.rimrafSync);
32
- should.exist(_index.fs.readFile);
33
- should.exist(_index.fs.writeFile);
34
- should.exist(_index.fs.lstat);
35
- should.exist(_index.fs.mv);
36
- });
37
- describe('mkdir', function () {
38
- let dirName = _path.default.resolve(__dirname, 'tmp');
39
-
40
- it('should make a directory that does not exist', async function () {
41
- await _index.fs.rimraf(dirName);
42
- await _index.fs.mkdir(dirName);
43
- let exists = await _index.fs.hasAccess(dirName);
44
- exists.should.be.true;
45
- });
46
- it('should not complain if the dir already exists', async function () {
47
- let exists = await _index.fs.hasAccess(dirName);
48
- exists.should.be.true;
49
- await _index.fs.mkdir(dirName);
50
- });
51
- it('should still throw an error if something else goes wrong', async function () {
52
- await _index.fs.mkdir('/bin/foo').should.be.rejected;
53
- });
54
- });
55
- it('hasAccess', async function () {
56
- (await _index.fs.exists(existingPath)).should.be.ok;
57
-
58
- let nonExistingPath = _path.default.resolve(__dirname, 'wrong-specs.js');
59
-
60
- (await _index.fs.hasAccess(nonExistingPath)).should.not.be.ok;
61
- });
62
- it('exists', async function () {
63
- (await _index.fs.exists(existingPath)).should.be.ok;
64
-
65
- let nonExistingPath = _path.default.resolve(__dirname, 'wrong-specs.js');
66
-
67
- (await _index.fs.exists(nonExistingPath)).should.not.be.ok;
68
- });
69
- it('readFile', async function () {
70
- (await _index.fs.readFile(existingPath, 'utf8')).should.contain('readFile');
71
- });
72
- describe('copyFile', function () {
73
- it('should be able to copy a file', async function () {
74
- let newPath = _path.default.resolve(await _index.tempDir.openDir(), 'fs-specs.js');
75
-
76
- await _index.fs.copyFile(existingPath, newPath);
77
- (await _index.fs.readFile(newPath, 'utf8')).should.contain('readFile');
78
- });
79
- it('should throw an error if the source does not exist', async function () {
80
- await _index.fs.copyFile('/sdfsdfsdfsdf', '/tmp/bla').should.eventually.be.rejected;
81
- });
82
- });
83
- it('rimraf', async function () {
84
- let newPath = _path.default.resolve(await _index.tempDir.openDir(), 'fs-specs.js');
85
-
86
- await _index.fs.copyFile(existingPath, newPath);
87
- (await _index.fs.exists(newPath)).should.be.true;
88
- await _index.fs.rimraf(newPath);
89
- (await _index.fs.exists(newPath)).should.be.false;
90
- });
91
- it('sanitizeName', function () {
92
- _index.fs.sanitizeName(':file?.txt', {
93
- replacement: '-'
94
- }).should.eql('-file-.txt');
95
- });
96
- it('rimrafSync', async function () {
97
- let newPath = _path.default.resolve(await _index.tempDir.openDir(), 'fs-specs.js');
98
-
99
- await _index.fs.copyFile(existingPath, newPath);
100
- (await _index.fs.exists(newPath)).should.be.true;
101
-
102
- _index.fs.rimrafSync(newPath);
103
-
104
- (await _index.fs.exists(newPath)).should.be.false;
105
- });
106
- describe('md5', function () {
107
- this.timeout(1200000);
108
- let smallFilePath;
109
- let bigFilePath;
110
- before(async function () {
111
- smallFilePath = existingPath;
112
- bigFilePath = _path.default.resolve(await _index.tempDir.openDir(), 'enormous.txt');
113
- let file = await _index.fs.open(bigFilePath, 'w');
114
- let fileData = '';
115
-
116
- for (let i = 0; i < 4096; i++) {
117
- fileData += '1';
118
- }
119
-
120
- for (let i = 0; i < 40000; i++) {
121
- await _index.fs.write(file, fileData);
122
- }
123
-
124
- await _index.fs.close(file);
125
- });
126
- after(async function () {
127
- await _index.fs.unlink(bigFilePath);
128
- });
129
- it('should calculate hash of correct length', async function () {
130
- (await _index.fs.md5(smallFilePath)).should.have.length(32);
131
- });
132
- it('should be able to run on huge file', async function () {
133
- (await _index.fs.md5(bigFilePath)).should.have.length(32);
134
- });
135
- });
136
- describe('hash', function () {
137
- it('should calculate sha1 hash', async function () {
138
- (await _index.fs.hash(existingPath, 'sha1')).should.have.length(40);
139
- });
140
- it('should calculate md5 hash', async function () {
141
- (await _index.fs.hash(existingPath, 'md5')).should.have.length(32);
142
- });
143
- });
144
- it('stat', async function () {
145
- let stat = await _index.fs.stat(existingPath);
146
- stat.should.have.property('atime');
147
- });
148
- describe('which', function () {
149
- it('should find correct executable', async function () {
150
- let systemNpmPath = (await (0, _teen_process.exec)('which', ['npm'])).stdout.trim();
151
- let npmPath = await _index.fs.which('npm');
152
- npmPath.should.equal(systemNpmPath);
153
- });
154
- it('should fail gracefully', async function () {
155
- await _index.fs.which('something_that_does_not_exist').should.eventually.be.rejected;
156
- });
157
- });
158
- it('glob', async function () {
159
- let glob = '*-specs.js';
160
- let tests = await _index.fs.glob(glob, {
161
- cwd: __dirname
162
- });
163
- tests.should.be.an('array');
164
- tests.should.have.length.above(2);
165
- });
166
- describe('walkDir', function () {
167
- it('walkDir recursive', async function () {
168
- let inCallback = 0;
169
- const filePath = await _index.fs.walkDir(__dirname, true, async item => {
170
- if (item.endsWith('logger/helpers.js')) {
171
- ++inCallback;
172
- await _bluebird.default.delay(500);
173
- --inCallback;
174
- return true;
175
- }
176
- });
177
- inCallback.should.equal(0);
178
- filePath.should.not.be.null;
179
- });
180
- it('should walk all elements recursive', async function () {
181
- let inCallback = 0;
182
- const filePath = await _index.fs.walkDir(__dirname, true, async () => {
183
- ++inCallback;
184
- await _bluebird.default.delay(500);
185
- --inCallback;
186
- });
187
- inCallback.should.equal(0);
188
- _lodash.default.isNil(filePath).should.be.true;
189
- });
190
- it('should throw error through callback', async function () {
191
- let processed = 0;
192
- await chai.expect(_index.fs.walkDir(__dirname, true, () => {
193
- ++processed;
194
- throw 'Callback error';
195
- })).to.be.rejectedWith('Callback error');
196
- processed.should.equal(1);
197
- });
198
- it('should traverse non-recursively', async function () {
199
- const filePath = await _index.fs.walkDir(__dirname, false, item => item.endsWith('logger/helpers.js'));
200
- _lodash.default.isNil(filePath).should.be.true;
201
- });
202
- });
203
- describe('findRoot()', function () {
204
- describe('when not provided an argument', function () {
205
- it('should throw', function () {
206
- (() => _index.fs.findRoot()).should.throw(TypeError);
207
- });
208
- });
209
- describe('when provided a relative path', function () {
210
- it('should throw', function () {
211
- (() => _index.fs.findRoot('./foo')).should.throw(TypeError);
212
- });
213
- });
214
- describe('when provided an empty string', function () {
215
- it('should throw', function () {
216
- (() => _index.fs.findRoot('')).should.throw(TypeError);
217
- });
218
- });
219
- describe('when provided an absolute path', function () {
220
- describe('when the path has a parent `package.json`', function () {
221
- it('should locate the dir with the closest `package.json`', function () {
222
- _index.fs.findRoot(__dirname).should.be.a('string');
223
- });
224
- });
225
- describe('when the path does not have a parent `package.json`', function () {
226
- it('should throw', function () {
227
- (() => _index.fs.findRoot('/')).should.throw(Error);
228
- });
229
- });
230
- });
231
- });
232
- describe('readPackageJsonFrom()', function () {
233
- describe('when not provided an argument', function () {
234
- it('should throw', function () {
235
- (() => _index.fs.readPackageJsonFrom()).should.throw(TypeError, /non-empty, absolute path/);
236
- });
237
- });
238
- describe('when provided a relative path', function () {
239
- it('should throw', function () {
240
- (() => _index.fs.readPackageJsonFrom('./foo')).should.throw(TypeError);
241
- });
242
- });
243
- describe('when provided an empty string', function () {
244
- it('should throw', function () {
245
- (() => _index.fs.readPackageJsonFrom('')).should.throw(TypeError);
246
- });
247
- });
248
- describe('when provided an absolute path', function () {
249
- describe('when the path does not have a parent `package.json`', function () {
250
- it('should throw', function () {
251
- (() => _index.fs.readPackageJsonFrom('/')).should.throw(Error);
252
- });
253
- });
254
- describe('when the path has a parent `package.json`', function () {
255
- it('should read the `package.json` found in the root dir', function () {
256
- _index.fs.readPackageJsonFrom(__dirname).should.be.an('object');
257
- });
258
- });
259
- });
260
- });
261
- });require('source-map-support').install();
262
-
263
-
264
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvZnMtc3BlY3MuanMiXSwibmFtZXMiOlsiTU9DSEFfVElNRU9VVCIsImRlc2NyaWJlIiwidGltZW91dCIsImV4aXN0aW5nUGF0aCIsInBhdGgiLCJyZXNvbHZlIiwiX19kaXJuYW1lIiwiaXQiLCJzaG91bGQiLCJleGlzdCIsImZzIiwib3BlbiIsImNsb3NlIiwiYWNjZXNzIiwibWtkaXIiLCJyZWFkbGluayIsImV4aXN0cyIsInJpbXJhZiIsInJpbXJhZlN5bmMiLCJyZWFkRmlsZSIsIndyaXRlRmlsZSIsImxzdGF0IiwibXYiLCJkaXJOYW1lIiwiaGFzQWNjZXNzIiwiYmUiLCJ0cnVlIiwicmVqZWN0ZWQiLCJvayIsIm5vbkV4aXN0aW5nUGF0aCIsIm5vdCIsImNvbnRhaW4iLCJuZXdQYXRoIiwidGVtcERpciIsIm9wZW5EaXIiLCJjb3B5RmlsZSIsImV2ZW50dWFsbHkiLCJmYWxzZSIsInNhbml0aXplTmFtZSIsInJlcGxhY2VtZW50IiwiZXFsIiwic21hbGxGaWxlUGF0aCIsImJpZ0ZpbGVQYXRoIiwiYmVmb3JlIiwiZmlsZSIsImZpbGVEYXRhIiwiaSIsIndyaXRlIiwiYWZ0ZXIiLCJ1bmxpbmsiLCJtZDUiLCJoYXZlIiwibGVuZ3RoIiwiaGFzaCIsInN0YXQiLCJwcm9wZXJ0eSIsInN5c3RlbU5wbVBhdGgiLCJzdGRvdXQiLCJ0cmltIiwibnBtUGF0aCIsIndoaWNoIiwiZXF1YWwiLCJnbG9iIiwidGVzdHMiLCJjd2QiLCJhbiIsImFib3ZlIiwiaW5DYWxsYmFjayIsImZpbGVQYXRoIiwid2Fsa0RpciIsIml0ZW0iLCJlbmRzV2l0aCIsIkIiLCJkZWxheSIsIm51bGwiLCJfIiwiaXNOaWwiLCJwcm9jZXNzZWQiLCJjaGFpIiwiZXhwZWN0IiwidG8iLCJyZWplY3RlZFdpdGgiLCJmaW5kUm9vdCIsInRocm93IiwiVHlwZUVycm9yIiwiYSIsIkVycm9yIiwicmVhZFBhY2thZ2VKc29uRnJvbSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FB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Qy9FLE1BQXhDLENBQStDMkUsS0FBL0MsQ0FBcURDLFNBQXJEO0FBQ0QsT0FGQyxDQUFGO0FBR0QsS0FKTyxDQUFSO0FBTUFuRixJQUFBQSxRQUFRLENBQUMsK0JBQUQsRUFBa0MsWUFBWTtBQUNwRE0sTUFBQUEsRUFBRSxDQUFDLGNBQUQsRUFBaUIsWUFBWTtBQUM3QixTQUFDLE1BQU1HLFVBQUc2RSxtQkFBSCxDQUF1QixFQUF2QixDQUFQLEVBQW1DL0UsTUFBbkMsQ0FBMEMyRSxLQUExQyxDQUFnREMsU0FBaEQ7QUFDRCxPQUZDLENBQUY7QUFHRCxLQUpPLENBQVI7QUFNQW5GLElBQUFBLFFBQVEsQ0FBQyxnQ0FBRCxFQUFtQyxZQUFZO0FBQ3JEQSxNQUFBQSxRQUFRLENBQUMscURBQUQsRUFBd0QsWUFBWTtBQUMxRU0sUUFBQUEsRUFBRSxDQUFDLGNBQUQsRUFBaUIsWUFBWTtBQUM3QixXQUFDLE1BQU1HLFVBQUc2RSxtQkFBSCxDQUF1QixHQUF2QixDQUFQLEVBQW9DL0UsTUFBcEMsQ0FBMkMyRSxLQUEzQyxDQUFpREcsS0FBakQ7QUFDRCxTQUZDLENBQUY7QUFHRCxPQUpPLENBQVI7QUFNQXJGLE1BQUFBLFFBQVEsQ0FBQywyQ0FBRCxFQUE4QyxZQUFZO0FBQ2hFTSxRQUFBQSxFQUFFLENBQUMsc0RBQUQsRUFBeUQsWUFBWTtBQUNyRUcsb0JBQUc2RSxtQkFBSCxDQUF1QmpGLFNBQXZCLEVBQWtDRSxNQUFsQyxDQUF5Q2lCLEVBQXpDLENBQTRDd0MsRUFBNUMsQ0FBK0MsUUFBL0M7QUFDRCxTQUZDLENBQUY7QUFHRCxPQUpPLENBQVI7QUFLRCxLQVpPLENBQVI7QUFhRCxHQWhDTyxDQUFSO0FBaUNELENBOVBPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcywgdGVtcERpciB9IGZyb20gJy4uL2xpYi9pbmRleC5qcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuXG5jb25zdCBNT0NIQV9USU1FT1VUID0gMjAwMDA7XG5cbmRlc2NyaWJlKCdmcycsIGZ1bmN0aW9uICgpIHtcbiAgdGhpcy50aW1lb3V0KE1PQ0hBX1RJTUVPVVQpO1xuXG4gIGNvbnN0IGV4aXN0aW5nUGF0aCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdmcy1zcGVjcy5qcycpO1xuXG4gIGl0KCdzaG91bGQgaGF2ZSBleHBlY3RlZCBtZXRob2RzJywgZnVuY3Rpb24gKCkge1xuICAgIHNob3VsZC5leGlzdChmcy5vcGVuKTtcbiAgICBzaG91bGQuZXhpc3QoZnMuY2xvc2UpO1xuICAgIHNob3VsZC5leGlzdChmcy5hY2Nlc3MpO1xuICAgIHNob3VsZC5leGlzdChmcy5ta2Rpcik7XG4gICAgc2hvdWxkLmV4aXN0KGZzLnJlYWRsaW5rKTtcbiAgICBzaG91bGQuZXhpc3QoZnMuZXhpc3RzKTtcbiAgICBzaG91bGQuZXhpc3QoZnMucmltcmFmKTtcbiAgICBzaG91bGQuZXhpc3QoZnMucmltcmFmU3luYyk7XG4gICAgc2hvdWxkLmV4aXN0KGZzLnJlYWRGaWxlKTtcbiAgICBzaG91bGQuZXhpc3QoZnMud3JpdGVGaWxlKTtcbiAgICBzaG91bGQuZXhpc3QoZnMubHN0YXQpO1xuICAgIHNob3VsZC5leGlzdChmcy5tdik7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdta2RpcicsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgZGlyTmFtZSA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICd0bXAnKTtcblxuICAgIGl0KCdzaG91bGQgbWFrZSBhIGRpcmVjdG9yeSB0aGF0IGRvZXMgbm90IGV4aXN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKGRpck5hbWUpO1xuICAgICAgYXdhaXQgZnMubWtkaXIoZGlyTmFtZSk7XG4gICAgICBsZXQgZXhpc3RzID0gYXdhaXQgZnMuaGFzQWNjZXNzKGRpck5hbWUpO1xuICAgICAgZXhpc3RzLnNob3VsZC5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgY29tcGxhaW4gaWYgdGhlIGRpciBhbHJlYWR5IGV4aXN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBleGlzdHMgPSBhd2FpdCBmcy5oYXNBY2Nlc3MoZGlyTmFtZSk7XG4gICAgICBleGlzdHMuc2hvdWxkLmJlLnRydWU7XG4gICAgICBhd2FpdCBmcy5ta2RpcihkaXJOYW1lKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3RpbGwgdGhyb3cgYW4gZXJyb3IgaWYgc29tZXRoaW5nIGVsc2UgZ29lcyB3cm9uZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGZzLm1rZGlyKCcvYmluL2ZvbycpLnNob3VsZC5iZS5yZWplY3RlZDtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ2hhc0FjY2VzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAoYXdhaXQgZnMuZXhpc3RzKGV4aXN0aW5nUGF0aCkpLnNob3VsZC5iZS5vaztcbiAgICBsZXQgbm9uRXhpc3RpbmdQYXRoID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ3dyb25nLXNwZWNzLmpzJyk7XG4gICAgKGF3YWl0IGZzLmhhc0FjY2Vzcyhub25FeGlzdGluZ1BhdGgpKS5zaG91bGQubm90LmJlLm9rO1xuICB9KTtcbiAgaXQoJ2V4aXN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAoYXdhaXQgZnMuZXhpc3RzKGV4aXN0aW5nUGF0aCkpLnNob3VsZC5iZS5vaztcbiAgICBsZXQgbm9uRXhpc3RpbmdQYXRoID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ3dyb25nLXNwZWNzLmpzJyk7XG4gICAgKGF3YWl0IGZzLmV4aXN0cyhub25FeGlzdGluZ1BhdGgpKS5zaG91bGQubm90LmJlLm9rO1xuICB9KTtcbiAgaXQoJ3JlYWRGaWxlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIChhd2FpdCBmcy5yZWFkRmlsZShleGlzdGluZ1BhdGgsICd1dGY4JykpLnNob3VsZC5jb250YWluKCdyZWFkRmlsZScpO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29weUZpbGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBiZSBhYmxlIHRvIGNvcHkgYSBmaWxlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IG5ld1BhdGggPSBwYXRoLnJlc29sdmUoYXdhaXQgdGVtcERpci5vcGVuRGlyKCksICdmcy1zcGVjcy5qcycpO1xuICAgICAgYXdhaXQgZnMuY29weUZpbGUoZXhpc3RpbmdQYXRoLCBuZXdQYXRoKTtcbiAgICAgIChhd2FpdCBmcy5yZWFkRmlsZShuZXdQYXRoLCAndXRmOCcpKS5zaG91bGQuY29udGFpbigncmVhZEZpbGUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHNvdXJjZSBkb2VzIG5vdCBleGlzdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGZzLmNvcHlGaWxlKCcvc2Rmc2Rmc2Rmc2RmJywgJy90bXAvYmxhJykuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWQ7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdyaW1yYWYnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IG5ld1BhdGggPSBwYXRoLnJlc29sdmUoYXdhaXQgdGVtcERpci5vcGVuRGlyKCksICdmcy1zcGVjcy5qcycpO1xuICAgIGF3YWl0IGZzLmNvcHlGaWxlKGV4aXN0aW5nUGF0aCwgbmV3UGF0aCk7XG4gICAgKGF3YWl0IGZzLmV4aXN0cyhuZXdQYXRoKSkuc2hvdWxkLmJlLnRydWU7XG4gICAgYXdhaXQgZnMucmltcmFmKG5ld1BhdGgpO1xuICAgIChhd2FpdCBmcy5leGlzdHMobmV3UGF0aCkpLnNob3VsZC5iZS5mYWxzZTtcbiAgfSk7XG4gIGl0KCdzYW5pdGl6ZU5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgZnMuc2FuaXRpemVOYW1lKCc6ZmlsZT8udHh0Jywge1xuICAgICAgcmVwbGFjZW1lbnQ6ICctJyxcbiAgICB9KS5zaG91bGQuZXFsKCctZmlsZS0udHh0Jyk7XG4gIH0pO1xuICBpdCgncmltcmFmU3luYycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgbmV3UGF0aCA9IHBhdGgucmVzb2x2ZShhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKSwgJ2ZzLXNwZWNzLmpzJyk7XG4gICAgYXdhaXQgZnMuY29weUZpbGUoZXhpc3RpbmdQYXRoLCBuZXdQYXRoKTtcbiAgICAoYXdhaXQgZnMuZXhpc3RzKG5ld1BhdGgpKS5zaG91bGQuYmUudHJ1ZTtcbiAgICBmcy5yaW1yYWZTeW5jKG5ld1BhdGgpO1xuICAgIChhd2FpdCBmcy5leGlzdHMobmV3UGF0aCkpLnNob3VsZC5iZS5mYWxzZTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdtZDUnLCBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy50aW1lb3V0KDEyMDAwMDApO1xuICAgIGxldCBzbWFsbEZpbGVQYXRoO1xuICAgIGxldCBiaWdGaWxlUGF0aDtcbiAgICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZ2V0IHRoZSBwYXRoIG9mIGEgc21hbGwgZmlsZSAodGhpcyBzb3VyY2UgZmlsZSlcbiAgICAgIHNtYWxsRmlsZVBhdGggPSBleGlzdGluZ1BhdGg7XG5cbiAgICAgIC8vIGNyZWF0ZSBhIGxhcmdlIGZpbGUgdG8gdGVzdCwgYWJvdXQgMTYzODQwMDAwIGJ5dGVzXG4gICAgICBiaWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKSwgJ2Vub3Jtb3VzLnR4dCcpO1xuICAgICAgbGV0IGZpbGUgPSBhd2FpdCBmcy5vcGVuKGJpZ0ZpbGVQYXRoLCAndycpO1xuICAgICAgbGV0IGZpbGVEYXRhID0gJyc7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQwOTY7IGkrKykge1xuICAgICAgICBmaWxlRGF0YSArPSAnMSc7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQwMDAwOyBpKyspIHtcbiAgICAgICAgYXdhaXQgZnMud3JpdGUoZmlsZSwgZmlsZURhdGEpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZnMuY2xvc2UoZmlsZSk7XG4gICAgfSk7XG4gICAgYWZ0ZXIoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKGJpZ0ZpbGVQYXRoKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSBoYXNoIG9mIGNvcnJlY3QgbGVuZ3RoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgKGF3YWl0IGZzLm1kNShzbWFsbEZpbGVQYXRoKSkuc2hvdWxkLmhhdmUubGVuZ3RoKDMyKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGJlIGFibGUgdG8gcnVuIG9uIGh1Z2UgZmlsZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIChhd2FpdCBmcy5tZDUoYmlnRmlsZVBhdGgpKS5zaG91bGQuaGF2ZS5sZW5ndGgoMzIpO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJ2hhc2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgc2hhMSBoYXNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgKGF3YWl0IGZzLmhhc2goZXhpc3RpbmdQYXRoLCAnc2hhMScpKS5zaG91bGQuaGF2ZS5sZW5ndGgoNDApO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgY2FsY3VsYXRlIG1kNSBoYXNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgKGF3YWl0IGZzLmhhc2goZXhpc3RpbmdQYXRoLCAnbWQ1JykpLnNob3VsZC5oYXZlLmxlbmd0aCgzMik7XG4gICAgfSk7XG4gIH0pO1xuICBpdCgnc3RhdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZXhpc3RpbmdQYXRoKTtcbiAgICBzdGF0LnNob3VsZC5oYXZlLnByb3BlcnR5KCdhdGltZScpO1xuICB9KTtcbiAgZGVzY3JpYmUoJ3doaWNoJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZmluZCBjb3JyZWN0IGV4ZWN1dGFibGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgc3lzdGVtTnBtUGF0aCA9IChhd2FpdCBleGVjKCd3aGljaCcsIFsnbnBtJ10pKS5zdGRvdXQudHJpbSgpO1xuICAgICAgbGV0IG5wbVBhdGggPSBhd2FpdCBmcy53aGljaCgnbnBtJyk7XG4gICAgICBucG1QYXRoLnNob3VsZC5lcXVhbChzeXN0ZW1OcG1QYXRoKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgZ3JhY2VmdWxseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGZzLndoaWNoKCdzb21ldGhpbmdfdGhhdF9kb2VzX25vdF9leGlzdCcpXG4gICAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZDtcbiAgICB9KTtcbiAgfSk7XG4gIGl0KCdnbG9iJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGxldCBnbG9iID0gJyotc3BlY3MuanMnO1xuICAgIGxldCB0ZXN0cyA9IGF3YWl0IGZzLmdsb2IoZ2xvYiwge2N3ZDogX19kaXJuYW1lfSk7XG4gICAgdGVzdHMuc2hvdWxkLmJlLmFuKCdhcnJheScpO1xuICAgIHRlc3RzLnNob3VsZC5oYXZlLmxlbmd0aC5hYm92ZSgyKTtcbiAgfSk7XG4gIGRlc2NyaWJlKCd3YWxrRGlyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCd3YWxrRGlyIHJlY3Vyc2l2ZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBpbkNhbGxiYWNrID0gMDtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gYXdhaXQgZnMud2Fsa0RpcihfX2Rpcm5hbWUsIHRydWUsIGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmVuZHNXaXRoKCdsb2dnZXIvaGVscGVycy5qcycpKSB7XG4gICAgICAgICAgKytpbkNhbGxiYWNrO1xuICAgICAgICAgIC8vIFRoaXMgaXMgdG8gdmVyaWZ5IHByb3BlciBhd2FpdCBmdW5jdGlvbmFsaXR5IG9mIHRoZVxuICAgICAgICAgIC8vIGNhbGxiYWNrIGludm9jYXRpb24gaW5zaWRlIHRoZSBmaWxlIHN5c3RlbSB3YWxrZXJcbiAgICAgICAgICBhd2FpdCBCLmRlbGF5KDUwMCk7XG4gICAgICAgICAgLS1pbkNhbGxiYWNrO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGluQ2FsbGJhY2suc2hvdWxkLmVxdWFsKDApO1xuICAgICAgZmlsZVBhdGguc2hvdWxkLm5vdC5iZS5udWxsO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgd2FsayBhbGwgZWxlbWVudHMgcmVjdXJzaXZlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGluQ2FsbGJhY2sgPSAwO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBhd2FpdCBmcy53YWxrRGlyKF9fZGlybmFtZSwgdHJ1ZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICArK2luQ2FsbGJhY2s7XG4gICAgICAgIGF3YWl0IEIuZGVsYXkoNTAwKTtcbiAgICAgICAgLS1pbkNhbGxiYWNrO1xuXG4gICAgICB9KTtcbiAgICAgIGluQ2FsbGJhY2suc2hvdWxkLmVxdWFsKDApO1xuICAgICAgXy5pc05pbChmaWxlUGF0aCkuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB0aHJvdWdoIGNhbGxiYWNrJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IHByb2Nlc3NlZCA9IDA7XG4gICAgICBhd2FpdCBjaGFpLmV4cGVjdChmcy53YWxrRGlyKF9fZGlybmFtZSwgdHJ1ZSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICsrcHJvY2Vzc2VkO1xuICAgICAgICAgIHRocm93ICdDYWxsYmFjayBlcnJvcic7XG4gICAgICAgIH0pKS50by5iZS5yZWplY3RlZFdpdGgoJ0NhbGxiYWNrIGVycm9yJyk7XG4gICAgICBwcm9jZXNzZWQuc2hvdWxkLmVxdWFsKDEpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdHJhdmVyc2Ugbm9uLXJlY3Vyc2l2ZWx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBhd2FpdCBmcy53YWxrRGlyKF9fZGlybmFtZSwgZmFsc2UsIChpdGVtKSA9PiBpdGVtLmVuZHNXaXRoKCdsb2dnZXIvaGVscGVycy5qcycpKTtcbiAgICAgIF8uaXNOaWwoZmlsZVBhdGgpLnNob3VsZC5iZS50cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmluZFJvb3QoKScsIGZ1bmN0aW9uICgpIHtcbiAgICBkZXNjcmliZSgnd2hlbiBub3QgcHJvdmlkZWQgYW4gYXJndW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHRocm93JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4gZnMuZmluZFJvb3QoKSkuc2hvdWxkLnRocm93KFR5cGVFcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGEgcmVsYXRpdmUgcGF0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgdGhyb3cnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiBmcy5maW5kUm9vdCgnLi9mb28nKSkuc2hvdWxkLnRocm93KFR5cGVFcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgdGhyb3cnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiBmcy5maW5kUm9vdCgnJykpLnNob3VsZC50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnd2hlbiBwcm92aWRlZCBhbiBhYnNvbHV0ZSBwYXRoJywgZnVuY3Rpb24gKCkge1xuICAgICAgZGVzY3JpYmUoJ3doZW4gdGhlIHBhdGggaGFzIGEgcGFyZW50IGBwYWNrYWdlLmpzb25gJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIGxvY2F0ZSB0aGUgZGlyIHdpdGggdGhlIGNsb3Nlc3QgYHBhY2thZ2UuanNvbmAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZnMuZmluZFJvb3QoX19kaXJuYW1lKS5zaG91bGQuYmUuYSgnc3RyaW5nJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCd3aGVuIHRoZSBwYXRoIGRvZXMgbm90IGhhdmUgYSBwYXJlbnQgYHBhY2thZ2UuanNvbmAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgdGhyb3cnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgKCgpID0+IGZzLmZpbmRSb290KCcvJykpLnNob3VsZC50aHJvdyhFcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWFkUGFja2FnZUpzb25Gcm9tKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVzY3JpYmUoJ3doZW4gbm90IHByb3ZpZGVkIGFuIGFyZ3VtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCB0aHJvdycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IGZzLnJlYWRQYWNrYWdlSnNvbkZyb20oKSkuc2hvdWxkLnRocm93KFR5cGVFcnJvciwgL25vbi1lbXB0eSwgYWJzb2x1dGUgcGF0aC8pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnd2hlbiBwcm92aWRlZCBhIHJlbGF0aXZlIHBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHRocm93JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4gZnMucmVhZFBhY2thZ2VKc29uRnJvbSgnLi9mb28nKSkuc2hvdWxkLnRocm93KFR5cGVFcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgdGhyb3cnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiBmcy5yZWFkUGFja2FnZUpzb25Gcm9tKCcnKSkuc2hvdWxkLnRocm93KFR5cGVFcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGFuIGFic29sdXRlIHBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXNjcmliZSgnd2hlbiB0aGUgcGF0aCBkb2VzIG5vdCBoYXZlIGEgcGFyZW50IGBwYWNrYWdlLmpzb25gJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHRocm93JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICgoKSA9PiBmcy5yZWFkUGFja2FnZUpzb25Gcm9tKCcvJykpLnNob3VsZC50aHJvdyhFcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCd3aGVuIHRoZSBwYXRoIGhhcyBhIHBhcmVudCBgcGFja2FnZS5qc29uYCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZWFkIHRoZSBgcGFja2FnZS5qc29uYCBmb3VuZCBpbiB0aGUgcm9vdCBkaXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZnMucmVhZFBhY2thZ2VKc29uRnJvbShfX2Rpcm5hbWUpLnNob3VsZC5iZS5hbignb2JqZWN0Jyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvZnMtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -1,35 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.MockReadWriteStream = void 0;
7
-
8
- require("source-map-support/register");
9
-
10
- var _events = require("events");
11
-
12
- class MockReadWriteStream extends _events.EventEmitter {
13
- resume() {}
14
-
15
- pause() {}
16
-
17
- setEncoding() {}
18
-
19
- flush() {}
20
-
21
- write(msg) {
22
- this.emit('data', msg);
23
- }
24
-
25
- end() {
26
- this.emit('end');
27
- this.emit('finish');
28
- }
29
-
30
- }
31
-
32
- exports.MockReadWriteStream = MockReadWriteStream;require('source-map-support').install();
33
-
34
-
35
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaGVscGVycy5qcyJdLCJuYW1lcyI6WyJNb2NrUmVhZFdyaXRlU3RyZWFtIiwiRXZlbnRFbWl0dGVyIiwicmVzdW1lIiwicGF1c2UiLCJzZXRFbmNvZGluZyIsImZsdXNoIiwid3JpdGUiLCJtc2ciLCJlbWl0IiwiZW5kIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFFQSxNQUFNQSxtQkFBTixTQUFrQ0Msb0JBQWxDLENBQStDO0FBQzdDQyxFQUFBQSxNQUFNLEdBQUksQ0FBRTs7QUFFWkMsRUFBQUEsS0FBSyxHQUFJLENBQUU7O0FBRVhDLEVBQUFBLFdBQVcsR0FBSSxDQUFFOztBQUVqQkMsRUFBQUEsS0FBSyxHQUFJLENBQUU7O0FBRVhDLEVBQUFBLEtBQUssQ0FBRUMsR0FBRixFQUFPO0FBQ1YsU0FBS0MsSUFBTCxDQUFVLE1BQVYsRUFBa0JELEdBQWxCO0FBQ0Q7O0FBRURFLEVBQUFBLEdBQUcsR0FBSTtBQUNMLFNBQUtELElBQUwsQ0FBVSxLQUFWO0FBQ0EsU0FBS0EsSUFBTCxDQUFVLFFBQVY7QUFDRDs7QUFoQjRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcblxuY2xhc3MgTW9ja1JlYWRXcml0ZVN0cmVhbSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHJlc3VtZSAoKSB7fVxuXG4gIHBhdXNlICgpIHt9XG5cbiAgc2V0RW5jb2RpbmcgKCkge31cblxuICBmbHVzaCAoKSB7fVxuXG4gIHdyaXRlIChtc2cpIHtcbiAgICB0aGlzLmVtaXQoJ2RhdGEnLCBtc2cpO1xuICB9XG5cbiAgZW5kICgpIHtcbiAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgIHRoaXMuZW1pdCgnZmluaXNoJyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgTW9ja1JlYWRXcml0ZVN0cmVhbSB9O1xuIl0sImZpbGUiOiJ0ZXN0L2hlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -1,78 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- require("source-map-support/register");
6
-
7
- var _imageUtil = require("../lib/image-util");
8
-
9
- var _path = _interopRequireDefault(require("path"));
10
-
11
- var _lodash = _interopRequireDefault(require("lodash"));
12
-
13
- var _lib = require("../lib");
14
-
15
- const FIXTURES_ROOT = _path.default.resolve(__dirname, '..', '..', 'test', 'images');
16
-
17
- async function getImage(name) {
18
- const imagePath = _path.default.resolve(FIXTURES_ROOT, name);
19
-
20
- return await _lib.fs.readFile(imagePath, 'utf8');
21
- }
22
-
23
- describe('image-util', function () {
24
- describe('cropBase64Image', function () {
25
- let originalImage = null;
26
- before(async function () {
27
- const originalImage64 = await getImage('full-image.b64');
28
- originalImage = await (0, _imageUtil.base64ToImage)(originalImage64);
29
- originalImage.width.should.be.equal(640, 'unexpected width');
30
- originalImage.height.should.be.equal(1136, 'unexpected height');
31
- });
32
- it('should verify that an image is cropped correctly', async function () {
33
- const croppedImage = await (0, _imageUtil.cropImage)(originalImage, {
34
- left: 35,
35
- top: 107,
36
- width: 323,
37
- height: 485
38
- });
39
- croppedImage.width.should.be.equal(323, 'unexpected width');
40
- croppedImage.height.should.be.equal(485, 'unexpected height');
41
- const croppedImageShouldBe = await getImage('cropped-image.b64');
42
- const croppedImage64 = await (0, _imageUtil.imageToBase64)(croppedImage);
43
- croppedImage64.should.be.equal(croppedImageShouldBe);
44
- });
45
- });
46
- describe('Jimp helpers', function () {
47
- it('should get a jimp object using image buffer', async function () {
48
- const base64Image = await getImage('cropped-image.b64');
49
- const imageBuffer = Buffer.from(base64Image, 'base64');
50
- const jimpImg = await (0, _imageUtil.getJimpImage)(imageBuffer);
51
- jimpImg.hash().should.eql('80000000000');
52
- jimpImg.bitmap.height.should.eql(485);
53
- jimpImg.bitmap.width.should.eql(323);
54
- });
55
- it('should get a jimp object using b64 string', async function () {
56
- const base64Image = await getImage('cropped-image.b64');
57
- const jimpImg = await (0, _imageUtil.getJimpImage)(base64Image);
58
- jimpImg.hash().should.eql('80000000000');
59
- jimpImg.bitmap.height.should.eql(485);
60
- jimpImg.bitmap.width.should.eql(323);
61
- });
62
- it('should error with incorrect data type', async function () {
63
- await (0, _imageUtil.getJimpImage)(1234).should.eventually.be.rejectedWith(/string or buffer/);
64
- });
65
- it('should error with incorrect image data', async function () {
66
- await (0, _imageUtil.getJimpImage)('foo').should.eventually.be.rejectedWith(/Could not find MIME for Buffer/);
67
- });
68
- it('should get an image buffer via the overridden getBuffer method', async function () {
69
- const base64Image = await getImage('cropped-image.b64');
70
- const jimpImg = await (0, _imageUtil.getJimpImage)(base64Image);
71
- const buf = await jimpImg.getBuffer(_imageUtil.MIME_PNG);
72
- _lodash.default.isBuffer(buf).should.be.true;
73
- });
74
- });
75
- });require('source-map-support').install();
76
-
77
-
78
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaW1hZ2UtdXRpbC1lMmUtc3BlY3MuanMiXSwibmFtZXMiOlsiRklYVFVSRVNfUk9PVCIsInBhdGgiLCJyZXNvbHZlIiwiX19kaXJuYW1lIiwiZ2V0SW1hZ2UiLCJuYW1lIiwiaW1hZ2VQYXRoIiwiZnMiLCJyZWFkRmlsZSIsImRlc2NyaWJlIiwib3JpZ2luYWxJbWFnZSIsImJlZm9yZSIsIm9yaWdpbmFsSW1hZ2U2NCIsIndpZHRoIiwic2hvdWxkIiwiYmUiLCJlcXVhbCIsImhlaWdodCIsIml0IiwiY3JvcHBlZEltYWdlIiwibGVmdCIsInRvcCIsImNyb3BwZWRJbWFnZVNob3VsZEJlIiwiY3JvcHBlZEltYWdlNjQiLCJiYXNlNjRJbWFnZSIsImltYWdlQnVmZmVyIiwiQnVmZmVyIiwiZnJvbSIsImppbXBJbWciLCJoYXNoIiwiZXFsIiwiYml0bWFwIiwiZXZlbnR1YWxseSIsInJlamVjdGVkV2l0aCIsImJ1ZiIsImdldEJ1ZmZlciIsIk1JTUVfUE5HIiwiXyIsImlzQnVmZmVyIiwidHJ1ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBSUE7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsYUFBYSxHQUFHQyxjQUFLQyxPQUFMLENBQWFDLFNBQWIsRUFBd0IsSUFBeEIsRUFBOEIsSUFBOUIsRUFBb0MsTUFBcEMsRUFBNEMsUUFBNUMsQ0FBdEI7O0FBRUEsZUFBZUMsUUFBZixDQUF5QkMsSUFBekIsRUFBK0I7QUFDN0IsUUFBTUMsU0FBUyxHQUFHTCxjQUFLQyxPQUFMLENBQWFGLGFBQWIsRUFBNEJLLElBQTVCLENBQWxCOztBQUNBLFNBQU8sTUFBTUUsUUFBR0MsUUFBSCxDQUFZRixTQUFaLEVBQXVCLE1BQXZCLENBQWI7QUFDRDs7QUFFREcsUUFBUSxDQUFDLFlBQUQsRUFBZSxZQUFZO0FBRWpDQSxFQUFBQSxRQUFRLENBQUMsaUJBQUQsRUFBb0IsWUFBWTtBQUN0QyxRQUFJQyxhQUFhLEdBQUcsSUFBcEI7QUFFQUMsSUFBQUEsTUFBTSxDQUFD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NkJBQWEsSUFBYixFQUFtQkosTUFBbkIsQ0FBMEJrQixVQUExQixDQUFxQ2pCLEVBQXJDLENBQXdDa0IsWUFBeEMsQ0FBcUQsa0JBQXJELENBQU47QUFDRCxLQUZDLENBQUY7QUFHQWYsSUFBQUEsRUFBRSxDQUFDLHdDQUFELEVBQTJDLGtCQUFrQjtBQUM3RCxZQUFNLDZCQUFhLEtBQWIsRUFBb0JKLE1BQXBCLENBQTJCa0IsVUFBM0IsQ0FBc0NqQixFQUF0QyxDQUF5Q2tCLFlBQXpDLENBQXNELGdDQUF0RCxDQUFOO0FBQ0QsS0FGQyxDQUFGO0FBR0FmLElBQUFBLEVBQUUsQ0FBQyxnRUFBRCxFQUFtRSxrQkFBa0I7QUFDckYsWUFBTU0sV0FBVyxHQUFHLE1BQU1wQixRQUFRLENBQUMsbUJBQUQsQ0FBbEM7QUFDQSxZQUFNd0IsT0FBTyxHQUFHLE1BQU0sNkJBQWFKLFdBQWIsQ0FBdEI7QUFDQSxZQUFNVSxHQUFHLEdBQUcsTUFBTU4sT0FBTyxDQUFDTyxTQUFSLENBQWtCQyxtQkFBbEIsQ0FBbEI7QUFDQUMsc0JBQUVDLFFBQUYsQ0FBV0osR0FBWCxFQUFnQnBCLE1BQWhCLENBQXVCQyxFQUF2QixDQUEwQndCLElBQTFCO0FBQ0QsS0FMQyxDQUFGO0FBTUQsR0E1Qk8sQ0FBUjtBQTZCRCxDQXpETyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYmFzZTY0VG9JbWFnZSwgaW1hZ2VUb0Jhc2U2NCwgY3JvcEltYWdlLFxuICBnZXRKaW1wSW1hZ2UsIE1JTUVfUE5HLFxufSBmcm9tICcuLi9saWIvaW1hZ2UtdXRpbCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBmcyB9IGZyb20gJy4uL2xpYic7XG5cblxuY29uc3QgRklYVFVSRVNfUk9PVCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLicsICcuLicsICd0ZXN0JywgJ2ltYWdlcycpO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRJbWFnZSAobmFtZSkge1xuICBjb25zdCBpbWFnZVBhdGggPSBwYXRoLnJlc29sdmUoRklYVFVSRVNfUk9PVCwgbmFtZSk7XG4gIHJldHVybiBhd2FpdCBmcy5yZWFkRmlsZShpbWFnZVBhdGgsICd1dGY4Jyk7XG59XG5cbmRlc2NyaWJlKCdpbWFnZS11dGlsJywgZnVuY3Rpb24gKCkge1xuXG4gIGRlc2NyaWJlKCdjcm9wQmFzZTY0SW1hZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IG9yaWdpbmFsSW1hZ2UgPSBudWxsO1xuXG4gICAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSW1hZ2U2NCA9IGF3YWl0IGdldEltYWdlKCdmdWxsLWltYWdlLmI2NCcpO1xuICAgICAgb3JpZ2luYWxJbWFnZSA9IGF3YWl0IGJhc2U2NFRvSW1hZ2Uob3JpZ2luYWxJbWFnZTY0KTtcblxuICAgICAgLy8gdmVyaWZ5IG9yaWdpbmFsIGltYWdlIHNpemUsIHRvIGJlIHN1cmUgdGhhdCBvcmlnaW5hbCBpbWFnZSBpcyBjb3JyZWN0XG4gICAgICBvcmlnaW5hbEltYWdlLndpZHRoLnNob3VsZC5iZS5lcXVhbCg2NDAsICd1bmV4cGVjdGVkIHdpZHRoJyk7XG4gICAgICBvcmlnaW5hbEltYWdlLmhlaWdodC5zaG91bGQuYmUuZXF1YWwoMTEzNiwgJ3VuZXhwZWN0ZWQgaGVpZ2h0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSB0aGF0IGFuIGltYWdlIGlzIGNyb3BwZWQgY29ycmVjdGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY3JvcHBlZEltYWdlID0gYXdhaXQgY3JvcEltYWdlKG9yaWdpbmFsSW1hZ2UsIHtsZWZ0OiAzNSwgdG9wOiAxMDcsIHdpZHRoOiAzMjMsIGhlaWdodDogNDg1fSk7XG5cbiAgICAgIC8vIHZlcmlmeSBjcm9wcGVkIGltYWdlIHNpemUsIGl0IHNob3VsZCBiZSBsZXNzIHRoYW4gb3JpZ2luYWwgaW1hZ2UgYWNjb3JkaW5nIHRvIGNyb3AgcmVnaW9uXG4gICAgICBjcm9wcGVkSW1hZ2Uud2lkdGguc2hvdWxkLmJlLmVxdWFsKDMyMywgJ3VuZXhwZWN0ZWQgd2lkdGgnKTtcbiAgICAgIGNyb3BwZWRJbWFnZS5oZWlnaHQuc2hvdWxkLmJlLmVxdWFsKDQ4NSwgJ3VuZXhwZWN0ZWQgaGVpZ2h0Jyk7XG5cbiAgICAgIC8vIHZlcmlmeSB0aGF0IGltYWdlIGNyb3BwZWQsIGNvbXBhcmUgYmFzZTY0IHJlcHJlc2VudGF0aW9uXG4gICAgICBjb25zdCBjcm9wcGVkSW1hZ2VTaG91bGRCZSA9IGF3YWl0IGdldEltYWdlKCdjcm9wcGVkLWltYWdlLmI2NCcpO1xuICAgICAgY29uc3QgY3JvcHBlZEltYWdlNjQgPSBhd2FpdCBpbWFnZVRvQmFzZTY0KGNyb3BwZWRJbWFnZSk7XG4gICAgICBjcm9wcGVkSW1hZ2U2NC5zaG91bGQuYmUuZXF1YWwoY3JvcHBlZEltYWdlU2hvdWxkQmUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnSmltcCBoZWxwZXJzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZ2V0IGEgamltcCBvYmplY3QgdXNpbmcgaW1hZ2UgYnVmZmVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYmFzZTY0SW1hZ2UgPSBhd2FpdCBnZXRJbWFnZSgnY3JvcHBlZC1pbWFnZS5iNjQnKTtcbiAgICAgIGNvbnN0IGltYWdlQnVmZmVyID0gQnVmZmVyLmZyb20oYmFzZTY0SW1hZ2UsICdiYXNlNjQnKTtcbiAgICAgIGNvbnN0IGppbXBJbWcgPSBhd2FpdCBnZXRKaW1wSW1hZ2UoaW1hZ2VCdWZmZXIpO1xuICAgICAgamltcEltZy5oYXNoKCkuc2hvdWxkLmVxbCgnODAwMDAwMDAwMDAnKTtcbiAgICAgIGppbXBJbWcuYml0bWFwLmhlaWdodC5zaG91bGQuZXFsKDQ4NSk7XG4gICAgICBqaW1wSW1nLmJpdG1hcC53aWR0aC5zaG91bGQuZXFsKDMyMyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBnZXQgYSBqaW1wIG9iamVjdCB1c2luZyBiNjQgc3RyaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYmFzZTY0SW1hZ2UgPSBhd2FpdCBnZXRJbWFnZSgnY3JvcHBlZC1pbWFnZS5iNjQnKTtcbiAgICAgIGNvbnN0IGppbXBJbWcgPSBhd2FpdCBnZXRKaW1wSW1hZ2UoYmFzZTY0SW1hZ2UpO1xuICAgICAgamltcEltZy5oYXNoKCkuc2hvdWxkLmVxbCgnODAwMDAwMDAwMDAnKTtcbiAgICAgIGppbXBJbWcuYml0bWFwLmhlaWdodC5zaG91bGQuZXFsKDQ4NSk7XG4gICAgICBqaW1wSW1nLmJpdG1hcC53aWR0aC5zaG91bGQuZXFsKDMyMyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBlcnJvciB3aXRoIGluY29ycmVjdCBkYXRhIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBnZXRKaW1wSW1hZ2UoMTIzNCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9zdHJpbmcgb3IgYnVmZmVyLyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBlcnJvciB3aXRoIGluY29ycmVjdCBpbWFnZSBkYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZ2V0SmltcEltYWdlKCdmb28nKS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoL0NvdWxkIG5vdCBmaW5kIE1JTUUgZm9yIEJ1ZmZlci8pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZ2V0IGFuIGltYWdlIGJ1ZmZlciB2aWEgdGhlIG92ZXJyaWRkZW4gZ2V0QnVmZmVyIG1ldGhvZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJhc2U2NEltYWdlID0gYXdhaXQgZ2V0SW1hZ2UoJ2Nyb3BwZWQtaW1hZ2UuYjY0Jyk7XG4gICAgICBjb25zdCBqaW1wSW1nID0gYXdhaXQgZ2V0SmltcEltYWdlKGJhc2U2NEltYWdlKTtcbiAgICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IGppbXBJbWcuZ2V0QnVmZmVyKE1JTUVfUE5HKTtcbiAgICAgIF8uaXNCdWZmZXIoYnVmKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJmaWxlIjoidGVzdC9pbWFnZS11dGlsLWUyZS1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
@@ -1,49 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- require("source-map-support/register");
6
-
7
- var _index = _interopRequireDefault(require("../lib/index.js"));
8
-
9
- let {
10
- system,
11
- tempDir,
12
- util
13
- } = _index.default;
14
- describe('index', function () {
15
- describe('default', function () {
16
- it('should expose an object', function () {
17
- _index.default.should.exist;
18
-
19
- _index.default.should.be.an.instanceof(Object);
20
- });
21
- it('should expose system object', function () {
22
- _index.default.system.should.exist;
23
-
24
- _index.default.system.should.be.an.instanceof(Object);
25
- });
26
- it('should expose tempDir object', function () {
27
- _index.default.tempDir.should.exist;
28
-
29
- _index.default.tempDir.should.be.an.instanceof(Object);
30
- });
31
- it('should expose util object', function () {
32
- _index.default.util.should.exist;
33
-
34
- _index.default.util.should.be.an.instanceof(Object);
35
- });
36
- });
37
- it('should expose an object as "system" ', function () {
38
- system.should.be.an.instanceof(Object);
39
- });
40
- it('should expose an object as "tempDir" ', function () {
41
- tempDir.should.be.an.instanceof(Object);
42
- });
43
- it('should expose an object as "util" ', function () {
44
- util.should.be.an.instanceof(Object);
45
- });
46
- });require('source-map-support').install();
47
-
48
-
49
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaW5kZXgtc3BlY3MuanMiXSwibmFtZXMiOlsic3lzdGVtIiwidGVtcERpciIsInV0aWwiLCJBcHBpdW1TdXBwb3J0IiwiZGVzY3JpYmUiLCJpdCIsInNob3VsZCIsImV4aXN0IiwiYmUiLCJhbiIsImluc3RhbmNlb2YiLCJPYmplY3QiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBOztBQUVBLElBQUk7QUFBRUEsRUFBQUEsTUFBRjtBQUFVQyxFQUFBQSxPQUFWO0FBQW1CQyxFQUFBQTtBQUFuQixJQUE0QkMsY0FBaEM7QUFFQUMsUUFBUSxDQUFDLE9BQUQsRUFBVSxZQUFZO0FBQzVCQSxFQUFBQSxRQUFRLENBQUMsU0FBRCxFQUFZLFlBQVk7QUFDOUJDLElBQUFBLEVBQUUsQ0FBQyx5QkFBRCxFQUE0QixZQUFZO0FBQ3hDRixxQkFBY0csTUFBZCxDQUFxQkMsS0FBckI7O0FBQ0FKLHFCQUFjRyxNQUFkLENBQXFCRSxFQUFyQixDQUF3QkMsRUFBeEIsQ0FBMkJDLFVBQTNCLENBQXNDQyxNQUF0QztBQUNELEtBSEMsQ0FBRjtBQUlBTixJQUFBQSxFQUFFLENBQUMsNkJBQUQsRUFBZ0MsWUFBWTtBQUM1Q0YscUJBQWNILE1BQWQsQ0FBcUJNLE1BQXJCLENBQTRCQyxLQUE1Qjs7QUFDQUoscUJBQWNILE1BQWQsQ0FBcUJNLE1BQXJCLENBQTRCRSxFQUE1QixDQUErQkMsRUFBL0IsQ0FBa0NDLFVBQWxDLENBQTZDQyxNQUE3QztBQUNELEtBSEMsQ0FBRjtBQUlBTixJQUFBQSxFQUFFLENBQUMsOEJBQUQsRUFBaUMsWUFBWTtBQUM3Q0YscUJBQWNGLE9BQWQsQ0FBc0JLLE1BQXRCLENBQTZCQyxLQUE3Qjs7QUFDQUoscUJBQWNGLE9BQWQsQ0FBc0JLLE1BQXRCLENBQTZCRSxFQUE3QixDQUFnQ0MsRUFBaEMsQ0FBbUNDLFVBQW5DLENBQThDQyxNQUE5QztBQUNELEtBSEMsQ0FBRjtBQUlBTixJQUFBQSxFQUFFLENBQUMsMkJBQUQsRUFBOEIsWUFBWTtBQUMxQ0YscUJBQWNELElBQWQsQ0FBbUJJLE1BQW5CLENBQTBCQyxLQUExQjs7QUFDQUoscUJBQWNELElBQWQsQ0FBbUJJLE1BQW5CLENBQTBCRSxFQUExQixDQUE2QkMsRUFBN0IsQ0FBZ0NDLFVBQWhDLENBQTJDQyxNQUEzQztBQUNELEtBSEMsQ0FBRjtBQUlELEdBakJPLENBQVI7QUFtQkFOLEVBQUFBLEVBQUUsQ0FBQyxzQ0FBRCxFQUF5QyxZQUFZO0FBQ3JETCxJQUFBQSxNQUFNLENBQUNNLE1BQVAsQ0FBY0UsRUFBZCxDQUFpQkMsRUFBakIsQ0FBb0JDLFVBQXBCLENBQStCQyxNQUEvQjtBQUNELEdBRkMsQ0FBRjtBQUlBTixFQUFBQSxFQUFFLENBQUMsdUNBQUQsRUFBMEMsWUFBWTtBQUN0REosSUFBQUEsT0FBTyxDQUFDSyxNQUFSLENBQWVFLEVBQWYsQ0FBa0JDLEVBQWxCLENBQXFCQyxVQUFyQixDQUFnQ0MsTUFBaEM7QUFDRCxHQUZDLENBQUY7QUFJQU4sRUFBQUEsRUFBRSxDQUFDLG9DQUFELEVBQXVDLFlBQVk7QUFDbkRILElBQUFBLElBQUksQ0FBQ0ksTUFBTCxDQUFZRSxFQUFaLENBQWVDLEVBQWYsQ0FBa0JDLFVBQWxCLENBQTZCQyxNQUE3QjtBQUNELEdBRkMsQ0FBRjtBQUdELENBL0JPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBBcHBpdW1TdXBwb3J0IGZyb20gJy4uL2xpYi9pbmRleC5qcyc7XG5cbmxldCB7IHN5c3RlbSwgdGVtcERpciwgdXRpbCB9ID0gQXBwaXVtU3VwcG9ydDtcblxuZGVzY3JpYmUoJ2luZGV4JywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnZGVmYXVsdCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGV4cG9zZSBhbiBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBBcHBpdW1TdXBwb3J0LnNob3VsZC5leGlzdDtcbiAgICAgIEFwcGl1bVN1cHBvcnQuc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoT2JqZWN0KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGV4cG9zZSBzeXN0ZW0gb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgQXBwaXVtU3VwcG9ydC5zeXN0ZW0uc2hvdWxkLmV4aXN0O1xuICAgICAgQXBwaXVtU3VwcG9ydC5zeXN0ZW0uc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoT2JqZWN0KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGV4cG9zZSB0ZW1wRGlyIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIEFwcGl1bVN1cHBvcnQudGVtcERpci5zaG91bGQuZXhpc3Q7XG4gICAgICBBcHBpdW1TdXBwb3J0LnRlbXBEaXIuc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoT2JqZWN0KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGV4cG9zZSB1dGlsIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIEFwcGl1bVN1cHBvcnQudXRpbC5zaG91bGQuZXhpc3Q7XG4gICAgICBBcHBpdW1TdXBwb3J0LnV0aWwuc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoT2JqZWN0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBleHBvc2UgYW4gb2JqZWN0IGFzIFwic3lzdGVtXCIgJywgZnVuY3Rpb24gKCkge1xuICAgIHN5c3RlbS5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihPYmplY3QpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGV4cG9zZSBhbiBvYmplY3QgYXMgXCJ0ZW1wRGlyXCIgJywgZnVuY3Rpb24gKCkge1xuICAgIHRlbXBEaXIuc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoT2JqZWN0KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBleHBvc2UgYW4gb2JqZWN0IGFzIFwidXRpbFwiICcsIGZ1bmN0aW9uICgpIHtcbiAgICB1dGlsLnNob3VsZC5iZS5hbi5pbnN0YW5jZW9mKE9iamVjdCk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvaW5kZXgtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -1,97 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- require("source-map-support/register");
6
-
7
- var _index = require("../lib/index");
8
-
9
- var _os = _interopRequireDefault(require("os"));
10
-
11
- var _path = _interopRequireDefault(require("path"));
12
-
13
- var _logInternal = require("../lib/log-internal");
14
-
15
- const CONFIG_PATH = _path.default.resolve(_os.default.tmpdir(), 'rules.json');
16
-
17
- describe('Log Internals', function () {
18
- let preprocessor;
19
- beforeEach(function () {
20
- preprocessor = new _logInternal.SecureValuesPreprocessor();
21
- });
22
- it('should preprocess a string and make replacements', async function () {
23
- const issues = await preprocessor.loadRules(['yolo']);
24
- issues.length.should.eql(0);
25
- preprocessor.rules.length.should.eql(1);
26
- const replacer = preprocessor.rules[0].replacer;
27
- preprocessor.preprocess(':yolo" yo Yolo yyolo').should.eql(`:${replacer}" yo Yolo yyolo`);
28
- });
29
- it('should preprocess a string and make replacements with multiple simple rules', async function () {
30
- const issues = await preprocessor.loadRules(['yolo', 'yo']);
31
- issues.length.should.eql(0);
32
- preprocessor.rules.length.should.eql(2);
33
- const replacer = preprocessor.rules[0].replacer;
34
- preprocessor.preprocess(':yolo" yo Yolo yyolo').should.eql(`:${replacer}" ${replacer} Yolo yyolo`);
35
- });
36
- it('should preprocess a string and make replacements with multiple complex rules', async function () {
37
- const replacer2 = '***';
38
- const issues = await preprocessor.loadRules([{
39
- text: 'yolo',
40
- flags: 'i'
41
- }, {
42
- pattern: '^:',
43
- replacer: replacer2
44
- }]);
45
- issues.length.should.eql(0);
46
- preprocessor.rules.length.should.eql(2);
47
- const replacer = preprocessor.rules[0].replacer;
48
- preprocessor.preprocess(':yolo" yo Yolo yyolo').should.eql(`${replacer2}${replacer}" yo ${replacer} yyolo`);
49
- });
50
- it(`should preprocess a string and apply a rule where 'pattern' has priority over 'text'`, async function () {
51
- const replacer = '***';
52
- const issues = await preprocessor.loadRules([{
53
- pattern: '^:',
54
- text: 'yo',
55
- replacer
56
- }]);
57
- issues.length.should.eql(0);
58
- preprocessor.rules.length.should.eql(1);
59
- preprocessor.preprocess(':yolo" yo Yolo yyolo').should.eql(`${replacer}yolo" yo Yolo yyolo`);
60
- });
61
- it('should preprocess a string and make replacements with multiple complex rules and issues', async function () {
62
- const replacer2 = '***';
63
- const issues = await preprocessor.loadRules([{
64
- text: 'yolo',
65
- flags: 'i'
66
- }, {
67
- pattern: '^:(',
68
- replacer: replacer2
69
- }]);
70
- issues.length.should.eql(1);
71
- preprocessor.rules.length.should.eql(1);
72
- const replacer = preprocessor.rules[0].replacer;
73
- preprocessor.preprocess(':yolo" yo Yolo yyolo').should.eql(`:${replacer}" yo ${replacer} yyolo`);
74
- });
75
- it('should leave the string unchanged if all rules have issues', async function () {
76
- const replacer2 = '***';
77
- const issues = await preprocessor.loadRules([null, {
78
- flags: 'i'
79
- }, {
80
- pattern: '^:(',
81
- replacer: replacer2
82
- }]);
83
- issues.length.should.eql(3);
84
- preprocessor.rules.length.should.eql(0);
85
- preprocessor.preprocess(':yolo" yo Yolo yyolo').should.eql(':yolo" yo Yolo yyolo');
86
- });
87
- it('should fail if rules cannot be accessed', async function () {
88
- await preprocessor.loadRules('bla').should.eventually.be.rejected;
89
- });
90
- it('should fail if rules JSON cannot be parsed', async function () {
91
- await _index.fs.writeFile(CONFIG_PATH, 'blabla', 'utf8');
92
- await preprocessor.loadRules(CONFIG_PATH).should.eventually.be.rejected;
93
- });
94
- });require('source-map-support').install();
95
-
96
-
97
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvbG9nLWludGVybmFscy1zcGVjcy5qcyJdLCJuYW1lcyI6WyJDT05GSUdfUEFUSCIsInBhdGgiLCJyZXNvbHZlIiwib3MiLCJ0bXBkaXIiLCJkZXNjcmliZSIsInByZXByb2Nlc3NvciIsImJlZm9yZUVhY2giLCJTZWN1cmVWYWx1ZXNQcmVwcm9jZXNzb3IiLCJpdCIsImlzc3VlcyIsImxvYWRSdWxlcyIsImxlbmd0aCIsInNob3VsZCIsImVxbCIsInJ1bGVzIiwicmVwbGFjZXIiLCJwcmVwcm9jZXNzIiwicmVwbGFjZXIyIiwidGV4dCIsImZsYWdzIiwicGF0dGVybiIsImV2ZW50dWFsbHkiLCJiZSIsInJlamVjdGVkIiwiZnMiLCJ3cml0ZUZpbGUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLFdBQVcsR0FBR0MsY0FBS0MsT0FBTCxDQUFhQyxZQUFHQyxNQUFILEVBQWIsRUFBMEIsWUFBMUIsQ0FBcEI7O0FBS0FDLFFBQVEsQ0FBQyxlQUFELEVBQWtCLFlBQVk7QUFDcEMsTUFBSUMsWUFBSjtBQUVBQyxFQUFBQSxVQUFVLENBQUMsWUFBWTtBQUNyQkQsSUFBQUEsWUFBWSxHQUFHLElBQUlFLHFDQUFKLEVBQWY7QUFDRCxHQUZTLENBQVY7QUFJQUMsRUFBQUEsRUFBRSxDQUFDLGtEQUFELEVBQXFELGtCQUFrQjtBQUN2RSxVQUFNQyxNQUFNLEdBQUcsTUFBTUosWUFBWSxDQUFDSyxTQUFiLENBQXVCLENBQzFDLE1BRDBDLENBQXZCLENBQXJCO0FBR0FELElBQUFBLE1BQU0sQ0FBQ0UsTUFBUCxDQUFjQyxNQUFkLENBQXFCQyxHQUFyQixDQUF5QixDQUF6QjtBQUNBUixJQUFBQSxZQUFZLENBQUNTLEtBQWIsQ0FBbUJILE1BQW5CLENBQTBCQyxNQUExQixDQUFpQ0MsR0FBakMsQ0FBcUMsQ0FBckM7QUFDQSxVQUFNRSxRQUFRLEdBQUdWLFlBQVksQ0FBQ1MsS0FBYixDQUFtQixDQUFuQixFQUFz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QyxDQUFGO0FBWUFMLEVBQUFBLEVBQUUsQ0FBQyx5Q0FBRCxFQUE0QyxrQkFBa0I7QUFDOUQsVUFBTUgsWUFBWSxDQUFDSyxTQUFiLENBQXVCLEtBQXZCLEVBQThCRSxNQUE5QixDQUFxQ1MsVUFBckMsQ0FBZ0RDLEVBQWhELENBQW1EQyxRQUF6RDtBQUNELEdBRkMsQ0FBRjtBQUlBZixFQUFBQSxFQUFFLENBQUMsNENBQUQsRUFBK0Msa0JBQWtCO0FBQ2pFLFVBQU1nQixVQUFHQyxTQUFILENBQWExQixXQUFiLEVBQTBCLFFBQTFCLEVBQW9DLE1BQXBDLENBQU47QUFDQSxVQUFNTSxZQUFZLENBQUNLLFNBQWIsQ0FBdUJYLFdBQXZCLEVBQW9DYSxNQUFwQyxDQUEyQ1MsVUFBM0MsQ0FBc0RDLEVBQXRELENBQXlEQyxRQUEvRDtBQUNELEdBSEMsQ0FBRjtBQUlELENBbEZPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcyB9IGZyb20gJy4uL2xpYi9pbmRleCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBTZWN1cmVWYWx1ZXNQcmVwcm9jZXNzb3IgfSBmcm9tICcuLi9saWIvbG9nLWludGVybmFsJztcblxuXG5jb25zdCBDT05GSUdfUEFUSCA9IHBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSwgJ3J1bGVzLmpzb24nKTtcblxuXG5cblxuZGVzY3JpYmUoJ0xvZyBJbnRlcm5hbHMnLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBwcmVwcm9jZXNzb3I7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgcHJlcHJvY2Vzc29yID0gbmV3IFNlY3VyZVZhbHVlc1ByZXByb2Nlc3NvcigpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHByZXByb2Nlc3MgYSBzdHJpbmcgYW5kIG1ha2UgcmVwbGFjZW1lbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGlzc3VlcyA9IGF3YWl0IHByZXByb2Nlc3Nvci5sb2FkUnVsZXMoW1xuICAgICAgJ3lvbG8nLFxuICAgIF0pO1xuICAgIGlzc3Vlcy5sZW5ndGguc2hvdWxkLmVxbCgwKTtcbiAgICBwcmVwcm9jZXNzb3IucnVsZXMubGVuZ3RoLnNob3VsZC5lcWwoMSk7XG4gICAgY29uc3QgcmVwbGFjZXIgPSBwcmVwcm9jZXNzb3IucnVsZXNbMF0ucmVwbGFjZXI7XG4gICAgcHJlcHJvY2Vzc29yLnByZXByb2Nlc3MoJzp5b2xvXCIgeW8gWW9sbyB5eW9sbycpLnNob3VsZC5lcWwoYDoke3JlcGxhY2VyfVwiIHlvIFlvbG8geXlvbG9gKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBwcmVwcm9jZXNzIGEgc3RyaW5nIGFuZCBtYWtlIHJlcGxhY2VtZW50cyB3aXRoIG11bHRpcGxlIHNpbXBsZSBydWxlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBpc3N1ZXMgPSBhd2FpdCBwcmVwcm9jZXNzb3IubG9hZFJ1bGVzKFtcbiAgICAgICd5b2xvJyxcbiAgICAgICd5bycsXG4gICAgXSk7XG4gICAgaXNzdWVzLmxlbmd0aC5zaG91bGQuZXFsKDApO1xuICAgIHByZXByb2Nlc3Nvci5ydWxlcy5sZW5ndGguc2hvdWxkLmVxbCgyKTtcbiAgICBjb25zdCByZXBsYWNlciA9IHByZXByb2Nlc3Nvci5ydWxlc1swXS5yZXBsYWNlcjtcbiAgICBwcmVwcm9jZXNzb3IucHJlcHJvY2VzcygnOnlvbG9cIiB5byBZb2xvIHl5b2xvJykuc2hvdWxkLmVxbChgOiR7cmVwbGFjZXJ9XCIgJHtyZXBsYWNlcn0gWW9sbyB5eW9sb2ApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHByZXByb2Nlc3MgYSBzdHJpbmcgYW5kIG1ha2UgcmVwbGFjZW1lbnRzIHdpdGggbXVsdGlwbGUgY29tcGxleCBydWxlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCByZXBsYWNlcjIgPSAnKioqJztcbiAgICBjb25zdCBpc3N1ZXMgPSBhd2FpdCBwcmVwcm9jZXNzb3IubG9hZFJ1bGVzKFtcbiAgICAgIHsgdGV4dDogJ3lvbG8nLCBmbGFnczogJ2knIH0sXG4gICAgICB7IHBhdHRlcm46ICdeOicsIHJlcGxhY2VyOiByZXBsYWNlcjIgfSxcbiAgICBdKTtcbiAgICBpc3N1ZXMubGVuZ3RoLnNob3VsZC5lcWwoMCk7XG4gICAgcHJlcHJvY2Vzc29yLnJ1bGVzLmxlbmd0aC5zaG91bGQuZXFsKDIpO1xuICAgIGNvbnN0IHJlcGxhY2VyID0gcHJlcHJvY2Vzc29yLnJ1bGVzWzBdLnJlcGxhY2VyO1xuICAgIHByZXByb2Nlc3Nvci5wcmVwcm9jZXNzKCc6eW9sb1wiIHlvIFlvbG8geXlvbG8nKS5zaG91bGQuZXFsKGAke3JlcGxhY2VyMn0ke3JlcGxhY2VyfVwiIHlvICR7cmVwbGFjZXJ9IHl5b2xvYCk7XG4gIH0pO1xuXG4gIGl0KGBzaG91bGQgcHJlcHJvY2VzcyBhIHN0cmluZyBhbmQgYXBwbHkgYSBydWxlIHdoZXJlICdwYXR0ZXJuJyBoYXMgcHJpb3JpdHkgb3ZlciAndGV4dCdgLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcmVwbGFjZXIgPSAnKioqJztcbiAgICBjb25zdCBpc3N1ZXMgPSBhd2FpdCBwcmVwcm9jZXNzb3IubG9hZFJ1bGVzKFtcbiAgICAgIHsgcGF0dGVybjogJ146JywgdGV4dDogJ3lvJywgcmVwbGFjZXIgfSxcbiAgICBdKTtcbiAgICBpc3N1ZXMubGVuZ3RoLnNob3VsZC5lcWwoMCk7XG4gICAgcHJlcHJvY2Vzc29yLnJ1bGVzLmxlbmd0aC5zaG91bGQuZXFsKDEpO1xuICAgIHByZXByb2Nlc3Nvci5wcmVwcm9jZXNzKCc6eW9sb1wiIHlvIFlvbG8geXlvbG8nKS5zaG91bGQuZXFsKGAke3JlcGxhY2VyfXlvbG9cIiB5byBZb2xvIHl5b2xvYCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcHJlcHJvY2VzcyBhIHN0cmluZyBhbmQgbWFrZSByZXBsYWNlbWVudHMgd2l0aCBtdWx0aXBsZSBjb21wbGV4IHJ1bGVzIGFuZCBpc3N1ZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcmVwbGFjZXIyID0gJyoqKic7XG4gICAgY29uc3QgaXNzdWVzID0gYXdhaXQgcHJlcHJvY2Vzc29yLmxvYWRSdWxlcyhbXG4gICAgICB7IHRleHQ6ICd5b2xvJywgZmxhZ3M6ICdpJyB9LFxuICAgICAgeyBwYXR0ZXJuOiAnXjooJywgcmVwbGFjZXI6IHJlcGxhY2VyMiB9LFxuICAgIF0pO1xuICAgIGlzc3Vlcy5sZW5ndGguc2hvdWxkLmVxbCgxKTtcbiAgICBwcmVwcm9jZXNzb3IucnVsZXMubGVuZ3RoLnNob3VsZC5lcWwoMSk7XG4gICAgY29uc3QgcmVwbGFjZXIgPSBwcmVwcm9jZXNzb3IucnVsZXNbMF0ucmVwbGFjZXI7XG4gICAgcHJlcHJvY2Vzc29yLnByZXByb2Nlc3MoJzp5b2xvXCIgeW8gWW9sbyB5eW9sbycpLnNob3VsZC5lcWwoYDoke3JlcGxhY2VyfVwiIHlvICR7cmVwbGFjZXJ9IHl5b2xvYCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbGVhdmUgdGhlIHN0cmluZyB1bmNoYW5nZWQgaWYgYWxsIHJ1bGVzIGhhdmUgaXNzdWVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHJlcGxhY2VyMiA9ICcqKionO1xuICAgIGNvbnN0IGlzc3VlcyA9IGF3YWl0IHByZXByb2Nlc3Nvci5sb2FkUnVsZXMoW1xuICAgICAgbnVsbCxcbiAgICAgIHsgZmxhZ3M6ICdpJyB9LFxuICAgICAgeyBwYXR0ZXJuOiAnXjooJywgcmVwbGFjZXI6IHJlcGxhY2VyMiB9LFxuICAgIF0pO1xuICAgIGlzc3Vlcy5sZW5ndGguc2hvdWxkLmVxbCgzKTtcbiAgICBwcmVwcm9jZXNzb3IucnVsZXMubGVuZ3RoLnNob3VsZC5lcWwoMCk7XG4gICAgcHJlcHJvY2Vzc29yLnByZXByb2Nlc3MoJzp5b2xvXCIgeW8gWW9sbyB5eW9sbycpLnNob3VsZC5lcWwoJzp5b2xvXCIgeW8gWW9sbyB5eW9sbycpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgaWYgcnVsZXMgY2Fubm90IGJlIGFjY2Vzc2VkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IHByZXByb2Nlc3Nvci5sb2FkUnVsZXMoJ2JsYScpLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgaWYgcnVsZXMgSlNPTiBjYW5ub3QgYmUgcGFyc2VkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShDT05GSUdfUEFUSCwgJ2JsYWJsYScsICd1dGY4Jyk7XG4gICAgYXdhaXQgcHJlcHJvY2Vzc29yLmxvYWRSdWxlcyhDT05GSUdfUEFUSCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWQ7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvbG9nLWludGVybmFscy1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9