appium-ios-device 2.4.4 → 2.4.6

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 (73) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/build/index.js +1 -12
  3. package/build/lib/afc/index.js +1 -83
  4. package/build/lib/afc/index.js.map +1 -0
  5. package/build/lib/afc/protocol.js +1 -11
  6. package/build/lib/afc/protocol.js.map +1 -0
  7. package/build/lib/afc/streams.js +1 -22
  8. package/build/lib/afc/streams.js.map +1 -0
  9. package/build/lib/afc/transformer/afcdecoder.js +1 -14
  10. package/build/lib/afc/transformer/afcdecoder.js.map +1 -0
  11. package/build/lib/afc/transformer/afcencoder.js +1 -13
  12. package/build/lib/afc/transformer/afcencoder.js.map +1 -0
  13. package/build/lib/base-service.js +1 -9
  14. package/build/lib/base-service.js.map +1 -0
  15. package/build/lib/constants.js +1 -3
  16. package/build/lib/constants.js.map +1 -0
  17. package/build/lib/house-arrest/index.js +1 -32
  18. package/build/lib/house-arrest/index.js.map +1 -0
  19. package/build/lib/installation-proxy/index.js +1 -32
  20. package/build/lib/installation-proxy/index.js.map +1 -0
  21. package/build/lib/instrument/headers.js +1 -46
  22. package/build/lib/instrument/headers.js.map +1 -0
  23. package/build/lib/instrument/index.js +1 -31
  24. package/build/lib/instrument/index.js.map +1 -0
  25. package/build/lib/instrument/transformer/dtx-decode.js +1 -27
  26. package/build/lib/instrument/transformer/dtx-decode.js.map +1 -0
  27. package/build/lib/instrument/transformer/dtx-encode.js +1 -12
  28. package/build/lib/instrument/transformer/dtx-encode.js.map +1 -0
  29. package/build/lib/instrument/transformer/nskeyed.js +1 -86
  30. package/build/lib/instrument/transformer/nskeyed.js.map +1 -0
  31. package/build/lib/lockdown/index.js +1 -14
  32. package/build/lib/lockdown/index.js.map +1 -0
  33. package/build/lib/logger.js +1 -5
  34. package/build/lib/logger.js.map +1 -0
  35. package/build/lib/mcinstall/index.js +1 -13
  36. package/build/lib/mcinstall/index.js.map +1 -0
  37. package/build/lib/notification-proxy/index.js +1 -31
  38. package/build/lib/notification-proxy/index.js.map +1 -0
  39. package/build/lib/plist-service/index.js +1 -33
  40. package/build/lib/plist-service/index.js.map +1 -0
  41. package/build/lib/plist-service/transformer/plist-service-decoder.js +1 -17
  42. package/build/lib/plist-service/transformer/plist-service-decoder.js.map +1 -0
  43. package/build/lib/plist-service/transformer/plist-service-encoder.js +1 -12
  44. package/build/lib/plist-service/transformer/plist-service-encoder.js.map +1 -0
  45. package/build/lib/services.js +1 -33
  46. package/build/lib/services.js.map +1 -0
  47. package/build/lib/simulatelocation/index.js +1 -12
  48. package/build/lib/simulatelocation/index.js.map +1 -0
  49. package/build/lib/ssl-helper.js +1 -11
  50. package/build/lib/ssl-helper.js.map +1 -0
  51. package/build/lib/syslog/index.js +1 -13
  52. package/build/lib/syslog/index.js.map +1 -0
  53. package/build/lib/syslog/transformer/syslog-decoder.js +1 -26
  54. package/build/lib/syslog/transformer/syslog-decoder.js.map +1 -0
  55. package/build/lib/usbmux/index.js +1 -52
  56. package/build/lib/usbmux/index.js.map +1 -0
  57. package/build/lib/usbmux/transformer/usbmux-decoder.js +1 -12
  58. package/build/lib/usbmux/transformer/usbmux-decoder.js.map +1 -0
  59. package/build/lib/usbmux/transformer/usbmux-encoder.js +1 -12
  60. package/build/lib/usbmux/transformer/usbmux-encoder.js.map +1 -0
  61. package/build/lib/util/transformer/length-based-splitter.js +1 -30
  62. package/build/lib/util/transformer/length-based-splitter.js.map +1 -0
  63. package/build/lib/util/transformer/stream-logger.js +2 -18
  64. package/build/lib/util/transformer/stream-logger.js.map +1 -0
  65. package/build/lib/utilities.js +1 -28
  66. package/build/lib/utilities.js.map +1 -0
  67. package/build/lib/webinspector/index.js +5 -32
  68. package/build/lib/webinspector/index.js.map +1 -0
  69. package/build/lib/webinspector/transformer/webinspector-decoder.js +1 -16
  70. package/build/lib/webinspector/transformer/webinspector-decoder.js.map +1 -0
  71. package/build/lib/webinspector/transformer/webinspector-encoder.js +1 -15
  72. package/build/lib/webinspector/transformer/webinspector-encoder.js.map +1 -0
  73. package/package.json +5 -3
package/CHANGELOG.md ADDED
@@ -0,0 +1 @@
1
+ ## [2.4.6](https://github.com/appium/appium-ios-device/compare/v2.4.5...v2.4.6) (2022-11-06)
package/build/index.js CHANGED
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
@@ -18,25 +17,15 @@ Object.defineProperty(exports, "Usbmux", {
18
17
  }
19
18
  });
20
19
  exports.utilities = exports.services = exports.default = void 0;
21
-
22
20
  require("source-map-support/register");
23
-
24
21
  var _usbmux = _interopRequireDefault(require("./lib/usbmux"));
25
-
26
22
  var utilities = _interopRequireWildcard(require("./lib/utilities"));
27
-
28
23
  exports.utilities = utilities;
29
-
30
24
  var services = _interopRequireWildcard(require("./lib/services"));
31
-
32
25
  exports.services = services;
33
-
34
26
  var _instrument = require("./lib/instrument");
35
-
36
27
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
37
-
38
28
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
39
-
40
29
  var _default = _usbmux.default;
41
30
  exports.default = _default;
42
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJVc2JtdXgiXSwic291cmNlcyI6WyIuLi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWZhdWx0IGFzIFVzYm11eCB9IGZyb20gJy4vbGliL3VzYm11eCc7XG5pbXBvcnQgKiBhcyB1dGlsaXRpZXMgZnJvbSAnLi9saWIvdXRpbGl0aWVzJztcbmltcG9ydCAqIGFzIHNlcnZpY2VzIGZyb20gJy4vbGliL3NlcnZpY2VzJztcbmltcG9ydCB7IElOU1RSVU1FTlRfQ0hBTk5FTCB9IGZyb20gJy4vbGliL2luc3RydW1lbnQnO1xuXG5cbmV4cG9ydCB7IFVzYm11eCwgdXRpbGl0aWVzLCBzZXJ2aWNlcywgSU5TVFJVTUVOVF9DSEFOTkVMIH07XG5leHBvcnQgZGVmYXVsdCBVc2JtdXg7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7ZUFJZUEsZSJ9
31
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJVc2JtdXgiXSwic291cmNlcyI6WyIuLi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWZhdWx0IGFzIFVzYm11eCB9IGZyb20gJy4vbGliL3VzYm11eCc7XG5pbXBvcnQgKiBhcyB1dGlsaXRpZXMgZnJvbSAnLi9saWIvdXRpbGl0aWVzJztcbmltcG9ydCAqIGFzIHNlcnZpY2VzIGZyb20gJy4vbGliL3NlcnZpY2VzJztcbmltcG9ydCB7IElOU1RSVU1FTlRfQ0hBTk5FTCB9IGZyb20gJy4vbGliL2luc3RydW1lbnQnO1xuXG5cbmV4cG9ydCB7IFVzYm11eCwgdXRpbGl0aWVzLCBzZXJ2aWNlcywgSU5TVFJVTUVOVF9DSEFOTkVMIH07XG5leHBvcnQgZGVmYXVsdCBVc2JtdXg7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUE2QztBQUM3QztBQUEyQztBQUMzQztBQUFzRDtBQUFBO0FBQUEsZUFJdkNBLGVBQU07QUFBQSJ9
@@ -1,40 +1,26 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = exports.AfcService = exports.AFC_SERVICE_NAME = void 0;
9
-
10
8
  require("source-map-support/register");
11
-
12
9
  var _lengthBasedSplitter = _interopRequireDefault(require("../util/transformer/length-based-splitter"));
13
-
14
10
  var _protocol = require("./protocol");
15
-
16
11
  var _streams = require("./streams");
17
-
18
12
  var _afcencoder = _interopRequireDefault(require("./transformer/afcencoder"));
19
-
20
13
  var _afcdecoder = _interopRequireDefault(require("./transformer/afcdecoder"));
21
-
22
14
  var _constants = require("../constants");
23
-
24
15
  var _bluebird = _interopRequireDefault(require("bluebird"));
25
-
26
16
  var _path = _interopRequireDefault(require("path"));
27
-
28
17
  var _lodash = _interopRequireDefault(require("lodash"));
29
-
30
18
  var _baseService = require("../base-service");
31
-
32
19
  const AFC_SERVICE_NAME = 'com.apple.afc';
33
20
  exports.AFC_SERVICE_NAME = AFC_SERVICE_NAME;
34
21
  const MAX_FRAME_SIZE = 1 * _constants.MB;
35
22
  const NULL_DELIMITER_CODE = 0x00;
36
23
  const IGNORED_PATHS = ['.', '..'];
37
-
38
24
  class AfcService extends _baseService.BaseServiceSocket {
39
25
  constructor(socketClient) {
40
26
  super(socketClient);
@@ -47,21 +33,14 @@ class AfcService extends _baseService.BaseServiceSocket {
47
33
  lengthAdjustment: -8
48
34
  });
49
35
  this._decoder = new _afcdecoder.default();
50
-
51
36
  this._socketClient.pipe(this._splitter).pipe(this._decoder);
52
-
53
37
  this._encoder = new _afcencoder.default();
54
-
55
38
  this._encoder.pipe(this._socketClient);
56
-
57
39
  this._assignClientFailureHandlers(this._encoder);
58
-
59
40
  this._responseCallbacks = {};
60
41
  this._packetNumber = 0;
61
-
62
42
  this._decoder.on('data', this._handleData.bind(this));
63
43
  }
64
-
65
44
  _handleData(data) {
66
45
  const cb = this._responseCallbacks[data.packetNumber] || _lodash.default.noop;
67
46
  cb(data);
@@ -72,17 +51,13 @@ class AfcService extends _baseService.BaseServiceSocket {
72
51
  packetNumber,
73
52
  response
74
53
  } = this._createPacketPromise(`Create directory '${path}'`);
75
-
76
54
  const data = {
77
55
  opCode: _protocol.Operations.MAKE_DIR,
78
56
  packetNumber,
79
57
  headerPayload: Buffer.from(path)
80
58
  };
81
-
82
59
  this._encoder.write(data);
83
-
84
60
  const res = await response;
85
-
86
61
  this._checkStatus(res);
87
62
  }
88
63
 
@@ -91,17 +66,13 @@ class AfcService extends _baseService.BaseServiceSocket {
91
66
  packetNumber,
92
67
  response
93
68
  } = this._createPacketPromise(`Delete directory '${path}'`);
94
-
95
69
  const data = {
96
70
  opCode: _protocol.Operations.REMOVE_PATH_AND_CONTENTS,
97
71
  packetNumber,
98
72
  headerPayload: Buffer.from(path)
99
73
  };
100
-
101
74
  this._encoder.write(data);
102
-
103
75
  const res = await response;
104
-
105
76
  this._checkStatus(res);
106
77
  }
107
78
 
@@ -110,21 +81,16 @@ class AfcService extends _baseService.BaseServiceSocket {
110
81
  packetNumber,
111
82
  response
112
83
  } = this._createPacketPromise(`List directory '${path}'`);
113
-
114
84
  const data = {
115
85
  opCode: _protocol.Operations.READ_DIR,
116
86
  packetNumber,
117
87
  headerPayload: Buffer.from(path)
118
88
  };
119
-
120
89
  this._encoder.write(data);
121
-
122
90
  const res = await response;
123
-
124
91
  if (res.opCode !== _protocol.Operations.DATA) {
125
92
  this._checkStatus(res);
126
93
  }
127
-
128
94
  return this._parseArray(res.content);
129
95
  }
130
96
 
@@ -133,7 +99,6 @@ class AfcService extends _baseService.BaseServiceSocket {
133
99
  packetNumber,
134
100
  response
135
101
  } = this._createPacketPromise(`Open file '${path}'`);
136
-
137
102
  const pathPayload = Buffer.from(path);
138
103
  const fileModePayload = Buffer.alloc(8);
139
104
  fileModePayload.writeUInt32LE(mode, 0);
@@ -142,15 +107,11 @@ class AfcService extends _baseService.BaseServiceSocket {
142
107
  packetNumber,
143
108
  headerPayload: Buffer.concat([fileModePayload, pathPayload])
144
109
  };
145
-
146
110
  this._encoder.write(data);
147
-
148
111
  const res = await response;
149
-
150
112
  if (res.opCode !== _protocol.Operations.FILE_OPEN_RES) {
151
113
  this._checkStatus(res);
152
114
  }
153
-
154
115
  return res.headerPayload.readUInt32LE(0);
155
116
  }
156
117
 
@@ -169,7 +130,6 @@ class AfcService extends _baseService.BaseServiceSocket {
169
130
  packetNumber,
170
131
  response
171
132
  } = this._createPacketPromise(`Close file handle '${fileHandle}'`);
172
-
173
133
  const fileModePayload = Buffer.alloc(8);
174
134
  fileModePayload.writeUInt32LE(fileHandle, 0);
175
135
  const data = {
@@ -177,11 +137,8 @@ class AfcService extends _baseService.BaseServiceSocket {
177
137
  packetNumber,
178
138
  headerPayload: fileModePayload
179
139
  };
180
-
181
140
  this._encoder.write(data);
182
-
183
141
  const res = await response;
184
-
185
142
  this._checkStatus(res);
186
143
  }
187
144
 
@@ -190,7 +147,6 @@ class AfcService extends _baseService.BaseServiceSocket {
190
147
  packetNumber,
191
148
  response
192
149
  } = this._createPacketPromise(`Write to file handle '${fileHandle}'`);
193
-
194
150
  const headerPayload = Buffer.alloc(8);
195
151
  headerPayload.writeUInt32LE(fileHandle, 0);
196
152
  const data = {
@@ -199,11 +155,8 @@ class AfcService extends _baseService.BaseServiceSocket {
199
155
  headerPayload,
200
156
  content: buffer
201
157
  };
202
-
203
158
  this._encoder.write(data);
204
-
205
159
  const res = await response;
206
-
207
160
  this._checkStatus(res);
208
161
  }
209
162
 
@@ -212,7 +165,6 @@ class AfcService extends _baseService.BaseServiceSocket {
212
165
  packetNumber,
213
166
  response
214
167
  } = this._createPacketPromise(`Read from file handle '${fileHandle}'`);
215
-
216
168
  const headerPayload = Buffer.alloc(16);
217
169
  headerPayload.writeUInt32LE(fileHandle, 0);
218
170
  headerPayload.writeUInt32LE(length, 8);
@@ -221,15 +173,11 @@ class AfcService extends _baseService.BaseServiceSocket {
221
173
  packetNumber,
222
174
  headerPayload
223
175
  };
224
-
225
176
  this._encoder.write(data);
226
-
227
177
  const res = await response;
228
-
229
178
  if (res.opCode !== _protocol.Operations.DATA) {
230
179
  this._checkStatus(res);
231
180
  }
232
-
233
181
  return res.content;
234
182
  }
235
183
 
@@ -238,21 +186,16 @@ class AfcService extends _baseService.BaseServiceSocket {
238
186
  packetNumber,
239
187
  response
240
188
  } = this._createPacketPromise(`Get file info '${path}'`);
241
-
242
189
  const data = {
243
190
  opCode: _protocol.Operations.GET_FILE_INFO,
244
191
  packetNumber,
245
192
  headerPayload: Buffer.from(path)
246
193
  };
