@rudderstack/integrations-lib 0.1.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 (108) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -0
  3. package/build/constants.d.ts +96 -0
  4. package/build/constants.d.ts.map +1 -0
  5. package/build/constants.js +180 -0
  6. package/build/errors/aborted_error.d.ts +5 -0
  7. package/build/errors/aborted_error.d.ts.map +1 -0
  8. package/build/errors/aborted_error.js +16 -0
  9. package/build/errors/base.d.ts +8 -0
  10. package/build/errors/base.d.ts.map +1 -0
  11. package/build/errors/base.js +14 -0
  12. package/build/errors/configuration_error.d.ts +5 -0
  13. package/build/errors/configuration_error.d.ts.map +1 -0
  14. package/build/errors/configuration_error.js +17 -0
  15. package/build/errors/index.d.ts +17 -0
  16. package/build/errors/index.d.ts.map +1 -0
  17. package/build/errors/index.js +33 -0
  18. package/build/errors/instrumentation_error.d.ts +5 -0
  19. package/build/errors/instrumentation_error.d.ts.map +1 -0
  20. package/build/errors/instrumentation_error.js +16 -0
  21. package/build/errors/invalid_auth_token_error.d.ts +5 -0
  22. package/build/errors/invalid_auth_token_error.d.ts.map +1 -0
  23. package/build/errors/invalid_auth_token_error.js +17 -0
  24. package/build/errors/network_error.d.ts +7 -0
  25. package/build/errors/network_error.d.ts.map +1 -0
  26. package/build/errors/network_error.js +28 -0
  27. package/build/errors/network_instrumentation_error.d.ts +5 -0
  28. package/build/errors/network_instrumentation_error.d.ts.map +1 -0
  29. package/build/errors/network_instrumentation_error.js +17 -0
  30. package/build/errors/oauth_secret_error.d.ts +5 -0
  31. package/build/errors/oauth_secret_error.d.ts.map +1 -0
  32. package/build/errors/oauth_secret_error.js +16 -0
  33. package/build/errors/platform_error.d.ts +5 -0
  34. package/build/errors/platform_error.d.ts.map +1 -0
  35. package/build/errors/platform_error.js +15 -0
  36. package/build/errors/redis_error.d.ts +5 -0
  37. package/build/errors/redis_error.d.ts.map +1 -0
  38. package/build/errors/redis_error.js +16 -0
  39. package/build/errors/retryable_error.d.ts +5 -0
  40. package/build/errors/retryable_error.d.ts.map +1 -0
  41. package/build/errors/retryable_error.js +16 -0
  42. package/build/errors/throttled_error.d.ts +5 -0
  43. package/build/errors/throttled_error.d.ts.map +1 -0
  44. package/build/errors/throttled_error.js +16 -0
  45. package/build/errors/transformation_error.d.ts +5 -0
  46. package/build/errors/transformation_error.d.ts.map +1 -0
  47. package/build/errors/transformation_error.js +15 -0
  48. package/build/errors/unauthorized_error.d.ts +5 -0
  49. package/build/errors/unauthorized_error.d.ts.map +1 -0
  50. package/build/errors/unauthorized_error.js +17 -0
  51. package/build/errors/unhandled_status_code_error.d.ts +5 -0
  52. package/build/errors/unhandled_status_code_error.d.ts.map +1 -0
  53. package/build/errors/unhandled_status_code_error.js +17 -0
  54. package/build/errors/unsupported_event_error.d.ts +5 -0
  55. package/build/errors/unsupported_event_error.d.ts.map +1 -0
  56. package/build/errors/unsupported_event_error.js +16 -0
  57. package/build/index.d.ts +7 -0
  58. package/build/index.d.ts.map +1 -0
  59. package/build/index.js +23 -0
  60. package/build/logger.d.ts +7 -0
  61. package/build/logger.d.ts.map +1 -0
  62. package/build/logger.js +39 -0
  63. package/build/network/clients/axios.d.ts +38 -0
  64. package/build/network/clients/axios.d.ts.map +1 -0
  65. package/build/network/clients/axios.js +197 -0
  66. package/build/network/clients/axios.test.d.ts +2 -0
  67. package/build/network/clients/axios.test.d.ts.map +1 -0
  68. package/build/network/clients/axios.test.js +231 -0
  69. package/build/network/clients/types.d.ts +32 -0
  70. package/build/network/clients/types.d.ts.map +1 -0
  71. package/build/network/clients/types.js +3 -0
  72. package/build/network/factory.d.ts +30 -0
  73. package/build/network/factory.d.ts.map +1 -0
  74. package/build/network/factory.js +46 -0
  75. package/build/network/factory.test.d.ts +2 -0
  76. package/build/network/factory.test.d.ts.map +1 -0
  77. package/build/network/factory.test.js +50 -0
  78. package/build/network/index.d.ts +2 -0
  79. package/build/network/index.d.ts.map +1 -0
  80. package/build/network/index.js +18 -0
  81. package/build/tags.d.ts +56 -0
  82. package/build/tags.d.ts.map +1 -0
  83. package/build/tags.js +59 -0
  84. package/build/types.d.ts +275 -0
  85. package/build/types.d.ts.map +1 -0
  86. package/build/types.js +34 -0
  87. package/build/utils/index.d.ts +4 -0
  88. package/build/utils/index.d.ts.map +1 -0
  89. package/build/utils/index.js +20 -0
  90. package/build/utils/json.d.ts +51 -0
  91. package/build/utils/json.d.ts.map +1 -0
  92. package/build/utils/json.js +507 -0
  93. package/build/utils/json.test.d.ts +2 -0
  94. package/build/utils/json.test.d.ts.map +1 -0
  95. package/build/utils/json.test.js +588 -0
  96. package/build/utils/misc.d.ts +129 -0
  97. package/build/utils/misc.d.ts.map +1 -0
  98. package/build/utils/misc.js +362 -0
  99. package/build/utils/misc.test.d.ts +2 -0
  100. package/build/utils/misc.test.d.ts.map +1 -0
  101. package/build/utils/misc.test.js +2059 -0
  102. package/build/utils/sem.d.ts +29 -0
  103. package/build/utils/sem.d.ts.map +1 -0
  104. package/build/utils/sem.js +196 -0
  105. package/build/utils/sem.test.d.ts +2 -0
  106. package/build/utils/sem.test.d.ts.map +1 -0
  107. package/build/utils/sem.test.js +237 -0
  108. package/package.json +69 -0
