bitgo 52.12.1 → 53.0.1
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/dist/browser/01f1c955319505c519b0.wasm +0 -0
- package/dist/browser/4e894cafebea39bf4953.module.wasm +0 -0
- package/dist/browser/BitGoJS.min.js +2 -2
- package/dist/package.json +90 -90
- package/dist/src/v2/coinFactory.js +3 -1
- package/dist/src/v2/coins/index.js +7 -5
- package/dist/test/v2/unit/internal/tssUtils/ecdsaVrfMPCv2/createSafeChildKeychains.js +271 -0
- package/dist/test/v2/unit/staking/stakingWalletCommon.js +25 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/src/v2/coinFactory.d.ts.map +1 -1
- package/dist/types/src/v2/coins/index.d.ts +2 -2
- package/dist/types/src/v2/coins/index.d.ts.map +1 -1
- package/dist/types/test/v2/unit/internal/tssUtils/ecdsaVrfMPCv2/createSafeChildKeychains.d.ts +2 -0
- package/dist/types/test/v2/unit/internal/tssUtils/ecdsaVrfMPCv2/createSafeChildKeychains.d.ts.map +1 -0
- package/npm-shrinkwrap.json +870 -914
- package/package.json +90 -90
- package/dist/browser/3cd87a23714447b07e48.wasm +0 -0
- package/dist/browser/7feee8252ddf875cbfdc.module.wasm +0 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const assert = require("assert");
|
|
4
|
+
const nock = require("nock");
|
|
5
|
+
const openpgp = require("openpgp");
|
|
6
|
+
const cbor_x_1 = require("cbor-x");
|
|
7
|
+
const sdk_test_1 = require("@bitgo/sdk-test");
|
|
8
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
9
|
+
const sdk_lib_mpc_1 = require("@bitgo/sdk-lib-mpc");
|
|
10
|
+
const src_1 = require("../../../../../../src");
|
|
11
|
+
const SAFE_ID = '6fa8537e3ef5a878fd3ae899f3ab7e5a';
|
|
12
|
+
const USER_ROOT_KEY_ID = 'root-user-key-id';
|
|
13
|
+
const DERIVATION_INDEX = 0;
|
|
14
|
+
const BITGO_ROOT_KEY_ID = 'root-bitgo-key-id';
|
|
15
|
+
const BACKUP_ROOT_KEY_ID = 'root-backup-key-id';
|
|
16
|
+
const PATH_M0 = new Uint8Array([0x80, 0x00, 0x00, 0x00]);
|
|
17
|
+
describe('TSS ECDSA safe child keychains (user/BitGo hard derive):', async function () {
|
|
18
|
+
const coinName = 'hteth';
|
|
19
|
+
const enterpriseId = '6449153a6f6bc20006d66771cdbe15d3';
|
|
20
|
+
let bgUrl;
|
|
21
|
+
let bitgo;
|
|
22
|
+
let tssUtils;
|
|
23
|
+
let wallet;
|
|
24
|
+
let bitGoGpgKey;
|
|
25
|
+
let constants;
|
|
26
|
+
let bitgoGpgPrvKey;
|
|
27
|
+
let userGpgPubKey;
|
|
28
|
+
let stagedBitgoMsg2;
|
|
29
|
+
before(async function () {
|
|
30
|
+
openpgp.config.rejectCurves = new Set();
|
|
31
|
+
bitGoGpgKey = await openpgp.generateKey({
|
|
32
|
+
userIDs: [{ name: 'bitgo', email: 'bitgo@test.com' }],
|
|
33
|
+
curve: 'secp256k1',
|
|
34
|
+
});
|
|
35
|
+
constants = {
|
|
36
|
+
mpc: {
|
|
37
|
+
bitgoPublicKey: bitGoGpgKey.publicKey,
|
|
38
|
+
bitgoMPCv2PublicKey: bitGoGpgKey.publicKey,
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
bitgoGpgPrvKey = { partyId: 2, gpgKey: bitGoGpgKey.privateKey };
|
|
42
|
+
bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock' });
|
|
43
|
+
bitgo.initializeTestVars();
|
|
44
|
+
bgUrl = sdk_core_1.common.Environments[bitgo.getEnv()].uri;
|
|
45
|
+
const baseCoin = bitgo.coin(coinName);
|
|
46
|
+
wallet = new sdk_core_1.Wallet(bitgo, baseCoin, {
|
|
47
|
+
id: '5b34252f1bf349930e34020a00000000',
|
|
48
|
+
enterprise: enterpriseId,
|
|
49
|
+
coin: coinName,
|
|
50
|
+
coinSpecific: {},
|
|
51
|
+
multisigType: 'tss',
|
|
52
|
+
});
|
|
53
|
+
tssUtils = new sdk_core_1.ECDSAUtils.EcdsaVrfMPCv2Utils(bitgo, baseCoin, wallet);
|
|
54
|
+
});
|
|
55
|
+
beforeEach(async function () {
|
|
56
|
+
nock.cleanAll();
|
|
57
|
+
stagedBitgoMsg2 = undefined;
|
|
58
|
+
await nockGetBitgoPublicKeyBasedOnFeatureFlags(coinName, enterpriseId, bitGoGpgKey);
|
|
59
|
+
nock(bgUrl).get('/api/v1/client/constants').times(32).reply(200, { ttl: 3600, constants });
|
|
60
|
+
});
|
|
61
|
+
after(function () {
|
|
62
|
+
nock.cleanAll();
|
|
63
|
+
});
|
|
64
|
+
it('should derive the user child and register the backup without encryptedPrv', async function () {
|
|
65
|
+
const [userRoot, , bitgoRoot] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
|
|
66
|
+
const [vrfUser, , vrfBitgo] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
|
|
67
|
+
const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(), PATH_M0);
|
|
68
|
+
const round1Nock = await nockDeriveRound1(bitgoPair);
|
|
69
|
+
const round2Nock = await nockDeriveRound2(bitgoPair);
|
|
70
|
+
const round3Nock = await nockDeriveRound3(bitgoPair);
|
|
71
|
+
const addKeyNock = await nockAddChildKey(coinName, 2);
|
|
72
|
+
const { userKeychain, backupKeychain } = await tssUtils.createSafeChildKeychains({
|
|
73
|
+
passphrase: 'test',
|
|
74
|
+
enterprise: enterpriseId,
|
|
75
|
+
safeId: SAFE_ID,
|
|
76
|
+
parentKeyId: BITGO_ROOT_KEY_ID,
|
|
77
|
+
derivationIndex: DERIVATION_INDEX,
|
|
78
|
+
userRootKeyId: USER_ROOT_KEY_ID,
|
|
79
|
+
backupRootKeyId: BACKUP_ROOT_KEY_ID,
|
|
80
|
+
userRootKeyShare: userRoot.getKeyShare(),
|
|
81
|
+
userRootVrfKeyShare: vrfUser.getKeyShare(),
|
|
82
|
+
});
|
|
83
|
+
assert.ok(round1Nock.isDone());
|
|
84
|
+
assert.ok(round2Nock.isDone());
|
|
85
|
+
assert.ok(round3Nock.isDone());
|
|
86
|
+
assert.ok(addKeyNock.isDone());
|
|
87
|
+
assert.equal(userKeychain.commonKeychain, backupKeychain.commonKeychain);
|
|
88
|
+
assert.equal(userKeychain.commonKeychain, sdk_lib_mpc_1.DklsTypes.getCommonKeychain(bitgoPair.getKeyShare()));
|
|
89
|
+
const encryptedUserPrv = userKeychain.encryptedPrv;
|
|
90
|
+
assert.ok(encryptedUserPrv);
|
|
91
|
+
assert.equal(backupKeychain.encryptedPrv, undefined);
|
|
92
|
+
const decryptedUserPrv = await bitgo.decrypt({ input: encryptedUserPrv, password: 'test' });
|
|
93
|
+
const userChildShare = (0, cbor_x_1.decode)(Buffer.from(decryptedUserPrv, 'base64'));
|
|
94
|
+
assert.equal(userChildShare.version, undefined);
|
|
95
|
+
assert.equal(userChildShare.vrf, undefined);
|
|
96
|
+
assert.equal(userChildShare.party_id, 0);
|
|
97
|
+
assert.ok(userChildShare.s_i);
|
|
98
|
+
});
|
|
99
|
+
it('should derive at a non-zero hardened index and agree with the server', async function () {
|
|
100
|
+
const idx = 7;
|
|
101
|
+
const path = new Uint8Array([0x80 | (idx >>> 24), 0, 0, idx]);
|
|
102
|
+
const [userRoot, , bitgoRoot] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
|
|
103
|
+
const [vrfUser, , vrfBitgo] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
|
|
104
|
+
const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(), path);
|
|
105
|
+
const round1Nock = await nockDeriveRound1(bitgoPair, 1, idx);
|
|
106
|
+
const round2Nock = await nockDeriveRound2(bitgoPair);
|
|
107
|
+
const round3Nock = await nockDeriveRound3(bitgoPair);
|
|
108
|
+
const addKeyNock = await nockAddChildKey(coinName, 2, idx);
|
|
109
|
+
const { userKeychain, backupKeychain } = await tssUtils.createSafeChildKeychains({
|
|
110
|
+
passphrase: 'test',
|
|
111
|
+
enterprise: enterpriseId,
|
|
112
|
+
safeId: SAFE_ID,
|
|
113
|
+
parentKeyId: BITGO_ROOT_KEY_ID,
|
|
114
|
+
derivationIndex: idx,
|
|
115
|
+
userRootKeyId: USER_ROOT_KEY_ID,
|
|
116
|
+
backupRootKeyId: BACKUP_ROOT_KEY_ID,
|
|
117
|
+
userRootKeyShare: userRoot.getKeyShare(),
|
|
118
|
+
userRootVrfKeyShare: vrfUser.getKeyShare(),
|
|
119
|
+
});
|
|
120
|
+
assert.ok(round1Nock.isDone());
|
|
121
|
+
assert.ok(round2Nock.isDone());
|
|
122
|
+
assert.ok(round3Nock.isDone());
|
|
123
|
+
assert.ok(addKeyNock.isDone());
|
|
124
|
+
assert.equal(userKeychain.commonKeychain, backupKeychain.commonKeychain);
|
|
125
|
+
});
|
|
126
|
+
it('should reject root key material that is not a valid VRF envelope', async function () {
|
|
127
|
+
const [, , bitgoRoot] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
|
|
128
|
+
const [, , vrfBitgo] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
|
|
129
|
+
const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(), PATH_M0);
|
|
130
|
+
const round1Nock = await nockDeriveRound1(bitgoPair);
|
|
131
|
+
const round2Nock = await nockDeriveRound2(bitgoPair);
|
|
132
|
+
const round3Nock = await nockDeriveRound3(bitgoPair);
|
|
133
|
+
await assert.rejects(() => tssUtils.createSafeChildKeychains({
|
|
134
|
+
passphrase: 'test',
|
|
135
|
+
enterprise: enterpriseId,
|
|
136
|
+
safeId: SAFE_ID,
|
|
137
|
+
parentKeyId: BITGO_ROOT_KEY_ID,
|
|
138
|
+
derivationIndex: DERIVATION_INDEX,
|
|
139
|
+
userRootKeyId: USER_ROOT_KEY_ID,
|
|
140
|
+
backupRootKeyId: BACKUP_ROOT_KEY_ID,
|
|
141
|
+
userRootKeyShare: Buffer.from('garbage'),
|
|
142
|
+
userRootVrfKeyShare: vrfBitgo.getKeyShare(),
|
|
143
|
+
}), /CBOR decode|does not match root key share partyId|VRF keyshare/i);
|
|
144
|
+
assert.ok(!round1Nock.isDone(), 'round 1 must not be sent for invalid root material');
|
|
145
|
+
assert.ok(!round2Nock.isDone(), 'round 2 must not be sent for invalid root material');
|
|
146
|
+
assert.ok(!round3Nock.isDone(), 'round 3 must not be sent for invalid root material');
|
|
147
|
+
});
|
|
148
|
+
it('should reject a root blob with a VRF partyId mismatch', async function () {
|
|
149
|
+
const [userRoot, , bitgoRoot] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
|
|
150
|
+
const [, vrfBackup, vrfBitgo] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
|
|
151
|
+
const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(), PATH_M0);
|
|
152
|
+
const round1Nock = await nockDeriveRound1(bitgoPair);
|
|
153
|
+
const round2Nock = await nockDeriveRound2(bitgoPair);
|
|
154
|
+
const round3Nock = await nockDeriveRound3(bitgoPair);
|
|
155
|
+
await assert.rejects(() => tssUtils.createSafeChildKeychains({
|
|
156
|
+
passphrase: 'test',
|
|
157
|
+
enterprise: enterpriseId,
|
|
158
|
+
safeId: SAFE_ID,
|
|
159
|
+
parentKeyId: BITGO_ROOT_KEY_ID,
|
|
160
|
+
derivationIndex: DERIVATION_INDEX,
|
|
161
|
+
userRootKeyId: USER_ROOT_KEY_ID,
|
|
162
|
+
backupRootKeyId: BACKUP_ROOT_KEY_ID,
|
|
163
|
+
userRootKeyShare: userRoot.getKeyShare(),
|
|
164
|
+
userRootVrfKeyShare: vrfBackup.getKeyShare(),
|
|
165
|
+
}), /does not match VRF key share partyId/);
|
|
166
|
+
assert.ok(!round1Nock.isDone(), 'round 1 must not be sent for mismatched VRF material');
|
|
167
|
+
assert.ok(!round2Nock.isDone(), 'round 2 must not be sent for mismatched VRF material');
|
|
168
|
+
assert.ok(!round3Nock.isDone(), 'round 3 must not be sent for mismatched VRF material');
|
|
169
|
+
});
|
|
170
|
+
async function nockGetBitgoPublicKeyBasedOnFeatureFlags(coin, enterpriseId, bitgoGpgKeyPair) {
|
|
171
|
+
const bitgoGPGPublicKeyResponse = {
|
|
172
|
+
name: 'irrelevant',
|
|
173
|
+
publicKey: bitgoGpgKeyPair.publicKey,
|
|
174
|
+
mpcv2PublicKey: bitgoGpgKeyPair.publicKey,
|
|
175
|
+
enterpriseId,
|
|
176
|
+
};
|
|
177
|
+
nock(bgUrl).get(`/api/v2/${coin}/tss/pubkey`).query({ enterpriseId }).reply(200, bitgoGPGPublicKeyResponse);
|
|
178
|
+
return bitgoGPGPublicKeyResponse;
|
|
179
|
+
}
|
|
180
|
+
async function nockDeriveRound1(bitgoPair, times = 1, index = DERIVATION_INDEX) {
|
|
181
|
+
return nock(bgUrl)
|
|
182
|
+
.post('/api/v2/mpc/generatekey', (body) => body.round === 'MPCv2Derive-R1' &&
|
|
183
|
+
body.safeId === SAFE_ID &&
|
|
184
|
+
body.payload?.parentKeyId === BITGO_ROOT_KEY_ID &&
|
|
185
|
+
body.payload?.derivationIndex === index &&
|
|
186
|
+
body.payload?.userGpgPublicKey &&
|
|
187
|
+
body.payload?.userMsg1 &&
|
|
188
|
+
body.payload?.backupGpgPublicKey === undefined &&
|
|
189
|
+
body.payload?.backupMsg1 === undefined)
|
|
190
|
+
.times(times)
|
|
191
|
+
.reply(200, async (uri, requestBody) => {
|
|
192
|
+
const { userGpgPublicKey, userMsg1 } = requestBody.payload;
|
|
193
|
+
userGpgPubKey = { partyId: 0, gpgKey: userGpgPublicKey };
|
|
194
|
+
await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({
|
|
195
|
+
p2pMessages: [],
|
|
196
|
+
broadcastMessages: [{ from: 0, payload: { message: userMsg1.message, signature: userMsg1.signature } }],
|
|
197
|
+
}, [userGpgPubKey], []);
|
|
198
|
+
const bitgoMsg1Unsigned = await bitgoPair.initDerive();
|
|
199
|
+
const bitgoMsg2 = bitgoPair.handleIncomingMessages({
|
|
200
|
+
p2pMessages: [],
|
|
201
|
+
broadcastMessages: [{ payload: Buffer.from(userMsg1.message, 'base64'), from: 0 }],
|
|
202
|
+
});
|
|
203
|
+
const signedStagedMessages = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages({
|
|
204
|
+
broadcastMessages: [sdk_lib_mpc_1.DklsTypes.serializeBroadcastMessage(bitgoMsg2.broadcastMessages[0])],
|
|
205
|
+
p2pMessages: [],
|
|
206
|
+
}, [], [bitgoGpgPrvKey]);
|
|
207
|
+
stagedBitgoMsg2 = signedStagedMessages.broadcastMessages[0].payload;
|
|
208
|
+
const signedMessages = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages({
|
|
209
|
+
broadcastMessages: [sdk_lib_mpc_1.DklsTypes.serializeBroadcastMessage(bitgoMsg1Unsigned)],
|
|
210
|
+
p2pMessages: [],
|
|
211
|
+
}, [], [bitgoGpgPrvKey]);
|
|
212
|
+
const bitgoMsg1 = signedMessages.broadcastMessages[0];
|
|
213
|
+
assert.ok(bitgoMsg1, 'bitgoMsg1 not found');
|
|
214
|
+
return {
|
|
215
|
+
sessionId: 'testid',
|
|
216
|
+
bitgoMsg1: { from: 2, ...bitgoMsg1.payload },
|
|
217
|
+
};
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
async function nockDeriveRound2(bitgoPair, times = 1) {
|
|
221
|
+
return nock(bgUrl)
|
|
222
|
+
.post('/api/v2/mpc/generatekey', (body) => body.round === 'MPCv2Derive-R2' &&
|
|
223
|
+
body.safeId === SAFE_ID &&
|
|
224
|
+
body.payload?.sessionId === 'testid' &&
|
|
225
|
+
body.payload?.userMsg2 &&
|
|
226
|
+
body.payload?.backupMsg2 === undefined)
|
|
227
|
+
.times(times)
|
|
228
|
+
.reply(200, async (uri, requestBody) => {
|
|
229
|
+
const { sessionId, userMsg2 } = requestBody.payload;
|
|
230
|
+
await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({
|
|
231
|
+
p2pMessages: [],
|
|
232
|
+
broadcastMessages: [{ from: 0, payload: { message: userMsg2.message, signature: userMsg2.signature } }],
|
|
233
|
+
}, [userGpgPubKey], []);
|
|
234
|
+
bitgoPair.handleIncomingMessages({
|
|
235
|
+
p2pMessages: [],
|
|
236
|
+
broadcastMessages: [{ payload: Buffer.from(userMsg2.message, 'base64'), from: 0 }],
|
|
237
|
+
});
|
|
238
|
+
assert.ok(stagedBitgoMsg2, 'staged BitGo msg2 missing');
|
|
239
|
+
return { sessionId, bitgoMsg2: { from: 2, ...stagedBitgoMsg2 } };
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
async function nockDeriveRound3(bitgoPair, times = 1) {
|
|
243
|
+
return nock(bgUrl)
|
|
244
|
+
.post('/api/v2/mpc/generatekey', (body) => body.round === 'MPCv2Derive-R3' && body.safeId === SAFE_ID && body.payload?.sessionId === 'testid')
|
|
245
|
+
.times(times)
|
|
246
|
+
.reply(200, async (uri, requestBody) => {
|
|
247
|
+
const { sessionId } = requestBody.payload;
|
|
248
|
+
return {
|
|
249
|
+
sessionId,
|
|
250
|
+
commonKeychain: sdk_lib_mpc_1.DklsTypes.getCommonKeychain(bitgoPair.getKeyShare()),
|
|
251
|
+
};
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
async function nockAddChildKey(coin, times = 2, index = DERIVATION_INDEX) {
|
|
255
|
+
return nock('https://bitgo.fakeurl')
|
|
256
|
+
.post(`/api/v2/${coin}/key`, (body) => body.keyType === 'tss' &&
|
|
257
|
+
body.isMPCv2 === true &&
|
|
258
|
+
body.safeId === SAFE_ID &&
|
|
259
|
+
!!body.parent &&
|
|
260
|
+
body.derivedFromParentWithPath === `m/${index}'`)
|
|
261
|
+
.times(times)
|
|
262
|
+
.reply(200, (uri, requestBody) => ({
|
|
263
|
+
id: requestBody.source,
|
|
264
|
+
source: requestBody.source,
|
|
265
|
+
type: requestBody.keyType,
|
|
266
|
+
commonKeychain: requestBody.commonKeychain,
|
|
267
|
+
encryptedPrv: requestBody.encryptedPrv,
|
|
268
|
+
}));
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlU2FmZUNoaWxkS2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGVzdC92Mi91bml0L2ludGVybmFsL3Rzc1V0aWxzL2VjZHNhVnJmTVBDdjIvY3JlYXRlU2FmZUNoaWxkS2V5Y2hhaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsaUNBQWlDO0FBQ2pDLDZCQUE4QjtBQUM5QixtQ0FBbUM7QUFDbkMsbUNBQWdDO0FBRWhDLDhDQUF3RDtBQUN4RCw4Q0FBaUY7QUFDakYsb0RBQTRGO0FBRzVGLCtDQUFpRTtBQUVqRSxNQUFNLE9BQU8sR0FBRyxrQ0FBa0MsQ0FBQztBQUNuRCxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO0FBQzVDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0saUJBQWlCLEdBQUcsbUJBQW1CLENBQUM7QUFDOUMsTUFBTSxrQkFBa0IsR0FBRyxvQkFBb0IsQ0FBQztBQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFFekQsUUFBUSxDQUFDLDBEQUEwRCxFQUFFLEtBQUs7SUFDeEUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLE1BQU0sWUFBWSxHQUFHLGtDQUFrQyxDQUFDO0lBQ3hELElBQUksS0FBYSxDQUFDO0lBQ2xCLElBQUksS0FBeUIsQ0FBQztJQUM5QixJQUFJLFFBQXVDLENBQUM7SUFDNUMsSUFBSSxNQUFjLENBQUM7SUFDbkIsSUFBSSxXQUVILENBQUM7SUFDRixJQUFJLFNBQTJFLENBQUM7SUFDaEYsSUFBSSxjQUFtRCxDQUFDO0lBQ3hELElBQUksYUFBa0QsQ0FBQztJQUN2RCxJQUFJLGVBQW1FLENBQUM7SUFFeEUsTUFBTSxDQUFDLEtBQUs7UUFDVixPQUFPLENBQUMsTUFBTSxDQUFD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QUFHLEVBQUUsV0FBK0IsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNyRCxFQUFFLEVBQUUsV0FBVyxDQUFDLE1BQU07WUFDdEIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNO1lBQzFCLElBQUksRUFBRSxXQUFXLENBQUMsT0FBTztZQUN6QixjQUFjLEVBQUUsV0FBVyxDQUFDLGNBQWM7WUFDMUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxZQUFZO1NBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcbmltcG9ydCAqIGFzIG9wZW5wZ3AgZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdjYm9yLXgnO1xuXG5pbXBvcnQgeyBUZXN0YWJsZUJHLCBUZXN0Qml0R28gfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQWRkS2V5Y2hhaW5PcHRpb25zLCBjb21tb24sIEVDRFNBVXRpbHMsIFdhbGxldCB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBEa2xzQ29tbXMsIERrbHNEcnYsIERrbHNUeXBlcywgRGtsc1V0aWxzLCBEa2xzVnJmVXRpbHMgfSBmcm9tICdAYml0Z28vc2RrLWxpYi1tcGMnO1xuaW1wb3J0IHsgTVBDdjJEZXJpdmVSb3VuZDFSZXF1ZXN0LCBNUEN2MkRlcml2ZVJvdW5kMlJlcXVlc3QsIE1QQ3YyRGVyaXZlUm91bmQzUmVxdWVzdCB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgTm9uRW1wdHlTdHJpbmcgfSBmcm9tICdpby10cy10eXBlcyc7XG5pbXBvcnQgeyBCaXRHbywgQml0Z29HUEdQdWJsaWNLZXkgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9zcmMnO1xuXG5jb25zdCBTQUZFX0lEID0gJzZmYTg1MzdlM2VmNWE4NzhmZDNhZTg5OWYzYWI3ZTVhJztcbmNvbnN0IFVTRVJfUk9PVF9LRVlfSUQgPSAncm9vdC11c2VyLWtleS1pZCc7XG5jb25zdCBERVJJVkFUSU9OX0lOREVYID0gMDtcbmNvbnN0IEJJVEdPX1JPT1RfS0VZX0lEID0gJ3Jvb3QtYml0Z28ta2V5LWlkJztcbmNvbnN0IEJBQ0tVUF9ST09UX0tFWV9JRCA9ICdyb290LWJhY2t1cC1rZXktaWQnO1xuY29uc3QgUEFUSF9NMCA9IG5ldyBVaW50OEFycmF5KFsweDgwLCAweDAwLCAweDAwLCAweDAwXSk7XG5cbmRlc2NyaWJlKCdUU1MgRUNEU0Egc2FmZSBjaGlsZCBrZXljaGFpbnMgKHVzZXIvQml0R28gaGFyZCBkZXJpdmUpOicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29pbk5hbWUgPSAnaHRldGgnO1xuICBjb25zdCBlbnRlcnByaXNlSWQgPSAnNjQ0OTE1M2E2ZjZiYzIwMDA2ZDY2NzcxY2RiZTE1ZDMnO1xuICBsZXQgYmdVcmw6IHN0cmluZztcbiAgbGV0IGJpdGdvOiBUZXN0YWJsZUJHICYgQml0R287XG4gIGxldCB0c3NVdGlsczogRUNEU0FVdGlscy5FY2RzYVZyZk1QQ3YyVXRpbHM7XG4gIGxldCB3YWxsZXQ6IFdhbGxldDtcbiAgbGV0IGJpdEdvR3BnS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4gJiB7XG4gICAgcmV2b2NhdGlvbkNlcnRpZmljYXRlOiBzdHJpbmc7XG4gIH07XG4gIGxldCBjb25zdGFudHM6IHsgbXBjOiB7IGJpdGdvUHVibGljS2V5OiBzdHJpbmc7IGJpdGdvTVBDdjJQdWJsaWNLZXk6IHN0cmluZyB9IH07XG4gIGxldCBiaXRnb0dwZ1BydktleTogeyBwYXJ0eUlkOiBudW1iZXI7IGdwZ0tleTogc3RyaW5nIH07XG4gIGxldCB1c2VyR3BnUHViS2V5OiB7IHBhcnR5SWQ6IG51bWJlcjsgZ3BnS2V5OiBzdHJpbmcgfTtcbiAgbGV0IHN0YWdlZEJpdGdvTXNnMjogeyBtZXNzYWdlOiBzdHJpbmc7IHNpZ25hdHVyZTogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG5cbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBvcGVucGdwLmNvbmZpZy5yZWplY3RDdXJ2ZXMgPSBuZXcgU2V0KCk7XG4gICAgYml0R29HcGdLZXkgPSBhd2FpdCBvcGVucGdwLmdlbmVyYXRlS2V5KHtcbiAgICAgIHVzZXJJRHM6IFt7IG5hbWU6ICdiaXRnbycsIGVtYWlsOiAnYml0Z29AdGVzdC5jb20nIH1dLFxuICAgICAgY3VydmU6ICdzZWNwMjU2azEnLFxuICAgIH0pO1xuICAgIGNvbnN0YW50cyA9IHtcbiAgICAgIG1wYzoge1xuICAgICAgICBiaXRnb1B1YmxpY0tleTogYml0R29HcGdLZXkucHVibGljS2V5LFxuICAgICAgICBiaXRnb01QQ3YyUHVibGljS2V5OiBiaXRHb0dwZ0tleS5wdWJsaWNLZXksXG4gICAgICB9LFxuICAgIH07XG4gICAgYml0Z29HcGdQcnZLZXkgPSB7IHBhcnR5SWQ6IDIsIGdwZ0tleTogYml0R29HcGdLZXkucHJpdmF0ZUtleSB9O1xuXG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgYmdVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzW2JpdGdvLmdldEVudigpXS51cmk7XG5cbiAgICBjb25zdCBiYXNlQ29pbiA9IGJpdGdvLmNvaW4oY29pbk5hbWUpO1xuICAgIHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGJhc2VDb2luLCB7XG4gICAgICBpZDogJzViMzQyNTJmMWJmMzQ5OTMwZTM0MDIwYTAwMDAwMDAwJyxcbiAgICAgIGVudGVycHJpc2U6IGVudGVycHJpc2VJZCxcbiAgICAgIGNvaW46IGNvaW5OYW1lLFxuICAgICAgY29pblNwZWNpZmljOiB7fSxcbiAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgfSk7XG4gICAgdHNzVXRpbHMgPSBuZXcgRUNEU0FVdGlscy5FY2RzYVZyZk1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luLCB3YWxsZXQpO1xuICB9KTtcblxuICBiZWZvcmVFYWNoKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBub2NrLmNsZWFuQWxsKCk7XG4gICAgc3RhZ2VkQml0Z29Nc2cyID0gdW5kZWZpbmVkO1xuICAgIGF3YWl0IG5vY2tHZXRCaXRnb1B1YmxpY0tleUJhc2VkT25GZWF0dXJlRmxhZ3MoY29pbk5hbWUsIGVudGVycHJpc2VJZCwgYml0R29HcGdLZXkpO1xuICAgIG5vY2soYmdVcmwpLmdldCgnL2FwaS92MS9jbGllbnQvY29uc3RhbnRzJykudGltZXMoMzIpLnJlcGx5KDIwMCwgeyB0dGw6IDM2MDAsIGNvbnN0YW50cyB9KTtcbiAgfSk7XG5cbiAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBkZXJpdmUgdGhlIHVzZXIgY2hpbGQgYW5kIHJlZ2lzdGVyIHRoZSBiYWNrdXAgd2l0aG91dCBlbmNyeXB0ZWRQcnYnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgW3VzZXJSb290LCAsIGJpdGdvUm9vdF0gPSBhd2FpdCBEa2xzVXRpbHMuZ2VuZXJhdGVES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBbdnJmVXNlciwgLCB2cmZCaXRnb10gPSBhd2FpdCBEa2xzVnJmVXRpbHMuZ2VuZXJhdGVWcmZES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBiaXRnb1BhaXIgPSBuZXcgRGtsc0Rydi5EZXJpdmUoMywgMiwgMiwgYml0Z29Sb290LmdldEtleVNoYXJlKCksIHZyZkJpdGdvLmdldEtleVNoYXJlKCksIFBBVEhfTTApO1xuXG4gICAgY29uc3Qgcm91bmQxTm9jayA9IGF3YWl0IG5vY2tEZXJpdmVSb3VuZDEoYml0Z29QYWlyKTtcbiAgICBjb25zdCByb3VuZDJOb2NrID0gYXdhaXQgbm9ja0Rlcml2ZVJvdW5kMihiaXRnb1BhaXIpO1xuICAgIGNvbnN0IHJvdW5kM05vY2sgPSBhd2FpdCBub2NrRGVyaXZlUm91bmQzKGJpdGdvUGFpcik7XG4gICAgY29uc3QgYWRkS2V5Tm9jayA9IGF3YWl0IG5vY2tBZGRDaGlsZEtleShjb2luTmFtZSwgMik7XG5cbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4gfSA9IGF3YWl0IHRzc1V0aWxzLmNyZWF0ZVNhZmVDaGlsZEtleWNoYWlucyh7XG4gICAgICBwYXNzcGhyYXNlOiAndGVzdCcsXG4gICAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlSWQsXG4gICAgICBzYWZlSWQ6IFNBRkVfSUQsXG4gICAgICBwYXJlbnRLZXlJZDogQklUR09fUk9PVF9LRVlfSUQsXG4gICAgICBkZXJpdmF0aW9uSW5kZXg6IERFUklWQVRJT05fSU5ERVgsXG4gICAgICB1c2VyUm9vdEtleUlkOiBVU0VSX1JPT1RfS0VZX0lELFxuICAgICAgYmFja3VwUm9vdEtleUlkOiBCQUNLVVBfUk9PVF9LRVlfSUQsXG4gICAgICB1c2VyUm9vdEtleVNoYXJlOiB1c2VyUm9vdC5nZXRLZXlTaGFyZSgpLFxuICAgICAgdXNlclJvb3RWcmZLZXlTaGFyZTogdnJmVXNlci5nZXRLZXlTaGFyZSgpLFxuICAgIH0pO1xuXG4gICAgYXNzZXJ0Lm9rKHJvdW5kMU5vY2suaXNEb25lKCkpO1xuICAgIGFzc2VydC5vayhyb3VuZDJOb2NrLmlzRG9uZSgpKTtcbiAgICBhc3NlcnQub2socm91bmQzTm9jay5pc0RvbmUoKSk7XG4gICAgYXNzZXJ0Lm9rKGFkZEtleU5vY2suaXNEb25lKCkpO1xuICAgIGFzc2VydC5lcXVhbCh1c2VyS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLmNvbW1vbktleWNoYWluKTtcbiAgICBhc3NlcnQuZXF1YWwodXNlcktleWNoYWluLmNvbW1vbktleWNoYWluLCBEa2xzVHlwZXMuZ2V0Q29tbW9uS2V5Y2hhaW4oYml0Z29QYWlyLmdldEtleVNoYXJlKCkpKTtcblxuICAgIGNvbnN0IGVuY3J5cHRlZFVzZXJQcnYgPSB1c2VyS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2O1xuICAgIGFzc2VydC5vayhlbmNyeXB0ZWRVc2VyUHJ2KTtcbiAgICBhc3NlcnQuZXF1YWwoYmFja3VwS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LCB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGRlY3J5cHRlZFVzZXJQcnYgPSBhd2FpdCBiaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGVuY3J5cHRlZFVzZXJQcnYsIHBhc3N3b3JkOiAndGVzdCcgfSk7XG4gICAgY29uc3QgdXNlckNoaWxkU2hhcmUgPSBkZWNvZGUoQnVmZmVyLmZyb20oZGVjcnlwdGVkVXNlclBydiwgJ2Jhc2U2NCcpKTtcbiAgICBhc3NlcnQuZXF1YWwodXNlckNoaWxkU2hhcmUudmVyc2lvbiwgdW5kZWZpbmVkKTtcbiAgICBhc3NlcnQuZXF1YWwodXNlckNoaWxkU2hhcmUudnJmLCB1bmRlZmluZWQpO1xuICAgIGFzc2VydC5lcXVhbCh1c2VyQ2hpbGRTaGFyZS5wYXJ0eV9pZCwgMCk7XG4gICAgYXNzZXJ0Lm9rKHVzZXJDaGlsZFNoYXJlLnNfaSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZGVyaXZlIGF0IGEgbm9uLXplcm8gaGFyZGVuZWQgaW5kZXggYW5kIGFncmVlIHdpdGggdGhlIHNlcnZlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBpZHggPSA3O1xuICAgIGNvbnN0IHBhdGggPSBuZXcgVWludDhBcnJheShbMHg4MCB8IChpZHggPj4+IDI0KSwgMCwgMCwgaWR4XSk7XG4gICAgY29uc3QgW3VzZXJSb290LCAsIGJpdGdvUm9vdF0gPSBhd2FpdCBEa2xzVXRpbHMuZ2VuZXJhdGVES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBbdnJmVXNlciwgLCB2cmZCaXRnb10gPSBhd2FpdCBEa2xzVnJmVXRpbHMuZ2VuZXJhdGVWcmZES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBiaXRnb1BhaXIgPSBuZXcgRGtsc0Rydi5EZXJpdmUoMywgMiwgMiwgYml0Z29Sb290LmdldEtleVNoYXJlKCksIHZyZkJpdGdvLmdldEtleVNoYXJlKCksIHBhdGgpO1xuXG4gICAgY29uc3Qgcm91bmQxTm9jayA9IGF3YWl0IG5vY2tEZXJpdmVSb3VuZDEoYml0Z29QYWlyLCAxLCBpZHgpO1xuICAgIGNvbnN0IHJvdW5kMk5vY2sgPSBhd2FpdCBub2NrRGVyaXZlUm91bmQyKGJpdGdvUGFpcik7XG4gICAgY29uc3Qgcm91bmQzTm9jayA9IGF3YWl0IG5vY2tEZXJpdmVSb3VuZDMoYml0Z29QYWlyKTtcbiAgICBjb25zdCBhZGRLZXlOb2NrID0gYXdhaXQgbm9ja0FkZENoaWxkS2V5KGNvaW5OYW1lLCAyLCBpZHgpO1xuXG4gICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluIH0gPSBhd2FpdCB0c3NVdGlscy5jcmVhdGVTYWZlQ2hpbGRLZXljaGFpbnMoe1xuICAgICAgcGFzc3BocmFzZTogJ3Rlc3QnLFxuICAgICAgZW50ZXJwcmlzZTogZW50ZXJwcmlzZUlkLFxuICAgICAgc2FmZUlkOiBTQUZFX0lELFxuICAgICAgcGFyZW50S2V5SWQ6IEJJVEdPX1JPT1RfS0VZX0lELFxuICAgICAgZGVyaXZhdGlvbkluZGV4OiBpZHgsXG4gICAgICB1c2VyUm9vdEtleUlkOiBVU0VSX1JPT1RfS0VZX0lELFxuICAgICAgYmFja3VwUm9vdEtleUlkOiBCQUNLVVBfUk9PVF9LRVlfSUQsXG4gICAgICB1c2VyUm9vdEtleVNoYXJlOiB1c2VyUm9vdC5nZXRLZXlTaGFyZSgpLFxuICAgICAgdXNlclJvb3RWcmZLZXlTaGFyZTogdnJmVXNlci5nZXRLZXlTaGFyZSgpLFxuICAgIH0pO1xuXG4gICAgYXNzZXJ0Lm9rKHJvdW5kMU5vY2suaXNEb25lKCkpO1xuICAgIGFzc2VydC5vayhyb3VuZDJOb2NrLmlzRG9uZSgpKTtcbiAgICBhc3NlcnQub2socm91bmQzTm9jay5pc0RvbmUoKSk7XG4gICAgYXNzZXJ0Lm9rKGFkZEtleU5vY2suaXNEb25lKCkpO1xuICAgIGFzc2VydC5lcXVhbCh1c2VyS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLmNvbW1vbktleWNoYWluKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZWplY3Qgcm9vdCBrZXkgbWF0ZXJpYWwgdGhhdCBpcyBub3QgYSB2YWxpZCBWUkYgZW52ZWxvcGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgWywgLCBiaXRnb1Jvb3RdID0gYXdhaXQgRGtsc1V0aWxzLmdlbmVyYXRlREtHS2V5U2hhcmVzKCk7XG4gICAgY29uc3QgWywgLCB2cmZCaXRnb10gPSBhd2FpdCBEa2xzVnJmVXRpbHMuZ2VuZXJhdGVWcmZES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBiaXRnb1BhaXIgPSBuZXcgRGtsc0Rydi5EZXJpdmUoMywgMiwgMiwgYml0Z29Sb290LmdldEtleVNoYXJlKCksIHZyZkJpdGdvLmdldEtleVNoYXJlKCksIFBBVEhfTTApO1xuICAgIGNvbnN0IHJvdW5kMU5vY2sgPSBhd2FpdCBub2NrRGVyaXZlUm91bmQxKGJpdGdvUGFpcik7XG4gICAgY29uc3Qgcm91bmQyTm9jayA9IGF3YWl0IG5vY2tEZXJpdmVSb3VuZDIoYml0Z29QYWlyKTtcbiAgICBjb25zdCByb3VuZDNOb2NrID0gYXdhaXQgbm9ja0Rlcml2ZVJvdW5kMyhiaXRnb1BhaXIpO1xuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAoKSA9PlxuICAgICAgICB0c3NVdGlscy5jcmVhdGVTYWZlQ2hpbGRLZXljaGFpbnMoe1xuICAgICAgICAgIHBhc3NwaHJhc2U6ICd0ZXN0JyxcbiAgICAgICAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlSWQsXG4gICAgICAgICAgc2FmZUlkOiBTQUZFX0lELFxuICAgICAgICAgIHBhcmVudEtleUlkOiBCSVRHT19ST09UX0tFWV9JRCxcbiAgICAgICAgICBkZXJpdmF0aW9uSW5kZXg6IERFUklWQVRJT05fSU5ERVgsXG4gICAgICAgICAgdXNlclJvb3RLZXlJZDogVVNFUl9ST09UX0tFWV9JRCxcbiAgICAgICAgICBiYWNrdXBSb290S2V5SWQ6IEJBQ0tVUF9ST09UX0tFWV9JRCxcbiAgICAgICAgICB1c2VyUm9vdEtleVNoYXJlOiBCdWZmZXIuZnJvbSgnZ2FyYmFnZScpLFxuICAgICAgICAgIHVzZXJSb290VnJmS2V5U2hhcmU6IHZyZkJpdGdvLmdldEtleVNoYXJlKCksXG4gICAgICAgIH0pLFxuICAgICAgL0NCT1IgZGVjb2RlfGRvZXMgbm90IG1hdGNoIHJvb3Qga2V5IHNoYXJlIHBhcnR5SWR8VlJGIGtleXNoYXJlL2lcbiAgICApO1xuICAgIGFzc2VydC5vayghcm91bmQxTm9jay5pc0RvbmUoKSwgJ3JvdW5kIDEgbXVzdCBub3QgYmUgc2VudCBmb3IgaW52YWxpZCByb290IG1hdGVyaWFsJyk7XG4gICAgYXNzZXJ0Lm9rKCFyb3VuZDJOb2NrLmlzRG9uZSgpLCAncm91bmQgMiBtdXN0IG5vdCBiZSBzZW50IGZvciBpbnZhbGlkIHJvb3QgbWF0ZXJpYWwnKTtcbiAgICBhc3NlcnQub2soIXJvdW5kM05vY2suaXNEb25lKCksICdyb3VuZCAzIG11c3Qgbm90IGJlIHNlbnQgZm9yIGludmFsaWQgcm9vdCBtYXRlcmlhbCcpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlamVjdCBhIHJvb3QgYmxvYiB3aXRoIGEgVlJGIHBhcnR5SWQgbWlzbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgW3VzZXJSb290LCAsIGJpdGdvUm9vdF0gPSBhd2FpdCBEa2xzVXRpbHMuZ2VuZXJhdGVES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBbLCB2cmZCYWNrdXAsIHZyZkJpdGdvXSA9IGF3YWl0IERrbHNWcmZVdGlscy5nZW5lcmF0ZVZyZkRLR0tleVNoYXJlcygpO1xuICAgIGNvbnN0IGJpdGdvUGFpciA9IG5ldyBEa2xzRHJ2LkRlcml2ZSgzLCAyLCAyLCBiaXRnb1Jvb3QuZ2V0S2V5U2hhcmUoKSwgdnJmQml0Z28uZ2V0S2V5U2hhcmUoKSwgUEFUSF9NMCk7XG4gICAgY29uc3Qgcm91bmQxTm9jayA9IGF3YWl0IG5vY2tEZXJpdmVSb3VuZDEoYml0Z29QYWlyKTtcbiAgICBjb25zdCByb3VuZDJOb2NrID0gYXdhaXQgbm9ja0Rlcml2ZVJvdW5kMihiaXRnb1BhaXIpO1xuICAgIGNvbnN0IHJvdW5kM05vY2sgPSBhd2FpdCBub2NrRGVyaXZlUm91bmQzKGJpdGdvUGFpcik7XG5cbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICgpID0+XG4gICAgICAgIHRzc1V0aWxzLmNyZWF0ZVNhZmVDaGlsZEtleWNoYWlucyh7XG4gICAgICAgICAgcGFzc3BocmFzZTogJ3Rlc3QnLFxuICAgICAgICAgIGVudGVycHJpc2U6IGVudGVycHJpc2VJZCxcbiAgICAgICAgICBzYWZlSWQ6IFNBRkVfSUQsXG4gICAgICAgICAgcGFyZW50S2V5SWQ6IEJJVEdPX1JPT1RfS0VZX0lELFxuICAgICAgICAgIGRlcml2YXRpb25JbmRleDogREVSSVZBVElPTl9JTkRFWCxcbiAgICAgICAgICB1c2VyUm9vdEtleUlkOiBVU0VSX1JPT1RfS0VZX0lELFxuICAgICAgICAgIGJhY2t1cFJvb3RLZXlJZDogQkFDS1VQX1JPT1RfS0VZX0lELFxuICAgICAgICAgIHVzZXJSb290S2V5U2hhcmU6IHVzZXJSb290LmdldEtleVNoYXJlKCksXG4gICAgICAgICAgdXNlclJvb3RWcmZLZXlTaGFyZTogdnJmQmFja3VwLmdldEtleVNoYXJlKCksXG4gICAgICAgIH0pLFxuICAgICAgL2RvZXMgbm90IG1hdGNoIFZSRiBrZXkgc2hhcmUgcGFydHlJZC9cbiAgICApO1xuICAgIGFzc2VydC5vayghcm91bmQxTm9jay5pc0RvbmUoKSwgJ3JvdW5kIDEgbXVzdCBub3QgYmUgc2VudCBmb3IgbWlzbWF0Y2hlZCBWUkYgbWF0ZXJpYWwnKTtcbiAgICBhc3NlcnQub2soIXJvdW5kMk5vY2suaXNEb25lKCksICdyb3VuZCAyIG11c3Qgbm90IGJlIHNlbnQgZm9yIG1pc21hdGNoZWQgVlJGIG1hdGVyaWFsJyk7XG4gICAgYXNzZXJ0Lm9rKCFyb3VuZDNOb2NrLmlzRG9uZSgpLCAncm91bmQgMyBtdXN0IG5vdCBiZSBzZW50IGZvciBtaXNtYXRjaGVkIFZSRiBtYXRlcmlhbCcpO1xuICB9KTtcblxuICBhc3luYyBmdW5jdGlvbiBub2NrR2V0Qml0Z29QdWJsaWNLZXlCYXNlZE9uRmVhdHVyZUZsYWdzKFxuICAgIGNvaW46IHN0cmluZyxcbiAgICBlbnRlcnByaXNlSWQ6IHN0cmluZyxcbiAgICBiaXRnb0dwZ0tleVBhaXI6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPlxuICApOiBQcm9taXNlPEJpdGdvR1BHUHVibGljS2V5PiB7XG4gICAgY29uc3QgYml0Z29HUEdQdWJsaWNLZXlSZXNwb25zZTogQml0Z29HUEdQdWJsaWNLZXkgPSB7XG4gICAgICBuYW1lOiAnaXJyZWxldmFudCcsXG4gICAgICBwdWJsaWNLZXk6IGJpdGdvR3BnS2V5UGFpci5wdWJsaWNLZXksXG4gICAgICBtcGN2MlB1YmxpY0tleTogYml0Z29HcGdLZXlQYWlyLnB1YmxpY0tleSxcbiAgICAgIGVudGVycHJpc2VJZCxcbiAgICB9O1xuICAgIG5vY2soYmdVcmwpLmdldChgL2FwaS92Mi8ke2NvaW59L3Rzcy9wdWJrZXlgKS5xdWVyeSh7IGVudGVycHJpc2VJZCB9KS5yZXBseSgyMDAsIGJpdGdvR1BHUHVibGljS2V5UmVzcG9uc2UpO1xuICAgIHJldHVybiBiaXRnb0dQR1B1YmxpY0tleVJlc3BvbnNlO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbm9ja0Rlcml2ZVJvdW5kMShiaXRnb1BhaXI6IERrbHNEcnYuRGVyaXZlLCB0aW1lcyA9IDEsIGluZGV4ID0gREVSSVZBVElPTl9JTkRFWCkge1xuICAgIHJldHVybiBub2NrKGJnVXJsKVxuICAgICAgLnBvc3QoXG4gICAgICAgICcvYXBpL3YyL21wYy9nZW5lcmF0ZWtleScsXG4gICAgICAgIChib2R5KSA9PlxuICAgICAgICAgIGJvZHkucm91bmQgPT09ICdNUEN2MkRlcml2ZS1SMScgJiZcbiAgICAgICAgICBib2R5LnNhZmVJZCA9PT0gU0FGRV9JRCAmJlxuICAgICAgICAgIGJvZHkucGF5bG9hZD8ucGFyZW50S2V5SWQgPT09IEJJVEdPX1JPT1RfS0VZX0lEICYmXG4gICAgICAgICAgYm9keS5wYXlsb2FkPy5kZXJpdmF0aW9uSW5kZXggPT09IGluZGV4ICYmXG4gICAgICAgICAgYm9keS5wYXlsb2FkPy51c2VyR3BnUHVibGljS2V5ICYmXG4gICAgICAgICAgYm9keS5wYXlsb2FkPy51c2VyTXNnMSAmJlxuICAgICAgICAgIGJvZHkucGF5bG9hZD8uYmFja3VwR3BnUHVibGljS2V5ID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBib2R5LnBheWxvYWQ/LmJhY2t1cE1zZzEgPT09IHVuZGVmaW5lZFxuICAgICAgKVxuICAgICAgLnRpbWVzKHRpbWVzKVxuICAgICAgLnJlcGx5KDIwMCwgYXN5bmMgKHVyaSwgcmVxdWVzdEJvZHk6IHsgcGF5bG9hZDogTVBDdjJEZXJpdmVSb3VuZDFSZXF1ZXN0IH0pID0+IHtcbiAgICAgICAgY29uc3QgeyB1c2VyR3BnUHVibGljS2V5LCB1c2VyTXNnMSB9ID0gcmVxdWVzdEJvZHkucGF5bG9hZDtcbiAgICAgICAgdXNlckdwZ1B1YktleSA9IHsgcGFydHlJZDogMCwgZ3BnS2V5OiB1c2VyR3BnUHVibGljS2V5IH07XG4gICAgICAgIGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW3sgZnJvbTogMCwgcGF5bG9hZDogeyBtZXNzYWdlOiB1c2VyTXNnMS5tZXNzYWdlLCBzaWduYXR1cmU6IHVzZXJNc2cxLnNpZ25hdHVyZSB9IH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgW3VzZXJHcGdQdWJLZXldLFxuICAgICAgICAgIFtdXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYml0Z29Nc2cxVW5zaWduZWQgPSBhd2FpdCBiaXRnb1BhaXIuaW5pdERlcml2ZSgpO1xuICAgICAgICBjb25zdCBiaXRnb01zZzIgPSBiaXRnb1BhaXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbeyBwYXlsb2FkOiBCdWZmZXIuZnJvbSh1c2VyTXNnMS5tZXNzYWdlLCAnYmFzZTY0JyksIGZyb206IDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzaWduZWRTdGFnZWRNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5lbmNyeXB0QW5kQXV0aE91dGdvaW5nTWVzc2FnZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtEa2xzVHlwZXMuc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZShiaXRnb01zZzIuYnJvYWRjYXN0TWVzc2FnZXNbMF0pXSxcbiAgICAgICAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtdLFxuICAgICAgICAgIFtiaXRnb0dwZ1BydktleV1cbiAgICAgICAgKTtcbiAgICAgICAgc3RhZ2VkQml0Z29Nc2cyID0gc2lnbmVkU3RhZ2VkTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXNbMF0ucGF5bG9hZDtcblxuICAgICAgICBjb25zdCBzaWduZWRNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5lbmNyeXB0QW5kQXV0aE91dGdvaW5nTWVzc2FnZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtEa2xzVHlwZXMuc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZShiaXRnb01zZzFVbnNpZ25lZCldLFxuICAgICAgICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgW10sXG4gICAgICAgICAgW2JpdGdvR3BnUHJ2S2V5XVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBiaXRnb01zZzEgPSBzaWduZWRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlc1swXTtcbiAgICAgICAgYXNzZXJ0Lm9rKGJpdGdvTXNnMSwgJ2JpdGdvTXNnMSBub3QgZm91bmQnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzZXNzaW9uSWQ6ICd0ZXN0aWQnIGFzIE5vbkVtcHR5U3RyaW5nLFxuICAgICAgICAgIGJpdGdvTXNnMTogeyBmcm9tOiAyLCAuLi5iaXRnb01zZzEucGF5bG9hZCB9LFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBub2NrRGVyaXZlUm91bmQyKGJpdGdvUGFpcjogRGtsc0Rydi5EZXJpdmUsIHRpbWVzID0gMSkge1xuICAgIHJldHVybiBub2NrKGJnVXJsKVxuICAgICAgLnBvc3QoXG4gICAgICAgICcvYXBpL3YyL21wYy9nZW5lcmF0ZWtleScsXG4gICAgICAgIChib2R5KSA9PlxuICAgICAgICAgIGJvZHkucm91bmQgPT09ICdNUEN2MkRlcml2ZS1SMicgJiZcbiAgICAgICAgICBib2R5LnNhZmVJZCA9PT0gU0FGRV9JRCAmJlxuICAgICAgICAgIGJvZHkucGF5bG9hZD8uc2Vzc2lvbklkID09PSAndGVzdGlkJyAmJlxuICAgICAgICAgIGJvZHkucGF5bG9hZD8udXNlck1zZzIgJiZcbiAgICAgICAgICBib2R5LnBheWxvYWQ/LmJhY2t1cE1zZzIgPT09IHVuZGVmaW5lZFxuICAgICAgKVxuICAgICAgLnRpbWVzKHRpbWVzKVxuICAgICAgLnJlcGx5KDIwMCwgYXN5bmMgKHVyaSwgcmVxdWVzdEJvZHk6IHsgcGF5bG9hZDogTVBDdjJEZXJpdmVSb3VuZDJSZXF1ZXN0IH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBzZXNzaW9uSWQsIHVzZXJNc2cyIH0gPSByZXF1ZXN0Qm9keS5wYXlsb2FkO1xuICAgICAgICBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt7IGZyb206IDAsIHBheWxvYWQ6IHsgbWVzc2FnZTogdXNlck1zZzIubWVzc2FnZSwgc2lnbmF0dXJlOiB1c2VyTXNnMi5zaWduYXR1cmUgfSB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFt1c2VyR3BnUHViS2V5XSxcbiAgICAgICAgICBbXVxuICAgICAgICApO1xuICAgICAgICBiaXRnb1BhaXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbeyBwYXlsb2FkOiBCdWZmZXIuZnJvbSh1c2VyTXNnMi5tZXNzYWdlLCAnYmFzZTY0JyksIGZyb206IDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgICBhc3NlcnQub2soc3RhZ2VkQml0Z29Nc2cyLCAnc3RhZ2VkIEJpdEdvIG1zZzIgbWlzc2luZycpO1xuICAgICAgICByZXR1cm4geyBzZXNzaW9uSWQsIGJpdGdvTXNnMjogeyBmcm9tOiAyLCAuLi5zdGFnZWRCaXRnb01zZzIgfSB9O1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBub2NrRGVyaXZlUm91bmQzKGJpdGdvUGFpcjogRGtsc0Rydi5EZXJpdmUsIHRpbWVzID0gMSkge1xuICAgIHJldHVybiBub2NrKGJnVXJsKVxuICAgICAgLnBvc3QoXG4gICAgICAgICcvYXBpL3YyL21wYy9nZW5lcmF0ZWtleScsXG4gICAgICAgIChib2R5KSA9PiBib2R5LnJvdW5kID09PSAnTVBDdjJEZXJpdmUtUjMnICYmIGJvZHkuc2FmZUlkID09PSBTQUZFX0lEICYmIGJvZHkucGF5bG9hZD8uc2Vzc2lvbklkID09PSAndGVzdGlkJ1xuICAgICAgKVxuICAgICAgLnRpbWVzKHRpbWVzKVxuICAgICAgLnJlcGx5KDIwMCwgYXN5bmMgKHVyaSwgcmVxdWVzdEJvZHk6IHsgcGF5bG9hZDogTVBDdjJEZXJpdmVSb3VuZDNSZXF1ZXN0IH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBzZXNzaW9uSWQgfSA9IHJlcXVlc3RCb2R5LnBheWxvYWQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgIGNvbW1vbktleWNoYWluOiBEa2xzVHlwZXMuZ2V0Q29tbW9uS2V5Y2hhaW4oYml0Z29QYWlyLmdldEtleVNoYXJlKCkpIGFzIE5vbkVtcHR5U3RyaW5nLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBub2NrQWRkQ2hpbGRLZXkoY29pbjogc3RyaW5nLCB0aW1lcyA9IDIsIGluZGV4ID0gREVSSVZBVElPTl9JTkRFWCkge1xuICAgIHJldHVybiBub2NrKCdodHRwczovL2JpdGdvLmZha2V1cmwnKVxuICAgICAgLnBvc3QoXG4gICAgICAgIGAvYXBpL3YyLyR7Y29pbn0va2V5YCxcbiAgICAgICAgKGJvZHk6IEFkZEtleWNoYWluT3B0aW9ucyAmIHsgZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aD86IHN0cmluZyB9KSA9PlxuICAgICAgICAgIGJvZHkua2V5VHlwZSA9PT0gJ3RzcycgJiZcbiAgICAgICAgICBib2R5LmlzTVBDdjIgPT09IHRydWUgJiZcbiAgICAgICAgICBib2R5LnNhZmVJZCA9PT0gU0FGRV9JRCAmJlxuICAgICAgICAgICEhYm9keS5wYXJlbnQgJiZcbiAgICAgICAgICBib2R5LmRlcml2ZWRGcm9tUGFyZW50V2l0aFBhdGggPT09IGBtLyR7aW5kZXh9J2BcbiAgICAgIClcbiAgICAgIC50aW1lcyh0aW1lcylcbiAgICAgIC5yZXBseSgyMDAsICh1cmksIHJlcXVlc3RCb2R5OiBBZGRLZXljaGFpbk9wdGlvbnMpID0+ICh7XG4gICAgICAgIGlkOiByZXF1ZXN0Qm9keS5zb3VyY2UsXG4gICAgICAgIHNvdXJjZTogcmVxdWVzdEJvZHkuc291cmNlLFxuICAgICAgICB0eXBlOiByZXF1ZXN0Qm9keS5rZXlUeXBlLFxuICAgICAgICBjb21tb25LZXljaGFpbjogcmVxdWVzdEJvZHkuY29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIGVuY3J5cHRlZFBydjogcmVxdWVzdEJvZHkuZW5jcnlwdGVkUHJ2LFxuICAgICAgfSkpO1xuICB9XG59KTtcbiJdfQ==
|
|
@@ -98,6 +98,30 @@ describe('Staking Wallet Common', function () {
|
|
|
98
98
|
stakingRequest.should.deepEqual(expected);
|
|
99
99
|
msScope.isDone().should.be.True();
|
|
100
100
|
});
|
|
101
|
+
it('should preserve existing staking subtypes in the request payload', async function () {
|
|
102
|
+
const expected = stakingWallet_1.default.stakingRequest([stakingWallet_1.default.transaction('NEW')]);
|
|
103
|
+
const msScope = nock(microservicesUri)
|
|
104
|
+
.post(`/api/staking/v1/${stakingWallet.coin}/wallets/${stakingWallet.walletId}/requests`, {
|
|
105
|
+
amount: '1',
|
|
106
|
+
clientId: 'clientId',
|
|
107
|
+
subType: 'ETH_STAKE_PECTRA',
|
|
108
|
+
type: 'STAKE',
|
|
109
|
+
})
|
|
110
|
+
.reply(201, expected);
|
|
111
|
+
const stakingRequest = await stakingWallet.stake({
|
|
112
|
+
amount: '1',
|
|
113
|
+
clientId: 'clientId',
|
|
114
|
+
subType: 'ETH_STAKE_PECTRA',
|
|
115
|
+
});
|
|
116
|
+
should.exist(stakingRequest);
|
|
117
|
+
stakingRequest.should.deepEqual(expected);
|
|
118
|
+
msScope.isDone().should.be.True();
|
|
119
|
+
});
|
|
120
|
+
it('should reject incomplete pox5-bond options before making a request', async function () {
|
|
121
|
+
await stakingWallet
|
|
122
|
+
.stake({ subType: 'pox5-bond' })
|
|
123
|
+
.should.be.rejectedWith('bondIndex is required for pox5-bond staking');
|
|
124
|
+
});
|
|
101
125
|
});
|
|
102
126
|
describe('unstake', function () {
|
|
103
127
|
it('should call staking-service to unstake', async function () {
|
|
@@ -316,4 +340,4 @@ describe('Staking Wallet Common', function () {
|
|
|
316
340
|
});
|
|
317
341
|
});
|
|
318
342
|
});
|
|
319
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ1dhbGxldENvbW1vbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdjIvdW5pdC9zdGFraW5nL3N0YWtpbmdXYWxsZXRDb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBOEI7QUFDOUIsaUNBQWtDO0FBQ2xDLHdFQUE0RDtBQUU1RCw4Q0FBNEc7QUFDNUcsOENBQTRDO0FBQzVDLHlDQUF3QztBQUN4QywrQkFBK0I7QUFFL0IsUUFBUSxDQUFDLHVCQUF1QixFQUFFO0lBQ2hDLE1BQU0sZ0JBQWdCLEdBQUcsdUJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbEQsSUFBSSxLQUFLLENBQUM7SUFDVixJQUFJLFFBQVEsQ0FBQztJQUNiLElBQUksVUFBVSxDQUFDO0lBQ2YsSUFBSSxhQUE0QixDQUFDO0lBRWpDLE1BQU0sQ0FBQztRQUNMLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFTLENBQUMsQ0FBQztRQUM1RSxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckIsVUFBVSxHQUFHLElBQUkscUJBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLGtDQUFrQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDbEgsTUFBTSxVQUFVLEdBQUc7WUFDakIsRUFBRSxFQUFFLFVBQVU7WUFDZCxJQUFJLEVBQUUsS0FBSztZQUNYLFVBQVUsRUFBRSxVQUFVLENBQUMsRUFBRTtZQUN6QixJQUFJLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztTQUNuQyxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxpQkFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDdkQsYUFBYSxHQUFHLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQyxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUV0QyxTQUFTLENBQUM7UUFDUixPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUM3QixDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxPQUFPLEVBQUU7UUFDaEIsRUFBRSxDQUFDLHNDQUFzQyxFQUFFLEtBQUs7WUFDOUMsTUFBTSxRQUFRLEdBQUcsdUJBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyx1QkFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2lCQUNuQyxJQUFJLENBQUMsbUJBQW1CLGFBQWEsQ0FBQyxJQUFJLFlBQVksYUFBYSxDQUFDLFFBQVEsV0FBVyxFQUFFO2dCQUN4RixNQUFNLEVBQUUsR0FBRztnQkFDWCxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsSUFBSSxFQUFFLE9BQU87YUFDZCxDQUFDO2lCQUNELEtBQUssQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFeEIsTUFBTSxjQUFjLEdBQUcsTUFBTSxhQUFhLENBQUMsS0FBSyxDQUFDO2dCQUMvQyxNQUFNLEVBQUUsR0FBRztnQkFDWCxRQUFRLEVBQUUsVUFBVTthQUNyQixDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTdCLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtEQUErRCxFQUFFLEtBQUs7WUFDdkUsTUFBTSxRQUFRLEdBQUcsdUJBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyx1QkFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2lCQUNuQyxJQUFJLENBQUMsbUJBQW1CLGFBQWEsQ0FBQyxJQUFJLFlBQVksYUFBYSxDQUFDLFFBQVEsV0FBVyxFQUFFO2dCQUN4RixNQUFNLEVBQUUsR0FBRztnQkFDWCxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLGVBQWUsRUFBRSxJQUFJO2FBQ3RCLENBQUM7aUJBQ0QsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUV4QixNQUFNLE9BQU8sR0FBRztnQkFDZCxNQUFNLEVBQUUsR0FBRztnQkFDWCxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLGVBQWUsRUFBRSxJQUFJO2FBQ3RCLENBQUM7WUFDRixNQUFNLGNBQWMsR0FBRyxNQUFNLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFMUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUU3QixjQUFjLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5RUFBeUUsRUFBRSxLQUFLO1lBQ2pGLE1BQU0sUUFBUSxHQUFHLHVCQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsdUJBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDbkMsSUFBSSxDQUFDLG1CQUFtQixhQUFhLENBQUMsSUFBSSxZQUFZLGFBQWEsQ0FBQyxRQUFRLFdBQVcsRUFBRTtnQkFDeEYsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLElBQUksRUFBRSxPQUFPO2dCQUNiLGtCQUFrQixFQUFFO29CQUNsQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRTtvQkFDakMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUU7aUJBQ2xDO2dCQUNELGVBQWUsRUFBRSxJQUFJO2FBQ3RCLENBQUM7aUJBQ0QsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUV4QixNQUFNLE9BQU8sR0FBRztnQkFDZCxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsa0JBQWtCLEVBQUU7b0JBQ2xCLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFO29CQUNqQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRTtpQkFDbEM7Z0JBQ0QsZUFBZSxFQUFFLElBQUk7YUFDdEIsQ0FBQztZQUNGLE1BQU0sY0FBYyxHQUFHLE1BQU0sYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUUxRCxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTdCLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsU0FBUyxFQUFFO1FBQ2xCLEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRSxLQUFLO1lBQ2hELE1BQU0sUUFBUSxHQUFHLHVCQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsdUJBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDbkMsSUFBSSxDQUFDLG1CQUFtQixhQUFhLENBQUMsSUFBSSxZQUFZLGFBQWEsQ0FBQyxRQUFRLFdBQVcsRUFBRTtnQkFDeEYsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLElBQUksRUFBRSxTQUFTO2FBQ2hCLENBQUM7aUJBQ0QsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUV4QixNQUFNLGNBQWMsR0FBRyxNQUFNLGFBQWEsQ0FBQyxPQUFPLENBQUM7Z0JBQ2pELE1BQU0sRUFBRSxHQUFHO2dCQUNYLFFBQVEsRUFBRSxVQUFVO2FBQ3JCLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFN0IsY0FBYyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtRQUMzQixFQUFFLENBQUMsaURBQWlELEVBQUUsS0FBSztZQUN6RCxNQUFNLFFBQVEsR0FBRyx1QkFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLHVCQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7aUJBQ25DLElBQUksQ0FBQyxtQkFBbUIsYUFBYSxDQUFDLElBQUksWUFBWSxhQUFhLENBQUMsUUFBUSxXQUFXLEVBQUU7Z0JBQ3hGLE1BQU0sRUFBRSxHQUFHO2dCQUNYLFFBQVEsRUFBRSxVQUFVO2dCQUNwQixTQUFTLEVBQUUsV0FBVztnQkFDdEIsWUFBWSxFQUFFLFlBQVk7Z0JBQzFCLElBQUksRUFBRSxrQkFBa0I7YUFDekIsQ0FBQztpQkFDRCxLQUFLLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRXhCLE1BQU0sY0FBYyxHQUFHLE1BQU0sYUFBYSxDQUFDLGVBQWUsQ0FBQztnQkFDekQsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLFNBQVMsRUFBRSxXQUFXO2dCQUN0QixZQUFZLEVBQUUsWUFBWTthQUMzQixDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTdCLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZUFBZSxFQUFFO1FBQ3hCLEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxLQUFLO1lBQ3RELE1BQU0sUUFBUSxHQUFHLHVCQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsdUJBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDbkMsSUFBSSxDQUFDLG1CQUFtQixhQUFhLENBQUMsSUFBSSxZQUFZLGFBQWEsQ0FBQyxRQUFRLFdBQVcsRUFBRTtnQkFDeEYsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLFlBQVksRUFBRSxZQUFZO2dCQUMxQixJQUFJLEVBQUUsZUFBZTthQUN0QixDQUFDO2lCQUNELEtBQUssQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFeEIsTUFBTSxjQUFjLEdBQUcsTUFBTSxhQUFhLENBQUMsWUFBWSxDQUFDO2dCQUN0RCxNQUFNLEVBQUUsR0FBRztnQkFDWCxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsWUFBWSxFQUFFLFlBQVk7YUFDM0IsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUU3QixjQUFjLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHNCQUFzQixFQUFFO1FBQy9CLEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxLQUFLO1lBQy9ELE1BQU0sZ0JBQWdCLEdBQUcsc0NBQXNDLENBQUM7WUFDaEUsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsR0FBRyx1QkFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLHVCQUFRLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzlELE1BQU0sRUFBRSxVQUFVO2FBQ25CLENBQUM7WUFDRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7aUJBQ25DLE1BQU0sQ0FBQyxtQkFBbUIsYUFBYSxDQUFDLElBQUksWUFBWSxhQUFhLENBQUMsUUFBUSxhQUFhLGdCQUFnQixFQUFFLENBQUM7aUJBQzlHLEtBQUssQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFeEIsTUFBTSxjQUFjLEdBQUcsTUFBTSxhQUFhLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUVsRixNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTdCLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsbUJBQW1CLEVBQUU7UUFDNUIsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEtBQUs7WUFDNUQsTUFBTSxnQkFBZ0IsR0FBRyxzQ0FBc0MsQ0FBQztZQUNoRSxNQUFNLFFBQVEsR0FBRyx1QkFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLHVCQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7aUJBQ25DLEdBQUcsQ0FBQyxtQkFBbUIsYUFBYSxDQUFDLElBQUksWUFBWSxhQUFhLENBQUMsUUFBUSxhQUFhLGdCQUFnQixFQUFFLENBQUM7aUJBQzNHLEtBQUssQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFeEIsTUFBTSxjQUFjLEdBQUcsTUFBTSxhQUFhLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUUvRSxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTdCLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsNEJBQTRCLEVBQUU7UUFDckMsU0FBUyxxQkFBcUIsQ0FBQyxnQkFBd0IsRUFBRSxRQUF3QjtZQUMvRSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDMUIsR0FBRyxDQUFDLG1CQUFtQixhQUFhLENBQUMsSUFBSSxZQUFZLGFBQWEsQ0FBQyxRQUFRLGFBQWEsZ0JBQWdCLEVBQUUsQ0FBQztpQkFDM0csS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBRUQsRUFBRSxDQUFDLG1FQUFtRSxFQUFFLEtBQUs7WUFDM0UsTUFBTSxnQkFBZ0IsR0FBRyxzQ0FBc0MsQ0FBQztZQUNoRSxNQUFNLFFBQVEsR0FBRyx1QkFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3QyxNQUFNLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUVsRSxNQUFNLHVCQUF1QixHQUFHLE1BQU0sYUFBYSxDQUFDLDBCQUEwQixDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFFakcsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQ3RDLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDN0QsdUJBQXVCLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFdkQsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUdBQW1HLEVBQUUsS0FBSztZQUMzRyxNQUFNLGdCQUFnQixHQUFHLHNDQUFzQyxDQUFDO1lBQ2hFLE1BQU0sUUFBUSxHQUFHLHVCQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsdUJBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlFLE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRWxFLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxhQUFhLENBQUMsMEJBQTBCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUVqRyxNQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDdEMsdUJBQXVCLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM1RCx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUV2RCxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw4RkFBOEYsRUFBRSxLQUFLO1lBQ3RHLE1BQU0sZ0JBQWdCLEdBQUcsc0NBQXNDLENBQUM7WUFDaEUsTUFBTSxzQkFBc0IsR0FBRyx1QkFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLHVCQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RixNQUFNLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1lBRWhGLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxhQUFhLENBQUMsMEJBQTBCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUVqRyxNQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDdEMsdUJBQXVCLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM3RCx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUV2RCxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnR0FBZ0csRUFBRSxLQUFLO1lBQ3hHLE1BQU0sZ0JBQWdCLEdBQUcsc0NBQXNDLENBQUM7WUFDaEUsTUFBTSxtQkFBbUIsR0FBRyx1QkFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxRCxNQUFNLHNCQUFzQixHQUFHLHVCQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1lBQzlFLE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDLGdCQUFnQixFQUFFLHNCQUFzQixDQUFDLENBQUM7WUFFaEYsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBRWpHLE1BQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUN0Qyx1QkFBdUIsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzdELHVCQUF1QixDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFFNUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0dBQWdHLEVBQUUsS0FBSztZQUN4RyxNQUFNLGdCQUFnQixHQUFHLHNDQUFzQyxDQUFDO1lBQ2hFLE1BQU0sbUJBQW1CLEdBQUcsdUJBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUQsTUFBTSxzQkFBc0IsR0FBRyx1QkFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLHVCQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRyxNQUFNLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1lBRWhGLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxhQUFhLENBQUMsMEJBQTBCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUVqRyxNQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDdEMsdUJBQXVCLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM3RCx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBRTVFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsdUNBQXVDLEVBQUU7UUFDaEQsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEtBQUs7WUFDMUQsTUFBTSxXQUFXLEdBQUcsdUJBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLHVCQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQy9FLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDbkIsR0FBRyxDQUNGLG1CQUFtQixhQUFhLENBQUMsSUFBSSxZQUFZLGFBQWEsQ0FBQyxRQUFRLGFBQWEsV0FBVyxDQUFDLGdCQUFnQixpQkFBaUIsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUNsSjtpQkFDQSxLQUFLLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQztpQkFDbEMsS0FBSyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUUzQixNQUFNLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUJBQVEsQ0FBQyxTQUFTLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztZQUN4RixNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQU0sQ0FBQyxTQUFTLEVBQUUscUJBQXFCLENBQUMsQ0FBQztZQUNsRixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUFhLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdELE1BQU0sVUFBVSxHQUFHO2dCQUNqQixRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVE7Z0JBQ2hDLEtBQUssRUFBRSxLQUFLO2dCQUNaLFdBQVcsRUFBRSxXQUFXLENBQUMsV0FBVzthQUNyQyxDQUFDO1lBQ0YsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pDLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNuRSxNQUFNLGVBQWUsR0FBRztnQkFDdEIsR0FBRyx1QkFBUSxDQUFDLFdBQVc7Z0JBQ3ZCLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSTtnQkFDeEIsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRO2dCQUNoQyxVQUFVLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7Z0JBQ3ZDLE9BQU8sRUFBRSxJQUFJO2FBQ2QsQ0FBQztZQUNGLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxhQUFhLENBQUMscUNBQXFDLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbEcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUMvQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBRWhELE1BQU0sUUFBUSxHQUFHLE1BQU0sYUFBYSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNqRixrQkFBa0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxvRUFBb0UsRUFBRSxLQUFLO1lBQzVFLE1BQU0sV0FBVyxHQUFHLHVCQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2lCQUNuQixHQUFHLENBQ0YsbUJBQW1CLGFBQWEsQ0FBQyxJQUFJLFlBQVksYUFBYSxDQUFDLFFBQVEsYUFBYSxXQUFXLENBQUMsZ0JBQWdCLGlCQUFpQixXQUFXLENBQUMsRUFBRSxFQUFFLENBQ2xKO2lCQUNBLEtBQUssQ0FBQyxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUFDO2lCQUNsQyxLQUFLLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBRTNCLE1BQU0scUJBQXFCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBUSxDQUFDLFNBQVMsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1lBQ3hGLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBTSxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1lBQ2xGLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0JBQWEsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0QsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUTtnQkFDaEMsS0FBSyxFQUFFLEtBQUs7YUFDYixDQUFDO1lBQ0YsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pDLElBQUksV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUM1QixxQkFBcUIsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdkUsQ0FBQztZQUNELE1BQU0sZUFBZSxHQUFHO2dCQUN0QixHQUFHLHVCQUFRLENBQUMsV0FBVztnQkFDdkIsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJO2dCQUN4QixRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVE7Z0JBQ2hDLFVBQVUsRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtnQkFDdkMsT0FBTyxFQUFFLElBQUk7YUFDZCxDQUFDO1lBQ0YsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLGFBQWEsQ0FBQyxxQ0FBcUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNsRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQy9DLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFFakQsTUFBTSxRQUFRLEdBQUcsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRWpGLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHNob3VsZCA9IHJlcXVpcmUoJ3Nob3VsZCcpO1xuaW1wb3J0IGZpeHR1cmVzIGZyb20gJy4uLy4uL2ZpeHR1cmVzL3N0YWtpbmcvc3Rha2luZ1dhbGxldCc7XG5cbmltcG9ydCB7IEVudGVycHJpc2UsIEVudmlyb25tZW50cywgU3Rha2luZ1JlcXVlc3QsIFN0YWtpbmdXYWxsZXQsIFRzc1V0aWxzLCBXYWxsZXQgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgVGVzdEJpdEdvIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcblxuZGVzY3JpYmUoJ1N0YWtpbmcgV2FsbGV0IENvbW1vbicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgbWljcm9zZXJ2aWNlc1VyaSA9IEVudmlyb25tZW50c1snbW9jayddLnVyaTtcbiAgbGV0IGJpdGdvO1xuICBsZXQgYmFzZUNvaW47XG4gIGxldCBlbnRlcnByaXNlO1xuICBsZXQgc3Rha2luZ1dhbGxldDogU3Rha2luZ1dhbGxldDtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvLCB7IGVudjogJ21vY2snLCBtaWNyb3NlcnZpY2VzVXJpIH0gYXMgYW55KTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlQ29pbiA9IGJpdGdvLmNvaW4oJ2V0aCcpO1xuICAgIGJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIGVudGVycHJpc2UgPSBuZXcgRW50ZXJwcmlzZShiaXRnbywgYmFzZUNvaW4sIHsgaWQ6ICc1Y2Y5NDA5NDk0NDk0MTJkMDBmNTNiM2Q5MmRiY2FhMycsIG5hbWU6ICdUZXN0IEVudGVycHJpc2UnIH0pO1xuICAgIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgICBpZDogJ3dhbGxldElkJyxcbiAgICAgIGNvaW46ICdldGgnLFxuICAgICAgZW50ZXJwcmlzZTogZW50ZXJwcmlzZS5pZCxcbiAgICAgIGtleXM6IFsnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc1J10sXG4gICAgfTtcbiAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlQ29pbiwgd2FsbGV0RGF0YSk7XG4gICAgc3Rha2luZ1dhbGxldCA9IHdhbGxldC50b1N0YWtpbmdXYWxsZXQoKTtcbiAgfSk7XG5cbiAgY29uc3Qgc2FuZGJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNhbmRib3gudmVyaWZ5QW5kUmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3Rha2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIHN0YWtpbmctc2VydmljZSB0byBzdGFrZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gZml4dHVyZXMuc3Rha2luZ1JlcXVlc3QoW2ZpeHR1cmVzLnRyYW5zYWN0aW9uKCdORVcnKV0pO1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLnBvc3QoYC9hcGkvc3Rha2luZy92MS8ke3N0YWtpbmdXYWxsZXQuY29pbn0vd2FsbGV0cy8ke3N0YWtpbmdXYWxsZXQud2FsbGV0SWR9L3JlcXVlc3RzYCwge1xuICAgICAgICAgIGFtb3VudDogJzEnLFxuICAgICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgICAgIHR5cGU6ICdTVEFLRScsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXBseSgyMDEsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3QgPSBhd2FpdCBzdGFraW5nV2FsbGV0LnN0YWtlKHtcbiAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgfSk7XG5cbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nUmVxdWVzdCk7XG5cbiAgICAgIHN0YWtpbmdSZXF1ZXN0LnNob3VsZC5kZWVwRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgbXNTY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIHN0YWtpbmctc2VydmljZSB0byBzdGFrZSB3aXRoIG9wdGlvbmFsIHBhcmFtZXRlcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtmaXh0dXJlcy50cmFuc2FjdGlvbignTkVXJyldKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5wb3N0KGAvYXBpL3N0YWtpbmcvdjEvJHtzdGFraW5nV2FsbGV0LmNvaW59L3dhbGxldHMvJHtzdGFraW5nV2FsbGV0LndhbGxldElkfS9yZXF1ZXN0c2AsIHtcbiAgICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgICBjbGllbnRJZDogJ2NsaWVudElkJyxcbiAgICAgICAgICB0eXBlOiAnU1RBS0UnLFxuICAgICAgICAgIHZhbGlkYXRvcjogJzEyMycsXG4gICAgICAgICAgZHVyYXRpb25TZWNvbmRzOiAnNjAnLFxuICAgICAgICB9KVxuICAgICAgICAucmVwbHkoMjAxLCBleHBlY3RlZCk7XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIGFtb3VudDogJzEnLFxuICAgICAgICBjbGllbnRJZDogJ2NsaWVudElkJyxcbiAgICAgICAgdmFsaWRhdG9yOiAnMTIzJyxcbiAgICAgICAgZHVyYXRpb25TZWNvbmRzOiAnNjAnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0ID0gYXdhaXQgc3Rha2luZ1dhbGxldC5zdGFrZShvcHRpb25zKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KHN0YWtpbmdSZXF1ZXN0KTtcblxuICAgICAgc3Rha2luZ1JlcXVlc3Quc2hvdWxkLmRlZXBFcXVhbChleHBlY3RlZCk7XG4gICAgICBtc1Njb3BlLmlzRG9uZSgpLnNob3VsZC5iZS5UcnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgc3Rha2luZy1zZXJ2aWNlIHRvIHN0YWtlIHdpdGggb3B0aW9uYWwgc3Rha2VNYW55IHBhcmFtZXRlcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtmaXh0dXJlcy50cmFuc2FjdGlvbignTkVXJyldKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5wb3N0KGAvYXBpL3N0YWtpbmcvdjEvJHtzdGFraW5nV2FsbGV0LmNvaW59L3dhbGxldHMvJHtzdGFraW5nV2FsbGV0LndhbGxldElkfS9yZXF1ZXN0c2AsIHtcbiAgICAgICAgICBjbGllbnRJZDogJ2NsaWVudElkJyxcbiAgICAgICAgICB0eXBlOiAnU1RBS0UnLFxuICAgICAgICAgIGRlbGVnYXRpb25SZXF1ZXN0czogW1xuICAgICAgICAgICAgeyBhbW91bnQ6ICcxJywgdmFsaWRhdG9yOiAnMTIzJyB9LFxuICAgICAgICAgICAgeyBhbW91bnQ6ICcyJywgdmFsaWRhdG9yOiAnNDU2JyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZHVyYXRpb25TZWNvbmRzOiAnNjAnLFxuICAgICAgICB9KVxuICAgICAgICAucmVwbHkoMjAxLCBleHBlY3RlZCk7XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgICBkZWxlZ2F0aW9uUmVxdWVzdHM6IFtcbiAgICAgICAgICB7IGFtb3VudDogJzEnLCB2YWxpZGF0b3I6ICcxMjMnIH0sXG4gICAgICAgICAgeyBhbW91bnQ6ICcyJywgdmFsaWRhdG9yOiAnNDU2JyB9LFxuICAgICAgICBdLFxuICAgICAgICBkdXJhdGlvblNlY29uZHM6ICc2MCcsXG4gICAgICB9O1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3QgPSBhd2FpdCBzdGFraW5nV2FsbGV0LnN0YWtlKG9wdGlvbnMpO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Vuc3Rha2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIHN0YWtpbmctc2VydmljZSB0byB1bnN0YWtlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBmaXh0dXJlcy5zdGFraW5nUmVxdWVzdChbZml4dHVyZXMudHJhbnNhY3Rpb24oJ05FVycpXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbm9jayhtaWNyb3NlcnZpY2VzVXJpKVxuICAgICAgICAucG9zdChgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHNgLCB7XG4gICAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgICAgdHlwZTogJ1VOU1RBS0UnLFxuICAgICAgICB9KVxuICAgICAgICAucmVwbHkoMjAxLCBleHBlY3RlZCk7XG5cbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0ID0gYXdhaXQgc3Rha2luZ1dhbGxldC51bnN0YWtlKHtcbiAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgfSk7XG5cbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nUmVxdWVzdCk7XG5cbiAgICAgIHN0YWtpbmdSZXF1ZXN0LnNob3VsZC5kZWVwRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgbXNTY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3dpdGNoIHZhbGlkYXRvcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgc3Rha2luZy1zZXJ2aWNlIHRvIHN3aXRjaCB2YWxpZGF0b3InLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtmaXh0dXJlcy50cmFuc2FjdGlvbignTkVXJyldKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5wb3N0KGAvYXBpL3N0YWtpbmcvdjEvJHtzdGFraW5nV2FsbGV0LmNvaW59L3dhbGxldHMvJHtzdGFraW5nV2FsbGV0LndhbGxldElkfS9yZXF1ZXN0c2AsIHtcbiAgICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgICBjbGllbnRJZDogJ2NsaWVudElkJyxcbiAgICAgICAgICB2YWxpZGF0b3I6ICd2YWxpZGF0b3InLFxuICAgICAgICAgIGRlbGVnYXRpb25JZDogJ2RlbGVnYXRpb24nLFxuICAgICAgICAgIHR5cGU6ICdTV0lUQ0hfVkFMSURBVE9SJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMSwgZXhwZWN0ZWQpO1xuXG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdCA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuc3dpdGNoVmFsaWRhdG9yKHtcbiAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgICB2YWxpZGF0b3I6ICd2YWxpZGF0b3InLFxuICAgICAgICBkZWxlZ2F0aW9uSWQ6ICdkZWxlZ2F0aW9uJyxcbiAgICAgIH0pO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NsYWltIHJld2FyZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIHN0YWtpbmctc2VydmljZSB0byBjbGFpbSByZXdhcmRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBmaXh0dXJlcy5zdGFraW5nUmVxdWVzdChbZml4dHVyZXMudHJhbnNhY3Rpb24oJ05FVycpXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbm9jayhtaWNyb3NlcnZpY2VzVXJpKVxuICAgICAgICAucG9zdChgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHNgLCB7XG4gICAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgICAgZGVsZWdhdGlvbklkOiAnZGVsZWdhdGlvbicsXG4gICAgICAgICAgdHlwZTogJ0NMQUlNX1JFV0FSRFMnLFxuICAgICAgICB9KVxuICAgICAgICAucmVwbHkoMjAxLCBleHBlY3RlZCk7XG5cbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0ID0gYXdhaXQgc3Rha2luZ1dhbGxldC5jbGFpbVJld2FyZHMoe1xuICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgIGRlbGVnYXRpb25JZDogJ2RlbGVnYXRpb24nLFxuICAgICAgfSk7XG5cbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nUmVxdWVzdCk7XG5cbiAgICAgIHN0YWtpbmdSZXF1ZXN0LnNob3VsZC5kZWVwRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgbXNTY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY2FuY2VsU3Rha2luZ1JlcXVlc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIHN0YWtpbmctc2VydmljZSB0byBjYW5jZWwgc3Rha2luZyByZXF1ZXN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3RJZCA9ICc4NjM4Mjg0YS1kYWIyLTQ2YjktYjA3Zi0yMTEwOWE2ZTcyMjAnO1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7XG4gICAgICAgIC4uLmZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtmaXh0dXJlcy50cmFuc2FjdGlvbignUkVKRUNURUQnKV0pLFxuICAgICAgICBzdGF0dXM6ICdSRUpFQ1RFRCcsXG4gICAgICB9O1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLmRlbGV0ZShgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHMvJHtzdGFraW5nUmVxdWVzdElkfWApXG4gICAgICAgIC5yZXBseSgyMDAsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3QgPSBhd2FpdCBzdGFraW5nV2FsbGV0LmNhbmNlbFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQpO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFN0YWtpbmdSZXF1ZXN0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgY2FsbCBzdGFraW5nLXNlcnZpY2UgdG8gZ2V0IHN0YWtpbmcgcmVxdWVzdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0SWQgPSAnODYzODI4NGEtZGFiMi00NmI5LWIwN2YtMjExMDlhNmU3MjIwJztcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gZml4dHVyZXMuc3Rha2luZ1JlcXVlc3QoW2ZpeHR1cmVzLnRyYW5zYWN0aW9uKCdORVcnKV0pO1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLmdldChgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHMvJHtzdGFraW5nUmVxdWVzdElkfWApXG4gICAgICAgIC5yZXBseSgyMDAsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3QgPSBhd2FpdCBzdGFraW5nV2FsbGV0LmdldFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQpO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFRyYW5zYWN0aW9uc1JlYWR5VG9TaWduJywgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIG1vY2tHZXRTdGFraW5nUmVxdWVzdChzdGFraW5nUmVxdWVzdElkOiBzdHJpbmcsIGV4cGVjdGVkOiBTdGFraW5nUmVxdWVzdCkge1xuICAgICAgcmV0dXJuIG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLmdldChgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHMvJHtzdGFraW5nUmVxdWVzdElkfWApXG4gICAgICAgIC5yZXBseSgyMDAsIGV4cGVjdGVkKTtcbiAgICB9XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbGxTaWduaW5nQ29tcGxldGUgZmFsc2Ugd2hlbiBubyB0cmFuc2FjdGlvbnMgZXhpc3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdElkID0gJzg2MzgyODRhLWRhYjItNDZiOS1iMDdmLTIxMTA5YTZlNzIyMCc7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtdKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBtb2NrR2V0U3Rha2luZ1JlcXVlc3Qoc3Rha2luZ1JlcXVlc3RJZCwgZXhwZWN0ZWQpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuZ2V0VHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24oc3Rha2luZ1JlcXVlc3RJZCk7XG5cbiAgICAgIHNob3VsZC5leGlzdCh0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbik7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi5hbGxTaWduaW5nQ29tcGxldGUuc2hvdWxkLmJlLkZhbHNlKCk7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi50cmFuc2FjdGlvbnMuc2hvdWxkLmJlLmVtcHR5KCk7XG5cbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbFNpZ25pbmdDb21wbGV0ZSB0cnVlIGFuZCAwIHRyYW5zYWN0aW9ucyB3aGVuIG9ubHkgYSBDT05GSVJNRUQgdHJhbnNhY3Rpb24gZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3RJZCA9ICc4NjM4Mjg0YS1kYWIyLTQ2YjktYjA3Zi0yMTEwOWE2ZTcyMjAnO1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBmaXh0dXJlcy5zdGFraW5nUmVxdWVzdChbZml4dHVyZXMudHJhbnNhY3Rpb24oJ0NPTkZJUk1FRCcpXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbW9ja0dldFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24gPSBhd2FpdCBzdGFraW5nV2FsbGV0LmdldFRyYW5zYWN0aW9uc1JlYWR5VG9TaWduKHN0YWtpbmdSZXF1ZXN0SWQpO1xuXG4gICAgICBzaG91bGQuZXhpc3QodHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24pO1xuICAgICAgdHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24uYWxsU2lnbmluZ0NvbXBsZXRlLnNob3VsZC5iZS5UcnVlKCk7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi50cmFuc2FjdGlvbnMuc2hvdWxkLmJlLmVtcHR5KCk7XG5cbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbFNpZ25pbmdDb21wbGV0ZSBmYWxzZSBhbmQgMCB0cmFuc2FjdGlvbnMgd2hlbiBvbmx5IGEgTkVXIHRyYW5zYWN0aW9uIGV4aXN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0SWQgPSAnODYzODI4NGEtZGFiMi00NmI5LWIwN2YtMjExMDlhNmU3MjIwJztcbiAgICAgIGNvbnN0IGV4cGVjdGVkU3Rha2luZ1JlcXVlc3QgPSBmaXh0dXJlcy5zdGFraW5nUmVxdWVzdChbZml4dHVyZXMudHJhbnNhY3Rpb24oJ05FVycpXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbW9ja0dldFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQsIGV4cGVjdGVkU3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuZ2V0VHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24oc3Rha2luZ1JlcXVlc3RJZCk7XG5cbiAgICAgIHNob3VsZC5leGlzdCh0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbik7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi5hbGxTaWduaW5nQ29tcGxldGUuc2hvdWxkLmJlLkZhbHNlKCk7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi50cmFuc2FjdGlvbnMuc2hvdWxkLmJlLmVtcHR5KCk7XG5cbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbFNpZ25pbmdDb21wbGV0ZSBmYWxzZSBhbmQgMSB0cmFuc2FjdGlvbnMgd2hlbiBvbmx5IGEgUkVBRFkgdHJhbnNhY3Rpb24gZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3RJZCA9ICc4NjM4Mjg0YS1kYWIyLTQ2YjktYjA3Zi0yMTEwOWE2ZTcyMjAnO1xuICAgICAgY29uc3QgZXhwZWN0ZWRUcmFuc2FjdGlvbiA9IGZpeHR1cmVzLnRyYW5zYWN0aW9uKCdSRUFEWScpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRTdGFraW5nUmVxdWVzdCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtleHBlY3RlZFRyYW5zYWN0aW9uXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbW9ja0dldFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQsIGV4cGVjdGVkU3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuZ2V0VHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24oc3Rha2luZ1JlcXVlc3RJZCk7XG5cbiAgICAgIHNob3VsZC5leGlzdCh0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbik7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi5hbGxTaWduaW5nQ29tcGxldGUuc2hvdWxkLmJlLkZhbHNlKCk7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi50cmFuc2FjdGlvbnMuc2hvdWxkLmNvbnRhaW5FcWwoZXhwZWN0ZWRUcmFuc2FjdGlvbik7XG5cbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbFNpZ25pbmdDb21wbGV0ZSBmYWxzZSBhbmQgMSB0cmFuc2FjdGlvbiB3aGVuIE5FVyBhbmQgUkVBRFkgdHJhbnNhY3Rpb24gZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3RJZCA9ICc4NjM4Mjg0YS1kYWIyLTQ2YjktYjA3Zi0yMTEwOWE2ZTcyMjAnO1xuICAgICAgY29uc3QgZXhwZWN0ZWRUcmFuc2FjdGlvbiA9IGZpeHR1cmVzLnRyYW5zYWN0aW9uKCdSRUFEWScpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRTdGFraW5nUmVxdWVzdCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtleHBlY3RlZFRyYW5zYWN0aW9uLCBmaXh0dXJlcy50cmFuc2FjdGlvbignTkVXJyldKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBtb2NrR2V0U3Rha2luZ1JlcXVlc3Qoc3Rha2luZ1JlcXVlc3RJZCwgZXhwZWN0ZWRTdGFraW5nUmVxdWVzdCk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uc1JlYWR5VG9TaWduID0gYXdhaXQgc3Rha2luZ1dhbGxldC5nZXRUcmFuc2FjdGlvbnNSZWFkeVRvU2lnbihzdGFraW5nUmVxdWVzdElkKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KHRyYW5zYWN0aW9uc1JlYWR5VG9TaWduKTtcbiAgICAgIHRyYW5zYWN0aW9uc1JlYWR5VG9TaWduLmFsbFNpZ25pbmdDb21wbGV0ZS5zaG91bGQuYmUuRmFsc2UoKTtcbiAgICAgIHRyYW5zYWN0aW9uc1JlYWR5VG9TaWduLnRyYW5zYWN0aW9ucy5zaG91bGQuY29udGFpbkVxbChleHBlY3RlZFRyYW5zYWN0aW9uKTtcblxuICAgICAgbXNTY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncHJlYnVpbGRTZWxmTWFuYWdlZFN0YWtpbmdUcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHByZWJ1aWxkIHNlbGYtbWFuYWdlZCBzdGFraW5nIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBmaXh0dXJlcy50cmFuc2FjdGlvbignUkVBRFknLCBmaXh0dXJlcy5idWlsZFBhcmFtcywgZmFsc2UpO1xuICAgICAgbm9jayhtaWNyb3NlcnZpY2VzVXJpKVxuICAgICAgICAuZ2V0KFxuICAgICAgICAgIGAvYXBpL3N0YWtpbmcvdjEvJHtzdGFraW5nV2FsbGV0LmNvaW59L3dhbGxldHMvJHtzdGFraW5nV2FsbGV0LndhbGxldElkfS9yZXF1ZXN0cy8ke3RyYW5zYWN0aW9uLnN0YWtpbmdSZXF1ZXN0SWR9L3RyYW5zYWN0aW9ucy8ke3RyYW5zYWN0aW9uLmlkfWBcbiAgICAgICAgKVxuICAgICAgICAucXVlcnkoeyBleHBhbmRCdWlsZFBhcmFtczogdHJ1ZSB9KVxuICAgICAgICAucmVwbHkoMjAwLCB0cmFuc2FjdGlvbik7XG5cbiAgICAgIGNvbnN0IGRlbGV0ZVNpZ25hdHVyZVNoYXJlcyA9IHNhbmRib3guc3R1YihUc3NVdGlscy5wcm90b3R5cGUsICdkZWxldGVTaWduYXR1cmVTaGFyZXMnKTtcbiAgICAgIGNvbnN0IHByZWJ1aWxkVHJhbnNhY3Rpb24gPSBzYW5kYm94LnN0dWIoV2FsbGV0LnByb3RvdHlwZSwgJ3ByZWJ1aWxkVHJhbnNhY3Rpb24nKTtcbiAgICAgIGNvbnN0IGJ1aWxkID0gc2FuZGJveC5zdHViKFN0YWtpbmdXYWxsZXQucHJvdG90eXBlLCAnYnVpbGQnKTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHdhbGxldElkOiBzdGFraW5nV2FsbGV0LndhbGxldElkLFxuICAgICAgICB0eEhleDogJ2hleCcsXG4gICAgICAgIGJ1aWxkUGFyYW1zOiB0cmFuc2FjdGlvbi5idWlsZFBhcmFtcyxcbiAgICAgIH07XG4gICAgICBwcmVidWlsZFRyYW5zYWN0aW9uLnJlc29sdmVzKHR4UHJlYnVpbGQpO1xuICAgICAgcHJlYnVpbGRUcmFuc2FjdGlvbi5jYWxsZWRPbmNlV2l0aEV4YWN0bHkodHJhbnNhY3Rpb24uYnVpbGRQYXJhbXMpO1xuICAgICAgY29uc3QgZm9ybWF0dGVkUGFyYW1zID0ge1xuICAgICAgICAuLi5maXh0dXJlcy5idWlsZFBhcmFtcyxcbiAgICAgICAgY29pbjogc3Rha2luZ1dhbGxldC5jb2luLFxuICAgICAgICB3YWxsZXRJZDogc3Rha2luZ1dhbGxldC53YWxsZXRJZCxcbiAgICAgICAgd2FsbGV0VHlwZTogc3Rha2luZ1dhbGxldC53YWxsZXQudHlwZSgpLFxuICAgICAgICBwcmV2aWV3OiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0YWtpbmdUcmFuc2FjdGlvbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQucHJlYnVpbGRTZWxmTWFuYWdlZFN0YWtpbmdUcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG4gICAgICBzYW5kYm94LmFzc2VydC5jYWxsZWRPbmNlKHByZWJ1aWxkVHJhbnNhY3Rpb24pO1xuICAgICAgc2FuZGJveC5hc3NlcnQubm90Q2FsbGVkKGJ1aWxkKTtcbiAgICAgIHNhbmRib3guYXNzZXJ0Lm5vdENhbGxlZChkZWxldGVTaWduYXR1cmVTaGFyZXMpO1xuXG4gICAgICBjb25zdCBleHBlY3RlZCA9IGF3YWl0IHN0YWtpbmdXYWxsZXQud2FsbGV0LnByZWJ1aWxkVHJhbnNhY3Rpb24oZm9ybWF0dGVkUGFyYW1zKTtcbiAgICAgIHN0YWtpbmdUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nVHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcHJlYnVpbGQgc2VsZi1tYW5hZ2VkIHN0YWtpbmcgdHJhbnNhY3Rpb24gLSBubyBidWlsZCBwYXJhbXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGZpeHR1cmVzLnRyYW5zYWN0aW9uKCdSRUFEWScsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5nZXQoXG4gICAgICAgICAgYC9hcGkvc3Rha2luZy92MS8ke3N0YWtpbmdXYWxsZXQuY29pbn0vd2FsbGV0cy8ke3N0YWtpbmdXYWxsZXQud2FsbGV0SWR9L3JlcXVlc3RzLyR7dHJhbnNhY3Rpb24uc3Rha2luZ1JlcXVlc3RJZH0vdHJhbnNhY3Rpb25zLyR7dHJhbnNhY3Rpb24uaWR9YFxuICAgICAgICApXG4gICAgICAgIC5xdWVyeSh7IGV4cGFuZEJ1aWxkUGFyYW1zOiB0cnVlIH0pXG4gICAgICAgIC5yZXBseSgyMDAsIHRyYW5zYWN0aW9uKTtcblxuICAgICAgY29uc3QgZGVsZXRlU2lnbmF0dXJlU2hhcmVzID0gc2FuZGJveC5zdHViKFRzc1V0aWxzLnByb3RvdHlwZSwgJ2RlbGV0ZVNpZ25hdHVyZVNoYXJlcycpO1xuICAgICAgY29uc3QgcHJlYnVpbGRUcmFuc2FjdGlvbiA9IHNhbmRib3guc3R1YihXYWxsZXQucHJvdG90eXBlLCAncHJlYnVpbGRUcmFuc2FjdGlvbicpO1xuICAgICAgY29uc3QgYnVpbGQgPSBzYW5kYm94LnN0dWIoU3Rha2luZ1dhbGxldC5wcm90b3R5cGUsICdidWlsZCcpO1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgd2FsbGV0SWQ6IHN0YWtpbmdXYWxsZXQud2FsbGV0SWQsXG4gICAgICAgIHR4SGV4OiAnaGV4JyxcbiAgICAgIH07XG4gICAgICBwcmVidWlsZFRyYW5zYWN0aW9uLnJlc29sdmVzKHR4UHJlYnVpbGQpO1xuICAgICAgaWYgKHRyYW5zYWN0aW9uLnR4UmVxdWVzdElkKSB7XG4gICAgICAgIGRlbGV0ZVNpZ25hdHVyZVNoYXJlcy5jYWxsZWRPbmNlV2l0aEV4YWN0bHkodHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQpO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9ybWF0dGVkUGFyYW1zID0ge1xuICAgICAgICAuLi5maXh0dXJlcy5idWlsZFBhcmFtcyxcbiAgICAgICAgY29pbjogc3Rha2luZ1dhbGxldC5jb2luLFxuICAgICAgICB3YWxsZXRJZDogc3Rha2luZ1dhbGxldC53YWxsZXRJZCxcbiAgICAgICAgd2FsbGV0VHlwZTogc3Rha2luZ1dhbGxldC53YWxsZXQudHlwZSgpLFxuICAgICAgICBwcmV2aWV3OiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0YWtpbmdUcmFuc2FjdGlvbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQucHJlYnVpbGRTZWxmTWFuYWdlZFN0YWtpbmdUcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG4gICAgICBzYW5kYm94LmFzc2VydC5jYWxsZWRPbmNlKHByZWJ1aWxkVHJhbnNhY3Rpb24pO1xuICAgICAgc2FuZGJveC5hc3NlcnQubm90Q2FsbGVkKGJ1aWxkKTtcbiAgICAgIHNhbmRib3guYXNzZXJ0LmNhbGxlZE9uY2UoZGVsZXRlU2lnbmF0dXJlU2hhcmVzKTtcblxuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBhd2FpdCBzdGFraW5nV2FsbGV0LndhbGxldC5wcmVidWlsZFRyYW5zYWN0aW9uKGZvcm1hdHRlZFBhcmFtcyk7XG5cbiAgICAgIHN0YWtpbmdUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nVHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
343
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ1dhbGxldENvbW1vbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdjIvdW5pdC9zdGFraW5nL3N0YWtpbmdXYWxsZXRDb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBOEI7QUFDOUIsaUNBQWtDO0FBQ2xDLHdFQUE0RDtBQUU1RCw4Q0FBNEc7QUFDNUcsOENBQTRDO0FBQzVDLHlDQUF3QztBQUN4QywrQkFBK0I7QUFFL0IsUUFBUSxDQUFDLHVCQUF1QixFQUFFO0lBQ2hDLE1BQU0sZ0JBQWdCLEdBQUcsdUJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbEQsSUFBSSxLQUFLLENBQUM7SUFDVixJQUFJLFFBQVEsQ0FBQztJQUNiLElBQUksVUFBVSxDQUFDO0lBQ2YsSUFBSSxhQUE0QixDQUFDO0lBRWpDLE1BQU0sQ0FBQztRQUNMLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFTLENBQUMsQ0FBQztRQUM1RSxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckIsVUFBVSxHQUFHLElBQUkscUJBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLGtDQUFrQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDbEgsTUFBTSxVQUFVLEdBQUc7WUFDakIsRUFBRSxFQUFFLFVBQVU7WUFDZCxJQUFJLEVBQUUsS0FBSztZQUNYLFVBQVUsRUFBRSxVQUFVLENBQUMsRUFBRTtZQUN6QixJQUFJLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztTQUNuQyxDQUFDO1FBQ0YsTUFBTSxN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QU0sQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUVqRCxNQUFNLFFBQVEsR0FBRyxNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFakYsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5QyxNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG5vY2sgPSByZXF1aXJlKCdub2NrJyk7XG5pbXBvcnQgc2hvdWxkID0gcmVxdWlyZSgnc2hvdWxkJyk7XG5pbXBvcnQgZml4dHVyZXMgZnJvbSAnLi4vLi4vZml4dHVyZXMvc3Rha2luZy9zdGFraW5nV2FsbGV0JztcblxuaW1wb3J0IHsgRW50ZXJwcmlzZSwgRW52aXJvbm1lbnRzLCBTdGFraW5nUmVxdWVzdCwgU3Rha2luZ1dhbGxldCwgVHNzVXRpbHMsIFdhbGxldCB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUZXN0Qml0R28gfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R28gfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuXG5kZXNjcmliZSgnU3Rha2luZyBXYWxsZXQgQ29tbW9uJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBtaWNyb3NlcnZpY2VzVXJpID0gRW52aXJvbm1lbnRzWydtb2NrJ10udXJpO1xuICBsZXQgYml0Z287XG4gIGxldCBiYXNlQ29pbjtcbiAgbGV0IGVudGVycHJpc2U7XG4gIGxldCBzdGFraW5nV2FsbGV0OiBTdGFraW5nV2FsbGV0O1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycsIG1pY3Jvc2VydmljZXNVcmkgfSBhcyBhbnkpO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2VDb2luID0gYml0Z28uY29pbignZXRoJyk7XG4gICAgYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgZW50ZXJwcmlzZSA9IG5ldyBFbnRlcnByaXNlKGJpdGdvLCBiYXNlQ29pbiwgeyBpZDogJzVjZjk0MDk0OTQ0OTQxMmQwMGY1M2IzZDkyZGJjYWEzJywgbmFtZTogJ1Rlc3QgRW50ZXJwcmlzZScgfSk7XG4gICAgY29uc3Qgd2FsbGV0RGF0YSA9IHtcbiAgICAgIGlkOiAnd2FsbGV0SWQnLFxuICAgICAgY29pbjogJ2V0aCcsXG4gICAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlLmlkLFxuICAgICAga2V5czogWyc1YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzUnXSxcbiAgICB9O1xuICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGJhc2VDb2luLCB3YWxsZXREYXRhKTtcbiAgICBzdGFraW5nV2FsbGV0ID0gd2FsbGV0LnRvU3Rha2luZ1dhbGxldCgpO1xuICB9KTtcblxuICBjb25zdCBzYW5kYm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveC52ZXJpZnlBbmRSZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdGFrZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgc3Rha2luZy1zZXJ2aWNlIHRvIHN0YWtlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBmaXh0dXJlcy5zdGFraW5nUmVxdWVzdChbZml4dHVyZXMudHJhbnNhY3Rpb24oJ05FVycpXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbm9jayhtaWNyb3NlcnZpY2VzVXJpKVxuICAgICAgICAucG9zdChgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHNgLCB7XG4gICAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgICAgdHlwZTogJ1NUQUtFJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMSwgZXhwZWN0ZWQpO1xuXG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdCA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuc3Rha2Uoe1xuICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICB9KTtcblxuICAgICAgc2hvdWxkLmV4aXN0KHN0YWtpbmdSZXF1ZXN0KTtcblxuICAgICAgc3Rha2luZ1JlcXVlc3Quc2hvdWxkLmRlZXBFcXVhbChleHBlY3RlZCk7XG4gICAgICBtc1Njb3BlLmlzRG9uZSgpLnNob3VsZC5iZS5UcnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgc3Rha2luZy1zZXJ2aWNlIHRvIHN0YWtlIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gZml4dHVyZXMuc3Rha2luZ1JlcXVlc3QoW2ZpeHR1cmVzLnRyYW5zYWN0aW9uKCdORVcnKV0pO1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLnBvc3QoYC9hcGkvc3Rha2luZy92MS8ke3N0YWtpbmdXYWxsZXQuY29pbn0vd2FsbGV0cy8ke3N0YWtpbmdXYWxsZXQud2FsbGV0SWR9L3JlcXVlc3RzYCwge1xuICAgICAgICAgIGFtb3VudDogJzEnLFxuICAgICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgICAgIHR5cGU6ICdTVEFLRScsXG4gICAgICAgICAgdmFsaWRhdG9yOiAnMTIzJyxcbiAgICAgICAgICBkdXJhdGlvblNlY29uZHM6ICc2MCcsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXBseSgyMDEsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgICB2YWxpZGF0b3I6ICcxMjMnLFxuICAgICAgICBkdXJhdGlvblNlY29uZHM6ICc2MCcsXG4gICAgICB9O1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3QgPSBhd2FpdCBzdGFraW5nV2FsbGV0LnN0YWtlKG9wdGlvbnMpO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FsbCBzdGFraW5nLXNlcnZpY2UgdG8gc3Rha2Ugd2l0aCBvcHRpb25hbCBzdGFrZU1hbnkgcGFyYW1ldGVycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gZml4dHVyZXMuc3Rha2luZ1JlcXVlc3QoW2ZpeHR1cmVzLnRyYW5zYWN0aW9uKCdORVcnKV0pO1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLnBvc3QoYC9hcGkvc3Rha2luZy92MS8ke3N0YWtpbmdXYWxsZXQuY29pbn0vd2FsbGV0cy8ke3N0YWtpbmdXYWxsZXQud2FsbGV0SWR9L3JlcXVlc3RzYCwge1xuICAgICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgICAgIHR5cGU6ICdTVEFLRScsXG4gICAgICAgICAgZGVsZWdhdGlvblJlcXVlc3RzOiBbXG4gICAgICAgICAgICB7IGFtb3VudDogJzEnLCB2YWxpZGF0b3I6ICcxMjMnIH0sXG4gICAgICAgICAgICB7IGFtb3VudDogJzInLCB2YWxpZGF0b3I6ICc0NTYnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkdXJhdGlvblNlY29uZHM6ICc2MCcsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXBseSgyMDEsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgIGRlbGVnYXRpb25SZXF1ZXN0czogW1xuICAgICAgICAgIHsgYW1vdW50OiAnMScsIHZhbGlkYXRvcjogJzEyMycgfSxcbiAgICAgICAgICB7IGFtb3VudDogJzInLCB2YWxpZGF0b3I6ICc0NTYnIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGR1cmF0aW9uU2Vjb25kczogJzYwJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdCA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuc3Rha2Uob3B0aW9ucyk7XG5cbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nUmVxdWVzdCk7XG5cbiAgICAgIHN0YWtpbmdSZXF1ZXN0LnNob3VsZC5kZWVwRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgbXNTY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcmVzZXJ2ZSBleGlzdGluZyBzdGFraW5nIHN1YnR5cGVzIGluIHRoZSByZXF1ZXN0IHBheWxvYWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtmaXh0dXJlcy50cmFuc2FjdGlvbignTkVXJyldKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5wb3N0KGAvYXBpL3N0YWtpbmcvdjEvJHtzdGFraW5nV2FsbGV0LmNvaW59L3dhbGxldHMvJHtzdGFraW5nV2FsbGV0LndhbGxldElkfS9yZXF1ZXN0c2AsIHtcbiAgICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgICBjbGllbnRJZDogJ2NsaWVudElkJyxcbiAgICAgICAgICBzdWJUeXBlOiAnRVRIX1NUQUtFX1BFQ1RSQScsXG4gICAgICAgICAgdHlwZTogJ1NUQUtFJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMSwgZXhwZWN0ZWQpO1xuXG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdCA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuc3Rha2Uoe1xuICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgIHN1YlR5cGU6ICdFVEhfU1RBS0VfUEVDVFJBJyxcbiAgICAgIH0pO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuICAgICAgc3Rha2luZ1JlcXVlc3Quc2hvdWxkLmRlZXBFcXVhbChleHBlY3RlZCk7XG4gICAgICBtc1Njb3BlLmlzRG9uZSgpLnNob3VsZC5iZS5UcnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpbmNvbXBsZXRlIHBveDUtYm9uZCBvcHRpb25zIGJlZm9yZSBtYWtpbmcgYSByZXF1ZXN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgc3Rha2luZ1dhbGxldFxuICAgICAgICAuc3Rha2UoeyBzdWJUeXBlOiAncG94NS1ib25kJyB9IGFzIGFueSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2JvbmRJbmRleCBpcyByZXF1aXJlZCBmb3IgcG94NS1ib25kIHN0YWtpbmcnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Vuc3Rha2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIHN0YWtpbmctc2VydmljZSB0byB1bnN0YWtlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBmaXh0dXJlcy5zdGFraW5nUmVxdWVzdChbZml4dHVyZXMudHJhbnNhY3Rpb24oJ05FVycpXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbm9jayhtaWNyb3NlcnZpY2VzVXJpKVxuICAgICAgICAucG9zdChgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHNgLCB7XG4gICAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgICAgdHlwZTogJ1VOU1RBS0UnLFxuICAgICAgICB9KVxuICAgICAgICAucmVwbHkoMjAxLCBleHBlY3RlZCk7XG5cbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0ID0gYXdhaXQgc3Rha2luZ1dhbGxldC51bnN0YWtlKHtcbiAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgfSk7XG5cbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nUmVxdWVzdCk7XG5cbiAgICAgIHN0YWtpbmdSZXF1ZXN0LnNob3VsZC5kZWVwRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgbXNTY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3dpdGNoIHZhbGlkYXRvcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgc3Rha2luZy1zZXJ2aWNlIHRvIHN3aXRjaCB2YWxpZGF0b3InLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtmaXh0dXJlcy50cmFuc2FjdGlvbignTkVXJyldKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5wb3N0KGAvYXBpL3N0YWtpbmcvdjEvJHtzdGFraW5nV2FsbGV0LmNvaW59L3dhbGxldHMvJHtzdGFraW5nV2FsbGV0LndhbGxldElkfS9yZXF1ZXN0c2AsIHtcbiAgICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgICBjbGllbnRJZDogJ2NsaWVudElkJyxcbiAgICAgICAgICB2YWxpZGF0b3I6ICd2YWxpZGF0b3InLFxuICAgICAgICAgIGRlbGVnYXRpb25JZDogJ2RlbGVnYXRpb24nLFxuICAgICAgICAgIHR5cGU6ICdTV0lUQ0hfVkFMSURBVE9SJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMSwgZXhwZWN0ZWQpO1xuXG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdCA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuc3dpdGNoVmFsaWRhdG9yKHtcbiAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgICB2YWxpZGF0b3I6ICd2YWxpZGF0b3InLFxuICAgICAgICBkZWxlZ2F0aW9uSWQ6ICdkZWxlZ2F0aW9uJyxcbiAgICAgIH0pO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NsYWltIHJld2FyZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIHN0YWtpbmctc2VydmljZSB0byBjbGFpbSByZXdhcmRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBmaXh0dXJlcy5zdGFraW5nUmVxdWVzdChbZml4dHVyZXMudHJhbnNhY3Rpb24oJ05FVycpXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbm9jayhtaWNyb3NlcnZpY2VzVXJpKVxuICAgICAgICAucG9zdChgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHNgLCB7XG4gICAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgICAgZGVsZWdhdGlvbklkOiAnZGVsZWdhdGlvbicsXG4gICAgICAgICAgdHlwZTogJ0NMQUlNX1JFV0FSRFMnLFxuICAgICAgICB9KVxuICAgICAgICAucmVwbHkoMjAxLCBleHBlY3RlZCk7XG5cbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0ID0gYXdhaXQgc3Rha2luZ1dhbGxldC5jbGFpbVJld2FyZHMoe1xuICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgIGRlbGVnYXRpb25JZDogJ2RlbGVnYXRpb24nLFxuICAgICAgfSk7XG5cbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nUmVxdWVzdCk7XG5cbiAgICAgIHN0YWtpbmdSZXF1ZXN0LnNob3VsZC5kZWVwRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgbXNTY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY2FuY2VsU3Rha2luZ1JlcXVlc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIHN0YWtpbmctc2VydmljZSB0byBjYW5jZWwgc3Rha2luZyByZXF1ZXN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3RJZCA9ICc4NjM4Mjg0YS1kYWIyLTQ2YjktYjA3Zi0yMTEwOWE2ZTcyMjAnO1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7XG4gICAgICAgIC4uLmZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtmaXh0dXJlcy50cmFuc2FjdGlvbignUkVKRUNURUQnKV0pLFxuICAgICAgICBzdGF0dXM6ICdSRUpFQ1RFRCcsXG4gICAgICB9O1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLmRlbGV0ZShgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHMvJHtzdGFraW5nUmVxdWVzdElkfWApXG4gICAgICAgIC5yZXBseSgyMDAsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3QgPSBhd2FpdCBzdGFraW5nV2FsbGV0LmNhbmNlbFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQpO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFN0YWtpbmdSZXF1ZXN0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgY2FsbCBzdGFraW5nLXNlcnZpY2UgdG8gZ2V0IHN0YWtpbmcgcmVxdWVzdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0SWQgPSAnODYzODI4NGEtZGFiMi00NmI5LWIwN2YtMjExMDlhNmU3MjIwJztcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gZml4dHVyZXMuc3Rha2luZ1JlcXVlc3QoW2ZpeHR1cmVzLnRyYW5zYWN0aW9uKCdORVcnKV0pO1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLmdldChgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHMvJHtzdGFraW5nUmVxdWVzdElkfWApXG4gICAgICAgIC5yZXBseSgyMDAsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3QgPSBhd2FpdCBzdGFraW5nV2FsbGV0LmdldFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQpO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFRyYW5zYWN0aW9uc1JlYWR5VG9TaWduJywgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIG1vY2tHZXRTdGFraW5nUmVxdWVzdChzdGFraW5nUmVxdWVzdElkOiBzdHJpbmcsIGV4cGVjdGVkOiBTdGFraW5nUmVxdWVzdCkge1xuICAgICAgcmV0dXJuIG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLmdldChgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHMvJHtzdGFraW5nUmVxdWVzdElkfWApXG4gICAgICAgIC5yZXBseSgyMDAsIGV4cGVjdGVkKTtcbiAgICB9XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbGxTaWduaW5nQ29tcGxldGUgZmFsc2Ugd2hlbiBubyB0cmFuc2FjdGlvbnMgZXhpc3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdElkID0gJzg2MzgyODRhLWRhYjItNDZiOS1iMDdmLTIxMTA5YTZlNzIyMCc7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtdKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBtb2NrR2V0U3Rha2luZ1JlcXVlc3Qoc3Rha2luZ1JlcXVlc3RJZCwgZXhwZWN0ZWQpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuZ2V0VHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24oc3Rha2luZ1JlcXVlc3RJZCk7XG5cbiAgICAgIHNob3VsZC5leGlzdCh0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbik7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi5hbGxTaWduaW5nQ29tcGxldGUuc2hvdWxkLmJlLkZhbHNlKCk7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi50cmFuc2FjdGlvbnMuc2hvdWxkLmJlLmVtcHR5KCk7XG5cbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbFNpZ25pbmdDb21wbGV0ZSB0cnVlIGFuZCAwIHRyYW5zYWN0aW9ucyB3aGVuIG9ubHkgYSBDT05GSVJNRUQgdHJhbnNhY3Rpb24gZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3RJZCA9ICc4NjM4Mjg0YS1kYWIyLTQ2YjktYjA3Zi0yMTEwOWE2ZTcyMjAnO1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBmaXh0dXJlcy5zdGFraW5nUmVxdWVzdChbZml4dHVyZXMudHJhbnNhY3Rpb24oJ0NPTkZJUk1FRCcpXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbW9ja0dldFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24gPSBhd2FpdCBzdGFraW5nV2FsbGV0LmdldFRyYW5zYWN0aW9uc1JlYWR5VG9TaWduKHN0YWtpbmdSZXF1ZXN0SWQpO1xuXG4gICAgICBzaG91bGQuZXhpc3QodHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24pO1xuICAgICAgdHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24uYWxsU2lnbmluZ0NvbXBsZXRlLnNob3VsZC5iZS5UcnVlKCk7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi50cmFuc2FjdGlvbnMuc2hvdWxkLmJlLmVtcHR5KCk7XG5cbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbFNpZ25pbmdDb21wbGV0ZSBmYWxzZSBhbmQgMCB0cmFuc2FjdGlvbnMgd2hlbiBvbmx5IGEgTkVXIHRyYW5zYWN0aW9uIGV4aXN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0SWQgPSAnODYzODI4NGEtZGFiMi00NmI5LWIwN2YtMjExMDlhNmU3MjIwJztcbiAgICAgIGNvbnN0IGV4cGVjdGVkU3Rha2luZ1JlcXVlc3QgPSBmaXh0dXJlcy5zdGFraW5nUmVxdWVzdChbZml4dHVyZXMudHJhbnNhY3Rpb24oJ05FVycpXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbW9ja0dldFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQsIGV4cGVjdGVkU3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuZ2V0VHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24oc3Rha2luZ1JlcXVlc3RJZCk7XG5cbiAgICAgIHNob3VsZC5leGlzdCh0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbik7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi5hbGxTaWduaW5nQ29tcGxldGUuc2hvdWxkLmJlLkZhbHNlKCk7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi50cmFuc2FjdGlvbnMuc2hvdWxkLmJlLmVtcHR5KCk7XG5cbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbFNpZ25pbmdDb21wbGV0ZSBmYWxzZSBhbmQgMSB0cmFuc2FjdGlvbnMgd2hlbiBvbmx5IGEgUkVBRFkgdHJhbnNhY3Rpb24gZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3RJZCA9ICc4NjM4Mjg0YS1kYWIyLTQ2YjktYjA3Zi0yMTEwOWE2ZTcyMjAnO1xuICAgICAgY29uc3QgZXhwZWN0ZWRUcmFuc2FjdGlvbiA9IGZpeHR1cmVzLnRyYW5zYWN0aW9uKCdSRUFEWScpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRTdGFraW5nUmVxdWVzdCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtleHBlY3RlZFRyYW5zYWN0aW9uXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbW9ja0dldFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQsIGV4cGVjdGVkU3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuZ2V0VHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24oc3Rha2luZ1JlcXVlc3RJZCk7XG5cbiAgICAgIHNob3VsZC5leGlzdCh0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbik7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi5hbGxTaWduaW5nQ29tcGxldGUuc2hvdWxkLmJlLkZhbHNlKCk7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi50cmFuc2FjdGlvbnMuc2hvdWxkLmNvbnRhaW5FcWwoZXhwZWN0ZWRUcmFuc2FjdGlvbik7XG5cbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbFNpZ25pbmdDb21wbGV0ZSBmYWxzZSBhbmQgMSB0cmFuc2FjdGlvbiB3aGVuIE5FVyBhbmQgUkVBRFkgdHJhbnNhY3Rpb24gZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3RJZCA9ICc4NjM4Mjg0YS1kYWIyLTQ2YjktYjA3Zi0yMTEwOWE2ZTcyMjAnO1xuICAgICAgY29uc3QgZXhwZWN0ZWRUcmFuc2FjdGlvbiA9IGZpeHR1cmVzLnRyYW5zYWN0aW9uKCdSRUFEWScpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRTdGFraW5nUmVxdWVzdCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtleHBlY3RlZFRyYW5zYWN0aW9uLCBmaXh0dXJlcy50cmFuc2FjdGlvbignTkVXJyldKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBtb2NrR2V0U3Rha2luZ1JlcXVlc3Qoc3Rha2luZ1JlcXVlc3RJZCwgZXhwZWN0ZWRTdGFraW5nUmVxdWVzdCk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uc1JlYWR5VG9TaWduID0gYXdhaXQgc3Rha2luZ1dhbGxldC5nZXRUcmFuc2FjdGlvbnNSZWFkeVRvU2lnbihzdGFraW5nUmVxdWVzdElkKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KHRyYW5zYWN0aW9uc1JlYWR5VG9TaWduKTtcbiAgICAgIHRyYW5zYWN0aW9uc1JlYWR5VG9TaWduLmFsbFNpZ25pbmdDb21wbGV0ZS5zaG91bGQuYmUuRmFsc2UoKTtcbiAgICAgIHRyYW5zYWN0aW9uc1JlYWR5VG9TaWduLnRyYW5zYWN0aW9ucy5zaG91bGQuY29udGFpbkVxbChleHBlY3RlZFRyYW5zYWN0aW9uKTtcblxuICAgICAgbXNTY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncHJlYnVpbGRTZWxmTWFuYWdlZFN0YWtpbmdUcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHByZWJ1aWxkIHNlbGYtbWFuYWdlZCBzdGFraW5nIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBmaXh0dXJlcy50cmFuc2FjdGlvbignUkVBRFknLCBmaXh0dXJlcy5idWlsZFBhcmFtcywgZmFsc2UpO1xuICAgICAgbm9jayhtaWNyb3NlcnZpY2VzVXJpKVxuICAgICAgICAuZ2V0KFxuICAgICAgICAgIGAvYXBpL3N0YWtpbmcvdjEvJHtzdGFraW5nV2FsbGV0LmNvaW59L3dhbGxldHMvJHtzdGFraW5nV2FsbGV0LndhbGxldElkfS9yZXF1ZXN0cy8ke3RyYW5zYWN0aW9uLnN0YWtpbmdSZXF1ZXN0SWR9L3RyYW5zYWN0aW9ucy8ke3RyYW5zYWN0aW9uLmlkfWBcbiAgICAgICAgKVxuICAgICAgICAucXVlcnkoeyBleHBhbmRCdWlsZFBhcmFtczogdHJ1ZSB9KVxuICAgICAgICAucmVwbHkoMjAwLCB0cmFuc2FjdGlvbik7XG5cbiAgICAgIGNvbnN0IGRlbGV0ZVNpZ25hdHVyZVNoYXJlcyA9IHNhbmRib3guc3R1YihUc3NVdGlscy5wcm90b3R5cGUsICdkZWxldGVTaWduYXR1cmVTaGFyZXMnKTtcbiAgICAgIGNvbnN0IHByZWJ1aWxkVHJhbnNhY3Rpb24gPSBzYW5kYm94LnN0dWIoV2FsbGV0LnByb3RvdHlwZSwgJ3ByZWJ1aWxkVHJhbnNhY3Rpb24nKTtcbiAgICAgIGNvbnN0IGJ1aWxkID0gc2FuZGJveC5zdHViKFN0YWtpbmdXYWxsZXQucHJvdG90eXBlLCAnYnVpbGQnKTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHdhbGxldElkOiBzdGFraW5nV2FsbGV0LndhbGxldElkLFxuICAgICAgICB0eEhleDogJ2hleCcsXG4gICAgICAgIGJ1aWxkUGFyYW1zOiB0cmFuc2FjdGlvbi5idWlsZFBhcmFtcyxcbiAgICAgIH07XG4gICAgICBwcmVidWlsZFRyYW5zYWN0aW9uLnJlc29sdmVzKHR4UHJlYnVpbGQpO1xuICAgICAgcHJlYnVpbGRUcmFuc2FjdGlvbi5jYWxsZWRPbmNlV2l0aEV4YWN0bHkodHJhbnNhY3Rpb24uYnVpbGRQYXJhbXMpO1xuICAgICAgY29uc3QgZm9ybWF0dGVkUGFyYW1zID0ge1xuICAgICAgICAuLi5maXh0dXJlcy5idWlsZFBhcmFtcyxcbiAgICAgICAgY29pbjogc3Rha2luZ1dhbGxldC5jb2luLFxuICAgICAgICB3YWxsZXRJZDogc3Rha2luZ1dhbGxldC53YWxsZXRJZCxcbiAgICAgICAgd2FsbGV0VHlwZTogc3Rha2luZ1dhbGxldC53YWxsZXQudHlwZSgpLFxuICAgICAgICBwcmV2aWV3OiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0YWtpbmdUcmFuc2FjdGlvbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQucHJlYnVpbGRTZWxmTWFuYWdlZFN0YWtpbmdUcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG4gICAgICBzYW5kYm94LmFzc2VydC5jYWxsZWRPbmNlKHByZWJ1aWxkVHJhbnNhY3Rpb24pO1xuICAgICAgc2FuZGJveC5hc3NlcnQubm90Q2FsbGVkKGJ1aWxkKTtcbiAgICAgIHNhbmRib3guYXNzZXJ0Lm5vdENhbGxlZChkZWxldGVTaWduYXR1cmVTaGFyZXMpO1xuXG4gICAgICBjb25zdCBleHBlY3RlZCA9IGF3YWl0IHN0YWtpbmdXYWxsZXQud2FsbGV0LnByZWJ1aWxkVHJhbnNhY3Rpb24oZm9ybWF0dGVkUGFyYW1zKTtcbiAgICAgIHN0YWtpbmdUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nVHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcHJlYnVpbGQgc2VsZi1tYW5hZ2VkIHN0YWtpbmcgdHJhbnNhY3Rpb24gLSBubyBidWlsZCBwYXJhbXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGZpeHR1cmVzLnRyYW5zYWN0aW9uKCdSRUFEWScsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5nZXQoXG4gICAgICAgICAgYC9hcGkvc3Rha2luZy92MS8ke3N0YWtpbmdXYWxsZXQuY29pbn0vd2FsbGV0cy8ke3N0YWtpbmdXYWxsZXQud2FsbGV0SWR9L3JlcXVlc3RzLyR7dHJhbnNhY3Rpb24uc3Rha2luZ1JlcXVlc3RJZH0vdHJhbnNhY3Rpb25zLyR7dHJhbnNhY3Rpb24uaWR9YFxuICAgICAgICApXG4gICAgICAgIC5xdWVyeSh7IGV4cGFuZEJ1aWxkUGFyYW1zOiB0cnVlIH0pXG4gICAgICAgIC5yZXBseSgyMDAsIHRyYW5zYWN0aW9uKTtcblxuICAgICAgY29uc3QgZGVsZXRlU2lnbmF0dXJlU2hhcmVzID0gc2FuZGJveC5zdHViKFRzc1V0aWxzLnByb3RvdHlwZSwgJ2RlbGV0ZVNpZ25hdHVyZVNoYXJlcycpO1xuICAgICAgY29uc3QgcHJlYnVpbGRUcmFuc2FjdGlvbiA9IHNhbmRib3guc3R1YihXYWxsZXQucHJvdG90eXBlLCAncHJlYnVpbGRUcmFuc2FjdGlvbicpO1xuICAgICAgY29uc3QgYnVpbGQgPSBzYW5kYm94LnN0dWIoU3Rha2luZ1dhbGxldC5wcm90b3R5cGUsICdidWlsZCcpO1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgd2FsbGV0SWQ6IHN0YWtpbmdXYWxsZXQud2FsbGV0SWQsXG4gICAgICAgIHR4SGV4OiAnaGV4JyxcbiAgICAgIH07XG4gICAgICBwcmVidWlsZFRyYW5zYWN0aW9uLnJlc29sdmVzKHR4UHJlYnVpbGQpO1xuICAgICAgaWYgKHRyYW5zYWN0aW9uLnR4UmVxdWVzdElkKSB7XG4gICAgICAgIGRlbGV0ZVNpZ25hdHVyZVNoYXJlcy5jYWxsZWRPbmNlV2l0aEV4YWN0bHkodHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQpO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9ybWF0dGVkUGFyYW1zID0ge1xuICAgICAgICAuLi5maXh0dXJlcy5idWlsZFBhcmFtcyxcbiAgICAgICAgY29pbjogc3Rha2luZ1dhbGxldC5jb2luLFxuICAgICAgICB3YWxsZXRJZDogc3Rha2luZ1dhbGxldC53YWxsZXRJZCxcbiAgICAgICAgd2FsbGV0VHlwZTogc3Rha2luZ1dhbGxldC53YWxsZXQudHlwZSgpLFxuICAgICAgICBwcmV2aWV3OiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0YWtpbmdUcmFuc2FjdGlvbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQucHJlYnVpbGRTZWxmTWFuYWdlZFN0YWtpbmdUcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG4gICAgICBzYW5kYm94LmFzc2VydC5jYWxsZWRPbmNlKHByZWJ1aWxkVHJhbnNhY3Rpb24pO1xuICAgICAgc2FuZGJveC5hc3NlcnQubm90Q2FsbGVkKGJ1aWxkKTtcbiAgICAgIHNhbmRib3guYXNzZXJ0LmNhbGxlZE9uY2UoZGVsZXRlU2lnbmF0dXJlU2hhcmVzKTtcblxuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBhd2FpdCBzdGFraW5nV2FsbGV0LndhbGxldC5wcmVidWlsZFRyYW5zYWN0aW9uKGZvcm1hdHRlZFBhcmFtcyk7XG5cbiAgICAgIHN0YWtpbmdUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nVHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|