keez-invoicing 1.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +366 -0
  3. package/dist/coverage/lcov-report/block-navigation.js +71 -0
  4. package/dist/coverage/lcov-report/prettify.js +478 -0
  5. package/dist/coverage/lcov-report/sorter.js +177 -0
  6. package/dist/eslint.config.js +56 -0
  7. package/dist/jest.config.cjs +13 -0
  8. package/dist/jest.config.js +13 -0
  9. package/dist/src/api/__tests__/index.test.js +52 -0
  10. package/dist/src/api/authorise.js +48 -0
  11. package/dist/src/api/invoices/cancel.js +33 -0
  12. package/dist/src/api/invoices/create.js +97 -0
  13. package/dist/src/api/invoices/delete.js +33 -0
  14. package/dist/src/api/invoices/downloadPdf.js +31 -0
  15. package/dist/src/api/invoices/getAll.js +84 -0
  16. package/dist/src/api/invoices/sendMail.js +59 -0
  17. package/dist/src/api/invoices/submitEfactura.js +34 -0
  18. package/dist/src/api/invoices/update.js +61 -0
  19. package/dist/src/api/invoices/validate.js +39 -0
  20. package/dist/src/api/invoices/view.js +93 -0
  21. package/dist/src/api/items/create.js +42 -0
  22. package/dist/src/api/items/getAll.js +74 -0
  23. package/dist/src/api/items/getById.js +46 -0
  24. package/dist/src/api/items/index.js +14 -0
  25. package/dist/src/api/items/patch.js +49 -0
  26. package/dist/src/api/items/update.js +41 -0
  27. package/dist/src/config/constants.js +23 -0
  28. package/dist/src/config/constructorParam.js +3 -0
  29. package/dist/src/config/measureUnit.js +22 -0
  30. package/dist/src/config/paymentType.js +17 -0
  31. package/dist/src/config/paymentType.js.js +16 -0
  32. package/dist/src/dto/allInvoicesResponse.js +3 -0
  33. package/dist/src/dto/authResponse.js +3 -0
  34. package/dist/src/dto/common/index.js +3 -0
  35. package/dist/src/dto/common/paginationParams.js +3 -0
  36. package/dist/src/dto/createInvoiceRequest.js +3 -0
  37. package/dist/src/dto/invoiceResponse.js +3 -0
  38. package/dist/src/dto/invoices/index.js +3 -0
  39. package/dist/src/dto/invoices/invoiceFilterParams.js +3 -0
  40. package/dist/src/dto/invoices/invoiceRequestV2.js +3 -0
  41. package/dist/src/dto/invoices/sendInvoiceParams.js +3 -0
  42. package/dist/src/dto/items/allItemsResponse.js +3 -0
  43. package/dist/src/dto/items/index.js +3 -0
  44. package/dist/src/dto/items/itemRequest.js +3 -0
  45. package/dist/src/dto/items/itemResponse.js +3 -0
  46. package/dist/src/errors/KeezError.js +27 -0
  47. package/dist/src/helpers/logger.js +15 -0
  48. package/dist/src/index.js +15 -0
  49. package/dist/src/keezApi.js +283 -0
  50. package/dist/tests/additional-coverage.test.js +351 -0
  51. package/dist/tests/edge-cases.test.js +353 -0
  52. package/dist/tests/error-handling.test.js +224 -0
  53. package/dist/tests/filter-params.test.js +267 -0
  54. package/dist/tests/index.test.js +493 -0
  55. package/dist/tests/invoices-extended.test.js +168 -0
  56. package/dist/tests/items.test.js +142 -0
  57. package/dist/types/coverage/lcov-report/block-navigation.d.ts +1 -0
  58. package/dist/types/coverage/lcov-report/prettify.d.ts +0 -0
  59. package/dist/types/coverage/lcov-report/sorter.d.ts +1 -0
  60. package/dist/types/eslint.config.d.ts +2 -0
  61. package/dist/types/jest.config.d.cts +9 -0
  62. package/dist/types/jest.config.d.ts +9 -0
  63. package/dist/types/src/api/__tests__/index.test.d.ts +1 -0
  64. package/dist/types/src/api/authorise.d.ts +18 -0
  65. package/dist/types/src/api/invoices/cancel.d.ts +9 -0
  66. package/dist/types/src/api/invoices/create.d.ts +22 -0
  67. package/dist/types/src/api/invoices/delete.d.ts +9 -0
  68. package/dist/types/src/api/invoices/downloadPdf.d.ts +8 -0
  69. package/dist/types/src/api/invoices/getAll.d.ts +22 -0
  70. package/dist/types/src/api/invoices/sendMail.d.ts +24 -0
  71. package/dist/types/src/api/invoices/submitEfactura.d.ts +9 -0
  72. package/dist/types/src/api/invoices/update.d.ts +11 -0
  73. package/dist/types/src/api/invoices/validate.d.ts +21 -0
  74. package/dist/types/src/api/invoices/view.d.ts +22 -0
  75. package/dist/types/src/api/items/create.d.ts +10 -0
  76. package/dist/types/src/api/items/getAll.d.ts +10 -0
  77. package/dist/types/src/api/items/getById.d.ts +10 -0
  78. package/dist/types/src/api/items/index.d.ts +5 -0
  79. package/dist/types/src/api/items/patch.d.ts +11 -0
  80. package/dist/types/src/api/items/update.d.ts +11 -0
  81. package/dist/types/src/config/constants.d.ts +13 -0
  82. package/dist/types/src/config/constructorParam.d.ts +6 -0
  83. package/dist/types/src/config/measureUnit.d.ts +17 -0
  84. package/dist/types/src/config/paymentType.d.ts +12 -0
  85. package/dist/types/src/config/paymentType.js.d.ts +11 -0
  86. package/dist/types/src/dto/allInvoicesResponse.d.ts +21 -0
  87. package/dist/types/src/dto/authResponse.d.ts +7 -0
  88. package/dist/types/src/dto/common/index.d.ts +1 -0
  89. package/dist/types/src/dto/common/paginationParams.d.ts +4 -0
  90. package/dist/types/src/dto/createInvoiceRequest.d.ts +34 -0
  91. package/dist/types/src/dto/invoiceResponse.d.ts +48 -0
  92. package/dist/types/src/dto/invoices/index.d.ts +3 -0
  93. package/dist/types/src/dto/invoices/invoiceFilterParams.d.ts +8 -0
  94. package/dist/types/src/dto/invoices/invoiceRequestV2.d.ts +23 -0
  95. package/dist/types/src/dto/invoices/sendInvoiceParams.d.ts +5 -0
  96. package/dist/types/src/dto/items/allItemsResponse.d.ts +13 -0
  97. package/dist/types/src/dto/items/index.d.ts +3 -0
  98. package/dist/types/src/dto/items/itemRequest.d.ts +34 -0
  99. package/dist/types/src/dto/items/itemResponse.d.ts +15 -0
  100. package/dist/types/src/errors/KeezError.d.ts +11 -0
  101. package/dist/types/src/helpers/logger.d.ts +2 -0
  102. package/dist/types/src/index.d.ts +11 -0
  103. package/dist/types/src/keezApi.d.ts +114 -0
  104. package/dist/types/tests/additional-coverage.test.d.ts +1 -0
  105. package/dist/types/tests/edge-cases.test.d.ts +1 -0
  106. package/dist/types/tests/error-handling.test.d.ts +1 -0
  107. package/dist/types/tests/filter-params.test.d.ts +1 -0
  108. package/dist/types/tests/index.test.d.ts +1 -0
  109. package/dist/types/tests/invoices-extended.test.d.ts +1 -0
  110. package/dist/types/tests/items.test.d.ts +1 -0
  111. package/package.json +66 -0