247
-
248
194
  this._encoder.write(data);
249
-
250
195
  const res = await response;
251
-
252
196
  if (res.opCode !== _protocol.Operations.DATA) {
253
197
  this._checkStatus(res);
254
198
  }
255
-
256
199
  return new FileInfo(this._parseObject(res.content));
257
200
  }
258
201
 
@@ -261,79 +204,61 @@ class AfcService extends _baseService.BaseServiceSocket {
261
204
  if (IGNORED_PATHS.includes(file)) {
262
205
  continue;
263
206
  }
264
-
265
207
  const relativePath = _path.default.posix.join(dir, file);
266
-
267
208
  const fileInfo = await this.getFileInfo(relativePath);
268
209
  const isDirectory = fileInfo.isDirectory();
269
210
  await onPath(relativePath, isDirectory);
270
-
271
211
  if (isDirectory && recursive) {
272
212
  await this.walkDir(relativePath, recursive, onPath);
273
213
  }
274
214
  }
275
215
  }
276
-
277
216
  _checkStatus(res) {
278
217
  if (res.opCode !== _protocol.Operations.STATUS) {
279
218
  throw new Error(`Unexpected response ${(0, _protocol.operationCode)(res.opCode)}`);
280
219
  }
281
-
282
220
  if (_lodash.default.isEmpty(res.headerPayload)) {
283
221
  throw new Error('Header payload cannot be empty for a status response');
284
222
  }
285
-
286
223
  if (res.headerPayload[0] !== _protocol.Errors.SUCCESS) {
287
224
  throw new Error(`Unexpected response ${(0, _protocol.errorCode)(res.headerPayload[0])}`);
288
225
  }
289
226
  }
290
-
291
227
  _parseArray(buffer) {
292
228
  const items = [];
293
229
  let start = 0;
294
-
295
230
  for (let end = 0; end < buffer.length; end++) {
296
231
  if (buffer[end] !== NULL_DELIMITER_CODE) {
297
232
  continue;
298
233
  }
299
-
300
234
  const item = buffer.toString('utf8', start, end);
301
235
  items.push(item);
302
236
  start = end + 1;
303
237
  }
304
-
305
238
  return items;
306
239
  }
307
-
308
240
  _parseObject(buffer) {
309
241
  const items = {};
310
242
  let start = 0;
311
243
  let currentKey;
312
-
313
244
  for (let end = 0; end < buffer.length; end++) {
314
245
  if (buffer[end] !== NULL_DELIMITER_CODE) {
315
246
  continue;
316
247
  }
317
-
318
248
  const item = buffer.toString('utf8', start, end);
319
-
320
249
  if (_lodash.default.isNil(currentKey)) {
321
250
  currentKey = item;
322
251
  } else {
323
252
  items[currentKey] = item;
324
253
  currentKey = null;
325
254
  }
326
-
327
255
  start = end + 1;
328
256
  }
329
-
330
257
  if (currentKey) {
331
258
  throw new Error(`Failed to parse correctly ${buffer}. Please investigate`);
332
259
  }
333
-
334
260
  return items;
335
261
  }
