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.
- package/LICENSE +28 -0
- package/README.md +366 -0
- package/dist/coverage/lcov-report/block-navigation.js +71 -0
- package/dist/coverage/lcov-report/prettify.js +478 -0
- package/dist/coverage/lcov-report/sorter.js +177 -0
- package/dist/eslint.config.js +56 -0
- package/dist/jest.config.cjs +13 -0
- package/dist/jest.config.js +13 -0
- package/dist/src/api/__tests__/index.test.js +52 -0
- package/dist/src/api/authorise.js +48 -0
- package/dist/src/api/invoices/cancel.js +33 -0
- package/dist/src/api/invoices/create.js +97 -0
- package/dist/src/api/invoices/delete.js +33 -0
- package/dist/src/api/invoices/downloadPdf.js +31 -0
- package/dist/src/api/invoices/getAll.js +84 -0
- package/dist/src/api/invoices/sendMail.js +59 -0
- package/dist/src/api/invoices/submitEfactura.js +34 -0
- package/dist/src/api/invoices/update.js +61 -0
- package/dist/src/api/invoices/validate.js +39 -0
- package/dist/src/api/invoices/view.js +93 -0
- package/dist/src/api/items/create.js +42 -0
- package/dist/src/api/items/getAll.js +74 -0
- package/dist/src/api/items/getById.js +46 -0
- package/dist/src/api/items/index.js +14 -0
- package/dist/src/api/items/patch.js +49 -0
- package/dist/src/api/items/update.js +41 -0
- package/dist/src/config/constants.js +23 -0
- package/dist/src/config/constructorParam.js +3 -0
- package/dist/src/config/measureUnit.js +22 -0
- package/dist/src/config/paymentType.js +17 -0
- package/dist/src/config/paymentType.js.js +16 -0
- package/dist/src/dto/allInvoicesResponse.js +3 -0
- package/dist/src/dto/authResponse.js +3 -0
- package/dist/src/dto/common/index.js +3 -0
- package/dist/src/dto/common/paginationParams.js +3 -0
- package/dist/src/dto/createInvoiceRequest.js +3 -0
- package/dist/src/dto/invoiceResponse.js +3 -0
- package/dist/src/dto/invoices/index.js +3 -0
- package/dist/src/dto/invoices/invoiceFilterParams.js +3 -0
- package/dist/src/dto/invoices/invoiceRequestV2.js +3 -0
- package/dist/src/dto/invoices/sendInvoiceParams.js +3 -0
- package/dist/src/dto/items/allItemsResponse.js +3 -0
- package/dist/src/dto/items/index.js +3 -0
- package/dist/src/dto/items/itemRequest.js +3 -0
- package/dist/src/dto/items/itemResponse.js +3 -0
- package/dist/src/errors/KeezError.js +27 -0
- package/dist/src/helpers/logger.js +15 -0
- package/dist/src/index.js +15 -0
- package/dist/src/keezApi.js +283 -0
- package/dist/tests/additional-coverage.test.js +351 -0
- package/dist/tests/edge-cases.test.js +353 -0
- package/dist/tests/error-handling.test.js +224 -0
- package/dist/tests/filter-params.test.js +267 -0
- package/dist/tests/index.test.js +493 -0
- package/dist/tests/invoices-extended.test.js +168 -0
- package/dist/tests/items.test.js +142 -0
- package/dist/types/coverage/lcov-report/block-navigation.d.ts +1 -0
- package/dist/types/coverage/lcov-report/prettify.d.ts +0 -0
- package/dist/types/coverage/lcov-report/sorter.d.ts +1 -0
- package/dist/types/eslint.config.d.ts +2 -0
- package/dist/types/jest.config.d.cts +9 -0
- package/dist/types/jest.config.d.ts +9 -0
- package/dist/types/src/api/__tests__/index.test.d.ts +1 -0
- package/dist/types/src/api/authorise.d.ts +18 -0
- package/dist/types/src/api/invoices/cancel.d.ts +9 -0
- package/dist/types/src/api/invoices/create.d.ts +22 -0
- package/dist/types/src/api/invoices/delete.d.ts +9 -0
- package/dist/types/src/api/invoices/downloadPdf.d.ts +8 -0
- package/dist/types/src/api/invoices/getAll.d.ts +22 -0
- package/dist/types/src/api/invoices/sendMail.d.ts +24 -0
- package/dist/types/src/api/invoices/submitEfactura.d.ts +9 -0
- package/dist/types/src/api/invoices/update.d.ts +11 -0
- package/dist/types/src/api/invoices/validate.d.ts +21 -0
- package/dist/types/src/api/invoices/view.d.ts +22 -0
- package/dist/types/src/api/items/create.d.ts +10 -0
- package/dist/types/src/api/items/getAll.d.ts +10 -0
- package/dist/types/src/api/items/getById.d.ts +10 -0
- package/dist/types/src/api/items/index.d.ts +5 -0
- package/dist/types/src/api/items/patch.d.ts +11 -0
- package/dist/types/src/api/items/update.d.ts +11 -0
- package/dist/types/src/config/constants.d.ts +13 -0
- package/dist/types/src/config/constructorParam.d.ts +6 -0
- package/dist/types/src/config/measureUnit.d.ts +17 -0
- package/dist/types/src/config/paymentType.d.ts +12 -0
- package/dist/types/src/config/paymentType.js.d.ts +11 -0
- package/dist/types/src/dto/allInvoicesResponse.d.ts +21 -0
- package/dist/types/src/dto/authResponse.d.ts +7 -0
- package/dist/types/src/dto/common/index.d.ts +1 -0
- package/dist/types/src/dto/common/paginationParams.d.ts +4 -0
- package/dist/types/src/dto/createInvoiceRequest.d.ts +34 -0
- package/dist/types/src/dto/invoiceResponse.d.ts +48 -0
- package/dist/types/src/dto/invoices/index.d.ts +3 -0
- package/dist/types/src/dto/invoices/invoiceFilterParams.d.ts +8 -0
- package/dist/types/src/dto/invoices/invoiceRequestV2.d.ts +23 -0
- package/dist/types/src/dto/invoices/sendInvoiceParams.d.ts +5 -0
- package/dist/types/src/dto/items/allItemsResponse.d.ts +13 -0
- package/dist/types/src/dto/items/index.d.ts +3 -0
- package/dist/types/src/dto/items/itemRequest.d.ts +34 -0
- package/dist/types/src/dto/items/itemResponse.d.ts +15 -0
- package/dist/types/src/errors/KeezError.d.ts +11 -0
- package/dist/types/src/helpers/logger.d.ts +2 -0
- package/dist/types/src/index.d.ts +11 -0
- package/dist/types/src/keezApi.d.ts +114 -0
- package/dist/types/tests/additional-coverage.test.d.ts +1 -0
- package/dist/types/tests/edge-cases.test.d.ts +1 -0
- package/dist/types/tests/error-handling.test.d.ts +1 -0
- package/dist/types/tests/filter-params.test.d.ts +1 -0
- package/dist/types/tests/index.test.d.ts +1 -0
- package/dist/types/tests/invoices-extended.test.d.ts +1 -0
- package/dist/types/tests/items.test.d.ts +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const nock = require("nock");
|
|
4
|
+
const keezApi_1 = require("../src/keezApi");
|
|
5
|
+
const paymentType_1 = require("../src/config/paymentType");
|
|
6
|
+
const measureUnit_1 = require("../src/config/measureUnit");
|
|
7
|
+
const KeezError_1 = require("../src/errors/KeezError");
|
|
8
|
+
describe('Error Handling Tests', () => {
|
|
9
|
+
let keezApi;
|
|
10
|
+
const baseDomain = 'https://staging.keez.ro';
|
|
11
|
+
const clientEid = 'test-client-eid';
|
|
12
|
+
beforeAll(() => {
|
|
13
|
+
keezApi = new keezApi_1.KeezApi({
|
|
14
|
+
application_id: 'test-app-id',
|
|
15
|
+
client_eid: clientEid,
|
|
16
|
+
secret: 'test-secret',
|
|
17
|
+
live: false,
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
nock(baseDomain)
|
|
22
|
+
.post('/idp/connect/token')
|
|
23
|
+
.reply(200, {
|
|
24
|
+
access_token: 'test-token',
|
|
25
|
+
expires_in: 3600,
|
|
26
|
+
token_type: 'Bearer',
|
|
27
|
+
scope: 'public-api',
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
afterEach(() => {
|
|
31
|
+
nock.cleanAll();
|
|
32
|
+
});
|
|
33
|
+
describe('Invoice Error Handling', () => {
|
|
34
|
+
describe('cancelInvoice', () => {
|
|
35
|
+
it('should throw KeezApiError when cancel fails', async () => {
|
|
36
|
+
nock(baseDomain)
|
|
37
|
+
.post(`/api/v1.0/public-api/${clientEid}/invoices/canceled`)
|
|
38
|
+
.reply(400, { Message: 'Invoice cannot be canceled' });
|
|
39
|
+
await expect(keezApi.cancelInvoice('inv-123')).rejects.toThrow(KeezError_1.KeezApiError);
|
|
40
|
+
});
|
|
41
|
+
it('should throw KeezApiError on server error during cancel', async () => {
|
|
42
|
+
nock(baseDomain)
|
|
43
|
+
.post(`/api/v1.0/public-api/${clientEid}/invoices/canceled`)
|
|
44
|
+
.reply(500, { error: 'Internal Server Error' });
|
|
45
|
+
await expect(keezApi.cancelInvoice('inv-123')).rejects.toThrow(KeezError_1.KeezApiError);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('deleteInvoice', () => {
|
|
49
|
+
it('should throw KeezApiError when delete fails', async () => {
|
|
50
|
+
nock(baseDomain)
|
|
51
|
+
.delete(`/api/v1.0/public-api/${clientEid}/invoices`)
|
|
52
|
+
.reply(400, { Message: 'Invoice cannot be deleted' });
|
|
53
|
+
await expect(keezApi.deleteInvoice('inv-123')).rejects.toThrow(KeezError_1.KeezApiError);
|
|
54
|
+
});
|
|
55
|
+
it('should throw KeezApiError when invoice not found for delete', async () => {
|
|
56
|
+
nock(baseDomain)
|
|
57
|
+
.delete(`/api/v1.0/public-api/${clientEid}/invoices`)
|
|
58
|
+
.reply(404, { error: 'Invoice not found' });
|
|
59
|
+
await expect(keezApi.deleteInvoice('non-existent')).rejects.toThrow(KeezError_1.KeezApiError);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe('downloadInvoicePdf', () => {
|
|
63
|
+
it('should throw KeezApiError when PDF download fails', async () => {
|
|
64
|
+
nock(baseDomain)
|
|
65
|
+
.get('/api/v1.0/public-api/invoices/inv-123/pdf')
|
|
66
|
+
.reply(404, { error: 'Invoice not found' });
|
|
67
|
+
await expect(keezApi.downloadInvoicePdf('inv-123')).rejects.toThrow(KeezError_1.KeezApiError);
|
|
68
|
+
});
|
|
69
|
+
it('should throw KeezApiError on server error during PDF download', async () => {
|
|
70
|
+
nock(baseDomain)
|
|
71
|
+
.get('/api/v1.0/public-api/invoices/inv-123/pdf')
|
|
72
|
+
.reply(500, { error: 'PDF generation failed' });
|
|
73
|
+
await expect(keezApi.downloadInvoicePdf('inv-123')).rejects.toThrow(KeezError_1.KeezApiError);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe('updateInvoice', () => {
|
|
77
|
+
const invoiceData = {
|
|
78
|
+
series: 'INV',
|
|
79
|
+
documentDate: 20230101,
|
|
80
|
+
dueDate: 20230115,
|
|
81
|
+
currencyCode: 'RON',
|
|
82
|
+
paymentType: paymentType_1.PaymentType.BANK_TRANSFER,
|
|
83
|
+
partner: {
|
|
84
|
+
isLegalPerson: false,
|
|
85
|
+
partnerName: 'Test Partner',
|
|
86
|
+
identificationNumber: '123456',
|
|
87
|
+
countryCode: 'RO',
|
|
88
|
+
countryName: 'Romania',
|
|
89
|
+
countyCode: 'B',
|
|
90
|
+
countyName: 'Bucuresti',
|
|
91
|
+
cityName: 'Bucuresti',
|
|
92
|
+
addressDetails: 'Test Address',
|
|
93
|
+
},
|
|
94
|
+
items: [
|
|
95
|
+
{
|
|
96
|
+
itemExternalId: 'item-1',
|
|
97
|
+
measureUnitId: 1,
|
|
98
|
+
quantity: 2,
|
|
99
|
+
unitPrice: 100,
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
};
|
|
103
|
+
it('should throw KeezApiError when update fails', async () => {
|
|
104
|
+
nock(baseDomain)
|
|
105
|
+
.put(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
|
|
106
|
+
.reply(400, { Message: 'Invalid invoice data' });
|
|
107
|
+
await expect(keezApi.updateInvoice('inv-123', invoiceData)).rejects.toThrow(KeezError_1.KeezApiError);
|
|
108
|
+
});
|
|
109
|
+
it('should throw KeezApiError when invoice not found for update', async () => {
|
|
110
|
+
nock(baseDomain)
|
|
111
|
+
.put(`/api/v1.0/public-api/${clientEid}/invoices/non-existent`)
|
|
112
|
+
.reply(404, { error: 'Invoice not found' });
|
|
113
|
+
await expect(keezApi.updateInvoice('non-existent', invoiceData)).rejects.toThrow(KeezError_1.KeezApiError);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe('submitInvoiceToEfactura', () => {
|
|
117
|
+
it('should throw KeezApiError when submission fails', async () => {
|
|
118
|
+
nock(baseDomain)
|
|
119
|
+
.post(`/api/v1.0/public-api/${clientEid}/invoices/efactura/submitted`)
|
|
120
|
+
.reply(400, { Message: 'Invoice not validated' });
|
|
121
|
+
await expect(keezApi.submitInvoiceToEfactura('inv-123')).rejects.toThrow(KeezError_1.KeezApiError);
|
|
122
|
+
});
|
|
123
|
+
it('should throw KeezApiError on server error during submission', async () => {
|
|
124
|
+
nock(baseDomain)
|
|
125
|
+
.post(`/api/v1.0/public-api/${clientEid}/invoices/efactura/submitted`)
|
|
126
|
+
.reply(500, { error: 'eFactura service unavailable' });
|
|
127
|
+
await expect(keezApi.submitInvoiceToEfactura('inv-123')).rejects.toThrow(KeezError_1.KeezApiError);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
describe('Item Error Handling', () => {
|
|
132
|
+
describe('createItem', () => {
|
|
133
|
+
it('should throw KeezApiError when create fails', async () => {
|
|
134
|
+
nock(baseDomain)
|
|
135
|
+
.post(`/api/v1.0/public-api/${clientEid}/items`)
|
|
136
|
+
.reply(400, { Message: 'Invalid item data' });
|
|
137
|
+
await expect(keezApi.createItem({
|
|
138
|
+
itemName: 'Test Item',
|
|
139
|
+
measureUnitId: measureUnit_1.MeasureUnit.PIECE,
|
|
140
|
+
unitPrice: 100,
|
|
141
|
+
vatPercent: 19,
|
|
142
|
+
})).rejects.toThrow(KeezError_1.KeezApiError);
|
|
143
|
+
});
|
|
144
|
+
it('should throw KeezApiError on server error during create', async () => {
|
|
145
|
+
nock(baseDomain)
|
|
146
|
+
.post(`/api/v1.0/public-api/${clientEid}/items`)
|
|
147
|
+
.reply(500, { error: 'Internal Server Error' });
|
|
148
|
+
await expect(keezApi.createItem({
|
|
149
|
+
itemName: 'Test Item',
|
|
150
|
+
measureUnitId: measureUnit_1.MeasureUnit.PIECE,
|
|
151
|
+
unitPrice: 100,
|
|
152
|
+
vatPercent: 19,
|
|
153
|
+
})).rejects.toThrow(KeezError_1.KeezApiError);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
describe('getAllItems', () => {
|
|
157
|
+
it('should throw KeezApiError when fetch fails', async () => {
|
|
158
|
+
nock(baseDomain)
|
|
159
|
+
.get(`/api/v1.0/public-api/${clientEid}/items`)
|
|
160
|
+
.reply(500, { error: 'Internal Server Error' });
|
|
161
|
+
await expect(keezApi.getAllItems()).rejects.toThrow(KeezError_1.KeezApiError);
|
|
162
|
+
});
|
|
163
|
+
it('should throw KeezApiError on unauthorized access', async () => {
|
|
164
|
+
nock(baseDomain)
|
|
165
|
+
.get(`/api/v1.0/public-api/${clientEid}/items`)
|
|
166
|
+
.reply(401, { error: 'Unauthorized' });
|
|
167
|
+
await expect(keezApi.getAllItems()).rejects.toThrow(KeezError_1.KeezApiError);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('getItemByExternalId', () => {
|
|
171
|
+
it('should throw KeezApiError when item not found', async () => {
|
|
172
|
+
nock(baseDomain)
|
|
173
|
+
.get(`/api/v1.0/public-api/${clientEid}/items/non-existent`)
|
|
174
|
+
.reply(404, { error: 'Item not found' });
|
|
175
|
+
await expect(keezApi.getItemByExternalId('non-existent')).rejects.toThrow(KeezError_1.KeezApiError);
|
|
176
|
+
});
|
|
177
|
+
it('should throw KeezApiError on server error', async () => {
|
|
178
|
+
nock(baseDomain)
|
|
179
|
+
.get(`/api/v1.0/public-api/${clientEid}/items/item-123`)
|
|
180
|
+
.reply(500, { error: 'Internal Server Error' });
|
|
181
|
+
await expect(keezApi.getItemByExternalId('item-123')).rejects.toThrow(KeezError_1.KeezApiError);
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
describe('updateItem', () => {
|
|
185
|
+
it('should throw KeezApiError when update fails', async () => {
|
|
186
|
+
nock(baseDomain)
|
|
187
|
+
.put(`/api/v1.0/public-api/${clientEid}/items/item-123`)
|
|
188
|
+
.reply(400, { Message: 'Invalid item data' });
|
|
189
|
+
await expect(keezApi.updateItem('item-123', {
|
|
190
|
+
itemName: 'Updated Item',
|
|
191
|
+
measureUnitId: measureUnit_1.MeasureUnit.PIECE,
|
|
192
|
+
unitPrice: 150,
|
|
193
|
+
vatPercent: 19,
|
|
194
|
+
})).rejects.toThrow(KeezError_1.KeezApiError);
|
|
195
|
+
});
|
|
196
|
+
it('should throw KeezApiError when item not found for update', async () => {
|
|
197
|
+
nock(baseDomain)
|
|
198
|
+
.put(`/api/v1.0/public-api/${clientEid}/items/non-existent`)
|
|
199
|
+
.reply(404, { error: 'Item not found' });
|
|
200
|
+
await expect(keezApi.updateItem('non-existent', {
|
|
201
|
+
itemName: 'Updated Item',
|
|
202
|
+
measureUnitId: measureUnit_1.MeasureUnit.PIECE,
|
|
203
|
+
unitPrice: 150,
|
|
204
|
+
vatPercent: 19,
|
|
205
|
+
})).rejects.toThrow(KeezError_1.KeezApiError);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
describe('patchItem', () => {
|
|
209
|
+
it('should throw KeezApiError when patch fails', async () => {
|
|
210
|
+
nock(baseDomain)
|
|
211
|
+
.patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
|
|
212
|
+
.reply(400, { Message: 'Invalid patch data' });
|
|
213
|
+
await expect(keezApi.patchItem('item-123', { unitPrice: -100 })).rejects.toThrow(KeezError_1.KeezApiError);
|
|
214
|
+
});
|
|
215
|
+
it('should throw KeezApiError when item not found for patch', async () => {
|
|
216
|
+
nock(baseDomain)
|
|
217
|
+
.patch(`/api/v1.0/public-api/${clientEid}/items/non-existent`)
|
|
218
|
+
.reply(404, { error: 'Item not found' });
|
|
219
|
+
await expect(keezApi.patchItem('non-existent', { unitPrice: 100 })).rejects.toThrow(KeezError_1.KeezApiError);
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItaGFuZGxpbmcudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3RzL2Vycm9yLWhhbmRsaW5nLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBOEI7QUFDOUIsdUNBQW9DO0FBQ3BDLHNEQUFtRDtBQUNuRCxzREFBbUQ7QUFDbkQsa0RBQWtEO0FBRWxELFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLEVBQUU7SUFDbEMsSUFBSSxPQUFnQixDQUFDO0lBQ3JCLE1BQU0sVUFBVSxHQUFHLHlCQUF5QixDQUFDO0lBQzdDLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDO0lBRXBDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDWCxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDO1lBQ2xCLGNBQWMsRUFBRSxhQUFhO1lBQzdCLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLE1BQU0sRUFBRSxhQUFhO1lBQ3JCLElBQUksRUFBRSxLQUFLO1NBQ2QsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFFSCxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ1osSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUNYLElBQUksQ0FBQyxvQkFBb0IsQ0FBQzthQUMxQixLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ1IsWUFBWSxFQUFFLFlBQVk7WUFDMUIsVUFBVSxFQUFFLElBQUk7WUFDaEIsVUFBVSxFQUFFLFFBQVE7WUFDcEIsS0FBSyxFQUFFLFlBQVk7U0FDdEIsQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ1gsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsRUFBRTtRQUNwQyxRQUFRLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtZQUMzQixFQUFFLENBQUMsNkNBQTZDLEVBQUUs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QUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHdCQUFZLENBQUMsQ0FBQztZQUN0RyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHsgS2VlekFwaSB9IGZyb20gJ0Ava2VlekFwaSc7XG5pbXBvcnQgeyBQYXltZW50VHlwZSB9IGZyb20gJ0AvY29uZmlnL3BheW1lbnRUeXBlJztcbmltcG9ydCB7IE1lYXN1cmVVbml0IH0gZnJvbSAnQC9jb25maWcvbWVhc3VyZVVuaXQnO1xuaW1wb3J0IHsgS2VlekFwaUVycm9yIH0gZnJvbSAnQC9lcnJvcnMvS2VlekVycm9yJztcblxuZGVzY3JpYmUoJ0Vycm9yIEhhbmRsaW5nIFRlc3RzJywgKCkgPT4ge1xuICAgIGxldCBrZWV6QXBpOiBLZWV6QXBpO1xuICAgIGNvbnN0IGJhc2VEb21haW4gPSAnaHR0cHM6Ly9zdGFnaW5nLmtlZXoucm8nO1xuICAgIGNvbnN0IGNsaWVudEVpZCA9ICd0ZXN0LWNsaWVudC1laWQnO1xuXG4gICAgYmVmb3JlQWxsKCgpID0+IHtcbiAgICAgICAga2VlekFwaSA9IG5ldyBLZWV6QXBpKHtcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uX2lkOiAndGVzdC1hcHAtaWQnLFxuICAgICAgICAgICAgY2xpZW50X2VpZDogY2xpZW50RWlkLFxuICAgICAgICAgICAgc2VjcmV0OiAndGVzdC1zZWNyZXQnLFxuICAgICAgICAgICAgbGl2ZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgIC5wb3N0KCcvaWRwL2Nvbm5lY3QvdG9rZW4nKVxuICAgICAgICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICAgICAgICAgIGFjY2Vzc190b2tlbjogJ3Rlc3QtdG9rZW4nLFxuICAgICAgICAgICAgICAgIGV4cGlyZXNfaW46IDM2MDAsXG4gICAgICAgICAgICAgICAgdG9rZW5fdHlwZTogJ0JlYXJlcicsXG4gICAgICAgICAgICAgICAgc2NvcGU6ICdwdWJsaWMtYXBpJyxcbiAgICAgICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0ludm9pY2UgRXJyb3IgSGFuZGxpbmcnLCAoKSA9PiB7XG4gICAgICAgIGRlc2NyaWJlKCdjYW5jZWxJbnZvaWNlJywgKCkgPT4ge1xuICAgICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBLZWV6QXBpRXJyb3Igd2hlbiBjYW5jZWwgZmFpbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgICAgICAucG9zdChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzL2NhbmNlbGVkYClcbiAgICAgICAgICAgICAgICAgICAgLnJlcGx5KDQwMCwgeyBNZXNzYWdlOiAnSW52b2ljZSBjYW5ub3QgYmUgY2FuY2VsZWQnIH0pO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhwZWN0KGtlZXpBcGkuY2FuY2VsSW52b2ljZSgnaW52LTEyMycpKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IEtlZXpBcGlFcnJvciBvbiBzZXJ2ZXIgZXJyb3IgZHVyaW5nIGNhbmNlbCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgICAgIC5wb3N0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaW52b2ljZXMvY2FuY2VsZWRgKVxuICAgICAgICAgICAgICAgICAgICAucmVwbHkoNTAwLCB7IGVycm9yOiAnSW50ZXJuYWwgU2VydmVyIEVycm9yJyB9KTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IGV4cGVjdChrZWV6QXBpLmNhbmNlbEludm9pY2UoJ2ludi0xMjMnKSkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2RlbGV0ZUludm9pY2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IEtlZXpBcGlFcnJvciB3aGVuIGRlbGV0ZSBmYWlscycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgICAgIC5kZWxldGUoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlc2ApXG4gICAgICAgICAgICAgICAgICAgIC5yZXBseSg0MDAsIHsgTWVzc2FnZTogJ0ludm9pY2UgY2Fubm90IGJlIGRlbGV0ZWQnIH0pO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhwZWN0KGtlZXpBcGkuZGVsZXRlSW52b2ljZSgnaW52LTEyMycpKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IEtlZXpBcGlFcnJvciB3aGVuIGludm9pY2Ugbm90IGZvdW5kIGZvciBkZWxldGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgICAgICAuZGVsZXRlKGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaW52b2ljZXNgKVxuICAgICAgICAgICAgICAgICAgICAucmVwbHkoNDA0LCB7IGVycm9yOiAnSW52b2ljZSBub3QgZm91bmQnIH0pO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhwZWN0KGtlZXpBcGkuZGVsZXRlSW52b2ljZSgnbm9uLWV4aXN0ZW50JykpLnJlamVjdHMudG9UaHJvdyhLZWV6QXBpRXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCdkb3dubG9hZEludm9pY2VQZGYnLCAoKSA9PiB7XG4gICAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IEtlZXpBcGlFcnJvciB3aGVuIFBERiBkb3dubG9hZCBmYWlscycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoJy9hcGkvdjEuMC9wdWJsaWMtYXBpL2ludm9pY2VzL2ludi0xMjMvcGRmJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGx5KDQwNCwgeyBlcnJvcjogJ0ludm9pY2Ugbm90IGZvdW5kJyB9KTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IGV4cGVjdChrZWV6QXBpLmRvd25sb2FkSW52b2ljZVBkZignaW52LTEyMycpKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IEtlZXpBcGlFcnJvciBvbiBzZXJ2ZXIgZXJyb3IgZHVyaW5nIFBERiBkb3dubG9hZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoJy9hcGkvdjEuMC9wdWJsaWMtYXBpL2ludm9pY2VzL2ludi0xMjMvcGRmJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGx5KDUwMCwgeyBlcnJvcjogJ1BERiBnZW5lcmF0aW9uIGZhaWxlZCcgfSk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBleHBlY3Qoa2VlekFwaS5kb3dubG9hZEludm9pY2VQZGYoJ2ludi0xMjMnKSkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ3VwZGF0ZUludm9pY2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnZvaWNlRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBzZXJpZXM6ICdJTlYnLFxuICAgICAgICAgICAgICAgIGRvY3VtZW50RGF0ZTogMjAyMzAxMDEsXG4gICAgICAgICAgICAgICAgZHVlRGF0ZTogMjAyMzAxMTUsXG4gICAgICAgICAgICAgICAgY3VycmVuY3lDb2RlOiAnUk9OJyxcbiAgICAgICAgICAgICAgICBwYXltZW50VHlwZTogUGF5bWVudFR5cGUuQkFOS19UUkFOU0ZFUixcbiAgICAgICAgICAgICAgICBwYXJ0bmVyOiB7XG4gICAgICAgICAgICAgICAgICAgIGlzTGVnYWxQZXJzb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyTmFtZTogJ1Rlc3QgUGFydG5lcicsXG4gICAgICAgICAgICAgICAgICAgIGlkZW50aWZpY2F0aW9uTnVtYmVyOiAnMTIzNDU2JyxcbiAgICAgICAgICAgICAgICAgICAgY291bnRyeUNvZGU6ICdSTycsXG4gICAgICAgICAgICAgICAgICAgIGNvdW50cnlOYW1lOiAnUm9tYW5pYScsXG4gICAgICAgICAgICAgICAgICAgIGNvdW50eUNvZGU6ICdCJyxcbiAgICAgICAgICAgICAgICAgICAgY291bnR5TmFtZTogJ0J1Y3VyZXN0aScsXG4gICAgICAgICAgICAgICAgICAgIGNpdHlOYW1lOiAnQnVjdXJlc3RpJyxcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzc0RldGFpbHM6ICdUZXN0IEFkZHJlc3MnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUV4dGVybmFsSWQ6ICdpdGVtLTEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVVuaXRJZDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXR5OiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pdFByaWNlOiAxMDAsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgdGhyb3cgS2VlekFwaUVycm9yIHdoZW4gdXBkYXRlIGZhaWxzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLnB1dChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzL2ludi0xMjNgKVxuICAgICAgICAgICAgICAgICAgICAucmVwbHkoNDAwLCB7IE1lc3NhZ2U6ICdJbnZhbGlkIGludm9pY2UgZGF0YScgfSk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBleHBlY3Qoa2VlekFwaS51cGRhdGVJbnZvaWNlKCdpbnYtMTIzJywgaW52b2ljZURhdGEpKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IEtlZXpBcGlFcnJvciB3aGVuIGludm9pY2Ugbm90IGZvdW5kIGZvciB1cGRhdGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgICAgICAucHV0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaW52b2ljZXMvbm9uLWV4aXN0ZW50YClcbiAgICAgICAgICAgICAgICAgICAgLnJlcGx5KDQwNCwgeyBlcnJvcjogJ0ludm9pY2Ugbm90IGZvdW5kJyB9KTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IGV4cGVjdChrZWV6QXBpLnVwZGF0ZUludm9pY2UoJ25vbi1leGlzdGVudCcsIGludm9pY2VEYXRhKSkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ3N1Ym1pdEludm9pY2VUb0VmYWN0dXJhJywgKCkgPT4ge1xuICAgICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBLZWV6QXBpRXJyb3Igd2hlbiBzdWJtaXNzaW9uIGZhaWxzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlcy9lZmFjdHVyYS9zdWJtaXR0ZWRgKVxuICAgICAgICAgICAgICAgICAgICAucmVwbHkoNDAwLCB7IE1lc3NhZ2U6ICdJbnZvaWNlIG5vdCB2YWxpZGF0ZWQnIH0pO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhwZWN0KGtlZXpBcGkuc3VibWl0SW52b2ljZVRvRWZhY3R1cmEoJ2ludi0xMjMnKSkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBLZWV6QXBpRXJyb3Igb24gc2VydmVyIGVycm9yIGR1cmluZyBzdWJtaXNzaW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlcy9lZmFjdHVyYS9zdWJtaXR0ZWRgKVxuICAgICAgICAgICAgICAgICAgICAucmVwbHkoNTAwLCB7IGVycm9yOiAnZUZhY3R1cmEgc2VydmljZSB1bmF2YWlsYWJsZScgfSk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBleHBlY3Qoa2VlekFwaS5zdWJtaXRJbnZvaWNlVG9FZmFjdHVyYSgnaW52LTEyMycpKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdJdGVtIEVycm9yIEhhbmRsaW5nJywgKCkgPT4ge1xuICAgICAgICBkZXNjcmliZSgnY3JlYXRlSXRlbScsICgpID0+IHtcbiAgICAgICAgICAgIGl0KCdzaG91bGQgdGhyb3cgS2VlekFwaUVycm9yIHdoZW4gY3JlYXRlIGZhaWxzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgICAgIC5yZXBseSg0MDAsIHsgTWVzc2FnZTogJ0ludmFsaWQgaXRlbSBkYXRhJyB9KTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgICAgICAgICAgICAga2VlekFwaS5jcmVhdGVJdGVtKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAnVGVzdCBJdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVVbml0SWQ6IE1lYXN1cmVVbml0LlBJRUNFLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pdFByaWNlOiAxMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXRQZXJjZW50OiAxOSxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApLnJlamVjdHMudG9UaHJvdyhLZWV6QXBpRXJyb3IpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgdGhyb3cgS2VlekFwaUVycm9yIG9uIHNlcnZlciBlcnJvciBkdXJpbmcgY3JlYXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgICAgIC5yZXBseSg1MDAsIHsgZXJyb3I6ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InIH0pO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgICAgICBrZWV6QXBpLmNyZWF0ZUl0ZW0oe1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdUZXN0IEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVVuaXRJZDogTWVhc3VyZVVuaXQuUElFQ0UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhdFBlcmNlbnQ6IDE5LFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2dldEFsbEl0ZW1zJywgKCkgPT4ge1xuICAgICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBLZWV6QXBpRXJyb3Igd2hlbiBmZXRjaCBmYWlscycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgICAgIC5yZXBseSg1MDAsIHsgZXJyb3I6ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InIH0pO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhwZWN0KGtlZXpBcGkuZ2V0QWxsSXRlbXMoKSkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBLZWV6QXBpRXJyb3Igb24gdW5hdXRob3JpemVkIGFjY2VzcycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgICAgIC5yZXBseSg0MDEsIHsgZXJyb3I6ICdVbmF1dGhvcml6ZWQnIH0pO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhwZWN0KGtlZXpBcGkuZ2V0QWxsSXRlbXMoKSkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2dldEl0ZW1CeUV4dGVybmFsSWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IEtlZXpBcGlFcnJvciB3aGVuIGl0ZW0gbm90IGZvdW5kJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLmdldChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zL25vbi1leGlzdGVudGApXG4gICAgICAgICAgICAgICAgICAgIC5yZXBseSg0MDQsIHsgZXJyb3I6ICdJdGVtIG5vdCBmb3VuZCcgfSk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBleHBlY3Qoa2VlekFwaS5nZXRJdGVtQnlFeHRlcm5hbElkKCdub24tZXhpc3RlbnQnKSkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBLZWV6QXBpRXJyb3Igb24gc2VydmVyIGVycm9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLmdldChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zL2l0ZW0tMTIzYClcbiAgICAgICAgICAgICAgICAgICAgLnJlcGx5KDUwMCwgeyBlcnJvcjogJ0ludGVybmFsIFNlcnZlciBFcnJvcicgfSk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBleHBlY3Qoa2VlekFwaS5nZXRJdGVtQnlFeHRlcm5hbElkKCdpdGVtLTEyMycpKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgndXBkYXRlSXRlbScsICgpID0+IHtcbiAgICAgICAgICAgIGl0KCdzaG91bGQgdGhyb3cgS2VlekFwaUVycm9yIHdoZW4gdXBkYXRlIGZhaWxzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLnB1dChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zL2l0ZW0tMTIzYClcbiAgICAgICAgICAgICAgICAgICAgLnJlcGx5KDQwMCwgeyBNZXNzYWdlOiAnSW52YWxpZCBpdGVtIGRhdGEnIH0pO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgICAgICBrZWV6QXBpLnVwZGF0ZUl0ZW0oJ2l0ZW0tMTIzJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdVcGRhdGVkIEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVVuaXRJZDogTWVhc3VyZVVuaXQuUElFQ0UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDE1MCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhdFBlcmNlbnQ6IDE5LFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBLZWV6QXBpRXJyb3Igd2hlbiBpdGVtIG5vdCBmb3VuZCBmb3IgdXBkYXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLnB1dChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zL25vbi1leGlzdGVudGApXG4gICAgICAgICAgICAgICAgICAgIC5yZXBseSg0MDQsIHsgZXJyb3I6ICdJdGVtIG5vdCBmb3VuZCcgfSk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgICAgICAgICAgICAgIGtlZXpBcGkudXBkYXRlSXRlbSgnbm9uLWV4aXN0ZW50Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdVcGRhdGVkIEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVVuaXRJZDogTWVhc3VyZVVuaXQuUElFQ0UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDE1MCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhdFBlcmNlbnQ6IDE5LFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ3BhdGNoSXRlbScsICgpID0+IHtcbiAgICAgICAgICAgIGl0KCdzaG91bGQgdGhyb3cgS2VlekFwaUVycm9yIHdoZW4gcGF0Y2ggZmFpbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgICAgICAucGF0Y2goYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtcy9pdGVtLTEyM2ApXG4gICAgICAgICAgICAgICAgICAgIC5yZXBseSg0MDAsIHsgTWVzc2FnZTogJ0ludmFsaWQgcGF0Y2ggZGF0YScgfSk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBleHBlY3Qoa2VlekFwaS5wYXRjaEl0ZW0oJ2l0ZW0tMTIzJywgeyB1bml0UHJpY2U6IC0xMDAgfSkpLnJlamVjdHMudG9UaHJvdyhLZWV6QXBpRXJyb3IpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgdGhyb3cgS2VlekFwaUVycm9yIHdoZW4gaXRlbSBub3QgZm91bmQgZm9yIHBhdGNoJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLnBhdGNoKGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXMvbm9uLWV4aXN0ZW50YClcbiAgICAgICAgICAgICAgICAgICAgLnJlcGx5KDQwNCwgeyBlcnJvcjogJ0l0ZW0gbm90IGZvdW5kJyB9KTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IGV4cGVjdChrZWV6QXBpLnBhdGNoSXRlbSgnbm9uLWV4aXN0ZW50JywgeyB1bml0UHJpY2U6IDEwMCB9KSkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1,267 @@
|
|
|
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
|
+
describe('Filter Parameters Tests', () => {
|
|
7
|
+
let keezApi;
|
|
8
|
+
const baseDomain = 'https://staging.keez.ro';
|
|
9
|
+
const clientEid = 'test-client-eid';
|
|
10
|
+
beforeAll(() => {
|
|
11
|
+
keezApi = new keezApi_1.KeezApi({
|
|
12
|
+
application_id: 'test-app-id',
|
|
13
|
+
client_eid: clientEid,
|
|
14
|
+
secret: 'test-secret',
|
|
15
|
+
live: false,
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
nock(baseDomain)
|
|
20
|
+
.post('/idp/connect/token')
|
|
21
|
+
.reply(200, {
|
|
22
|
+
access_token: 'test-token',
|
|
23
|
+
expires_in: 3600,
|
|
24
|
+
token_type: 'Bearer',
|
|
25
|
+
scope: 'public-api',
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
afterEach(() => {
|
|
29
|
+
nock.cleanAll();
|
|
30
|
+
});
|
|
31
|
+
describe('Invoice Filter Parameters', () => {
|
|
32
|
+
const mockInvoicesResponse = {
|
|
33
|
+
first: 0,
|
|
34
|
+
last: 0,
|
|
35
|
+
recordsCount: 1,
|
|
36
|
+
data: [
|
|
37
|
+
{
|
|
38
|
+
externalId: 'inv-1',
|
|
39
|
+
series: 'INV',
|
|
40
|
+
number: 1,
|
|
41
|
+
documentDate: 20230101,
|
|
42
|
+
dueDate: 20230115,
|
|
43
|
+
status: 'VALIDATED',
|
|
44
|
+
clientName: 'Test Client',
|
|
45
|
+
partnerName: 'Test Partner',
|
|
46
|
+
currencyCode: 'RON',
|
|
47
|
+
referenceCurrencyCode: 'RON',
|
|
48
|
+
netAmount: 100,
|
|
49
|
+
vatAmount: 19,
|
|
50
|
+
grossAmount: 119,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
};
|
|
54
|
+
it('should filter invoices by fromDate', async () => {
|
|
55
|
+
nock(baseDomain)
|
|
56
|
+
.get(`/api/v1.0/public-api/${clientEid}/invoices`)
|
|
57
|
+
.query({ fromDate: '20230101' })
|
|
58
|
+
.reply(200, mockInvoicesResponse);
|
|
59
|
+
const result = await keezApi.getAllInvoices({ fromDate: 20230101 });
|
|
60
|
+
expect(result.data).toHaveLength(1);
|
|
61
|
+
});
|
|
62
|
+
it('should filter invoices by toDate', async () => {
|
|
63
|
+
nock(baseDomain)
|
|
64
|
+
.get(`/api/v1.0/public-api/${clientEid}/invoices`)
|
|
65
|
+
.query({ toDate: '20231231' })
|
|
66
|
+
.reply(200, mockInvoicesResponse);
|
|
67
|
+
const result = await keezApi.getAllInvoices({ toDate: 20231231 });
|
|
68
|
+
expect(result.data).toHaveLength(1);
|
|
69
|
+
});
|
|
70
|
+
it('should filter invoices by series', async () => {
|
|
71
|
+
nock(baseDomain)
|
|
72
|
+
.get(`/api/v1.0/public-api/${clientEid}/invoices`)
|
|
73
|
+
.query({ series: 'INV' })
|
|
74
|
+
.reply(200, mockInvoicesResponse);
|
|
75
|
+
const result = await keezApi.getAllInvoices({ series: 'INV' });
|
|
76
|
+
expect(result.data).toHaveLength(1);
|
|
77
|
+
});
|
|
78
|
+
it('should filter invoices by partnerName', async () => {
|
|
79
|
+
nock(baseDomain)
|
|
80
|
+
.get(`/api/v1.0/public-api/${clientEid}/invoices`)
|
|
81
|
+
.query({ partnerName: 'Test Partner' })
|
|
82
|
+
.reply(200, mockInvoicesResponse);
|
|
83
|
+
const result = await keezApi.getAllInvoices({ partnerName: 'Test Partner' });
|
|
84
|
+
expect(result.data).toHaveLength(1);
|
|
85
|
+
});
|
|
86
|
+
it('should filter invoices by date range', async () => {
|
|
87
|
+
nock(baseDomain)
|
|
88
|
+
.get(`/api/v1.0/public-api/${clientEid}/invoices`)
|
|
89
|
+
.query({ fromDate: '20230101', toDate: '20231231' })
|
|
90
|
+
.reply(200, mockInvoicesResponse);
|
|
91
|
+
const result = await keezApi.getAllInvoices({ fromDate: 20230101, toDate: 20231231 });
|
|
92
|
+
expect(result.data).toHaveLength(1);
|
|
93
|
+
});
|
|
94
|
+
it('should combine multiple invoice filters', async () => {
|
|
95
|
+
nock(baseDomain)
|
|
96
|
+
.get(`/api/v1.0/public-api/${clientEid}/invoices`)
|
|
97
|
+
.query({
|
|
98
|
+
status: 'VALIDATED',
|
|
99
|
+
series: 'INV',
|
|
100
|
+
partnerName: 'Test Partner',
|
|
101
|
+
fromDate: '20230101',
|
|
102
|
+
toDate: '20231231',
|
|
103
|
+
offset: '0',
|
|
104
|
+
count: '10',
|
|
105
|
+
})
|
|
106
|
+
.reply(200, mockInvoicesResponse);
|
|
107
|
+
const result = await keezApi.getAllInvoices({
|
|
108
|
+
status: 'VALIDATED',
|
|
109
|
+
series: 'INV',
|
|
110
|
+
partnerName: 'Test Partner',
|
|
111
|
+
fromDate: 20230101,
|
|
112
|
+
toDate: 20231231,
|
|
113
|
+
offset: 0,
|
|
114
|
+
count: 10,
|
|
115
|
+
});
|
|
116
|
+
expect(result.data).toHaveLength(1);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe('Item Filter Parameters', () => {
|
|
120
|
+
const mockItemsResponse = {
|
|
121
|
+
first: 0,
|
|
122
|
+
last: 0,
|
|
123
|
+
recordsCount: 1,
|
|
124
|
+
data: [
|
|
125
|
+
{
|
|
126
|
+
externalId: 'item-1',
|
|
127
|
+
itemName: 'Test Item',
|
|
128
|
+
itemCode: 'TI001',
|
|
129
|
+
itemDescription: 'Test description',
|
|
130
|
+
measureUnitId: 1,
|
|
131
|
+
measureUnitName: 'Bucata',
|
|
132
|
+
unitPrice: 100,
|
|
133
|
+
vatPercent: 19,
|
|
134
|
+
vatCategoryCode: 'S',
|
|
135
|
+
vatExemptionReason: '',
|
|
136
|
+
isActive: true,
|
|
137
|
+
createdAt: 1700000000000,
|
|
138
|
+
updatedAt: 1700000000000,
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
};
|
|
142
|
+
it('should filter items by itemName', async () => {
|
|
143
|
+
nock(baseDomain)
|
|
144
|
+
.get(`/api/v1.0/public-api/${clientEid}/items`)
|
|
145
|
+
.query({ itemName: 'Test Item' })
|
|
146
|
+
.reply(200, mockItemsResponse);
|
|
147
|
+
const result = await keezApi.getAllItems({ itemName: 'Test Item' });
|
|
148
|
+
expect(result.data).toHaveLength(1);
|
|
149
|
+
});
|
|
150
|
+
it('should filter items by itemCode', async () => {
|
|
151
|
+
nock(baseDomain)
|
|
152
|
+
.get(`/api/v1.0/public-api/${clientEid}/items`)
|
|
153
|
+
.query({ itemCode: 'TI001' })
|
|
154
|
+
.reply(200, mockItemsResponse);
|
|
155
|
+
const result = await keezApi.getAllItems({ itemCode: 'TI001' });
|
|
156
|
+
expect(result.data).toHaveLength(1);
|
|
157
|
+
});
|
|
158
|
+
it('should filter items by isActive', async () => {
|
|
159
|
+
nock(baseDomain)
|
|
160
|
+
.get(`/api/v1.0/public-api/${clientEid}/items`)
|
|
161
|
+
.query({ isActive: 'true' })
|
|
162
|
+
.reply(200, mockItemsResponse);
|
|
163
|
+
const result = await keezApi.getAllItems({ isActive: true });
|
|
164
|
+
expect(result.data).toHaveLength(1);
|
|
165
|
+
});
|
|
166
|
+
it('should filter inactive items', async () => {
|
|
167
|
+
const inactiveItemsResponse = {
|
|
168
|
+
...mockItemsResponse,
|
|
169
|
+
data: [{ ...mockItemsResponse.data[0], isActive: false }],
|
|
170
|
+
};
|
|
171
|
+
nock(baseDomain)
|
|
172
|
+
.get(`/api/v1.0/public-api/${clientEid}/items`)
|
|
173
|
+
.query({ isActive: 'false' })
|
|
174
|
+
.reply(200, inactiveItemsResponse);
|
|
175
|
+
const result = await keezApi.getAllItems({ isActive: false });
|
|
176
|
+
expect(result.data).toHaveLength(1);
|
|
177
|
+
expect(result.data[0].isActive).toBe(false);
|
|
178
|
+
});
|
|
179
|
+
it('should combine multiple item filters', async () => {
|
|
180
|
+
nock(baseDomain)
|
|
181
|
+
.get(`/api/v1.0/public-api/${clientEid}/items`)
|
|
182
|
+
.query({
|
|
183
|
+
itemName: 'Test Item',
|
|
184
|
+
itemCode: 'TI001',
|
|
185
|
+
isActive: 'true',
|
|
186
|
+
offset: '0',
|
|
187
|
+
count: '10',
|
|
188
|
+
})
|
|
189
|
+
.reply(200, mockItemsResponse);
|
|
190
|
+
const result = await keezApi.getAllItems({
|
|
191
|
+
itemName: 'Test Item',
|
|
192
|
+
itemCode: 'TI001',
|
|
193
|
+
isActive: true,
|
|
194
|
+
offset: 0,
|
|
195
|
+
count: 10,
|
|
196
|
+
});
|
|
197
|
+
expect(result.data).toHaveLength(1);
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
describe('Patch Item with Multiple Fields', () => {
|
|
201
|
+
it('should patch item with all optional fields', async () => {
|
|
202
|
+
nock(baseDomain)
|
|
203
|
+
.patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
|
|
204
|
+
.reply(200);
|
|
205
|
+
await expect(keezApi.patchItem('item-123', {
|
|
206
|
+
itemName: 'Updated Name',
|
|
207
|
+
itemCode: 'NEW001',
|
|
208
|
+
itemDescription: 'Updated description',
|
|
209
|
+
measureUnitId: measureUnit_1.MeasureUnit.KILOGRAM,
|
|
210
|
+
unitPrice: 200,
|
|
211
|
+
vatPercent: 9,
|
|
212
|
+
vatCategoryCode: 'R',
|
|
213
|
+
vatExemptionReason: 'None',
|
|
214
|
+
isActive: false,
|
|
215
|
+
})).resolves.toBeUndefined();
|
|
216
|
+
});
|
|
217
|
+
it('should patch item with only itemName', async () => {
|
|
218
|
+
nock(baseDomain)
|
|
219
|
+
.patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
|
|
220
|
+
.reply(200);
|
|
221
|
+
await expect(keezApi.patchItem('item-123', { itemName: 'New Name' })).resolves.toBeUndefined();
|
|
222
|
+
});
|
|
223
|
+
it('should patch item with only itemCode', async () => {
|
|
224
|
+
nock(baseDomain)
|
|
225
|
+
.patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
|
|
226
|
+
.reply(200);
|
|
227
|
+
await expect(keezApi.patchItem('item-123', { itemCode: 'CODE001' })).resolves.toBeUndefined();
|
|
228
|
+
});
|
|
229
|
+
it('should patch item with itemDescription', async () => {
|
|
230
|
+
nock(baseDomain)
|
|
231
|
+
.patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
|
|
232
|
+
.reply(200);
|
|
233
|
+
await expect(keezApi.patchItem('item-123', { itemDescription: 'New description' })).resolves.toBeUndefined();
|
|
234
|
+
});
|
|
235
|
+
it('should patch item with measureUnitId', async () => {
|
|
236
|
+
nock(baseDomain)
|
|
237
|
+
.patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
|
|
238
|
+
.reply(200);
|
|
239
|
+
await expect(keezApi.patchItem('item-123', { measureUnitId: measureUnit_1.MeasureUnit.LITER })).resolves.toBeUndefined();
|
|
240
|
+
});
|
|
241
|
+
it('should patch item with vatPercent', async () => {
|
|
242
|
+
nock(baseDomain)
|
|
243
|
+
.patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
|
|
244
|
+
.reply(200);
|
|
245
|
+
await expect(keezApi.patchItem('item-123', { vatPercent: 5 })).resolves.toBeUndefined();
|
|
246
|
+
});
|
|
247
|
+
it('should patch item with vatCategoryCode', async () => {
|
|
248
|
+
nock(baseDomain)
|
|
249
|
+
.patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
|
|
250
|
+
.reply(200);
|
|
251
|
+
await expect(keezApi.patchItem('item-123', { vatCategoryCode: 'E' })).resolves.toBeUndefined();
|
|
252
|
+
});
|
|
253
|
+
it('should patch item with vatExemptionReason', async () => {
|
|
254
|
+
nock(baseDomain)
|
|
255
|
+
.patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
|
|
256
|
+
.reply(200);
|
|
257
|
+
await expect(keezApi.patchItem('item-123', { vatExemptionReason: 'Exempt for reason' })).resolves.toBeUndefined();
|
|
258
|
+
});
|
|
259
|
+
it('should patch item with isActive', async () => {
|
|
260
|
+
nock(baseDomain)
|
|
261
|
+
.patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
|
|
262
|
+
.reply(200);
|
|
263
|
+
await expect(keezApi.patchItem('item-123', { isActive: false })).resolves.toBeUndefined();
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLXBhcmFtcy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdHMvZmlsdGVyLXBhcmFtcy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQThCO0FBQzlCLHVDQUFvQztBQUNwQyxzREFBbUQ7QUFFbkQsUUFBUSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtJQUNyQyxJQUFJLE9BQWdCLENBQUM7SUFDckIsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUM7SUFDN0MsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUM7SUFFcEMsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNYLE9BQU8sR0FBRyxJQUFJLGlCQUFPLENBQUM7WUFDbEIsY0FBYyxFQUFFLGFBQWE7WUFDN0IsVUFBVSxFQUFFLFNBQVM7WUFDckIsTUFBTSxFQUFFLGFBQWE7WUFDckIsSUFBSSxFQUFFLEtBQUs7U0FDZCxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztJQUVILFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDWixJQUFJLENBQUMsVUFBVSxDQUFDO2FBQ1gsSUFBSSxDQUFDLG9CQUFvQixDQUFDO2FBQzFCLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDUixZQUFZLEVBQUUsWUFBWTtZQUMxQixVQUFVLEVBQUUsSUFBSTtZQUNoQixVQUFVLEVBQUUsUUFBUTtZQUNwQixLQUFLLEVBQUUsWUFBWTtTQUN0QixDQUFDLENBQUM7SUFDWCxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDWCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ3ZDLE1BQU0sb0JBQW9CLEdBQUc7WUFDekIsS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLEVBQUUsQ0FBQztZQUNQLFlBQVksRUFBRSxDQUFDO1lBQ2YsSUFB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aUIsQ0FBQztpQkFDekQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWhCLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDOUYsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG5vY2sgPSByZXF1aXJlKCdub2NrJyk7XG5pbXBvcnQgeyBLZWV6QXBpIH0gZnJvbSAnQC9rZWV6QXBpJztcbmltcG9ydCB7IE1lYXN1cmVVbml0IH0gZnJvbSAnQC9jb25maWcvbWVhc3VyZVVuaXQnO1xuXG5kZXNjcmliZSgnRmlsdGVyIFBhcmFtZXRlcnMgVGVzdHMnLCAoKSA9PiB7XG4gICAgbGV0IGtlZXpBcGk6IEtlZXpBcGk7XG4gICAgY29uc3QgYmFzZURvbWFpbiA9ICdodHRwczovL3N0YWdpbmcua2Vlei5ybyc7XG4gICAgY29uc3QgY2xpZW50RWlkID0gJ3Rlc3QtY2xpZW50LWVpZCc7XG5cbiAgICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgICAgICBrZWV6QXBpID0gbmV3IEtlZXpBcGkoe1xuICAgICAgICAgICAgYXBwbGljYXRpb25faWQ6ICd0ZXN0LWFwcC1pZCcsXG4gICAgICAgICAgICBjbGllbnRfZWlkOiBjbGllbnRFaWQsXG4gICAgICAgICAgICBzZWNyZXQ6ICd0ZXN0LXNlY3JldCcsXG4gICAgICAgICAgICBsaXZlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgLnBvc3QoJy9pZHAvY29ubmVjdC90b2tlbicpXG4gICAgICAgICAgICAucmVwbHkoMjAwLCB7XG4gICAgICAgICAgICAgICAgYWNjZXNzX3Rva2VuOiAndGVzdC10b2tlbicsXG4gICAgICAgICAgICAgICAgZXhwaXJlc19pbjogMzYwMCxcbiAgICAgICAgICAgICAgICB0b2tlbl90eXBlOiAnQmVhcmVyJyxcbiAgICAgICAgICAgICAgICBzY29wZTogJ3B1YmxpYy1hcGknLFxuICAgICAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICBub2NrLmNsZWFuQWxsKCk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnSW52b2ljZSBGaWx0ZXIgUGFyYW1ldGVycycsICgpID0+IHtcbiAgICAgICAgY29uc3QgbW9ja0ludm9pY2VzUmVzcG9uc2UgPSB7XG4gICAgICAgICAgICBmaXJzdDogMCxcbiAgICAgICAgICAgIGxhc3Q6IDAsXG4gICAgICAgICAgICByZWNvcmRzQ291bnQ6IDEsXG4gICAgICAgICAgICBkYXRhOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBleHRlcm5hbElkOiAnaW52LTEnLFxuICAgICAgICAgICAgICAgICAgICBzZXJpZXM6ICdJTlYnLFxuICAgICAgICAgICAgICAgICAgICBudW1iZXI6IDEsXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50RGF0ZTogMjAyMzAxMDEsXG4gICAgICAgICAgICAgICAgICAgIGR1ZURhdGU6IDIwMjMwMTE1LFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdWQUxJREFURUQnLFxuICAgICAgICAgICAgICAgICAgICBjbGllbnROYW1lOiAnVGVzdCBDbGllbnQnLFxuICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyTmFtZTogJ1Rlc3QgUGFydG5lcicsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5Q29kZTogJ1JPTicsXG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZUN1cnJlbmN5Q29kZTogJ1JPTicsXG4gICAgICAgICAgICAgICAgICAgIG5ldEFtb3VudDogMTAwLFxuICAgICAgICAgICAgICAgICAgICB2YXRBbW91bnQ6IDE5LFxuICAgICAgICAgICAgICAgICAgICBncm9zc0Ftb3VudDogMTE5LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGl0KCdzaG91bGQgZmlsdGVyIGludm9pY2VzIGJ5IGZyb21EYXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5nZXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlc2ApXG4gICAgICAgICAgICAgICAgLnF1ZXJ5KHsgZnJvbURhdGU6ICcyMDIzMDEwMScgfSlcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwLCBtb2NrSW52b2ljZXNSZXNwb25zZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGtlZXpBcGkuZ2V0QWxsSW52b2ljZXMoeyBmcm9tRGF0ZTogMjAyMzAxMDEgfSk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0LmRhdGEpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBmaWx0ZXIgaW52b2ljZXMgYnkgdG9EYXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5nZXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlc2ApXG4gICAgICAgICAgICAgICAgLnF1ZXJ5KHsgdG9EYXRlOiAnMjAyMzEyMzEnIH0pXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCwgbW9ja0ludm9pY2VzUmVzcG9uc2UpO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZWV6QXBpLmdldEFsbEludm9pY2VzKHsgdG9EYXRlOiAyMDIzMTIzMSB9KTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQuZGF0YSkudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZpbHRlciBpbnZvaWNlcyBieSBzZXJpZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLmdldChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzYClcbiAgICAgICAgICAgICAgICAucXVlcnkoeyBzZXJpZXM6ICdJTlYnIH0pXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCwgbW9ja0ludm9pY2VzUmVzcG9uc2UpO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZWV6QXBpLmdldEFsbEludm9pY2VzKHsgc2VyaWVzOiAnSU5WJyB9KTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQuZGF0YSkudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZpbHRlciBpbnZvaWNlcyBieSBwYXJ0bmVyTmFtZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAuZ2V0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaW52b2ljZXNgKVxuICAgICAgICAgICAgICAgIC5xdWVyeSh7IHBhcnRuZXJOYW1lOiAnVGVzdCBQYXJ0bmVyJyB9KVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDAsIG1vY2tJbnZvaWNlc1Jlc3BvbnNlKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VlekFwaS5nZXRBbGxJbnZvaWNlcyh7IHBhcnRuZXJOYW1lOiAnVGVzdCBQYXJ0bmVyJyB9KTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQuZGF0YSkudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZpbHRlciBpbnZvaWNlcyBieSBkYXRlIHJhbmdlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5nZXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlc2ApXG4gICAgICAgICAgICAgICAgLnF1ZXJ5KHsgZnJvbURhdGU6ICcyMDIzMDEwMScsIHRvRGF0ZTogJzIwMjMxMjMxJyB9KVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDAsIG1vY2tJbnZvaWNlc1Jlc3BvbnNlKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VlekFwaS5nZXRBbGxJbnZvaWNlcyh7IGZyb21EYXRlOiAyMDIzMDEwMSwgdG9EYXRlOiAyMDIzMTIzMSB9KTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQuZGF0YSkudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNvbWJpbmUgbXVsdGlwbGUgaW52b2ljZSBmaWx0ZXJzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5nZXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlc2ApXG4gICAgICAgICAgICAgICAgLnF1ZXJ5KHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnVkFMSURBVEVEJyxcbiAgICAgICAgICAgICAgICAgICAgc2VyaWVzOiAnSU5WJyxcbiAgICAgICAgICAgICAgICAgICAgcGFydG5lck5hbWU6ICdUZXN0IFBhcnRuZXInLFxuICAgICAgICAgICAgICAgICAgICBmcm9tRGF0ZTogJzIwMjMwMTAxJyxcbiAgICAgICAgICAgICAgICAgICAgdG9EYXRlOiAnMjAyMzEyMzEnLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6ICcwJyxcbiAgICAgICAgICAgICAgICAgICAgY291bnQ6ICcxMCcsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwLCBtb2NrSW52b2ljZXNSZXNwb25zZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGtlZXpBcGkuZ2V0QWxsSW52b2ljZXMoe1xuICAgICAgICAgICAgICAgIHN0YXR1czogJ1ZBTElEQVRFRCcsXG4gICAgICAgICAgICAgICAgc2VyaWVzOiAnSU5WJyxcbiAgICAgICAgICAgICAgICBwYXJ0bmVyTmFtZTogJ1Rlc3QgUGFydG5lcicsXG4gICAgICAgICAgICAgICAgZnJvbURhdGU6IDIwMjMwMTAxLFxuICAgICAgICAgICAgICAgIHRvRGF0ZTogMjAyMzEyMzEsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgICAgICAgIGNvdW50OiAxMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5kYXRhKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0l0ZW0gRmlsdGVyIFBhcmFtZXRlcnMnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vY2tJdGVtc1Jlc3BvbnNlID0ge1xuICAgICAgICAgICAgZmlyc3Q6IDAsXG4gICAgICAgICAgICBsYXN0OiAwLFxuICAgICAgICAgICAgcmVjb3Jkc0NvdW50OiAxLFxuICAgICAgICAgICAgZGF0YTogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxJZDogJ2l0ZW0tMScsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAnVGVzdCBJdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgaXRlbUNvZGU6ICdUSTAwMScsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1EZXNjcmlwdGlvbjogJ1Rlc3QgZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlVW5pdElkOiAxLFxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlVW5pdE5hbWU6ICdCdWNhdGEnLFxuICAgICAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgdmF0UGVyY2VudDogMTksXG4gICAgICAgICAgICAgICAgICAgIHZhdENhdGVnb3J5Q29kZTogJ1MnLFxuICAgICAgICAgICAgICAgICAgICB2YXRFeGVtcHRpb25SZWFzb246ICcnLFxuICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiAxNzAwMDAwMDAwMDAwLFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IDE3MDAwMDAwMDAwMDAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH07XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBmaWx0ZXIgaXRlbXMgYnkgaXRlbU5hbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLmdldChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zYClcbiAgICAgICAgICAgICAgICAucXVlcnkoeyBpdGVtTmFtZTogJ1Rlc3QgSXRlbScgfSlcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwLCBtb2NrSXRlbXNSZXNwb25zZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGtlZXpBcGkuZ2V0QWxsSXRlbXMoeyBpdGVtTmFtZTogJ1Rlc3QgSXRlbScgfSk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0LmRhdGEpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBmaWx0ZXIgaXRlbXMgYnkgaXRlbUNvZGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLmdldChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zYClcbiAgICAgICAgICAgICAgICAucXVlcnkoeyBpdGVtQ29kZTogJ1RJMDAxJyB9KVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDAsIG1vY2tJdGVtc1Jlc3BvbnNlKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VlekFwaS5nZXRBbGxJdGVtcyh7IGl0ZW1Db2RlOiAnVEkwMDEnIH0pO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5kYXRhKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgZmlsdGVyIGl0ZW1zIGJ5IGlzQWN0aXZlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5nZXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgLnF1ZXJ5KHsgaXNBY3RpdmU6ICd0cnVlJyB9KVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDAsIG1vY2tJdGVtc1Jlc3BvbnNlKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VlekFwaS5nZXRBbGxJdGVtcyh7IGlzQWN0aXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5kYXRhKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgZmlsdGVyIGluYWN0aXZlIGl0ZW1zJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5hY3RpdmVJdGVtc1Jlc3BvbnNlID0ge1xuICAgICAgICAgICAgICAgIC4uLm1vY2tJdGVtc1Jlc3BvbnNlLFxuICAgICAgICAgICAgICAgIGRhdGE6IFt7IC4uLm1vY2tJdGVtc1Jlc3BvbnNlLmRhdGFbMF0sIGlzQWN0aXZlOiBmYWxzZSB9XSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAuZ2V0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXNgKVxuICAgICAgICAgICAgICAgIC5xdWVyeSh7IGlzQWN0aXZlOiAnZmFsc2UnIH0pXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCwgaW5hY3RpdmVJdGVtc1Jlc3BvbnNlKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VlekFwaS5nZXRBbGxJdGVtcyh7IGlzQWN0aXZlOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQuZGF0YSkudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5kYXRhWzBdLmlzQWN0aXZlKS50b0JlKGZhbHNlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBjb21iaW5lIG11bHRpcGxlIGl0ZW0gZmlsdGVycycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAuZ2V0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXNgKVxuICAgICAgICAgICAgICAgIC5xdWVyeSh7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAnVGVzdCBJdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgaXRlbUNvZGU6ICdUSTAwMScsXG4gICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlOiAndHJ1ZScsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogJzAnLFxuICAgICAgICAgICAgICAgICAgICBjb3VudDogJzEwJyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDAsIG1vY2tJdGVtc1Jlc3BvbnNlKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VlekFwaS5nZXRBbGxJdGVtcyh7XG4gICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdUZXN0IEl0ZW0nLFxuICAgICAgICAgICAgICAgIGl0ZW1Db2RlOiAnVEkwMDEnLFxuICAgICAgICAgICAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICAgICAgICBjb3VudDogMTAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQuZGF0YSkudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdQYXRjaCBJdGVtIHdpdGggTXVsdGlwbGUgRmllbGRzJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHBhdGNoIGl0ZW0gd2l0aCBhbGwgb3B0aW9uYWwgZmllbGRzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wYXRjaChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zL2l0ZW0tMTIzYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGtlZXpBcGkucGF0Y2hJdGVtKCdpdGVtLTEyMycsIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdVcGRhdGVkIE5hbWUnLFxuICAgICAgICAgICAgICAgICAgICBpdGVtQ29kZTogJ05FVzAwMScsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1EZXNjcmlwdGlvbjogJ1VwZGF0ZWQgZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlVW5pdElkOiBNZWFzdXJlVW5pdC5LSUxPR1JBTSxcbiAgICAgICAgICAgICAgICAgICAgdW5pdFByaWNlOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIHZhdFBlcmNlbnQ6IDksXG4gICAgICAgICAgICAgICAgICAgIHZhdENhdGVnb3J5Q29kZTogJ1InLFxuICAgICAgICAgICAgICAgICAgICB2YXRFeGVtcHRpb25SZWFzb246ICdOb25lJyxcbiAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBwYXRjaCBpdGVtIHdpdGggb25seSBpdGVtTmFtZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucGF0Y2goYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtcy9pdGVtLTEyM2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChrZWV6QXBpLnBhdGNoSXRlbSgnaXRlbS0xMjMnLCB7IGl0ZW1OYW1lOiAnTmV3IE5hbWUnIH0pKS5yZXNvbHZlcy50b0JlVW5kZWZpbmVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcGF0Y2ggaXRlbSB3aXRoIG9ubHkgaXRlbUNvZGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBhdGNoKGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXMvaXRlbS0xMjNgKVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDApO1xuXG4gICAgICAgICAgICBhd2FpdCBleHBlY3Qoa2VlekFwaS5wYXRjaEl0ZW0oJ2l0ZW0tMTIzJywgeyBpdGVtQ29kZTogJ0NPREUwMDEnIH0pKS5yZXNvbHZlcy50b0JlVW5kZWZpbmVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcGF0Y2ggaXRlbSB3aXRoIGl0ZW1EZXNjcmlwdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucGF0Y2goYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtcy9pdGVtLTEyM2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgICAgICAgICBrZWV6QXBpLnBhdGNoSXRlbSgnaXRlbS0xMjMnLCB7IGl0ZW1EZXNjcmlwdGlvbjogJ05ldyBkZXNjcmlwdGlvbicgfSlcbiAgICAgICAgICAgICkucmVzb2x2ZXMudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHBhdGNoIGl0ZW0gd2l0aCBtZWFzdXJlVW5pdElkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wYXRjaChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zL2l0ZW0tMTIzYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KGtlZXpBcGkucGF0Y2hJdGVtKCdpdGVtLTEyMycsIHsgbWVhc3VyZVVuaXRJZDogTWVhc3VyZVVuaXQuTElURVIgfSkpLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBwYXRjaCBpdGVtIHdpdGggdmF0UGVyY2VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucGF0Y2goYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtcy9pdGVtLTEyM2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChrZWV6QXBpLnBhdGNoSXRlbSgnaXRlbS0xMjMnLCB7IHZhdFBlcmNlbnQ6IDUgfSkpLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBwYXRjaCBpdGVtIHdpdGggdmF0Q2F0ZWdvcnlDb2RlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wYXRjaChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zL2l0ZW0tMTIzYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KGtlZXpBcGkucGF0Y2hJdGVtKCdpdGVtLTEyMycsIHsgdmF0Q2F0ZWdvcnlDb2RlOiAnRScgfSkpLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBwYXRjaCBpdGVtIHdpdGggdmF0RXhlbXB0aW9uUmVhc29uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wYXRjaChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zL2l0ZW0tMTIzYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGtlZXpBcGkucGF0Y2hJdGVtKCdpdGVtLTEyMycsIHsgdmF0RXhlbXB0aW9uUmVhc29uOiAnRXhlbXB0IGZvciByZWFzb24nIH0pXG4gICAgICAgICAgICApLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBwYXRjaCBpdGVtIHdpdGggaXNBY3RpdmUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBhdGNoKGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXMvaXRlbS0xMjNgKVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDApO1xuXG4gICAgICAgICAgICBhd2FpdCBleHBlY3Qoa2VlekFwaS5wYXRjaEl0ZW0oJ2l0ZW0tMTIzJywgeyBpc0FjdGl2ZTogZmFsc2UgfSkpLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59KTtcbiJdfQ==
|