@@ -0,0 +1,353 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const nock = require("nock");
4
+ const keezApi_1 = require("../src/keezApi");
5
+ const measureUnit_1 = require("../src/config/measureUnit");
6
+ const paymentType_1 = require("../src/config/paymentType");
7
+ describe('Edge Cases and Response Variations Tests', () => {
8
+ let keezApi;
9
+ const baseDomain = 'https://staging.keez.ro';
10
+ const clientEid = 'test-client-eid';
11
+ beforeAll(() => {
12
+ keezApi = new keezApi_1.KeezApi({
13
+ application_id: 'test-app-id',
14
+ client_eid: clientEid,
15
+ secret: 'test-secret',
16
+ live: false,
17
+ });
18
+ });
19
+ beforeEach(() => {
20
+ nock(baseDomain)
21
+ .post('/idp/connect/token')
22
+ .reply(200, {
23
+ access_token: 'test-token',
24
+ expires_in: 3600,
25
+ token_type: 'Bearer',
26
+ scope: 'public-api',
27
+ });
28
+ });
29
+ afterEach(() => {
30
+ nock.cleanAll();
31
+ });
32
+ describe('submitInvoiceToEfactura Response Variations', () => {
33
+ it('should return externalId when uploadIndex is not present', async () => {
34
+ nock(baseDomain)
35
+ .post(`/api/v1.0/public-api/${clientEid}/invoices/efactura/submitted`)
36
+ .reply(200, { externalId: 'ext-123' });
37
+ const result = await keezApi.submitInvoiceToEfactura('inv-123');
38
+ expect(result).toBe('ext-123');
39
+ });
40
+ it('should return SUBMITTED when neither uploadIndex nor externalId is present', async () => {
41
+ nock(baseDomain)
42
+ .post(`/api/v1.0/public-api/${clientEid}/invoices/efactura/submitted`)
43
+ .reply(200, {});
44
+ const result = await keezApi.submitInvoiceToEfactura('inv-123');
45
+ expect(result).toBe('SUBMITTED');
46
+ });
47
+ it('should prefer uploadIndex over externalId', async () => {
48
+ nock(baseDomain)
49
+ .post(`/api/v1.0/public-api/${clientEid}/invoices/efactura/submitted`)
50
+ .reply(200, { uploadIndex: 'upload-123', externalId: 'ext-123' });
51
+ const result = await keezApi.submitInvoiceToEfactura('inv-123');
52
+ expect(result).toBe('upload-123');
53
+ });
54
+ });
55
+ describe('Create Item with Optional Fields', () => {
56
+ it('should create item with all optional fields', async () => {
57
+ nock(baseDomain)
58
+ .post(`/api/v1.0/public-api/${clientEid}/items`)
59
+ .reply(201, { externalId: 'new-item-id' });
60
+ const result = await keezApi.createItem({
61
+ itemName: 'Full Item',
62
+ itemCode: 'FI001',
63
+ itemDescription: 'Detailed description',
64
+ measureUnitId: measureUnit_1.MeasureUnit.PIECE,
65
+ unitPrice: 100,
66
+ vatPercent: 19,
67
+ vatCategoryCode: 'S',
68
+ vatExemptionReason: 'N/A',
69
+ isActive: true,
70
+ });
71
+ expect(result).toBe('new-item-id');
72
+ });
73
+ it('should create item with isActive explicitly set to false', async () => {
74
+ nock(baseDomain)
75
+ .post(`/api/v1.0/public-api/${clientEid}/items`)
76
+ .reply(201, { externalId: 'inactive-item-id' });
77
+ const result = await keezApi.createItem({
78
+ itemName: 'Inactive Item',
79
+ measureUnitId: measureUnit_1.MeasureUnit.PIECE,
80
+ unitPrice: 50,
81
+ vatPercent: 19,
82
+ isActive: false,
83
+ });
84
+ expect(result).toBe('inactive-item-id');
85
+ });
86
+ });
87
+ describe('Update Invoice with Optional Fields', () => {
88
+ it('should update invoice with vatOnCollection', async () => {
89
+ nock(baseDomain)
90
+ .put(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
91
+ .reply(200);
92
+ await expect(keezApi.updateInvoice('inv-123', {
93
+ series: 'INV',
94
+ documentDate: 20230101,
95
+ dueDate: 20230115,
96
+ currencyCode: 'RON',
97
+ paymentType: paymentType_1.PaymentType.BANK_TRANSFER,
98
+ vatOnCollection: true,
99
+ partner: {
100
+ isLegalPerson: false,
101
+ partnerName: 'Test Partner',
102
+ identificationNumber: '123456',
103
+ countryCode: 'RO',
104
+ countryName: 'Romania',
105
+ countyCode: 'B',
106
+ countyName: 'Bucuresti',
107
+ cityName: 'Bucuresti',
108
+ addressDetails: 'Test Address',
109
+ },
110
+ items: [
111
+ {
112
+ itemExternalId: 'item-1',
113
+ measureUnitId: 1,
114
+ quantity: 1,
115
+ unitPrice: 100,
116
+ },
117
+ ],
118
+ })).resolves.toBeUndefined();
119
+ });
120
+ it('should update invoice with exchangeRate and notes', async () => {
121
+ nock(baseDomain)
122
+ .put(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
123
+ .reply(200);
124
+ await expect(keezApi.updateInvoice('inv-123', {
125
+ series: 'INV',
126
+ documentDate: 20230101,
127
+ dueDate: 20230115,
128
+ currencyCode: 'EUR',
129
+ paymentType: paymentType_1.PaymentType.CARD_ONLINE,
130
+ exchangeRate: 4.95,
131
+ notes: 'Payment received',
132
+ partner: {
133
+ isLegalPerson: true,
134
+ partnerName: 'Company Ltd',
135
+ identificationNumber: 'RO12345678',
136
+ countryCode: 'RO',
137
+ countryName: 'Romania',
138
+ countyCode: 'CJ',
139
+ countyName: 'Cluj',
140
+ cityName: 'Cluj-Napoca',
141
+ addressDetails: 'Main Street 1',
142
+ },
143
+ items: [
144
+ {
145
+ itemExternalId: 'item-1',
146
+ measureUnitId: 1,
147
+ quantity: 5,
148
+ unitPrice: 200,
149
+ vatPercent: 19,
150
+ discountPercent: 10,
151
+ description: 'Custom description',
152
+ },
153
+ ],
154
+ })).resolves.toBeUndefined();
155
+ });
156
+ });
157
+ describe('Update Item with All Fields', () => {
158
+ it('should update item with all optional fields', async () => {
159
+ nock(baseDomain)
160
+ .put(`/api/v1.0/public-api/${clientEid}/items/item-123`)
161
+ .reply(200);
162
+ await expect(keezApi.updateItem('item-123', {
163
+ itemName: 'Updated Full Item',
164
+ itemCode: 'UFI001',
165
+ itemDescription: 'Updated detailed description',
166
+ measureUnitId: measureUnit_1.MeasureUnit.KILOGRAM,
167
+ unitPrice: 250,
168
+ vatPercent: 9,
169
+ vatCategoryCode: 'R',
170
+ vatExemptionReason: 'Reduced rate',
171
+ isActive: true,
172
+ })).resolves.toBeUndefined();
173
+ });
174
+ });
175
+ describe('KeezApi Live Mode', () => {
176
+ it('should use live domain when setLive is called with true', async () => {
177
+ const liveApi = new keezApi_1.KeezApi({
178
+ application_id: 'test-app-id',
179
+ client_eid: clientEid,
180
+ secret: 'test-secret',
181
+ live: false,
182
+ });
183
+ expect(liveApi.getBaseDomain()).toBe('https://staging.keez.ro');
184
+ liveApi.setLive(true);
185
+ expect(liveApi.getBaseDomain()).toBe('https://app.keez.ro');
186
+ liveApi.setLive(false);
187
+ expect(liveApi.getBaseDomain()).toBe('https://staging.keez.ro');
188
+ });
189
+ });
190
+ describe('Token Refresh on Multiple Calls', () => {
191
+ it('should reuse token for consecutive calls when still valid', async () => {
192
+ const mockItems = {
193
+ first: 0,
194
+ last: 0,
195
+ recordsCount: 0,
196
+ data: [],
197
+ };
198
+ // First call generates token
199
+ nock(baseDomain).get(`/api/v1.0/public-api/${clientEid}/items`).reply(200, mockItems);
200
+ await keezApi.getAllItems();
201
+ // Second call should reuse token (no new token request)
202
+ nock(baseDomain).get(`/api/v1.0/public-api/${clientEid}/items`).reply(200, mockItems);
203
+ await keezApi.getAllItems();
204
+ });
205
+ });
206
+ describe('Invoice with Various Payment Types', () => {
207
+ const baseInvoice = {
208
+ series: 'INV',
209
+ documentDate: 20230101,
210
+ dueDate: 20230115,
211
+ currencyCode: 'RON',
212
+ partner: {
213
+ isLegalPerson: false,
214
+ partnerName: 'Test Partner',
215
+ identificationNumber: '123456',
216
+ countryCode: 'RO',
217
+ countryName: 'Romania',
218
+ countyCode: 'B',
219
+ countyName: 'Bucuresti',
220
+ cityName: 'Bucuresti',
221
+ addressDetails: 'Test Address',
222
+ },
223
+ items: [
224
+ {
225
+ itemExternalId: 'item-1',
226
+ measureUnitId: 1,
227
+ quantity: 1,
228
+ unitPrice: 100,
229
+ },
230
+ ],
231
+ };
232
+ it('should update invoice with CASH payment type', async () => {
233
+ nock(baseDomain)
234
+ .put(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
235
+ .reply(200);
236
+ await expect(keezApi.updateInvoice('inv-123', {
237
+ ...baseInvoice,
238
+ paymentType: paymentType_1.PaymentType.CASH,
239
+ })).resolves.toBeUndefined();
240
+ });
241
+ it('should update invoice with CARD payment type', async () => {
242
+ nock(baseDomain)
243
+ .put(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
244
+ .reply(200);
245
+ await expect(keezApi.updateInvoice('inv-123', {
246
+ ...baseInvoice,
247
+ paymentType: paymentType_1.PaymentType.CARD,
248
+ })).resolves.toBeUndefined();
249
+ });
250
+ it('should update invoice with MEAL_VOUCHER payment type', async () => {
251
+ nock(baseDomain)
252
+ .put(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
253
+ .reply(200);
254
+ await expect(keezApi.updateInvoice('inv-123', {
255
+ ...baseInvoice,
256
+ paymentType: paymentType_1.PaymentType.MEAL_VOUCHER,
257
+ })).resolves.toBeUndefined();
258
+ });
259
+ it('should update invoice with CASH_ON_DELIVERY payment type', async () => {
260
+ nock(baseDomain)
261
+ .put(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
262
+ .reply(200);
263
+ await expect(keezApi.updateInvoice('inv-123', {
264
+ ...baseInvoice,
265
+ paymentType: paymentType_1.PaymentType.CASH_ON_DELIVERY,
266
+ })).resolves.toBeUndefined();
267
+ });
268
+ it('should update invoice with HOLIDAY_VOUCHER_CARD payment type', async () => {
269
+ nock(baseDomain)
270
+ .put(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
271
+ .reply(200);
272
+ await expect(keezApi.updateInvoice('inv-123', {
273
+ ...baseInvoice,
274
+ paymentType: paymentType_1.PaymentType.HOLIDAY_VOUCHER_CARD,
275
+ })).resolves.toBeUndefined();
276
+ });
277
+ });
278
+ describe('Item with Various Measure Units', () => {
279
+ it('should create item with KILOGRAM measure unit', async () => {
280
+ nock(baseDomain)
281
+ .post(`/api/v1.0/public-api/${clientEid}/items`)
282
+ .reply(201, { externalId: 'kg-item-id' });
283
+ const result = await keezApi.createItem({
284
+ itemName: 'Bulk Item',
285
+ measureUnitId: measureUnit_1.MeasureUnit.KILOGRAM,
286
+ unitPrice: 25,
287
+ vatPercent: 19,
288
+ });
289
+ expect(result).toBe('kg-item-id');
290
+ });
291
+ it('should create item with LITER measure unit', async () => {
292
+ nock(baseDomain)
293
+ .post(`/api/v1.0/public-api/${clientEid}/items`)
294
+ .reply(201, { externalId: 'liter-item-id' });
295
+ const result = await keezApi.createItem({
296
+ itemName: 'Liquid Item',
297
+ measureUnitId: measureUnit_1.MeasureUnit.LITER,
298
+ unitPrice: 10,
299
+ vatPercent: 9,
300
+ });
301
+ expect(result).toBe('liter-item-id');
302
+ });
303
+ it('should create item with METER measure unit', async () => {
304
+ nock(baseDomain)
305
+ .post(`/api/v1.0/public-api/${clientEid}/items`)
306
+ .reply(201, { externalId: 'meter-item-id' });
307
+ const result = await keezApi.createItem({
308
+ itemName: 'Cable Item',
309
+ measureUnitId: measureUnit_1.MeasureUnit.METER,
310
+ unitPrice: 5,
311
+ vatPercent: 19,
312
+ });
313
+ expect(result).toBe('meter-item-id');
314
+ });
315
+ it('should create item with SQUARE_METER measure unit', async () => {
316
+ nock(baseDomain)
317
+ .post(`/api/v1.0/public-api/${clientEid}/items`)
318
+ .reply(201, { externalId: 'sqm-item-id' });
319
+ const result = await keezApi.createItem({
320
+ itemName: 'Floor Item',
321
+ measureUnitId: measureUnit_1.MeasureUnit.SQUARE_METER,
322
+ unitPrice: 50,
323
+ vatPercent: 19,
324
+ });
325
+ expect(result).toBe('sqm-item-id');
326
+ });
327
+ it('should create item with HOUR measure unit', async () => {
328
+ nock(baseDomain)
329
+ .post(`/api/v1.0/public-api/${clientEid}/items`)
330
+ .reply(201, { externalId: 'hour-item-id' });
331
+ const result = await keezApi.createItem({
332
+ itemName: 'Service Item',
333
+ measureUnitId: measureUnit_1.MeasureUnit.HOUR,
334
+ unitPrice: 100,
335
+ vatPercent: 19,
336
+ });
337
+ expect(result).toBe('hour-item-id');
338
+ });
339
+ it('should create item with DAY measure unit', async () => {
340
+ nock(baseDomain)
341
+ .post(`/api/v1.0/public-api/${clientEid}/items`)
342
+ .reply(201, { externalId: 'day-item-id' });
343
+ const result = await keezApi.createItem({
344
+ itemName: 'Rental Item',
345
+ measureUnitId: measureUnit_1.MeasureUnit.DAY,
346
+ unitPrice: 500,
347
+ vatPercent: 19,
348
+ });
349
+ expect(result).toBe('day-item-id');
350
+ });
351
+ });
352
+ });
353
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZS1jYXNlcy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdHMvZWRnZS1jYXNlcy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQThCO0FBQzlCLHVDQUFvQztBQUNwQyxzREFBbUQ7QUFDbkQsc0RBQW1EO0FBRW5ELFFBQVEsQ0FBQywwQ0FBMEMsRUFBRSxHQUFHLEVBQUU7SUFDdEQsSUFBSSxPQUFnQixDQUFDO0lBQ3JCLE1BQU0sVUFBVSxHQUFHLHlCQUF5QixDQUFDO0lBQzdDLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDO0lBRXBDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDWCxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDO1lBQ2xCLGNBQWMsRUFBRSxhQUFhO1lBQzdCLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLE1BQU0sRUFBRSxhQUFhO1lBQ3JCLElBQUksRUFBRSxLQUFLO1NBQ2QsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFFSCxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ1osSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUNYLElBQUksQ0FBQyxvQkFBb0IsQ0FBQzthQUMxQixLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ1IsWUFBWSxFQUFFLFlBQVk7WUFDMUIsVUFBVSxFQUFFLElBQUk7WUFDaEIsVUFBVSxFQUFFLFFBQVE7WUFDcEIsS0FBSyxFQUFFLFlBQVk7U0FDdEIsQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ1gsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLDZDQUE2QyxFQUFFLEdBQUcsRUFBRTtRQUN6RCxFQUFFLENBQUMsMERBQTBELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdEUsSUFBSSxDQUFDLFVBQVUsQ0FBQztpQkFDWCxJQUFJLENBQUMs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QUM7WUFFaEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDO2dCQUNwQyxRQUFRLEVBQUUsY0FBYztnQkFDeEIsYUFBYSxFQUFFLHlCQUFXLENBQUMsSUFBSTtnQkFDL0IsU0FBUyxFQUFFLEdBQUc7Z0JBQ2QsVUFBVSxFQUFFLEVBQUU7YUFDakIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN0RCxJQUFJLENBQUMsVUFBVSxDQUFDO2lCQUNYLElBQUksQ0FBQyx3QkFBd0IsU0FBUyxRQUFRLENBQUM7aUJBQy9DLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztZQUUvQyxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUM7Z0JBQ3BDLFFBQVEsRUFBRSxhQUFhO2dCQUN2QixhQUFhLEVBQUUseUJBQVcsQ0FBQyxHQUFHO2dCQUM5QixTQUFTLEVBQUUsR0FBRztnQkFDZCxVQUFVLEVBQUUsRUFBRTthQUNqQixDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHsgS2VlekFwaSB9IGZyb20gJ0Ava2VlekFwaSc7XG5pbXBvcnQgeyBNZWFzdXJlVW5pdCB9IGZyb20gJ0AvY29uZmlnL21lYXN1cmVVbml0JztcbmltcG9ydCB7IFBheW1lbnRUeXBlIH0gZnJvbSAnQC9jb25maWcvcGF5bWVudFR5cGUnO1xuXG5kZXNjcmliZSgnRWRnZSBDYXNlcyBhbmQgUmVzcG9uc2UgVmFyaWF0aW9ucyBUZXN0cycsICgpID0+IHtcbiAgICBsZXQga2VlekFwaTogS2VlekFwaTtcbiAgICBjb25zdCBiYXNlRG9tYWluID0gJ2h0dHBzOi8vc3RhZ2luZy5rZWV6LnJvJztcbiAgICBjb25zdCBjbGllbnRFaWQgPSAndGVzdC1jbGllbnQtZWlkJztcblxuICAgIGJlZm9yZUFsbCgoKSA9PiB7XG4gICAgICAgIGtlZXpBcGkgPSBuZXcgS2VlekFwaSh7XG4gICAgICAgICAgICBhcHBsaWNhdGlvbl9pZDogJ3Rlc3QtYXBwLWlkJyxcbiAgICAgICAgICAgIGNsaWVudF9laWQ6IGNsaWVudEVpZCxcbiAgICAgICAgICAgIHNlY3JldDogJ3Rlc3Qtc2VjcmV0JyxcbiAgICAgICAgICAgIGxpdmU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAucG9zdCgnL2lkcC9jb25uZWN0L3Rva2VuJylcbiAgICAgICAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgICAgICAgICBhY2Nlc3NfdG9rZW46ICd0ZXN0LXRva2VuJyxcbiAgICAgICAgICAgICAgICBleHBpcmVzX2luOiAzNjAwLFxuICAgICAgICAgICAgICAgIHRva2VuX3R5cGU6ICdCZWFyZXInLFxuICAgICAgICAgICAgICAgIHNjb3BlOiAncHVibGljLWFwaScsXG4gICAgICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzdWJtaXRJbnZvaWNlVG9FZmFjdHVyYSBSZXNwb25zZSBWYXJpYXRpb25zJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBleHRlcm5hbElkIHdoZW4gdXBsb2FkSW5kZXggaXMgbm90IHByZXNlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlcy9lZmFjdHVyYS9zdWJtaXR0ZWRgKVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDAsIHsgZXh0ZXJuYWxJZDogJ2V4dC0xMjMnIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZWV6QXBpLnN1Ym1pdEludm9pY2VUb0VmYWN0dXJhKCdpbnYtMTIzJyk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdleHQtMTIzJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIFNVQk1JVFRFRCB3aGVuIG5laXRoZXIgdXBsb2FkSW5kZXggbm9yIGV4dGVybmFsSWQgaXMgcHJlc2VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucG9zdChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzL2VmYWN0dXJhL3N1Ym1pdHRlZGApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCwge30pO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZWV6QXBpLnN1Ym1pdEludm9pY2VUb0VmYWN0dXJhKCdpbnYtMTIzJyk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdTVUJNSVRURUQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBwcmVmZXIgdXBsb2FkSW5kZXggb3ZlciBleHRlcm5hbElkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wb3N0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaW52b2ljZXMvZWZhY3R1cmEvc3VibWl0dGVkYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwLCB7IHVwbG9hZEluZGV4OiAndXBsb2FkLTEyMycsIGV4dGVybmFsSWQ6ICdleHQtMTIzJyB9KTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VlekFwaS5zdWJtaXRJbnZvaWNlVG9FZmFjdHVyYSgnaW52LTEyMycpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndXBsb2FkLTEyMycpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdDcmVhdGUgSXRlbSB3aXRoIE9wdGlvbmFsIEZpZWxkcycsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCBjcmVhdGUgaXRlbSB3aXRoIGFsbCBvcHRpb25hbCBmaWVsZHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMSwgeyBleHRlcm5hbElkOiAnbmV3LWl0ZW0taWQnIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZWV6QXBpLmNyZWF0ZUl0ZW0oe1xuICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAnRnVsbCBJdGVtJyxcbiAgICAgICAgICAgICAgICBpdGVtQ29kZTogJ0ZJMDAxJyxcbiAgICAgICAgICAgICAgICBpdGVtRGVzY3JpcHRpb246ICdEZXRhaWxlZCBkZXNjcmlwdGlvbicsXG4gICAgICAgICAgICAgICAgbWVhc3VyZVVuaXRJZDogTWVhc3VyZVVuaXQuUElFQ0UsXG4gICAgICAgICAgICAgICAgdW5pdFByaWNlOiAxMDAsXG4gICAgICAgICAgICAgICAgdmF0UGVyY2VudDogMTksXG4gICAgICAgICAgICAgICAgdmF0Q2F0ZWdvcnlDb2RlOiAnUycsXG4gICAgICAgICAgICAgICAgdmF0RXhlbXB0aW9uUmVhc29uOiAnTi9BJyxcbiAgICAgICAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKCduZXctaXRlbS1pZCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBpdGVtIHdpdGggaXNBY3RpdmUgZXhwbGljaXRseSBzZXQgdG8gZmFsc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMSwgeyBleHRlcm5hbElkOiAnaW5hY3RpdmUtaXRlbS1pZCcgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGtlZXpBcGkuY3JlYXRlSXRlbSh7XG4gICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdJbmFjdGl2ZSBJdGVtJyxcbiAgICAgICAgICAgICAgICBtZWFzdXJlVW5pdElkOiBNZWFzdXJlVW5pdC5QSUVDRSxcbiAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDUwLFxuICAgICAgICAgICAgICAgIHZhdFBlcmNlbnQ6IDE5LFxuICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdpbmFjdGl2ZS1pdGVtLWlkJyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1VwZGF0ZSBJbnZvaWNlIHdpdGggT3B0aW9uYWwgRmllbGRzJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHVwZGF0ZSBpbnZvaWNlIHdpdGggdmF0T25Db2xsZWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wdXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlcy9pbnYtMTIzYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGtlZXpBcGkudXBkYXRlSW52b2ljZSgnaW52LTEyMycsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWVzOiAnSU5WJyxcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnREYXRlOiAyMDIzMDEwMSxcbiAgICAgICAgICAgICAgICAgICAgZHVlRGF0ZTogMjAyMzAxMTUsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5Q29kZTogJ1JPTicsXG4gICAgICAgICAgICAgICAgICAgIHBheW1lbnRUeXBlOiBQYXltZW50VHlwZS5CQU5LX1RSQU5TRkVSLFxuICAgICAgICAgICAgICAgICAgICB2YXRPbkNvbGxlY3Rpb246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHBhcnRuZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTGVnYWxQZXJzb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFydG5lck5hbWU6ICdUZXN0IFBhcnRuZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmljYXRpb25OdW1iZXI6ICcxMjM0NTYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeUNvZGU6ICdSTycsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5TmFtZTogJ1JvbWFuaWEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnR5Q29kZTogJ0InLFxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnR5TmFtZTogJ0J1Y3VyZXN0aScsXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXR5TmFtZTogJ0J1Y3VyZXN0aScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzRGV0YWlsczogJ1Rlc3QgQWRkcmVzcycsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUV4dGVybmFsSWQ6ICdpdGVtLTEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVVbml0SWQ6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdFByaWNlOiAxMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCB1cGRhdGUgaW52b2ljZSB3aXRoIGV4Y2hhbmdlUmF0ZSBhbmQgbm90ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnB1dChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzL2ludi0xMjNgKVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDApO1xuXG4gICAgICAgICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgICAgICAgICAga2VlekFwaS51cGRhdGVJbnZvaWNlKCdpbnYtMTIzJywge1xuICAgICAgICAgICAgICAgICAgICBzZXJpZXM6ICdJTlYnLFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudERhdGU6IDIwMjMwMTAxLFxuICAgICAgICAgICAgICAgICAgICBkdWVEYXRlOiAyMDIzMDExNSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVuY3lDb2RlOiAnRVVSJyxcbiAgICAgICAgICAgICAgICAgICAgcGF5bWVudFR5cGU6IFBheW1lbnRUeXBlLkNBUkRfT05MSU5FLFxuICAgICAgICAgICAgICAgICAgICBleGNoYW5nZVJhdGU6IDQuOTUsXG4gICAgICAgICAgICAgICAgICAgIG5vdGVzOiAnUGF5bWVudCByZWNlaXZlZCcsXG4gICAgICAgICAgICAgICAgICAgIHBhcnRuZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTGVnYWxQZXJzb246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyTmFtZTogJ0NvbXBhbnkgTHRkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpY2F0aW9uTnVtYmVyOiAnUk8xMjM0NTY3OCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Q29kZTogJ1JPJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlOYW1lOiAnUm9tYW5pYScsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHlDb2RlOiAnQ0onLFxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnR5TmFtZTogJ0NsdWonLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2l0eU5hbWU6ICdDbHVqLU5hcG9jYScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzRGV0YWlsczogJ01haW4gU3RyZWV0IDEnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1FeHRlcm5hbElkOiAnaXRlbS0xJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlVW5pdElkOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXR5OiA1LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRQcmljZTogMjAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhdFBlcmNlbnQ6IDE5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50UGVyY2VudDogMTAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdDdXN0b20gZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZXNvbHZlcy50b0JlVW5kZWZpbmVkKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1VwZGF0ZSBJdGVtIHdpdGggQWxsIEZpZWxkcycsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCB1cGRhdGUgaXRlbSB3aXRoIGFsbCBvcHRpb25hbCBmaWVsZHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnB1dChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zL2l0ZW0tMTIzYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGtlZXpBcGkudXBkYXRlSXRlbSgnaXRlbS0xMjMnLCB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAnVXBkYXRlZCBGdWxsIEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICBpdGVtQ29kZTogJ1VGSTAwMScsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1EZXNjcmlwdGlvbjogJ1VwZGF0ZWQgZGV0YWlsZWQgZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlVW5pdElkOiBNZWFzdXJlVW5pdC5LSUxPR1JBTSxcbiAgICAgICAgICAgICAgICAgICAgdW5pdFByaWNlOiAyNTAsXG4gICAgICAgICAgICAgICAgICAgIHZhdFBlcmNlbnQ6IDksXG4gICAgICAgICAgICAgICAgICAgIHZhdENhdGVnb3J5Q29kZTogJ1InLFxuICAgICAgICAgICAgICAgICAgICB2YXRFeGVtcHRpb25SZWFzb246ICdSZWR1Y2VkIHJhdGUnLFxuICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZXNvbHZlcy50b0JlVW5kZWZpbmVkKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0tlZXpBcGkgTGl2ZSBNb2RlJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHVzZSBsaXZlIGRvbWFpbiB3aGVuIHNldExpdmUgaXMgY2FsbGVkIHdpdGggdHJ1ZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpdmVBcGkgPSBuZXcgS2VlekFwaSh7XG4gICAgICAgICAgICAgICAgYXBwbGljYXRpb25faWQ6ICd0ZXN0LWFwcC1pZCcsXG4gICAgICAgICAgICAgICAgY2xpZW50X2VpZDogY2xpZW50RWlkLFxuICAgICAgICAgICAgICAgIHNlY3JldDogJ3Rlc3Qtc2VjcmV0JyxcbiAgICAgICAgICAgICAgICBsaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBleHBlY3QobGl2ZUFwaS5nZXRCYXNlRG9tYWluKCkpLnRvQmUoJ2h0dHBzOi8vc3RhZ2luZy5rZWV6LnJvJyk7XG5cbiAgICAgICAgICAgIGxpdmVBcGkuc2V0TGl2ZSh0cnVlKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXZlQXBpLmdldEJhc2VEb21haW4oKSkudG9CZSgnaHR0cHM6Ly9hcHAua2Vlei5ybycpO1xuXG4gICAgICAgICAgICBsaXZlQXBpLnNldExpdmUoZmFsc2UpO1xuICAgICAgICAgICAgZXhwZWN0KGxpdmVBcGkuZ2V0QmFzZURvbWFpbigpKS50b0JlKCdodHRwczovL3N0YWdpbmcua2Vlei5ybycpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdUb2tlbiBSZWZyZXNoIG9uIE11bHRpcGxlIENhbGxzJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHJldXNlIHRva2VuIGZvciBjb25zZWN1dGl2ZSBjYWxscyB3aGVuIHN0aWxsIHZhbGlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbW9ja0l0ZW1zID0ge1xuICAgICAgICAgICAgICAgIGZpcnN0OiAwLFxuICAgICAgICAgICAgICAgIGxhc3Q6IDAsXG4gICAgICAgICAgICAgICAgcmVjb3Jkc0NvdW50OiAwLFxuICAgICAgICAgICAgICAgIGRhdGE6IFtdLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gRmlyc3QgY2FsbCBnZW5lcmF0ZXMgdG9rZW5cbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbikuZ2V0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXNgKS5yZXBseSgyMDAsIG1vY2tJdGVtcyk7XG5cbiAgICAgICAgICAgIGF3YWl0IGtlZXpBcGkuZ2V0QWxsSXRlbXMoKTtcblxuICAgICAgICAgICAgLy8gU2Vjb25kIGNhbGwgc2hvdWxkIHJldXNlIHRva2VuIChubyBuZXcgdG9rZW4gcmVxdWVzdClcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbikuZ2V0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXNgKS5yZXBseSgyMDAsIG1vY2tJdGVtcyk7XG5cbiAgICAgICAgICAgIGF3YWl0IGtlZXpBcGkuZ2V0QWxsSXRlbXMoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnSW52b2ljZSB3aXRoIFZhcmlvdXMgUGF5bWVudCBUeXBlcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgYmFzZUludm9pY2UgPSB7XG4gICAgICAgICAgICBzZXJpZXM6ICdJTlYnLFxuICAgICAgICAgICAgZG9jdW1lbnREYXRlOiAyMDIzMDEwMSxcbiAgICAgICAgICAgIGR1ZURhdGU6IDIwMjMwMTE1LFxuICAgICAgICAgICAgY3VycmVuY3lDb2RlOiAnUk9OJyxcbiAgICAgICAgICAgIHBhcnRuZXI6IHtcbiAgICAgICAgICAgICAgICBpc0xlZ2FsUGVyc29uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBwYXJ0bmVyTmFtZTogJ1Rlc3QgUGFydG5lcicsXG4gICAgICAgICAgICAgICAgaWRlbnRpZmljYXRpb25OdW1iZXI6ICcxMjM0NTYnLFxuICAgICAgICAgICAgICAgIGNvdW50cnlDb2RlOiAnUk8nLFxuICAgICAgICAgICAgICAgIGNvdW50cnlOYW1lOiAnUm9tYW5pYScsXG4gICAgICAgICAgICAgICAgY291bnR5Q29kZTogJ0InLFxuICAgICAgICAgICAgICAgIGNvdW50eU5hbWU6ICdCdWN1cmVzdGknLFxuICAgICAgICAgICAgICAgIGNpdHlOYW1lOiAnQnVjdXJlc3RpJyxcbiAgICAgICAgICAgICAgICBhZGRyZXNzRGV0YWlsczogJ1Rlc3QgQWRkcmVzcycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1FeHRlcm5hbElkOiAnaXRlbS0xJyxcbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVVuaXRJZDogMSxcbiAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IDEsXG4gICAgICAgICAgICAgICAgICAgIHVuaXRQcmljZTogMTAwLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGl0KCdzaG91bGQgdXBkYXRlIGludm9pY2Ugd2l0aCBDQVNIIHBheW1lbnQgdHlwZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucHV0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaW52b2ljZXMvaW52LTEyM2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgICAgICAgICBrZWV6QXBpLnVwZGF0ZUludm9pY2UoJ2ludi0xMjMnLCB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmJhc2VJbnZvaWNlLFxuICAgICAgICAgICAgICAgICAgICBwYXltZW50VHlwZTogUGF5bWVudFR5cGUuQ0FTSCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZXNvbHZlcy50b0JlVW5kZWZpbmVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgdXBkYXRlIGludm9pY2Ugd2l0aCBDQVJEIHBheW1lbnQgdHlwZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucHV0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaW52b2ljZXMvaW52LTEyM2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgICAgICAgICBrZWV6QXBpLnVwZGF0ZUludm9pY2UoJ2ludi0xMjMnLCB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmJhc2VJbnZvaWNlLFxuICAgICAgICAgICAgICAgICAgICBwYXltZW50VHlwZTogUGF5bWVudFR5cGUuQ0FSRCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZXNvbHZlcy50b0JlVW5kZWZpbmVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgdXBkYXRlIGludm9pY2Ugd2l0aCBNRUFMX1ZPVUNIRVIgcGF5bWVudCB0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wdXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlcy9pbnYtMTIzYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGtlZXpBcGkudXBkYXRlSW52b2ljZSgnaW52LTEyMycsIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uYmFzZUludm9pY2UsXG4gICAgICAgICAgICAgICAgICAgIHBheW1lbnRUeXBlOiBQYXltZW50VHlwZS5NRUFMX1ZPVUNIRVIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkucmVzb2x2ZXMudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHVwZGF0ZSBpbnZvaWNlIHdpdGggQ0FTSF9PTl9ERUxJVkVSWSBwYXltZW50IHR5cGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnB1dChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzL2ludi0xMjNgKVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDApO1xuXG4gICAgICAgICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgICAgICAgICAga2VlekFwaS51cGRhdGVJbnZvaWNlKCdpbnYtMTIzJywge1xuICAgICAgICAgICAgICAgICAgICAuLi5iYXNlSW52b2ljZSxcbiAgICAgICAgICAgICAgICAgICAgcGF5bWVudFR5cGU6IFBheW1lbnRUeXBlLkNBU0hfT05fREVMSVZFUlksXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkucmVzb2x2ZXMudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHVwZGF0ZSBpbnZvaWNlIHdpdGggSE9MSURBWV9WT1VDSEVSX0NBUkQgcGF5bWVudCB0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wdXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlcy9pbnYtMTIzYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGtlZXpBcGkudXBkYXRlSW52b2ljZSgnaW52LTEyMycsIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uYmFzZUludm9pY2UsXG4gICAgICAgICAgICAgICAgICAgIHBheW1lbnRUeXBlOiBQYXltZW50VHlwZS5IT0xJREFZX1ZPVUNIRVJfQ0FSRCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZXNvbHZlcy50b0JlVW5kZWZpbmVkKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0l0ZW0gd2l0aCBWYXJpb3VzIE1lYXN1cmUgVW5pdHMnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgY3JlYXRlIGl0ZW0gd2l0aCBLSUxPR1JBTSBtZWFzdXJlIHVuaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMSwgeyBleHRlcm5hbElkOiAna2ctaXRlbS1pZCcgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGtlZXpBcGkuY3JlYXRlSXRlbSh7XG4gICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdCdWxrIEl0ZW0nLFxuICAgICAgICAgICAgICAgIG1lYXN1cmVVbml0SWQ6IE1lYXN1cmVVbml0LktJTE9HUkFNLFxuICAgICAgICAgICAgICAgIHVuaXRQcmljZTogMjUsXG4gICAgICAgICAgICAgICAgdmF0UGVyY2VudDogMTksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgna2ctaXRlbS1pZCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBpdGVtIHdpdGggTElURVIgbWVhc3VyZSB1bml0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wb3N0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXNgKVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDEsIHsgZXh0ZXJuYWxJZDogJ2xpdGVyLWl0ZW0taWQnIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZWV6QXBpLmNyZWF0ZUl0ZW0oe1xuICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAnTGlxdWlkIEl0ZW0nLFxuICAgICAgICAgICAgICAgIG1lYXN1cmVVbml0SWQ6IE1lYXN1cmVVbml0LkxJVEVSLFxuICAgICAgICAgICAgICAgIHVuaXRQcmljZTogMTAsXG4gICAgICAgICAgICAgICAgdmF0UGVyY2VudDogOSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdsaXRlci1pdGVtLWlkJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgY3JlYXRlIGl0ZW0gd2l0aCBNRVRFUiBtZWFzdXJlIHVuaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMSwgeyBleHRlcm5hbElkOiAnbWV0ZXItaXRlbS1pZCcgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGtlZXpBcGkuY3JlYXRlSXRlbSh7XG4gICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdDYWJsZSBJdGVtJyxcbiAgICAgICAgICAgICAgICBtZWFzdXJlVW5pdElkOiBNZWFzdXJlVW5pdC5NRVRFUixcbiAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDUsXG4gICAgICAgICAgICAgICAgdmF0UGVyY2VudDogMTksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnbWV0ZXItaXRlbS1pZCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBpdGVtIHdpdGggU1FVQVJFX01FVEVSIG1lYXN1cmUgdW5pdCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucG9zdChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAxLCB7IGV4dGVybmFsSWQ6ICdzcW0taXRlbS1pZCcgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGtlZXpBcGkuY3JlYXRlSXRlbSh7XG4gICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdGbG9vciBJdGVtJyxcbiAgICAgICAgICAgICAgICBtZWFzdXJlVW5pdElkOiBNZWFzdXJlVW5pdC5TUVVBUkVfTUVURVIsXG4gICAgICAgICAgICAgICAgdW5pdFByaWNlOiA1MCxcbiAgICAgICAgICAgICAgICB2YXRQZXJjZW50OiAxOSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdzcW0taXRlbS1pZCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBpdGVtIHdpdGggSE9VUiBtZWFzdXJlIHVuaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMSwgeyBleHRlcm5hbElkOiAnaG91ci1pdGVtLWlkJyB9KTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VlekFwaS5jcmVhdGVJdGVtKHtcbiAgICAgICAgICAgICAgICBpdGVtTmFtZTogJ1NlcnZpY2UgSXRlbScsXG4gICAgICAgICAgICAgICAgbWVhc3VyZVVuaXRJZDogTWVhc3VyZVVuaXQuSE9VUixcbiAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDEwMCxcbiAgICAgICAgICAgICAgICB2YXRQZXJjZW50OiAxOSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdob3VyLWl0ZW0taWQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBjcmVhdGUgaXRlbSB3aXRoIERBWSBtZWFzdXJlIHVuaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMSwgeyBleHRlcm5hbElkOiAnZGF5LWl0ZW0taWQnIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZWV6QXBpLmNyZWF0ZUl0ZW0oe1xuICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAnUmVudGFsIEl0ZW0nLFxuICAgICAgICAgICAgICAgIG1lYXN1cmVVbml0SWQ6IE1lYXN1cmVVbml0LkRBWSxcbiAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDUwMCxcbiAgICAgICAgICAgICAgICB2YXRQZXJjZW50OiAxOSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdkYXktaXRlbS1pZCcpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn0pO1xuIl19