@@ -0,0 +1,507 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.JsonUtils = void 0;
30
+ const handlebars_1 = __importDefault(require("handlebars"));
31
+ const get_value_1 = __importDefault(require("get-value"));
32
+ const set_value_1 = __importDefault(require("set-value"));
33
+ const lodash_1 = require("lodash");
34
+ const logger = __importStar(require("../logger"));
35
+ const platform_error_1 = require("../errors/platform_error");
36
+ const sem_1 = require("./sem");
37
+ const instrumentation_error_1 = require("../errors/instrumentation_error");
38
+ const misc_1 = require("./misc");
39
+ const moment_timezone_1 = __importDefault(require("moment-timezone"));
40
+ const transformation_error_1 = require("../errors/transformation_error");
41
+ const constants_1 = require("../constants");
42
+ class JsonUtils {
43
+ /**
44
+ * Description: This method is used to handle the source keys operation
45
+ * @param message - the message object
46
+ * @returns {any} - returns the value of the source key
47
+ * if the source key is not present in the message
48
+ * returns null
49
+ *
50
+ */
51
+ static handleSourceKeysOperation({ message, operationObject, }) {
52
+ const { operation, args } = operationObject;
53
+ // populate the values from the arguments
54
+ // in the same order it is populated
55
+ const argValues = args.map((arg) => {
56
+ const { sourceKeys, defaultVal } = arg;
57
+ const val = (0, get_value_1.default)(message, sourceKeys);
58
+ if (val || val === false || val === 0) {
59
+ return val;
60
+ }
61
+ return defaultVal;
62
+ });
63
+ // quick sanity check for the undefined values in the list.
64
+ // if there is any undefined values, return null
65
+ // without going further for operations
66
+ const isAllDefined = (0, lodash_1.every)(argValues, (v) => !(0, lodash_1.isNil)(v));
67
+ if (!isAllDefined) {
68
+ return null;
69
+ }
70
+ // start handling operations
71
+ let result;
72
+ switch (operation) {
73
+ case 'multiplication':
74
+ result = 1;
75
+ for (const v of argValues) {
76
+ if ((0, lodash_1.isNumber)(v)) {
77
+ result *= v;
78
+ }
79
+ else {
80
+ // if there is a non number argument simply return null
81
+ // non numbers can't be operated arithmatically
82
+ return null;
83
+ }
84
+ }
85
+ return result;
86
+ case 'addition':
87
+ result = 0;
88
+ for (const v of argValues) {
89
+ if ((0, lodash_1.isNumber)(v)) {
90
+ result += v;
91
+ }
92
+ else {
93
+ // if there is a non number argument simply return null
94
+ // non numbers can't be operated arithmatically
95
+ return null;
96
+ }
97
+ }
98
+ return result;
99
+ default:
100
+ return null;
101
+ }
102
+ }
103
+ static checkTimestamp(validateTimestamp, formattedVal) {
104
+ const { allowedPastTimeDifference, allowedPastTimeUnit, // seconds, minutes, hours
105
+ allowedFutureTimeDifference, allowedFutureTimeUnit, // seconds, minutes, hours
106
+ } = validateTimestamp;
107
+ let pastTimeDifference;
108
+ let futureTimeDifference;
109
+ const currentTime = moment_timezone_1.default.unix(Number((0, moment_timezone_1.default)().format('X')));
110
+ const time = moment_timezone_1.default.unix(Number((0, moment_timezone_1.default)(formattedVal).format('X')));
111
+ switch (allowedPastTimeUnit) {
112
+ case 'seconds':
113
+ pastTimeDifference = Math.ceil(moment_timezone_1.default.duration(currentTime.diff(time)).asSeconds());
114
+ break;
115
+ case 'minutes':
116
+ pastTimeDifference = Math.ceil(moment_timezone_1.default.duration(currentTime.diff(time)).asMinutes());
117
+ break;
118
+ case 'hours':
119
+ pastTimeDifference = Math.ceil(moment_timezone_1.default.duration(currentTime.diff(time)).asHours());
120
+ break;
121
+ default:
122
+ break;
123
+ }
124
+ if (pastTimeDifference > allowedPastTimeDifference) {
125
+ throw new instrumentation_error_1.InstrumentationError(`Allowed timestamp is [${allowedPastTimeDifference} ${allowedPastTimeUnit}] into the past`);
126
+ }
127
+ if (pastTimeDifference <= 0) {
128
+ switch (allowedFutureTimeUnit) {
129
+ case 'seconds':
130
+ futureTimeDifference = Math.ceil(moment_timezone_1.default.duration(time.diff(currentTime)).asSeconds());
131
+ break;
132
+ case 'minutes':
133
+ futureTimeDifference = Math.ceil(moment_timezone_1.default.duration(time.diff(currentTime)).asMinutes());
134
+ break;
135
+ case 'hours':
136
+ futureTimeDifference = Math.ceil(moment_timezone_1.default.duration(time.diff(currentTime)).asHours());
137
+ break;
138
+ default:
139
+ break;
140
+ }
141
+ if (futureTimeDifference > allowedFutureTimeDifference) {
142
+ throw new instrumentation_error_1.InstrumentationError(`Allowed timestamp is [${allowedFutureTimeDifference} ${allowedFutureTimeUnit}] into the future`);
143
+ }
144
+ }
145
+ }
146
+ static formatValues(formattedVal, formattingType, typeFormat, integrationsObj) {
147
+ let curFormattedVal = formattedVal;
148
+ const formattingFunctions = {
149
+ timestamp: () => {
150
+ curFormattedVal = (0, misc_1.formatTimeStamp)(String(formattedVal), typeFormat);
151
+ },
152
+ secondTimestamp: () => {
153
+ if (!(0, moment_timezone_1.default)(String(formattedVal), 'x', true).isValid()) {
154
+ curFormattedVal = Math.floor((0, misc_1.formatTimeStamp)(String(formattedVal), typeFormat) / 1000);
155
+ }
156
+ },
157
+ microSecondTimestamp: () => {
158
+ const temp_val = moment_timezone_1.default.unix(Number((0, moment_timezone_1.default)(String(formattedVal)).format('X')));
159
+ curFormattedVal = temp_val.toDate().getTime() * 1000 + temp_val.toDate().getMilliseconds();
160
+ },
161
+ flatJson: () => {
162
+ curFormattedVal = (0, misc_1.flattenJson)(formattedVal);
163
+ },
164
+ encodeURIComponent: () => {
165
+ const t_val = formattedVal;
166
+ curFormattedVal = encodeURIComponent(t_val);
167
+ },
168
+ jsonStringify: () => {
169
+ curFormattedVal = JSON.stringify(formattedVal);
170
+ },
171
+ jsonStringifyOnFlatten: () => {
172
+ curFormattedVal = JSON.stringify((0, misc_1.flattenJson)(formattedVal));
173
+ },
174
+ dobInMMDD: () => {
175
+ curFormattedVal = String(formattedVal).slice(5);
176
+ curFormattedVal = String(curFormattedVal).replace('-', '/');
177
+ },
178
+ jsonStringifyOnObject: () => {
179
+ if (typeof formattedVal !== 'string') {
180
+ curFormattedVal = JSON.stringify(formattedVal);
181
+ }
182
+ },
183
+ numberForRevenue: () => {
184
+ if ((typeof formattedVal === 'string' || formattedVal instanceof String) &&
185
+ formattedVal.charAt(0) === '$') {
186
+ curFormattedVal = formattedVal.substring(1);
187
+ }
188
+ curFormattedVal = Number.parseFloat(Number(curFormattedVal || 0).toFixed(2));
189
+ if (Number.isNaN(curFormattedVal)) {
190
+ throw new instrumentation_error_1.InstrumentationError('Revenue is not in the correct format');
191
+ }
192
+ },
193
+ toString: () => {
194
+ curFormattedVal = String(formattedVal);
195
+ },
196
+ toNumber: () => {
197
+ curFormattedVal = Number(formattedVal);
198
+ },
199
+ toFloat: () => {
200
+ curFormattedVal = parseFloat(String(formattedVal));
201
+ },
202
+ toInt: () => {
203
+ curFormattedVal = parseInt(String(formattedVal), 10);
204
+ },
205
+ toLower: () => {
206
+ curFormattedVal = String(formattedVal).toLowerCase();
207
+ },
208
+ hashToSha256: () => {
209
+ curFormattedVal = integrationsObj?.hashed
210
+ ? String(formattedVal)
211
+ : (0, misc_1.hashToSha256)(String(formattedVal));
212
+ },
213
+ getOffsetInSec: () => {
214
+ curFormattedVal = (0, misc_1.getOffsetInSec)(String(formattedVal));
215
+ },
216
+ domainUrl: () => {
217
+ curFormattedVal = String(formattedVal).replace('https://', '').replace('http://', '');
218
+ },
219
+ domainUrlV2: () => {
220
+ const url = (0, misc_1.isValidUrl)(formattedVal);
221
+ if (!url) {
222
+ throw new instrumentation_error_1.InstrumentationError(`Invalid URL: ${formattedVal}`);
223
+ }
224
+ curFormattedVal = url.hostname.replace('www.', '');
225
+ },
226
+ IsBoolean: () => {
227
+ curFormattedVal = true;
228
+ if (!(typeof formattedVal === 'boolean')) {
229
+ logger.debug('Boolean value missing, so dropping it');
230
+ curFormattedVal = false;
231
+ }
232
+ },
233
+ trim: () => {
234
+ if (typeof formattedVal === 'string') {
235
+ curFormattedVal = formattedVal.trim();
236
+ }
237
+ },
238
+ };
239
+ if (formattingType in formattingFunctions) {
240
+ const formattingFunction = formattingFunctions[formattingType];
241
+ formattingFunction();
242
+ }
243
+ return curFormattedVal;
244
+ }
245
+ static handleExcludes(value, excludes, formattedVal) {
246
+ if (typeof value === 'object') {
247
+ // exclude the fields from the formattedVal
248
+ excludes.forEach((key) => {
249
+ delete formattedVal[key];
250
+ });
251
+ }
252
+ else {
253
+ logger.warn("excludes doesn't work with non-object data type. Ignoring excludes");
254
+ }
255
+ }
256
+ // format the value as per the metadata values
257
+ // Expected metadata keys are: (according to precedence)
258
+ // - - type, typeFormat: expected data type and its format
259
+ // - - template : need to have a handlebar expression {{value}}
260
+ // - - excludes : fields you want to strip of from the final value (works only for object)
261
+ // - - - - ex: "anonymousId", "userId" from traits
262
+ static handleMetadataForValue(value, metadata, destKey, integrationsObj) {
263
+ if (!metadata) {
264
+ return value;
265
+ }
266
+ // get information from metadata
267
+ const { type, typeFormat, template, defaultValue, excludes, multikeyMap, strictMultiMap, validateTimestamp, allowedKeyCheck, } = metadata;
268
+ // if value is null and defaultValue is supplied - use that
269
+ if (!(0, misc_1.isDefinedAndNotNull)(value)) {
270
+ return defaultValue || value;
271
+ }
272
+ // we've got a correct value. start processing
273
+ let formattedVal = value;
274
+ /**
275
+ * validate allowed time difference
276
+ */
277
+ if (validateTimestamp) {
278
+ formattedVal = Number(formattedVal);
279
+ if (Number.isNaN(formattedVal)) {
280
+ throw new transformation_error_1.TransformationError('Timestamp is not a number, cannot validate');
281
+ }
282
+ JsonUtils.checkTimestamp(validateTimestamp, formattedVal);
283
+ }
284
+ if (type) {
285
+ if (Array.isArray(type)) {
286
+ type.forEach((eachType) => {
287
+ formattedVal = JsonUtils.formatValues(formattedVal, eachType, typeFormat, integrationsObj);
288
+ });
289
+ }
290
+ else {
291
+ formattedVal = JsonUtils.formatValues(formattedVal, type, typeFormat, integrationsObj);
292
+ }
293
+ }
294
+ // handle template
295
+ if (template) {
296
+ formattedVal = JsonUtils.handleTemplate(template, value);
297
+ }
298
+ // handle excludes
299
+ if (excludes) {
300
+ JsonUtils.handleExcludes(value, excludes, formattedVal);
301
+ }
302
+ // handle multikeyMap
303
+ if (multikeyMap || strictMultiMap) {
304
+ formattedVal = JsonUtils.handleMultikeyMap(multikeyMap, strictMultiMap, formattedVal, destKey);
305
+ }
306
+ if (allowedKeyCheck) {
307
+ let foundVal = false;
308
+ if (Array.isArray(allowedKeyCheck)) {
309
+ allowedKeyCheck.some((key) => {
310
+ switch (key.type) {
311
+ case 'toLowerCase':
312
+ formattedVal = String(formattedVal).toLowerCase();
313
+ break;
314
+ case 'toUpperCase':
315
+ formattedVal = String(formattedVal).toUpperCase();
316
+ break;
317
+ default:
318
+ break;
319
+ }
320
+ if (key.sourceVal.includes(formattedVal)) {
321
+ foundVal = true;
322
+ return true;
323
+ }
324
+ return false;
325
+ });
326
+ }
327
+ if (!foundVal) {
328
+ formattedVal = undefined;
329
+ }
330
+ }
331
+ return formattedVal;
332
+ }
333
+ static handleTemplate(template, value) {
334
+ const hTemplate = handlebars_1.default.compile(template.trim());
335
+ const formattedVal = hTemplate({ value }).trim();
336
+ return formattedVal;
337
+ }
338
+ static handleMultikeyMap(multikeyMap, strictMultiMap, formattedVal, destKey) {
339
+ // sourceVal is expected to be an array
340
+ // if value is present in sourceVal, returns the destVal
341
+ // else returns the original value
342
+ // Expected multikeyMap value:
343
+ // "multikeyMap": [
344
+ // {
345
+ // "sourceVal": ["m", "M", "Male", "male"],
346
+ // "destVal": "M"
347
+ // },
348
+ // {
349
+ // "sourceVal": ["f", "F", "Female", "female"],
350
+ // "destVal": "F"
351
+ // }
352
+ // ]
353
+ let curFormattedVal = formattedVal;
354
+ const finalKeyMap = multikeyMap || strictMultiMap;
355
+ let foundVal = false;
356
+ if (Array.isArray(finalKeyMap)) {
357
+ finalKeyMap.some((map) => {
358
+ if (!map.sourceVal || !(0, misc_1.isDefinedAndNotNull)(map.destVal) || !Array.isArray(map.sourceVal)) {
359
+ logger.warn('multikeyMap skipped: sourceVal and destVal must be of valid type');
360
+ foundVal = true;
361
+ return true;
362
+ }
363
+ if (map.sourceVal.includes(String(formattedVal))) {
364
+ curFormattedVal = map.destVal;
365
+ foundVal = true;
366
+ return true;
367
+ }
368
+ return false;
369
+ });
370
+ }
371
+ else {
372
+ logger.warn('multikeyMap skipped: multikeyMap must be an array');
373
+ }
374
+ if (!foundVal) {
375
+ if (strictMultiMap) {
376
+ throw new instrumentation_error_1.InstrumentationError(`Invalid entry for key ${destKey}`);
377
+ }
378
+ else {
379
+ curFormattedVal = undefined;
380
+ }
381
+ }
382
+ return curFormattedVal;
383
+ }
384
+ /**
385
+ * Description: This method is used to get the value from the message
386
+ * based on the source keys
387
+ * @param message - the message object
388
+ * @param sourceKeys - the source keys to be used to get the value from the message
389
+ * @returns {any} - returns the value of the source key
390
+ * if the source key is not present in the message
391
+ * returns null
392
+ */
393
+ static getValueFromMessage(message, sourceKeys) {
394
+ if (Array.isArray(sourceKeys) && sourceKeys.length > 0) {
395
+ if (sourceKeys.length === 1) {
396
+ logger.warn('List with single element is not ideal. Use it as string instead');
397
+ }
398
+ // got the possible sourceKeys
399
+ // eslint-disable-next-line no-restricted-syntax
400
+ for (const sourceKey of sourceKeys) {
401
+ let val;
402
+ // if the sourceKey is an object we expect it to be a operation
403
+ if (typeof sourceKey === 'object') {
404
+ val = JsonUtils.handleSourceKeysOperation({
405
+ message,
406
+ operationObject: sourceKey,
407
+ });
408
+ }
409
+ else {
410
+ val = (0, get_value_1.default)(message, sourceKey);
411
+ }
412
+ if (val || val === false || val === 0) {
413
+ // return only if the value is valid.
414
+ // else look for next possible source in precedence
415
+ return val;
416
+ }
417
+ }
418
+ }
419
+ else if (typeof sourceKeys === 'string') {
420
+ // got a single key
421
+ // - we don't need to iterate over a loop for a single possible value
422
+ return (0, get_value_1.default)(message, sourceKeys);
423
+ }
424
+ else if (typeof sourceKeys === 'object') {
425
+ // if the sourceKey is an object we expect it to be a operation
426
+ return JsonUtils.handleSourceKeysOperation({
427
+ message,
428
+ operationObject: sourceKeys,
429
+ });
430
+ }
431
+ else {
432
+ // wrong sourceKey type. abort
433
+ // DEVELOPER ERROR
434
+ throw new platform_error_1.PlatformError('Wrong sourceKey type or blank sourceKey array');
435
+ }
436
+ return null;
437
+ }
438
+ /**
439
+ * Description: This method is used to get the value from the message
440
+ * based on the source key
441
+ * @param message - the message object
442
+ * @param sourceKey - the source key to be used to get the value from the message
443
+ * @returns {any} - returns the value of the source key
444
+ * if the source key is not present in the message
445
+ * returns null
446
+ */
447
+ static getFieldValueFromMessage(message, sourceKey) {
448
+ const sourceKeyMap = JsonUtils.MESSAGE_MAPPING[sourceKey];
449
+ if (sourceKeyMap) {
450
+ return JsonUtils.getValueFromMessage(message, sourceKeyMap);
451
+ }
452
+ return null;
453
+ }
454
+ /**
455
+ * Description: This method is used to construct the payload based on the mappingJson
456
+ * @param message - the message object
457
+ * @param mappingJson - the mappingJson to be used to construct the payload
458
+ * @param destinationName - the destination name to be used to get the mappingJson
459
+ * @returns {any} - returns the payload constructed based on the mappingJson
460
+ * if the mappingJson is not present in the message or blank
461
+ * returns null
462
+ */
463
+ static constructPayload(message, mappingJson, destinationName = '') {
464
+ // Mapping JSON should be an array
465
+ if (Array.isArray(mappingJson) && mappingJson.length > 0) {
466
+ // - construct a blank payload and return at the end
467
+ // - if you to need merge multiple constructPayload do it on the transformer code
468
+ // - - will give a cleaner approach
469
+ // - - you don't need to iterate over multiple loops to construct a payload for a single event
470
+ const payload = {};
471
+ mappingJson.forEach((mapping) => {
472
+ const { sourceKeys, destKey, required, metadata, sourceFromGenericMap, } = mapping;
473
+ // get the value from event, pass sourceFromGenericMap in the mapping to force this to take the
474
+ // sourcekeys from GenericFieldMapping, else take the sourceKeys from specific destination mapping sourceKeys
475
+ const integrationsObj = (0, lodash_1.isEmpty)(destinationName)
476
+ ? sem_1.SemanticUtil.getIntegrationsObj(message, destinationName)
477
+ : null;
478
+ const value = JsonUtils.handleMetadataForValue(sourceFromGenericMap
479
+ ? this.getFieldValueFromMessage(message, sourceKeys)
480
+ : this.getValueFromMessage(message, sourceKeys), metadata, destKey, integrationsObj);
481
+ if (value || value === 0 || value === false) {
482
+ if (destKey) {
483
+ // set the value only if correct
484
+ (0, set_value_1.default)(payload, destKey, value);
485
+ }
486
+ else {
487
+ // to set to root and flatten later
488
+ payload[''] = value;
489
+ }
490
+ }
491
+ else if (required) {
492
+ // throw error if reqired value is missing
493
+ throw new instrumentation_error_1.InstrumentationError(`Missing required value from ${JSON.stringify(sourceKeys)}`);
494
+ }
495
+ });
496
+ return payload;
497
+ }
498
+ // invalid mappingJson
499
+ return null;
500
+ }
501
+ static stringify(value) {
502
+ return JSON.stringify(value);
503
+ }
504
+ }
505
+ exports.JsonUtils = JsonUtils;
506
+ JsonUtils.MESSAGE_MAPPING = constants_1.GENERIC_MAPPING_CONFIG;
507
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9qc29uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNERBQW9DO0FBRXBDLDBEQUE0QjtBQUM1QiwwREFBNEI7QUFDNUIsbUNBQXlEO0FBR3pELGtEQUFvQztBQUNwQyw2REFBeUQ7QUFDekQsK0JBQXFDO0FBQ3JDLDJFQUF1RTtBQUN2RSxpQ0FPZ0I7QUFDaEIsc0VBQXFDO0FBQ3JDLHlFQUFxRTtBQUNyRSw0Q0FBc0Q7QUFxQnRELE1BQWEsU0FBUztJQUdwQjs7Ozs7OztPQU9HO0lBQ0ssTUFBTSxDQUFDLHlCQUF5QixDQUFDLEVBQ3ZDLE9BQU8sRUFDUCxlQUFlLEdBSWhCO1FBQ0MsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQUM7UUFFNUMseUNBQXlDO1FBQ3pDLG9DQUFvQztRQUNwQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDakMsTUFBTSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsR0FBRyxHQUFHLENBQUM7WUFDdkMsTUFBTSxHQUFHLEdBQUcsSUFBQSxtQkFBRyxFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNyQyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssS0FBSyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7Z0JBQ3JDLE9BQU8sR0FBRyxDQUFDO2FBQ1o7WUFDRCxPQUFPLFVBQVUsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztRQUVILDJEQUEyRDtRQUMzRCxnREFBZ0Q7UUFDaEQsdUNBQXVDO1FBQ3ZDLE1BQU0sWUFBWSxHQUFHLElBQUEsY0FBSyxFQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFBLGNBQUssRUFBQyxDQUFDLENBQUMsQ0FB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Q0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPLE9BQU8sQ0FBQztTQUNoQjtRQUVELHNCQUFzQjtRQUN0QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQWM7UUFDcEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7O0FBaGxCSCw4QkFpbEJDO0FBaGxCZ0IseUJBQWUsR0FBRyxrQ0FBc0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBIYW5kbGViYXJzIGZyb20gJ2hhbmRsZWJhcnMnO1xuaW1wb3J0IHsgUnVkZGVyU3RhY2tFdmVudCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBnZXQgZnJvbSAnZ2V0LXZhbHVlJztcbmltcG9ydCBzZXQgZnJvbSAnc2V0LXZhbHVlJztcbmltcG9ydCB7IGV2ZXJ5LCBpc0VtcHR5LCBpc05pbCwgaXNOdW1iZXIgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBQbGF0Zm9ybUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL3BsYXRmb3JtX2Vycm9yJztcbmltcG9ydCB7IFNlbWFudGljVXRpbCB9IGZyb20gJy4vc2VtJztcbmltcG9ydCB7IEluc3RydW1lbnRhdGlvbkVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2luc3RydW1lbnRhdGlvbl9lcnJvcic7XG5pbXBvcnQge1xuICBmbGF0dGVuSnNvbixcbiAgZm9ybWF0VGltZVN0YW1wLFxuICBnZXRPZmZzZXRJblNlYyxcbiAgaGFzaFRvU2hhMjU2LFxuICBpc0RlZmluZWRBbmROb3ROdWxsLFxuICBpc1ZhbGlkVXJsLFxufSBmcm9tICcuL21pc2MnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQtdGltZXpvbmUnO1xuaW1wb3J0IHsgVHJhbnNmb3JtYXRpb25FcnJvciB9IGZyb20gJy4uL2Vycm9ycy90cmFuc2Zvcm1hdGlvbl9lcnJvcic7XG5pbXBvcnQgeyBHRU5FUklDX01BUFBJTkdfQ09ORklHIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbnR5cGUgT3BlcmF0aW9uID0ge1xuICBvcGVyYXRpb246IHN0cmluZztcbiAgYXJnczogeyBzb3VyY2VLZXlzOiBzdHJpbmdbXTsgZGVmYXVsdFZhbD86IGFueSB9W107XG59O1xudHlwZSBNYXBwaW5nTWV0YWRhdGEgPSB7XG4gIHR5cGU/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgdHlwZUZvcm1hdD86IHN0cmluZztcbiAgdGVtcGxhdGU/OiBzdHJpbmc7XG4gIGRlZmF1bHRWYWx1ZT86IHVua25vd247XG4gIGV4Y2x1ZGVzPzogc3RyaW5nW107XG4gIG11bHRpa2V5TWFwPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9O1xuICBzdHJpY3RNdWx0aU1hcD86IHsgc291cmNlVmFsOiBzdHJpbmdbXTsgZGVzdFZhbDogc3RyaW5nIH1bXTtcbiAgdmFsaWRhdGVUaW1lc3RhbXA/OiB7XG4gICAgYWxsb3dlZEZ1dHVyZVRpbWVEaWZmZXJlbmNlOiBudW1iZXI7XG4gICAgYWxsb3dlZEZ1dHVyZVRpbWVVbml0OiBzdHJpbmc7XG4gICAgYWxsb3dlZFBhc3RUaW1lRGlmZmVyZW5jZTogbnVtYmVyO1xuICAgIGFsbG93ZWRQYXN0VGltZVVuaXQ6IHN0cmluZztcbiAgfTtcbiAgYWxsb3dlZEtleUNoZWNrPzogeyB0eXBlOiBzdHJpbmc7IHNvdXJjZVZhbDogc3RyaW5nW10gfVtdO1xufVxuZXhwb3J0IGNsYXNzIEpzb25VdGlscyB7XG4gIHByaXZhdGUgc3RhdGljIE1FU1NBR0VfTUFQUElORyA9IEdFTkVSSUNfTUFQUElOR19DT05GSUc7XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uOiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGhhbmRsZSB0aGUgc291cmNlIGtleXMgb3BlcmF0aW9uXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gdGhlIG1lc3NhZ2Ugb2JqZWN0XG4gICAqIEByZXR1cm5zXHR7YW55fVx0LSByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc291cmNlIGtleVxuICAgKiBcdFx0XHRcdFx0XHRpZiB0aGUgc291cmNlIGtleSBpcyBub3QgcHJlc2VudCBpbiB0aGUgbWVzc2FnZVxuICAgKiBcdFx0XHRcdFx0XHRyZXR1cm5zIG51bGxcbiAgICpcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGhhbmRsZVNvdXJjZUtleXNPcGVyYXRpb24oe1xuICAgIG1lc3NhZ2UsXG4gICAgb3BlcmF0aW9uT2JqZWN0LFxuICB9OiB7XG4gICAgbWVzc2FnZTogUnVkZGVyU3RhY2tFdmVudDtcbiAgICBvcGVyYXRpb25PYmplY3Q6IE9wZXJhdGlvbjtcbiAgfSk6IGFueSB7XG4gICAgY29uc3QgeyBvcGVyYXRpb24sIGFyZ3MgfSA9IG9wZXJhdGlvbk9iamVjdDtcblxuICAgIC8vIHBvcHVsYXRlIHRoZSB2YWx1ZXMgZnJvbSB0aGUgYXJndW1lbnRzXG4gICAgLy8gaW4gdGhlIHNhbWUgb3JkZXIgaXQgaXMgcG9wdWxhdGVkXG4gICAgY29uc3QgYXJnVmFsdWVzID0gYXJncy5tYXAoKGFyZykgPT4ge1xuICAgICAgY29uc3QgeyBzb3VyY2VLZXlzLCBkZWZhdWx0VmFsIH0gPSBhcmc7XG4gICAgICBjb25zdCB2YWwgPSBnZXQobWVzc2FnZSwgc291cmNlS2V5cyk7XG4gICAgICBpZiAodmFsIHx8IHZhbCA9PT0gZmFsc2UgfHwgdmFsID09PSAwKSB7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbDtcbiAgICB9KTtcblxuICAgIC8vIHF1aWNrIHNhbml0eSBjaGVjayBmb3IgdGhlIHVuZGVmaW5lZCB2YWx1ZXMgaW4gdGhlIGxpc3QuXG4gICAgLy8gaWYgdGhlcmUgaXMgYW55IHVuZGVmaW5lZCB2YWx1ZXMsIHJldHVybiBudWxsXG4gICAgLy8gd2l0aG91dCBnb2luZyBmdXJ0aGVyIGZvciBvcGVyYXRpb25zXG4gICAgY29uc3QgaXNBbGxEZWZpbmVkID0gZXZlcnkoYXJnVmFsdWVzLCAodikgPT4gIWlzTmlsKHYpKTtcbiAgICBpZiAoIWlzQWxsRGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gc3RhcnQgaGFuZGxpbmcgb3BlcmF0aW9uc1xuICAgIGxldCByZXN1bHQ6IG51bWJlcjtcbiAgICBzd2l0Y2ggKG9wZXJhdGlvbikge1xuICAgICAgY2FzZSAnbXVsdGlwbGljYXRpb24nOlxuICAgICAgICByZXN1bHQgPSAxO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgYXJnVmFsdWVzKSB7XG4gICAgICAgICAgaWYgKGlzTnVtYmVyKHYpKSB7XG4gICAgICAgICAgICByZXN1bHQgKj0gdjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBub24gbnVtYmVyIGFyZ3VtZW50IHNpbXBseSByZXR1cm4gbnVsbFxuICAgICAgICAgICAgLy8gbm9uIG51bWJlcnMgY2FuJ3QgYmUgb3BlcmF0ZWQgYXJpdGhtYXRpY2FsbHlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgY2FzZSAnYWRkaXRpb24nOlxuICAgICAgICByZXN1bHQgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgYXJnVmFsdWVzKSB7XG4gICAgICAgICAgaWYgKGlzTnVtYmVyKHYpKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gdjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBub24gbnVtYmVyIGFyZ3VtZW50IHNpbXBseSByZXR1cm4gbnVsbFxuICAgICAgICAgICAgLy8gbm9uIG51bWJlcnMgY2FuJ3QgYmUgb3BlcmF0ZWQgYXJpdGhtYXRpY2FsbHlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY2hlY2tUaW1lc3RhbXAoXG4gICAgdmFsaWRhdGVUaW1lc3RhbXA6IHtcbiAgICAgIGFsbG93ZWRGdXR1cmVUaW1lRGlmZmVyZW5jZTogbnVtYmVyO1xuICAgICAgYWxsb3dlZEZ1dHVyZVRpbWVVbml0OiBzdHJpbmc7XG4gICAgICBhbGxvd2VkUGFzdFRpbWVEaWZmZXJlbmNlOiBudW1iZXI7XG4gICAgICBhbGxvd2VkUGFzdFRpbWVVbml0OiBzdHJpbmc7XG4gICAgfSxcbiAgICBmb3JtYXR0ZWRWYWw6IG51bWJlcixcbiAgKSB7XG4gICAgY29uc3Qge1xuICAgICAgYWxsb3dlZFBhc3RUaW1lRGlmZmVyZW5jZSxcbiAgICAgIGFsbG93ZWRQYXN0VGltZVVuaXQsIC8vIHNlY29uZHMsIG1pbnV0ZXMsIGhvdXJzXG4gICAgICBhbGxvd2VkRnV0dXJlVGltZURpZmZlcmVuY2UsXG4gICAgICBhbGxvd2VkRnV0dXJlVGltZVVuaXQsIC8vIHNlY29uZHMsIG1pbnV0ZXMsIGhvdXJzXG4gICAgfSA9IHZhbGlkYXRlVGltZXN0YW1wO1xuXG4gICAgbGV0IHBhc3RUaW1lRGlmZmVyZW5jZTtcbiAgICBsZXQgZnV0dXJlVGltZURpZmZlcmVuY2U7XG5cbiAgICBjb25zdCBjdXJyZW50VGltZSA9IG1vbWVudC51bml4KE51bWJlcihtb21lbnQoKS5mb3JtYXQoJ1gnKSkpO1xuICAgIGNvbnN0IHRpbWUgPSBtb21lbnQudW5peChOdW1iZXIobW9tZW50KGZvcm1hdHRlZFZhbCkuZm9ybWF0KCdYJykpKTtcblxuICAgIHN3aXRjaCAoYWxsb3dlZFBhc3RUaW1lVW5pdCkge1xuICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgIHBhc3RUaW1lRGlmZmVyZW5jZSA9IE1hdGguY2VpbChtb21lbnQuZHVyYXRpb24oY3VycmVudFRpbWUuZGlmZih0aW1lKSkuYXNTZWNvbmRzKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgICBwYXN0VGltZURpZmZlcmVuY2UgPSBNYXRoLmNlaWwobW9tZW50LmR1cmF0aW9uKGN1cnJlbnRUaW1lLmRpZmYodGltZSkpLmFzTWludXRlcygpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIHBhc3RUaW1lRGlmZmVyZW5jZSA9IE1hdGguY2VpbChtb21lbnQuZHVyYXRpb24oY3VycmVudFRpbWUuZGlmZih0aW1lKSkuYXNIb3VycygpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocGFzdFRpbWVEaWZmZXJlbmNlID4gYWxsb3dlZFBhc3RUaW1lRGlmZmVyZW5jZSkge1xuICAgICAgdGhyb3cgbmV3IEluc3RydW1lbnRhdGlvbkVycm9yKFxuICAgICAgICBgQWxsb3dlZCB0aW1lc3RhbXAgaXMgWyR7YWxsb3dlZFBhc3RUaW1lRGlmZmVyZW5jZX0gJHthbGxvd2VkUGFzdFRpbWVVbml0fV0gaW50byB0aGUgcGFzdGAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwYXN0VGltZURpZmZlcmVuY2UgPD0gMCkge1xuICAgICAgc3dpdGNoIChhbGxvd2VkRnV0dXJlVGltZVVuaXQpIHtcbiAgICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgICAgZnV0dXJlVGltZURpZmZlcmVuY2UgPSBNYXRoLmNlaWwobW9tZW50LmR1cmF0aW9uKHRpbWUuZGlmZihjdXJyZW50VGltZSkpLmFzU2Vjb25kcygpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbWludXRlcyc6XG4gICAgICAgICAgZnV0dXJlVGltZURpZmZlcmVuY2UgPSBNYXRoLmNlaWwobW9tZW50LmR1cmF0aW9uKHRpbWUuZGlmZihjdXJyZW50VGltZSkpLmFzTWludXRlcygpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaG91cnMnOlxuICAgICAgICAgIGZ1dHVyZVRpbWVEaWZmZXJlbmNlID0gTWF0aC5jZWlsKG1vbWVudC5kdXJhdGlvbih0aW1lLmRpZmYoY3VycmVudFRpbWUpKS5hc0hvdXJzKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnV0dXJlVGltZURpZmZlcmVuY2UgPiBhbGxvd2VkRnV0dXJlVGltZURpZmZlcmVuY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEluc3RydW1lbnRhdGlvbkVycm9yKFxuICAgICAgICAgIGBBbGxvd2VkIHRpbWVzdGFtcCBpcyBbJHthbGxvd2VkRnV0dXJlVGltZURpZmZlcmVuY2V9ICR7YWxsb3dlZEZ1dHVyZVRpbWVVbml0fV0gaW50byB0aGUgZnV0dXJlYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBmb3JtYXRWYWx1ZXMoXG4gICAgZm9ybWF0dGVkVmFsOiB1bmtub3duLFxuICAgIGZvcm1hdHRpbmdUeXBlOiBzdHJpbmcsXG4gICAgdHlwZUZvcm1hdD86IHN0cmluZyxcbiAgICBpbnRlZ3JhdGlvbnNPYmo/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9LFxuICApIHtcbiAgICBsZXQgY3VyRm9ybWF0dGVkVmFsID0gZm9ybWF0dGVkVmFsO1xuXG4gICAgY29uc3QgZm9ybWF0dGluZ0Z1bmN0aW9ucyA9IHtcbiAgICAgIHRpbWVzdGFtcDogKCkgPT4ge1xuICAgICAgICBjdXJGb3JtYXR0ZWRWYWwgPSBmb3JtYXRUaW1lU3RhbXAoU3RyaW5nKGZvcm1hdHRlZFZhbCksIHR5cGVGb3JtYXQpO1xuICAgICAgfSxcbiAgICAgIHNlY29uZFRpbWVzdGFtcDogKCkgPT4ge1xuICAgICAgICBpZiAoIW1vbWVudChTdHJpbmcoZm9ybWF0dGVkVmFsKSwgJ3gnLCB0cnVlKS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICBjdXJGb3JtYXR0ZWRWYWwgPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgKGZvcm1hdFRpbWVTdGFtcChTdHJpbmcoZm9ybWF0dGVkVmFsKSwgdHlwZUZvcm1hdCkgYXMgbnVtYmVyKSAvIDEwMDAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG1pY3JvU2Vjb25kVGltZXN0YW1wOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRlbXBfdmFsID0gbW9tZW50LnVuaXgoTnVtYmVyKG1vbWVudChTdHJpbmcoZm9ybWF0dGVkVmFsKSkuZm9ybWF0KCdYJykpKTtcbiAgICAgICAgY3VyRm9ybWF0dGVkVmFsID0gdGVtcF92YWwudG9EYXRlKCkuZ2V0VGltZSgpICogMTAwMCArIHRlbXBfdmFsLnRvRGF0ZSgpLmdldE1pbGxpc2Vjb25kcygpO1xuICAgICAgfSxcbiAgICAgIGZsYXRKc29uOiAoKSA9PiB7XG4gICAgICAgIGN1ckZvcm1hdHRlZFZhbCA9IGZsYXR0ZW5Kc29uKGZvcm1hdHRlZFZhbCk7XG4gICAgICB9LFxuICAgICAgZW5jb2RlVVJJQ29tcG9uZW50OiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRfdmFsOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuID0gZm9ybWF0dGVkVmFsIGFzIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG4gICAgICAgIGN1ckZvcm1hdHRlZFZhbCA9IGVuY29kZVVSSUNvbXBvbmVudCh0X3ZhbCk7XG4gICAgICB9LFxuICAgICAganNvblN0cmluZ2lmeTogKCkgPT4ge1xuICAgICAgICBjdXJGb3JtYXR0ZWRWYWwgPSBKU09OLnN0cmluZ2lmeShmb3JtYXR0ZWRWYWwpO1xuICAgICAgfSxcbiAgICAgIGpzb25TdHJpbmdpZnlPbkZsYXR0ZW46ICgpID0+IHtcbiAgICAgICAgY3VyRm9ybWF0dGVkVmFsID0gSlNPTi5zdHJpbmdpZnkoZmxhdHRlbkpzb24oZm9ybWF0dGVkVmFsKSk7XG4gICAgICB9LFxuICAgICAgZG9iSW5NTUREOiAoKSA9PiB7XG4gICAgICAgIGN1ckZvcm1hdHRlZFZhbCA9IFN0cmluZyhmb3JtYXR0ZWRWYWwpLnNsaWNlKDUpO1xuICAgICAgICBjdXJGb3JtYXR0ZWRWYWwgPSBTdHJpbmcoY3VyRm9ybWF0dGVkVmFsKS5yZXBsYWNlKCctJywgJy8nKTtcbiAgICAgIH0sXG4gICAgICBqc29uU3RyaW5naWZ5T25PYmplY3Q6ICgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmb3JtYXR0ZWRWYWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY3VyRm9ybWF0dGVkVmFsID0gSlNPTi5zdHJpbmdpZnkoZm9ybWF0dGVkVmFsKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG51bWJlckZvclJldmVudWU6ICgpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICh0eXBlb2YgZm9ybWF0dGVkVmFsID09PSAnc3RyaW5nJyB8fCBmb3JtYXR0ZWRWYWwgaW5zdGFuY2VvZiBTdHJpbmcpICYmXG4gICAgICAgICAgZm9ybWF0dGVkVmFsLmNoYXJBdCgwKSA9PT0gJyQnXG4gICAgICAgICkge1xuICAgICAgICAgIGN1ckZvcm1hdHRlZFZhbCA9IGZvcm1hdHRlZFZhbC5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VyRm9ybWF0dGVkVmFsID0gTnVtYmVyLnBhcnNlRmxvYXQoTnVtYmVyKGN1ckZvcm1hdHRlZFZhbCB8fCAwKS50b0ZpeGVkKDIpKTtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTihjdXJGb3JtYXR0ZWRWYWwpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEluc3RydW1lbnRhdGlvbkVycm9yKCdSZXZlbnVlIGlzIG5vdCBpbiB0aGUgY29ycmVjdCBmb3JtYXQnKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRvU3RyaW5nOiAoKSA9PiB7XG4gICAgICAgIGN1ckZvcm1hdHRlZFZhbCA9IFN0cmluZyhmb3JtYXR0ZWRWYWwpO1xuICAgICAgfSxcbiAgICAgIHRvTnVtYmVyOiAoKSA9PiB7XG4gICAgICAgIGN1ckZvcm1hdHRlZFZhbCA9IE51bWJlcihmb3JtYXR0ZWRWYWwpO1xuICAgICAgfSxcbiAgICAgIHRvRmxvYXQ6ICgpID0+IHtcbiAgICAgICAgY3VyRm9ybWF0dGVkVmFsID0gcGFyc2VGbG9hdChTdHJpbmcoZm9ybWF0dGVkVmFsKSk7XG4gICAgICB9LFxuICAgICAgdG9JbnQ6ICgpID0+IHtcbiAgICAgICAgY3VyRm9ybWF0dGVkVmFsID0gcGFyc2VJbnQoU3RyaW5nKGZvcm1hdHRlZFZhbCksIDEwKTtcbiAgICAgIH0sXG4gICAgICB0b0xvd2VyOiAoKSA9PiB7XG4gICAgICAgIGN1ckZvcm1hdHRlZFZhbCA9IFN0cmluZyhmb3JtYXR0ZWRWYWwpLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9LFxuICAgICAgaGFzaFRvU2hhMjU2OiAoKSA9PiB7XG4gICAgICAgIGN1ckZvcm1hdHRlZFZhbCA9IGludGVncmF0aW9uc09iaj8uaGFzaGVkXG4gICAgICAgICAgPyBTdHJpbmcoZm9ybWF0dGVkVmFsKVxuICAgICAgICAgIDogaGFzaFRvU2hhMjU2KFN0cmluZyhmb3JtYXR0ZWRWYWwpKTtcbiAgICAgIH0sXG4gICAgICBnZXRPZmZzZXRJblNlYzogKCkgPT4ge1xuICAgICAgICBjdXJGb3JtYXR0ZWRWYWwgPSBnZXRPZmZzZXRJblNlYyhTdHJpbmcoZm9ybWF0dGVkVmFsKSk7XG4gICAgICB9LFxuICAgICAgZG9tYWluVXJsOiAoKSA9PiB7XG4gICAgICAgIGN1ckZvcm1hdHRlZFZhbCA9IFN0cmluZyhmb3JtYXR0ZWRWYWwpLnJlcGxhY2UoJ2h0dHBzOi8vJywgJycpLnJlcGxhY2UoJ2h0dHA6Ly8nLCAnJyk7XG4gICAgICB9LFxuICAgICAgZG9tYWluVXJsVjI6ICgpID0+IHtcbiAgICAgICAgY29uc3QgdXJsID0gaXNWYWxpZFVybChmb3JtYXR0ZWRWYWwgYXMgc3RyaW5nIHwgVVJMKTtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW5zdHJ1bWVudGF0aW9uRXJyb3IoYEludmFsaWQgVVJMOiAke2Zvcm1hdHRlZFZhbH1gKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJGb3JtYXR0ZWRWYWwgPSB1cmwuaG9zdG5hbWUucmVwbGFjZSgnd3d3LicsICcnKTtcbiAgICAgIH0sXG4gICAgICBJc0Jvb2xlYW46ICgpID0+IHtcbiAgICAgICAgY3VyRm9ybWF0dGVkVmFsID0gdHJ1ZTtcbiAgICAgICAgaWYgKCEodHlwZW9mIGZvcm1hdHRlZFZhbCA9PT0gJ2Jvb2xlYW4nKSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQm9vbGVhbiB2YWx1ZSBtaXNzaW5nLCBzbyBkcm9wcGluZyBpdCcpO1xuICAgICAgICAgIGN1ckZvcm1hdHRlZFZhbCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHJpbTogKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGZvcm1hdHRlZFZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBjdXJGb3JtYXR0ZWRWYWwgPSBmb3JtYXR0ZWRWYWwudHJpbSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG5cbiAgICBpZiAoZm9ybWF0dGluZ1R5cGUgaW4gZm9ybWF0dGluZ0Z1bmN0aW9ucykge1xuICAgICAgY29uc3QgZm9ybWF0dGluZ0Z1bmN0aW9uID0gZm9ybWF0dGluZ0Z1bmN0aW9uc1tmb3JtYXR0aW5nVHlwZV07XG4gICAgICBmb3JtYXR0aW5nRnVuY3Rpb24oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VyRm9ybWF0dGVkVmFsO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaGFuZGxlRXhjbHVkZXMoXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgZXhjbHVkZXM6IHN0cmluZ1tdLFxuICAgIGZvcm1hdHRlZFZhbDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSxcbiAgKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vIGV4Y2x1ZGUgdGhlIGZpZWxkcyBmcm9tIHRoZSBmb3JtYXR0ZWRWYWxcbiAgICAgIGV4Y2x1ZGVzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBkZWxldGUgZm9ybWF0dGVkVmFsW2tleV07XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLndhcm4oXCJleGNsdWRlcyBkb2Vzbid0IHdvcmsgd2l0aCBub24tb2JqZWN0IGRhdGEgdHlwZS4gSWdub3JpbmcgZXhjbHVkZXNcIik7XG4gICAgfVxuICB9XG5cbiAgLy8gZm9ybWF0IHRoZSB2YWx1ZSBhcyBwZXIgdGhlIG1ldGFkYXRhIHZhbHVlc1xuICAvLyBFeHBlY3RlZCBtZXRhZGF0YSBrZXlzIGFyZTogKGFjY29yZGluZyB0byBwcmVjZWRlbmNlKVxuICAvLyAtIC0gdHlwZSwgdHlwZUZvcm1hdDogZXhwZWN0ZWQgZGF0YSB0eXBlIGFuZCBpdHMgZm9ybWF0XG4gIC8vIC0gLSB0ZW1wbGF0ZSA6IG5lZWQgdG8gaGF2ZSBhIGhhbmRsZWJhciBleHByZXNzaW9uIHt7dmFsdWV9fVxuICAvLyAtIC0gZXhjbHVkZXMgOiBmaWVsZHMgeW91IHdhbnQgdG8gc3RyaXAgb2YgZnJvbSB0aGUgZmluYWwgdmFsdWUgKHdvcmtzIG9ubHkgZm9yIG9iamVjdClcbiAgLy8gLSAtIC0gLSBleDogXCJhbm9ueW1vdXNJZFwiLCBcInVzZXJJZFwiIGZyb20gdHJhaXRzXG4gIHByaXZhdGUgc3RhdGljIGhhbmRsZU1ldGFkYXRhRm9yVmFsdWUoXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgbWV0YWRhdGE6IE1hcHBpbmdNZXRhZGF0YSxcbiAgICBkZXN0S2V5OiBzdHJpbmcsXG4gICAgaW50ZWdyYXRpb25zT2JqOiB1bmtub3duLFxuICApIHtcbiAgICBpZiAoIW1ldGFkYXRhKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGluZm9ybWF0aW9uIGZyb20gbWV0YWRhdGFcbiAgICBjb25zdCB7XG4gICAgICB0eXBlLFxuICAgICAgdHlwZUZvcm1hdCxcbiAgICAgIHRlbXBsYXRlLFxuICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgZXhjbHVkZXMsXG4gICAgICBtdWx0aWtleU1hcCxcbiAgICAgIHN0cmljdE11bHRpTWFwLFxuICAgICAgdmFsaWRhdGVUaW1lc3RhbXAsXG4gICAgICBhbGxvd2VkS2V5Q2hlY2ssXG4gICAgfSA9IG1ldGFkYXRhO1xuXG4gICAgLy8gaWYgdmFsdWUgaXMgbnVsbCBhbmQgZGVmYXVsdFZhbHVlIGlzIHN1cHBsaWVkIC0gdXNlIHRoYXRcbiAgICBpZiAoIWlzRGVmaW5lZEFuZE5vdE51bGwodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlIHx8IHZhbHVlO1xuICAgIH1cbiAgICAvLyB3ZSd2ZSBnb3QgYSBjb3JyZWN0IHZhbHVlLiBzdGFydCBwcm9jZXNzaW5nXG4gICAgbGV0IGZvcm1hdHRlZFZhbCA9IHZhbHVlO1xuXG4gICAgLyoqXG4gICAgICogdmFsaWRhdGUgYWxsb3dlZCB0aW1lIGRpZmZlcmVuY2VcbiAgICAgKi9cbiAgICBpZiAodmFsaWRhdGVUaW1lc3RhbXApIHtcbiAgICAgIGZvcm1hdHRlZFZhbCA9IE51bWJlcihmb3JtYXR0ZWRWYWwpO1xuICAgICAgaWYgKE51bWJlci5pc05hTihmb3JtYXR0ZWRWYWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1hdGlvbkVycm9yKCdUaW1lc3RhbXAgaXMgbm90IGEgbnVtYmVyLCBjYW5ub3QgdmFsaWRhdGUnKTtcbiAgICAgIH1cbiAgICAgIEpzb25VdGlscy5jaGVja1RpbWVzdGFtcCh2YWxpZGF0ZVRpbWVzdGFtcCwgZm9ybWF0dGVkVmFsIGFzIG51bWJlcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgICAgIHR5cGUuZm9yRWFjaCgoZWFjaFR5cGUpID0+IHtcbiAgICAgICAgICBmb3JtYXR0ZWRWYWwgPSBKc29uVXRpbHMuZm9ybWF0VmFsdWVzKFxuICAgICAgICAgICAgZm9ybWF0dGVkVmFsLFxuICAgICAgICAgICAgZWFjaFR5cGUsXG4gICAgICAgICAgICB0eXBlRm9ybWF0LFxuICAgICAgICAgICAgaW50ZWdyYXRpb25zT2JqIGFzIHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybWF0dGVkVmFsID0gSnNvblV0aWxzLmZvcm1hdFZhbHVlcyhcbiAgICAgICAgICBmb3JtYXR0ZWRWYWwsXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICB0eXBlRm9ybWF0LFxuICAgICAgICAgIGludGVncmF0aW9uc09iaiBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgdGVtcGxhdGVcbiAgICBpZiAodGVtcGxhdGUpIHtcbiAgICAgIGZvcm1hdHRlZFZhbCA9IEpzb25VdGlscy5oYW5kbGVUZW1wbGF0ZSh0ZW1wbGF0ZSwgdmFsdWUgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgZXhjbHVkZXNcbiAgICBpZiAoZXhjbHVkZXMpIHtcbiAgICAgIEpzb25VdGlscy5oYW5kbGVFeGNsdWRlcyh2YWx1ZSwgZXhjbHVkZXMsIGZvcm1hdHRlZFZhbCBhcyB7IFtrZXk6IHN0cmluZ106IGFueSB9KTtcbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgbXVsdGlrZXlNYXBcbiAgICBpZiAobXVsdGlrZXlNYXAgfHwgc3RyaWN0TXVsdGlNYXApIHtcbiAgICAgIGZvcm1hdHRlZFZhbCA9IEpzb25VdGlscy5oYW5kbGVNdWx0aWtleU1hcChcbiAgICAgICAgbXVsdGlrZXlNYXAsXG4gICAgICAgIHN0cmljdE11bHRpTWFwLFxuICAgICAgICBmb3JtYXR0ZWRWYWwsXG4gICAgICAgIGRlc3RLZXksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhbGxvd2VkS2V5Q2hlY2spIHtcbiAgICAgIGxldCBmb3VuZFZhbCA9IGZhbHNlO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYWxsb3dlZEtleUNoZWNrKSkge1xuICAgICAgICBhbGxvd2VkS2V5Q2hlY2suc29tZSgoa2V5KSA9PiB7XG4gICAgICAgICAgc3dpdGNoIChrZXkudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAndG9Mb3dlckNhc2UnOlxuICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWwgPSBTdHJpbmcoZm9ybWF0dGVkVmFsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3RvVXBwZXJDYXNlJzpcbiAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsID0gU3RyaW5nKGZvcm1hdHRlZFZhbCkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGtleS5zb3VyY2VWYWwuaW5jbHVkZXMoZm9ybWF0dGVkVmFsIGFzIGFueSkpIHtcbiAgICAgICAgICAgIGZvdW5kVmFsID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCFmb3VuZFZhbCkge1xuICAgICAgICBmb3JtYXR0ZWRWYWwgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdHRlZFZhbDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGhhbmRsZVRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBoVGVtcGxhdGUgPSBIYW5kbGViYXJzLmNvbXBpbGUodGVtcGxhdGUudHJpbSgpKTtcbiAgICBjb25zdCBmb3JtYXR0ZWRWYWwgPSBoVGVtcGxhdGUoeyB2YWx1ZSB9KS50cmltKCk7XG4gICAgcmV0dXJuIGZvcm1hdHRlZFZhbDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGhhbmRsZU11bHRpa2V5TWFwKFxuICAgIG11bHRpa2V5TWFwOlxuICAgICAgfCB7XG4gICAgICAgICAgW2tleTogc3RyaW5nXTogc3RyaW5nW107XG4gICAgICAgIH1cbiAgICAgIHwgdW5kZWZpbmVkLFxuICAgIHN0cmljdE11bHRpTWFwOlxuICAgICAgfCB7XG4gICAgICAgICAgc291cmNlVmFsOiBzdHJpbmdbXTtcbiAgICAgICAgICBkZXN0VmFsOiBzdHJpbmc7XG4gICAgICAgIH1bXVxuICAgICAgfCB1bmRlZmluZWQsXG4gICAgZm9ybWF0dGVkVmFsOiB1bmtub3duLFxuICAgIGRlc3RLZXk6IHN0cmluZyxcbiAgKSB7XG4gICAgLy8gc291cmNlVmFsIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5XG4gICAgLy8gaWYgdmFsdWUgaXMgcHJlc2VudCBpbiBzb3VyY2VWYWwsIHJldHVybnMgdGhlIGRlc3RWYWxcbiAgICAvLyBlbHNlIHJldHVybnMgdGhlIG9yaWdpbmFsIHZhbHVlXG4gICAgLy8gRXhwZWN0ZWQgbXVsdGlrZXlNYXAgdmFsdWU6XG4gICAgLy8gXCJtdWx0aWtleU1hcFwiOiBbXG4gICAgLy8gICB7XG4gICAgLy8gICAgIFwic291cmNlVmFsXCI6IFtcIm1cIiwgXCJNXCIsIFwiTWFsZVwiLCBcIm1hbGVcIl0sXG4gICAgLy8gICAgIFwiZGVzdFZhbFwiOiBcIk1cIlxuICAgIC8vICAgfSxcbiAgICAvLyAgIHtcbiAgICAvLyAgICAgXCJzb3VyY2VWYWxcIjogW1wiZlwiLCBcIkZcIiwgXCJGZW1hbGVcIiwgXCJmZW1hbGVcIl0sXG4gICAgLy8gICAgIFwiZGVzdFZhbFwiOiBcIkZcIlxuICAgIC8vICAgfVxuICAgIC8vIF1cbiAgICBsZXQgY3VyRm9ybWF0dGVkVmFsID0gZm9ybWF0dGVkVmFsO1xuICAgIGNvbnN0IGZpbmFsS2V5TWFwID0gbXVsdGlrZXlNYXAgfHwgc3RyaWN0TXVsdGlNYXA7XG4gICAgbGV0IGZvdW5kVmFsID0gZmFsc2U7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmluYWxLZXlNYXApKSB7XG4gICAgICBmaW5hbEtleU1hcC5zb21lKChtYXApID0+IHtcbiAgICAgICAgaWYgKCFtYXAuc291cmNlVmFsIHx8ICFpc0RlZmluZWRBbmROb3ROdWxsKG1hcC5kZXN0VmFsKSB8fCAhQXJyYXkuaXNBcnJheShtYXAuc291cmNlVmFsKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdtdWx0aWtleU1hcCBza2lwcGVkOiBzb3VyY2VWYWwgYW5kIGRlc3RWYWwgbXVzdCBiZSBvZiB2YWxpZCB0eXBlJyk7XG4gICAgICAgICAgZm91bmRWYWwgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hcC5zb3VyY2VWYWwuaW5jbHVkZXMoU3RyaW5nKGZvcm1hdHRlZFZhbCkpKSB7XG4gICAgICAgICAgY3VyRm9ybWF0dGVkVmFsID0gbWFwLmRlc3RWYWw7XG4gICAgICAgICAgZm91bmRWYWwgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci53YXJuKCdtdWx0aWtleU1hcCBza2lwcGVkOiBtdWx0aWtleU1hcCBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIGlmICghZm91bmRWYWwpIHtcbiAgICAgIGlmIChzdHJpY3RNdWx0aU1hcCkge1xuICAgICAgICB0aHJvdyBuZXcgSW5zdHJ1bWVudGF0aW9uRXJyb3IoYEludmFsaWQgZW50cnkgZm9yIGtleSAke2Rlc3RLZXl9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJGb3JtYXR0ZWRWYWwgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdXJGb3JtYXR0ZWRWYWw7XG4gIH1cblxuICAvKipcbiAgICogRGVzY3JpcHRpb246IFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBtZXNzYWdlXG4gICAqIFx0XHRcdFx0XHRcdCAgYmFzZWQgb24gdGhlIHNvdXJjZSBrZXlzXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gdGhlIG1lc3NhZ2Ugb2JqZWN0XG4gICAqIEBwYXJhbSBzb3VyY2VLZXlzIC0gdGhlIHNvdXJjZSBrZXlzIHRvIGJlIHVzZWQgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBtZXNzYWdlXG4gICAqIEByZXR1cm5zICB7YW55fSAtIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzb3VyY2Uga2V5XG4gICAqICAgICAgICAgICAgIGlmIHRoZSBzb3VyY2Uga2V5IGlzIG5vdCBwcmVzZW50IGluIHRoZSBtZXNzYWdlXG4gICAqICAgICAgICAgICAgcmV0dXJucyBudWxsXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldFZhbHVlRnJvbU1lc3NhZ2UoXG4gICAgbWVzc2FnZTogUnVkZGVyU3RhY2tFdmVudCxcbiAgICBzb3VyY2VLZXlzOiAoc3RyaW5nIHwgb2JqZWN0KVtdIHwgc3RyaW5nIHwgb2JqZWN0LFxuICApOiBhbnkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZUtleXMpICYmIHNvdXJjZUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHNvdXJjZUtleXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdMaXN0IHdpdGggc2luZ2xlIGVsZW1lbnQgaXMgbm90IGlkZWFsLiBVc2UgaXQgYXMgc3RyaW5nIGluc3RlYWQnKTtcbiAgICAgIH1cbiAgICAgIC8vIGdvdCB0aGUgcG9zc2libGUgc291cmNlS2V5c1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICBmb3IgKGNvbnN0IHNvdXJjZUtleSBvZiBzb3VyY2VLZXlzKSB7XG4gICAgICAgIGxldCB2YWw6IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBBcnJheTxhbnk+IHwgT2JqZWN0IHwgbnVsbDtcbiAgICAgICAgLy8gaWYgdGhlIHNvdXJjZUtleSBpcyBhbiBvYmplY3Qgd2UgZXhwZWN0IGl0IHRvIGJlIGEgb3BlcmF0aW9uXG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlS2V5ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHZhbCA9IEpzb25VdGlscy5oYW5kbGVTb3VyY2VLZXlzT3BlcmF0aW9uKHtcbiAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICBvcGVyYXRpb25PYmplY3Q6IHNvdXJjZUtleSBhcyBPcGVyYXRpb24sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gZ2V0KG1lc3NhZ2UsIHNvdXJjZUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbCB8fCB2YWwgPT09IGZhbHNlIHx8IHZhbCA9PT0gMCkge1xuICAgICAgICAgIC8vIHJldHVybiBvbmx5IGlmIHRoZSB2YWx1ZSBpcyB2YWxpZC5cbiAgICAgICAgICAvLyBlbHNlIGxvb2sgZm9yIG5leHQgcG9zc2libGUgc291cmNlIGluIHByZWNlZGVuY2VcbiAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc291cmNlS2V5cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIGdvdCBhIHNpbmdsZSBrZXlcbiAgICAgIC8vIC0gd2UgZG9uJ3QgbmVlZCB0byBpdGVyYXRlIG92ZXIgYSBsb29wIGZvciBhIHNpbmdsZSBwb3NzaWJsZSB2YWx1ZVxuICAgICAgcmV0dXJuIGdldChtZXNzYWdlLCBzb3VyY2VLZXlzKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2VLZXlzID09PSAnb2JqZWN0Jykge1xuICAgICAgLy8gaWYgdGhlIHNvdXJjZUtleSBpcyBhbiBvYmplY3Qgd2UgZXhwZWN0IGl0IHRvIGJlIGEgb3BlcmF0aW9uXG4gICAgICByZXR1cm4gSnNvblV0aWxzLmhhbmRsZVNvdXJjZUtleXNPcGVyYXRpb24oe1xuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBvcGVyYXRpb25PYmplY3Q6IHNvdXJjZUtleXMgYXMgeyBvcGVyYXRpb246IHN0cmluZzsgYXJnczogYW55W10gfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB3cm9uZyBzb3VyY2VLZXkgdHlwZS4gYWJvcnRcbiAgICAgIC8vIERFVkVMT1BFUiBFUlJPUlxuICAgICAgdGhyb3cgbmV3IFBsYXRmb3JtRXJyb3IoJ1dyb25nIHNvdXJjZUtleSB0eXBlIG9yIGJsYW5rIHNvdXJjZUtleSBhcnJheScpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbjogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIG1lc3NhZ2VcbiAgICogICAgICAgICAgICAgICBiYXNlZCBvbiB0aGUgc291cmNlIGtleVxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIHRoZSBtZXNzYWdlIG9iamVjdFxuICAgKiBAcGFyYW0gc291cmNlS2V5IC0gdGhlIHNvdXJjZSBrZXkgdG8gYmUgdXNlZCB0byBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIG1lc3NhZ2VcbiAgICogQHJldHVybnMgIHthbnl9IC0gcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNvdXJjZSBrZXlcbiAgICogICAgICAgICAgICBpZiB0aGUgc291cmNlIGtleSBpcyBub3QgcHJlc2VudCBpbiB0aGUgbWVzc2FnZVxuICAgKiAgICAgICAgICAgcmV0dXJucyBudWxsXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEZpZWxkVmFsdWVGcm9tTWVzc2FnZShtZXNzYWdlOiBSdWRkZXJTdGFja0V2ZW50LCBzb3VyY2VLZXk6IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3Qgc291cmNlS2V5TWFwID0gSnNvblV0aWxzLk1FU1NBR0VfTUFQUElOR1tzb3VyY2VLZXldO1xuICAgIGlmIChzb3VyY2VLZXlNYXApIHtcbiAgICAgIHJldHVybiBKc29uVXRpbHMuZ2V0VmFsdWVGcm9tTWVzc2FnZShtZXNzYWdlLCBzb3VyY2VLZXlNYXApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbjogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIHBheWxvYWQgYmFzZWQgb24gdGhlIG1hcHBpbmdKc29uXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gdGhlIG1lc3NhZ2Ugb2JqZWN0XG4gICAqIEBwYXJhbSBtYXBwaW5nSnNvbiAtIHRoZSBtYXBwaW5nSnNvbiB0byBiZSB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgcGF5bG9hZFxuICAgKiBAcGFyYW0gZGVzdGluYXRpb25OYW1lIC0gdGhlIGRlc3RpbmF0aW9uIG5hbWUgdG8gYmUgdXNlZCB0byBnZXQgdGhlIG1hcHBpbmdKc29uXG4gICAqIEByZXR1cm5zICB7YW55fSAtIHJldHVybnMgdGhlIHBheWxvYWQgY29uc3RydWN0ZWQgYmFzZWQgb24gdGhlIG1hcHBpbmdKc29uXG4gICAqICAgICAgICAgICBpZiB0aGUgbWFwcGluZ0pzb24gaXMgbm90IHByZXNlbnQgaW4gdGhlIG1lc3NhZ2Ugb3IgYmxhbmtcbiAgICogICAgICAgICAgIHJldHVybnMgbnVsbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjb25zdHJ1Y3RQYXlsb2FkKFxuICAgIG1lc3NhZ2U6IFJ1ZGRlclN0YWNrRXZlbnQsXG4gICAgbWFwcGluZ0pzb246IGFueVtdLFxuICAgIGRlc3RpbmF0aW9uTmFtZTogc3RyaW5nID0gJycsXG4gICk6IGFueSB7XG4gICAgLy8gTWFwcGluZyBKU09OIHNob3VsZCBiZSBhbiBhcnJheVxuICAgIGlmIChBcnJheS5pc0FycmF5KG1hcHBpbmdKc29uKSAmJiBtYXBwaW5nSnNvbi5sZW5ndGggPiAwKSB7XG4gICAgICAvLyAtIGNvbnN0cnVjdCBhIGJsYW5rIHBheWxvYWQgYW5kIHJldHVybiBhdCB0aGUgZW5kXG4gICAgICAvLyAtIGlmIHlvdSB0byBuZWVkIG1lcmdlIG11bHRpcGxlIGNvbnN0cnVjdFBheWxvYWQgZG8gaXQgb24gdGhlIHRyYW5zZm9ybWVyIGNvZGVcbiAgICAgIC8vIC0gLSB3aWxsIGdpdmUgYSBjbGVhbmVyIGFwcHJvYWNoXG4gICAgICAvLyAtIC0geW91IGRvbid0IG5lZWQgdG8gaXRlcmF0ZSBvdmVyIG11bHRpcGxlIGxvb3BzIHRvIGNvbnN0cnVjdCBhIHBheWxvYWQgZm9yIGEgc2luZ2xlIGV2ZW50XG4gICAgICBjb25zdCBwYXlsb2FkID0ge307XG5cbiAgICAgIG1hcHBpbmdKc29uLmZvckVhY2goKG1hcHBpbmcpID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHNvdXJjZUtleXMsXG4gICAgICAgICAgZGVzdEtleSxcbiAgICAgICAgICByZXF1aXJlZCxcbiAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICBzb3VyY2VGcm9tR2VuZXJpY01hcCxcbiAgICAgICAgfToge1xuICAgICAgICAgIHNvdXJjZUtleXM6IChzdHJpbmcgfCBvYmplY3QpW10gfCBzdHJpbmcgfCBvYmplY3Q7XG4gICAgICAgICAgZGVzdEtleTogc3RyaW5nO1xuICAgICAgICAgIHJlcXVpcmVkOiBib29sZWFuO1xuICAgICAgICAgIG1ldGFkYXRhOiBNYXBwaW5nTWV0YWRhdGE7XG4gICAgICAgICAgc291cmNlRnJvbUdlbmVyaWNNYXA6IGJvb2xlYW47XG4gICAgICAgIH0gPSBtYXBwaW5nO1xuICAgICAgICAvLyBnZXQgdGhlIHZhbHVlIGZyb20gZXZlbnQsIHBhc3Mgc291cmNlRnJvbUdlbmVyaWNNYXAgaW4gdGhlIG1hcHBpbmcgdG8gZm9yY2UgdGhpcyB0byB0YWtlIHRoZVxuICAgICAgICAvLyBzb3VyY2VrZXlzIGZyb20gR2VuZXJpY0ZpZWxkTWFwcGluZywgZWxzZSB0YWtlIHRoZSBzb3VyY2VLZXlzIGZyb20gc3BlY2lmaWMgZGVzdGluYXRpb24gbWFwcGluZyBzb3VyY2VLZXlzXG4gICAgICAgIGNvbnN0IGludGVncmF0aW9uc09iaiA9IGlzRW1wdHkoZGVzdGluYXRpb25OYW1lKVxuICAgICAgICAgID8gU2VtYW50aWNVdGlsLmdldEludGVncmF0aW9uc09iaihtZXNzYWdlLCBkZXN0aW5hdGlvbk5hbWUpXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IEpzb25VdGlscy5oYW5kbGVNZXRhZGF0YUZvclZhbHVlKFxuICAgICAgICAgIHNvdXJjZUZyb21HZW5lcmljTWFwXG4gICAgICAgICAgICA/IHRoaXMuZ2V0RmllbGRWYWx1ZUZyb21NZXNzYWdlKG1lc3NhZ2UsIHNvdXJjZUtleXMgYXMgc3RyaW5nKVxuICAgICAgICAgICAgOiB0aGlzLmdldFZhbHVlRnJvbU1lc3NhZ2UobWVzc2FnZSwgc291cmNlS2V5cyksXG4gICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgZGVzdEtleSxcbiAgICAgICAgICBpbnRlZ3JhdGlvbnNPYmosXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHZhbHVlIHx8IHZhbHVlID09PSAwIHx8IHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgIGlmIChkZXN0S2V5KSB7XG4gICAgICAgICAgICAvLyBzZXQgdGhlIHZhbHVlIG9ubHkgaWYgY29ycmVjdFxuICAgICAgICAgICAgc2V0KHBheWxvYWQsIGRlc3RLZXksIHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdG8gc2V0IHRvIHJvb3QgYW5kIGZsYXR0ZW4gbGF0ZXJcbiAgICAgICAgICAgIHBheWxvYWRbJyddID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgLy8gdGhyb3cgZXJyb3IgaWYgcmVxaXJlZCB2YWx1ZSBpcyBtaXNzaW5nXG4gICAgICAgICAgdGhyb3cgbmV3IEluc3RydW1lbnRhdGlvbkVycm9yKFxuICAgICAgICAgICAgYE1pc3NpbmcgcmVxdWlyZWQgdmFsdWUgZnJvbSAke0pTT04uc3RyaW5naWZ5KHNvdXJjZUtleXMpfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH1cblxuICAgIC8vIGludmFsaWQgbWFwcGluZ0pzb25cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgc3RyaW5naWZ5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=json.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.test.d.ts","sourceRoot":"","sources":["../../src/utils/json.test.ts"],"names":[],"mappings":""}