@bitgo-beta/sdk-coin-flrp 1.0.1-beta.352 → 1.0.1-beta.354

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.
@@ -44,64 +44,84 @@ describe('Flrp Import In C Tx Builder', () => {
44
44
  },
45
45
  txHash: importInC_1.IMPORT_IN_C.txhash,
46
46
  });
47
- describe('dynamic fee calculation', () => {
48
- it('should calculate proper fee using feeRate multiplier (AVAXP approach) to avoid "insufficient unlocked funds" error', async () => {
49
- const amount = '100000000'; // 100M nanoFLRP (0.1 FLR)
50
- const feeRate = '1'; // 1 nanoFLRP per cost unit (matching AVAXP's feeRate usage)
47
+ describe('fee calculation - insufficient unlocked funds fix', () => {
48
+ /**
49
+ * This test verifies the fix for the "insufficient unlocked funds" error that occurred
50
+ * during P-to-C chain transactions.
51
+ *
52
+ * Real-world transaction data:
53
+ * - Input: 100,000,000 nanoFLRP (from P-chain export)
54
+ * - Original feeRate: 500, which caused "needs 280000 more" error
55
+ * - Old (buggy) calculation:
56
+ * - Size: 12,234 (only unsignedTx.toBytes())
57
+ * - Fee: 500 × 12,234 = 6,117,000
58
+ * - Error: "insufficient unlocked funds: needs 280000 more"
59
+ * - Required fee: 6,117,000 + 280,000 = 6,397,000
60
+ *
61
+ * The fix has two parts:
62
+ * 1. Use getSignedTx().toBytes() to include credentials in size calculation (~140+ bytes)
63
+ * 2. Increase feeRate from 500 to 550 to provide additional buffer
64
+ *
65
+ * With fix: size ~12,376 × feeRate 550 = 6,806,800 > 6,397,000 ✓
66
+ */
67
+ it('should calculate sufficient fee to avoid "insufficient unlocked funds" error', async () => {
68
+ const inputAmount = '100000000';
69
+ const feeRate = 550;
70
+ const threshold = 2;
71
+ const pAddresses = [
72
+ 'P-costwo1060n6skw5lsz7ch8z4vnv2s24vetjv5w73g4k2',
73
+ 'P-costwo1kt5hrl4kr5dt92ayxjash6uujkf4nh5ex0y9rj',
74
+ 'P-costwo1eys86hynecjn8400j30e7y706aecv8wz0l875x',
75
+ ];
76
+ const cChainDestination = '0x7e9f3d42cea7e02f62e71559362a0aab32b9328e';
51
77
  const utxo = {
52
- outputID: 0,
53
- amount: amount,
54
- txid: '2vPMx8P63adgBae7GAWFx7qvJDwRmMnDCyKddHRBXWhysjX4BP',
78
+ outputID: 7,
79
+ amount: inputAmount,
80
+ txid: '2b2A4CyaRawiVAycUhpfvaxizymUT3TwRUbrzwiy3qp7DnKznj',
55
81
  outputidx: '0',
56
82
  addresses: [
57
- '0x3329be7d01cd3ebaae6654d7327dd9f17a2e1581',
58
- '0x7e918a5e8083ae4c9f2f0ed77055c24bf3665001',
59
- '0xc7324437c96c7c8a6a152da2385c1db5c3ab1f91',
83
+ '0x7e9f3d42cea7e02f62e71559362a0aab32b9328e',
84
+ 'C9207d5c93ce2533d5ef945f9f13cfd773861dc2',
85
+ 'b2e971feb61d1ab2aba434bb0beb9c959359de99',
60
86
  ],
61
- threshold: 2,
87
+ threshold: threshold,
62
88
  };
63
89
  const txBuilder = factory
64
90
  .getImportInCBuilder()
65
- .threshold(2)
66
- .fromPubKey(importInC_1.IMPORT_IN_C.pAddresses)
91
+ .threshold(threshold)
92
+ .fromPubKey(pAddresses)
67
93
  .utxos([utxo])
68
- .to(importInC_1.IMPORT_IN_C.to)
69
- .feeRate(feeRate);
94
+ .to(cChainDestination)
95
+ .feeRate(feeRate.toString());
70
96
  const tx = await txBuilder.build();
71
- const calculatedFee = BigInt(tx.fee.fee);
72
- const feeRateBigInt = BigInt(feeRate);
73
- // The fee should be approximately: feeRate × (txSize + inputCost + fixedFee)
74
- // For 1 input, threshold=2, ~228 bytes: 1 × (228 + 2000 + 10000) = 12,228
75
- const expectedMinCost = 12000; // Minimum cost units (conservative estimate)
76
- const expectedMaxCost = 13000; // Maximum cost units (with some buffer)
77
- const expectedMinFee = feeRateBigInt * BigInt(expectedMinCost);
78
- const expectedMaxFee = feeRateBigInt * BigInt(expectedMaxCost);
79
- // Verify fee is in the expected range
80
- (0, assert_1.default)(calculatedFee >= expectedMinFee, `Fee ${calculatedFee} should be at least ${expectedMinFee} (feeRate × minCost)`);
81
- (0, assert_1.default)(calculatedFee <= expectedMaxFee, `Fee ${calculatedFee} should not exceed ${expectedMaxFee} (feeRate × maxCost)`);
82
- // Verify the output amount is positive (no "insufficient funds" error)
83
- const outputs = tx.outputs;
84
- outputs.length.should.equal(1);
85
- const outputAmount = BigInt(outputs[0].value);
86
- (0, assert_1.default)(outputAmount > BigInt(0), 'Output amount should be positive - transaction should not fail with insufficient funds');
87
- // Verify the math: input - output = fee
88
- const inputAmount = BigInt(amount);
89
- const calculatedOutput = inputAmount - calculatedFee;
90
- (0, assert_1.default)(outputAmount === calculatedOutput, 'Output should equal input minus total fee');
97
+ const feeInfo = tx.fee;
98
+ const calculatedFee = BigInt(feeInfo.fee);
99
+ const calculatedSize = feeInfo.size;
100
+ const oldBuggyFeeAt500 = BigInt(12234) * BigInt(500);
101
+ const shortfall = BigInt(280000);
102
+ const requiredFee = oldBuggyFeeAt500 + shortfall;
103
+ (0, assert_1.default)(calculatedFee >= requiredFee, `Fee ${calculatedFee} should be at least ${requiredFee} (old fee ${oldBuggyFeeAt500} + shortfall ${shortfall})`);
104
+ const oldBuggySize = 12234;
105
+ (0, assert_1.default)(calculatedSize > oldBuggySize, `Size ${calculatedSize} should be greater than old buggy size ${oldBuggySize}`);
106
+ const outputAmount = BigInt(tx.outputs[0].value);
107
+ (0, assert_1.default)(outputAmount > BigInt(0), 'Output amount should be positive');
108
+ const inputBigInt = BigInt(inputAmount);
109
+ const expectedOutput = inputBigInt - calculatedFee;
110
+ (0, assert_1.default)(outputAmount === expectedOutput, `Output ${outputAmount} should equal input ${inputBigInt} minus fee ${calculatedFee}`);
91
111
  });
92
- it('should use consistent fee calculation in initBuilder and buildFlareTransaction', async () => {
93
- const inputAmount = '100000000'; // 100M nanoFLRP (matches real-world transaction)
94
- const expectedFeeRate = 500; // Real feeRate from working transaction
112
+ it('should match AVAXP costImportTx formula: bytesCost + inputCosts + fixedFee', async () => {
113
+ const inputAmount = '100000000';
114
+ const feeRate = 500;
95
115
  const threshold = 2;
96
116
  const utxo = {
97
- outputID: 0,
117
+ outputID: 7,
98
118
  amount: inputAmount,
99
- txid: '2vPMx8P63adgBae7GAWFx7qvJDwRmMnDCyKddHRBXWhysjX4BP',
119
+ txid: '2b2A4CyaRawiVAycUhpfvaxizymUT3TwRUbrzwiy3qp7DnKznj',
100
120
  outputidx: '0',
101
121
  addresses: [
102
- '0x3329be7d01cd3ebaae6654d7327dd9f17a2e1581',
103
- '0x7e918a5e8083ae4c9f2f0ed77055c24bf3665001',
104
- '0xc7324437c96c7c8a6a152da2385c1db5c3ab1f91',
122
+ '0x7e9f3d42cea7e02f62e71559362a0aab32b9328e',
123
+ 'C9207d5c93ce2533d5ef945f9f13cfd773861dc2',
124
+ 'b2e971feb61d1ab2aba434bb0beb9c959359de99',
105
125
  ],
106
126
  threshold: threshold,
107
127
  };
@@ -111,48 +131,34 @@ describe('Flrp Import In C Tx Builder', () => {
111
131
  .fromPubKey(importInC_1.IMPORT_IN_C.pAddresses)
112
132
  .utxos([utxo])
113
133
  .to(importInC_1.IMPORT_IN_C.to)
114
- .feeRate(expectedFeeRate.toString());
134
+ .feeRate(feeRate.toString());
115
135
  const tx = await txBuilder.build();
116
- const calculatedFee = BigInt(tx.fee.fee);
117
136
  const feeInfo = tx.fee;
118
- const maxReasonableFee = BigInt(inputAmount) / BigInt(10); // Max 10% of input
119
- (0, assert_1.default)(calculatedFee < maxReasonableFee, `Fee ${calculatedFee} should be less than 10% of input (${maxReasonableFee})`);
120
- const expectedMinFee = BigInt(expectedFeeRate) * BigInt(12000);
121
- const expectedMaxFee = BigInt(expectedFeeRate) * BigInt(13000);
122
- (0, assert_1.default)(calculatedFee >= expectedMinFee, `Fee ${calculatedFee} should be at least ${expectedMinFee}`);
123
- (0, assert_1.default)(calculatedFee <= expectedMaxFee, `Fee ${calculatedFee} should not exceed ${expectedMaxFee}`);
124
- const outputAmount = BigInt(tx.outputs[0].value);
125
- (0, assert_1.default)(outputAmount > BigInt(0), 'Output should be positive');
126
- const expectedOutput = BigInt(inputAmount) - calculatedFee;
127
- (0, assert_1.default)(outputAmount === expectedOutput, `Output ${outputAmount} should equal input ${inputAmount} minus fee ${calculatedFee}`);
128
- const txHex = tx.toBroadcastFormat();
129
- const parsedBuilder = factory.from(txHex);
130
- const parsedTx = await parsedBuilder.build();
131
- const parsedFeeRate = parsedTx.fee.feeRate;
132
- (0, assert_1.default)(parsedFeeRate !== undefined && parsedFeeRate > 0, 'Parsed feeRate should be defined and positive');
133
- const feeRateDiff = Math.abs(parsedFeeRate - expectedFeeRate);
134
- const maxAllowedDiff = 10;
135
- (0, assert_1.default)(feeRateDiff <= maxAllowedDiff, `Parsed feeRate ${parsedFeeRate} should be close to original ${expectedFeeRate} (diff: ${feeRateDiff})`);
136
- const feeSize = feeInfo.size;
137
- (0, assert_1.default)(feeSize > 10000, `Fee size ${feeSize} should include fixed cost (10000) + input costs`);
138
- (0, assert_1.default)(feeSize < 20000, `Fee size ${feeSize} should be reasonable (< 20000)`);
137
+ const calculatedSize = feeInfo.size;
138
+ const expectedInputCost = 1000 * threshold;
139
+ const fixedFee = 10000;
140
+ const expectedMinBytesCost = 200;
141
+ const impliedBytesCost = calculatedSize - expectedInputCost - fixedFee;
142
+ (0, assert_1.default)(impliedBytesCost >= expectedMinBytesCost, `Implied bytes cost ${impliedBytesCost} should be at least ${expectedMinBytesCost}`);
143
+ const expectedMinTotalSize = expectedMinBytesCost + expectedInputCost + fixedFee;
144
+ (0, assert_1.default)(calculatedSize >= expectedMinTotalSize, `Total size ${calculatedSize} should be at least ${expectedMinTotalSize} (bytes + inputCost + fixedFee)`);
139
145
  });
140
- it('should prevent artificially inflated feeRate from using wrong calculation', async () => {
141
- const inputAmount = '100000000'; // 100M nanoFLRP
146
+ it('should produce consistent fees between build and parse (initBuilder vs buildFlareTransaction)', async () => {
147
+ const inputAmount = '100000000';
148
+ const feeRate = 500;
142
149
  const threshold = 2;
143
150
  const utxo = {
144
- outputID: 0,
151
+ outputID: 7,
145
152
  amount: inputAmount,
146
- txid: '2vPMx8P63adgBae7GAWFx7qvJDwRmMnDCyKddHRBXWhysjX4BP',
153
+ txid: '2b2A4CyaRawiVAycUhpfvaxizymUT3TwRUbrzwiy3qp7DnKznj',
147
154
  outputidx: '0',
148
155
  addresses: [
149
- '0x3329be7d01cd3ebaae6654d7327dd9f17a2e1581',
150
- '0x7e918a5e8083ae4c9f2f0ed77055c24bf3665001',
151
- '0xc7324437c96c7c8a6a152da2385c1db5c3ab1f91',
156
+ '0x7e9f3d42cea7e02f62e71559362a0aab32b9328e',
157
+ 'C9207d5c93ce2533d5ef945f9f13cfd773861dc2',
158
+ 'b2e971feb61d1ab2aba434bb0beb9c959359de99',
152
159
  ],
153
160
  threshold: threshold,
154
161
  };
155
- const feeRate = 500;
156
162
  const txBuilder = factory
157
163
  .getImportInCBuilder()
158
164
  .threshold(threshold)
@@ -160,20 +166,21 @@ describe('Flrp Import In C Tx Builder', () => {
160
166
  .utxos([utxo])
161
167
  .to(importInC_1.IMPORT_IN_C.to)
162
168
  .feeRate(feeRate.toString());
163
- let tx;
164
- try {
165
- tx = await txBuilder.build();
166
- }
167
- catch (error) {
168
- throw new Error(`Transaction build failed (this was the OLD bug behavior): ${error.message}. ` +
169
- `The fix ensures calculateImportCost() is used consistently.`);
170
- }
171
- const calculatedFee = BigInt(tx.fee.fee);
172
- const oldBugFee = BigInt(328000000);
173
- const reasonableFee = BigInt(10000000);
174
- (0, assert_1.default)(calculatedFee < reasonableFee, `Fee ${calculatedFee} should be reasonable (< ${reasonableFee}), not inflated like OLD bug (~${oldBugFee})`);
175
- const outputAmount = BigInt(tx.outputs[0].value);
176
- (0, assert_1.default)(outputAmount > BigInt(0), `Output ${outputAmount} should be positive. OLD bug would make output negative due to excessive fee.`);
169
+ const originalTx = await txBuilder.build();
170
+ const originalFeeInfo = originalTx.fee;
171
+ const originalSize = originalFeeInfo.size;
172
+ const txHex = originalTx.toBroadcastFormat();
173
+ const parsedBuilder = factory.from(txHex);
174
+ const parsedTx = await parsedBuilder.build();
175
+ const parsedFeeInfo = parsedTx.fee;
176
+ const parsedFeeRate = parsedFeeInfo.feeRate;
177
+ const parsedSize = parsedFeeInfo.size;
178
+ const feeRateDiff = Math.abs(parsedFeeRate - feeRate);
179
+ const maxAllowedDiff = 50;
180
+ (0, assert_1.default)(feeRateDiff <= maxAllowedDiff, `Parsed feeRate ${parsedFeeRate} should be close to original ${feeRate} (diff: ${feeRateDiff})`);
181
+ const sizeDiff = Math.abs(parsedSize - originalSize);
182
+ const maxSizeDiff = 100;
183
+ (0, assert_1.default)(sizeDiff <= maxSizeDiff, `Parsed size ${parsedSize} should be close to original ${originalSize} (diff: ${sizeDiff})`);
177
184
  });
178
185
  });
179
186
  describe('on-chain verified transactions', () => {
@@ -390,4 +397,4 @@ describe('Flrp Import In C Tx Builder', () => {
390
397
  });
391
398
  });
392
399
  });
393
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9pbXBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsa0JBQWdCO0FBQ2hCLDBDQUE2RTtBQUM3RSxpREFBNEM7QUFDNUMseUVBQW9GO0FBQ3BGLDBFQUE4QztBQUU5QyxtRUFBK0M7QUFFL0MsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtJQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNsRSxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRWhELEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxHQUFHLEVBQUU7WUFDakQsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO2dCQUNILFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDOUIsQ0FBQyxFQUNELENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLDZCQUE2QixDQUN4RCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaURBQWlELEVBQUUsR0FBRyxFQUFFO1lBQ3pELGdCQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRTtnQkFDSCxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUEyQixDQUFDLENBQUMsQ0FBQztZQUN2RSxDQUFDLEVBQ0QsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUsscUNBQXFDLENBQ2hFLENBQUM7UUFDSixDQUFDLENBQUMsQ0FB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LHlEQUF5RDtnQkFDekQsTUFBTSxZQUFZLEdBQUcsZUFBZSxLQUFLLENBQUMsSUFBSSxlQUFlLEtBQUssQ0FBQyxDQUFDO2dCQUVwRSx3RkFBd0Y7Z0JBQ3hGLDhFQUE4RTtnQkFDOUUsTUFBTSx3QkFBd0IsR0FDNUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEYsTUFBTSx3QkFBd0IsR0FDNUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFdEYsOEZBQThGO2dCQUM5RixJQUFJLFlBQVksSUFBSSxDQUFDLENBQUMsd0JBQXdCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUM7b0JBQzdFLE1BQU0sSUFBSSxLQUFLLENBQ2IsOEVBQThFO3dCQUM1RSxvQkFBb0IsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSzt3QkFDbEQsMkNBQTJDLGNBQWMsQ0FBQyxVQUFVLENBQUMsb0NBQW9DLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUN4SSxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgRGVjb2RlZFV0eG9PYmogfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBJTVBPUlRfSU5fQyBhcyB0ZXN0RGF0YSB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy90cmFuc2FjdGlvbkRhdGEvaW1wb3J0SW5DJztcbmltcG9ydCBzaWduRmxvd1Rlc3QgZnJvbSAnLi9zaWduRmxvd1Rlc3RTdWl0JztcbmltcG9ydCB7IFVuc2lnbmVkVHggfSBmcm9tICdAZmxhcmVuZXR3b3JrL2ZsYXJlanMnO1xuaW1wb3J0IHRlc3RVdGlscyBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3V0aWxzJztcblxuZGVzY3JpYmUoJ0ZscnAgSW1wb3J0IEluIEMgVHggQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSk7XG4gIGRlc2NyaWJlKCd2YWxpZGF0ZSB0eEJ1aWxkZXIgZmllbGRzJywgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0SW1wb3J0SW5DQnVpbGRlcigpO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHZhbGlkYXRlIFV0eG9zIGVtcHR5IHN0cmluZycsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudmFsaWRhdGVVdHhvcyhbXSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ1VUWE9zIGFycmF5IGNhbm5vdCBiZSBlbXB0eSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdmFsaWRhdGUgVXR4b3Mgd2l0aG91dCBhbW91bnQgZmllbGQnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlVXR4b3MoW3sgb3V0cHV0SUQ6ICcnIH0gYXMgYW55IGFzIERlY29kZWRVdHhvT2JqXSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ1VUWE8gbWlzc2luZyByZXF1aXJlZCBmaWVsZDogYW1vdW50J1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgc2lnbkZsb3dUZXN0KHtcbiAgICB0cmFuc2FjdGlvblR5cGU6ICdJbXBvcnQgQzJQJyxcbiAgICBuZXdUeEZhY3Rvcnk6ICgpID0+IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSksXG4gICAgbmV3VHhCdWlsZGVyOiAoKSA9PlxuICAgICAgbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKVxuICAgICAgICAuZ2V0SW1wb3J0SW5DQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAudXR4b3ModGVzdERhdGEub3V0cHV0cylcbiAgICAgICAgLnRvKHRlc3REYXRhLnRvKVxuICAgICAgICAuZmVlUmF0ZSh0ZXN0RGF0YS5mZWUpLFxuICAgIHVuc2lnbmVkVHhIZXg6IHRlc3REYXRhLnVuc2lnbmVkSGV4LFxuICAgIGhhbGZTaWduZWRUeEhleDogdGVzdERhdGEuaGFsZlNpZ250eEhleCxcbiAgICBmdWxsU2lnbmVkVHhIZXg6IHRlc3REYXRhLmZ1bGxTaWdudHhIZXgsXG4gICAgcHJpdmF0ZUtleToge1xuICAgICAgcHJ2MTogdGVzdERhdGEucHJpdmF0ZUtleXNbMF0sXG4gICAgICBwcnYyOiB0ZXN0RGF0YS5wcml2YXRlS2V5c1sxXSxcbiAgICB9LFxuICAgIHR4SGFzaDogdGVzdERhdGEudHhoYXNoLFxuICB9KTtcblxuICBkZXNjcmliZSgnZHluYW1pYyBmZWUgY2FsY3VsYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgcHJvcGVyIGZlZSB1c2luZyBmZWVSYXRlIG11bHRpcGxpZXIgKEFWQVhQIGFwcHJvYWNoKSB0byBhdm9pZCBcImluc3VmZmljaWVudCB1bmxvY2tlZCBmdW5kc1wiIGVycm9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYW1vdW50ID0gJzEwMDAwMDAwMCc7IC8vIDEwME0gbmFub0ZMUlAgKDAuMSBGTFIpXG4gICAgICBjb25zdCBmZWVSYXRlID0gJzEnOyAvLyAxIG5hbm9GTFJQIHBlciBjb3N0IHVuaXQgKG1hdGNoaW5nIEFWQVhQJ3MgZmVlUmF0ZSB1c2FnZSlcblxuICAgICAgY29uc3QgdXR4bzogRGVjb2RlZFV0eG9PYmogPSB7XG4gICAgICAgIG91dHB1dElEOiAwLFxuICAgICAgICBhbW91bnQ6IGFtb3VudCxcbiAgICAgICAgdHhpZDogJzJ2UE14OFA2M2FkZ0JhZTdHQVdGeDdxdkpEd1JtTW5EQ3lLZGRIUkJYV2h5c2pYNEJQJyxcbiAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgIGFkZHJlc3NlczogW1xuICAgICAgICAgICcweDMzMjliZTdkMDFjZDNlYmFhZTY2NTRkNzMyN2RkOWYxN2EyZTE1ODEnLFxuICAgICAgICAgICcweDdlOTE4YTVlODA4M2FlNGM5ZjJmMGVkNzcwNTVjMjRiZjM2NjUwMDEnLFxuICAgICAgICAgICcweGM3MzI0NDM3Yzk2YzdjOGE2YTE1MmRhMjM4NWMxZGI1YzNhYjFmOTEnLFxuICAgICAgICBdLFxuICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRJbXBvcnRJbkNCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCgyKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAudXR4b3MoW3V0eG9dKVxuICAgICAgICAudG8odGVzdERhdGEudG8pXG4gICAgICAgIC5mZWVSYXRlKGZlZVJhdGUpIGFzIGFueTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgY29uc3QgY2FsY3VsYXRlZEZlZSA9IEJpZ0ludCgodHggYXMgYW55KS5mZWUuZmVlKTtcbiAgICAgIGNvbnN0IGZlZVJhdGVCaWdJbnQgPSBCaWdJbnQoZmVlUmF0ZSk7XG5cbiAgICAgIC8vIFRoZSBmZWUgc2hvdWxkIGJlIGFwcHJveGltYXRlbHk6IGZlZVJhdGUgw5cgKHR4U2l6ZSArIGlucHV0Q29zdCArIGZpeGVkRmVlKVxuICAgICAgLy8gRm9yIDEgaW5wdXQsIHRocmVzaG9sZD0yLCB+MjI4IGJ5dGVzOiAxIMOXICgyMjggKyAyMDAwICsgMTAwMDApID0gMTIsMjI4XG4gICAgICBjb25zdCBleHBlY3RlZE1pbkNvc3QgPSAxMjAwMDsgLy8gTWluaW11bSBjb3N0IHVuaXRzIChjb25zZXJ2YXRpdmUgZXN0aW1hdGUpXG4gICAgICBjb25zdCBleHBlY3RlZE1heENvc3QgPSAxMzAwMDsgLy8gTWF4aW11bSBjb3N0IHVuaXRzICh3aXRoIHNvbWUgYnVmZmVyKVxuXG4gICAgICBjb25zdCBleHBlY3RlZE1pbkZlZSA9IGZlZVJhdGVCaWdJbnQgKiBCaWdJbnQoZXhwZWN0ZWRNaW5Db3N0KTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkTWF4RmVlID0gZmVlUmF0ZUJpZ0ludCAqIEJpZ0ludChleHBlY3RlZE1heENvc3QpO1xuXG4gICAgICAvLyBWZXJpZnkgZmVlIGlzIGluIHRoZSBleHBlY3RlZCByYW5nZVxuICAgICAgYXNzZXJ0KFxuICAgICAgICBjYWxjdWxhdGVkRmVlID49IGV4cGVjdGVkTWluRmVlLFxuICAgICAgICBgRmVlICR7Y2FsY3VsYXRlZEZlZX0gc2hvdWxkIGJlIGF0IGxlYXN0ICR7ZXhwZWN0ZWRNaW5GZWV9IChmZWVSYXRlIMOXIG1pbkNvc3QpYFxuICAgICAgKTtcbiAgICAgIGFzc2VydChcbiAgICAgICAgY2FsY3VsYXRlZEZlZSA8PSBleHBlY3RlZE1heEZlZSxcbiAgICAgICAgYEZlZSAke2NhbGN1bGF0ZWRGZWV9IHNob3VsZCBub3QgZXhjZWVkICR7ZXhwZWN0ZWRNYXhGZWV9IChmZWVSYXRlIMOXIG1heENvc3QpYFxuICAgICAgKTtcblxuICAgICAgLy8gVmVyaWZ5IHRoZSBvdXRwdXQgYW1vdW50IGlzIHBvc2l0aXZlIChubyBcImluc3VmZmljaWVudCBmdW5kc1wiIGVycm9yKVxuICAgICAgY29uc3Qgb3V0cHV0cyA9IHR4Lm91dHB1dHM7XG4gICAgICBvdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBjb25zdCBvdXRwdXRBbW91bnQgPSBCaWdJbnQob3V0cHV0c1swXS52YWx1ZSk7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIG91dHB1dEFtb3VudCA+IEJpZ0ludCgwKSxcbiAgICAgICAgJ091dHB1dCBhbW91bnQgc2hvdWxkIGJlIHBvc2l0aXZlIC0gdHJhbnNhY3Rpb24gc2hvdWxkIG5vdCBmYWlsIHdpdGggaW5zdWZmaWNpZW50IGZ1bmRzJ1xuICAgICAgKTtcblxuICAgICAgLy8gVmVyaWZ5IHRoZSBtYXRoOiBpbnB1dCAtIG91dHB1dCA9IGZlZVxuICAgICAgY29uc3QgaW5wdXRBbW91bnQgPSBCaWdJbnQoYW1vdW50KTtcbiAgICAgIGNvbnN0IGNhbGN1bGF0ZWRPdXRwdXQgPSBpbnB1dEFtb3VudCAtIGNhbGN1bGF0ZWRGZWU7XG4gICAgICBhc3NlcnQob3V0cHV0QW1vdW50ID09PSBjYWxjdWxhdGVkT3V0cHV0LCAnT3V0cHV0IHNob3VsZCBlcXVhbCBpbnB1dCBtaW51cyB0b3RhbCBmZWUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXNlIGNvbnNpc3RlbnQgZmVlIGNhbGN1bGF0aW9uIGluIGluaXRCdWlsZGVyIGFuZCBidWlsZEZsYXJlVHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dEFtb3VudCA9ICcxMDAwMDAwMDAnOyAvLyAxMDBNIG5hbm9GTFJQIChtYXRjaGVzIHJlYWwtd29ybGQgdHJhbnNhY3Rpb24pXG4gICAgICBjb25zdCBleHBlY3RlZEZlZVJhdGUgPSA1MDA7IC8vIFJlYWwgZmVlUmF0ZSBmcm9tIHdvcmtpbmcgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDI7XG5cbiAgICAgIGNvbnN0IHV0eG86IERlY29kZWRVdHhvT2JqID0ge1xuICAgICAgICBvdXRwdXRJRDogMCxcbiAgICAgICAgYW1vdW50OiBpbnB1dEFtb3VudCxcbiAgICAgICAgdHhpZDogJzJ2UE14OFA2M2FkZ0JhZTdHQVdGeDdxdkpEd1JtTW5EQ3lLZGRIUkJYV2h5c2pYNEJQJyxcbiAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgIGFkZHJlc3NlczogW1xuICAgICAgICAgICcweDMzMjliZTdkMDFjZDNlYmFhZTY2NTRkNzMyN2RkOWYxN2EyZTE1ODEnLFxuICAgICAgICAgICcweDdlOTE4YTVlODA4M2FlNGM5ZjJmMGVkNzcwNTVjMjRiZjM2NjUwMDEnLFxuICAgICAgICAgICcweGM3MzI0NDM3Yzk2YzdjOGE2YTE1MmRhMjM4NWMxZGI1YzNhYjFmOTEnLFxuICAgICAgICBdLFxuICAgICAgICB0aHJlc2hvbGQ6IHRocmVzaG9sZCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldEltcG9ydEluQ0J1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRocmVzaG9sZClcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEucEFkZHJlc3NlcylcbiAgICAgICAgLnV0eG9zKFt1dHhvXSlcbiAgICAgICAgLnRvKHRlc3REYXRhLnRvKVxuICAgICAgICAuZmVlUmF0ZShleHBlY3RlZEZlZVJhdGUudG9TdHJpbmcoKSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkRmVlID0gQmlnSW50KCh0eCBhcyBhbnkpLmZlZS5mZWUpO1xuICAgICAgY29uc3QgZmVlSW5mbyA9ICh0eCBhcyBhbnkpLmZlZTtcblxuICAgICAgY29uc3QgbWF4UmVhc29uYWJsZUZlZSA9IEJpZ0ludChpbnB1dEFtb3VudCkgLyBCaWdJbnQoMTApOyAvLyBNYXggMTAlIG9mIGlucHV0XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGNhbGN1bGF0ZWRGZWUgPCBtYXhSZWFzb25hYmxlRmVlLFxuICAgICAgICBgRmVlICR7Y2FsY3VsYXRlZEZlZX0gc2hvdWxkIGJlIGxlc3MgdGhhbiAxMCUgb2YgaW5wdXQgKCR7bWF4UmVhc29uYWJsZUZlZX0pYFxuICAgICAgKTtcblxuICAgICAgY29uc3QgZXhwZWN0ZWRNaW5GZWUgPSBCaWdJbnQoZXhwZWN0ZWRGZWVSYXRlKSAqIEJpZ0ludCgxMjAwMCk7XG4gICAgICBjb25zdCBleHBlY3RlZE1heEZlZSA9IEJpZ0ludChleHBlY3RlZEZlZVJhdGUpICogQmlnSW50KDEzMDAwKTtcblxuICAgICAgYXNzZXJ0KGNhbGN1bGF0ZWRGZWUgPj0gZXhwZWN0ZWRNaW5GZWUsIGBGZWUgJHtjYWxjdWxhdGVkRmVlfSBzaG91bGQgYmUgYXQgbGVhc3QgJHtleHBlY3RlZE1pbkZlZX1gKTtcbiAgICAgIGFzc2VydChjYWxjdWxhdGVkRmVlIDw9IGV4cGVjdGVkTWF4RmVlLCBgRmVlICR7Y2FsY3VsYXRlZEZlZX0gc2hvdWxkIG5vdCBleGNlZWQgJHtleHBlY3RlZE1heEZlZX1gKTtcblxuICAgICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gQmlnSW50KHR4Lm91dHB1dHNbMF0udmFsdWUpO1xuICAgICAgYXNzZXJ0KG91dHB1dEFtb3VudCA+IEJpZ0ludCgwKSwgJ091dHB1dCBzaG91bGQgYmUgcG9zaXRpdmUnKTtcblxuICAgICAgY29uc3QgZXhwZWN0ZWRPdXRwdXQgPSBCaWdJbnQoaW5wdXRBbW91bnQpIC0gY2FsY3VsYXRlZEZlZTtcbiAgICAgIGFzc2VydChcbiAgICAgICAgb3V0cHV0QW1vdW50ID09PSBleHBlY3RlZE91dHB1dCxcbiAgICAgICAgYE91dHB1dCAke291dHB1dEFtb3VudH0gc2hvdWxkIGVxdWFsIGlucHV0ICR7aW5wdXRBbW91bnR9IG1pbnVzIGZlZSAke2NhbGN1bGF0ZWRGZWV9YFxuICAgICAgKTtcblxuICAgICAgY29uc3QgdHhIZXggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgcGFyc2VkQnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0eEhleCk7XG4gICAgICBjb25zdCBwYXJzZWRUeCA9IGF3YWl0IHBhcnNlZEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHBhcnNlZEZlZVJhdGUgPSAocGFyc2VkVHggYXMgYW55KS5mZWUuZmVlUmF0ZTtcblxuICAgICAgYXNzZXJ0KHBhcnNlZEZlZVJhdGUgIT09IHVuZGVmaW5lZCAmJiBwYXJzZWRGZWVSYXRlID4gMCwgJ1BhcnNlZCBmZWVSYXRlIHNob3VsZCBiZSBkZWZpbmVkIGFuZCBwb3NpdGl2ZScpO1xuXG4gICAgICBjb25zdCBmZWVSYXRlRGlmZiA9IE1hdGguYWJzKHBhcnNlZEZlZVJhdGUhIC0gZXhwZWN0ZWRGZWVSYXRlKTtcbiAgICAgIGNvbnN0IG1heEFsbG93ZWREaWZmID0gMTA7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGZlZVJhdGVEaWZmIDw9IG1heEFsbG93ZWREaWZmLFxuICAgICAgICBgUGFyc2VkIGZlZVJhdGUgJHtwYXJzZWRGZWVSYXRlfSBzaG91bGQgYmUgY2xvc2UgdG8gb3JpZ2luYWwgJHtleHBlY3RlZEZlZVJhdGV9IChkaWZmOiAke2ZlZVJhdGVEaWZmfSlgXG4gICAgICApO1xuXG4gICAgICBjb25zdCBmZWVTaXplID0gZmVlSW5mby5zaXplITtcbiAgICAgIGFzc2VydChmZWVTaXplID4gMTAwMDAsIGBGZWUgc2l6ZSAke2ZlZVNpemV9IHNob3VsZCBpbmNsdWRlIGZpeGVkIGNvc3QgKDEwMDAwKSArIGlucHV0IGNvc3RzYCk7XG4gICAgICBhc3NlcnQoZmVlU2l6ZSA8IDIwMDAwLCBgRmVlIHNpemUgJHtmZWVTaXplfSBzaG91bGQgYmUgcmVhc29uYWJsZSAoPCAyMDAwMClgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJldmVudCBhcnRpZmljaWFsbHkgaW5mbGF0ZWQgZmVlUmF0ZSBmcm9tIHVzaW5nIHdyb25nIGNhbGN1bGF0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXRBbW91bnQgPSAnMTAwMDAwMDAwJzsgLy8gMTAwTSBuYW5vRkxSUFxuICAgICAgY29uc3QgdGhyZXNob2xkID0gMjtcblxuICAgICAgY29uc3QgdXR4bzogRGVjb2RlZFV0eG9PYmogPSB7XG4gICAgICAgIG91dHB1dElEOiAwLFxuICAgICAgICBhbW91bnQ6IGlucHV0QW1vdW50LFxuICAgICAgICB0eGlkOiAnMnZQTXg4UDYzYWRnQmFlN0dBV0Z4N3F2SkR3Um1NbkRDeUtkZEhSQlhXaHlzalg0QlAnLFxuICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgYWRkcmVzc2VzOiBbXG4gICAgICAgICAgJzB4MzMyOWJlN2QwMWNkM2ViYWFlNjY1NGQ3MzI3ZGQ5ZjE3YTJlMTU4MScsXG4gICAgICAgICAgJzB4N2U5MThhNWU4MDgzYWU0YzlmMmYwZWQ3NzA1NWMyNGJmMzY2NTAwMScsXG4gICAgICAgICAgJzB4YzczMjQ0MzdjOTZjN2M4YTZhMTUyZGEyMzg1YzFkYjVjM2FiMWY5MScsXG4gICAgICAgIF0sXG4gICAgICAgIHRocmVzaG9sZDogdGhyZXNob2xkLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgZmVlUmF0ZSA9IDUwMDtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0SW1wb3J0SW5DQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGhyZXNob2xkKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAudXR4b3MoW3V0eG9dKVxuICAgICAgICAudG8odGVzdERhdGEudG8pXG4gICAgICAgIC5mZWVSYXRlKGZlZVJhdGUudG9TdHJpbmcoKSk7XG5cbiAgICAgIGxldCB0eDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVHJhbnNhY3Rpb24gYnVpbGQgZmFpbGVkICh0aGlzIHdhcyB0aGUgT0xEIGJ1ZyBiZWhhdmlvcik6ICR7ZXJyb3IubWVzc2FnZX0uIGAgK1xuICAgICAgICAgICAgYFRoZSBmaXggZW5zdXJlcyBjYWxjdWxhdGVJbXBvcnRDb3N0KCkgaXMgdXNlZCBjb25zaXN0ZW50bHkuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYWxjdWxhdGVkRmVlID0gQmlnSW50KCh0eCBhcyBhbnkpLmZlZS5mZWUpO1xuXG4gICAgICBjb25zdCBvbGRCdWdGZWUgPSBCaWdJbnQoMzI4MDAwMDAwKTtcbiAgICAgIGNvbnN0IHJlYXNvbmFibGVGZWUgPSBCaWdJbnQoMTAwMDAwMDApO1xuXG4gICAgICBhc3NlcnQoXG4gICAgICAgIGNhbGN1bGF0ZWRGZWUgPCByZWFzb25hYmxlRmVlLFxuICAgICAgICBgRmVlICR7Y2FsY3VsYXRlZEZlZX0gc2hvdWxkIGJlIHJlYXNvbmFibGUgKDwgJHtyZWFzb25hYmxlRmVlfSksIG5vdCBpbmZsYXRlZCBsaWtlIE9MRCBidWcgKH4ke29sZEJ1Z0ZlZX0pYFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gQmlnSW50KHR4Lm91dHB1dHNbMF0udmFsdWUpO1xuICAgICAgYXNzZXJ0KFxuICAgICAgICBvdXRwdXRBbW91bnQgPiBCaWdJbnQoMCksXG4gICAgICAgIGBPdXRwdXQgJHtvdXRwdXRBbW91bnR9IHNob3VsZCBiZSBwb3NpdGl2ZS4gT0xEIGJ1ZyB3b3VsZCBtYWtlIG91dHB1dCBuZWdhdGl2ZSBkdWUgdG8gZXhjZXNzaXZlIGZlZS5gXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnb24tY2hhaW4gdmVyaWZpZWQgdHJhbnNhY3Rpb25zJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmVyaWZ5IG9uLWNoYWluIHR4IGlkIGZvciBzaWduZWQgQy1jaGFpbiBpbXBvcnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzaWduZWRJbXBvcnRIZXggPVxuICAgICAgICAnMHgwMDAwMDAwMDAwMDAwMDAwMDA3Mjc4ZGI1YzMwYmVkMDRjMDVjZTIwOTE3OTgxMjg1MGJiYjNmZTZkNDZkN2VlZjM3NDRkODE0YzBkYTU1NTI0NzkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE2MmVmMGM4Y2VkNTY2OGQxMjMwYzgyZTI3NGY1YzE5MzU3ZGY4YzAwNTc0MzM2NzQyMWU4YTJiNDhjNzM5ODlhMDAwMDAwMDE1ODczNGY5NGFmODcxYzNkMTMxYjU2MTMxYjZmYjdhMDI5MWVhY2FkZDI2MWU2OWRmYjQyYTljZGY2ZjdmZGRkMDAwMDAwMDUwMDAwMDAwMDAyZmFmMDgwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDExN2RiZDExYjlkZDFjOWJlMzM3MzUzZGI3YzE0ZjlmYjM2NjJlNWI1MDAwMDAwMDAwMmFlYTU0MDU4NzM0Zjk0YWY4NzFjM2QxMzFiNTYxMzFiNmZiN2EwMjkxZWFjYWRkMjYxZTY5ZGZiNDJhOWNkZjZmN2ZkZGQwMDAwMDAwMTAwMDAwMDA5MDAwMDAwMDJhYjMyYzE1Yzc1Yzc2M2IyNGFkZjI2ZWVlODVhYTdkNmE3NmIzNjZlNmI4OGUzNGI5NGY3NmJhZWM5MWJhZTczMzZhMzJlZDYzN2ZjMjMyY2NjYjJmNzcyZDMwOTJlZWU2NjU5NDA3MGEyYmU5Mjc1MTE0OGZlZmZjNzYwMDViMTAxM2VlNzhmYjExZjNmOWZmZDkwZDk3MGNkNWM5NWU5ZGVlNjExYmI0ZmVhZmFhMGIwMjIwY2M2NDFlZjA1NGM5ZjU3MDFmZGU0ZmFkMmZlN2YyNTk0ZGI5ZGFmZDg1OGM2MmY5Y2Y2ZmU2YjU4MzM0ZDczZGE0MGE1YTg0MTJkNDYwMCc7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLmZyb20oc2lnbmVkSW1wb3J0SGV4KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwoc2lnbmVkSW1wb3J0SGV4KTtcbiAgICAgIHR4LmlkLnNob3VsZC5lcXVhbCgnMmtzOXZXMVNWV0Q0S3NOUEhnWG5WNWRwSmFDY2F4Vk5iUVc0SDd0OUJNRHhBcEd2ZmEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgRkFJTCB3aXRoIHVuc29ydGVkIFVUWE8gYWRkcmVzc2VzIC0gZGVtb25zdHJhdGVzIEFkZHJlc3NNYXAgbWlzbWF0Y2ggaXNzdWUgZm9yIGltcG9ydCBpbiBDLWNoYWluIHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gVGhpcyB0ZXN0IHVzZXMgVVRYTyBhZGRyZXNzZXMgaW4gVU5TT1JURUQgb3JkZXIgdG8gZGVtb25zdHJhdGUgdGhlIGlzc3VlLlxuICAgICAgLy8gV2l0aCB1bnNvcnRlZCBhZGRyZXNzZXMsIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdpbGwgY3JlYXRlIEFkZHJlc3NNYXBzIGluY29ycmVjdGx5XG4gICAgICAvLyBiZWNhdXNlIGl0IHVzZXMgc2VxdWVudGlhbCBpbmRpY2VzLCBub3QgVVRYTyBhZGRyZXNzIG9yZGVyLlxuICAgICAgLy9cbiAgICAgIC8vIEV4cGVjdGVkOiBBZGRyZXNzTWFwIHNob3VsZCBtYXAgYWRkcmVzc2VzIHRvIHNpZ25hdHVyZSBzbG90cyBiYXNlZCBvbiBVVFhPIG9yZGVyIChhZGRyZXNzZXNJbmRleClcbiAgICAgIC8vIEN1cnJlbnQgKFdST05HKTogQWRkcmVzc01hcCB1c2VzIHNlcXVlbnRpYWwgaW5kaWNlcyAoMCwgMSwgMi4uLilcbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIHRlc3QgV0lMTCBGQUlMIHdpdGggY3VycmVudCBpbXBsZW1lbnRhdGlvbiBiZWNhdXNlIEFkZHJlc3NNYXBzIGRvbid0IG1hdGNoIGNyZWRlbnRpYWwgb3JkZXJcblxuICAgICAgLy8gVVRYTyBhZGRyZXNzZXMgaW4gVU5TT1JURUQgb3JkZXIgKGRpZmZlcmVudCBmcm9tIHNvcnRlZClcbiAgICAgIC8vIFNvcnRlZCB3b3VsZCBiZTogWzB4MzMyOS4uLiAoc21hbGxlc3QpLCAweDdlOTEuLi4gKG1pZGRsZSksIDB4YzczMi4uLiAobGFyZ2VzdCldXG4gICAgICAvLyBVbnNvcnRlZDogWzB4YzczMi4uLiAobGFyZ2VzdCksIDB4MzMyOS4uLiAoc21hbGxlc3QpLCAweDdlOTEuLi4gKG1pZGRsZSldXG4gICAgICBjb25zdCB1bnNvcnRlZFV0eG9BZGRyZXNzZXMgPSBbXG4gICAgICAgICcweGM3MzI0NDM3Yzk2YzdjOGE2YTE1MmRhMjM4NWMxZGI1YzNhYjFmOTEnLCAvLyBMYXJnZXN0ICh3b3VsZCBiZSBpbmRleCAyIGlmIHNvcnRlZClcbiAgICAgICAgJzB4MzMyOWJlN2QwMWNkM2ViYWFlNjY1NGQ3MzI3ZGQ5ZjE3YTJlMTU4MScsIC8vIFNtYWxsZXN0ICh3b3VsZCBiZSBpbmRleCAwIGlmIHNvcnRlZClcbiAgICAgICAgJzB4N2U5MThhNWU4MDgzYWU0YzlmMmYwZWQ3NzA1NWMyNGJmMzY2NTAwMScsIC8vIE1pZGRsZSAod291bGQgYmUgaW5kZXggMSBpZiBzb3J0ZWQpXG4gICAgICBdO1xuXG4gICAgICAvLyBDb3JyZXNwb25kaW5nIFAtY2hhaW4gYWRkcmVzc2VzIChpbiBzYW1lIG9yZGVyIGFzIF9mcm9tQWRkcmVzc2VzKVxuICAgICAgY29uc3QgcEFkZHJlc3NlcyA9IFtcbiAgICAgICAgJ1AtY29zdHdvMXh2NW11bGdwZTVsdDR0bngybnRueWx3ZTc5YXp1OXZwamE2bHV0JywgLy8gTWFwcyB0byAweGM3MzIuLi4gKFVUWE8gaW5kZXggMCBpbiB1bnNvcnRlZClcbiAgICAgICAgJ1AtY29zdHdvMTA2Z2M1aDVxc3doeWU4ZTBwbXRocTR3emYwZWt2NXFwcHNydnB1JywgLy8gTWFwcyB0byAweDMzMjkuLi4gKFVUWE8gaW5kZXggMSBpbiB1bnNvcnRlZClcbiAgICAgICAgJ1AtY29zdHdvMWN1ZXlnZDdmZDM3ZzU2czQ5azNyc2hxYWtocDZrOHUzYWR6dDZtJywgLy8gTWFwcyB0byAweDdlOTEuLi4gKFVUWE8gaW5kZXggMiBpbiB1bnNvcnRlZClcbiAgICAgIF07XG5cbiAgICAgIC8vIENyZWF0ZSBVVFhPIHdpdGggVU5TT1JURUQgYWRkcmVzc2VzXG4gICAgICBjb25zdCBhbW91bnQgPSAnNTAwMDAwMDAwJzsgLy8gMC41IEZMUlxuICAgICAgY29uc3QgZmVlID0gJzUwMDAwMDAnOyAvLyBFeGFtcGxlIGZlZVxuICAgICAgY29uc3QgdXR4b0Ftb3VudCA9IChCaWdJbnQoYW1vdW50KSArIEJpZ0ludChmZWUpICsgQmlnSW50KCcxMDAwMDAwMCcpKS50b1N0cmluZygpOyAvLyBhbW91bnQgKyBmZWUgKyBzb21lIGJ1ZmZlclxuXG4gICAgICBjb25zdCB1dHhvOiBEZWNvZGVkVXR4b09iaiA9IHtcbiAgICAgICAgb3V0cHV0SUQ6IDAsXG4gICAgICAgIGFtb3VudDogdXR4b0Ftb3VudCxcbiAgICAgICAgdHhpZDogJzJ2UE14OFA2M2FkZ0JhZTdHQVdGeDdxdkpEd1JtTW5EQ3lLZGRIUkJYV2h5c2pYNEJQJyxcbiAgICAgICAgb3V0cHV0aWR4OiAnMScsXG4gICAgICAgIGFkZHJlc3NlczogdW5zb3J0ZWRVdHhvQWRkcmVzc2VzLCAvLyBVTlNPUlRFRCBvcmRlclxuICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICB9O1xuXG4gICAgICAvLyBCdWlsZCB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0SW1wb3J0SW5DQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQoMilcbiAgICAgICAgLmZyb21QdWJLZXkocEFkZHJlc3NlcylcbiAgICAgICAgLnV0eG9zKFt1dHhvXSlcbiAgICAgICAgLnRvKHRlc3REYXRhLnRvKVxuICAgICAgICAuZmVlUmF0ZSh0ZXN0RGF0YS5mZWUpO1xuXG4gICAgICAvLyBCdWlsZCB1bnNpZ25lZCB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgdW5zaWduZWRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdW5zaWduZWRIZXggPSB1bnNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIC8vIEdldCBBZGRyZXNzTWFwcyBmcm9tIHRoZSBPUklHSU5BTCB0cmFuc2FjdGlvbiAoYmVmb3JlIHBhcnNpbmcpXG4gICAgICAvLyBUaGUgcGFyc2VkIHRyYW5zYWN0aW9uJ3MgQWRkcmVzc01hcCBvbmx5IGNvbnRhaW5zIHRoZSBvdXRwdXQgYWRkcmVzcywgbm90IF9mcm9tQWRkcmVzc2VzXG4gICAgICBjb25zdCBvcmlnaW5hbEZsYXJlVHggPSAodW5zaWduZWRUeCBhcyBhbnkpLl9mbGFyZVRyYW5zYWN0aW9uO1xuICAgICAgY29uc3Qgb3JpZ2luYWxBZGRyZXNzTWFwcyA9IChvcmlnaW5hbEZsYXJlVHggYXMgYW55IGFzIFVuc2lnbmVkVHgpLmFkZHJlc3NNYXBzO1xuXG4gICAgICAvLyBQYXJzZSBpdCBiYWNrIHRvIGluc3BlY3QgQWRkcmVzc01hcHMgYW5kIGNyZWRlbnRpYWxzXG4gICAgICBjb25zdCBwYXJzZWRCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHVuc2lnbmVkSGV4KTtcbiAgICAgIGNvbnN0IHBhcnNlZFR4ID0gYXdhaXQgcGFyc2VkQnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZmxhcmVUeCA9IChwYXJzZWRUeCBhcyBhbnkpLl9mbGFyZVRyYW5zYWN0aW9uO1xuXG4gICAgICAvLyBHZXQgdGhlIGlucHV0IHRvIGNoZWNrIHNpZ0luZGljaWVzIChmb3IgQy1jaGFpbiBpbXBvcnRzLCBpbnB1dHMgYXJlIGltcG9ydGVkSW5wdXRzKVxuICAgICAgY29uc3QgaW1wb3J0VHggPSBmbGFyZVR4LnR4IGFzIGFueTtcbiAgICAgIGNvbnN0IGlucHV0ID0gaW1wb3J0VHguaW1wb3J0ZWRJbnB1dHNbMF07XG4gICAgICBjb25zdCBzaWdJbmRpY2llcyA9IGlucHV0LnNpZ0luZGljaWVzKCk7XG5cbiAgICAgIC8vIHNpZ0luZGljaWVzIHRlbGxzIHVzOiBzaWdJbmRpY2llc1tzbG90SW5kZXhdID0gdXR4b0FkZHJlc3NJbmRleFxuICAgICAgLy8gRm9yIHRocmVzaG9sZD0yLCB3ZSBuZWVkIHNpZ25hdHVyZXMgZm9yIGZpcnN0IDIgYWRkcmVzc2VzIGluIFVUWE8gb3JkZXJcbiAgICAgIC8vIFVUWE8gb3JkZXI6IFsweGM3MzIuLi4gKGluZGV4IDApLCAweDMzMjkuLi4gKGluZGV4IDEpLCAweDdlOTEuLi4gKGluZGV4IDIpXVxuICAgICAgLy8gU28gc2lnSW5kaWNpZXMgc2hvdWxkIGJlIFswLCAxXSBtZWFuaW5nOiBzbG90IDAgPSBVVFhPIGluZGV4IDAsIHNsb3QgMSA9IFVUWE8gaW5kZXggMVxuXG4gICAgICAvLyBWZXJpZnkgc2lnSW5kaWNpZXMgYXJlIFswLCAxXSAoZmlyc3QgMiBhZGRyZXNzZXMgaW4gVVRYTyBvcmRlciwgTk9UIHNvcnRlZCBvcmRlcilcbiAgICAgIHNpZ0luZGljaWVzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICBzaWdJbmRpY2llc1swXS5zaG91bGQuZXF1YWwoMCwgJ0ZpcnN0IHNpZ25hdHVyZSBzbG90IHNob3VsZCBiZSBVVFhPIGFkZHJlc3MgaW5kZXggMCAoMHhjNzMyLi4uKScpO1xuICAgICAgc2lnSW5kaWNpZXNbMV0uc2hvdWxkLmVxdWFsKDEsICdTZWNvbmQgc2lnbmF0dXJlIHNsb3Qgc2hvdWxkIGJlIFVUWE8gYWRkcmVzcyBpbmRleCAxICgweDMzMjkuLi4pJyk7XG5cbiAgICAgIC8vIFRoZSBjcml0aWNhbCB0ZXN0OiBWZXJpZnkgdGhhdCBzaWduYXR1cmUgc2xvdHMgaGF2ZSBlbWJlZGRlZCBhZGRyZXNzZXMgYmFzZWQgb24gVVRYTyBvcmRlclxuICAgICAgLy8gV2l0aCB1bnNvcnRlZCBVVFhPIGFkZHJlc3NlcywgdGhpcyB3aWxsIEZBSUwgaWYgQWRkcmVzc01hcHMgZG9uJ3QgbWF0Y2ggVVRYTyBvcmRlclxuICAgICAgLy9cbiAgICAgIC8vIFBhcnNlIHRoZSBjcmVkZW50aWFsIHRvIHNlZSB3aGljaCBzbG90cyBoYXZlIHdoaWNoIGVtYmVkZGVkIGFkZHJlc3Nlc1xuICAgICAgY29uc3QgY3JlZGVudGlhbCA9IGZsYXJlVHguY3JlZGVudGlhbHNbMF07XG4gICAgICBjb25zdCBzaWduYXR1cmVzID0gY3JlZGVudGlhbC5nZXRTaWduYXR1cmVzKCk7XG5cbiAgICAgIC8vIEV4dHJhY3QgZW1iZWRkZWQgYWRkcmVzc2VzIGZyb20gc2lnbmF0dXJlIHNsb3RzXG4gICAgICBjb25zdCBlbWJlZGRlZEFkZHJlc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGlzRW1wdHlTaWduYXR1cmUgPSAoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAgICAgcmV0dXJuICEhc2lnbmF0dXJlICYmIHRlc3RVdGlscy5yZW1vdmVIZXhQcmVmaXgoc2lnbmF0dXJlKS5zdGFydHNXaXRoKCcwJy5yZXBlYXQoOTApKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGhhc0VtYmVkZGVkQWRkcmVzcyA9IChzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBpZiAoIWlzRW1wdHlTaWduYXR1cmUoc2lnbmF0dXJlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBjbGVhblNpZyA9IHRlc3RVdGlscy5yZW1vdmVIZXhQcmVmaXgoc2lnbmF0dXJlKTtcbiAgICAgICAgaWYgKGNsZWFuU2lnLmxlbmd0aCA8IDEzMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlbWJlZGRlZFBhcnQgPSBjbGVhblNpZy5zdWJzdHJpbmcoOTAsIDEzMCk7XG4gICAgICAgIC8vIENoZWNrIGlmIGVtYmVkZGVkIHBhcnQgaXMgbm90IGFsbCB6ZXJvc1xuICAgICAgICByZXR1cm4gZW1iZWRkZWRQYXJ0ICE9PSAnMCcucmVwZWF0KDQwKTtcbiAgICAgIH07XG5cbiAgICAgIHNpZ25hdHVyZXMuZm9yRWFjaCgoc2lnOiBzdHJpbmcsIHNsb3RJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmIChoYXNFbWJlZGRlZEFkZHJlc3Moc2lnKSkge1xuICAgICAgICAgIC8vIEV4dHJhY3QgZW1iZWRkZWQgYWRkcmVzcyAoYWZ0ZXIgcG9zaXRpb24gOTAsIDQwIGNoYXJzID0gMjAgYnl0ZXMpXG4gICAgICAgICAgY29uc3QgY2xlYW5TaWcgPSB0ZXN0VXRpbHMucmVtb3ZlSGV4UHJlZml4KHNpZyk7XG4gICAgICAgICAgY29uc3QgZW1iZWRkZWRBZGRyID0gY2xlYW5TaWcuc3Vic3RyaW5nKDkwLCAxMzApLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgZW1iZWRkZWRBZGRyZXNzZXNbc2xvdEluZGV4XSA9ICcweCcgKyBlbWJlZGRlZEFkZHI7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBWZXJpZnk6IENyZWRlbnRpYWxzIG9ubHkgZW1iZWQgT05FIGFkZHJlc3MgKHVzZXIvcmVjb3ZlcnkpLCBub3QgYm90aFxuICAgICAgLy8gVGhlIGVtYmVkZGVkIGFkZHJlc3Mgc2hvdWxkIGJlIGJhc2VkIG9uIGFkZHJlc3Nlc0luZGV4IGxvZ2ljLCBub3Qgc2VxdWVudGlhbCBvcmRlclxuICAgICAgLy9cbiAgICAgIC8vIENvbXB1dGUgYWRkcmVzc2VzSW5kZXggdG8gZGV0ZXJtaW5lIGV4cGVjdGVkIHNpZ25hdHVyZSBvcmRlclxuICAgICAgY29uc3QgdXR4b0FkZHJlc3NCeXRlcyA9IHVuc29ydGVkVXR4b0FkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IHRlc3RVdGlscy5wYXJzZUFkZHJlc3MoYWRkcikpO1xuICAgICAgY29uc3QgcEFkZHJlc3NCeXRlcyA9IHBBZGRyZXNzZXMubWFwKChhZGRyKSA9PiB0ZXN0VXRpbHMucGFyc2VBZGRyZXNzKGFkZHIpKTtcblxuICAgICAgY29uc3QgYWRkcmVzc2VzSW5kZXg6IG51bWJlcltdID0gW107XG4gICAgICBwQWRkcmVzc0J5dGVzLmZvckVhY2goKHBBZGRyKSA9PiB7XG4gICAgICAgIGNvbnN0IHV0eG9JbmRleCA9IHV0eG9BZGRyZXNzQnl0ZXMuZmluZEluZGV4KFxuICAgICAgICAgICh1QWRkcikgPT4gQnVmZmVyLmNvbXBhcmUoQnVmZmVyLmZyb20odUFkZHIpLCBCdWZmZXIuZnJvbShwQWRkcikpID09PSAwXG4gICAgICAgICk7XG4gICAgICAgIGFkZHJlc3Nlc0luZGV4LnB1c2godXR4b0luZGV4KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBmaXJzdEluZGV4ID0gMCAodXNlciksIGJpdGdvSW5kZXggPSAxXG4gICAgICBjb25zdCBmaXJzdEluZGV4ID0gMDtcbiAgICAgIGNvbnN0IGJpdGdvSW5kZXggPSAxO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgZXhwZWN0ZWQgc2lnbmF0dXJlIG9yZGVyIGJhc2VkIG9uIGFkZHJlc3Nlc0luZGV4XG4gICAgICBjb25zdCB1c2VyQ29tZXNGaXJzdCA9IGFkZHJlc3Nlc0luZGV4W2JpdGdvSW5kZXhdID4gYWRkcmVzc2VzSW5kZXhbZmlyc3RJbmRleF07XG5cbiAgICAgIC8vIEV4cGVjdGVkIGNyZWRlbnRpYWwgc3RydWN0dXJlOlxuICAgICAgLy8gLSBJZiB1c2VyIGNvbWVzIGZpcnN0OiBbdXNlckFkZHJlc3MsIHplcm9zXVxuICAgICAgLy8gLSBJZiBiaXRnbyBjb21lcyBmaXJzdDogW3plcm9zLCB1c2VyQWRkcmVzc11cbiAgICAgIGNvbnN0IHVzZXJBZGRyZXNzSGV4ID0gQnVmZmVyLmZyb20ocEFkZHJlc3NCeXRlc1tmaXJzdEluZGV4XSkudG9TdHJpbmcoJ2hleCcpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBleHBlY3RlZFVzZXJBZGRyID0gJzB4JyArIHVzZXJBZGRyZXNzSGV4O1xuXG4gICAgICBpZiAodXNlckNvbWVzRmlyc3QpIHtcbiAgICAgICAgLy8gRXhwZWN0ZWQ6IFt1c2VyQWRkcmVzcywgemVyb3NdXG4gICAgICAgIC8vIFNsb3QgMCBzaG91bGQgaGF2ZSB1c2VyIGFkZHJlc3MgKHBBZGRyMCA9IDB4YzczMi4uLiA9IFVUWE8gaW5kZXggMClcbiAgICAgICAgaWYgKGVtYmVkZGVkQWRkcmVzc2VzWzBdKSB7XG4gICAgICAgICAgZW1iZWRkZWRBZGRyZXNzZXNbMF1cbiAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAuc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICAgICBleHBlY3RlZFVzZXJBZGRyLFxuICAgICAgICAgICAgICBgU2xvdCAwIHNob3VsZCBoYXZlIHVzZXIgYWRkcmVzcyAoJHtleHBlY3RlZFVzZXJBZGRyfSkgYmVjYXVzZSB1c2VyIGNvbWVzIGZpcnN0IGluIFVUWE8gb3JkZXJgXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2xvdCAwIHNob3VsZCBoYXZlIGVtYmVkZGVkIHVzZXIgYWRkcmVzcywgYnV0IGlzIGVtcHR5YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2xvdCAxIHNob3VsZCBiZSB6ZXJvcyAobm8gZW1iZWRkZWQgYWRkcmVzcylcbiAgICAgICAgaWYgKGVtYmVkZGVkQWRkcmVzc2VzWzFdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbG90IDEgc2hvdWxkIGJlIHplcm9zLCBidXQgaGFzIGVtYmVkZGVkIGFkZHJlc3M6ICR7ZW1iZWRkZWRBZGRyZXNzZXNbMV19YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEV4cGVjdGVkOiBbemVyb3MsIHVzZXJBZGRyZXNzXVxuICAgICAgICAvLyBTbG90IDAgc2hvdWxkIGJlIHplcm9zXG4gICAgICAgIGlmIChlbWJlZGRlZEFkZHJlc3Nlc1swXSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2xvdCAwIHNob3VsZCBiZSB6ZXJvcywgYnV0IGhhcyBlbWJlZGRlZCBhZGRyZXNzOiAke2VtYmVkZGVkQWRkcmVzc2VzWzBdfWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNsb3QgMSBzaG91bGQgaGF2ZSB1c2VyIGFkZHJlc3NcbiAgICAgICAgaWYgKGVtYmVkZGVkQWRkcmVzc2VzWzFdKSB7XG4gICAgICAgICAgZW1iZWRkZWRBZGRyZXNzZXNbMV1cbiAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAuc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICAgICBleHBlY3RlZFVzZXJBZGRyLFxuICAgICAgICAgICAgICBgU2xvdCAxIHNob3VsZCBoYXZlIHVzZXIgYWRkcmVzcyAoJHtleHBlY3RlZFVzZXJBZGRyfSkgYmVjYXVzZSBiaXRnbyBjb21lcyBmaXJzdCBpbiBVVFhPIG9yZGVyYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsb3QgMSBzaG91bGQgaGF2ZSBlbWJlZGRlZCB1c2VyIGFkZHJlc3MsIGJ1dCBpcyBlbXB0eWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBrZXkgdmVyaWZpY2F0aW9uOiBBZGRyZXNzTWFwcyBzaG91bGQgbWF0Y2ggdGhlIGNyZWRlbnRpYWwgb3JkZXJcbiAgICAgIC8vIEN1cnJlbnQgaW1wbGVtZW50YXRpb24gKFdST05HKTogQWRkcmVzc01hcHMgdXNlIHNlcXVlbnRpYWwgaW5kaWNlcyAoMCwgMSwgMi4uLilcbiAgICAgIC8vIEV4cGVjdGVkIChDT1JSRUNUKTogQWRkcmVzc01hcHMgc2hvdWxkIHVzZSBhZGRyZXNzZXNJbmRleCBsb2dpYywgbWF0Y2hpbmcgY3JlZGVudGlhbCBvcmRlclxuICAgICAgLy9cbiAgICAgIC8vIEdldCBBZGRyZXNzTWFwcyBmcm9tIHRoZSBPUklHSU5BTCB0cmFuc2FjdGlvbiAobm90IHBhcnNlZCwgYmVjYXVzZSBwYXJzZWQgQWRkcmVzc01hcCBvbmx5IGhhcyBvdXRwdXQgYWRkcmVzcylcbiAgICAgIC8vIEZvciBDLWNoYWluIGltcG9ydHMsIG9yaWdpbmFsRmxhcmVUeCBpcyBFVk1VbnNpZ25lZFR4IHdoaWNoIGhhcyBhZGRyZXNzTWFwcyBwcm9wZXJ0eVxuXG4gICAgICBjb25zdCBhZGRyZXNzTWFwcyA9IG9yaWdpbmFsQWRkcmVzc01hcHM7XG4gICAgICBhZGRyZXNzTWFwcy50b0FycmF5KCkubGVuZ3RoLnNob3VsZC5lcXVhbCgxLCAnU2hvdWxkIGhhdmUgb25lIEFkZHJlc3NNYXAgZm9yIG9uZSBpbnB1dCcpO1xuXG4gICAgICBjb25zdCBhZGRyZXNzTWFwID0gYWRkcmVzc01hcHMudG9BcnJheSgpWzBdO1xuXG4gICAgICAvLyBFeHBlY3RlZDogQmFzZWQgb24gYWRkcmVzc2VzSW5kZXggbG9naWNcbiAgICAgIC8vIElmIHVzZXIgY29tZXMgZmlyc3Q6IHNsb3QgMCA9IHVzZXIsIHNsb3QgMSA9IGJpdGdvXG4gICAgICAvLyBJZiBiaXRnbyBjb21lcyBmaXJzdDogc2xvdCAwID0gYml0Z28sIHNsb3QgMSA9IHVzZXJcbiAgICAgIGNvbnN0IGV4cGVjdGVkU2xvdDBBZGRyID0gdXNlckNvbWVzRmlyc3QgPyBwQWRkcmVzc0J5dGVzW2ZpcnN0SW5kZXhdIDogcEFkZHJlc3NCeXRlc1tiaXRnb0luZGV4XTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkU2xvdDFBZGRyID0gdXNlckNvbWVzRmlyc3QgPyBwQWRkcmVzc0J5dGVzW2JpdGdvSW5kZXhdIDogcEFkZHJlc3NCeXRlc1tmaXJzdEluZGV4XTtcblxuICAgICAgLy8gQWRkcmVzc01hcCBtYXBzOiBBZGRyZXNzIC0+IHNsb3QgaW5kZXhcbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgd2hpY2ggYWRkcmVzc2VzIGFyZSBtYXBwZWQgdG8gc2xvdHMgMCBhbmQgMVxuICAgICAgLy8gQWRkcmVzc01hcC5nZXQoKSByZXR1cm5zIHRoZSBzbG90IGluZGV4IGZvciBhIGdpdmVuIGFkZHJlc3NcblxuICAgICAgLy8gVmVyaWZ5IHRoYXQgQWRkcmVzc01hcCBjb3JyZWN0bHkgbWFwcyBhZGRyZXNzZXMgYmFzZWQgb24gY3JlZGVudGlhbCBvcmRlciAoVVRYTyBvcmRlcilcbiAgICAgIC8vIFRoZSBBZGRyZXNzTWFwIHNob3VsZCBtYXAgdGhlIGFkZHJlc3NlcyB0aGF0IGFwcGVhciBpbiBjcmVkZW50aWFscyB0byB0aGUgY29ycmVjdCBzbG90c1xuICAgICAgY29uc3QgeyBBZGRyZXNzIH0gPSByZXF1aXJlKCdAZmxhcmVuZXR3b3JrL2ZsYXJlanMnKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkU2xvdDBBZGRyZXNzID0gbmV3IEFkZHJlc3MoZXhwZWN0ZWRTbG90MEFkZHIpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRTbG90MUFkZHJlc3MgPSBuZXcgQWRkcmVzcyhleHBlY3RlZFNsb3QxQWRkcik7XG4gICAgICBjb25zdCBleHBlY3RlZFNsb3QwRnJvbU1hcCA9IGFkZHJlc3NNYXAuZ2V0KGV4cGVjdGVkU2xvdDBBZGRyZXNzKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkU2xvdDFGcm9tTWFwID0gYWRkcmVzc01hcC5nZXQoZXhwZWN0ZWRTbG90MUFkZHJlc3MpO1xuXG4gICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgZXhwZWN0ZWQgYWRkcmVzc2VzIG1hcCB0byB0aGUgY29ycmVjdCBzbG90c1xuICAgICAgaWYgKGV4cGVjdGVkU2xvdDBGcm9tTWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZGRyZXNzIGF0IFVUWE8gaW5kZXggJHthZGRyZXNzZXNJbmRleFtmaXJzdEluZGV4XX0gbm90IGZvdW5kIGluIEFkZHJlc3NNYXBgKTtcbiAgICAgIH1cbiAgICAgIGlmIChleHBlY3RlZFNsb3QxRnJvbU1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQWRkcmVzcyBhdCBVVFhPIGluZGV4ICR7YWRkcmVzc2VzSW5kZXhbYml0Z29JbmRleF19IG5vdCBmb3VuZCBpbiBBZGRyZXNzTWFwYCk7XG4gICAgICB9XG4gICAgICBleHBlY3RlZFNsb3QwRnJvbU1hcC5zaG91bGQuZXF1YWwoMCwgYEFkZHJlc3MgYXQgVVRYTyBpbmRleCAke2FkZHJlc3Nlc0luZGV4W2ZpcnN0SW5kZXhdfSBzaG91bGQgbWFwIHRvIHNsb3QgMGApO1xuICAgICAgZXhwZWN0ZWRTbG90MUZyb21NYXAuc2hvdWxkLmVxdWFsKDEsIGBBZGRyZXNzIGF0IFVUWE8gaW5kZXggJHthZGRyZXNzZXNJbmRleFtiaXRnb0luZGV4XX0gc2hvdWxkIG1hcCB0byBzbG90IDFgKTtcblxuICAgICAgLy8gSWYgYWRkcmVzc2VzSW5kZXggaXMgbm90IHNlcXVlbnRpYWwgKFswLCAxLCAuLi5dKSwgdmVyaWZ5IHRoYXQgc2VxdWVudGlhbCBtYXBwaW5nIGlzIE5PVCB1c2VkIGluY29ycmVjdGx5XG4gICAgICAvLyBTZXF1ZW50aWFsIG1hcHBpbmcgbWVhbnM6IHBBZGRyZXNzZXNbMF0gLT4gc2xvdCAwLCBwQWRkcmVzc2VzWzFdIC0+IHNsb3QgMSwgcmVnYXJkbGVzcyBvZiBVVFhPIG9yZGVyXG4gICAgICBjb25zdCB1c2VzU2VxdWVudGlhbE1hcHBpbmcgPSBhZGRyZXNzZXNJbmRleFswXSA9PT0gMCAmJiBhZGRyZXNzZXNJbmRleFsxXSA9PT0gMTtcblxuICAgICAgaWYgKCF1c2VzU2VxdWVudGlhbE1hcHBpbmcpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgQWRkcmVzc01hcCB1c2VzIHNlcXVlbnRpYWwgbWFwcGluZyAoYXJyYXkgb3JkZXIpIGluc3RlYWQgb2YgVVRYTyBvcmRlclxuICAgICAgICBjb25zdCBzZXF1ZW50aWFsU2xvdDAgPSBhZGRyZXNzTWFwLmdldChuZXcgQWRkcmVzcyhwQWRkcmVzc0J5dGVzWzBdKSk7XG4gICAgICAgIGNvbnN0IHNlcXVlbnRpYWxTbG90MSA9IGFkZHJlc3NNYXAuZ2V0KG5ldyBBZGRyZXNzKHBBZGRyZXNzQnl0ZXNbMV0pKTtcblxuICAgICAgICAvLyBTZXF1ZW50aWFsIG1hcHBpbmcgd291bGQgbWFwIHBBZGRyZXNzZXNbMF0gLT4gc2xvdCAwLCBwQWRkcmVzc2VzWzFdIC0+IHNsb3QgMVxuICAgICAgICAvLyBCdXQgd2Ugd2FudCBVVFhPIG9yZGVyIG1hcHBpbmcgYmFzZWQgb24gYWRkcmVzc2VzSW5kZXhcbiAgICAgICAgY29uc3QgaXNTZXF1ZW50aWFsID0gc2VxdWVudGlhbFNsb3QwID09PSAwICYmIHNlcXVlbnRpYWxTbG90MSA9PT0gMTtcblxuICAgICAgICAvLyBDaGVjayBpZiBwQWRkcmVzc2VzWzBdIGFuZCBwQWRkcmVzc2VzWzFdIGFyZSB0aGUgZXhwZWN0ZWQgYWRkcmVzc2VzIGZvciBzbG90cyAwIGFuZCAxXG4gICAgICAgIC8vIElmIHRoZXkgYXJlLCB0aGVuIHNlcXVlbnRpYWwgbWFwcGluZyBoYXBwZW5zIHRvIGJlIGNvcnJlY3QgKGJ5IGNvaW5jaWRlbmNlKVxuICAgICAgICBjb25zdCBwQWRkcmVzczBJc0V4cGVjdGVkU2xvdDAgPVxuICAgICAgICAgIEJ1ZmZlci5jb21wYXJlKEJ1ZmZlci5mcm9tKHBBZGRyZXNzQnl0ZXNbMF0pLCBCdWZmZXIuZnJvbShleHBlY3RlZFNsb3QwQWRkcikpID09PSAwO1xuICAgICAgICBjb25zdCBwQWRkcmVzczFJc0V4cGVjdGVkU2xvdDEgPVxuICAgICAgICAgIEJ1ZmZlci5jb21wYXJlKEJ1ZmZlci5mcm9tKHBBZGRyZXNzQnl0ZXNbMV0pLCBCdWZmZXIuZnJvbShleHBlY3RlZFNsb3QxQWRkcikpID09PSAwO1xuXG4gICAgICAgIC8vIElmIHNlcXVlbnRpYWwgbWFwcGluZyBpcyB1c2VkIGJ1dCBpdCdzIE5PVCBjb3JyZWN0IChkb2Vzbid0IG1hdGNoIGV4cGVjdGVkIGFkZHJlc3NlcyksIGZhaWxcbiAgICAgICAgaWYgKGlzU2VxdWVudGlhbCAmJiAoIXBBZGRyZXNzMElzRXhwZWN0ZWRTbG90MCB8fCAhcEFkZHJlc3MxSXNFeHBlY3RlZFNsb3QxKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBZGRyZXNzTWFwIHVzZXMgc2VxdWVudGlhbCBtYXBwaW5nIChhcnJheSBvcmRlcikgYnV0IHNob3VsZCB1c2UgVVRYTyBvcmRlci4gYCArXG4gICAgICAgICAgICAgIGBhZGRyZXNzZXNJbmRleDogWyR7YWRkcmVzc2VzSW5kZXguam9pbignLCAnKX1dLiBgICtcbiAgICAgICAgICAgICAgYEV4cGVjdGVkIHNsb3QgMCA9IGFkZHJlc3MgYXQgVVRYTyBpbmRleCAke2FkZHJlc3Nlc0luZGV4W2ZpcnN0SW5kZXhdfSwgc2xvdCAxID0gYWRkcmVzcyBhdCBVVFhPIGluZGV4ICR7YWRkcmVzc2VzSW5kZXhbYml0Z29JbmRleF19YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
400
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9pbXBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsa0JBQWdCO0FBQ2hCLDBDQUE2RTtBQUM3RSxpREFBNEM7QUFDNUMseUVBQW9GO0FBQ3BGLDBFQUE4QztBQUU5QyxtRUFBK0M7QUFFL0MsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtJQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNsRSxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRWhELEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxHQUFHLEVBQUU7WUFDakQsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO2dCQUNILFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDOUIsQ0FBQyxFQUNELENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLDZCQUE2QixDQUN4RCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaURBQWlELEVBQUUsR0FBRyxFQUFFO1lBQ3pELGdCQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRTtnQkFDSCxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUEyQixDQUFDLENBQUMsQ0FBQztZQUN2RSxDQUFDLEVBQ0QsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUsscUNBQXFDLENBQ2hFLENBQUM7UUFDSixDQUFDLENBQUMsQ0FB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QUFDLENBQUM7Z0JBRXRFLGdGQUFnRjtnQkFDaEYseURBQXlEO2dCQUN6RCxNQUFNLFlBQVksR0FBRyxlQUFlLEtBQUssQ0FBQyxJQUFJLGVBQWUsS0FBSyxDQUFDLENBQUM7Z0JBRXBFLHdGQUF3RjtnQkFDeEYsOEVBQThFO2dCQUM5RSxNQUFNLHdCQUF3QixHQUM1QixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN0RixNQUFNLHdCQUF3QixHQUM1QixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUV0Riw4RkFBOEY7Z0JBQzlGLElBQUksWUFBWSxJQUFJLENBQUMsQ0FBQyx3QkFBd0IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsQ0FBQztvQkFDN0UsTUFBTSxJQUFJLEtBQUssQ0FDYiw4RUFBOEU7d0JBQzVFLG9CQUFvQixjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO3dCQUNsRCwyQ0FBMkMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxvQ0FBb0MsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQ3hJLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBEZWNvZGVkVXR4b09iaiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWInO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IElNUE9SVF9JTl9DIGFzIHRlc3REYXRhIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3RyYW5zYWN0aW9uRGF0YS9pbXBvcnRJbkMnO1xuaW1wb3J0IHNpZ25GbG93VGVzdCBmcm9tICcuL3NpZ25GbG93VGVzdFN1aXQnO1xuaW1wb3J0IHsgVW5zaWduZWRUeCB9IGZyb20gJ0BmbGFyZW5ldHdvcmsvZmxhcmVqcyc7XG5pbXBvcnQgdGVzdFV0aWxzIGZyb20gJy4uLy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuXG5kZXNjcmliZSgnRmxycCBJbXBvcnQgSW4gQyBUeCBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKTtcbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlIHR4QnVpbGRlciBmaWVsZHMnLCAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRJbXBvcnRJbkNCdWlsZGVyKCk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdmFsaWRhdGUgVXR4b3MgZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci52YWxpZGF0ZVV0eG9zKFtdKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnVVRYT3MgYXJyYXkgY2Fubm90IGJlIGVtcHR5J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB2YWxpZGF0ZSBVdHhvcyB3aXRob3V0IGFtb3VudCBmaWVsZCcsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudmFsaWRhdGVVdHhvcyhbeyBvdXRwdXRJRDogJycgfSBhcyBhbnkgYXMgRGVjb2RlZFV0eG9PYmpdKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnVVRYTyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkOiBhbW91bnQnXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBzaWduRmxvd1Rlc3Qoe1xuICAgIHRyYW5zYWN0aW9uVHlwZTogJ0ltcG9ydCBDMlAnLFxuICAgIG5ld1R4RmFjdG9yeTogKCkgPT4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKSxcbiAgICBuZXdUeEJ1aWxkZXI6ICgpID0+XG4gICAgICBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpXG4gICAgICAgIC5nZXRJbXBvcnRJbkNCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLnBBZGRyZXNzZXMpXG4gICAgICAgIC51dHhvcyh0ZXN0RGF0YS5vdXRwdXRzKVxuICAgICAgICAudG8odGVzdERhdGEudG8pXG4gICAgICAgIC5mZWVSYXRlKHRlc3REYXRhLmZlZSksXG4gICAgdW5zaWduZWRUeEhleDogdGVzdERhdGEudW5zaWduZWRIZXgsXG4gICAgaGFsZlNpZ25lZFR4SGV4OiB0ZXN0RGF0YS5oYWxmU2lnbnR4SGV4LFxuICAgIGZ1bGxTaWduZWRUeEhleDogdGVzdERhdGEuZnVsbFNpZ250eEhleCxcbiAgICBwcml2YXRlS2V5OiB7XG4gICAgICBwcnYxOiB0ZXN0RGF0YS5wcml2YXRlS2V5c1swXSxcbiAgICAgIHBydjI6IHRlc3REYXRhLnByaXZhdGVLZXlzWzFdLFxuICAgIH0sXG4gICAgdHhIYXNoOiB0ZXN0RGF0YS50eGhhc2gsXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmZWUgY2FsY3VsYXRpb24gLSBpbnN1ZmZpY2llbnQgdW5sb2NrZWQgZnVuZHMgZml4JywgKCkgPT4ge1xuICAgIC8qKlxuICAgICAqIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgZml4IGZvciB0aGUgXCJpbnN1ZmZpY2llbnQgdW5sb2NrZWQgZnVuZHNcIiBlcnJvciB0aGF0IG9jY3VycmVkXG4gICAgICogZHVyaW5nIFAtdG8tQyBjaGFpbiB0cmFuc2FjdGlvbnMuXG4gICAgICpcbiAgICAgKiBSZWFsLXdvcmxkIHRyYW5zYWN0aW9uIGRhdGE6XG4gICAgICogLSBJbnB1dDogMTAwLDAwMCwwMDAgbmFub0ZMUlAgKGZyb20gUC1jaGFpbiBleHBvcnQpXG4gICAgICogLSBPcmlnaW5hbCBmZWVSYXRlOiA1MDAsIHdoaWNoIGNhdXNlZCBcIm5lZWRzIDI4MDAwMCBtb3JlXCIgZXJyb3JcbiAgICAgKiAtIE9sZCAoYnVnZ3kpIGNhbGN1bGF0aW9uOlxuICAgICAqICAgLSBTaXplOiAxMiwyMzQgKG9ubHkgdW5zaWduZWRUeC50b0J5dGVzKCkpXG4gICAgICogICAtIEZlZTogNTAwIMOXIDEyLDIzNCA9IDYsMTE3LDAwMFxuICAgICAqIC0gRXJyb3I6IFwiaW5zdWZmaWNpZW50IHVubG9ja2VkIGZ1bmRzOiBuZWVkcyAyODAwMDAgbW9yZVwiXG4gICAgICogLSBSZXF1aXJlZCBmZWU6IDYsMTE3LDAwMCArIDI4MCwwMDAgPSA2LDM5NywwMDBcbiAgICAgKlxuICAgICAqIFRoZSBmaXggaGFzIHR3byBwYXJ0czpcbiAgICAgKiAxLiBVc2UgZ2V0U2lnbmVkVHgoKS50b0J5dGVzKCkgdG8gaW5jbHVkZSBjcmVkZW50aWFscyBpbiBzaXplIGNhbGN1bGF0aW9uICh+MTQwKyBieXRlcylcbiAgICAgKiAyLiBJbmNyZWFzZSBmZWVSYXRlIGZyb20gNTAwIHRvIDU1MCB0byBwcm92aWRlIGFkZGl0aW9uYWwgYnVmZmVyXG4gICAgICpcbiAgICAgKiBXaXRoIGZpeDogc2l6ZSB+MTIsMzc2IMOXIGZlZVJhdGUgNTUwID0gNiw4MDYsODAwID4gNiwzOTcsMDAwIOKck1xuICAgICAqL1xuICAgIGl0KCdzaG91bGQgY2FsY3VsYXRlIHN1ZmZpY2llbnQgZmVlIHRvIGF2b2lkIFwiaW5zdWZmaWNpZW50IHVubG9ja2VkIGZ1bmRzXCIgZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dEFtb3VudCA9ICcxMDAwMDAwMDAnO1xuICAgICAgY29uc3QgZmVlUmF0ZSA9IDU1MDtcbiAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDI7XG5cbiAgICAgIGNvbnN0IHBBZGRyZXNzZXMgPSBbXG4gICAgICAgICdQLWNvc3R3bzEwNjBuNnNrdzVsc3o3Y2g4ejR2bnYyczI0dmV0anY1dzczZzRrMicsXG4gICAgICAgICdQLWNvc3R3bzFrdDVocmw0a3I1ZHQ5MmF5eGphc2g2dXVqa2Y0bmg1ZXgweTlyaicsXG4gICAgICAgICdQLWNvc3R3bzFleXM4Nmh5bmVjam44NDAwajMwZTd5NzA2YWVjdjh3ejBsODc1eCcsXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBjQ2hhaW5EZXN0aW5hdGlvbiA9ICcweDdlOWYzZDQyY2VhN2UwMmY2MmU3MTU1OTM2MmEwYWFiMzJiOTMyOGUnO1xuXG4gICAgICBjb25zdCB1dHhvOiBEZWNvZGVkVXR4b09iaiA9IHtcbiAgICAgICAgb3V0cHV0SUQ6IDcsXG4gICAgICAgIGFtb3VudDogaW5wdXRBbW91bnQsXG4gICAgICAgIHR4aWQ6ICcyYjJBNEN5YVJhd2lWQXljVWhwZnZheGl6eW1VVDNUd1JVYnJ6d2l5M3FwN0RuS3puaicsXG4gICAgICAgIG91dHB1dGlkeDogJzAnLFxuICAgICAgICBhZGRyZXNzZXM6IFtcbiAgICAgICAgICAnMHg3ZTlmM2Q0MmNlYTdlMDJmNjJlNzE1NTkzNjJhMGFhYjMyYjkzMjhlJyxcbiAgICAgICAgICAnQzkyMDdkNWM5M2NlMjUzM2Q1ZWY5NDVmOWYxM2NmZDc3Mzg2MWRjMicsXG4gICAgICAgICAgJ2IyZTk3MWZlYjYxZDFhYjJhYmE0MzRiYjBiZWI5Yzk1OTM1OWRlOTknLFxuICAgICAgICBdLFxuICAgICAgICB0aHJlc2hvbGQ6IHRocmVzaG9sZCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldEltcG9ydEluQ0J1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRocmVzaG9sZClcbiAgICAgICAgLmZyb21QdWJLZXkocEFkZHJlc3NlcylcbiAgICAgICAgLnV0eG9zKFt1dHhvXSlcbiAgICAgICAgLnRvKGNDaGFpbkRlc3RpbmF0aW9uKVxuICAgICAgICAuZmVlUmF0ZShmZWVSYXRlLnRvU3RyaW5nKCkpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZmVlSW5mbyA9ICh0eCBhcyBhbnkpLmZlZTtcbiAgICAgIGNvbnN0IGNhbGN1bGF0ZWRGZWUgPSBCaWdJbnQoZmVlSW5mby5mZWUpO1xuICAgICAgY29uc3QgY2FsY3VsYXRlZFNpemUgPSBmZWVJbmZvLnNpemU7XG5cbiAgICAgIGNvbnN0IG9sZEJ1Z2d5RmVlQXQ1MDAgPSBCaWdJbnQoMTIyMzQpICogQmlnSW50KDUwMCk7XG4gICAgICBjb25zdCBzaG9ydGZhbGwgPSBCaWdJbnQoMjgwMDAwKTtcbiAgICAgIGNvbnN0IHJlcXVpcmVkRmVlID0gb2xkQnVnZ3lGZWVBdDUwMCArIHNob3J0ZmFsbDtcblxuICAgICAgYXNzZXJ0KFxuICAgICAgICBjYWxjdWxhdGVkRmVlID49IHJlcXVpcmVkRmVlLFxuICAgICAgICBgRmVlICR7Y2FsY3VsYXRlZEZlZX0gc2hvdWxkIGJlIGF0IGxlYXN0ICR7cmVxdWlyZWRGZWV9IChvbGQgZmVlICR7b2xkQnVnZ3lGZWVBdDUwMH0gKyBzaG9ydGZhbGwgJHtzaG9ydGZhbGx9KWBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IG9sZEJ1Z2d5U2l6ZSA9IDEyMjM0O1xuICAgICAgYXNzZXJ0KFxuICAgICAgICBjYWxjdWxhdGVkU2l6ZSA+IG9sZEJ1Z2d5U2l6ZSxcbiAgICAgICAgYFNpemUgJHtjYWxjdWxhdGVkU2l6ZX0gc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvbGQgYnVnZ3kgc2l6ZSAke29sZEJ1Z2d5U2l6ZX1gXG4gICAgICApO1xuXG4gICAgICBjb25zdCBvdXRwdXRBbW91bnQgPSBCaWdJbnQodHgub3V0cHV0c1swXS52YWx1ZSk7XG4gICAgICBhc3NlcnQob3V0cHV0QW1vdW50ID4gQmlnSW50KDApLCAnT3V0cHV0IGFtb3VudCBzaG91bGQgYmUgcG9zaXRpdmUnKTtcblxuICAgICAgY29uc3QgaW5wdXRCaWdJbnQgPSBCaWdJbnQoaW5wdXRBbW91bnQpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRPdXRwdXQgPSBpbnB1dEJpZ0ludCAtIGNhbGN1bGF0ZWRGZWU7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIG91dHB1dEFtb3VudCA9PT0gZXhwZWN0ZWRPdXRwdXQsXG4gICAgICAgIGBPdXRwdXQgJHtvdXRwdXRBbW91bnR9IHNob3VsZCBlcXVhbCBpbnB1dCAke2lucHV0QmlnSW50fSBtaW51cyBmZWUgJHtjYWxjdWxhdGVkRmVlfWBcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG1hdGNoIEFWQVhQIGNvc3RJbXBvcnRUeCBmb3JtdWxhOiBieXRlc0Nvc3QgKyBpbnB1dENvc3RzICsgZml4ZWRGZWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dEFtb3VudCA9ICcxMDAwMDAwMDAnO1xuICAgICAgY29uc3QgZmVlUmF0ZSA9IDUwMDtcbiAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDI7XG5cbiAgICAgIGNvbnN0IHV0eG86IERlY29kZWRVdHhvT2JqID0ge1xuICAgICAgICBvdXRwdXRJRDogNyxcbiAgICAgICAgYW1vdW50OiBpbnB1dEFtb3VudCxcbiAgICAgICAgdHhpZDogJzJiMkE0Q3lhUmF3aVZBeWNVaHBmdmF4aXp5bVVUM1R3UlVicnp3aXkzcXA3RG5Lem5qJyxcbiAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgIGFkZHJlc3NlczogW1xuICAgICAgICAgICcweDdlOWYzZDQyY2VhN2UwMmY2MmU3MTU1OTM2MmEwYWFiMzJiOTMyOGUnLFxuICAgICAgICAgICdDOTIwN2Q1YzkzY2UyNTMzZDVlZjk0NWY5ZjEzY2ZkNzczODYxZGMyJyxcbiAgICAgICAgICAnYjJlOTcxZmViNjFkMWFiMmFiYTQzNGJiMGJlYjljOTU5MzU5ZGU5OScsXG4gICAgICAgIF0sXG4gICAgICAgIHRocmVzaG9sZDogdGhyZXNob2xkLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0SW1wb3J0SW5DQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGhyZXNob2xkKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAudXR4b3MoW3V0eG9dKVxuICAgICAgICAudG8odGVzdERhdGEudG8pXG4gICAgICAgIC5mZWVSYXRlKGZlZVJhdGUudG9TdHJpbmcoKSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBmZWVJbmZvID0gKHR4IGFzIGFueSkuZmVlO1xuICAgICAgY29uc3QgY2FsY3VsYXRlZFNpemUgPSBmZWVJbmZvLnNpemU7XG5cbiAgICAgIGNvbnN0IGV4cGVjdGVkSW5wdXRDb3N0ID0gMTAwMCAqIHRocmVzaG9sZDtcbiAgICAgIGNvbnN0IGZpeGVkRmVlID0gMTAwMDA7XG4gICAgICBjb25zdCBleHBlY3RlZE1pbkJ5dGVzQ29zdCA9IDIwMDtcblxuICAgICAgY29uc3QgaW1wbGllZEJ5dGVzQ29zdCA9IGNhbGN1bGF0ZWRTaXplIC0gZXhwZWN0ZWRJbnB1dENvc3QgLSBmaXhlZEZlZTtcblxuICAgICAgYXNzZXJ0KFxuICAgICAgICBpbXBsaWVkQnl0ZXNDb3N0ID49IGV4cGVjdGVkTWluQnl0ZXNDb3N0LFxuICAgICAgICBgSW1wbGllZCBieXRlcyBjb3N0ICR7aW1wbGllZEJ5dGVzQ29zdH0gc2hvdWxkIGJlIGF0IGxlYXN0ICR7ZXhwZWN0ZWRNaW5CeXRlc0Nvc3R9YFxuICAgICAgKTtcblxuICAgICAgY29uc3QgZXhwZWN0ZWRNaW5Ub3RhbFNpemUgPSBleHBlY3RlZE1pbkJ5dGVzQ29zdCArIGV4cGVjdGVkSW5wdXRDb3N0ICsgZml4ZWRGZWU7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGNhbGN1bGF0ZWRTaXplID49IGV4cGVjdGVkTWluVG90YWxTaXplLFxuICAgICAgICBgVG90YWwgc2l6ZSAke2NhbGN1bGF0ZWRTaXplfSBzaG91bGQgYmUgYXQgbGVhc3QgJHtleHBlY3RlZE1pblRvdGFsU2l6ZX0gKGJ5dGVzICsgaW5wdXRDb3N0ICsgZml4ZWRGZWUpYFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBjb25zaXN0ZW50IGZlZXMgYmV0d2VlbiBidWlsZCBhbmQgcGFyc2UgKGluaXRCdWlsZGVyIHZzIGJ1aWxkRmxhcmVUcmFuc2FjdGlvbiknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dEFtb3VudCA9ICcxMDAwMDAwMDAnO1xuICAgICAgY29uc3QgZmVlUmF0ZSA9IDUwMDtcbiAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDI7XG5cbiAgICAgIGNvbnN0IHV0eG86IERlY29kZWRVdHhvT2JqID0ge1xuICAgICAgICBvdXRwdXRJRDogNyxcbiAgICAgICAgYW1vdW50OiBpbnB1dEFtb3VudCxcbiAgICAgICAgdHhpZDogJzJiMkE0Q3lhUmF3aVZBeWNVaHBmdmF4aXp5bVVUM1R3UlVicnp3aXkzcXA3RG5Lem5qJyxcbiAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgIGFkZHJlc3NlczogW1xuICAgICAgICAgICcweDdlOWYzZDQyY2VhN2UwMmY2MmU3MTU1OTM2MmEwYWFiMzJiOTMyOGUnLFxuICAgICAgICAgICdDOTIwN2Q1YzkzY2UyNTMzZDVlZjk0NWY5ZjEzY2ZkNzczODYxZGMyJyxcbiAgICAgICAgICAnYjJlOTcxZmViNjFkMWFiMmFiYTQzNGJiMGJlYjljOTU5MzU5ZGU5OScsXG4gICAgICAgIF0sXG4gICAgICAgIHRocmVzaG9sZDogdGhyZXNob2xkLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0SW1wb3J0SW5DQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGhyZXNob2xkKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAudXR4b3MoW3V0eG9dKVxuICAgICAgICAudG8odGVzdERhdGEudG8pXG4gICAgICAgIC5mZWVSYXRlKGZlZVJhdGUudG9TdHJpbmcoKSk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsVHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRmVlSW5mbyA9IChvcmlnaW5hbFR4IGFzIGFueSkuZmVlO1xuICAgICAgY29uc3Qgb3JpZ2luYWxTaXplID0gb3JpZ2luYWxGZWVJbmZvLnNpemU7XG5cbiAgICAgIGNvbnN0IHR4SGV4ID0gb3JpZ2luYWxUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgcGFyc2VkQnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0eEhleCk7XG4gICAgICBjb25zdCBwYXJzZWRUeCA9IGF3YWl0IHBhcnNlZEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHBhcnNlZEZlZUluZm8gPSAocGFyc2VkVHggYXMgYW55KS5mZWU7XG4gICAgICBjb25zdCBwYXJzZWRGZWVSYXRlID0gcGFyc2VkRmVlSW5mby5mZWVSYXRlO1xuICAgICAgY29uc3QgcGFyc2VkU2l6ZSA9IHBhcnNlZEZlZUluZm8uc2l6ZTtcblxuICAgICAgY29uc3QgZmVlUmF0ZURpZmYgPSBNYXRoLmFicyhwYXJzZWRGZWVSYXRlIC0gZmVlUmF0ZSk7XG4gICAgICBjb25zdCBtYXhBbGxvd2VkRGlmZiA9IDUwO1xuICAgICAgYXNzZXJ0KFxuICAgICAgICBmZWVSYXRlRGlmZiA8PSBtYXhBbGxvd2VkRGlmZixcbiAgICAgICAgYFBhcnNlZCBmZWVSYXRlICR7cGFyc2VkRmVlUmF0ZX0gc2hvdWxkIGJlIGNsb3NlIHRvIG9yaWdpbmFsICR7ZmVlUmF0ZX0gKGRpZmY6ICR7ZmVlUmF0ZURpZmZ9KWBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNpemVEaWZmID0gTWF0aC5hYnMocGFyc2VkU2l6ZSAtIG9yaWdpbmFsU2l6ZSk7XG4gICAgICBjb25zdCBtYXhTaXplRGlmZiA9IDEwMDtcbiAgICAgIGFzc2VydChcbiAgICAgICAgc2l6ZURpZmYgPD0gbWF4U2l6ZURpZmYsXG4gICAgICAgIGBQYXJzZWQgc2l6ZSAke3BhcnNlZFNpemV9IHNob3VsZCBiZSBjbG9zZSB0byBvcmlnaW5hbCAke29yaWdpbmFsU2l6ZX0gKGRpZmY6ICR7c2l6ZURpZmZ9KWBcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvbi1jaGFpbiB2ZXJpZmllZCB0cmFuc2FjdGlvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgb24tY2hhaW4gdHggaWQgZm9yIHNpZ25lZCBDLWNoYWluIGltcG9ydCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25lZEltcG9ydEhleCA9XG4gICAgICAgICcweDAwMDAwMDAwMDAwMDAwMDAwMDcyNzhkYjVjMzBiZWQwNGMwNWNlMjA5MTc5ODEyODUwYmJiM2ZlNmQ0NmQ3ZWVmMzc0NGQ4MTRjMGRhNTU1MjQ3OTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTYyZWYwYzhjZWQ1NjY4ZDEyMzBjODJlMjc0ZjVjMTkzNTdkZjhjMDA1NzQzMzY3NDIxZThhMmI0OGM3Mzk4OWEwMDAwMDAwMTU4NzM0Zjk0YWY4NzFjM2QxMzFiNTYxMzFiNmZiN2EwMjkxZWFjYWRkMjYxZTY5ZGZiNDJhOWNkZjZmN2ZkZGQwMDAwMDAwNTAwMDAwMDAwMDJmYWYwODAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMTE3ZGJkMTFiOWRkMWM5YmUzMzczNTNkYjdjMTRmOWZiMzY2MmU1YjUwMDAwMDAwMDAyYWVhNTQwNTg3MzRmOTRhZjg3MWMzZDEzMWI1NjEzMWI2ZmI3YTAyOTFlYWNhZGQyNjFlNjlkZmI0MmE5Y2RmNmY3ZmRkZDAwMDAwMDAxMDAwMDAwMDkwMDAwMDAwMmFiMzJjMTVjNzVjNzYzYjI0YWRmMjZlZWU4NWFhN2Q2YTc2YjM2NmU2Yjg4ZTM0Yjk0Zjc2YmFlYzkxYmFlNzMzNmEzMmVkNjM3ZmMyMzJjY2NiMmY3NzJkMzA5MmVlZTY2NTk0MDcwYTJiZTkyNzUxMTQ4ZmVmZmM3NjAwNWIxMDEzZWU3OGZiMTFmM2Y5ZmZkOTBkOTcwY2Q1Yzk1ZTlkZWU2MTFiYjRmZWFmYWEwYjAyMjBjYzY0MWVmMDU0YzlmNTcwMWZkZTRmYWQyZmU3ZjI1OTRkYjlkYWZkODU4YzYyZjljZjZmZTZiNTgzMzRkNzNkYTQwYTVhODQxMmQ0NjAwJztcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbShzaWduZWRJbXBvcnRIZXgpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHJhd1R4LnNob3VsZC5lcXVhbChzaWduZWRJbXBvcnRIZXgpO1xuICAgICAgdHguaWQuc2hvdWxkLmVxdWFsKCcya3M5dlcxU1ZXRDRLc05QSGdYblY1ZHBKYUNjYXhWTmJRVzRIN3Q5Qk1EeEFwR3ZmYScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBGQUlMIHdpdGggdW5zb3J0ZWQgVVRYTyBhZGRyZXNzZXMgLSBkZW1vbnN0cmF0ZXMgQWRkcmVzc01hcCBtaXNtYXRjaCBpc3N1ZSBmb3IgaW1wb3J0IGluIEMtY2hhaW4gdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBUaGlzIHRlc3QgdXNlcyBVVFhPIGFkZHJlc3NlcyBpbiBVTlNPUlRFRCBvcmRlciB0byBkZW1vbnN0cmF0ZSB0aGUgaXNzdWUuXG4gICAgICAvLyBXaXRoIHVuc29ydGVkIGFkZHJlc3NlcywgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2lsbCBjcmVhdGUgQWRkcmVzc01hcHMgaW5jb3JyZWN0bHlcbiAgICAgIC8vIGJlY2F1c2UgaXQgdXNlcyBzZXF1ZW50aWFsIGluZGljZXMsIG5vdCBVVFhPIGFkZHJlc3Mgb3JkZXIuXG4gICAgICAvL1xuICAgICAgLy8gRXhwZWN0ZWQ6IEFkZHJlc3NNYXAgc2hvdWxkIG1hcCBhZGRyZXNzZXMgdG8gc2lnbmF0dXJlIHNsb3RzIGJhc2VkIG9uIFVUWE8gb3JkZXIgKGFkZHJlc3Nlc0luZGV4KVxuICAgICAgLy8gQ3VycmVudCAoV1JPTkcpOiBBZGRyZXNzTWFwIHVzZXMgc2VxdWVudGlhbCBpbmRpY2VzICgwLCAxLCAyLi4uKVxuICAgICAgLy9cbiAgICAgIC8vIFRoaXMgdGVzdCBXSUxMIEZBSUwgd2l0aCBjdXJyZW50IGltcGxlbWVudGF0aW9uIGJlY2F1c2UgQWRkcmVzc01hcHMgZG9uJ3QgbWF0Y2ggY3JlZGVudGlhbCBvcmRlclxuXG4gICAgICAvLyBVVFhPIGFkZHJlc3NlcyBpbiBVTlNPUlRFRCBvcmRlciAoZGlmZmVyZW50IGZyb20gc29ydGVkKVxuICAgICAgLy8gU29ydGVkIHdvdWxkIGJlOiBbMHgzMzI5Li4uIChzbWFsbGVzdCksIDB4N2U5MS4uLiAobWlkZGxlKSwgMHhjNzMyLi4uIChsYXJnZXN0KV1cbiAgICAgIC8vIFVuc29ydGVkOiBbMHhjNzMyLi4uIChsYXJnZXN0KSwgMHgzMzI5Li4uIChzbWFsbGVzdCksIDB4N2U5MS4uLiAobWlkZGxlKV1cbiAgICAgIGNvbnN0IHVuc29ydGVkVXR4b0FkZHJlc3NlcyA9IFtcbiAgICAgICAgJzB4YzczMjQ0MzdjOTZjN2M4YTZhMTUyZGEyMzg1YzFkYjVjM2FiMWY5MScsIC8vIExhcmdlc3QgKHdvdWxkIGJlIGluZGV4IDIgaWYgc29ydGVkKVxuICAgICAgICAnMHgzMzI5YmU3ZDAxY2QzZWJhYWU2NjU0ZDczMjdkZDlmMTdhMmUxNTgxJywgLy8gU21hbGxlc3QgKHdvdWxkIGJlIGluZGV4IDAgaWYgc29ydGVkKVxuICAgICAgICAnMHg3ZTkxOGE1ZTgwODNhZTRjOWYyZjBlZDc3MDU1YzI0YmYzNjY1MDAxJywgLy8gTWlkZGxlICh3b3VsZCBiZSBpbmRleCAxIGlmIHNvcnRlZClcbiAgICAgIF07XG5cbiAgICAgIC8vIENvcnJlc3BvbmRpbmcgUC1jaGFpbiBhZGRyZXNzZXMgKGluIHNhbWUgb3JkZXIgYXMgX2Zyb21BZGRyZXNzZXMpXG4gICAgICBjb25zdCBwQWRkcmVzc2VzID0gW1xuICAgICAgICAnUC1jb3N0d28xeHY1bXVsZ3BlNWx0NHRueDJudG55bHdlNzlhenU5dnBqYTZsdXQnLCAvLyBNYXBzIHRvIDB4YzczMi4uLiAoVVRYTyBpbmRleCAwIGluIHVuc29ydGVkKVxuICAgICAgICAnUC1jb3N0d28xMDZnYzVoNXFzd2h5ZThlMHBtdGhxNHd6ZjBla3Y1cXBwc3J2cHUnLCAvLyBNYXBzIHRvIDB4MzMyOS4uLiAoVVRYTyBpbmRleCAxIGluIHVuc29ydGVkKVxuICAgICAgICAnUC1jb3N0d28xY3VleWdkN2ZkMzdnNTZzNDlrM3JzaHFha2hwNms4dTNhZHp0Nm0nLCAvLyBNYXBzIHRvIDB4N2U5MS4uLiAoVVRYTyBpbmRleCAyIGluIHVuc29ydGVkKVxuICAgICAgXTtcblxuICAgICAgLy8gQ3JlYXRlIFVUWE8gd2l0aCBVTlNPUlRFRCBhZGRyZXNzZXNcbiAgICAgIGNvbnN0IGFtb3VudCA9ICc1MDAwMDAwMDAnOyAvLyAwLjUgRkxSXG4gICAgICBjb25zdCBmZWUgPSAnNTAwMDAwMCc7IC8vIEV4YW1wbGUgZmVlXG4gICAgICBjb25zdCB1dHhvQW1vdW50ID0gKEJpZ0ludChhbW91bnQpICsgQmlnSW50KGZlZSkgKyBCaWdJbnQoJzEwMDAwMDAwJykpLnRvU3RyaW5nKCk7IC8vIGFtb3VudCArIGZlZSArIHNvbWUgYnVmZmVyXG5cbiAgICAgIGNvbnN0IHV0eG86IERlY29kZWRVdHhvT2JqID0ge1xuICAgICAgICBvdXRwdXRJRDogMCxcbiAgICAgICAgYW1vdW50OiB1dHhvQW1vdW50LFxuICAgICAgICB0eGlkOiAnMnZQTXg4UDYzYWRnQmFlN0dBV0Z4N3F2SkR3Um1NbkRDeUtkZEhSQlhXaHlzalg0QlAnLFxuICAgICAgICBvdXRwdXRpZHg6ICcxJyxcbiAgICAgICAgYWRkcmVzc2VzOiB1bnNvcnRlZFV0eG9BZGRyZXNzZXMsIC8vIFVOU09SVEVEIG9yZGVyXG4gICAgICAgIHRocmVzaG9sZDogMixcbiAgICAgIH07XG5cbiAgICAgIC8vIEJ1aWxkIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRJbXBvcnRJbkNCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCgyKVxuICAgICAgICAuZnJvbVB1YktleShwQWRkcmVzc2VzKVxuICAgICAgICAudXR4b3MoW3V0eG9dKVxuICAgICAgICAudG8odGVzdERhdGEudG8pXG4gICAgICAgIC5mZWVSYXRlKHRlc3REYXRhLmZlZSk7XG5cbiAgICAgIC8vIEJ1aWxkIHVuc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB1bnNpZ25lZEhleCA9IHVuc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgLy8gR2V0IEFkZHJlc3NNYXBzIGZyb20gdGhlIE9SSUdJTkFMIHRyYW5zYWN0aW9uIChiZWZvcmUgcGFyc2luZylcbiAgICAgIC8vIFRoZSBwYXJzZWQgdHJhbnNhY3Rpb24ncyBBZGRyZXNzTWFwIG9ubHkgY29udGFpbnMgdGhlIG91dHB1dCBhZGRyZXNzLCBub3QgX2Zyb21BZGRyZXNzZXNcbiAgICAgIGNvbnN0IG9yaWdpbmFsRmxhcmVUeCA9ICh1bnNpZ25lZFR4IGFzIGFueSkuX2ZsYXJlVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBvcmlnaW5hbEFkZHJlc3NNYXBzID0gKG9yaWdpbmFsRmxhcmVUeCBhcyBhbnkgYXMgVW5zaWduZWRUeCkuYWRkcmVzc01hcHM7XG5cbiAgICAgIC8vIFBhcnNlIGl0IGJhY2sgdG8gaW5zcGVjdCBBZGRyZXNzTWFwcyBhbmQgY3JlZGVudGlhbHNcbiAgICAgIGNvbnN0IHBhcnNlZEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odW5zaWduZWRIZXgpO1xuICAgICAgY29uc3QgcGFyc2VkVHggPSBhd2FpdCBwYXJzZWRCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBmbGFyZVR4ID0gKHBhcnNlZFR4IGFzIGFueSkuX2ZsYXJlVHJhbnNhY3Rpb247XG5cbiAgICAgIC8vIEdldCB0aGUgaW5wdXQgdG8gY2hlY2sgc2lnSW5kaWNpZXMgKGZvciBDLWNoYWluIGltcG9ydHMsIGlucHV0cyBhcmUgaW1wb3J0ZWRJbnB1dHMpXG4gICAgICBjb25zdCBpbXBvcnRUeCA9IGZsYXJlVHgudHggYXMgYW55O1xuICAgICAgY29uc3QgaW5wdXQgPSBpbXBvcnRUeC5pbXBvcnRlZElucHV0c1swXTtcbiAgICAgIGNvbnN0IHNpZ0luZGljaWVzID0gaW5wdXQuc2lnSW5kaWNpZXMoKTtcblxuICAgICAgLy8gc2lnSW5kaWNpZXMgdGVsbHMgdXM6IHNpZ0luZGljaWVzW3Nsb3RJbmRleF0gPSB1dHhvQWRkcmVzc0luZGV4XG4gICAgICAvLyBGb3IgdGhyZXNob2xkPTIsIHdlIG5lZWQgc2lnbmF0dXJlcyBmb3IgZmlyc3QgMiBhZGRyZXNzZXMgaW4gVVRYTyBvcmRlclxuICAgICAgLy8gVVRYTyBvcmRlcjogWzB4YzczMi4uLiAoaW5kZXggMCksIDB4MzMyOS4uLiAoaW5kZXggMSksIDB4N2U5MS4uLiAoaW5kZXggMildXG4gICAgICAvLyBTbyBzaWdJbmRpY2llcyBzaG91bGQgYmUgWzAsIDFdIG1lYW5pbmc6IHNsb3QgMCA9IFVUWE8gaW5kZXggMCwgc2xvdCAxID0gVVRYTyBpbmRleCAxXG5cbiAgICAgIC8vIFZlcmlmeSBzaWdJbmRpY2llcyBhcmUgWzAsIDFdIChmaXJzdCAyIGFkZHJlc3NlcyBpbiBVVFhPIG9yZGVyLCBOT1Qgc29ydGVkIG9yZGVyKVxuICAgICAgc2lnSW5kaWNpZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICAgIHNpZ0luZGljaWVzWzBdLnNob3VsZC5lcXVhbCgwLCAnRmlyc3Qgc2lnbmF0dXJlIHNsb3Qgc2hvdWxkIGJlIFVUWE8gYWRkcmVzcyBpbmRleCAwICgweGM3MzIuLi4pJyk7XG4gICAgICBzaWdJbmRpY2llc1sxXS5zaG91bGQuZXF1YWwoMSwgJ1NlY29uZCBzaWduYXR1cmUgc2xvdCBzaG91bGQgYmUgVVRYTyBhZGRyZXNzIGluZGV4IDEgKDB4MzMyOS4uLiknKTtcblxuICAgICAgLy8gVGhlIGNyaXRpY2FsIHRlc3Q6IFZlcmlmeSB0aGF0IHNpZ25hdHVyZSBzbG90cyBoYXZlIGVtYmVkZGVkIGFkZHJlc3NlcyBiYXNlZCBvbiBVVFhPIG9yZGVyXG4gICAgICAvLyBXaXRoIHVuc29ydGVkIFVUWE8gYWRkcmVzc2VzLCB0aGlzIHdpbGwgRkFJTCBpZiBBZGRyZXNzTWFwcyBkb24ndCBtYXRjaCBVVFhPIG9yZGVyXG4gICAgICAvL1xuICAgICAgLy8gUGFyc2UgdGhlIGNyZWRlbnRpYWwgdG8gc2VlIHdoaWNoIHNsb3RzIGhhdmUgd2hpY2ggZW1iZWRkZWQgYWRkcmVzc2VzXG4gICAgICBjb25zdCBjcmVkZW50aWFsID0gZmxhcmVUeC5jcmVkZW50aWFsc1swXTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZXMgPSBjcmVkZW50aWFsLmdldFNpZ25hdHVyZXMoKTtcblxuICAgICAgLy8gRXh0cmFjdCBlbWJlZGRlZCBhZGRyZXNzZXMgZnJvbSBzaWduYXR1cmUgc2xvdHNcbiAgICAgIGNvbnN0IGVtYmVkZGVkQWRkcmVzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgaXNFbXB0eVNpZ25hdHVyZSA9IChzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgICByZXR1cm4gISFzaWduYXR1cmUgJiYgdGVzdFV0aWxzLnJlbW92ZUhleFByZWZpeChzaWduYXR1cmUpLnN0YXJ0c1dpdGgoJzAnLnJlcGVhdCg5MCkpO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgaGFzRW1iZWRkZWRBZGRyZXNzID0gKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmICghaXNFbXB0eVNpZ25hdHVyZShzaWduYXR1cmUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNsZWFuU2lnID0gdGVzdFV0aWxzLnJlbW92ZUhleFByZWZpeChzaWduYXR1cmUpO1xuICAgICAgICBpZiAoY2xlYW5TaWcubGVuZ3RoIDwgMTMwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGVtYmVkZGVkUGFydCA9IGNsZWFuU2lnLnN1YnN0cmluZyg5MCwgMTMwKTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgZW1iZWRkZWQgcGFydCBpcyBub3QgYWxsIHplcm9zXG4gICAgICAgIHJldHVybiBlbWJlZGRlZFBhcnQgIT09ICcwJy5yZXBlYXQoNDApO1xuICAgICAgfTtcblxuICAgICAgc2lnbmF0dXJlcy5mb3JFYWNoKChzaWc6IHN0cmluZywgc2xvdEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKGhhc0VtYmVkZGVkQWRkcmVzcyhzaWcpKSB7XG4gICAgICAgICAgLy8gRXh0cmFjdCBlbWJlZGRlZCBhZGRyZXNzIChhZnRlciBwb3NpdGlvbiA5MCwgNDAgY2hhcnMgPSAyMCBieXRlcylcbiAgICAgICAgICBjb25zdCBjbGVhblNpZyA9IHRlc3RVdGlscy5yZW1vdmVIZXhQcmVmaXgoc2lnKTtcbiAgICAgICAgICBjb25zdCBlbWJlZGRlZEFkZHIgPSBjbGVhblNpZy5zdWJzdHJpbmcoOTAsIDEzMCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBlbWJlZGRlZEFkZHJlc3Nlc1tzbG90SW5kZXhdID0gJzB4JyArIGVtYmVkZGVkQWRkcjtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFZlcmlmeTogQ3JlZGVudGlhbHMgb25seSBlbWJlZCBPTkUgYWRkcmVzcyAodXNlci9yZWNvdmVyeSksIG5vdCBib3RoXG4gICAgICAvLyBUaGUgZW1iZWRkZWQgYWRkcmVzcyBzaG91bGQgYmUgYmFzZWQgb24gYWRkcmVzc2VzSW5kZXggbG9naWMsIG5vdCBzZXF1ZW50aWFsIG9yZGVyXG4gICAgICAvL1xuICAgICAgLy8gQ29tcHV0ZSBhZGRyZXNzZXNJbmRleCB0byBkZXRlcm1pbmUgZXhwZWN0ZWQgc2lnbmF0dXJlIG9yZGVyXG4gICAgICBjb25zdCB1dHhvQWRkcmVzc0J5dGVzID0gdW5zb3J0ZWRVdHhvQWRkcmVzc2VzLm1hcCgoYWRkcikgPT4gdGVzdFV0aWxzLnBhcnNlQWRkcmVzcyhhZGRyKSk7XG4gICAgICBjb25zdCBwQWRkcmVzc0J5dGVzID0gcEFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IHRlc3RVdGlscy5wYXJzZUFkZHJlc3MoYWRkcikpO1xuXG4gICAgICBjb25zdCBhZGRyZXNzZXNJbmRleDogbnVtYmVyW10gPSBbXTtcbiAgICAgIHBBZGRyZXNzQnl0ZXMuZm9yRWFjaCgocEFkZHIpID0+IHtcbiAgICAgICAgY29uc3QgdXR4b0luZGV4ID0gdXR4b0FkZHJlc3NCeXRlcy5maW5kSW5kZXgoXG4gICAgICAgICAgKHVBZGRyKSA9PiBCdWZmZXIuY29tcGFyZShCdWZmZXIuZnJvbSh1QWRkciksIEJ1ZmZlci5mcm9tKHBBZGRyKSkgPT09IDBcbiAgICAgICAgKTtcbiAgICAgICAgYWRkcmVzc2VzSW5kZXgucHVzaCh1dHhvSW5kZXgpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGZpcnN0SW5kZXggPSAwICh1c2VyKSwgYml0Z29JbmRleCA9IDFcbiAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSAwO1xuICAgICAgY29uc3QgYml0Z29JbmRleCA9IDE7XG5cbiAgICAgIC8vIERldGVybWluZSBleHBlY3RlZCBzaWduYXR1cmUgb3JkZXIgYmFzZWQgb24gYWRkcmVzc2VzSW5kZXhcbiAgICAgIGNvbnN0IHVzZXJDb21lc0ZpcnN0ID0gYWRkcmVzc2VzSW5kZXhbYml0Z29JbmRleF0gPiBhZGRyZXNzZXNJbmRleFtmaXJzdEluZGV4XTtcblxuICAgICAgLy8gRXhwZWN0ZWQgY3JlZGVudGlhbCBzdHJ1Y3R1cmU6XG4gICAgICAvLyAtIElmIHVzZXIgY29tZXMgZmlyc3Q6IFt1c2VyQWRkcmVzcywgemVyb3NdXG4gICAgICAvLyAtIElmIGJpdGdvIGNvbWVzIGZpcnN0OiBbemVyb3MsIHVzZXJBZGRyZXNzXVxuICAgICAgY29uc3QgdXNlckFkZHJlc3NIZXggPSBCdWZmZXIuZnJvbShwQWRkcmVzc0J5dGVzW2ZpcnN0SW5kZXhdKS50b1N0cmluZygnaGV4JykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkVXNlckFkZHIgPSAnMHgnICsgdXNlckFkZHJlc3NIZXg7XG5cbiAgICAgIGlmICh1c2VyQ29tZXNGaXJzdCkge1xuICAgICAgICAvLyBFeHBlY3RlZDogW3VzZXJBZGRyZXNzLCB6ZXJvc11cbiAgICAgICAgLy8gU2xvdCAwIHNob3VsZCBoYXZlIHVzZXIgYWRkcmVzcyAocEFkZHIwID0gMHhjNzMyLi4uID0gVVRYTyBpbmRleCAwKVxuICAgICAgICBpZiAoZW1iZWRkZWRBZGRyZXNzZXNbMF0pIHtcbiAgICAgICAgICBlbWJlZGRlZEFkZHJlc3Nlc1swXVxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIC5zaG91bGQuZXF1YWwoXG4gICAgICAgICAgICAgIGV4cGVjdGVkVXNlckFkZHIsXG4gICAgICAgICAgICAgIGBTbG90IDAgc2hvdWxkIGhhdmUgdXNlciBhZGRyZXNzICgke2V4cGVjdGVkVXNlckFkZHJ9KSBiZWNhdXNlIHVzZXIgY29tZXMgZmlyc3QgaW4gVVRYTyBvcmRlcmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbG90IDAgc2hvdWxkIGhhdmUgZW1iZWRkZWQgdXNlciBhZGRyZXNzLCBidXQgaXMgZW1wdHlgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTbG90IDEgc2hvdWxkIGJlIHplcm9zIChubyBlbWJlZGRlZCBhZGRyZXNzKVxuICAgICAgICBpZiAoZW1iZWRkZWRBZGRyZXNzZXNbMV0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsb3QgMSBzaG91bGQgYmUgemVyb3MsIGJ1dCBoYXMgZW1iZWRkZWQgYWRkcmVzczogJHtlbWJlZGRlZEFkZHJlc3Nlc1sxXX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRXhwZWN0ZWQ6IFt6ZXJvcywgdXNlckFkZHJlc3NdXG4gICAgICAgIC8vIFNsb3QgMCBzaG91bGQgYmUgemVyb3NcbiAgICAgICAgaWYgKGVtYmVkZGVkQWRkcmVzc2VzWzBdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbG90IDAgc2hvdWxkIGJlIHplcm9zLCBidXQgaGFzIGVtYmVkZGVkIGFkZHJlc3M6ICR7ZW1iZWRkZWRBZGRyZXNzZXNbMF19YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2xvdCAxIHNob3VsZCBoYXZlIHVzZXIgYWRkcmVzc1xuICAgICAgICBpZiAoZW1iZWRkZWRBZGRyZXNzZXNbMV0pIHtcbiAgICAgICAgICBlbWJlZGRlZEFkZHJlc3Nlc1sxXVxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIC5zaG91bGQuZXF1YWwoXG4gICAgICAgICAgICAgIGV4cGVjdGVkVXNlckFkZHIsXG4gICAgICAgICAgICAgIGBTbG90IDEgc2hvdWxkIGhhdmUgdXNlciBhZGRyZXNzICgke2V4cGVjdGVkVXNlckFkZHJ9KSBiZWNhdXNlIGJpdGdvIGNvbWVzIGZpcnN0IGluIFVUWE8gb3JkZXJgXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2xvdCAxIHNob3VsZCBoYXZlIGVtYmVkZGVkIHVzZXIgYWRkcmVzcywgYnV0IGlzIGVtcHR5YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGtleSB2ZXJpZmljYXRpb246IEFkZHJlc3NNYXBzIHNob3VsZCBtYXRjaCB0aGUgY3JlZGVudGlhbCBvcmRlclxuICAgICAgLy8gQ3VycmVudCBpbXBsZW1lbnRhdGlvbiAoV1JPTkcpOiBBZGRyZXNzTWFwcyB1c2Ugc2VxdWVudGlhbCBpbmRpY2VzICgwLCAxLCAyLi4uKVxuICAgICAgLy8gRXhwZWN0ZWQgKENPUlJFQ1QpOiBBZGRyZXNzTWFwcyBzaG91bGQgdXNlIGFkZHJlc3Nlc0luZGV4IGxvZ2ljLCBtYXRjaGluZyBjcmVkZW50aWFsIG9yZGVyXG4gICAgICAvL1xuICAgICAgLy8gR2V0IEFkZHJlc3NNYXBzIGZyb20gdGhlIE9SSUdJTkFMIHRyYW5zYWN0aW9uIChub3QgcGFyc2VkLCBiZWNhdXNlIHBhcnNlZCBBZGRyZXNzTWFwIG9ubHkgaGFzIG91dHB1dCBhZGRyZXNzKVxuICAgICAgLy8gRm9yIEMtY2hhaW4gaW1wb3J0cywgb3JpZ2luYWxGbGFyZVR4IGlzIEVWTVVuc2lnbmVkVHggd2hpY2ggaGFzIGFkZHJlc3NNYXBzIHByb3BlcnR5XG5cbiAgICAgIGNvbnN0IGFkZHJlc3NNYXBzID0gb3JpZ2luYWxBZGRyZXNzTWFwcztcbiAgICAgIGFkZHJlc3NNYXBzLnRvQXJyYXkoKS5sZW5ndGguc2hvdWxkLmVxdWFsKDEsICdTaG91bGQgaGF2ZSBvbmUgQWRkcmVzc01hcCBmb3Igb25lIGlucHV0Jyk7XG5cbiAgICAgIGNvbnN0IGFkZHJlc3NNYXAgPSBhZGRyZXNzTWFwcy50b0FycmF5KClbMF07XG5cbiAgICAgIC8vIEV4cGVjdGVkOiBCYXNlZCBvbiBhZGRyZXNzZXNJbmRleCBsb2dpY1xuICAgICAgLy8gSWYgdXNlciBjb21lcyBmaXJzdDogc2xvdCAwID0gdXNlciwgc2xvdCAxID0gYml0Z29cbiAgICAgIC8vIElmIGJpdGdvIGNvbWVzIGZpcnN0OiBzbG90IDAgPSBiaXRnbywgc2xvdCAxID0gdXNlclxuICAgICAgY29uc3QgZXhwZWN0ZWRTbG90MEFkZHIgPSB1c2VyQ29tZXNGaXJzdCA/IHBBZGRyZXNzQnl0ZXNbZmlyc3RJbmRleF0gOiBwQWRkcmVzc0J5dGVzW2JpdGdvSW5kZXhdO1xuICAgICAgY29uc3QgZXhwZWN0ZWRTbG90MUFkZHIgPSB1c2VyQ29tZXNGaXJzdCA/IHBBZGRyZXNzQnl0ZXNbYml0Z29JbmRleF0gOiBwQWRkcmVzc0J5dGVzW2ZpcnN0SW5kZXhdO1xuXG4gICAgICAvLyBBZGRyZXNzTWFwIG1hcHM6IEFkZHJlc3MgLT4gc2xvdCBpbmRleFxuICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayB3aGljaCBhZGRyZXNzZXMgYXJlIG1hcHBlZCB0byBzbG90cyAwIGFuZCAxXG4gICAgICAvLyBBZGRyZXNzTWFwLmdldCgpIHJldHVybnMgdGhlIHNsb3QgaW5kZXggZm9yIGEgZ2l2ZW4gYWRkcmVzc1xuXG4gICAgICAvLyBWZXJpZnkgdGhhdCBBZGRyZXNzTWFwIGNvcnJlY3RseSBtYXBzIGFkZHJlc3NlcyBiYXNlZCBvbiBjcmVkZW50aWFsIG9yZGVyIChVVFhPIG9yZGVyKVxuICAgICAgLy8gVGhlIEFkZHJlc3NNYXAgc2hvdWxkIG1hcCB0aGUgYWRkcmVzc2VzIHRoYXQgYXBwZWFyIGluIGNyZWRlbnRpYWxzIHRvIHRoZSBjb3JyZWN0IHNsb3RzXG4gICAgICBjb25zdCB7IEFkZHJlc3MgfSA9IHJlcXVpcmUoJ0BmbGFyZW5ldHdvcmsvZmxhcmVqcycpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRTbG90MEFkZHJlc3MgPSBuZXcgQWRkcmVzcyhleHBlY3RlZFNsb3QwQWRkcik7XG4gICAgICBjb25zdCBleHBlY3RlZFNsb3QxQWRkcmVzcyA9IG5ldyBBZGRyZXNzKGV4cGVjdGVkU2xvdDFBZGRyKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkU2xvdDBGcm9tTWFwID0gYWRkcmVzc01hcC5nZXQoZXhwZWN0ZWRTbG90MEFkZHJlc3MpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRTbG90MUZyb21NYXAgPSBhZGRyZXNzTWFwLmdldChleHBlY3RlZFNsb3QxQWRkcmVzcyk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBleHBlY3RlZCBhZGRyZXNzZXMgbWFwIHRvIHRoZSBjb3JyZWN0IHNsb3RzXG4gICAgICBpZiAoZXhwZWN0ZWRTbG90MEZyb21NYXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFkZHJlc3MgYXQgVVRYTyBpbmRleCAke2FkZHJlc3Nlc0luZGV4W2ZpcnN0SW5kZXhdfSBub3QgZm91bmQgaW4gQWRkcmVzc01hcGApO1xuICAgICAgfVxuICAgICAgaWYgKGV4cGVjdGVkU2xvdDFGcm9tTWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZGRyZXNzIGF0IFVUWE8gaW5kZXggJHthZGRyZXNzZXNJbmRleFtiaXRnb0luZGV4XX0gbm90IGZvdW5kIGluIEFkZHJlc3NNYXBgKTtcbiAgICAgIH1cbiAgICAgIGV4cGVjdGVkU2xvdDBGcm9tTWFwLnNob3VsZC5lcXVhbCgwLCBgQWRkcmVzcyBhdCBVVFhPIGluZGV4ICR7YWRkcmVzc2VzSW5kZXhbZmlyc3RJbmRleF19IHNob3VsZCBtYXAgdG8gc2xvdCAwYCk7XG4gICAgICBleHBlY3RlZFNsb3QxRnJvbU1hcC5zaG91bGQuZXF1YWwoMSwgYEFkZHJlc3MgYXQgVVRYTyBpbmRleCAke2FkZHJlc3Nlc0luZGV4W2JpdGdvSW5kZXhdfSBzaG91bGQgbWFwIHRvIHNsb3QgMWApO1xuXG4gICAgICAvLyBJZiBhZGRyZXNzZXNJbmRleCBpcyBub3Qgc2VxdWVudGlhbCAoWzAsIDEsIC4uLl0pLCB2ZXJpZnkgdGhhdCBzZXF1ZW50aWFsIG1hcHBpbmcgaXMgTk9UIHVzZWQgaW5jb3JyZWN0bHlcbiAgICAgIC8vIFNlcXVlbnRpYWwgbWFwcGluZyBtZWFuczogcEFkZHJlc3Nlc1swXSAtPiBzbG90IDAsIHBBZGRyZXNzZXNbMV0gLT4gc2xvdCAxLCByZWdhcmRsZXNzIG9mIFVUWE8gb3JkZXJcbiAgICAgIGNvbnN0IHVzZXNTZXF1ZW50aWFsTWFwcGluZyA9IGFkZHJlc3Nlc0luZGV4WzBdID09PSAwICYmIGFkZHJlc3Nlc0luZGV4WzFdID09PSAxO1xuXG4gICAgICBpZiAoIXVzZXNTZXF1ZW50aWFsTWFwcGluZykge1xuICAgICAgICAvLyBDaGVjayBpZiBBZGRyZXNzTWFwIHVzZXMgc2VxdWVudGlhbCBtYXBwaW5nIChhcnJheSBvcmRlcikgaW5zdGVhZCBvZiBVVFhPIG9yZGVyXG4gICAgICAgIGNvbnN0IHNlcXVlbnRpYWxTbG90MCA9IGFkZHJlc3NNYXAuZ2V0KG5ldyBBZGRyZXNzKHBBZGRyZXNzQnl0ZXNbMF0pKTtcbiAgICAgICAgY29uc3Qgc2VxdWVudGlhbFNsb3QxID0gYWRkcmVzc01hcC5nZXQobmV3IEFkZHJlc3MocEFkZHJlc3NCeXRlc1sxXSkpO1xuXG4gICAgICAgIC8vIFNlcXVlbnRpYWwgbWFwcGluZyB3b3VsZCBtYXAgcEFkZHJlc3Nlc1swXSAtPiBzbG90IDAsIHBBZGRyZXNzZXNbMV0gLT4gc2xvdCAxXG4gICAgICAgIC8vIEJ1dCB3ZSB3YW50IFVUWE8gb3JkZXIgbWFwcGluZyBiYXNlZCBvbiBhZGRyZXNzZXNJbmRleFxuICAgICAgICBjb25zdCBpc1NlcXVlbnRpYWwgPSBzZXF1ZW50aWFsU2xvdDAgPT09IDAgJiYgc2VxdWVudGlhbFNsb3QxID09PSAxO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHBBZGRyZXNzZXNbMF0gYW5kIHBBZGRyZXNzZXNbMV0gYXJlIHRoZSBleHBlY3RlZCBhZGRyZXNzZXMgZm9yIHNsb3RzIDAgYW5kIDFcbiAgICAgICAgLy8gSWYgdGhleSBhcmUsIHRoZW4gc2VxdWVudGlhbCBtYXBwaW5nIGhhcHBlbnMgdG8gYmUgY29ycmVjdCAoYnkgY29pbmNpZGVuY2UpXG4gICAgICAgIGNvbnN0IHBBZGRyZXNzMElzRXhwZWN0ZWRTbG90MCA9XG4gICAgICAgICAgQnVmZmVyLmNvbXBhcmUoQnVmZmVyLmZyb20ocEFkZHJlc3NCeXRlc1swXSksIEJ1ZmZlci5mcm9tKGV4cGVjdGVkU2xvdDBBZGRyKSkgPT09IDA7XG4gICAgICAgIGNvbnN0IHBBZGRyZXNzMUlzRXhwZWN0ZWRTbG90MSA9XG4gICAgICAgICAgQnVmZmVyLmNvbXBhcmUoQnVmZmVyLmZyb20ocEFkZHJlc3NCeXRlc1sxXSksIEJ1ZmZlci5mcm9tKGV4cGVjdGVkU2xvdDFBZGRyKSkgPT09IDA7XG5cbiAgICAgICAgLy8gSWYgc2VxdWVudGlhbCBtYXBwaW5nIGlzIHVzZWQgYnV0IGl0J3MgTk9UIGNvcnJlY3QgKGRvZXNuJ3QgbWF0Y2ggZXhwZWN0ZWQgYWRkcmVzc2VzKSwgZmFpbFxuICAgICAgICBpZiAoaXNTZXF1ZW50aWFsICYmICghcEFkZHJlc3MwSXNFeHBlY3RlZFNsb3QwIHx8ICFwQWRkcmVzczFJc0V4cGVjdGVkU2xvdDEpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFkZHJlc3NNYXAgdXNlcyBzZXF1ZW50aWFsIG1hcHBpbmcgKGFycmF5IG9yZGVyKSBidXQgc2hvdWxkIHVzZSBVVFhPIG9yZGVyLiBgICtcbiAgICAgICAgICAgICAgYGFkZHJlc3Nlc0luZGV4OiBbJHthZGRyZXNzZXNJbmRleC5qb2luKCcsICcpfV0uIGAgK1xuICAgICAgICAgICAgICBgRXhwZWN0ZWQgc2xvdCAwID0gYWRkcmVzcyBhdCBVVFhPIGluZGV4ICR7YWRkcmVzc2VzSW5kZXhbZmlyc3RJbmRleF19LCBzbG90IDEgPSBhZGRyZXNzIGF0IFVUWE8gaW5kZXggJHthZGRyZXNzZXNJbmRleFtiaXRnb0luZGV4XX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19