336
-
337
262
  _createPacketPromise(message, timeout = 10000) {
338
263
  const packetNumber = this._packetNumber++;
339
264
  const response = new _bluebird.default((resolve, reject) => {
@@ -347,11 +272,8 @@ class AfcService extends _baseService.BaseServiceSocket {
347
272
  response
348
273
  };
349
274
  }
350
-
351
275
  }
352
-
353
276
  exports.AfcService = AfcService;
354
-
355
277
  class FileInfo {
356
278
  constructor({
357
279
  st_size,
@@ -368,17 +290,13 @@ class FileInfo {
368
290
  this.mtimeMs = parseInt(st_mtime, 10) / 1000000;
369
291
  this.birthtimeMs = parseInt(st_birthtime, 10) / 1000000;
370
292
  }
371
-
372
293
  isDirectory() {
373
294
  return this.ifmt === 'S_IFDIR';
374
295
  }
375
-
376
296
  isFile() {
377
297
  return this.ifmt === 'S_IFREG';
378
298
  }
379
-
380
299
  }
381
-
382
300
  var _default = AfcService;
383
301
  exports.default = _default;
384
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBRkNfU0VSVklDRV9OQU1FIiwiTUFYX0ZSQU1FX1NJWkUiLCJNQiIsIk5VTExfREVMSU1JVEVSX0NPREUiLCJJR05PUkVEX1BBVEhTIiwiQWZjU2VydmljZSIsIkJhc2VTZXJ2aWNlU29ja2V0IiwiY29uc3RydWN0b3IiLCJzb2NrZXRDbGllbnQiLCJfc3BsaXR0ZXIiLCJMZW5ndGhCYXNlZFNwbGl0dGVyIiwicmVhZGFibGVTdHJlYW0iLCJsaXR0bGVFbmRpYW4iLCJtYXhGcmFtZUxlbmd0aCIsImxlbmd0aEZpZWxkT2Zmc2V0IiwibGVuZ3RoRmllbGRMZW5ndGgiLCJsZW5ndGhBZGp1c3RtZW50IiwiX2RlY29kZXIiLCJBZmNEZWNvZGVyIiwiX3NvY2tldENsaWVudCIsInBpcGUiLCJfZW5jb2RlciIsIkFmY0VuY29kZXIiLCJfYXNzaWduQ2xpZW50RmFpbHVyZUhhbmRsZXJzIiwiX3Jlc3BvbnNlQ2FsbGJhY2tzIiwiX3BhY2tldE51bWJlciIsIm9uIiwiX2hhbmRsZURhdGEiLCJiaW5kIiwiZGF0YSIsImNiIiwicGFja2V0TnVtYmVyIiwiXyIsIm5vb3AiLCJjcmVhdGVEaXJlY3RvcnkiLCJwYXRoIiwicmVzcG9uc2UiLCJfY3JlYXRlUGFja2V0UHJvbWlzZSIsIm9wQ29kZSIsIk9wZXJhdGlvbnMiLCJNQUtFX0RJUiIsImhlYWRlclBheWxvYWQiLCJCdWZmZXIiLCJmcm9tIiwid3JpdGUiLCJyZXMiLCJfY2hlY2tTdGF0dXMiLCJkZWxldGVEaXJlY3RvcnkiLCJSRU1PVkVfUEFUSF9BTkRfQ09OVEVOVFMiLCJsaXN0RGlyZWN0b3J5IiwiUkVBRF9ESVIiLCJEQVRBIiwiX3BhcnNlQXJyYXkiLCJjb250ZW50Iiwib3BlbkZpbGUiLCJtb2RlIiwicGF0aFBheWxvYWQiLCJmaWxlTW9kZVBheWxvYWQiLCJhbGxvYyIsIndyaXRlVUludDMyTEUiLCJGSUxFX09QRU4iLCJjb25jYXQiLCJGSUxFX09QRU5fUkVTIiwicmVhZFVJbnQzMkxFIiwiY3JlYXRlV3JpdGVTdHJlYW0iLCJmaWxlUGF0aCIsIm9wdHMiLCJmaWxlSGFuZGxlIiwiRmlsZU1vZGVzIiwidyIsIkFmY1dyaXRhYmxlRmlsZVN0cmVhbSIsImNyZWF0ZVJlYWRTdHJlYW0iLCJvcHRpb25zIiwiciIsIkFmY1JlYWRhYmxlRmlsZVN0cmVhbSIsImNsb3NlRmlsZUhhbmRsZSIsIkZJTEVfQ0xPU0UiLCJ3cml0ZUZpbGUiLCJidWZmZXIiLCJGSUxFX1dSSVRFIiwicmVhZEZpbGUiLCJsZW5ndGgiLCJGSUxFX1JFQUQiLCJnZXRGaWxlSW5mbyIsIkdFVF9GSUxFX0lORk8iLCJGaWxlSW5mbyIsIl9wYXJzZU9iamVjdCIsIndhbGtEaXIiLCJkaXIiLCJyZWN1cnNpdmUiLCJvblBhdGgiLCJmaWxlIiwiaW5jbHVkZXMiLCJyZWxhdGl2ZVBhdGgiLCJwb3NpeCIsImpvaW4iLCJmaWxlSW5mbyIsImlzRGlyZWN0b3J5IiwiU1RBVFVTIiwiRXJyb3IiLCJvcGVyYXRpb25Db2RlIiwiaXNFbXB0eSIsIkVycm9ycyIsIlNVQ0NFU1MiLCJlcnJvckNvZGUiLCJpdGVtcyIsInN0YXJ0IiwiZW5kIiwiaXRlbSIsInRvU3RyaW5nIiwicHVzaCIsImN1cnJlbnRLZXkiLCJpc05pbCIsIm1lc3NhZ2UiLCJ0aW1lb3V0IiwiQiIsInJlc29sdmUiLCJyZWplY3QiLCJzZXRUaW1lb3V0Iiwic3Rfc2l6ZSIsInN0X2Jsb2NrcyIsInN0X25saW5rIiwic3RfaWZtdCIsInN0X210aW1lIiwic3RfYmlydGh0aW1lIiwic2l6ZSIsInBhcnNlSW50IiwiYmxvY2tzIiwibmxpbmsiLCJpZm10IiwibXRpbWVNcyIsImJpcnRodGltZU1zIiwiaXNGaWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2FmYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBMZW5ndGhCYXNlZFNwbGl0dGVyIGZyb20gJy4uL3V0aWwvdHJhbnNmb3JtZXIvbGVuZ3RoLWJhc2VkLXNwbGl0dGVyJztcbmltcG9ydCB7IE9wZXJhdGlvbnMsIG9wZXJhdGlvbkNvZGUsIEVycm9ycywgZXJyb3JDb2RlLCBGaWxlTW9kZXMgfSBmcm9tICcuL3Byb3RvY29sJztcbmltcG9ydCB7IEFmY1dyaXRhYmxlRmlsZVN0cmVhbSwgQWZjUmVhZGFibGVGaWxlU3RyZWFtIH0gZnJvbSAnLi9zdHJlYW1zJztcbmltcG9ydCBBZmNFbmNvZGVyIGZyb20gJy4vdHJhbnNmb3JtZXIvYWZjZW5jb2Rlcic7XG5pbXBvcnQgQWZjRGVjb2RlciBmcm9tICcuL3RyYW5zZm9ybWVyL2FmY2RlY29kZXInO1xuaW1wb3J0IHsgTUIgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQmFzZVNlcnZpY2VTb2NrZXQgfSBmcm9tICcuLi9iYXNlLXNlcnZpY2UnO1xuXG5cbmNvbnN0IEFGQ19TRVJWSUNFX05BTUUgPSAnY29tLmFwcGxlLmFmYyc7XG5jb25zdCBNQVhfRlJBTUVfU0laRSA9IDEgKiBNQjtcblxuY29uc3QgTlVMTF9ERUxJTUlURVJfQ09ERSA9IDB4MDA7XG5jb25zdCBJR05PUkVEX1BBVEhTID0gWycuJywgJy4uJ107XG5cbmNsYXNzIEFmY1NlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZVNvY2tldCB7XG4gIGNvbnN0cnVjdG9yIChzb2NrZXRDbGllbnQpIHtcbiAgICBzdXBlcihzb2NrZXRDbGllbnQpO1xuXG4gICAgdGhpcy5fc3BsaXR0ZXIgPSBuZXcgTGVuZ3RoQmFzZWRTcGxpdHRlcih7XG4gICAgICByZWFkYWJsZVN0cmVhbTogc29ja2V0Q2xpZW50LFxuICAgICAgbGl0dGxlRW5kaWFuOiB0cnVlLFxuICAgICAgbWF4RnJhbWVMZW5ndGg6IE1BWF9GUkFNRV9TSVpFLFxuICAgICAgbGVuZ3RoRmllbGRPZmZzZXQ6IDgsXG4gICAgICBsZW5ndGhGaWVsZExlbmd0aDogOCxcbiAgICAgIGxlbmd0aEFkanVzdG1lbnQ6IC04LFxuICAgIH0pO1xuICAgIHRoaXMuX2RlY29kZXIgPSBuZXcgQWZjRGVjb2RlcigpO1xuICAgIHRoaXMuX3NvY2tldENsaWVudC5waXBlKHRoaXMuX3NwbGl0dGVyKS5waXBlKHRoaXMuX2RlY29kZXIpO1xuXG4gICAgdGhpcy5fZW5jb2RlciA9IG5ldyBBZmNFbmNvZGVyKCk7XG4gICAgdGhpcy5fZW5jb2Rlci5waXBlKHRoaXMuX3NvY2tldENsaWVudCk7XG4gICAgdGhpcy5fYXNzaWduQ2xpZW50RmFpbHVyZUhhbmRsZXJzKHRoaXMuX2VuY29kZXIpO1xuXG4gICAgdGhpcy5fcmVzcG9uc2VDYWxsYmFja3MgPSB7fTtcblxuICAgIHRoaXMuX3BhY2tldE51bWJlciA9IDA7XG4gICAgdGhpcy5fZGVjb2Rlci5vbignZGF0YScsIHRoaXMuX2hhbmRsZURhdGEuYmluZCh0aGlzKSk7XG4gIH1cblxuICBfaGFuZGxlRGF0YSAoZGF0YSkge1xuICAgIGNvbnN0IGNiID0gdGhpcy5fcmVzcG9uc2VDYWxsYmFja3NbZGF0YS5wYWNrZXROdW1iZXJdIHx8IF8ubm9vcDtcbiAgICBjYihkYXRhKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by1jYWxsYmFja3NcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIGFuIGFscmVhZHkgZXhpc3RpbmcgZGlyZWN0b3J5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIGluIHVuaXggZm9ybWF0XG4gICAqL1xuICBhc3luYyBjcmVhdGVEaXJlY3RvcnkgKHBhdGgpIHtcbiAgICBjb25zdCB7cGFja2V0TnVtYmVyLCByZXNwb25zZX0gPSB0aGlzLl9jcmVhdGVQYWNrZXRQcm9taXNlKGBDcmVhdGUgZGlyZWN0b3J5ICcke3BhdGh9J2ApO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIG9wQ29kZTogT3BlcmF0aW9ucy5NQUtFX0RJUixcbiAgICAgIHBhY2tldE51bWJlcixcbiAgICAgIGhlYWRlclBheWxvYWQ6IEJ1ZmZlci5mcm9tKHBhdGgpXG4gICAgfTtcbiAgICB0aGlzLl9lbmNvZGVyLndyaXRlKGRhdGEpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3BvbnNlO1xuICAgIHRoaXMuX2NoZWNrU3RhdHVzKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhcmUgZGlyZWN0b3J5IGNvbXBsZXRlbHkgZXZlbiBpdCBoYXMgY29udGVudCBpbnNpZGUuIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgJ3JtIC1yIHtwYXRofSdcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggaW4gdW5peCBmb3JtYXRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZURpcmVjdG9yeSAocGF0aCkge1xuICAgIGNvbnN0IHtwYWNrZXROdW1iZXIsIHJlc3BvbnNlfSA9IHRoaXMuX2NyZWF0ZVBhY2tldFByb21pc2UoYERlbGV0ZSBkaXJlY3RvcnkgJyR7cGF0aH0nYCk7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgb3BDb2RlOiBPcGVyYXRpb25zLlJFTU9WRV9QQVRIX0FORF9DT05URU5UUyxcbiAgICAgIHBhY2tldE51bWJlcixcbiAgICAgIGhlYWRlclBheWxvYWQ6IEJ1ZmZlci5mcm9tKHBhdGgpXG4gICAgfTtcbiAgICB0aGlzLl9lbmNvZGVyLndyaXRlKGRhdGEpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3BvbnNlO1xuICAgIHRoaXMuX2NoZWNrU3RhdHVzKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgYSBkaXJlY3RvcnkncyBjb250ZW50cyBhbmQgcmV0dXJucyB0aGVtIGluIGFuIGFycmF5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIGluIHVuaXggZm9ybWF0XG4gICAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fVxuICAgKi9cbiAgYXN5bmMgbGlzdERpcmVjdG9yeSAocGF0aCkge1xuICAgIGNvbnN0IHtwYWNrZXROdW1iZXIsIHJlc3BvbnNlfSA9IHRoaXMuX2NyZWF0ZVBhY2tldFByb21pc2UoYExpc3QgZGlyZWN0b3J5ICcke3BhdGh9J2ApO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIG9wQ29kZTogT3BlcmF0aW9ucy5SRUFEX0RJUixcbiAgICAgIHBhY2tldE51bWJlcixcbiAgICAgIGhlYWRlclBheWxvYWQ6IEJ1ZmZlci5mcm9tKHBhdGgpXG4gICAgfTtcbiAgICB0aGlzLl9lbmNvZGVyLndyaXRlKGRhdGEpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3BvbnNlO1xuICAgIGlmIChyZXMub3BDb2RlICE9PSBPcGVyYXRpb25zLkRBVEEpIHtcbiAgICAgIHRoaXMuX2NoZWNrU3RhdHVzKHJlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3BhcnNlQXJyYXkocmVzLmNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgZmlsZSBhbmQgY3JlYXRlcyBhIGZpbGUgaGFuZGxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIGluIHVuaXggZm9ybWF0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtb2RlIFRoZSBmaWxlIG1vZGUgdGhhdCB3aWxsIGJlIHVzZWRcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgYXN5bmMgb3BlbkZpbGUgKHBhdGgsIG1vZGUpIHtcbiAgICBjb25zdCB7cGFja2V0TnVtYmVyLCByZXNwb25zZX0gPSB0aGlzLl9jcmVhdGVQYWNrZXRQcm9taXNlKGBPcGVuIGZpbGUgJyR7cGF0aH0nYCk7XG5cbiAgICBjb25zdCBwYXRoUGF5bG9hZCA9IEJ1ZmZlci5mcm9tKHBhdGgpO1xuICAgIGNvbnN0IGZpbGVNb2RlUGF5bG9hZCA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgICBmaWxlTW9kZVBheWxvYWQud3JpdGVVSW50MzJMRShtb2RlLCAwKTtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBvcENvZGU6IE9wZXJhdGlvbnMuRklMRV9PUEVOLFxuICAgICAgcGFja2V0TnVtYmVyLFxuICAgICAgaGVhZGVyUGF5bG9hZDogQnVmZmVyLmNvbmNhdChbZmlsZU1vZGVQYXlsb2FkLCBwYXRoUGF5bG9hZF0pXG4gICAgfTtcbiAgICB0aGlzLl9lbmNvZGVyLndyaXRlKGRhdGEpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3BvbnNlO1xuICAgIGlmIChyZXMub3BDb2RlICE9PSBPcGVyYXRpb25zLkZJTEVfT1BFTl9SRVMpIHtcbiAgICAgIHRoaXMuX2NoZWNrU3RhdHVzKHJlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcy5oZWFkZXJQYXlsb2FkLnJlYWRVSW50MzJMRSgwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyBhIGZpbGUgYW5kIGNyZWF0ZXMgYSBub2RlanMgd3JpdGUgc3RyZWFtXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aCBUaGUgcGF0aCBpbiB1bml4IGZvcm1hdFxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyBUaGUgcmVndWxhciBvcHRpb25zIHRoYXQgYXJlIHBhc3NlZCB0byBhIFN0cmVhbS5Xcml0YWJsZVxuICAgKiBAcmV0dXJuIHtBZmNXcml0YWJsZUZpbGVTdHJlYW19XG4gICAqL1xuICBhc3luYyBjcmVhdGVXcml0ZVN0cmVhbSAoZmlsZVBhdGgsIG9wdHMpIHtcbiAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgdGhpcy5vcGVuRmlsZShmaWxlUGF0aCwgRmlsZU1vZGVzLncpO1xuICAgIHJldHVybiBuZXcgQWZjV3JpdGFibGVGaWxlU3RyZWFtKGZpbGVIYW5kbGUsIHRoaXMsIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgZmlsZSBhbmQgY3JlYXRlcyBhIG5vZGVqcyByZWFkIHN0cmVhbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggVGhlIHBhdGggaW4gdW5peCBmb3JtYXRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgVGhlIHJlZ3VsYXIgb3B0aW9ucyB0aGF0IGFyZSBwYXNzZWQgdG8gYSBTdHJlYW0uUmVhZGFibGVcbiAgICogQHJldHVybiB7QWZjUmVhZGFibGVGaWxlU3RyZWFtfVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlUmVhZFN0cmVhbSAoZmlsZVBhdGgsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgdGhpcy5vcGVuRmlsZShmaWxlUGF0aCwgRmlsZU1vZGVzLnIpO1xuICAgIHJldHVybiBuZXcgQWZjUmVhZGFibGVGaWxlU3RyZWFtKGZpbGVIYW5kbGUsIHRoaXMsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgZmlsZSBoYW5kbGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGZpbGVIYW5kbGUgdGhlIGZpbGUgaGFuZGxlIHRvIGJlIGNsb3NlZFxuICAgKi9cbiAgYXN5bmMgY2xvc2VGaWxlSGFuZGxlIChmaWxlSGFuZGxlKSB7XG4gICAgY29uc3Qge3BhY2tldE51bWJlciwgcmVzcG9uc2V9ID0gdGhpcy5fY3JlYXRlUGFja2V0UHJvbWlzZShgQ2xvc2UgZmlsZSBoYW5kbGUgJyR7ZmlsZUhhbmRsZX0nYCk7XG5cbiAgICBjb25zdCBmaWxlTW9kZVBheWxvYWQgPSBCdWZmZXIuYWxsb2MoOCk7XG4gICAgZmlsZU1vZGVQYXlsb2FkLndyaXRlVUludDMyTEUoZmlsZUhhbmRsZSwgMCk7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgb3BDb2RlOiBPcGVyYXRpb25zLkZJTEVfQ0xPU0UsXG4gICAgICBwYWNrZXROdW1iZXIsXG4gICAgICBoZWFkZXJQYXlsb2FkOiBmaWxlTW9kZVBheWxvYWRcbiAgICB9O1xuICAgIHRoaXMuX2VuY29kZXIud3JpdGUoZGF0YSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgcmVzcG9uc2U7XG4gICAgdGhpcy5fY2hlY2tTdGF0dXMocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIGJ1ZmZlciBpbnRvIHRoZSBnaXZlbiBmaWxlIGhhbmRsZVxuICAgKiBAcGFyYW0ge251bWJlcn0gZmlsZUhhbmRsZSBUaGUgZmlsZSBoYW5kbGUgdG8gYmUgdXNlZFxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdGhhdCB3aWxsIGJlIHdyaXR0ZW5cbiAgICovXG4gIGFzeW5jIHdyaXRlRmlsZSAoZmlsZUhhbmRsZSwgYnVmZmVyKSB7XG4gICAgY29uc3Qge3BhY2tldE51bWJlciwgcmVzcG9uc2V9ID0gdGhpcy5fY3JlYXRlUGFja2V0UHJvbWlzZShgV3JpdGUgdG8gZmlsZSBoYW5kbGUgJyR7ZmlsZUhhbmRsZX0nYCk7XG5cbiAgICBjb25zdCBoZWFkZXJQYXlsb2FkID0gQnVmZmVyLmFsbG9jKDgpO1xuICAgIGhlYWRlclBheWxvYWQud3JpdGVVSW50MzJMRShmaWxlSGFuZGxlLCAwKTtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBvcENvZGU6IE9wZXJhdGlvbnMuRklMRV9XUklURSxcbiAgICAgIHBhY2tldE51bWJlcixcbiAgICAgIGhlYWRlclBheWxvYWQsXG4gICAgICBjb250ZW50OiBidWZmZXJcbiAgICB9O1xuICAgIHRoaXMuX2VuY29kZXIud3JpdGUoZGF0YSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgcmVzcG9uc2U7XG4gICAgdGhpcy5fY2hlY2tTdGF0dXMocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGEgY2VydGFpbiBsZW5ndGggb2YgYnVmZmVyIGZyb20gdGhlIGZpbGUgaGFuZGxlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmaWxlSGFuZGxlIFRoZSBmaWxlIGhhbmRsZSB0byBiZSB1c2VkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggVGhlIGxlbmd0aCB0aGF0IHdhbnRzIHRvIGJlIHJlYWQgZnJvbSB0aGUgZmlsZSBoYW5kbGVcbiAgICogQHJldHVybiB7QnVmZmVyfVxuICAgKi9cbiAgYXN5bmMgcmVhZEZpbGUgKGZpbGVIYW5kbGUsIGxlbmd0aCkge1xuICAgIGNvbnN0IHtwYWNrZXROdW1iZXIsIHJlc3BvbnNlfSA9IHRoaXMuX2NyZWF0ZVBhY2tldFByb21pc2UoYFJlYWQgZnJvbSBmaWxlIGhhbmRsZSAnJHtmaWxlSGFuZGxlfSdgKTtcblxuICAgIGNvbnN0IGhlYWRlclBheWxvYWQgPSBCdWZmZXIuYWxsb2MoMTYpO1xuICAgIGhlYWRlclBheWxvYWQud3JpdGVVSW50MzJMRShmaWxlSGFuZGxlLCAwKTtcbiAgICBoZWFkZXJQYXlsb2FkLndyaXRlVUludDMyTEUobGVuZ3RoLCA4KTtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBvcENvZGU6IE9wZXJhdGlvbnMuRklMRV9SRUFELFxuICAgICAgcGFja2V0TnVtYmVyLFxuICAgICAgaGVhZGVyUGF5bG9hZFxuICAgIH07XG4gICAgdGhpcy5fZW5jb2Rlci53cml0ZShkYXRhKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCByZXNwb25zZTtcbiAgICBpZiAocmVzLm9wQ29kZSAhPT0gT3BlcmF0aW9ucy5EQVRBKSB7XG4gICAgICB0aGlzLl9jaGVja1N0YXR1cyhyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLmNvbnRlbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlIGluZm8gb2YgdGhlIGdpdmVuIHBhdGhcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggaW4gdW5peCBmb3JtYXRcbiAgICogQHJldHVybiB7RmlsZUluZm99XG4gICAqL1xuICBhc3luYyBnZXRGaWxlSW5mbyAocGF0aCkge1xuICAgIGNvbnN0IHtwYWNrZXROdW1iZXIsIHJlc3BvbnNlfSA9IHRoaXMuX2NyZWF0ZVBhY2tldFByb21pc2UoYEdldCBmaWxlIGluZm8gJyR7cGF0aH0nYCk7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgb3BDb2RlOiBPcGVyYXRpb25zLkdFVF9GSUxFX0lORk8sXG4gICAgICBwYWNrZXROdW1iZXIsXG4gICAgICBoZWFkZXJQYXlsb2FkOiBCdWZmZXIuZnJvbShwYXRoKVxuICAgIH07XG4gICAgdGhpcy5fZW5jb2Rlci53cml0ZShkYXRhKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCByZXNwb25zZTtcbiAgICBpZiAocmVzLm9wQ29kZSAhPT0gT3BlcmF0aW9ucy5EQVRBKSB7XG4gICAgICB0aGlzLl9jaGVja1N0YXR1cyhyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEZpbGVJbmZvKHRoaXMuX3BhcnNlT2JqZWN0KHJlcy5jb250ZW50KSk7XG4gIH1cblxuICAvKiogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGR1cmluZyB0aGUgZGlyZWN0b3J5IHdhbGtpbmdcbiAgICogQG5hbWUgV2Fsa0RpckNhbGxiYWNrXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gaXRlbVBhdGggVGhlIHBhdGggb2YgdGhlIGZpbGUgb3IgZm9sZGVyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNEaXJlY3RvcnkgU2hvd3MgaWYgaXQgaXMgYSBkaXJlY3Rvcnkgb3IgYSBmaWxlXG4gICovXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkaXIgVGhlIHBhdGggaW4gdW5peCBmb3JtYXRcbiAgICogQHBhcmFtIHtib29sZWFufSByZWN1cnNpdmUgU2V0cyB3aGV0aGVyIHRvIGZvbGxvdyBzdWIgZGlyZWN0b3JpZXMgb3Igbm90XG4gICAqIEBwYXJhbSB7V2Fsa0RpckNhbGxiYWNrfSBvblBhdGggVGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgbmV3IHBhdGggaXMgZm91bmRcbiAgICovXG4gIGFzeW5jIHdhbGtEaXIgKGRpciwgcmVjdXJzaXZlLCBvblBhdGgpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgdGhpcy5saXN0RGlyZWN0b3J5KGRpcikpIHtcbiAgICAgIGlmIChJR05PUkVEX1BBVEhTLmluY2x1ZGVzKGZpbGUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5wb3NpeC5qb2luKGRpciwgZmlsZSk7XG4gICAgICBjb25zdCBmaWxlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0RmlsZUluZm8ocmVsYXRpdmVQYXRoKTtcbiAgICAgIGNvbnN0IGlzRGlyZWN0b3J5ID0gZmlsZUluZm8uaXNEaXJlY3RvcnkoKTtcbiAgICAgIGF3YWl0IG9uUGF0aChyZWxhdGl2ZVBhdGgsIGlzRGlyZWN0b3J5KTtcbiAgICAgIGlmIChpc0RpcmVjdG9yeSAmJiByZWN1cnNpdmUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy53YWxrRGlyKHJlbGF0aXZlUGF0aCwgcmVjdXJzaXZlLCBvblBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9jaGVja1N0YXR1cyAocmVzKSB7XG4gICAgaWYgKHJlcy5vcENvZGUgIT09IE9wZXJhdGlvbnMuU1RBVFVTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgcmVzcG9uc2UgJHtvcGVyYXRpb25Db2RlKHJlcy5vcENvZGUpfWApO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KHJlcy5oZWFkZXJQYXlsb2FkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdIZWFkZXIgcGF5bG9hZCBjYW5ub3QgYmUgZW1wdHkgZm9yIGEgc3RhdHVzIHJlc3BvbnNlJyk7XG4gICAgfVxuICAgIGlmIChyZXMuaGVhZGVyUGF5bG9hZFswXSAhPT0gRXJyb3JzLlNVQ0NFU1MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCByZXNwb25zZSAke2Vycm9yQ29kZShyZXMuaGVhZGVyUGF5bG9hZFswXSl9YCk7XG4gICAgfVxuICB9XG5cbiAgX3BhcnNlQXJyYXkgKGJ1ZmZlcikge1xuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBmb3IgKGxldCBlbmQgPSAwOyBlbmQgPCBidWZmZXIubGVuZ3RoOyBlbmQrKykge1xuICAgICAgaWYgKGJ1ZmZlcltlbmRdICE9PSBOVUxMX0RFTElNSVRFUl9DT0RFKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgaXRlbSA9IGJ1ZmZlci50b1N0cmluZygndXRmOCcsIHN0YXJ0LCBlbmQpO1xuICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIC8vIFdlIHNraXAgdGhlIG51bGwgZGVsaW1ldGVyXG4gICAgICBzdGFydCA9IGVuZCArIDE7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIF9wYXJzZU9iamVjdCAoYnVmZmVyKSB7XG4gICAgY29uc3QgaXRlbXMgPSB7fTtcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGxldCBjdXJyZW50S2V5O1xuICAgIGZvciAobGV0IGVuZCA9IDA7IGVuZCA8IGJ1ZmZlci5sZW5ndGg7IGVuZCsrKSB7XG4gICAgICBpZiAoYnVmZmVyW2VuZF0gIT09IE5VTExfREVMSU1JVEVSX0NPREUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtID0gYnVmZmVyLnRvU3RyaW5nKCd1dGY4Jywgc3RhcnQsIGVuZCk7XG4gICAgICBpZiAoXy5pc05pbChjdXJyZW50S2V5KSkge1xuICAgICAgICBjdXJyZW50S2V5ID0gaXRlbTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1zW2N1cnJlbnRLZXldID0gaXRlbTtcbiAgICAgICAgY3VycmVudEtleSA9IG51bGw7XG4gICAgICB9XG4gICAgICAvLyBXZSBza2lwIHRoZSBudWxsIGRlbGltZXRlclxuICAgICAgc3RhcnQgPSBlbmQgKyAxO1xuICAgIH1cbiAgICBpZiAoY3VycmVudEtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgY29ycmVjdGx5ICR7YnVmZmVyfS4gUGxlYXNlIGludmVzdGlnYXRlYCk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIF9jcmVhdGVQYWNrZXRQcm9taXNlIChtZXNzYWdlLCB0aW1lb3V0ID0gMTAwMDApIHtcbiAgICBjb25zdCBwYWNrZXROdW1iZXIgPSB0aGlzLl9wYWNrZXROdW1iZXIrKztcbiAgICBjb25zdCByZXNwb25zZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3BhY2tldE51bWJlcl0gPSByZXNvbHZlO1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5pc2ggdGhlIG9wZXJhdGlvbiAnJHttZXNzYWdlfScuIEZhaWxlZCB0byByZWNlaXZlIGFueSBkYXRhIHdpdGhpbiB0aGUgJHt0aW1lb3V0fW1zIHRpbWVvdXRgKSk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9KTtcbiAgICByZXR1cm4ge3BhY2tldE51bWJlciwgcmVzcG9uc2V9O1xuICB9XG59XG5cbmNsYXNzIEZpbGVJbmZvIHtcbiAgY29uc3RydWN0b3IgKHtzdF9zaXplLCBzdF9ibG9ja3MsIHN0X25saW5rLCBzdF9pZm10LCBzdF9tdGltZSwgc3RfYmlydGh0aW1lfSkge1xuICAgIHRoaXMuc2l6ZSA9IHBhcnNlSW50KHN0X3NpemUsIDEwKTtcbiAgICB0aGlzLmJsb2NrcyA9IHBhcnNlSW50KHN0X2Jsb2NrcywgMTApO1xuICAgIHRoaXMubmxpbmsgPSBwYXJzZUludChzdF9ubGluaywgMTApO1xuICAgIHRoaXMuaWZtdCA9IHN0X2lmbXQ7XG4gICAgLy8gbnMgdG8gbXNcbiAgICB0aGlzLm10aW1lTXMgPSBwYXJzZUludChzdF9tdGltZSwgMTApIC8gMTAwMDAwMDtcbiAgICAvLyBucyB0byBtc1xuICAgIHRoaXMuYmlydGh0aW1lTXMgPSBwYXJzZUludChzdF9iaXJ0aHRpbWUsIDEwKSAvIDEwMDAwMDA7XG4gIH1cblxuICBpc0RpcmVjdG9yeSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaWZtdCA9PT0gJ1NfSUZESVInO1xuICB9XG5cbiAgaXNGaWxlICgpIHtcbiAgICByZXR1cm4gdGhpcy5pZm10ID09PSAnU19JRlJFRyc7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQWZjU2VydmljZTtcbmV4cG9ydCB7IEFmY1NlcnZpY2UsIEFGQ19TRVJWSUNFX05BTUUgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxnQkFBZ0IsR0FBRyxlQUF6Qjs7QUFDQSxNQUFNQyxjQUFjLEdBQUcsSUFBSUMsYUFBM0I7QUFFQSxNQUFNQyxtQkFBbUIsR0FBRyxJQUE1QjtBQUNBLE1BQU1DLGFBQWEsR0FBRyxDQUFDLEdBQUQsRUFBTSxJQUFOLENBQXRCOztBQUVBLE1BQU1DLFVBQU4sU0FBeUJDLDhCQUF6QixDQUEyQztFQUN6Q0MsV0FBVyxDQUFFQyxZQUFGLEVBQWdCO0lBQ3pCLE1BQU1BLFlBQU47SUFFQSxLQUFLQyxTQUFMLEdBQWlCLElBQUlDLDRCQUFKLENBQXdCO01BQ3ZDQyxjQUFjLEVBQUVILFlBRHVCO01BRXZDSSxZQUFZLEVBQUUsSUFGeUI7TUFHdkNDLGNBQWMsRUFBRVosY0FIdUI7TUFJdkNhLGlCQUFpQixFQUFFLENBSm9CO01BS3ZDQyxpQkFBaUIsRUFBRSxDQUxvQjtNQU12Q0MsZ0JBQWdCLEVBQUUsQ0FBQztJQU5vQixDQUF4QixDQUFqQjtJQVFBLEtBQUtDLFFBQUwsR0FBZ0IsSUFBSUMsbUJBQUosRUFBaEI7O0lBQ0EsS0FBS0MsYUFBTCxDQUFtQkMsSUFBbkIsQ0FBd0IsS0FBS1gsU0FBN0IsRUFBd0NXLElBQXhDLENBQTZDLEtBQUtILFFBQWxEOztJQUVBLEtBQUtJLFFBQUwsR0FBZ0IsSUFBSUMsbUJBQUosRUFBaEI7O0lBQ0EsS0FBS0QsUUFBTCxDQUFjRCxJQUFkLENBQW1CLEtBQUtELGFBQXhCOztJQUNBLEtBQUtJLDRCQUFM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
302
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBRkNfU0VSVklDRV9OQU1FIiwiTUFYX0ZSQU1FX1NJWkUiLCJNQiIsIk5VTExfREVMSU1JVEVSX0NPREUiLCJJR05PUkVEX1BBVEhTIiwiQWZjU2VydmljZSIsIkJhc2VTZXJ2aWNlU29ja2V0IiwiY29uc3RydWN0b3IiLCJzb2NrZXRDbGllbnQiLCJfc3BsaXR0ZXIiLCJMZW5ndGhCYXNlZFNwbGl0dGVyIiwicmVhZGFibGVTdHJlYW0iLCJsaXR0bGVFbmRpYW4iLCJtYXhGcmFtZUxlbmd0aCIsImxlbmd0aEZpZWxkT2Zmc2V0IiwibGVuZ3RoRmllbGRMZW5ndGgiLCJsZW5ndGhBZGp1c3RtZW50IiwiX2RlY29kZXIiLCJBZmNEZWNvZGVyIiwiX3NvY2tldENsaWVudCIsInBpcGUiLCJfZW5jb2RlciIsIkFmY0VuY29kZXIiLCJfYXNzaWduQ2xpZW50RmFpbHVyZUhhbmRsZXJzIiwiX3Jlc3BvbnNlQ2FsbGJhY2tzIiwiX3BhY2tldE51bWJlciIsIm9uIiwiX2hhbmRsZURhdGEiLCJiaW5kIiwiZGF0YSIsImNiIiwicGFja2V0TnVtYmVyIiwiXyIsIm5vb3AiLCJjcmVhdGVEaXJlY3RvcnkiLCJwYXRoIiwicmVzcG9uc2UiLCJfY3JlYXRlUGFja2V0UHJvbWlzZSIsIm9wQ29kZSIsIk9wZXJhdGlvbnMiLCJNQUtFX0RJUiIsImhlYWRlclBheWxvYWQiLCJCdWZmZXIiLCJmcm9tIiwid3JpdGUiLCJyZXMiLCJfY2hlY2tTdGF0dXMiLCJkZWxldGVEaXJlY3RvcnkiLCJSRU1PVkVfUEFUSF9BTkRfQ09OVEVOVFMiLCJsaXN0RGlyZWN0b3J5IiwiUkVBRF9ESVIiLCJEQVRBIiwiX3BhcnNlQXJyYXkiLCJjb250ZW50Iiwib3BlbkZpbGUiLCJtb2RlIiwicGF0aFBheWxvYWQiLCJmaWxlTW9kZVBheWxvYWQiLCJhbGxvYyIsIndyaXRlVUludDMyTEUiLCJGSUxFX09QRU4iLCJjb25jYXQiLCJGSUxFX09QRU5fUkVTIiwicmVhZFVJbnQzMkxFIiwiY3JlYXRlV3JpdGVTdHJlYW0iLCJmaWxlUGF0aCIsIm9wdHMiLCJmaWxlSGFuZGxlIiwiRmlsZU1vZGVzIiwidyIsIkFmY1dyaXRhYmxlRmlsZVN0cmVhbSIsImNyZWF0ZVJlYWRTdHJlYW0iLCJvcHRpb25zIiwiciIsIkFmY1JlYWRhYmxlRmlsZVN0cmVhbSIsImNsb3NlRmlsZUhhbmRsZSIsIkZJTEVfQ0xPU0UiLCJ3cml0ZUZpbGUiLCJidWZmZXIiLCJGSUxFX1dSSVRFIiwicmVhZEZpbGUiLCJsZW5ndGgiLCJGSUxFX1JFQUQiLCJnZXRGaWxlSW5mbyIsIkdFVF9GSUxFX0lORk8iLCJGaWxlSW5mbyIsIl9wYXJzZU9iamVjdCIsIndhbGtEaXIiLCJkaXIiLCJyZWN1cnNpdmUiLCJvblBhdGgiLCJmaWxlIiwiaW5jbHVkZXMiLCJyZWxhdGl2ZVBhdGgiLCJwb3NpeCIsImpvaW4iLCJmaWxlSW5mbyIsImlzRGlyZWN0b3J5IiwiU1RBVFVTIiwiRXJyb3IiLCJvcGVyYXRpb25Db2RlIiwiaXNFbXB0eSIsIkVycm9ycyIsIlNVQ0NFU1MiLCJlcnJvckNvZGUiLCJpdGVtcyIsInN0YXJ0IiwiZW5kIiwiaXRlbSIsInRvU3RyaW5nIiwicHVzaCIsImN1cnJlbnRLZXkiLCJpc05pbCIsIm1lc3NhZ2UiLCJ0aW1lb3V0IiwiQiIsInJlc29sdmUiLCJyZWplY3QiLCJzZXRUaW1lb3V0Iiwic3Rfc2l6ZSIsInN0X2Jsb2NrcyIsInN0X25saW5rIiwic3RfaWZtdCIsInN0X210aW1lIiwic3RfYmlydGh0aW1lIiwic2l6ZSIsInBhcnNlSW50IiwiYmxvY2tzIiwibmxpbmsiLCJpZm10IiwibXRpbWVNcyIsImJpcnRodGltZU1zIiwiaXNGaWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2FmYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBMZW5ndGhCYXNlZFNwbGl0dGVyIGZyb20gJy4uL3V0aWwvdHJhbnNmb3JtZXIvbGVuZ3RoLWJhc2VkLXNwbGl0dGVyJztcbmltcG9ydCB7IE9wZXJhdGlvbnMsIG9wZXJhdGlvbkNvZGUsIEVycm9ycywgZXJyb3JDb2RlLCBGaWxlTW9kZXMgfSBmcm9tICcuL3Byb3RvY29sJztcbmltcG9ydCB7IEFmY1dyaXRhYmxlRmlsZVN0cmVhbSwgQWZjUmVhZGFibGVGaWxlU3RyZWFtIH0gZnJvbSAnLi9zdHJlYW1zJztcbmltcG9ydCBBZmNFbmNvZGVyIGZyb20gJy4vdHJhbnNmb3JtZXIvYWZjZW5jb2Rlcic7XG5pbXBvcnQgQWZjRGVjb2RlciBmcm9tICcuL3RyYW5zZm9ybWVyL2FmY2RlY29kZXInO1xuaW1wb3J0IHsgTUIgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQmFzZVNlcnZpY2VTb2NrZXQgfSBmcm9tICcuLi9iYXNlLXNlcnZpY2UnO1xuXG5cbmNvbnN0IEFGQ19TRVJWSUNFX05BTUUgPSAnY29tLmFwcGxlLmFmYyc7XG5jb25zdCBNQVhfRlJBTUVfU0laRSA9IDEgKiBNQjtcblxuY29uc3QgTlVMTF9ERUxJTUlURVJfQ09ERSA9IDB4MDA7XG5jb25zdCBJR05PUkVEX1BBVEhTID0gWycuJywgJy4uJ107XG5cbmNsYXNzIEFmY1NlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZVNvY2tldCB7XG4gIGNvbnN0cnVjdG9yIChzb2NrZXRDbGllbnQpIHtcbiAgICBzdXBlcihzb2NrZXRDbGllbnQpO1xuXG4gICAgdGhpcy5fc3BsaXR0ZXIgPSBuZXcgTGVuZ3RoQmFzZWRTcGxpdHRlcih7XG4gICAgICByZWFkYWJsZVN0cmVhbTogc29ja2V0Q2xpZW50LFxuICAgICAgbGl0dGxlRW5kaWFuOiB0cnVlLFxuICAgICAgbWF4RnJhbWVMZW5ndGg6IE1BWF9GUkFNRV9TSVpFLFxuICAgICAgbGVuZ3RoRmllbGRPZmZzZXQ6IDgsXG4gICAgICBsZW5ndGhGaWVsZExlbmd0aDogOCxcbiAgICAgIGxlbmd0aEFkanVzdG1lbnQ6IC04LFxuICAgIH0pO1xuICAgIHRoaXMuX2RlY29kZXIgPSBuZXcgQWZjRGVjb2RlcigpO1xuICAgIHRoaXMuX3NvY2tldENsaWVudC5waXBlKHRoaXMuX3NwbGl0dGVyKS5waXBlKHRoaXMuX2RlY29kZXIpO1xuXG4gICAgdGhpcy5fZW5jb2RlciA9IG5ldyBBZmNFbmNvZGVyKCk7XG4gICAgdGhpcy5fZW5jb2Rlci5waXBlKHRoaXMuX3NvY2tldENsaWVudCk7XG4gICAgdGhpcy5fYXNzaWduQ2xpZW50RmFpbHVyZUhhbmRsZXJzKHRoaXMuX2VuY29kZXIpO1xuXG4gICAgdGhpcy5fcmVzcG9uc2VDYWxsYmFja3MgPSB7fTtcblxuICAgIHRoaXMuX3BhY2tldE51bWJlciA9IDA7XG4gICAgdGhpcy5fZGVjb2Rlci5vbignZGF0YScsIHRoaXMuX2hhbmRsZURhdGEuYmluZCh0aGlzKSk7XG4gIH1cblxuICBfaGFuZGxlRGF0YSAoZGF0YSkge1xuICAgIGNvbnN0IGNiID0gdGhpcy5fcmVzcG9uc2VDYWxsYmFja3NbZGF0YS5wYWNrZXROdW1iZXJdIHx8IF8ubm9vcDtcbiAgICBjYihkYXRhKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by1jYWxsYmFja3NcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIGFuIGFscmVhZHkgZXhpc3RpbmcgZGlyZWN0b3J5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIGluIHVuaXggZm9ybWF0XG4gICAqL1xuICBhc3luYyBjcmVhdGVEaXJlY3RvcnkgKHBhdGgpIHtcbiAgICBjb25zdCB7cGFja2V0TnVtYmVyLCByZXNwb25zZX0gPSB0aGlzLl9jcmVhdGVQYWNrZXRQcm9taXNlKGBDcmVhdGUgZGlyZWN0b3J5ICcke3BhdGh9J2ApO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIG9wQ29kZTogT3BlcmF0aW9ucy5NQUtFX0RJUixcbiAgICAgIHBhY2tldE51bWJlcixcbiAgICAgIGhlYWRlclBheWxvYWQ6IEJ1ZmZlci5mcm9tKHBhdGgpXG4gICAgfTtcbiAgICB0aGlzLl9lbmNvZGVyLndyaXRlKGRhdGEpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3BvbnNlO1xuICAgIHRoaXMuX2NoZWNrU3RhdHVzKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhcmUgZGlyZWN0b3J5IGNvbXBsZXRlbHkgZXZlbiBpdCBoYXMgY29udGVudCBpbnNpZGUuIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgJ3JtIC1yIHtwYXRofSdcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggaW4gdW5peCBmb3JtYXRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZURpcmVjdG9yeSAocGF0aCkge1xuICAgIGNvbnN0IHtwYWNrZXROdW1iZXIsIHJlc3BvbnNlfSA9IHRoaXMuX2NyZWF0ZVBhY2tldFByb21pc2UoYERlbGV0ZSBkaXJlY3RvcnkgJyR7cGF0aH0nYCk7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgb3BDb2RlOiBPcGVyYXRpb25zLlJFTU9WRV9QQVRIX0FORF9DT05URU5UUyxcbiAgICAgIHBhY2tldE51bWJlcixcbiAgICAgIGhlYWRlclBheWxvYWQ6IEJ1ZmZlci5mcm9tKHBhdGgpXG4gICAgfTtcbiAgICB0aGlzLl9lbmNvZGVyLndyaXRlKGRhdGEpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3BvbnNlO1xuICAgIHRoaXMuX2NoZWNrU3RhdHVzKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgYSBkaXJlY3RvcnkncyBjb250ZW50cyBhbmQgcmV0dXJucyB0aGVtIGluIGFuIGFycmF5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIGluIHVuaXggZm9ybWF0XG4gICAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fVxuICAgKi9cbiAgYXN5bmMgbGlzdERpcmVjdG9yeSAocGF0aCkge1xuICAgIGNvbnN0IHtwYWNrZXROdW1iZXIsIHJlc3BvbnNlfSA9IHRoaXMuX2NyZWF0ZVBhY2tldFByb21pc2UoYExpc3QgZGlyZWN0b3J5ICcke3BhdGh9J2ApO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIG9wQ29kZTogT3BlcmF0aW9ucy5SRUFEX0RJUixcbiAgICAgIHBhY2tldE51bWJlcixcbiAgICAgIGhlYWRlclBheWxvYWQ6IEJ1ZmZlci5mcm9tKHBhdGgpXG4gICAgfTtcbiAgICB0aGlzLl9lbmNvZGVyLndyaXRlKGRhdGEpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3BvbnNlO1xuICAgIGlmIChyZXMub3BDb2RlICE9PSBPcGVyYXRpb25zLkRBVEEpIHtcbiAgICAgIHRoaXMuX2NoZWNrU3RhdHVzKHJlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3BhcnNlQXJyYXkocmVzLmNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgZmlsZSBhbmQgY3JlYXRlcyBhIGZpbGUgaGFuZGxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIGluIHVuaXggZm9ybWF0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtb2RlIFRoZSBmaWxlIG1vZGUgdGhhdCB3aWxsIGJlIHVzZWRcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgYXN5bmMgb3BlbkZpbGUgKHBhdGgsIG1vZGUpIHtcbiAgICBjb25zdCB7cGFja2V0TnVtYmVyLCByZXNwb25zZX0gPSB0aGlzLl9jcmVhdGVQYWNrZXRQcm9taXNlKGBPcGVuIGZpbGUgJyR7cGF0aH0nYCk7XG5cbiAgICBjb25zdCBwYXRoUGF5bG9hZCA9IEJ1ZmZlci5mcm9tKHBhdGgpO1xuICAgIGNvbnN0IGZpbGVNb2RlUGF5bG9hZCA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgICBmaWxlTW9kZVBheWxvYWQud3JpdGVVSW50MzJMRShtb2RlLCAwKTtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBvcENvZGU6IE9wZXJhdGlvbnMuRklMRV9PUEVOLFxuICAgICAgcGFja2V0TnVtYmVyLFxuICAgICAgaGVhZGVyUGF5bG9hZDogQnVmZmVyLmNvbmNhdChbZmlsZU1vZGVQYXlsb2FkLCBwYXRoUGF5bG9hZF0pXG4gICAgfTtcbiAgICB0aGlzLl9lbmNvZGVyLndyaXRlKGRhdGEpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3BvbnNlO1xuICAgIGlmIChyZXMub3BDb2RlICE9PSBPcGVyYXRpb25zLkZJTEVfT1BFTl9SRVMpIHtcbiAgICAgIHRoaXMuX2NoZWNrU3RhdHVzKHJlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcy5oZWFkZXJQYXlsb2FkLnJlYWRVSW50MzJMRSgwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyBhIGZpbGUgYW5kIGNyZWF0ZXMgYSBub2RlanMgd3JpdGUgc3RyZWFtXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aCBUaGUgcGF0aCBpbiB1bml4IGZvcm1hdFxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyBUaGUgcmVndWxhciBvcHRpb25zIHRoYXQgYXJlIHBhc3NlZCB0byBhIFN0cmVhbS5Xcml0YWJsZVxuICAgKiBAcmV0dXJuIHtBZmNXcml0YWJsZUZpbGVTdHJlYW19XG4gICAqL1xuICBhc3luYyBjcmVhdGVXcml0ZVN0cmVhbSAoZmlsZVBhdGgsIG9wdHMpIHtcbiAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgdGhpcy5vcGVuRmlsZShmaWxlUGF0aCwgRmlsZU1vZGVzLncpO1xuICAgIHJldHVybiBuZXcgQWZjV3JpdGFibGVGaWxlU3RyZWFtKGZpbGVIYW5kbGUsIHRoaXMsIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgZmlsZSBhbmQgY3JlYXRlcyBhIG5vZGVqcyByZWFkIHN0cmVhbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggVGhlIHBhdGggaW4gdW5peCBmb3JtYXRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgVGhlIHJlZ3VsYXIgb3B0aW9ucyB0aGF0IGFyZSBwYXNzZWQgdG8gYSBTdHJlYW0uUmVhZGFibGVcbiAgICogQHJldHVybiB7QWZjUmVhZGFibGVGaWxlU3RyZWFtfVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlUmVhZFN0cmVhbSAoZmlsZVBhdGgsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgdGhpcy5vcGVuRmlsZShmaWxlUGF0aCwgRmlsZU1vZGVzLnIpO1xuICAgIHJldHVybiBuZXcgQWZjUmVhZGFibGVGaWxlU3RyZWFtKGZpbGVIYW5kbGUsIHRoaXMsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgZmlsZSBoYW5kbGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGZpbGVIYW5kbGUgdGhlIGZpbGUgaGFuZGxlIHRvIGJlIGNsb3NlZFxuICAgKi9cbiAgYXN5bmMgY2xvc2VGaWxlSGFuZGxlIChmaWxlSGFuZGxlKSB7XG4gICAgY29uc3Qge3BhY2tldE51bWJlciwgcmVzcG9uc2V9ID0gdGhpcy5fY3JlYXRlUGFja2V0UHJvbWlzZShgQ2xvc2UgZmlsZSBoYW5kbGUgJyR7ZmlsZUhhbmRsZX0nYCk7XG5cbiAgICBjb25zdCBmaWxlTW9kZVBheWxvYWQgPSBCdWZmZXIuYWxsb2MoOCk7XG4gICAgZmlsZU1vZGVQYXlsb2FkLndyaXRlVUludDMyTEUoZmlsZUhhbmRsZSwgMCk7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgb3BDb2RlOiBPcGVyYXRpb25zLkZJTEVfQ0xPU0UsXG4gICAgICBwYWNrZXROdW1iZXIsXG4gICAgICBoZWFkZXJQYXlsb2FkOiBmaWxlTW9kZVBheWxvYWRcbiAgICB9O1xuICAgIHRoaXMuX2VuY29kZXIud3JpdGUoZGF0YSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgcmVzcG9uc2U7XG4gICAgdGhpcy5fY2hlY2tTdGF0dXMocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIGJ1ZmZlciBpbnRvIHRoZSBnaXZlbiBmaWxlIGhhbmRsZVxuICAgKiBAcGFyYW0ge251bWJlcn0gZmlsZUhhbmRsZSBUaGUgZmlsZSBoYW5kbGUgdG8gYmUgdXNlZFxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdGhhdCB3aWxsIGJlIHdyaXR0ZW5cbiAgICovXG4gIGFzeW5jIHdyaXRlRmlsZSAoZmlsZUhhbmRsZSwgYnVmZmVyKSB7XG4gICAgY29uc3Qge3BhY2tldE51bWJlciwgcmVzcG9uc2V9ID0gdGhpcy5fY3JlYXRlUGFja2V0UHJvbWlzZShgV3JpdGUgdG8gZmlsZSBoYW5kbGUgJyR7ZmlsZUhhbmRsZX0nYCk7XG5cbiAgICBjb25zdCBoZWFkZXJQYXlsb2FkID0gQnVmZmVyLmFsbG9jKDgpO1xuICAgIGhlYWRlclBheWxvYWQud3JpdGVVSW50MzJMRShmaWxlSGFuZGxlLCAwKTtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBvcENvZGU6IE9wZXJhdGlvbnMuRklMRV9XUklURSxcbiAgICAgIHBhY2tldE51bWJlcixcbiAgICAgIGhlYWRlclBheWxvYWQsXG4gICAgICBjb250ZW50OiBidWZmZXJcbiAgICB9O1xuICAgIHRoaXMuX2VuY29kZXIud3JpdGUoZGF0YSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgcmVzcG9uc2U7XG4gICAgdGhpcy5fY2hlY2tTdGF0dXMocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGEgY2VydGFpbiBsZW5ndGggb2YgYnVmZmVyIGZyb20gdGhlIGZpbGUgaGFuZGxlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmaWxlSGFuZGxlIFRoZSBmaWxlIGhhbmRsZSB0byBiZSB1c2VkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggVGhlIGxlbmd0aCB0aGF0IHdhbnRzIHRvIGJlIHJlYWQgZnJvbSB0aGUgZmlsZSBoYW5kbGVcbiAgICogQHJldHVybiB7QnVmZmVyfVxuICAgKi9cbiAgYXN5bmMgcmVhZEZpbGUgKGZpbGVIYW5kbGUsIGxlbmd0aCkge1xuICAgIGNvbnN0IHtwYWNrZXROdW1iZXIsIHJlc3BvbnNlfSA9IHRoaXMuX2NyZWF0ZVBhY2tldFByb21pc2UoYFJlYWQgZnJvbSBmaWxlIGhhbmRsZSAnJHtmaWxlSGFuZGxlfSdgKTtcblxuICAgIGNvbnN0IGhlYWRlclBheWxvYWQgPSBCdWZmZXIuYWxsb2MoMTYpO1xuICAgIGhlYWRlclBheWxvYWQud3JpdGVVSW50MzJMRShmaWxlSGFuZGxlLCAwKTtcbiAgICBoZWFkZXJQYXlsb2FkLndyaXRlVUludDMyTEUobGVuZ3RoLCA4KTtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBvcENvZGU6IE9wZXJhdGlvbnMuRklMRV9SRUFELFxuICAgICAgcGFja2V0TnVtYmVyLFxuICAgICAgaGVhZGVyUGF5bG9hZFxuICAgIH07XG4gICAgdGhpcy5fZW5jb2Rlci53cml0ZShkYXRhKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCByZXNwb25zZTtcbiAgICBpZiAocmVzLm9wQ29kZSAhPT0gT3BlcmF0aW9ucy5EQVRBKSB7XG4gICAgICB0aGlzLl9jaGVja1N0YXR1cyhyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLmNvbnRlbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlIGluZm8gb2YgdGhlIGdpdmVuIHBhdGhcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggaW4gdW5peCBmb3JtYXRcbiAgICogQHJldHVybiB7RmlsZUluZm99XG4gICAqL1xuICBhc3luYyBnZXRGaWxlSW5mbyAocGF0aCkge1xuICAgIGNvbnN0IHtwYWNrZXROdW1iZXIsIHJlc3BvbnNlfSA9IHRoaXMuX2NyZWF0ZVBhY2tldFByb21pc2UoYEdldCBmaWxlIGluZm8gJyR7cGF0aH0nYCk7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgb3BDb2RlOiBPcGVyYXRpb25zLkdFVF9GSUxFX0lORk8sXG4gICAgICBwYWNrZXROdW1iZXIsXG4gICAgICBoZWFkZXJQYXlsb2FkOiBCdWZmZXIuZnJvbShwYXRoKVxuICAgIH07XG4gICAgdGhpcy5fZW5jb2Rlci53cml0ZShkYXRhKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCByZXNwb25zZTtcbiAgICBpZiAocmVzLm9wQ29kZSAhPT0gT3BlcmF0aW9ucy5EQVRBKSB7XG4gICAgICB0aGlzLl9jaGVja1N0YXR1cyhyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEZpbGVJbmZvKHRoaXMuX3BhcnNlT2JqZWN0KHJlcy5jb250ZW50KSk7XG4gIH1cblxuICAvKiogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGR1cmluZyB0aGUgZGlyZWN0b3J5IHdhbGtpbmdcbiAgICogQG5hbWUgV2Fsa0RpckNhbGxiYWNrXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gaXRlbVBhdGggVGhlIHBhdGggb2YgdGhlIGZpbGUgb3IgZm9sZGVyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNEaXJlY3RvcnkgU2hvd3MgaWYgaXQgaXMgYSBkaXJlY3Rvcnkgb3IgYSBmaWxlXG4gICovXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkaXIgVGhlIHBhdGggaW4gdW5peCBmb3JtYXRcbiAgICogQHBhcmFtIHtib29sZWFufSByZWN1cnNpdmUgU2V0cyB3aGV0aGVyIHRvIGZvbGxvdyBzdWIgZGlyZWN0b3JpZXMgb3Igbm90XG4gICAqIEBwYXJhbSB7V2Fsa0RpckNhbGxiYWNrfSBvblBhdGggVGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgbmV3IHBhdGggaXMgZm91bmRcbiAgICovXG4gIGFzeW5jIHdhbGtEaXIgKGRpciwgcmVjdXJzaXZlLCBvblBhdGgpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgdGhpcy5saXN0RGlyZWN0b3J5KGRpcikpIHtcbiAgICAgIGlmIChJR05PUkVEX1BBVEhTLmluY2x1ZGVzKGZpbGUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5wb3NpeC5qb2luKGRpciwgZmlsZSk7XG4gICAgICBjb25zdCBmaWxlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0RmlsZUluZm8ocmVsYXRpdmVQYXRoKTtcbiAgICAgIGNvbnN0IGlzRGlyZWN0b3J5ID0gZmlsZUluZm8uaXNEaXJlY3RvcnkoKTtcbiAgICAgIGF3YWl0IG9uUGF0aChyZWxhdGl2ZVBhdGgsIGlzRGlyZWN0b3J5KTtcbiAgICAgIGlmIChpc0RpcmVjdG9yeSAmJiByZWN1cnNpdmUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy53YWxrRGlyKHJlbGF0aXZlUGF0aCwgcmVjdXJzaXZlLCBvblBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9jaGVja1N0YXR1cyAocmVzKSB7XG4gICAgaWYgKHJlcy5vcENvZGUgIT09IE9wZXJhdGlvbnMuU1RBVFVTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgcmVzcG9uc2UgJHtvcGVyYXRpb25Db2RlKHJlcy5vcENvZGUpfWApO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KHJlcy5oZWFkZXJQYXlsb2FkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdIZWFkZXIgcGF5bG9hZCBjYW5ub3QgYmUgZW1wdHkgZm9yIGEgc3RhdHVzIHJlc3BvbnNlJyk7XG4gICAgfVxuICAgIGlmIChyZXMuaGVhZGVyUGF5bG9hZFswXSAhPT0gRXJyb3JzLlNVQ0NFU1MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCByZXNwb25zZSAke2Vycm9yQ29kZShyZXMuaGVhZGVyUGF5bG9hZFswXSl9YCk7XG4gICAgfVxuICB9XG5cbiAgX3BhcnNlQXJyYXkgKGJ1ZmZlcikge1xuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBmb3IgKGxldCBlbmQgPSAwOyBlbmQgPCBidWZmZXIubGVuZ3RoOyBlbmQrKykge1xuICAgICAgaWYgKGJ1ZmZlcltlbmRdICE9PSBOVUxMX0RFTElNSVRFUl9DT0RFKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgaXRlbSA9IGJ1ZmZlci50b1N0cmluZygndXRmOCcsIHN0YXJ0LCBlbmQpO1xuICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIC8vIFdlIHNraXAgdGhlIG51bGwgZGVsaW1ldGVyXG4gICAgICBzdGFydCA9IGVuZCArIDE7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIF9wYXJzZU9iamVjdCAoYnVmZmVyKSB7XG4gICAgY29uc3QgaXRlbXMgPSB7fTtcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGxldCBjdXJyZW50S2V5O1xuICAgIGZvciAobGV0IGVuZCA9IDA7IGVuZCA8IGJ1ZmZlci5sZW5ndGg7IGVuZCsrKSB7XG4gICAgICBpZiAoYnVmZmVyW2VuZF0gIT09IE5VTExfREVMSU1JVEVSX0NPREUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtID0gYnVmZmVyLnRvU3RyaW5nKCd1dGY4Jywgc3RhcnQsIGVuZCk7XG4gICAgICBpZiAoXy5pc05pbChjdXJyZW50S2V5KSkge1xuICAgICAgICBjdXJyZW50S2V5ID0gaXRlbTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1zW2N1cnJlbnRLZXldID0gaXRlbTtcbiAgICAgICAgY3VycmVudEtleSA9IG51bGw7XG4gICAgICB9XG4gICAgICAvLyBXZSBza2lwIHRoZSBudWxsIGRlbGltZXRlclxuICAgICAgc3RhcnQgPSBlbmQgKyAxO1xuICAgIH1cbiAgICBpZiAoY3VycmVudEtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgY29ycmVjdGx5ICR7YnVmZmVyfS4gUGxlYXNlIGludmVzdGlnYXRlYCk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIF9jcmVhdGVQYWNrZXRQcm9taXNlIChtZXNzYWdlLCB0aW1lb3V0ID0gMTAwMDApIHtcbiAgICBjb25zdCBwYWNrZXROdW1iZXIgPSB0aGlzLl9wYWNrZXROdW1iZXIrKztcbiAgICBjb25zdCByZXNwb25zZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3BhY2tldE51bWJlcl0gPSByZXNvbHZlO1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5pc2ggdGhlIG9wZXJhdGlvbiAnJHttZXNzYWdlfScuIEZhaWxlZCB0byByZWNlaXZlIGFueSBkYXRhIHdpdGhpbiB0aGUgJHt0aW1lb3V0fW1zIHRpbWVvdXRgKSk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9KTtcbiAgICByZXR1cm4ge3BhY2tldE51bWJlciwgcmVzcG9uc2V9O1xuICB9XG59XG5cbmNsYXNzIEZpbGVJbmZvIHtcbiAgY29uc3RydWN0b3IgKHtzdF9zaXplLCBzdF9ibG9ja3MsIHN0X25saW5rLCBzdF9pZm10LCBzdF9tdGltZSwgc3RfYmlydGh0aW1lfSkge1xuICAgIHRoaXMuc2l6ZSA9IHBhcnNlSW50KHN0X3NpemUsIDEwKTtcbiAgICB0aGlzLmJsb2NrcyA9IHBhcnNlSW50KHN0X2Jsb2NrcywgMTApO1xuICAgIHRoaXMubmxpbmsgPSBwYXJzZUludChzdF9ubGluaywgMTApO1xuICAgIHRoaXMuaWZtdCA9IHN0X2lmbXQ7XG4gICAgLy8gbnMgdG8gbXNcbiAgICB0aGlzLm10aW1lTXMgPSBwYXJzZUludChzdF9tdGltZSwgMTApIC8gMTAwMDAwMDtcbiAgICAvLyBucyB0byBtc1xuICAgIHRoaXMuYmlydGh0aW1lTXMgPSBwYXJzZUludChzdF9iaXJ0aHRpbWUsIDEwKSAvIDEwMDAwMDA7XG4gIH1cblxuICBpc0RpcmVjdG9yeSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaWZtdCA9PT0gJ1NfSUZESVInO1xuICB9XG5cbiAgaXNGaWxlICgpIHtcbiAgICByZXR1cm4gdGhpcy5pZm10ID09PSAnU19JRlJFRyc7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQWZjU2VydmljZTtcbmV4cG9ydCB7IEFmY1NlcnZpY2UsIEFGQ19TRVJWSUNFX05BTUUgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBLE1BQU1BLGdCQUFnQixHQUFHLGVBQWU7QUFBQztBQUN6QyxNQUFNQyxjQUFjLEdBQUcsQ0FBQyxHQUFHQyxhQUFFO0FBRTdCLE1BQU1DLG1CQUFtQixHQUFHLElBQUk7QUFDaEMsTUFBTUMsYUFBYSxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztBQUVqQyxNQUFNQyxVQUFVLFNBQVNDLDhCQUFpQixDQUFDO0VBQ3pDQyxXQUFXLENBQUVDLFlBQVksRUFBRTtJQUN6QixLQUFLLENBQUNBLFlBQVksQ0FBQztJQUVuQixJQUFJLENBQUNDLFNBQVMsR0FBRyxJQUFJQyw0QkFBbUIsQ0FBQztNQUN2Q0MsY0FBYyxFQUFFSCxZQUFZO01BQzVCSSxZQUFZLEVBQUUsSUFBSTtNQUNsQkMsY0FBYyxFQUFFWixjQUFjO01BQzlCYSxpQkFBaUIsRUFBRSxDQUFDO01BQ3BCQyxpQkFBaUIsRUFBRSxDQUFDO01BQ3BCQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3JCLENBQUMsQ0FBQztJQUNGLElBQUksQ0FBQ0MsUUFBUSxHQUFHLElBQUlDLG1CQUFVLEVBQUU7SUFDaEMsSUFBSSxDQUFDQyxhQUFhLENBQUNDLElBQUksQ0FBQyxJQUFJLENBQUNYLFNBQVMsQ0FBQyxDQUFDVyxJQUFJLENBQUMsSUFBSSxDQUFDSCxRQUFRLENBQUM7SUFFM0QsSUFBSSxDQUFDSSxRQUFRLEdBQUcsSUFBSUMsbUJBQVUsRUFBRTtJQUNoQyxJQUFJLENBQUNELFFBQVEsQ0FBQ0QsSUFBSSxDQUFDLElB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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["AFC_SERVICE_NAME","MAX_FRAME_SIZE","MB","NULL_DELIMITER_CODE","IGNORED_PATHS","AfcService","BaseServiceSocket","constructor","socketClient","_splitter","LengthBasedSplitter","readableStream","littleEndian","maxFrameLength","lengthFieldOffset","lengthFieldLength","lengthAdjustment","_decoder","AfcDecoder","_socketClient","pipe","_encoder","AfcEncoder","_assignClientFailureHandlers","_responseCallbacks","_packetNumber","on","_handleData","bind","data","cb","packetNumber","_","noop","createDirectory","path","response","_createPacketPromise","opCode","Operations","MAKE_DIR","headerPayload","Buffer","from","write","res","_checkStatus","deleteDirectory","REMOVE_PATH_AND_CONTENTS","listDirectory","READ_DIR","DATA","_parseArray","content","openFile","mode","pathPayload","fileModePayload","alloc","writeUInt32LE","FILE_OPEN","concat","FILE_OPEN_RES","readUInt32LE","createWriteStream","filePath","opts","fileHandle","FileModes","w","AfcWritableFileStream","createReadStream","options","r","AfcReadableFileStream","closeFileHandle","FILE_CLOSE","writeFile","buffer","FILE_WRITE","readFile","length","FILE_READ","getFileInfo","GET_FILE_INFO","FileInfo","_parseObject","walkDir","dir","recursive","onPath","file","includes","relativePath","posix","join","fileInfo","isDirectory","STATUS","Error","operationCode","isEmpty","Errors","SUCCESS","errorCode","items","start","end","item","toString","push","currentKey","isNil","message","timeout","B","resolve","reject","setTimeout","st_size","st_blocks","st_nlink","st_ifmt","st_mtime","st_birthtime","size","parseInt","blocks","nlink","ifmt","mtimeMs","birthtimeMs","isFile"],"sources":["../../../lib/afc/index.js"],"sourcesContent":["\nimport LengthBasedSplitter from '../util/transformer/length-based-splitter';\nimport { Operations, operationCode, Errors, errorCode, FileModes } from './protocol';\nimport { AfcWritableFileStream, AfcReadableFileStream } from './streams';\nimport AfcEncoder from './transformer/afcencoder';\nimport AfcDecoder from './transformer/afcdecoder';\nimport { MB } from '../constants';\nimport B from 'bluebird';\nimport path from 'path';\nimport _ from 'lodash';\nimport { BaseServiceSocket } from '../base-service';\n\n\nconst AFC_SERVICE_NAME = 'com.apple.afc';\nconst MAX_FRAME_SIZE = 1 * MB;\n\nconst NULL_DELIMITER_CODE = 0x00;\nconst IGNORED_PATHS = ['.', '..'];\n\nclass AfcService extends BaseServiceSocket {\n constructor (socketClient) {\n super(socketClient);\n\n this._splitter = new LengthBasedSplitter({\n readableStream: socketClient,\n littleEndian: true,\n maxFrameLength: MAX_FRAME_SIZE,\n lengthFieldOffset: 8,\n lengthFieldLength: 8,\n lengthAdjustment: -8,\n });\n this._decoder = new AfcDecoder();\n this._socketClient.pipe(this._splitter).pipe(this._decoder);\n\n this._encoder = new AfcEncoder();\n this._encoder.pipe(this._socketClient);\n this._assignClientFailureHandlers(this._encoder);\n\n this._responseCallbacks = {};\n\n this._packetNumber = 0;\n this._decoder.on('data', this._handleData.bind(this));\n }\n\n _handleData (data) {\n const cb = this._responseCallbacks[data.packetNumber] || _.noop;\n cb(data); // eslint-disable-line promise/prefer-await-to-callbacks\n }\n\n /**\n * Creates a directory relative to an already existing directory\n * @param {string} path The path in unix format\n */\n async createDirectory (path) {\n const {packetNumber, response} = this._createPacketPromise(`Create directory '${path}'`);\n\n const data = {\n opCode: Operations.MAKE_DIR,\n packetNumber,\n headerPayload: Buffer.from(path)\n };\n this._encoder.write(data);\n const res = await response;\n this._checkStatus(res);\n }\n\n /**\n * Deletes are directory completely even it has content inside. This is an implementation of 'rm -r {path}'\n * @param {string} path The path in unix format\n */\n async deleteDirectory (path) {\n const {packetNumber, response} = this._createPacketPromise(`Delete directory '${path}'`);\n\n const data = {\n opCode: Operations.REMOVE_PATH_AND_CONTENTS,\n packetNumber,\n headerPayload: Buffer.from(path)\n };\n this._encoder.write(data);\n const res = await response;\n this._checkStatus(res);\n }\n\n /**\n * Lists a directory's contents and returns them in an array\n * @param {string} path The path in unix format\n * @return {Array.<string>}\n */\n async listDirectory (path) {\n const {packetNumber, response} = this._createPacketPromise(`List directory '${path}'`);\n\n const data = {\n opCode: Operations.READ_DIR,\n packetNumber,\n headerPayload: Buffer.from(path)\n };\n this._encoder.write(data);\n const res = await response;\n if (res.opCode !== Operations.DATA) {\n this._checkStatus(res);\n }\n\n return this._parseArray(res.content);\n }\n\n /**\n * Opens a file and creates a file handle\n * @param {string} path The path in unix format\n * @param {number} mode The file mode that will be used\n * @return {number}\n */\n async openFile (path, mode) {\n const {packetNumber, response} = this._createPacketPromise(`Open file '${path}'`);\n\n const pathPayload = Buffer.from(path);\n const fileModePayload = Buffer.alloc(8);\n fileModePayload.writeUInt32LE(mode, 0);\n\n const data = {\n opCode: Operations.FILE_OPEN,\n packetNumber,\n headerPayload: Buffer.concat([fileModePayload, pathPayload])\n };\n this._encoder.write(data);\n const res = await response;\n if (res.opCode !== Operations.FILE_OPEN_RES) {\n this._checkStatus(res);\n }\n\n return res.headerPayload.readUInt32LE(0);\n }\n\n /**\n * Opens a file and creates a nodejs write stream\n * @param {string} filePath The path in unix format\n * @param {Object} opts The regular options that are passed to a Stream.Writable\n * @return {AfcWritableFileStream}\n */\n async createWriteStream (filePath, opts) {\n const fileHandle = await this.openFile(filePath, FileModes.w);\n return new AfcWritableFileStream(fileHandle, this, opts);\n }\n\n /**\n * Opens a file and creates a nodejs read stream\n * @param {string} filePath The path in unix format\n * @param {Object} opts The regular options that are passed to a Stream.Readable\n * @return {AfcReadableFileStream}\n */\n async createReadStream (filePath, options) {\n const fileHandle = await this.openFile(filePath, FileModes.r);\n return new AfcReadableFileStream(fileHandle, this, options);\n }\n\n /**\n * Closes the file handle\n * @param {number} fileHandle the file handle to be closed\n */\n async closeFileHandle (fileHandle) {\n const {packetNumber, response} = this._createPacketPromise(`Close file handle '${fileHandle}'`);\n\n const fileModePayload = Buffer.alloc(8);\n fileModePayload.writeUInt32LE(fileHandle, 0);\n\n const data = {\n opCode: Operations.FILE_CLOSE,\n packetNumber,\n headerPayload: fileModePayload\n };\n this._encoder.write(data);\n const res = await response;\n this._checkStatus(res);\n }\n\n /**\n * Writes the buffer into the given file handle\n * @param {number} fileHandle The file handle to be used\n * @param {Buffer} buffer The buffer that will be written\n */\n async writeFile (fileHandle, buffer) {\n const {packetNumber, response} = this._createPacketPromise(`Write to file handle '${fileHandle}'`);\n\n const headerPayload = Buffer.alloc(8);\n headerPayload.writeUInt32LE(fileHandle, 0);\n\n const data = {\n opCode: Operations.FILE_WRITE,\n packetNumber,\n headerPayload,\n content: buffer\n };\n this._encoder.write(data);\n const res = await response;\n this._checkStatus(res);\n }\n\n /**\n * Read a certain length of buffer from the file handle\n * @param {number} fileHandle The file handle to be used\n * @param {number} length The length that wants to be read from the file handle\n * @return {Buffer}\n */\n async readFile (fileHandle, length) {\n const {packetNumber, response} = this._createPacketPromise(`Read from file handle '${fileHandle}'`);\n\n const headerPayload = Buffer.alloc(16);\n headerPayload.writeUInt32LE(fileHandle, 0);\n headerPayload.writeUInt32LE(length, 8);\n\n const data = {\n opCode: Operations.FILE_READ,\n packetNumber,\n headerPayload\n };\n this._encoder.write(data);\n const res = await response;\n if (res.opCode !== Operations.DATA) {\n this._checkStatus(res);\n }\n return res.content;\n }\n\n /**\n * Get the file info of the given path\n * @param {string} path The path in unix format\n * @return {FileInfo}\n */\n async getFileInfo (path) {\n const {packetNumber, response} = this._createPacketPromise(`Get file info '${path}'`);\n\n const data = {\n opCode: Operations.GET_FILE_INFO,\n packetNumber,\n headerPayload: Buffer.from(path)\n };\n this._encoder.write(data);\n const res = await response;\n if (res.opCode !== Operations.DATA) {\n this._checkStatus(res);\n }\n return new FileInfo(this._parseObject(res.content));\n }\n\n /** The callback function which will be called during the directory walking\n * @name WalkDirCallback\n * @function\n * @param {string} itemPath The path of the file or folder\n * @param {boolean} isDirectory Shows if it is a directory or a file\n */\n\n /**\n *\n * @param {string} dir The path in unix format\n * @param {boolean} recursive Sets whether to follow sub directories or not\n * @param {WalkDirCallback} onPath The callback to be called when a new path is found\n */\n async walkDir (dir, recursive, onPath) {\n for (const file of await this.listDirectory(dir)) {\n if (IGNORED_PATHS.includes(file)) {\n continue;\n }\n const relativePath = path.posix.join(dir, file);\n const fileInfo = await this.getFileInfo(relativePath);\n const isDirectory = fileInfo.isDirectory();\n await onPath(relativePath, isDirectory);\n if (isDirectory && recursive) {\n await this.walkDir(relativePath, recursive, onPath);\n }\n }\n }\n\n _checkStatus (res) {\n if (res.opCode !== Operations.STATUS) {\n throw new Error(`Unexpected response ${operationCode(res.opCode)}`);\n }\n if (_.isEmpty(res.headerPayload)) {\n throw new Error('Header payload cannot be empty for a status response');\n }\n if (res.headerPayload[0] !== Errors.SUCCESS) {\n throw new Error(`Unexpected response ${errorCode(res.headerPayload[0])}`);\n }\n }\n\n _parseArray (buffer) {\n const items = [];\n let start = 0;\n for (let end = 0; end < buffer.length; end++) {\n if (buffer[end] !== NULL_DELIMITER_CODE) {\n continue;\n }\n const item = buffer.toString('utf8', start, end);\n items.push(item);\n // We skip the null delimeter\n start = end + 1;\n }\n return items;\n }\n\n _parseObject (buffer) {\n const items = {};\n let start = 0;\n let currentKey;\n for (let end = 0; end < buffer.length; end++) {\n if (buffer[end] !== NULL_DELIMITER_CODE) {\n continue;\n }\n const item = buffer.toString('utf8', start, end);\n if (_.isNil(currentKey)) {\n currentKey = item;\n } else {\n items[currentKey] = item;\n currentKey = null;\n }\n // We skip the null delimeter\n start = end + 1;\n }\n if (currentKey) {\n throw new Error(`Failed to parse correctly ${buffer}. Please investigate`);\n }\n return items;\n }\n\n _createPacketPromise (message, timeout = 10000) {\n const packetNumber = this._packetNumber++;\n const response = new B((resolve, reject) => {\n this._responseCallbacks[packetNumber] = resolve;\n setTimeout(function () {\n reject(new Error(`Could not finish the operation '${message}'. Failed to receive any data within the ${timeout}ms timeout`));\n }, timeout);\n });\n return {packetNumber, response};\n }\n}\n\nclass FileInfo {\n constructor ({st_size, st_blocks, st_nlink, st_ifmt, st_mtime, st_birthtime}) {\n this.size = parseInt(st_size, 10);\n this.blocks = parseInt(st_blocks, 10);\n this.nlink = parseInt(st_nlink, 10);\n this.ifmt = st_ifmt;\n // ns to ms\n this.mtimeMs = parseInt(st_mtime, 10) / 1000000;\n // ns to ms\n this.birthtimeMs = parseInt(st_birthtime, 10) / 1000000;\n }\n\n isDirectory () {\n return this.ifmt === 'S_IFDIR';\n }\n\n isFile () {\n return this.ifmt === 'S_IFREG';\n }\n}\n\nexport default AfcService;\nexport { AfcService, AFC_SERVICE_NAME };\n"],"mappings":"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"}
@@ -1,18 +1,14 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.Operations = exports.MAGIC_NUMBER = exports.FileModes = exports.Errors = exports.AFC_PACKET_HEADER_SIZE = void 0;
9
8
  exports.errorCode = errorCode;
10
9
  exports.operationCode = operationCode;
11
-
12
10
  require("source-map-support/register");
13
-
14
11
  var _lodash = _interopRequireDefault(require("lodash"));
15
-
16
12
  const MAGIC_NUMBER = Buffer.from('CFA6LPAA');
17
13
  exports.MAGIC_NUMBER = MAGIC_NUMBER;
18
14
  const AFC_PACKET_HEADER_SIZE = 40;
@@ -61,13 +57,10 @@ const Operations = {
61
57
  FILE_WRITE_OFFSET: 0x00000028
62
58
  };
63
59
  exports.Operations = Operations;
64
-
65
60
  const Operations_Code = _lodash.default.invert(Operations);
66
-
67
61
  function operationCode(code) {
68
62
  return Operations_Code[code];
69
63
  }
70
-
71
64
  const Errors = {
72
65
  SUCCESS: 0,
73
66
  UNKNOWN: 1,
@@ -95,13 +88,10 @@ const Errors = {
95
88
  INTERNAL: 23
96
89
  };
97
90
  exports.Errors = Errors;
98
-
99
91
  const Errors_Code = _lodash.default.invert(Errors);
100
-
101
92
  function errorCode(code) {
102
93
  return Errors_Code[code];
103
94
  }
104
-
105
95
  const FileModes = {
106
96
  'r': 0x00000001,
107
97
  'r+': 0x00000002,
@@ -111,4 +101,4 @@ const FileModes = {
111
101
  'a+': 0x00000006
112
102
  };
113
103
  exports.FileModes = FileModes;
114
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNQUdJQ19OVU1CRVIiLCJCdWZmZXIiLCJmcm9tIiwiQUZDX1BBQ0tFVF9IRUFERVJfU0laRSIsIk9wZXJhdGlvbnMiLCJJTlZBTElEIiwiU1RBVFVTIiwiREFUQSIsIlJFQURfRElSIiwiUkVBRF9GSUxFIiwiV1JJVEVfRklMRSIsIldSSVRFX1BBUlQiLCJUUlVOQ0FURSIsIlJFTU9WRV9QQVRIIiwiTUFLRV9ESVIiLCJHRVRfRklMRV9JTkZPIiwiR0VUX0RFVklORk8iLCJXUklURV9GSUxFX0FUT00iLCJGSUxFX09QRU4iLCJGSUxFX09QRU5fUkVTIiwiRklMRV9SRUFEIiwiRklMRV9XUklURSIsIkZJTEVfU0VFSyIsIkZJTEVfVEVMTCIsIkZJTEVfVEVMTF9SRVMiLCJGSUxFX0NMT1NFIiwiRklMRV9TRVRfU0laRSIsIkdFVF9DT05fSU5GTyIsIlNFVF9DT05fT1BUSU9OUyIsIlJFTkFNRV9QQVRIIiwiU0VUX0ZTX0JTIiwiU0VUX1NPQ0tFVF9CUyIsIkZJTEVfTE9DSyIsIk1BS0VfTElOSyIsIkdFVF9GSUxFX0hBU0giLCJTRVRfRklMRV9NT0RfVElNRSIsIkdFVF9GSUxFX0hBU0hfUkFOR0UiLCJGSUxFX1NFVF9JTU1VVEFCTEVfSElOVCIsIkdFVF9TSVpFX09GX1BBVEhfQ09OVEVOVFMiLCJSRU1PVkVfUEFUSF9BTkRfQ09OVEVOVFMiLCJESVJfT1BFTiIsIkRJUl9PUEVOX1JFU1VMVCIsIkRJUl9SRUFEIiwiRElSX0NMT1NFIiwiRklMRV9SRUFEX09GRlNFVCIsIkZJTEVfV1JJVEVfT0ZGU0VUIiwiT3BlcmF0aW9uc19Db2RlIiwiXyIsImludmVydCIsIm9wZXJhdGlvbkNvZGUiLCJjb2RlIiwiRXJyb3JzIiwiU1VDQ0VTUyIsIlVOS05PV04iLCJJTlZBTElEX0hFQURFUiIsIk5PX1JFU09VUkNFUyIsIlJFQUQiLCJXUklURSIsIlVOS05PV05fUEFDS0VUX1RZUEUiLCJJTlZBTElEX0FSR1VNRU5UIiwiT0JKRUNUX05PVF9GT1VORCIsIk9CSkVDVF9JU19ESVJFQ1RPUlkiLCJQRVJNSVNTSU9OX0RFTklFRCIsIk5PVF9DT05ORUNURUQiLCJUSU1FT1VUIiwiT1ZFUlJVTiIsIkVPRiIsIlVOU1VQUE9SVEVEIiwiT0JKRUNUX0VYSVNUUyIsIk9CSkVDVF9CVVNZIiwiT05fU1BBQ0VfTEVGVCIsIldPVUxEX0JMT0NLIiwiSU8iLCJJTlRFUlJVUFRFRCIsIklOX1BST0dSRVNTIiwiSU5URVJOQUwiLCJFcnJvcnNfQ29kZSIsImVycm9yQ29kZSIsIkZpbGVNb2RlcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9hZmMvcHJvdG9jb2wuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuY29uc3QgTUFHSUNfTlVNQkVSID0gQnVmZmVyLmZyb20oJ0NGQTZMUEFBJyk7XG5cbmNvbnN0IEFGQ19QQUNLRVRfSEVBREVSX1NJWkUgPSA0MDtcblxuY29uc3QgT3BlcmF0aW9ucyA9IHtcbiAgSU5WQUxJRDogMHgwMDAwMDAwMCxcdC8vIEludmFsaWRcbiAgU1RBVFVTOiAweDAwMDAwMDAxLFx0Ly8gU3RhdHVzXG4gIERBVEE6IDB4MDAwMDAwMDIsXHQvLyBEYXRhXG4gIFJFQURfRElSOiAweDAwMDAwMDAzLFx0Ly8gUmVhZERpclxuICBSRUFEX0ZJTEU6IDB4MDAwMDAwMDQsXHQvLyBSZWFkRmlsZVxuICBXUklURV9GSUxFOiAweDAwMDAwMDA1LFx0Ly8gV3JpdGVGaWxlXG4gIFdSSVRFX1BBUlQ6IDB4MDAwMDAwMDYsXHQvLyBXcml0ZVBhcnRcbiAgVFJVTkNBVEU6IDB4MDAwMDAwMDcsXHQvLyBUcnVuY2F0ZUZpbGVcbiAgUkVNT1ZFX1BBVEg6IDB4MDAwMDAwMDgsXHQvLyBSZW1vdmVQYXRoXG4gIE1BS0VfRElSOiAweDAwMDAwMDA5LFx0Ly8gTWFrZURpclxuICBHRVRfRklMRV9JTkZPOiAweDAwMDAwMDBBLFx0Ly8gR2V0RmlsZUluZm9cbiAgR0VUX0RFVklORk86IDB4MDAwMDAwMEIsXHQvLyBHZXREZXZpY2VJbmZvXG4gIFdSSVRFX0ZJTEVfQVRPTTogMHgwMDAwMDAwQyxcdC8vIFdyaXRlRmlsZUF0b21pYyAodG1wIGZpbGUrcmVuYW1lKVxuICBGSUxFX09QRU46IDB4MDAwMDAwMEQsXHQvLyBGaWxlUmVmT3BlblxuICBGSUxFX09QRU5fUkVTOiAweDAwMDAwMDBFLFx0Ly8gRmlsZVJlZk9wZW5SZXN1bHRcbiAgRklMRV9SRUFEOiAweDAwMDAwMDBGLFx0Ly8gRmlsZVJlZlJlYWRcbiAgRklMRV9XUklURTogMHgwMDAwMDAxMCxcdC8vIEZpbGVSZWZXcml0ZVxuICBGSUxFX1NFRUs6IDB4MDAwMDAwMTEsXHQvLyBGaWxlUmVmU2Vla1xuICBGSUxFX1RFTEw6IDB4MDAwMDAwMTIsXHQvLyBGaWxlUmVmVGVsbFxuICBGSUxFX1RFTExfUkVTOiAweDAwMDAwMDEzLFx0Ly8gRmlsZVJlZlRlbGxSZXN1bHRcbiAgRklMRV9DTE9TRTogMHgwMDAwMDAxNCxcdC8vIEZpbGVSZWZDbG9zZVxuICBGSUxFX1NFVF9TSVpFOiAweDAwMDAwMDE1LFx0Ly8gRmlsZVJlZlNldEZpbGVTaXplIChmdHJ1bmNhdGUpXG4gIEdFVF9DT05fSU5GTzogMHgwMDAwMDAxNixcdC8vIEdldENvbm5lY3Rpb25JbmZvXG4gIFNFVF9DT05fT1BUSU9OUzogMHgwMDAwMDAxNyxcdC8vIFNldENvbm5lY3Rpb25PcHRpb25zXG4gIFJFTkFNRV9QQVRIOiAweDAwMDAwMDE4LFx0Ly8gUmVuYW1lUGF0aFxuICBTRVRfRlNfQlM6IDB4MDAwMDAwMTksXHQvLyBTZXRGU0Jsb2NrU2l6ZSAoMHg4MDAwMDApXG4gIFNFVF9TT0NLRVRfQlM6IDB4MDAwMDAwMUEsXHQvLyBTZXRTb2NrZXRCbG9ja1NpemUgKDB4ODAwMDAwKVxuICBGSUxFX0xPQ0s6IDB4MDAwMDAwMUIsXHQvLyBGaWxlUmVmTG9ja1xuICBNQUtFX0xJTks6IDB4MDAwMDAwMUMsXHQvLyBNYWtlTGlua1xuICBHRVRfRklMRV9IQVNIOiAweDAwMDAwMDFELFx0Ly8gR2V0RmlsZUhhc2hcbiAgU0VUX0ZJTEVfTU9EX1RJTUU6IDB4MDAwMDAwMUUsXHQvLyBTZXRNb2RUaW1lXG4gIEdFVF9GSUxFX0hBU0hfUkFOR0U6IDB4MDAwMDAwMUYsXHQvLyBHZXRGaWxlSGFzaFdpdGhSYW5nZVxuICBGSUxFX1NFVF9JTU1VVEFCTEVfSElOVDogMHgwMDAwMDAyMCxcdC8vIEZpbGVSZWZTZXRJbW11dGFibGVIaW50XG4gIEdFVF9TSVpFX09GX1BBVEhfQ09OVEVOVFM6IDB4MDAwMDAwMjEsXHQvLyBHZXRTaXplT2ZQYXRoQ29udGVudHNcbiAgUkVNT1ZFX1BBVEhfQU5EX0NPTlRFTlRTOiAweDAwMDAwMDIyLFx0Ly8gUmVtb3ZlUGF0aEFuZENvbnRlbnRzXG4gIERJUl9PUEVOOiAweDAwMDAwMDIzLFx0Ly8gRGlyZWN0b3J5RW51bWVyYXRvclJlZk9wZW5cbiAgRElSX09QRU5fUkVTVUxUOiAweDAwMDAwMDI0LFx0Ly8gRGlyZWN0b3J5RW51bWVyYXRvclJlZk9wZW5SZXN1bHRcbiAgRElSX1JFQUQ6IDB4MDAwMDAwMjUsXHQvLyBEaXJlY3RvcnlFbnVtZXJhdG9yUmVmUmVhZFxuICBESVJfQ0xPU0U6IDB4MDAwMDAwMjYsXHQvLyBEaXJlY3RvcnlFbnVtZXJhdG9yUmVmQ2xvc2VcbiAgRklMRV9SRUFEX09GRlNFVDogMHgwMDAwMDAyNyxcdC8vIEZpbGVSZWZSZWFkV2l0aE9mZnNldFxuICBGSUxFX1dSSVRFX09GRlNFVDpcdDB4MDAwMDAwMjhcdC8vIEZpbGVSZWZXcml0ZVdpdGhPZmZzZXRcbn07XG5cbmNvbnN0IE9wZXJhdGlvbnNfQ29kZSA9IF8uaW52ZXJ0KE9wZXJhdGlvbnMpO1xuXG5mdW5jdGlvbiBvcGVyYXRpb25Db2RlIChjb2RlKSB7XG4gIHJldHVybiBPcGVyYXRpb25zX0NvZGVbY29kZV07XG59XG5cbmNvbnN0IEVycm9ycyA9IHtcbiAgU1VDQ0VTUzogMCxcbiAgVU5LTk9XTjogMSxcbiAgSU5WQUxJRF9IRUFERVI6IDIsXG4gIE5PX1JFU09VUkNFUzogMyxcbiAgUkVBRDogNCxcbiAgV1JJVEU6IDUsXG4gIFVOS05PV05fUEFDS0VUX1RZUEU6IDYsXG4gIElOVkFMSURfQVJHVU1FTlQ6IDcsXG4gIE9CSkVDVF9OT1RfRk9VTkQ6IDgsXG4gIE9CSkVDVF9JU19ESVJFQ1RPUlk6IDksXG4gIFBFUk1JU1NJT05fREVOSUVEOiAxMCxcbiAgTk9UX0NPTk5FQ1RFRDogMTEsXG4gIFRJTUVPVVQ6IDEyLFxuICBPVkVSUlVOOiAxMyxcbiAgRU9GOiAxNCxcbiAgVU5TVVBQT1JURUQ6IDE1LFxuICBPQkpFQ1RfRVhJU1RTOiAxNixcbiAgT0JKRUNUX0JVU1k6IDE3LFxuICBPTl9TUEFDRV9MRUZUOiAxOCxcbiAgV09VTERfQkxPQ0s6IDE5LFxuICBJTzogMjAsXG4gIElOVEVSUlVQVEVEOiAyMSxcbiAgSU5fUFJPR1JFU1M6IDIyLFxuICBJTlRFUk5BTDogMjMsXG59O1xuXG5jb25zdCBFcnJvcnNfQ29kZSA9IF8uaW52ZXJ0KEVycm9ycyk7XG5cbmZ1bmN0aW9uIGVycm9yQ29kZSAoY29kZSkge1xuICByZXR1cm4gRXJyb3JzX0NvZGVbY29kZV07XG59XG5cblxuY29uc3QgRmlsZU1vZGVzID0ge1xuICAncic6IDB4MDAwMDAwMDEsIC8vIE9fUkRPTkxZXG4gICdyKyc6IDB4MDAwMDAwMDIsIC8vIE9fUkRXUiAgIHwgT19DUkVBVFxuICAndyc6IDB4MDAwMDAwMDMsIC8vIE9fV1JPTkxZIHwgT19DUkVBVCAgfCBPX1RSVU5DXG4gICd3Kyc6IDB4MDAwMDAwMDQsIC8vIE9fUkRXUiAgIHwgT19DUkVBVCAgfCBPX1RSVU5DXG4gICdhJzogMHgwMDAwMDAwNSwgLy8gT19XUk9OTFkgfCBPX0FQUEVORCB8IE9fQ1JFQVRcbiAgJ2ErJzogMHgwMDAwMDAwNiwgLy8gT19SRFdSICAgfCBPX0FQUEVORCB8IE9fQ1JFQVRcbn07XG5cbmV4cG9ydCB7XG4gIE1BR0lDX05VTUJFUiwgQUZDX1BBQ0tFVF9IRUFERVJfU0laRSxcbiAgT3BlcmF0aW9ucywgb3BlcmF0aW9uQ29kZSxcbiAgRXJyb3JzLCBlcnJvckNv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
104
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNQUdJQ19OVU1CRVIiLCJCdWZmZXIiLCJmcm9tIiwiQUZDX1BBQ0tFVF9IRUFERVJfU0laRSIsIk9wZXJhdGlvbnMiLCJJTlZBTElEIiwiU1RBVFVTIiwiREFUQSIsIlJFQURfRElSIiwiUkVBRF9GSUxFIiwiV1JJVEVfRklMRSIsIldSSVRFX1BBUlQiLCJUUlVOQ0FURSIsIlJFTU9WRV9QQVRIIiwiTUFLRV9ESVIiLCJHRVRfRklMRV9JTkZPIiwiR0VUX0RFVklORk8iLCJXUklURV9GSUxFX0FUT00iLCJGSUxFX09QRU4iLCJGSUxFX09QRU5fUkVTIiwiRklMRV9SRUFEIiwiRklMRV9XUklURSIsIkZJTEVfU0VFSyIsIkZJTEVfVEVMTCIsIkZJTEVfVEVMTF9SRVMiLCJGSUxFX0NMT1NFIiwiRklMRV9TRVRfU0laRSIsIkdFVF9DT05fSU5GTyIsIlNFVF9DT05fT1BUSU9OUyIsIlJFTkFNRV9QQVRIIiwiU0VUX0ZTX0JTIiwiU0VUX1NPQ0tFVF9CUyIsIkZJTEVfTE9DSyIsIk1BS0VfTElOSyIsIkdFVF9GSUxFX0hBU0giLCJTRVRfRklMRV9NT0RfVElNRSIsIkdFVF9GSUxFX0hBU0hfUkFOR0UiLCJGSUxFX1NFVF9JTU1VVEFCTEVfSElOVCIsIkdFVF9TSVpFX09GX1BBVEhfQ09OVEVOVFMiLCJSRU1PVkVfUEFUSF9BTkRfQ09OVEVOVFMiLCJESVJfT1BFTiIsIkRJUl9PUEVOX1JFU1VMVCIsIkRJUl9SRUFEIiwiRElSX0NMT1NFIiwiRklMRV9SRUFEX09GRlNFVCIsIkZJTEVfV1JJVEVfT0ZGU0VUIiwiT3BlcmF0aW9uc19Db2RlIiwiXyIsImludmVydCIsIm9wZXJhdGlvbkNvZGUiLCJjb2RlIiwiRXJyb3JzIiwiU1VDQ0VTUyIsIlVOS05PV04iLCJJTlZBTElEX0hFQURFUiIsIk5PX1JFU09VUkNFUyIsIlJFQUQiLCJXUklURSIsIlVOS05PV05fUEFDS0VUX1RZUEUiLCJJTlZBTElEX0FSR1VNRU5UIiwiT0JKRUNUX05PVF9GT1VORCIsIk9CSkVDVF9JU19ESVJFQ1RPUlkiLCJQRVJNSVNTSU9OX0RFTklFRCIsIk5PVF9DT05ORUNURUQiLCJUSU1FT1VUIiwiT1ZFUlJVTiIsIkVPRiIsIlVOU1VQUE9SVEVEIiwiT0JKRUNUX0VYSVNUUyIsIk9CSkVDVF9CVVNZIiwiT05fU1BBQ0VfTEVGVCIsIldPVUxEX0JMT0NLIiwiSU8iLCJJTlRFUlJVUFRFRCIsIklOX1BST0dSRVNTIiwiSU5URVJOQUwiLCJFcnJvcnNfQ29kZSIsImVycm9yQ29kZSIsIkZpbGVNb2RlcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9hZmMvcHJvdG9jb2wuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuY29uc3QgTUFHSUNfTlVNQkVSID0gQnVmZmVyLmZyb20oJ0NGQTZMUEFBJyk7XG5cbmNvbnN0IEFGQ19QQUNLRVRfSEVBREVSX1NJWkUgPSA0MDtcblxuY29uc3QgT3BlcmF0aW9ucyA9IHtcbiAgSU5WQUxJRDogMHgwMDAwMDAwMCxcdC8vIEludmFsaWRcbiAgU1RBVFVTOiAweDAwMDAwMDAxLFx0Ly8gU3RhdHVzXG4gIERBVEE6IDB4MDAwMDAwMDIsXHQvLyBEYXRhXG4gIFJFQURfRElSOiAweDAwMDAwMDAzLFx0Ly8gUmVhZERpclxuICBSRUFEX0ZJTEU6IDB4MDAwMDAwMDQsXHQvLyBSZWFkRmlsZVxuICBXUklURV9GSUxFOiAweDAwMDAwMDA1LFx0Ly8gV3JpdGVGaWxlXG4gIFdSSVRFX1BBUlQ6IDB4MDAwMDAwMDYsXHQvLyBXcml0ZVBhcnRcbiAgVFJVTkNBVEU6IDB4MDAwMDAwMDcsXHQvLyBUcnVuY2F0ZUZpbGVcbiAgUkVNT1ZFX1BBVEg6IDB4MDAwMDAwMDgsXHQvLyBSZW1vdmVQYXRoXG4gIE1BS0VfRElSOiAweDAwMDAwMDA5LFx0Ly8gTWFrZURpclxuICBHRVRfRklMRV9JTkZPOiAweDAwMDAwMDBBLFx0Ly8gR2V0RmlsZUluZm9cbiAgR0VUX0RFVklORk86IDB4MDAwMDAwMEIsXHQvLyBHZXREZXZpY2VJbmZvXG4gIFdSSVRFX0ZJTEVfQVRPTTogMHgwMDAwMDAwQyxcdC8vIFdyaXRlRmlsZUF0b21pYyAodG1wIGZpbGUrcmVuYW1lKVxuICBGSUxFX09QRU46IDB4MDAwMDAwMEQsXHQvLyBGaWxlUmVmT3BlblxuICBGSUxFX09QRU5fUkVTOiAweDAwMDAwMDBFLFx0Ly8gRmlsZVJlZk9wZW5SZXN1bHRcbiAgRklMRV9SRUFEOiAweDAwMDAwMDBGLFx0Ly8gRmlsZVJlZlJlYWRcbiAgRklMRV9XUklURTogMHgwMDAwMDAxMCxcdC8vIEZpbGVSZWZXcml0ZVxuICBGSUxFX1NFRUs6IDB4MDAwMDAwMTEsXHQvLyBGaWxlUmVmU2Vla1xuICBGSUxFX1RFTEw6IDB4MDAwMDAwMTIsXHQvLyBGaWxlUmVmVGVsbFxuICBGSUxFX1RFTExfUkVTOiAweDAwMDAwMDEzLFx0Ly8gRmlsZVJlZlRlbGxSZXN1bHRcbiAgRklMRV9DTE9TRTogMHgwMDAwMDAxNCxcdC8vIEZpbGVSZWZDbG9zZVxuICBGSUxFX1NFVF9TSVpFOiAweDAwMDAwMDE1LFx0Ly8gRmlsZVJlZlNldEZpbGVTaXplIChmdHJ1bmNhdGUpXG4gIEdFVF9DT05fSU5GTzogMHgwMDAwMDAxNixcdC8vIEdldENvbm5lY3Rpb25JbmZvXG4gIFNFVF9DT05fT1BUSU9OUzogMHgwMDAwMDAxNyxcdC8vIFNldENvbm5lY3Rpb25PcHRpb25zXG4gIFJFTkFNRV9QQVRIOiAweDAwMDAwMDE4LFx0Ly8gUmVuYW1lUGF0aFxuICBTRVRfRlNfQlM6IDB4MDAwMDAwMTksXHQvLyBTZXRGU0Jsb2NrU2l6ZSAoMHg4MDAwMDApXG4gIFNFVF9TT0NLRVRfQlM6IDB4MDAwMDAwMUEsXHQvLyBTZXRTb2NrZXRCbG9ja1NpemUgKDB4ODAwMDAwKVxuICBGSUxFX0xPQ0s6IDB4MDAwMDAwMUIsXHQvLyBGaWxlUmVmTG9ja1xuICBNQUtFX0xJTks6IDB4MDAwMDAwMUMsXHQvLyBNYWtlTGlua1xuICBHRVRfRklMRV9IQVNIOiAweDAwMDAwMDFELFx0Ly8gR2V0RmlsZUhhc2hcbiAgU0VUX0ZJTEVfTU9EX1RJTUU6IDB4MDAwMDAwMUUsXHQvLyBTZXRNb2RUaW1lXG4gIEdFVF9GSUxFX0hBU0hfUkFOR0U6IDB4MDAwMDAwMUYsXHQvLyBHZXRGaWxlSGFzaFdpdGhSYW5nZVxuICBGSUxFX1NFVF9JTU1VVEFCTEVfSElOVDogMHgwMDAwMDAyMCxcdC8vIEZpbGVSZWZTZXRJbW11dGFibGVIaW50XG4gIEdFVF9TSVpFX09GX1BBVEhfQ09OVEVOVFM6IDB4MDAwMDAwMjEsXHQvLyBHZXRTaXplT2ZQYXRoQ29udGVudHNcbiAgUkVNT1ZFX1BBVEhfQU5EX0NPTlRFTlRTOiAweDAwMDAwMDIyLFx0Ly8gUmVtb3ZlUGF0aEFuZENvbnRlbnRzXG4gIERJUl9PUEVOOiAweDAwMDAwMDIzLFx0Ly8gRGlyZWN0b3J5RW51bWVyYXRvclJlZk9wZW5cbiAgRElSX09QRU5fUkVTVUxUOiAweDAwMDAwMDI0LFx0Ly8gRGlyZWN0b3J5RW51bWVyYXRvclJlZk9wZW5SZXN1bHRcbiAgRElSX1JFQUQ6IDB4MDAwMDAwMjUsXHQvLyBEaXJlY3RvcnlFbnVtZXJhdG9yUmVmUmVhZFxuICBESVJfQ0xPU0U6IDB4MDAwMDAwMjYsXHQvLyBEaXJlY3RvcnlFbnVtZXJhdG9yUmVmQ2xvc2VcbiAgRklMRV9SRUFEX09GRlNFVDogMHgwMDAwMDAyNyxcdC8vIEZpbGVSZWZSZWFkV2l0aE9mZnNldFxuICBGSUxFX1dSSVRFX09GRlNFVDpcdDB4MDAwMDAwMjhcdC8vIEZpbGVSZWZXcml0ZVdpdGhPZmZzZXRcbn07XG5cbmNvbnN0IE9wZXJhdGlvbnNfQ29kZSA9IF8uaW52ZXJ0KE9wZXJhdGlvbnMpO1xuXG5mdW5jdGlvbiBvcGVyYXRpb25Db2RlIChjb2RlKSB7XG4gIHJldHVybiBPcGVyYXRpb25zX0NvZGVbY29kZV07XG59XG5cbmNvbnN0IEVycm9ycyA9IHtcbiAgU1VDQ0VTUzogMCxcbiAgVU5LTk9XTjogMSxcbiAgSU5WQUxJRF9IRUFERVI6IDIsXG4gIE5PX1JFU09VUkNFUzogMyxcbiAgUkVBRDogNCxcbiAgV1JJVEU6IDUsXG4gIFVOS05PV05fUEFDS0VUX1RZUEU6IDYsXG4gIElOVkFMSURfQVJHVU1FTlQ6IDcsXG4gIE9CSkVDVF9OT1RfRk9VTkQ6IDgsXG4gIE9CSkVDVF9JU19ESVJFQ1RPUlk6IDksXG4gIFBFUk1JU1NJT05fREVOSUVEOiAxMCxcbiAgTk9UX0NPTk5FQ1RFRDogMTEsXG4gIFRJTUVPVVQ6IDEyLFxuICBPVkVSUlVOOiAxMyxcbiAgRU9GOiAxNCxcbiAgVU5TVVBQT1JURUQ6IDE1LFxuICBPQkpFQ1RfRVhJU1RTOiAxNixcbiAgT0JKRUNUX0JVU1k6IDE3LFxuICBPTl9TUEFDRV9MRUZUOiAxOCxcbiAgV09VTERfQkxPQ0s6IDE5LFxuICBJTzogMjAsXG4gIElOVEVSUlVQVEVEOiAyMSxcbiAgSU5fUFJPR1JFU1M6IDIyLFxuICBJTlRFUk5BTDogMjMsXG59O1xuXG5jb25zdCBFcnJvcnNfQ29kZSA9IF8uaW52ZXJ0KEVycm9ycyk7XG5cbmZ1bmN0aW9uIGVycm9yQ29kZSAoY29kZSkge1xuICByZXR1cm4gRXJyb3JzX0NvZGVbY29kZV07XG59XG5cblxuY29uc3QgRmlsZU1vZGVzID0ge1xuICAncic6IDB4MDAwMDAwMDEsIC8vIE9fUkRPTkxZXG4gICdyKyc6IDB4MDAwMDAwMDIsIC8vIE9fUkRXUiAgIHwgT19DUkVBVFxuICAndyc6IDB4MDAwMDAwMDMsIC8vIE9fV1JPTkxZIHwgT19DUkVBVCAgfCBPX1RSVU5DXG4gICd3Kyc6IDB4MDAwMDAwMDQsIC8vIE9fUkRXUiAgIHwgT19DUkVBVCAgfCBPX1RSVU5DXG4gICdhJzogMHgwMDAwMDAwNSwgLy8gT19XUk9OTFkgfCBPX0FQUEVORCB8IE9fQ1JFQVRcbiAgJ2ErJzogMHgwMDAwMDAwNiwgLy8gT19SRFdSICAgfCBPX0FQUEVORCB8IE9fQ1JFQVRcbn07XG5cbmV4cG9ydCB7XG4gIE1BR0lDX05VTUJFUiwgQUZDX1BBQ0tFVF9IRUFERVJfU0laRSxcbiAgT3BlcmF0aW9ucywgb3BlcmF0aW9uQ29kZSxcbiAgRXJyb3JzLCBlcnJvckNv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