@zcomb/programs-sdk 1.3.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -841,8 +841,7 @@ export declare class AMMClient {
841
841
  * - Fetches current reserves and computes quote
842
842
  * - Calculates minOutput based on slippage tolerance
843
843
  * - Adds compute budget instruction (if includeCuBudget is true)
844
- * - Creates token accounts if they don't exist (if autoWrapUnwrap is true)
845
- * - Handles WSOL wrapping/unwrapping if needed (if autoWrapUnwrap is true)
844
+ * - Creates token accounts if they don't exist (if autoCreateTokenAccounts is true)
846
845
  */
847
846
  swapWithSlippage(trader: PublicKey, poolPda: PublicKey, swapAToB: boolean, inputAmount: BN | number, slippagePercent?: number, options?: AmmActionOptions): Promise<{
848
847
  builder: import("@coral-xyz/anchor/dist/cjs/program/namespace/methods").MethodsBuilder<Amm, {
@@ -151,7 +151,7 @@ class AMMClient {
151
151
  return postIxs.length > 0 ? builder.postInstructions(postIxs) : builder;
152
152
  }
153
153
  async swap(trader, poolPda, swapAToB, inputAmount, minOutputAmount, options) {
154
- const { autoWrapUnwrap = true, includeCuBudget = true, computeUnits } = options ?? {};
154
+ const { autoCreateTokenAccounts = true, includeCuBudget = true, computeUnits } = options ?? {};
155
155
  const pool = await this.fetchPool(poolPda);
156
156
  const [reserveA] = this.deriveReservePDA(poolPda, pool.mintA);
157
157
  const [reserveB] = this.deriveReservePDA(poolPda, pool.mintB);
@@ -159,40 +159,18 @@ class AMMClient {
159
159
  const traderAccountA = (0, spl_token_1.getAssociatedTokenAddressSync)(pool.mintA, trader);
160
160
  const traderAccountB = (0, spl_token_1.getAssociatedTokenAddressSync)(pool.mintB, trader);
161
161
  const preIxs = [];
162
- const postIxs = [];
163
162
  if (includeCuBudget) {
164
163
  preIxs.push(web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({
165
164
  units: computeUnits ?? this.computeUnits,
166
165
  }));
167
166
  }
168
- const inputMint = swapAToB ? pool.mintA : pool.mintB;
169
- const outputMint = swapAToB ? pool.mintB : pool.mintA;
170
- const inputAta = swapAToB ? traderAccountA : traderAccountB;
171
- const outputAta = swapAToB ? traderAccountB : traderAccountA;
172
- if (autoWrapUnwrap) {
173
- // Create ATAs idempotently
167
+ if (autoCreateTokenAccounts) {
174
168
  preIxs.push((0, spl_token_1.createAssociatedTokenAccountIdempotentInstruction)(trader, traderAccountA, trader, pool.mintA), (0, spl_token_1.createAssociatedTokenAccountIdempotentInstruction)(trader, traderAccountB, trader, pool.mintB));
175
- // Wrap input SOL if needed
176
- if (inputMint.equals(spl_token_1.NATIVE_MINT)) {
177
- const input = typeof inputAmount === "number" ? new anchor_1.BN(inputAmount) : inputAmount;
178
- preIxs.push(web3_js_1.SystemProgram.transfer({
179
- fromPubkey: trader,
180
- toPubkey: inputAta,
181
- lamports: BigInt(input.toString()),
182
- }), (0, spl_token_1.createSyncNativeInstruction)(inputAta));
183
- }
184
- // Unwrap output SOL if needed
185
- if (outputMint.equals(spl_token_1.NATIVE_MINT)) {
186
- postIxs.push((0, spl_token_1.createCloseAccountInstruction)(outputAta, trader, trader));
187
- }
188
169
  }
189
170
  let builder = (0, instructions_1.swap)(this.program, trader, poolPda, reserveA, reserveB, feeVault, traderAccountA, traderAccountB, swapAToB, inputAmount, minOutputAmount);
190
171
  if (preIxs.length > 0) {
191
172
  builder = builder.preInstructions(preIxs);
192
173
  }
193
- if (postIxs.length > 0) {
194
- builder = builder.postInstructions(postIxs);
195
- }
196
174
  return builder;
197
175
  }
198
176
  async crankTwap(poolPda) {
@@ -210,11 +188,10 @@ class AMMClient {
210
188
  * - Fetches current reserves and computes quote
211
189
  * - Calculates minOutput based on slippage tolerance
212
190
  * - Adds compute budget instruction (if includeCuBudget is true)
213
- * - Creates token accounts if they don't exist (if autoWrapUnwrap is true)
214
- * - Handles WSOL wrapping/unwrapping if needed (if autoWrapUnwrap is true)
191
+ * - Creates token accounts if they don't exist (if autoCreateTokenAccounts is true)
215
192
  */
216
193
  async swapWithSlippage(trader, poolPda, swapAToB, inputAmount, slippagePercent = 0.5, options) {
217
- const { autoWrapUnwrap = true, includeCuBudget = true, computeUnits } = options ?? {};
194
+ const { autoCreateTokenAccounts = true, includeCuBudget = true, computeUnits } = options ?? {};
218
195
  const pool = await this.fetchPool(poolPda);
219
196
  const input = typeof inputAmount === "number" ? new anchor_1.BN(inputAmount) : inputAmount;
220
197
  // Get quote with slippage
@@ -228,38 +205,17 @@ class AMMClient {
228
205
  // Build base swap instruction
229
206
  let builder = (0, instructions_1.swap)(this.program, trader, poolPda, reserveA, reserveB, feeVault, traderAccountA, traderAccountB, swapAToB, input, quoteResult.minOutputAmount);
230
207
  const preIxs = [];
231
- const postIxs = [];
232
208
  if (includeCuBudget) {
233
209
  preIxs.push(web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({
234
210
  units: computeUnits ?? this.computeUnits,
235
211
  }));
236
212
  }
237
- if (autoWrapUnwrap) {
213
+ if (autoCreateTokenAccounts) {
238
214
  preIxs.push((0, spl_token_1.createAssociatedTokenAccountIdempotentInstruction)(trader, traderAccountA, trader, pool.mintA), (0, spl_token_1.createAssociatedTokenAccountIdempotentInstruction)(trader, traderAccountB, trader, pool.mintB));
239
215
  }
240
- // Handle WSOL for input/output tokens
241
- const inputMint = swapAToB ? pool.mintA : pool.mintB;
242
- const outputMint = swapAToB ? pool.mintB : pool.mintA;
243
- const inputAta = swapAToB ? traderAccountA : traderAccountB;
244
- const outputAta = swapAToB ? traderAccountB : traderAccountA;
245
- if (autoWrapUnwrap && inputMint.equals(spl_token_1.NATIVE_MINT)) {
246
- // Wrap SOL before swap
247
- preIxs.push(web3_js_1.SystemProgram.transfer({
248
- fromPubkey: trader,
249
- toPubkey: inputAta,
250
- lamports: BigInt(input.toString()),
251
- }), (0, spl_token_1.createSyncNativeInstruction)(inputAta));
252
- }
253
- if (autoWrapUnwrap && outputMint.equals(spl_token_1.NATIVE_MINT)) {
254
- // Unwrap SOL after swap
255
- postIxs.push((0, spl_token_1.createCloseAccountInstruction)(outputAta, trader, trader));
256
- }
257
216
  if (preIxs.length > 0) {
258
217
  builder = builder.preInstructions(preIxs);
259
218
  }
260
- if (postIxs.length > 0) {
261
- builder = builder.postInstructions(postIxs);
262
- }
263
219
  return {
264
220
  builder,
265
221
  quote: quoteResult,
@@ -267,4 +223,4 @@ class AMMClient {
267
223
  }
268
224
  }
269
225
  exports.AMMClient = AMMClient;
270
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FtbS9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQUVILDhDQUFnRTtBQUNoRSw2Q0FLeUI7QUFDekIsaURBUTJCO0FBQzNCLDJDQUF5QztBQUV6QyxtQ0FRaUI7QUFDakIsaURBT3dCO0FBRXhCLDRDQUEyQztBQUUzQyxNQUFNLHFCQUFxQixHQUFHLE1BQU8sQ0FBQztBQUV0QyxNQUFhLFNBQVM7SUFLcEIsWUFDRSxRQUF3QixFQUN4QixTQUFxQixFQUNyQixZQUFxQjtRQUVyQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsSUFBSSxzQkFBVSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxJQUFJLHFCQUFxQixDQUFDO1FBQzFELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxnQkFBTyxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsaUJBQWlCO0lBRWpCLGFBQWEsQ0FDWCxLQUFnQixFQUNoQixLQUFnQixFQUNoQixLQUFnQjtRQUVoQixPQUFPLElBQUEscUJBQWEsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQWUsRUFBRSxJQUFlO1FBQy9DLE9BQU8sSUFBQSx3QkFBZ0IsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsSUFBZTtRQUMvQixPQUFPLElBQUEseUJBQWlCLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsb0JBQW9CO0lBRXBCLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBa0I7UUFDaEMsT0FBTyxJQUFB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Q0FDRjtBQTllRCw4QkE4ZUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogSGlnaC1sZXZlbCBjbGllbnQgZm9yIHRoZSBBTU0gcHJvZ3JhbS5cbiAqIFByb3ZpZGVzIGVyZ29ub21pYyBtZXRob2RzIGZvciBwb29sIG9wZXJhdGlvbnMgd2l0aCBhdXRvbWF0aWMgUERBIGRlcml2YXRpb24sXG4gKiBuYXRpdmUgU09MIHdyYXBwaW5nL3Vud3JhcHBpbmcsIGFuZCBjb21wdXRlIGJ1ZGdldCBtYW5hZ2VtZW50LlxuICovXG5cbmltcG9ydCB7IFByb2dyYW0sIEFuY2hvclByb3ZpZGVyLCBCTiB9IGZyb20gXCJAY29yYWwteHl6L2FuY2hvclwiO1xuaW1wb3J0IHtcbiAgUHVibGljS2V5LFxuICBDb21wdXRlQnVkZ2V0UHJvZ3JhbSxcbiAgU3lzdGVtUHJvZ3JhbSxcbiAgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbixcbn0gZnJvbSBcIkBzb2xhbmEvd2ViMy5qc1wiO1xuaW1wb3J0IHtcbiAgZ2V0QWNjb3VudCxcbiAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMsXG4gIGdldE1pbnQsXG4gIE5BVElWRV9NSU5ULFxuICBjcmVhdGVTeW5jTmF0aXZlSW5zdHJ1Y3Rpb24sXG4gIGNyZWF0ZUNsb3NlQWNjb3VudEluc3RydWN0aW9uLFxuICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SWRlbXBvdGVudEluc3RydWN0aW9uLFxufSBmcm9tIFwiQHNvbGFuYS9zcGwtdG9rZW5cIjtcbmltcG9ydCB7IFBST0dSQU1fSUQgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEFtbSwgUG9vbEFjY291bnQsIFN3YXBRdW90ZSwgQW1tQWN0aW9uT3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBkZXJpdmVQb29sUERBLFxuICBkZXJpdmVSZXNlcnZlUERBLFxuICBkZXJpdmVGZWVWYXVsdFBEQSxcbiAgZmV0Y2hQb29sQWNjb3VudCxcbiAgY3JlYXRlU3dhcFF1b3RlLFxuICBjYWxjdWxhdGVTcG90UHJpY2UsXG4gIGNhbGN1bGF0ZVR3YXAsXG59IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVQb29sIGFzIGNyZWF0ZVBvb2xJeCxcbiAgYWRkTGlxdWlkaXR5IGFzIGFkZExpcXVpZGl0eUl4LFxuICByZW1vdmVMaXF1aWRpdHkgYXMgcmVtb3ZlTGlxdWlkaXR5SXgsXG4gIHN3YXAgYXMgc3dhcEl4LFxuICBjcmFua1R3YXAgYXMgY3JhbmtUd2FwSXgsXG4gIGNlYXNlVHJhZGluZyBhcyBjZWFzZVRyYWRpbmdJeCxcbn0gZnJvbSBcIi4vaW5zdHJ1Y3Rpb25zXCI7XG5cbmltcG9ydCB7IEFtbUlETCB9IGZyb20gXCIuLi9nZW5lcmF0ZWQvaWRsc1wiO1xuXG5jb25zdCBERUZBVUxUX0NPTVBVVEVfVU5JVFMgPSAzMDBfMDAwO1xuXG5leHBvcnQgY2xhc3MgQU1NQ2xpZW50IHtcbiAgcHVibGljIHByb2dyYW06IFByb2dyYW08QW1tPjtcbiAgcHVibGljIHByb2dyYW1JZDogUHVibGljS2V5O1xuICBwdWJsaWMgY29tcHV0ZVVuaXRzOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdmlkZXI6IEFuY2hvclByb3ZpZGVyLFxuICAgIHByb2dyYW1JZD86IFB1YmxpY0tleSxcbiAgICBjb21wdXRlVW5pdHM/OiBudW1iZXJcbiAgKSB7XG4gICAgdGhpcy5wcm9ncmFtSWQgPSBwcm9ncmFtSWQgPz8gUFJPR1JBTV9JRDtcbiAgICB0aGlzLmNvbXB1dGVVbml0cyA9IGNvbXB1dGVVbml0cyA/PyBERUZBVUxUX0NPTVBVVEVfVU5JVFM7XG4gICAgdGhpcy5wcm9ncmFtID0gbmV3IFByb2dyYW0oQW1tSURMIGFzIEFtbSwgcHJvdmlkZXIpO1xuICB9XG5cbiAgLyogUERBIEhlbHBlcnMgKi9cblxuICBkZXJpdmVQb29sUERBKFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgbWludEE6IFB1YmxpY0tleSxcbiAgICBtaW50QjogUHVibGljS2V5XG4gICk6IFtQdWJsaWNLZXksIG51bWJlcl0ge1xuICAgIHJldHVybiBkZXJpdmVQb29sUERBKGFkbWluLCBtaW50QSwgbWludEIsIHRoaXMucHJvZ3JhbUlkKTtcbiAgfVxuXG4gIGRlcml2ZVJlc2VydmVQREEocG9vbDogUHVibGljS2V5LCBtaW50OiBQdWJsaWNLZXkpOiBbUHVibGljS2V5LCBudW1iZXJdIHtcbiAgICByZXR1cm4gZGVyaXZlUmVzZXJ2ZVBEQShwb29sLCBtaW50LCB0aGlzLnByb2dyYW1JZCk7XG4gIH1cblxuICBkZXJpdmVGZWVWYXVsdFBEQShwb29sOiBQdWJsaWNLZXkpOiBbUHVibGljS2V5LCBudW1iZXJdIHtcbiAgICByZXR1cm4gZGVyaXZlRmVlVmF1bHRQREEocG9vbCwgdGhpcy5wcm9ncmFtSWQpO1xuICB9XG5cbiAgLyogU3RhdGUgRmV0Y2hpbmcgKi9cblxuICBhc3luYyBmZXRjaFBvb2wocG9vbFBkYTogUHVibGljS2V5KTogUHJvbWlzZTxQb29sQWNjb3VudD4ge1xuICAgIHJldHVybiBmZXRjaFBvb2xBY2NvdW50KHRoaXMucHJvZ3JhbSwgcG9vbFBkYSk7XG4gIH1cblxuICBhc3luYyBmZXRjaFJlc2VydmVzKHBvb2xQZGE6IFB1YmxpY0tleSk6IFByb21pc2U8eyByZXNlcnZlQTogQk47IHJlc2VydmVCOiBCTiB9PiB7XG4gICAgY29uc3QgcG9vbCA9IGF3YWl0IHRoaXMuZmV0Y2hQb29sKHBvb2xQZGEpO1xuICAgIGNvbnN0IFtyZXNlcnZlQVBkYV0gPSB0aGlzLmRlcml2ZVJlc2VydmVQREEocG9vbFBkYSwgcG9vbC5taW50QSk7XG4gICAgY29uc3QgW3Jlc2VydmVCUGRhXSA9IHRoaXMuZGVyaXZlUmVzZXJ2ZVBEQShwb29sUGRhLCBwb29sLm1pbnRCKTtcblxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLnByb2dyYW0ucHJvdmlkZXIuY29ubmVjdGlvbjtcblxuICAgIGNvbnN0IFtyZXNlcnZlQUFjY291bnQsIHJlc2VydmVCQWNjb3VudF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBnZXRBY2NvdW50KGNvbm5lY3Rpb24sIHJlc2VydmVBUGRhKSxcbiAgICAgIGdldEFjY291bnQoY29ubmVjdGlvbiwgcmVzZXJ2ZUJQZGEpLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc2VydmVBOiBuZXcgQk4ocmVzZXJ2ZUFBY2NvdW50LmFtb3VudC50b1N0cmluZygpKSxcbiAgICAgIHJlc2VydmVCOiBuZXcgQk4ocmVzZXJ2ZUJBY2NvdW50LmFtb3VudC50b1N0cmluZygpKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hNaW50RGVjaW1hbHMocG9vbFBkYTogUHVibGljS2V5KTogUHJvbWlzZTx7IGRlY2ltYWxzQTogbnVtYmVyOyBkZWNpbWFsc0I6IG51bWJlciB9PiB7XG4gICAgY29uc3QgcG9vbCA9IGF3YWl0IHRoaXMuZmV0Y2hQb29sKHBvb2xQZGEpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLnByb2dyYW0ucHJvdmlkZXIuY29ubmVjdGlvbjtcbiAgICBjb25zdCBbbWludEEsIG1pbnRCXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGdldE1pbnQoY29ubmVjdGlvbiwgcG9vbC5taW50QSksXG4gICAgICBnZXRNaW50KGNvbm5lY3Rpb24sIHBvb2wubWludEIpLFxuICAgIF0pO1xuICAgIHJldHVybiB7IGRlY2ltYWxzQTogbWludEEuZGVjaW1hbHMsIGRlY2ltYWxzQjogbWludEIuZGVjaW1hbHMgfTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoU3BvdFByaWNlKHBvb2xQZGE6IFB1YmxpY0tleSk6IFByb21pc2U8Qk4+IHtcbiAgICBjb25zdCB7IHJlc2VydmVBLCByZXNlcnZlQiB9ID0gYXdhaXQgdGhpcy5mZXRjaFJlc2VydmVzKHBvb2xQZGEpO1xuICAgIGNvbnN0IHsgZGVjaW1hbHNBLCBkZWNpbWFsc0IgfSA9IGF3YWl0IHRoaXMuZmV0Y2hNaW50RGVjaW1hbHMocG9vbFBkYSk7XG4gICAgcmV0dXJuIGNhbGN1bGF0ZVNwb3RQcmljZShyZXNlcnZlQSwgcmVzZXJ2ZUIsIGRlY2ltYWxzQSwgZGVjaW1hbHNCKTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoVHdhcChwb29sUGRhOiBQdWJsaWNLZXkpOiBQcm9taXNlPEJOIHwgbnVsbD4ge1xuICAgIGNvbnN0IHBvb2wgPSBhd2FpdCB0aGlzLmZldGNoUG9vbChwb29sUGRhKTtcbiAgICByZXR1cm4gY2FsY3VsYXRlVHdhcChwb29sLm9yYWNsZSk7XG4gIH1cblxuICAvKiBRdW90ZSAqL1xuXG4gIGFzeW5jIHF1b3RlKFxuICAgIHBvb2xQZGE6IFB1YmxpY0tleSxcbiAgICBzd2FwQVRvQjogYm9vbGVhbixcbiAgICBpbnB1dEFtb3VudDogQk4gfCBudW1iZXIsXG4gICAgc2xpcHBhZ2VQZXJjZW50OiBudW1iZXIgPSAwLjUsXG4gICk6IFByb21pc2U8U3dhcFF1b3RlPiB7XG4gICAgY29uc3QgcG9vbCA9IGF3YWl0IHRoaXMuZmV0Y2hQb29sKHBvb2xQZGEpO1xuICAgIGNvbnN0IHsgcmVzZXJ2ZUEsIHJlc2VydmVCIH0gPSBhd2FpdCB0aGlzLmZldGNoUmVzZXJ2ZXMocG9vbFBkYSk7XG4gICAgY29uc3QgeyBkZWNpbWFsc0EsIGRlY2ltYWxzQiB9ID0gYXdhaXQgdGhpcy5mZXRjaE1pbnREZWNpbWFscyhwb29sUGRhKTtcblxuICAgIGNvbnN0IFtyZXNlcnZlSW4sIHJlc2VydmVPdXRdID0gc3dhcEFUb0JcbiAgICAgID8gW3Jlc2VydmVBLCByZXNlcnZlQl1cbiAgICAgIDogW3Jlc2VydmVCLCByZXNlcnZlQV07XG5cbiAgICBjb25zdCBbZGVjaW1hbHNJbiwgZGVjaW1hbHNPdXRdID0gc3dhcEFUb0JcbiAgICAgID8gW2RlY2ltYWxzQSwgZGVjaW1hbHNCXVxuICAgICAgOiBbZGVjaW1hbHNCLCBkZWNpbWFsc0FdO1xuXG4gICAgcmV0dXJuIGNyZWF0ZVN3YXBRdW90ZShcbiAgICAgIGlucHV0QW1vdW50LFxuICAgICAgcmVzZXJ2ZUluLFxuICAgICAgcmVzZXJ2ZU91dCxcbiAgICAgIHBvb2wuZmVlLFxuICAgICAgZGVjaW1hbHNJbixcbiAgICAgIGRlY2ltYWxzT3V0LFxuICAgICAgc3dhcEFUb0IsXG4gICAgICBzbGlwcGFnZVBlcmNlbnQsXG4gICAgKTtcbiAgfVxuXG4gIC8qIEluc3RydWN0aW9uIEJ1aWxkZXJzICovXG5cbiAgY3JlYXRlUG9vbChcbiAgICBwYXllcjogUHVibGljS2V5LFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgbWludEE6IFB1YmxpY0tleSxcbiAgICBtaW50QjogUHVibGljS2V5LFxuICAgIGZlZTogbnVtYmVyLFxuICAgIHN0YXJ0aW5nT2JzZXJ2YXRpb246IEJOLFxuICAgIG1heE9ic2VydmF0aW9uRGVsdGE6IEJOLFxuICAgIHdhcm11cER1cmF0aW9uOiBudW1iZXIsXG4gICAgbGlxdWlkaXR5UHJvdmlkZXI6IFB1YmxpY0tleSB8IG51bGwgPSBudWxsXG4gICkge1xuICAgIGNvbnN0IFtwb29sUGRhXSA9IHRoaXMuZGVyaXZlUG9vbFBEQShhZG1pbiwgbWludEEsIG1pbnRCKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUFdID0gdGhpcy5kZXJpdmVSZXNlcnZlUERBKHBvb2xQZGEsIG1pbnRBKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUJdID0gdGhpcy5kZXJpdmVSZXNlcnZlUERBKHBvb2xQZGEsIG1pbnRCKTtcbiAgICBjb25zdCBbZmVlVmF1bHRdID0gdGhpcy5kZXJpdmVGZWVWYXVsdFBEQShwb29sUGRhKTtcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVQb29sSXgoXG4gICAgICB0aGlzLnByb2dyYW0sXG4gICAgICBwYXllcixcbiAgICAgIGFkbWluLFxuICAgICAgbWludEEsXG4gICAgICBtaW50QixcbiAgICAgIHBvb2xQZGEsXG4gICAgICByZXNlcnZlQSxcbiAgICAgIHJlc2VydmVCLFxuICAgICAgZmVlVmF1bHQsXG4gICAgICBmZWUsXG4gICAgICBzdGFydGluZ09ic2VydmF0aW9uLFxuICAgICAgbWF4T2JzZXJ2YXRpb25EZWx0YSxcbiAgICAgIHdhcm11cER1cmF0aW9uLFxuICAgICAgbGlxdWlkaXR5UHJvdmlkZXJcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1aWxkZXIsXG4gICAgICBwb29sUGRhLFxuICAgICAgcmVzZXJ2ZUEsXG4gICAgICByZXNlcnZlQixcbiAgICAgIGZlZVZhdWx0LFxuICAgIH07XG4gIH1cblxuICBhc3luYyBhZGRMaXF1aWRpdHkoXG4gICAgZGVwb3NpdG9yOiBQdWJsaWNLZXksXG4gICAgcG9vbFBkYTogUHVibGljS2V5LFxuICAgIGFtb3VudEE6IEJOIHwgbnVtYmVyLFxuICAgIGFtb3VudEI6IEJOIHwgbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBBbW1BY3Rpb25PcHRpb25zXG4gICkge1xuICAgIGNvbnN0IHsgYXV0b1dyYXBVbndyYXAgPSB0cnVlLCBpbmNsdWRlQ3VCdWRnZXQgPSB0cnVlLCBjb21wdXRlVW5pdHMgfSA9IG9wdGlvbnMgPz8ge307XG5cbiAgICBjb25zdCBwb29sID0gYXdhaXQgdGhpcy5mZXRjaFBvb2wocG9vbFBkYSk7XG4gICAgY29uc3QgW3Jlc2VydmVBXSA9IHRoaXMuZGVyaXZlUmVzZXJ2ZVBEQShwb29sUGRhLCBwb29sLm1pbnRBKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUJdID0gdGhpcy5kZXJpdmVSZXNlcnZlUERBKHBvb2xQZGEsIHBvb2wubWludEIpO1xuICAgIGNvbnN0IGRlcG9zaXRvclRva2VuQWNjQSA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHBvb2wubWludEEsIGRlcG9zaXRvcik7XG4gICAgY29uc3QgZGVwb3NpdG9yVG9rZW5BY2NCID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMocG9vbC5taW50QiwgZGVwb3NpdG9yKTtcblxuICAgIGNvbnN0IHByZUl4czogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdID0gW107XG5cbiAgICBpZiAoaW5jbHVkZUN1QnVkZ2V0KSB7XG4gICAgICBwcmVJeHMucHVzaChcbiAgICAgICAgQ29tcHV0ZUJ1ZGdldFByb2dyYW0uc2V0Q29tcHV0ZVVuaXRMaW1pdCh7XG4gICAgICAgICAgdW5pdHM6IGNvbXB1dGVVbml0cyA/PyB0aGlzLmNvbXB1dGVVbml0cyxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGF1dG9XcmFwVW53cmFwICYmIHBvb2wubWludEEuZXF1YWxzKE5BVElWRV9NSU5UKSkge1xuICAgICAgY29uc3QgYW1vdW50QUJOID0gdHlwZW9mIGFtb3VudEEgPT09IFwibnVtYmVyXCIgPyBuZXcgQk4oYW1vdW50QSkgOiBhbW91bnRBO1xuICAgICAgcHJlSXhzLnB1c2goXG4gICAgICAgIGNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnRJZGVtcG90ZW50SW5zdHJ1Y3Rpb24oXG4gICAgICAgICAgZGVwb3NpdG9yLFxuICAgICAgICAgIGRlcG9zaXRvclRva2VuQWNjQSxcbiAgICAgICAgICBkZXBvc2l0b3IsXG4gICAgICAgICAgcG9vbC5taW50QVxuICAgICAgICApLFxuICAgICAgICBTeXN0ZW1Qcm9ncmFtLnRyYW5zZmVyKHtcbiAgICAgICAgICBmcm9tUHVia2V5OiBkZXBvc2l0b3IsXG4gICAgICAgICAgdG9QdWJrZXk6IGRlcG9zaXRvclRva2VuQWNjQSxcbiAgICAgICAgICBsYW1wb3J0czogQmlnSW50KGFtb3VudEFCTi50b1N0cmluZygpKSxcbiAgICAgICAgfSksXG4gICAgICAgIGNyZWF0ZVN5bmNOYXRpdmVJbnN0cnVjdGlvbihkZXBvc2l0b3JUb2tlbkFjY0EpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhdXRvV3JhcFVud3JhcCAmJiBwb29sLm1pbnRCLmVxdWFscyhOQVRJVkVfTUlOVCkpIHtcbiAgICAgIGNvbnN0IGFtb3VudEJCTiA9IHR5cGVvZiBhbW91bnRCID09PSBcIm51bWJlclwiID8gbmV3IEJOKGFtb3VudEIpIDogYW1vdW50QjtcbiAgICAgIHByZUl4cy5wdXNoKFxuICAgICAgICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SWRlbXBvdGVudEluc3RydWN0aW9uKFxuICAgICAgICAgIGRlcG9zaXRvcixcbiAgICAgICAgICBkZXBvc2l0b3JUb2tlbkFjY0IsXG4gICAgICAgICAgZGVwb3NpdG9yLFxuICAgICAgICAgIHBvb2wubWludEJcbiAgICAgICAgKSxcbiAgICAgICAgU3lzdGVtUHJvZ3JhbS50cmFuc2Zlcih7XG4gICAgICAgICAgZnJvbVB1YmtleTogZGVwb3NpdG9yLFxuICAgICAgICAgIHRvUHVia2V5OiBkZXBvc2l0b3JUb2tlbkFjY0IsXG4gICAgICAgICAgbGFtcG9ydHM6IEJpZ0ludChhbW91bnRCQk4udG9TdHJpbmcoKSksXG4gICAgICAgIH0pLFxuICAgICAgICBjcmVhdGVTeW5jTmF0aXZlSW5zdHJ1Y3Rpb24oZGVwb3NpdG9yVG9rZW5BY2NCKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgYnVpbGRlciA9IGFkZExpcXVpZGl0eUl4KFxuICAgICAgdGhpcy5wcm9ncmFtLFxuICAgICAgZGVwb3NpdG9yLFxuICAgICAgcG9vbFBkYSxcbiAgICAgIHJlc2VydmVBLFxuICAgICAgcmVzZXJ2ZUIsXG4gICAgICBkZXBvc2l0b3JUb2tlbkFjY0EsXG4gICAgICBkZXBvc2l0b3JUb2tlbkFjY0IsXG4gICAgICBhbW91bnRBLFxuICAgICAgYW1vdW50QlxuICAgICk7XG5cbiAgICByZXR1cm4gcHJlSXhzLmxlbmd0aCA+IDAgPyBidWlsZGVyLnByZUluc3RydWN0aW9ucyhwcmVJeHMpIDogYnVpbGRlcjtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZUxpcXVpZGl0eShcbiAgICBkZXBvc2l0b3I6IFB1YmxpY0tleSxcbiAgICBwb29sUGRhOiBQdWJsaWNLZXksXG4gICAgYW1vdW50QTogQk4gfCBudW1iZXIsXG4gICAgYW1vdW50QjogQk4gfCBudW1iZXIsXG4gICAgb3B0aW9ucz86IEFtbUFjdGlvbk9wdGlvbnNcbiAgKSB7XG4gICAgY29uc3QgeyBhdXRvV3JhcFVud3JhcCA9IHRydWUsIGluY2x1ZGVDdUJ1ZGdldCA9IHRydWUsIGNvbXB1dGVVbml0cyB9ID0gb3B0aW9ucyA/PyB7fTtcblxuICAgIGNvbnN0IHBvb2wgPSBhd2FpdCB0aGlzLmZldGNoUG9vbChwb29sUGRhKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUFdID0gdGhpcy5kZXJpdmVSZXNlcnZlUERBKHBvb2xQZGEsIHBvb2wubWludEEpO1xuICAgIGNvbnN0IFtyZXNlcnZlQl0gPSB0aGlzLmRlcml2ZVJlc2VydmVQREEocG9vbFBkYSwgcG9vbC5taW50Qik7XG4gICAgY29uc3QgZGVwb3NpdG9yVG9rZW5BY2NBID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMocG9vbC5taW50QSwgZGVwb3NpdG9yKTtcbiAgICBjb25zdCBkZXBvc2l0b3JUb2tlbkFjY0IgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhwb29sLm1pbnRCLCBkZXBvc2l0b3IpO1xuXG4gICAgbGV0IGJ1aWxkZXIgPSByZW1vdmVMaXF1aWRpdHlJeChcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGRlcG9zaXRvcixcbiAgICAgIHBvb2xQZGEsXG4gICAgICByZXNlcnZlQSxcbiAgICAgIHJlc2VydmVCLFxuICAgICAgZGVwb3NpdG9yVG9rZW5BY2NBLFxuICAgICAgZGVwb3NpdG9yVG9rZW5BY2NCLFxuICAgICAgYW1vdW50QSxcbiAgICAgIGFtb3VudEJcbiAgICApO1xuXG4gICAgaWYgKGluY2x1ZGVDdUJ1ZGdldCkge1xuICAgICAgYnVpbGRlciA9IGJ1aWxkZXIucHJlSW5zdHJ1Y3Rpb25zKFtcbiAgICAgICAgQ29tcHV0ZUJ1ZGdldFByb2dyYW0uc2V0Q29tcHV0ZVVuaXRMaW1pdCh7XG4gICAgICAgICAgdW5pdHM6IGNvbXB1dGVVbml0cyA/PyB0aGlzLmNvbXB1dGVVbml0cyxcbiAgICAgICAgfSksXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3N0SXhzOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10gPSBbXTtcblxuICAgIGlmIChhdXRvV3JhcFVud3JhcCAmJiBwb29sLm1pbnRBLmVxdWFscyhOQVRJVkVfTUlOVCkpIHtcbiAgICAgIHBvc3RJeHMucHVzaChjcmVhdGVDbG9zZUFjY291bnRJbnN0cnVjdGlvbihkZXBvc2l0b3JUb2tlbkFjY0EsIGRlcG9zaXRvciwgZGVwb3NpdG9yKSk7XG4gICAgfVxuXG4gICAgaWYgKGF1dG9XcmFwVW53cmFwICYmIHBvb2wubWludEIuZXF1YWxzKE5BVElWRV9NSU5UKSkge1xuICAgICAgcG9zdEl4cy5wdXNoKGNyZWF0ZUNsb3NlQWNjb3VudEluc3RydWN0aW9uKGRlcG9zaXRvclRva2VuQWNjQiwgZGVwb3NpdG9yLCBkZXBvc2l0b3IpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zdEl4cy5sZW5ndGggPiAwID8gYnVpbGRlci5wb3N0SW5zdHJ1Y3Rpb25zKHBvc3RJeHMpIDogYnVpbGRlcjtcbiAgfVxuXG4gIGFzeW5jIHN3YXAoXG4gICAgdHJhZGVyOiBQdWJsaWNLZXksXG4gICAgcG9vbFBkYTogUHVibGljS2V5LFxuICAgIHN3YXBBVG9COiBib29sZWFuLFxuICAgIGlucHV0QW1vdW50OiBCTiB8IG51bWJlcixcbiAgICBtaW5PdXRwdXRBbW91bnQ6IEJOIHwgbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBBbW1BY3Rpb25PcHRpb25zXG4gICkge1xuICAgIGNvbnN0IHsgYXV0b1dyYXBVbndyYXAgPSB0cnVlLCBpbmNsdWRlQ3VCdWRnZXQgPSB0cnVlLCBjb21wdXRlVW5pdHMgfSA9IG9wdGlvbnMgPz8ge307XG5cbiAgICBjb25zdCBwb29sID0gYXdhaXQgdGhpcy5mZXRjaFBvb2wocG9vbFBkYSk7XG4gICAgY29uc3QgW3Jlc2VydmVBXSA9IHRoaXMuZGVyaXZlUmVzZXJ2ZVBEQShwb29sUGRhLCBwb29sLm1pbnRBKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUJdID0gdGhpcy5kZXJpdmVSZXNlcnZlUERBKHBvb2xQZGEsIHBvb2wubWludEIpO1xuICAgIGNvbnN0IFtmZWVWYXVsdF0gPSB0aGlzLmRlcml2ZUZlZVZhdWx0UERBKHBvb2xQZGEpO1xuICAgIGNvbnN0IHRyYWRlckFjY291bnRBID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMocG9vbC5taW50QSwgdHJhZGVyKTtcbiAgICBjb25zdCB0cmFkZXJBY2NvdW50QiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHBvb2wubWludEIsIHRyYWRlcik7XG5cbiAgICBjb25zdCBwcmVJeHM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSA9IFtdO1xuICAgIGNvbnN0IHBvc3RJeHM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSA9IFtdO1xuXG4gICAgaWYgKGluY2x1ZGVDdUJ1ZGdldCkge1xuICAgICAgcHJlSXhzLnB1c2goXG4gICAgICAgIENvbXB1dGVCdWRnZXRQcm9ncmFtLnNldENvbXB1dGVVbml0TGltaXQoe1xuICAgICAgICAgIHVuaXRzOiBjb21wdXRlVW5pdHMgPz8gdGhpcy5jb21wdXRlVW5pdHMsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0TWludCA9IHN3YXBBVG9CID8gcG9vbC5taW50QSA6IHBvb2wubWludEI7XG4gICAgY29uc3Qgb3V0cHV0TWludCA9IHN3YXBBVG9CID8gcG9vbC5taW50QiA6IHBvb2wubWludEE7XG4gICAgY29uc3QgaW5wdXRBdGEgPSBzd2FwQVRvQiA/IHRyYWRlckFjY291bnRBIDogdHJhZGVyQWNjb3VudEI7XG4gICAgY29uc3Qgb3V0cHV0QXRhID0gc3dhcEFUb0IgPyB0cmFkZXJBY2NvdW50QiA6IHRyYWRlckFjY291bnRBO1xuXG4gICAgaWYgKGF1dG9XcmFwVW53cmFwKSB7XG4gICAgICAvLyBDcmVhdGUgQVRBcyBpZGVtcG90ZW50bHlcbiAgICAgIHByZUl4cy5wdXNoKFxuICAgICAgICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SWRlbXBvdGVudEluc3RydWN0aW9uKFxuICAgICAgICAgIHRyYWRlcixcbiAgICAgICAgICB0cmFkZXJBY2NvdW50QSxcbiAgICAgICAgICB0cmFkZXIsXG4gICAgICAgICAgcG9vbC5taW50QVxuICAgICAgICApLFxuICAgICAgICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SWRlbXBvdGVudEluc3RydWN0aW9uKFxuICAgICAgICAgIHRyYWRlcixcbiAgICAgICAgICB0cmFkZXJBY2NvdW50QixcbiAgICAgICAgICB0cmFkZXIsXG4gICAgICAgICAgcG9vbC5taW50QlxuICAgICAgICApXG4gICAgICApO1xuXG4gICAgICAvLyBXcmFwIGlucHV0IFNPTCBpZiBuZWVkZWRcbiAgICAgIGlmIChpbnB1dE1pbnQuZXF1YWxzKE5BVElWRV9NSU5UKSkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHR5cGVvZiBpbnB1dEFtb3VudCA9PT0gXCJudW1iZXJcIiA/IG5ldyBCTihpbnB1dEFtb3VudCkgOiBpbnB1dEFtb3VudDtcbiAgICAgICAgcHJlSXhzLnB1c2goXG4gICAgICAgICAgU3lzdGVtUHJvZ3JhbS50cmFuc2Zlcih7XG4gICAgICAgICAgICBmcm9tUHVia2V5OiB0cmFkZXIsXG4gICAgICAgICAgICB0b1B1YmtleTogaW5wdXRBdGEsXG4gICAgICAgICAgICBsYW1wb3J0czogQmlnSW50KGlucHV0LnRvU3RyaW5nKCkpLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGNyZWF0ZVN5bmNOYXRpdmVJbnN0cnVjdGlvbihpbnB1dEF0YSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVW53cmFwIG91dHB1dCBTT0wgaWYgbmVlZGVkXG4gICAgICBpZiAob3V0cHV0TWludC5lcXVhbHMoTkFUSVZFX01JTlQpKSB7XG4gICAgICAgIHBvc3RJeHMucHVzaChjcmVhdGVDbG9zZUFjY291bnRJbnN0cnVjdGlvbihvdXRwdXRBdGEsIHRyYWRlciwgdHJhZGVyKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGJ1aWxkZXIgPSBzd2FwSXgoXG4gICAgICB0aGlzLnByb2dyYW0sXG4gICAgICB0cmFkZXIsXG4gICAgICBwb29sUGRhLFxuICAgICAgcmVzZXJ2ZUEsXG4gICAgICByZXNlcnZlQixcbiAgICAgIGZlZVZhdWx0LFxuICAgICAgdHJhZGVyQWNjb3VudEEsXG4gICAgICB0cmFkZXJBY2NvdW50QixcbiAgICAgIHN3YXBBVG9CLFxuICAgICAgaW5wdXRBbW91bnQsXG4gICAgICBtaW5PdXRwdXRBbW91bnRcbiAgICApO1xuXG4gICAgaWYgKHByZUl4cy5sZW5ndGggPiAwKSB7XG4gICAgICBidWlsZGVyID0gYnVpbGRlci5wcmVJbnN0cnVjdGlvbnMocHJlSXhzKTtcbiAgICB9XG4gICAgaWYgKHBvc3RJeHMubGVuZ3RoID4gMCkge1xuICAgICAgYnVpbGRlciA9IGJ1aWxkZXIucG9zdEluc3RydWN0aW9ucyhwb3N0SXhzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfVxuXG4gIGFzeW5jIGNyYW5rVHdhcChwb29sUGRhOiBQdWJsaWNLZXkpIHtcbiAgICBjb25zdCBwb29sID0gYXdhaXQgdGhpcy5mZXRjaFBvb2wocG9vbFBkYSk7XG4gICAgY29uc3QgW3Jlc2VydmVBXSA9IHRoaXMuZGVyaXZlUmVzZXJ2ZVBEQShwb29sUGRhLCBwb29sLm1pbnRBKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUJdID0gdGhpcy5kZXJpdmVSZXNlcnZlUERBKHBvb2xQZGEsIHBvb2wubWludEIpO1xuXG4gICAgcmV0dXJuIGNyYW5rVHdhcEl4KHRoaXMucHJvZ3JhbSwgcG9vbFBkYSwgcmVzZXJ2ZUEsIHJlc2VydmVCKTtcbiAgfVxuXG4gIGNlYXNlVHJhZGluZyhhZG1pbjogUHVibGljS2V5LCBwb29sUGRhOiBQdWJsaWNLZXkpIHtcbiAgICByZXR1cm4gY2Vhc2VUcmFkaW5nSXgodGhpcy5wcm9ncmFtLCBhZG1pbiwgcG9vbFBkYSk7XG4gIH1cblxuICAvKiBIaWdoLUxldmVsIFN3YXAgd2l0aCBTbGlwcGFnZSAqL1xuXG4gIC8qKlxuICAgKiBIaWdoLWxldmVsIHN3YXAgZnVuY3Rpb24gdGhhdDpcbiAgICogLSBGZXRjaGVzIGN1cnJlbnQgcmVzZXJ2ZXMgYW5kIGNvbXB1dGVzIHF1b3RlXG4gICAqIC0gQ2FsY3VsYXRlcyBtaW5PdXRwdXQgYmFzZWQgb24gc2xpcHBhZ2UgdG9sZXJhbmNlXG4gICAqIC0gQWRkcyBjb21wdXRlIGJ1ZGdldCBpbnN0cnVjdGlvbiAoaWYgaW5jbHVkZUN1QnVkZ2V0IGlzIHRydWUpXG4gICAqIC0gQ3JlYXRlcyB0b2tlbiBhY2NvdW50cyBpZiB0aGV5IGRvbid0IGV4aXN0IChpZiBhdXRvV3JhcFVud3JhcCBpcyB0cnVlKVxuICAgKiAtIEhhbmRsZXMgV1NPTCB3cmFwcGluZy91bndyYXBwaW5nIGlmIG5lZWRlZCAoaWYgYXV0b1dyYXBVbndyYXAgaXMgdHJ1ZSlcbiAgICovXG4gIGFzeW5jIHN3YXBXaXRoU2xpcHBhZ2UoXG4gICAgdHJhZGVyOiBQdWJsaWNLZXksXG4gICAgcG9vbFBkYTogUHVibGljS2V5LFxuICAgIHN3YXBBVG9COiBib29sZWFuLFxuICAgIGlucHV0QW1vdW50OiBCTiB8IG51bWJlcixcbiAgICBzbGlwcGFnZVBlcmNlbnQ6IG51bWJlciA9IDAuNSxcbiAgICBvcHRpb25zPzogQW1tQWN0aW9uT3B0aW9uc1xuICApIHtcbiAgICBjb25zdCB7IGF1dG9XcmFwVW53cmFwID0gdHJ1ZSwgaW5jbHVkZUN1QnVkZ2V0ID0gdHJ1ZSwgY29tcHV0ZVVuaXRzIH0gPSBvcHRpb25zID8/IHt9O1xuXG4gICAgY29uc3QgcG9vbCA9IGF3YWl0IHRoaXMuZmV0Y2hQb29sKHBvb2xQZGEpO1xuICAgIGNvbnN0IGlucHV0ID0gdHlwZW9mIGlucHV0QW1vdW50ID09PSBcIm51bWJlclwiID8gbmV3IEJOKGlucHV0QW1vdW50KSA6IGlucHV0QW1vdW50O1xuXG4gICAgLy8gR2V0IHF1b3RlIHdpdGggc2xpcHBhZ2VcbiAgICBjb25zdCBxdW90ZVJlc3VsdCA9IGF3YWl0IHRoaXMucXVvdGUocG9vbFBkYSwgc3dhcEFUb0IsIGlucHV0LCBzbGlwcGFnZVBlcmNlbnQpO1xuXG4gICAgLy8gRGVyaXZlIGFjY291bnRzXG4gICAgY29uc3QgW3Jlc2VydmVBXSA9IHRoaXMuZGVyaXZlUmVzZXJ2ZVBEQShwb29sUGRhLCBwb29sLm1pbnRBKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUJdID0gdGhpcy5kZXJpdmVSZXNlcnZlUERBKHBvb2xQZGEsIHBvb2wubWludEIpO1xuICAgIGNvbnN0IFtmZWVWYXVsdF0gPSB0aGlzLmRlcml2ZUZlZVZhdWx0UERBKHBvb2xQZGEpO1xuICAgIGNvbnN0IHRyYWRlckFjY291bnRBID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMocG9vbC5taW50QSwgdHJhZGVyKTtcbiAgICBjb25zdCB0cmFkZXJBY2NvdW50QiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHBvb2wubWludEIsIHRyYWRlcik7XG5cbiAgICAvLyBCdWlsZCBiYXNlIHN3YXAgaW5zdHJ1Y3Rpb25cbiAgICBsZXQgYnVpbGRlciA9IHN3YXBJeChcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIHRyYWRlcixcbiAgICAgIHBvb2xQZGEsXG4gICAgICByZXNlcnZlQSxcbiAgICAgIHJlc2VydmVCLFxuICAgICAgZmVlVmF1bHQsXG4gICAgICB0cmFkZXJBY2NvdW50QSxcbiAgICAgIHRyYWRlckFjY291bnRCLFxuICAgICAgc3dhcEFUb0IsXG4gICAgICBpbnB1dCxcbiAgICAgIHF1b3RlUmVzdWx0Lm1pbk91dHB1dEFtb3VudFxuICAgICk7XG5cbiAgICBjb25zdCBwcmVJeHM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSA9IFtdO1xuICAgIGNvbnN0IHBvc3RJeHM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSA9IFtdO1xuXG4gICAgaWYgKGluY2x1ZGVDdUJ1ZGdldCkge1xuICAgICAgcHJlSXhzLnB1c2goXG4gICAgICAgIENvbXB1dGVCdWRnZXRQcm9ncmFtLnNldENvbXB1dGVVbml0TGltaXQoe1xuICAgICAgICAgIHVuaXRzOiBjb21wdXRlVW5pdHMgPz8gdGhpcy5jb21wdXRlVW5pdHMsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhdXRvV3JhcFVud3JhcCkge1xuICAgICAgcHJlSXhzLnB1c2goXG4gICAgICAgIGNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnRJZGVtcG90ZW50SW5zdHJ1Y3Rpb24oXG4gICAgICAgICAgdHJhZGVyLFxuICAgICAgICAgIHRyYWRlckFjY291bnRBLFxuICAgICAgICAgIHRyYWRlcixcbiAgICAgICAgICBwb29sLm1pbnRBXG4gICAgICAgICksXG4gICAgICAgIGNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnRJZGVtcG90ZW50SW5zdHJ1Y3Rpb24oXG4gICAgICAgICAgdHJhZGVyLFxuICAgICAgICAgIHRyYWRlckFjY291bnRCLFxuICAgICAgICAgIHRyYWRlcixcbiAgICAgICAgICBwb29sLm1pbnRCXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIFdTT0wgZm9yIGlucHV0L291dHB1dCB0b2tlbnNcbiAgICBjb25zdCBpbnB1dE1pbnQgPSBzd2FwQVRvQiA/IHBvb2wubWludEEgOiBwb29sLm1pbnRCO1xuICAgIGNvbnN0IG91dHB1dE1pbnQgPSBzd2FwQVRvQiA/IHBvb2wubWludEIgOiBwb29sLm1pbnRBO1xuICAgIGNvbnN0IGlucHV0QXRhID0gc3dhcEFUb0IgPyB0cmFkZXJBY2NvdW50QSA6IHRyYWRlckFjY291bnRCO1xuICAgIGNvbnN0IG91dHB1dEF0YSA9IHN3YXBBVG9CID8gdHJhZGVyQWNjb3VudEIgOiB0cmFkZXJBY2NvdW50QTtcblxuICAgIGlmIChhdXRvV3JhcFVud3JhcCAmJiBpbnB1dE1pbnQuZXF1YWxzKE5BVElWRV9NSU5UKSkge1xuICAgICAgLy8gV3JhcCBTT0wgYmVmb3JlIHN3YXBcbiAgICAgIHByZUl4cy5wdXNoKFxuICAgICAgICBTeXN0ZW1Qcm9ncmFtLnRyYW5zZmVyKHtcbiAgICAgICAgICBmcm9tUHVia2V5OiB0cmFkZXIsXG4gICAgICAgICAgdG9QdWJrZXk6IGlucHV0QXRhLFxuICAgICAgICAgIGxhbXBvcnRzOiBCaWdJbnQoaW5wdXQudG9TdHJpbmcoKSksXG4gICAgICAgIH0pLFxuICAgICAgICBjcmVhdGVTeW5jTmF0aXZlSW5zdHJ1Y3Rpb24oaW5wdXRBdGEpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhdXRvV3JhcFVud3JhcCAmJiBvdXRwdXRNaW50LmVxdWFscyhOQVRJVkVfTUlOVCkpIHtcbiAgICAgIC8vIFVud3JhcCBTT0wgYWZ0ZXIgc3dhcFxuICAgICAgcG9zdEl4cy5wdXNoKGNyZWF0ZUNsb3NlQWNjb3VudEluc3RydWN0aW9uKG91dHB1dEF0YSwgdHJhZGVyLCB0cmFkZXIpKTtcbiAgICB9XG5cbiAgICBpZiAocHJlSXhzLmxlbmd0aCA+IDApIHtcbiAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLnByZUluc3RydWN0aW9ucyhwcmVJeHMpO1xuICAgIH1cbiAgICBpZiAocG9zdEl4cy5sZW5ndGggPiAwKSB7XG4gICAgICBidWlsZGVyID0gYnVpbGRlci5wb3N0SW5zdHJ1Y3Rpb25zKHBvc3RJeHMpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBidWlsZGVyLFxuICAgICAgcXVvdGU6IHF1b3RlUmVzdWx0LFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FtbS9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQUVILDhDQUFnRTtBQUNoRSw2Q0FLeUI7QUFDekIsaURBUTJCO0FBQzNCLDJDQUF5QztBQUV6QyxtQ0FRaUI7QUFDakIsaURBT3dCO0FBRXhCLDRDQUEyQztBQUUzQyxNQUFNLHFCQUFxQixHQUFHLE1BQU8sQ0FBQztBQUV0QyxNQUFhLFNBQVM7SUFLcEIsWUFDRSxRQUF3QixFQUN4QixTQUFxQixFQUNyQixZQUFxQjtRQUVyQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsSUFBSSxzQkFBVSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxJQUFJLHFCQUFxQixDQUFDO1FBQzFELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxnQkFBTyxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsaUJBQWlCO0lBRWpCLGFBQWEsQ0FDWCxLQUFnQixFQUNoQixLQUFnQixFQUNoQixLQUFnQjtRQUVoQixPQUFPLElBQUEscUJBQWEsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQWUsRUFBRSxJQUFlO1FBQy9DLE9BQU8sSUFBQSx3QkFBZ0IsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsSUFBZTtRQUMvQixPQUFPLElBQUEseUJBQWlCLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsb0JBQW9CO0lBRXBCLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBa0I7UUFDaEMsT0FBTyxJQUFB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QUFNLENBQUMsQ0FBQztRQUV6RSw4QkFBOEI7UUFDOUIsSUFBSSxPQUFPLEdBQUcsSUFBQSxtQkFBTSxFQUNsQixJQUFJLENBQUMsT0FBTyxFQUNaLE1BQU0sRUFDTixPQUFPLEVBQ1AsUUFBUSxFQUNSLFFBQVEsRUFDUixRQUFRLEVBQ1IsY0FBYyxFQUNkLGNBQWMsRUFDZCxRQUFRLEVBQ1IsS0FBSyxFQUNMLFdBQVcsQ0FBQyxlQUFlLENBQzVCLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBNkIsRUFBRSxDQUFDO1FBRTVDLElBQUksZUFBZSxFQUFFLENBQUM7WUFDcEIsTUFBTSxDQUFDLElBQUksQ0FDVCw4QkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDdkMsS0FBSyxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWTthQUN6QyxDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLHVCQUF1QixFQUFFLENBQUM7WUFDNUIsTUFBTSxDQUFDLElBQUksQ0FDVCxJQUFBLDZEQUFpRCxFQUMvQyxNQUFNLEVBQ04sY0FBYyxFQUNkLE1BQU0sRUFDTixJQUFJLENBQUMsS0FBSyxDQUNYLEVBQ0QsSUFBQSw2REFBaUQsRUFDL0MsTUFBTSxFQUNOLGNBQWMsRUFDZCxNQUFNLEVBQ04sSUFBSSxDQUFDLEtBQUssQ0FDWCxDQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTztZQUNQLEtBQUssRUFBRSxXQUFXO1NBQ25CLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUF0YkQsOEJBc2JDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIEhpZ2gtbGV2ZWwgY2xpZW50IGZvciB0aGUgQU1NIHByb2dyYW0uXG4gKiBQcm92aWRlcyBlcmdvbm9taWMgbWV0aG9kcyBmb3IgcG9vbCBvcGVyYXRpb25zIHdpdGggYXV0b21hdGljIFBEQSBkZXJpdmF0aW9uLFxuICogbmF0aXZlIFNPTCB3cmFwcGluZy91bndyYXBwaW5nLCBhbmQgY29tcHV0ZSBidWRnZXQgbWFuYWdlbWVudC5cbiAqL1xuXG5pbXBvcnQgeyBQcm9ncmFtLCBBbmNob3JQcm92aWRlciwgQk4gfSBmcm9tIFwiQGNvcmFsLXh5ei9hbmNob3JcIjtcbmltcG9ydCB7XG4gIFB1YmxpY0tleSxcbiAgQ29tcHV0ZUJ1ZGdldFByb2dyYW0sXG4gIFN5c3RlbVByb2dyYW0sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG59IGZyb20gXCJAc29sYW5hL3dlYjMuanNcIjtcbmltcG9ydCB7XG4gIGdldEFjY291bnQsXG4gIGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jLFxuICBnZXRNaW50LFxuICBOQVRJVkVfTUlOVCxcbiAgY3JlYXRlU3luY05hdGl2ZUluc3RydWN0aW9uLFxuICBjcmVhdGVDbG9zZUFjY291bnRJbnN0cnVjdGlvbixcbiAgY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudElkZW1wb3RlbnRJbnN0cnVjdGlvbixcbn0gZnJvbSBcIkBzb2xhbmEvc3BsLXRva2VuXCI7XG5pbXBvcnQgeyBQUk9HUkFNX0lEIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBbW0sIFBvb2xBY2NvdW50LCBTd2FwUXVvdGUsIEFtbUFjdGlvbk9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZGVyaXZlUG9vbFBEQSxcbiAgZGVyaXZlUmVzZXJ2ZVBEQSxcbiAgZGVyaXZlRmVlVmF1bHRQREEsXG4gIGZldGNoUG9vbEFjY291bnQsXG4gIGNyZWF0ZVN3YXBRdW90ZSxcbiAgY2FsY3VsYXRlU3BvdFByaWNlLFxuICBjYWxjdWxhdGVUd2FwLFxufSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgY3JlYXRlUG9vbCBhcyBjcmVhdGVQb29sSXgsXG4gIGFkZExpcXVpZGl0eSBhcyBhZGRMaXF1aWRpdHlJeCxcbiAgcmVtb3ZlTGlxdWlkaXR5IGFzIHJlbW92ZUxpcXVpZGl0eUl4LFxuICBzd2FwIGFzIHN3YXBJeCxcbiAgY3JhbmtUd2FwIGFzIGNyYW5rVHdhcEl4LFxuICBjZWFzZVRyYWRpbmcgYXMgY2Vhc2VUcmFkaW5nSXgsXG59IGZyb20gXCIuL2luc3RydWN0aW9uc1wiO1xuXG5pbXBvcnQgeyBBbW1JREwgfSBmcm9tIFwiLi4vZ2VuZXJhdGVkL2lkbHNcIjtcblxuY29uc3QgREVGQVVMVF9DT01QVVRFX1VOSVRTID0gMzAwXzAwMDtcblxuZXhwb3J0IGNsYXNzIEFNTUNsaWVudCB7XG4gIHB1YmxpYyBwcm9ncmFtOiBQcm9ncmFtPEFtbT47XG4gIHB1YmxpYyBwcm9ncmFtSWQ6IFB1YmxpY0tleTtcbiAgcHVibGljIGNvbXB1dGVVbml0czogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3ZpZGVyOiBBbmNob3JQcm92aWRlcixcbiAgICBwcm9ncmFtSWQ/OiBQdWJsaWNLZXksXG4gICAgY29tcHV0ZVVuaXRzPzogbnVtYmVyXG4gICkge1xuICAgIHRoaXMucHJvZ3JhbUlkID0gcHJvZ3JhbUlkID8/IFBST0dSQU1fSUQ7XG4gICAgdGhpcy5jb21wdXRlVW5pdHMgPSBjb21wdXRlVW5pdHMgPz8gREVGQVVMVF9DT01QVVRFX1VOSVRTO1xuICAgIHRoaXMucHJvZ3JhbSA9IG5ldyBQcm9ncmFtKEFtbUlETCBhcyBBbW0sIHByb3ZpZGVyKTtcbiAgfVxuXG4gIC8qIFBEQSBIZWxwZXJzICovXG5cbiAgZGVyaXZlUG9vbFBEQShcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIG1pbnRBOiBQdWJsaWNLZXksXG4gICAgbWludEI6IFB1YmxpY0tleVxuICApOiBbUHVibGljS2V5LCBudW1iZXJdIHtcbiAgICByZXR1cm4gZGVyaXZlUG9vbFBEQShhZG1pbiwgbWludEEsIG1pbnRCLCB0aGlzLnByb2dyYW1JZCk7XG4gIH1cblxuICBkZXJpdmVSZXNlcnZlUERBKHBvb2w6IFB1YmxpY0tleSwgbWludDogUHVibGljS2V5KTogW1B1YmxpY0tleSwgbnVtYmVyXSB7XG4gICAgcmV0dXJuIGRlcml2ZVJlc2VydmVQREEocG9vbCwgbWludCwgdGhpcy5wcm9ncmFtSWQpO1xuICB9XG5cbiAgZGVyaXZlRmVlVmF1bHRQREEocG9vbDogUHVibGljS2V5KTogW1B1YmxpY0tleSwgbnVtYmVyXSB7XG4gICAgcmV0dXJuIGRlcml2ZUZlZVZhdWx0UERBKHBvb2wsIHRoaXMucHJvZ3JhbUlkKTtcbiAgfVxuXG4gIC8qIFN0YXRlIEZldGNoaW5nICovXG5cbiAgYXN5bmMgZmV0Y2hQb29sKHBvb2xQZGE6IFB1YmxpY0tleSk6IFByb21pc2U8UG9vbEFjY291bnQ+IHtcbiAgICByZXR1cm4gZmV0Y2hQb29sQWNjb3VudCh0aGlzLnByb2dyYW0sIHBvb2xQZGEpO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hSZXNlcnZlcyhwb29sUGRhOiBQdWJsaWNLZXkpOiBQcm9taXNlPHsgcmVzZXJ2ZUE6IEJOOyByZXNlcnZlQjogQk4gfT4ge1xuICAgIGNvbnN0IHBvb2wgPSBhd2FpdCB0aGlzLmZldGNoUG9vbChwb29sUGRhKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUFQZGFdID0gdGhpcy5kZXJpdmVSZXNlcnZlUERBKHBvb2xQZGEsIHBvb2wubWludEEpO1xuICAgIGNvbnN0IFtyZXNlcnZlQlBkYV0gPSB0aGlzLmRlcml2ZVJlc2VydmVQREEocG9vbFBkYSwgcG9vbC5taW50Qik7XG5cbiAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5wcm9ncmFtLnByb3ZpZGVyLmNvbm5lY3Rpb247XG5cbiAgICBjb25zdCBbcmVzZXJ2ZUFBY2NvdW50LCByZXNlcnZlQkFjY291bnRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZ2V0QWNjb3VudChjb25uZWN0aW9uLCByZXNlcnZlQVBkYSksXG4gICAgICBnZXRBY2NvdW50KGNvbm5lY3Rpb24sIHJlc2VydmVCUGRhKSxcbiAgICBdKTtcblxuICAgIHJldHVybiB7XG4gICAgICByZXNlcnZlQTogbmV3IEJOKHJlc2VydmVBQWNjb3VudC5hbW91bnQudG9TdHJpbmcoKSksXG4gICAgICByZXNlcnZlQjogbmV3IEJOKHJlc2VydmVCQWNjb3VudC5hbW91bnQudG9TdHJpbmcoKSksXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoTWludERlY2ltYWxzKHBvb2xQZGE6IFB1YmxpY0tleSk6IFByb21pc2U8eyBkZWNpbWFsc0E6IG51bWJlcjsgZGVjaW1hbHNCOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHBvb2wgPSBhd2FpdCB0aGlzLmZldGNoUG9vbChwb29sUGRhKTtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5wcm9ncmFtLnByb3ZpZGVyLmNvbm5lY3Rpb247XG4gICAgY29uc3QgW21pbnRBLCBtaW50Ql0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBnZXRNaW50KGNvbm5lY3Rpb24sIHBvb2wubWludEEpLFxuICAgICAgZ2V0TWludChjb25uZWN0aW9uLCBwb29sLm1pbnRCKSxcbiAgICBdKTtcbiAgICByZXR1cm4geyBkZWNpbWFsc0E6IG1pbnRBLmRlY2ltYWxzLCBkZWNpbWFsc0I6IG1pbnRCLmRlY2ltYWxzIH07XG4gIH1cblxuICBhc3luYyBmZXRjaFNwb3RQcmljZShwb29sUGRhOiBQdWJsaWNLZXkpOiBQcm9taXNlPEJOPiB7XG4gICAgY29uc3QgeyByZXNlcnZlQSwgcmVzZXJ2ZUIgfSA9IGF3YWl0IHRoaXMuZmV0Y2hSZXNlcnZlcyhwb29sUGRhKTtcbiAgICBjb25zdCB7IGRlY2ltYWxzQSwgZGVjaW1hbHNCIH0gPSBhd2FpdCB0aGlzLmZldGNoTWludERlY2ltYWxzKHBvb2xQZGEpO1xuICAgIHJldHVybiBjYWxjdWxhdGVTcG90UHJpY2UocmVzZXJ2ZUEsIHJlc2VydmVCLCBkZWNpbWFsc0EsIGRlY2ltYWxzQik7XG4gIH1cblxuICBhc3luYyBmZXRjaFR3YXAocG9vbFBkYTogUHVibGljS2V5KTogUHJvbWlzZTxCTiB8IG51bGw+IHtcbiAgICBjb25zdCBwb29sID0gYXdhaXQgdGhpcy5mZXRjaFBvb2wocG9vbFBkYSk7XG4gICAgcmV0dXJuIGNhbGN1bGF0ZVR3YXAocG9vbC5vcmFjbGUpO1xuICB9XG5cbiAgLyogUXVvdGUgKi9cblxuICBhc3luYyBxdW90ZShcbiAgICBwb29sUGRhOiBQdWJsaWNLZXksXG4gICAgc3dhcEFUb0I6IGJvb2xlYW4sXG4gICAgaW5wdXRBbW91bnQ6IEJOIHwgbnVtYmVyLFxuICAgIHNsaXBwYWdlUGVyY2VudDogbnVtYmVyID0gMC41LFxuICApOiBQcm9taXNlPFN3YXBRdW90ZT4ge1xuICAgIGNvbnN0IHBvb2wgPSBhd2FpdCB0aGlzLmZldGNoUG9vbChwb29sUGRhKTtcbiAgICBjb25zdCB7IHJlc2VydmVBLCByZXNlcnZlQiB9ID0gYXdhaXQgdGhpcy5mZXRjaFJlc2VydmVzKHBvb2xQZGEpO1xuICAgIGNvbnN0IHsgZGVjaW1hbHNBLCBkZWNpbWFsc0IgfSA9IGF3YWl0IHRoaXMuZmV0Y2hNaW50RGVjaW1hbHMocG9vbFBkYSk7XG5cbiAgICBjb25zdCBbcmVzZXJ2ZUluLCByZXNlcnZlT3V0XSA9IHN3YXBBVG9CXG4gICAgICA/IFtyZXNlcnZlQSwgcmVzZXJ2ZUJdXG4gICAgICA6IFtyZXNlcnZlQiwgcmVzZXJ2ZUFdO1xuXG4gICAgY29uc3QgW2RlY2ltYWxzSW4sIGRlY2ltYWxzT3V0XSA9IHN3YXBBVG9CXG4gICAgICA/IFtkZWNpbWFsc0EsIGRlY2ltYWxzQl1cbiAgICAgIDogW2RlY2ltYWxzQiwgZGVjaW1hbHNBXTtcblxuICAgIHJldHVybiBjcmVhdGVTd2FwUXVvdGUoXG4gICAgICBpbnB1dEFtb3VudCxcbiAgICAgIHJlc2VydmVJbixcbiAgICAgIHJlc2VydmVPdXQsXG4gICAgICBwb29sLmZlZSxcbiAgICAgIGRlY2ltYWxzSW4sXG4gICAgICBkZWNpbWFsc091dCxcbiAgICAgIHN3YXBBVG9CLFxuICAgICAgc2xpcHBhZ2VQZXJjZW50LFxuICAgICk7XG4gIH1cblxuICAvKiBJbnN0cnVjdGlvbiBCdWlsZGVycyAqL1xuXG4gIGNyZWF0ZVBvb2woXG4gICAgcGF5ZXI6IFB1YmxpY0tleSxcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIG1pbnRBOiBQdWJsaWNLZXksXG4gICAgbWludEI6IFB1YmxpY0tleSxcbiAgICBmZWU6IG51bWJlcixcbiAgICBzdGFydGluZ09ic2VydmF0aW9uOiBCTixcbiAgICBtYXhPYnNlcnZhdGlvbkRlbHRhOiBCTixcbiAgICB3YXJtdXBEdXJhdGlvbjogbnVtYmVyLFxuICAgIGxpcXVpZGl0eVByb3ZpZGVyOiBQdWJsaWNLZXkgfCBudWxsID0gbnVsbFxuICApIHtcbiAgICBjb25zdCBbcG9vbFBkYV0gPSB0aGlzLmRlcml2ZVBvb2xQREEoYWRtaW4sIG1pbnRBLCBtaW50Qik7XG4gICAgY29uc3QgW3Jlc2VydmVBXSA9IHRoaXMuZGVyaXZlUmVzZXJ2ZVBEQShwb29sUGRhLCBtaW50QSk7XG4gICAgY29uc3QgW3Jlc2VydmVCXSA9IHRoaXMuZGVyaXZlUmVzZXJ2ZVBEQShwb29sUGRhLCBtaW50Qik7XG4gICAgY29uc3QgW2ZlZVZhdWx0XSA9IHRoaXMuZGVyaXZlRmVlVmF1bHRQREEocG9vbFBkYSk7XG5cbiAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlUG9vbEl4KFxuICAgICAgdGhpcy5wcm9ncmFtLFxuICAgICAgcGF5ZXIsXG4gICAgICBhZG1pbixcbiAgICAgIG1pbnRBLFxuICAgICAgbWludEIsXG4gICAgICBwb29sUGRhLFxuICAgICAgcmVzZXJ2ZUEsXG4gICAgICByZXNlcnZlQixcbiAgICAgIGZlZVZhdWx0LFxuICAgICAgZmVlLFxuICAgICAgc3RhcnRpbmdPYnNlcnZhdGlvbixcbiAgICAgIG1heE9ic2VydmF0aW9uRGVsdGEsXG4gICAgICB3YXJtdXBEdXJhdGlvbixcbiAgICAgIGxpcXVpZGl0eVByb3ZpZGVyXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBidWlsZGVyLFxuICAgICAgcG9vbFBkYSxcbiAgICAgIHJlc2VydmVBLFxuICAgICAgcmVzZXJ2ZUIsXG4gICAgICBmZWVWYXVsdCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgYWRkTGlxdWlkaXR5KFxuICAgIGRlcG9zaXRvcjogUHVibGljS2V5LFxuICAgIHBvb2xQZGE6IFB1YmxpY0tleSxcbiAgICBhbW91bnRBOiBCTiB8IG51bWJlcixcbiAgICBhbW91bnRCOiBCTiB8IG51bWJlcixcbiAgICBvcHRpb25zPzogQW1tQWN0aW9uT3B0aW9uc1xuICApIHtcbiAgICBjb25zdCB7IGF1dG9XcmFwVW53cmFwID0gdHJ1ZSwgaW5jbHVkZUN1QnVkZ2V0ID0gdHJ1ZSwgY29tcHV0ZVVuaXRzIH0gPSBvcHRpb25zID8/IHt9O1xuXG4gICAgY29uc3QgcG9vbCA9IGF3YWl0IHRoaXMuZmV0Y2hQb29sKHBvb2xQZGEpO1xuICAgIGNvbnN0IFtyZXNlcnZlQV0gPSB0aGlzLmRlcml2ZVJlc2VydmVQREEocG9vbFBkYSwgcG9vbC5taW50QSk7XG4gICAgY29uc3QgW3Jlc2VydmVCXSA9IHRoaXMuZGVyaXZlUmVzZXJ2ZVBEQShwb29sUGRhLCBwb29sLm1pbnRCKTtcbiAgICBjb25zdCBkZXBvc2l0b3JUb2tlbkFjY0EgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhwb29sLm1pbnRBLCBkZXBvc2l0b3IpO1xuICAgIGNvbnN0IGRlcG9zaXRvclRva2VuQWNjQiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHBvb2wubWludEIsIGRlcG9zaXRvcik7XG5cbiAgICBjb25zdCBwcmVJeHM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSA9IFtdO1xuXG4gICAgaWYgKGluY2x1ZGVDdUJ1ZGdldCkge1xuICAgICAgcHJlSXhzLnB1c2goXG4gICAgICAgIENvbXB1dGVCdWRnZXRQcm9ncmFtLnNldENvbXB1dGVVbml0TGltaXQoe1xuICAgICAgICAgIHVuaXRzOiBjb21wdXRlVW5pdHMgPz8gdGhpcy5jb21wdXRlVW5pdHMsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhdXRvV3JhcFVud3JhcCAmJiBwb29sLm1pbnRBLmVxdWFscyhOQVRJVkVfTUlOVCkpIHtcbiAgICAgIGNvbnN0IGFtb3VudEFCTiA9IHR5cGVvZiBhbW91bnRBID09PSBcIm51bWJlclwiID8gbmV3IEJOKGFtb3VudEEpIDogYW1vdW50QTtcbiAgICAgIHByZUl4cy5wdXNoKFxuICAgICAgICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SWRlbXBvdGVudEluc3RydWN0aW9uKFxuICAgICAgICAgIGRlcG9zaXRvcixcbiAgICAgICAgICBkZXBvc2l0b3JUb2tlbkFjY0EsXG4gICAgICAgICAgZGVwb3NpdG9yLFxuICAgICAgICAgIHBvb2wubWludEFcbiAgICAgICAgKSxcbiAgICAgICAgU3lzdGVtUHJvZ3JhbS50cmFuc2Zlcih7XG4gICAgICAgICAgZnJvbVB1YmtleTogZGVwb3NpdG9yLFxuICAgICAgICAgIHRvUHVia2V5OiBkZXBvc2l0b3JUb2tlbkFjY0EsXG4gICAgICAgICAgbGFtcG9ydHM6IEJpZ0ludChhbW91bnRBQk4udG9TdHJpbmcoKSksXG4gICAgICAgIH0pLFxuICAgICAgICBjcmVhdGVTeW5jTmF0aXZlSW5zdHJ1Y3Rpb24oZGVwb3NpdG9yVG9rZW5BY2NBKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXV0b1dyYXBVbndyYXAgJiYgcG9vbC5taW50Qi5lcXVhbHMoTkFUSVZFX01JTlQpKSB7XG4gICAgICBjb25zdCBhbW91bnRCQk4gPSB0eXBlb2YgYW1vdW50QiA9PT0gXCJudW1iZXJcIiA/IG5ldyBCTihhbW91bnRCKSA6IGFtb3VudEI7XG4gICAgICBwcmVJeHMucHVzaChcbiAgICAgICAgY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudElkZW1wb3RlbnRJbnN0cnVjdGlvbihcbiAgICAgICAgICBkZXBvc2l0b3IsXG4gICAgICAgICAgZGVwb3NpdG9yVG9rZW5BY2NCLFxuICAgICAgICAgIGRlcG9zaXRvcixcbiAgICAgICAgICBwb29sLm1pbnRCXG4gICAgICAgICksXG4gICAgICAgIFN5c3RlbVByb2dyYW0udHJhbnNmZXIoe1xuICAgICAgICAgIGZyb21QdWJrZXk6IGRlcG9zaXRvcixcbiAgICAgICAgICB0b1B1YmtleTogZGVwb3NpdG9yVG9rZW5BY2NCLFxuICAgICAgICAgIGxhbXBvcnRzOiBCaWdJbnQoYW1vdW50QkJOLnRvU3RyaW5nKCkpLFxuICAgICAgICB9KSxcbiAgICAgICAgY3JlYXRlU3luY05hdGl2ZUluc3RydWN0aW9uKGRlcG9zaXRvclRva2VuQWNjQilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGJ1aWxkZXIgPSBhZGRMaXF1aWRpdHlJeChcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGRlcG9zaXRvcixcbiAgICAgIHBvb2xQZGEsXG4gICAgICByZXNlcnZlQSxcbiAgICAgIHJlc2VydmVCLFxuICAgICAgZGVwb3NpdG9yVG9rZW5BY2NBLFxuICAgICAgZGVwb3NpdG9yVG9rZW5BY2NCLFxuICAgICAgYW1vdW50QSxcbiAgICAgIGFtb3VudEJcbiAgICApO1xuXG4gICAgcmV0dXJuIHByZUl4cy5sZW5ndGggPiAwID8gYnVpbGRlci5wcmVJbnN0cnVjdGlvbnMocHJlSXhzKSA6IGJ1aWxkZXI7XG4gIH1cblxuICBhc3luYyByZW1vdmVMaXF1aWRpdHkoXG4gICAgZGVwb3NpdG9yOiBQdWJsaWNLZXksXG4gICAgcG9vbFBkYTogUHVibGljS2V5LFxuICAgIGFtb3VudEE6IEJOIHwgbnVtYmVyLFxuICAgIGFtb3VudEI6IEJOIHwgbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBBbW1BY3Rpb25PcHRpb25zXG4gICkge1xuICAgIGNvbnN0IHsgYXV0b1dyYXBVbndyYXAgPSB0cnVlLCBpbmNsdWRlQ3VCdWRnZXQgPSB0cnVlLCBjb21wdXRlVW5pdHMgfSA9IG9wdGlvbnMgPz8ge307XG5cbiAgICBjb25zdCBwb29sID0gYXdhaXQgdGhpcy5mZXRjaFBvb2wocG9vbFBkYSk7XG4gICAgY29uc3QgW3Jlc2VydmVBXSA9IHRoaXMuZGVyaXZlUmVzZXJ2ZVBEQShwb29sUGRhLCBwb29sLm1pbnRBKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUJdID0gdGhpcy5kZXJpdmVSZXNlcnZlUERBKHBvb2xQZGEsIHBvb2wubWludEIpO1xuICAgIGNvbnN0IGRlcG9zaXRvclRva2VuQWNjQSA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHBvb2wubWludEEsIGRlcG9zaXRvcik7XG4gICAgY29uc3QgZGVwb3NpdG9yVG9rZW5BY2NCID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMocG9vbC5taW50QiwgZGVwb3NpdG9yKTtcblxuICAgIGxldCBidWlsZGVyID0gcmVtb3ZlTGlxdWlkaXR5SXgoXG4gICAgICB0aGlzLnByb2dyYW0sXG4gICAgICBkZXBvc2l0b3IsXG4gICAgICBwb29sUGRhLFxuICAgICAgcmVzZXJ2ZUEsXG4gICAgICByZXNlcnZlQixcbiAgICAgIGRlcG9zaXRvclRva2VuQWNjQSxcbiAgICAgIGRlcG9zaXRvclRva2VuQWNjQixcbiAgICAgIGFtb3VudEEsXG4gICAgICBhbW91bnRCXG4gICAgKTtcblxuICAgIGlmIChpbmNsdWRlQ3VCdWRnZXQpIHtcbiAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLnByZUluc3RydWN0aW9ucyhbXG4gICAgICAgIENvbXB1dGVCdWRnZXRQcm9ncmFtLnNldENvbXB1dGVVbml0TGltaXQoe1xuICAgICAgICAgIHVuaXRzOiBjb21wdXRlVW5pdHMgPz8gdGhpcy5jb21wdXRlVW5pdHMsXG4gICAgICAgIH0pLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zdEl4czogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdID0gW107XG5cbiAgICBpZiAoYXV0b1dyYXBVbndyYXAgJiYgcG9vbC5taW50QS5lcXVhbHMoTkFUSVZFX01JTlQpKSB7XG4gICAgICBwb3N0SXhzLnB1c2goY3JlYXRlQ2xvc2VBY2NvdW50SW5zdHJ1Y3Rpb24oZGVwb3NpdG9yVG9rZW5BY2NBLCBkZXBvc2l0b3IsIGRlcG9zaXRvcikpO1xuICAgIH1cblxuICAgIGlmIChhdXRvV3JhcFVud3JhcCAmJiBwb29sLm1pbnRCLmVxdWFscyhOQVRJVkVfTUlOVCkpIHtcbiAgICAgIHBvc3RJeHMucHVzaChjcmVhdGVDbG9zZUFjY291bnRJbnN0cnVjdGlvbihkZXBvc2l0b3JUb2tlbkFjY0IsIGRlcG9zaXRvciwgZGVwb3NpdG9yKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc3RJeHMubGVuZ3RoID4gMCA/IGJ1aWxkZXIucG9zdEluc3RydWN0aW9ucyhwb3N0SXhzKSA6IGJ1aWxkZXI7XG4gIH1cblxuICBhc3luYyBzd2FwKFxuICAgIHRyYWRlcjogUHVibGljS2V5LFxuICAgIHBvb2xQZGE6IFB1YmxpY0tleSxcbiAgICBzd2FwQVRvQjogYm9vbGVhbixcbiAgICBpbnB1dEFtb3VudDogQk4gfCBudW1iZXIsXG4gICAgbWluT3V0cHV0QW1vdW50OiBCTiB8IG51bWJlcixcbiAgICBvcHRpb25zPzogQW1tQWN0aW9uT3B0aW9uc1xuICApIHtcbiAgICBjb25zdCB7IGF1dG9DcmVhdGVUb2tlbkFjY291bnRzID0gdHJ1ZSwgaW5jbHVkZUN1QnVkZ2V0ID0gdHJ1ZSwgY29tcHV0ZVVuaXRzIH0gPSBvcHRpb25zID8/IHt9O1xuXG4gICAgY29uc3QgcG9vbCA9IGF3YWl0IHRoaXMuZmV0Y2hQb29sKHBvb2xQZGEpO1xuICAgIGNvbnN0IFtyZXNlcnZlQV0gPSB0aGlzLmRlcml2ZVJlc2VydmVQREEocG9vbFBkYSwgcG9vbC5taW50QSk7XG4gICAgY29uc3QgW3Jlc2VydmVCXSA9IHRoaXMuZGVyaXZlUmVzZXJ2ZVBEQShwb29sUGRhLCBwb29sLm1pbnRCKTtcbiAgICBjb25zdCBbZmVlVmF1bHRdID0gdGhpcy5kZXJpdmVGZWVWYXVsdFBEQShwb29sUGRhKTtcbiAgICBjb25zdCB0cmFkZXJBY2NvdW50QSA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHBvb2wubWludEEsIHRyYWRlcik7XG4gICAgY29uc3QgdHJhZGVyQWNjb3VudEIgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhwb29sLm1pbnRCLCB0cmFkZXIpO1xuXG4gICAgY29uc3QgcHJlSXhzOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10gPSBbXTtcblxuICAgIGlmIChpbmNsdWRlQ3VCdWRnZXQpIHtcbiAgICAgIHByZUl4cy5wdXNoKFxuICAgICAgICBDb21wdXRlQnVkZ2V0UHJvZ3JhbS5zZXRDb21wdXRlVW5pdExpbWl0KHtcbiAgICAgICAgICB1bml0czogY29tcHV0ZVVuaXRzID8/IHRoaXMuY29tcHV0ZVVuaXRzLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXV0b0NyZWF0ZVRva2VuQWNjb3VudHMpIHtcbiAgICAgIHByZUl4cy5wdXNoKFxuICAgICAgICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SWRlbXBvdGVudEluc3RydWN0aW9uKFxuICAgICAgICAgIHRyYWRlcixcbiAgICAgICAgICB0cmFkZXJBY2NvdW50QSxcbiAgICAgICAgICB0cmFkZXIsXG4gICAgICAgICAgcG9vbC5taW50QVxuICAgICAgICApLFxuICAgICAgICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SWRlbXBvdGVudEluc3RydWN0aW9uKFxuICAgICAgICAgIHRyYWRlcixcbiAgICAgICAgICB0cmFkZXJBY2NvdW50QixcbiAgICAgICAgICB0cmFkZXIsXG4gICAgICAgICAgcG9vbC5taW50QlxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBidWlsZGVyID0gc3dhcEl4KFxuICAgICAgdGhpcy5wcm9ncmFtLFxuICAgICAgdHJhZGVyLFxuICAgICAgcG9vbFBkYSxcbiAgICAgIHJlc2VydmVBLFxuICAgICAgcmVzZXJ2ZUIsXG4gICAgICBmZWVWYXVsdCxcbiAgICAgIHRyYWRlckFjY291bnRBLFxuICAgICAgdHJhZGVyQWNjb3VudEIsXG4gICAgICBzd2FwQVRvQixcbiAgICAgIGlucHV0QW1vdW50LFxuICAgICAgbWluT3V0cHV0QW1vdW50XG4gICAgKTtcblxuICAgIGlmIChwcmVJeHMubGVuZ3RoID4gMCkge1xuICAgICAgYnVpbGRlciA9IGJ1aWxkZXIucHJlSW5zdHJ1Y3Rpb25zKHByZUl4cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH1cblxuICBhc3luYyBjcmFua1R3YXAocG9vbFBkYTogUHVibGljS2V5KSB7XG4gICAgY29uc3QgcG9vbCA9IGF3YWl0IHRoaXMuZmV0Y2hQb29sKHBvb2xQZGEpO1xuICAgIGNvbnN0IFtyZXNlcnZlQV0gPSB0aGlzLmRlcml2ZVJlc2VydmVQREEocG9vbFBkYSwgcG9vbC5taW50QSk7XG4gICAgY29uc3QgW3Jlc2VydmVCXSA9IHRoaXMuZGVyaXZlUmVzZXJ2ZVBEQShwb29sUGRhLCBwb29sLm1pbnRCKTtcblxuICAgIHJldHVybiBjcmFua1R3YXBJeCh0aGlzLnByb2dyYW0sIHBvb2xQZGEsIHJlc2VydmVBLCByZXNlcnZlQik7XG4gIH1cblxuICBjZWFzZVRyYWRpbmcoYWRtaW46IFB1YmxpY0tleSwgcG9vbFBkYTogUHVibGljS2V5KSB7XG4gICAgcmV0dXJuIGNlYXNlVHJhZGluZ0l4KHRoaXMucHJvZ3JhbSwgYWRtaW4sIHBvb2xQZGEpO1xuICB9XG5cbiAgLyogSGlnaC1MZXZlbCBTd2FwIHdpdGggU2xpcHBhZ2UgKi9cblxuICAvKipcbiAgICogSGlnaC1sZXZlbCBzd2FwIGZ1bmN0aW9uIHRoYXQ6XG4gICAqIC0gRmV0Y2hlcyBjdXJyZW50IHJlc2VydmVzIGFuZCBjb21wdXRlcyBxdW90ZVxuICAgKiAtIENhbGN1bGF0ZXMgbWluT3V0cHV0IGJhc2VkIG9uIHNsaXBwYWdlIHRvbGVyYW5jZVxuICAgKiAtIEFkZHMgY29tcHV0ZSBidWRnZXQgaW5zdHJ1Y3Rpb24gKGlmIGluY2x1ZGVDdUJ1ZGdldCBpcyB0cnVlKVxuICAgKiAtIENyZWF0ZXMgdG9rZW4gYWNjb3VudHMgaWYgdGhleSBkb24ndCBleGlzdCAoaWYgYXV0b0NyZWF0ZVRva2VuQWNjb3VudHMgaXMgdHJ1ZSlcbiAgICovXG4gIGFzeW5jIHN3YXBXaXRoU2xpcHBhZ2UoXG4gICAgdHJhZGVyOiBQdWJsaWNLZXksXG4gICAgcG9vbFBkYTogUHVibGljS2V5LFxuICAgIHN3YXBBVG9COiBib29sZWFuLFxuICAgIGlucHV0QW1vdW50OiBCTiB8IG51bWJlcixcbiAgICBzbGlwcGFnZVBlcmNlbnQ6IG51bWJlciA9IDAuNSxcbiAgICBvcHRpb25zPzogQW1tQWN0aW9uT3B0aW9uc1xuICApIHtcbiAgICBjb25zdCB7IGF1dG9DcmVhdGVUb2tlbkFjY291bnRzID0gdHJ1ZSwgaW5jbHVkZUN1QnVkZ2V0ID0gdHJ1ZSwgY29tcHV0ZVVuaXRzIH0gPSBvcHRpb25zID8/IHt9O1xuXG4gICAgY29uc3QgcG9vbCA9IGF3YWl0IHRoaXMuZmV0Y2hQb29sKHBvb2xQZGEpO1xuICAgIGNvbnN0IGlucHV0ID0gdHlwZW9mIGlucHV0QW1vdW50ID09PSBcIm51bWJlclwiID8gbmV3IEJOKGlucHV0QW1vdW50KSA6IGlucHV0QW1vdW50O1xuXG4gICAgLy8gR2V0IHF1b3RlIHdpdGggc2xpcHBhZ2VcbiAgICBjb25zdCBxdW90ZVJlc3VsdCA9IGF3YWl0IHRoaXMucXVvdGUocG9vbFBkYSwgc3dhcEFUb0IsIGlucHV0LCBzbGlwcGFnZVBlcmNlbnQpO1xuXG4gICAgLy8gRGVyaXZlIGFjY291bnRzXG4gICAgY29uc3QgW3Jlc2VydmVBXSA9IHRoaXMuZGVyaXZlUmVzZXJ2ZVBEQShwb29sUGRhLCBwb29sLm1pbnRBKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUJdID0gdGhpcy5kZXJpdmVSZXNlcnZlUERBKHBvb2xQZGEsIHBvb2wubWludEIpO1xuICAgIGNvbnN0IFtmZWVWYXVsdF0gPSB0aGlzLmRlcml2ZUZlZVZhdWx0UERBKHBvb2xQZGEpO1xuICAgIGNvbnN0IHRyYWRlckFjY291bnRBID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMocG9vbC5taW50QSwgdHJhZGVyKTtcbiAgICBjb25zdCB0cmFkZXJBY2NvdW50QiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHBvb2wubWludEIsIHRyYWRlcik7XG5cbiAgICAvLyBCdWlsZCBiYXNlIHN3YXAgaW5zdHJ1Y3Rpb25cbiAgICBsZXQgYnVpbGRlciA9IHN3YXBJeChcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIHRyYWRlcixcbiAgICAgIHBvb2xQZGEsXG4gICAgICByZXNlcnZlQSxcbiAgICAgIHJlc2VydmVCLFxuICAgICAgZmVlVmF1bHQsXG4gICAgICB0cmFkZXJBY2NvdW50QSxcbiAgICAgIHRyYWRlckFjY291bnRCLFxuICAgICAgc3dhcEFUb0IsXG4gICAgICBpbnB1dCxcbiAgICAgIHF1b3RlUmVzdWx0Lm1pbk91dHB1dEFtb3VudFxuICAgICk7XG5cbiAgICBjb25zdCBwcmVJeHM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSA9IFtdO1xuXG4gICAgaWYgKGluY2x1ZGVDdUJ1ZGdldCkge1xuICAgICAgcHJlSXhzLnB1c2goXG4gICAgICAgIENvbXB1dGVCdWRnZXRQcm9ncmFtLnNldENvbXB1dGVVbml0TGltaXQoe1xuICAgICAgICAgIHVuaXRzOiBjb21wdXRlVW5pdHMgPz8gdGhpcy5jb21wdXRlVW5pdHMsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhdXRvQ3JlYXRlVG9rZW5BY2NvdW50cykge1xuICAgICAgcHJlSXhzLnB1c2goXG4gICAgICAgIGNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnRJZGVtcG90ZW50SW5zdHJ1Y3Rpb24oXG4gICAgICAgICAgdHJhZGVyLFxuICAgICAgICAgIHRyYWRlckFjY291bnRBLFxuICAgICAgICAgIHRyYWRlcixcbiAgICAgICAgICBwb29sLm1pbnRBXG4gICAgICAgICksXG4gICAgICAgIGNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnRJZGVtcG90ZW50SW5zdHJ1Y3Rpb24oXG4gICAgICAgICAgdHJhZGVyLFxuICAgICAgICAgIHRyYWRlckFjY291bnRCLFxuICAgICAgICAgIHRyYWRlcixcbiAgICAgICAgICBwb29sLm1pbnRCXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHByZUl4cy5sZW5ndGggPiAwKSB7XG4gICAgICBidWlsZGVyID0gYnVpbGRlci5wcmVJbnN0cnVjdGlvbnMocHJlSXhzKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYnVpbGRlcixcbiAgICAgIHF1b3RlOiBxdW90ZVJlc3VsdCxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -42,4 +42,5 @@ export type AMMEvent = {
42
42
  };
43
43
  export interface AmmActionOptions extends TxOptions {
44
44
  autoWrapUnwrap?: boolean;
45
+ autoCreateTokenAccounts?: boolean;
45
46
  }
package/dist/amm/types.js CHANGED
@@ -11,4 +11,4 @@ var PoolState;
11
11
  PoolState["Trading"] = "trading";
12
12
  PoolState["Finalized"] = "finalized";
13
13
  })(PoolState || (exports.PoolState = PoolState = {}));
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYW1tL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQXlCSCxXQUFXO0FBRVgsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ25CLGdDQUFtQixDQUFBO0lBQ25CLG9DQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFIVyxTQUFTLHlCQUFULFNBQVMsUUFHcEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogVHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIEFNTSBwcm9ncmFtLlxuICogRXhwb3J0cyBJREwtZGVyaXZlZCB0eXBlcyBhbmQgU0RLLWZyaWVuZGx5IGVudW1zLlxuICovXG5cbmltcG9ydCB7IEJOLCBJZGxBY2NvdW50cywgSWRsRXZlbnRzLCBJZGxUeXBlcyB9IGZyb20gXCJAY29yYWwteHl6L2FuY2hvclwiO1xuaW1wb3J0IHsgVHhPcHRpb25zIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbi8qIElETCBUeXBlIFJlLWV4cG9ydCAqL1xuXG5leHBvcnQgeyBBbW0gfSBmcm9tIFwiLi4vZ2VuZXJhdGVkL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFtbSB9IGZyb20gXCIuLi9nZW5lcmF0ZWQvdHlwZXNcIjtcblxuLyogSURMLWRlcml2ZWQgVHlwZXMgKi9cblxuZXhwb3J0IHR5cGUgUG9vbEFjY291bnQgPSBJZGxBY2NvdW50czxBbW0+W1wicG9vbEFjY291bnRcIl07XG5leHBvcnQgdHlwZSBQb29sU3RhdGVSYXcgPSBJZGxUeXBlczxBbW0+W1wicG9vbFN0YXRlXCJdO1xuZXhwb3J0IHR5cGUgVHdhcE9yYWNsZSA9IElkbFR5cGVzPEFtbT5bXCJ0d2FwT3JhY2xlXCJdO1xuZXhwb3J0IHR5cGUgUG9vbEJ1bXBzID0gSWRsVHlwZXM8QW1tPltcInBvb2xCdW1wc1wiXTtcblxuLyogRXZlbnQgVHlwZXMgKi9cblxuZXhwb3J0IHR5cGUgUG9vbENyZWF0ZWRFdmVudCA9IElkbEV2ZW50czxBbW0+W1wicG9vbENyZWF0ZWRcIl07XG5leHBvcnQgdHlwZSBMaXF1aWRpdHlBZGRlZEV2ZW50ID0gSWRsRXZlbnRzPEFtbT5bXCJsaXF1aWRpdHlBZGRlZFwiXTtcbmV4cG9ydCB0eXBlIExpcXVpZGl0eVJlbW92ZWRFdmVudCA9IElkbEV2ZW50czxBbW0+W1wibGlxdWlkaXR5UmVtb3ZlZFwiXTtcbmV4cG9ydCB0eXBlIENvbmRTd2FwRXZlbnQgPSBJZGxFdmVudHM8QW1tPltcImNvbmRTd2FwXCJdO1xuZXhwb3J0IHR5cGUgVFdBUFVwZGF0ZUV2ZW50ID0gSWRsRXZlbnRzPEFtbT5bXCJ0d2FwVXBkYXRlXCJdO1xuXG4vKiBFbnVtcyAqL1xuXG5leHBvcnQgZW51bSBQb29sU3RhdGUge1xuICBUcmFkaW5nID0gXCJ0cmFkaW5nXCIsXG4gIEZpbmFsaXplZCA9IFwiZmluYWxpemVkXCIsXG59XG5cbi8qIFF1b3RlIFR5cGVzICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgU3dhcFF1b3RlIHtcbiAgaW5wdXRBbW91bnQ6IEJOO1xuICBvdXRwdXRBbW91bnQ6IEJOO1xuICBtaW5PdXRwdXRBbW91bnQ6IEJOO1xuICBmZWVBbW91bnQ6IEJOO1xuICBwcmljZUltcGFjdDogbnVtYmVyO1xuICBzcG90UHJpY2VCZWZvcmU6IEJOO1xuICBzcG90UHJpY2VBZnRlcjogQk47XG59XG5cbi8qIEV2ZW50IFVuaW9uIFR5cGUgKi9cblxuZXhwb3J0IHR5cGUgQU1NRXZlbnQgPVxuICB8IHsgbmFtZTogXCJQb29sQ3JlYXRlZFwiOyBkYXRhOiBQb29sQ3JlYXRlZEV2ZW50IH1cbiAgfCB7IG5hbWU6IFwiTGlxdWlkaXR5QWRkZWRcIjsgZGF0YTogTGlxdWlkaXR5QWRkZWRFdmVudCB9XG4gIHwgeyBuYW1lOiBcIkxpcXVpZGl0eVJlbW92ZWRcIjsgZGF0YTogTGlxdWlkaXR5UmVtb3ZlZEV2ZW50IH1cbiAgfCB7IG5hbWU6IFwiQ29uZFN3YXBcIjsgZGF0YTogQ29uZFN3YXBFdmVudCB9XG4gIHwgeyBuYW1lOiBcIlRXQVBVcGRhdGVcIjsgZGF0YTogVFdBUFVwZGF0ZUV2ZW50IH07XG5cbi8qIE9wdGlvbnMgKi9cblxuZXhwb3J0IGludGVyZmFjZSBBbW1BY3Rpb25PcHRpb25zIGV4dGVuZHMgVHhPcHRpb25zIHtcbiAgYXV0b1dyYXBVbndyYXA/OiBib29sZWFuOyAvLyBBdXRvIHdyYXAvdW53cmFwIG5hdGl2ZSBTT0wgKGRlZmF1bHQ6IHRydWUpXG59XG4iXX0=
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYW1tL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQXlCSCxXQUFXO0FBRVgsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ25CLGdDQUFtQixDQUFBO0lBQ25CLG9DQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFIVyxTQUFTLHlCQUFULFNBQVMsUUFHcEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogVHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIEFNTSBwcm9ncmFtLlxuICogRXhwb3J0cyBJREwtZGVyaXZlZCB0eXBlcyBhbmQgU0RLLWZyaWVuZGx5IGVudW1zLlxuICovXG5cbmltcG9ydCB7IEJOLCBJZGxBY2NvdW50cywgSWRsRXZlbnRzLCBJZGxUeXBlcyB9IGZyb20gXCJAY29yYWwteHl6L2FuY2hvclwiO1xuaW1wb3J0IHsgVHhPcHRpb25zIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbi8qIElETCBUeXBlIFJlLWV4cG9ydCAqL1xuXG5leHBvcnQgeyBBbW0gfSBmcm9tIFwiLi4vZ2VuZXJhdGVkL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFtbSB9IGZyb20gXCIuLi9nZW5lcmF0ZWQvdHlwZXNcIjtcblxuLyogSURMLWRlcml2ZWQgVHlwZXMgKi9cblxuZXhwb3J0IHR5cGUgUG9vbEFjY291bnQgPSBJZGxBY2NvdW50czxBbW0+W1wicG9vbEFjY291bnRcIl07XG5leHBvcnQgdHlwZSBQb29sU3RhdGVSYXcgPSBJZGxUeXBlczxBbW0+W1wicG9vbFN0YXRlXCJdO1xuZXhwb3J0IHR5cGUgVHdhcE9yYWNsZSA9IElkbFR5cGVzPEFtbT5bXCJ0d2FwT3JhY2xlXCJdO1xuZXhwb3J0IHR5cGUgUG9vbEJ1bXBzID0gSWRsVHlwZXM8QW1tPltcInBvb2xCdW1wc1wiXTtcblxuLyogRXZlbnQgVHlwZXMgKi9cblxuZXhwb3J0IHR5cGUgUG9vbENyZWF0ZWRFdmVudCA9IElkbEV2ZW50czxBbW0+W1wicG9vbENyZWF0ZWRcIl07XG5leHBvcnQgdHlwZSBMaXF1aWRpdHlBZGRlZEV2ZW50ID0gSWRsRXZlbnRzPEFtbT5bXCJsaXF1aWRpdHlBZGRlZFwiXTtcbmV4cG9ydCB0eXBlIExpcXVpZGl0eVJlbW92ZWRFdmVudCA9IElkbEV2ZW50czxBbW0+W1wibGlxdWlkaXR5UmVtb3ZlZFwiXTtcbmV4cG9ydCB0eXBlIENvbmRTd2FwRXZlbnQgPSBJZGxFdmVudHM8QW1tPltcImNvbmRTd2FwXCJdO1xuZXhwb3J0IHR5cGUgVFdBUFVwZGF0ZUV2ZW50ID0gSWRsRXZlbnRzPEFtbT5bXCJ0d2FwVXBkYXRlXCJdO1xuXG4vKiBFbnVtcyAqL1xuXG5leHBvcnQgZW51bSBQb29sU3RhdGUge1xuICBUcmFkaW5nID0gXCJ0cmFkaW5nXCIsXG4gIEZpbmFsaXplZCA9IFwiZmluYWxpemVkXCIsXG59XG5cbi8qIFF1b3RlIFR5cGVzICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgU3dhcFF1b3RlIHtcbiAgaW5wdXRBbW91bnQ6IEJOO1xuICBvdXRwdXRBbW91bnQ6IEJOO1xuICBtaW5PdXRwdXRBbW91bnQ6IEJOO1xuICBmZWVBbW91bnQ6IEJOO1xuICBwcmljZUltcGFjdDogbnVtYmVyO1xuICBzcG90UHJpY2VCZWZvcmU6IEJOO1xuICBzcG90UHJpY2VBZnRlcjogQk47XG59XG5cbi8qIEV2ZW50IFVuaW9uIFR5cGUgKi9cblxuZXhwb3J0IHR5cGUgQU1NRXZlbnQgPVxuICB8IHsgbmFtZTogXCJQb29sQ3JlYXRlZFwiOyBkYXRhOiBQb29sQ3JlYXRlZEV2ZW50IH1cbiAgfCB7IG5hbWU6IFwiTGlxdWlkaXR5QWRkZWRcIjsgZGF0YTogTGlxdWlkaXR5QWRkZWRFdmVudCB9XG4gIHwgeyBuYW1lOiBcIkxpcXVpZGl0eVJlbW92ZWRcIjsgZGF0YTogTGlxdWlkaXR5UmVtb3ZlZEV2ZW50IH1cbiAgfCB7IG5hbWU6IFwiQ29uZFN3YXBcIjsgZGF0YTogQ29uZFN3YXBFdmVudCB9XG4gIHwgeyBuYW1lOiBcIlRXQVBVcGRhdGVcIjsgZGF0YTogVFdBUFVwZGF0ZUV2ZW50IH07XG5cbi8qIE9wdGlvbnMgKi9cblxuZXhwb3J0IGludGVyZmFjZSBBbW1BY3Rpb25PcHRpb25zIGV4dGVuZHMgVHhPcHRpb25zIHtcbiAgYXV0b1dyYXBVbndyYXA/OiBib29sZWFuOyAvLyBBdXRvIHdyYXAvdW53cmFwIG5hdGl2ZSBTT0wgKGRlZmF1bHQ6IHRydWUpIC0gZm9yIGxpcXVpZGl0eSBvcGVyYXRpb25zXG4gIGF1dG9DcmVhdGVUb2tlbkFjY291bnRzPzogYm9vbGVhbjsgLy8gQXV0byBjcmVhdGUgdG9rZW4gYWNjb3VudHMgKGRlZmF1bHQ6IHRydWUpIC0gZm9yIHN3YXBzXG59XG4iXX0=
@@ -420,6 +420,8 @@ class FutarchyClient {
420
420
  });
421
421
  await provider.connection.confirmTransaction(sig, "confirmed");
422
422
  // Extend ALT with addresses
423
+ // Use skipPreflight to avoid race condition where simulation sees stale state
424
+ // before previous extend has propagated (same pattern as CREATE above)
423
425
  const CHUNK_SIZE = 20;
424
426
  for (let i = 0; i < addresses.length; i += CHUNK_SIZE) {
425
427
  const chunk = addresses.slice(i, i + CHUNK_SIZE);
@@ -430,7 +432,13 @@ class FutarchyClient {
430
432
  addresses: chunk,
431
433
  });
432
434
  const extendTx = new web3_js_1.Transaction().add(extendIx);
433
- await provider.sendAndConfirm(extendTx);
435
+ extendTx.recentBlockhash = (await provider.connection.getLatestBlockhash()).blockhash;
436
+ extendTx.feePayer = creator;
437
+ const signedExtendTx = await provider.wallet.signTransaction(extendTx);
438
+ const extendSig = await provider.connection.sendRawTransaction(signedExtendTx.serialize(), {
439
+ skipPreflight: true,
440
+ });
441
+ await provider.connection.confirmTransaction(extendSig, "confirmed");
434
442
  }
435
443
  return { altAddress };
436
444
  }
@@ -570,6 +578,8 @@ class FutarchyClient {
570
578
  await provider.connection.confirmTransaction(sig, "confirmed");
571
579
  // Split addresses into chunks to avoid transaction size limits
572
580
  // Each address is 32 bytes, ~20 addresses per extend instruction is safe
581
+ // Use skipPreflight to avoid race condition where simulation sees stale state
582
+ // before previous extend has propagated (same pattern as CREATE above)
573
583
  const CHUNK_SIZE = 20;
574
584
  for (let i = 0; i < addresses.length; i += CHUNK_SIZE) {
575
585
  const chunk = addresses.slice(i, i + CHUNK_SIZE);
@@ -580,7 +590,13 @@ class FutarchyClient {
580
590
  addresses: chunk,
581
591
  });
582
592
  const extendTx = new web3_js_1.Transaction().add(extendIx);
583
- await provider.sendAndConfirm(extendTx);
593
+ extendTx.recentBlockhash = (await provider.connection.getLatestBlockhash()).blockhash;
594
+ extendTx.feePayer = creator;
595
+ const signedExtendTx = await provider.wallet.signTransaction(extendTx);
596
+ const extendSig = await provider.connection.sendRawTransaction(signedExtendTx.serialize(), {
597
+ skipPreflight: true,
598
+ });
599
+ await provider.connection.confirmTransaction(extendSig, "confirmed");
584
600
  }
585
601
  return { altAddress };
586
602
  }
@@ -669,4 +685,4 @@ class FutarchyClient {
669
685
  }
670
686
  }
671
687
  exports.FutarchyClient = FutarchyClient;
672
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Z1dGFyY2h5L2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCw4Q0FBZ0U7QUFDaEUsNkNBVXlCO0FBQ3pCLGlEQUsyQjtBQUMzQiwyQ0FBNEQ7QUFTNUQsbUNBV2lCO0FBQ2pCLGlEQVd3QjtBQUd4QixvQ0FBeUY7QUFDekYsZ0NBQXNHO0FBRXRHLDRDQUFnRDtBQUNoRCx5REFBMkM7QUFFM0MsTUFBTSxxQkFBcUIsR0FBRyxNQUFPLENBQUM7QUFFdEMsTUFBYSxjQUFjO0lBT3pCLFlBQVksUUFBd0IsRUFBRSxTQUFxQixFQUFFLFlBQXFCO1FBQ2hGLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxJQUFJLHNCQUFVLENBQUM7UUFDekMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGdCQUFPLENBQUMsa0JBQXVCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLG1CQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLGVBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsWUFBWSxJQUFJLHFCQUFxQixDQUFDO0lBQ25FLENBQUM7SUFFRCxpQkFBaUI7SUFFakIsWUFBWSxDQUFDLElBQVk7UUFDdkIsT0FBTyxJQUFBLG9CQUFZLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsSUFBWTtRQUM3QixPQUFPLElBQUEsMEJBQWtCLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsU0FBb0IsRUFBRSxV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QUNwQixJQUFlLEVBQ2YsUUFBa0IsRUFDbEIsT0FBbUI7UUFFbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEQsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV4RCxNQUFNLE9BQU8sR0FBRyxJQUFBLHlCQUFVLEVBQ3hCLElBQUksQ0FBQyxPQUFPLEVBQ1osS0FBSyxFQUNMLFdBQVcsRUFDWCxNQUFNLEVBQ04sWUFBWSxFQUNaLFlBQVksRUFDWixRQUFRLEVBQ1IsU0FBUyxFQUNULElBQUksRUFDSixRQUFRLENBQ1QsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUM7SUFDM0MsQ0FBQztDQUNGO0FBcjdCRCx3Q0FxN0JDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIEhpZ2gtbGV2ZWwgY2xpZW50IGZvciB0aGUgRnV0YXJjaHkgcHJvZ3JhbS5cbiAqIEhhbmRsZXMgYWNjb3VudCBkZXJpdmF0aW9uLCBpbnN0cnVjdGlvbiBidWlsZGluZywgYW5kIHRyYW5zYWN0aW9uIGNvbXBvc2l0aW9uLlxuICovXG5cbmltcG9ydCB7IFByb2dyYW0sIEFuY2hvclByb3ZpZGVyLCBCTiB9IGZyb20gXCJAY29yYWwteHl6L2FuY2hvclwiO1xuaW1wb3J0IHtcbiAgUHVibGljS2V5LFxuICBDb21wdXRlQnVkZ2V0UHJvZ3JhbSxcbiAgQWRkcmVzc0xvb2t1cFRhYmxlUHJvZ3JhbSxcbiAgQWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudCxcbiAgU3lzdGVtUHJvZ3JhbSxcbiAgVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG4gIFRyYW5zYWN0aW9uTWVzc2FnZSxcbiAgVmVyc2lvbmVkVHJhbnNhY3Rpb24sXG59IGZyb20gXCJAc29sYW5hL3dlYjMuanNcIjtcbmltcG9ydCB7XG4gIGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jLFxuICBUT0tFTl9QUk9HUkFNX0lELFxuICBBU1NPQ0lBVEVEX1RPS0VOX1BST0dSQU1fSUQsXG4gIGNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnRJZGVtcG90ZW50SW5zdHJ1Y3Rpb24sXG59IGZyb20gXCJAc29sYW5hL3NwbC10b2tlblwiO1xuaW1wb3J0IHsgUFJPR1JBTV9JRCwgU1FVQURTX1BST0dSQU1fSUQgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEZ1dGFyY2h5LFxuICBEQU9BY2NvdW50LFxuICBNb2RlcmF0b3JBY2NvdW50LFxuICBQcm9wb3NhbEFjY291bnQsXG4gIFByb3Bvc2FsUGFyYW1zLFxuICBQb29sVHlwZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGRlcml2ZURBT1BEQSxcbiAgZGVyaXZlTW9kZXJhdG9yUERBLFxuICBkZXJpdmVQcm9wb3NhbFBEQSxcbiAgZGVyaXZlTWludENyZWF0ZUtleVBEQSxcbiAgZmV0Y2hEQU9BY2NvdW50LFxuICBmZXRjaE1vZGVyYXRvckFjY291bnQsXG4gIGZldGNoUHJvcG9zYWxBY2NvdW50LFxuICBwYXJzZVByb3Bvc2FsU3RhdGUsXG4gIGlzUHJvcG9zYWxFeHBpcmVkLFxuICBnZXRUaW1lUmVtYWluaW5nLFxufSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgaW5pdGlhbGl6ZU1vZGVyYXRvcixcbiAgaW5pdGlhbGl6ZVByb3Bvc2FsLFxuICBhZGRPcHRpb24sXG4gIGxhdW5jaFByb3Bvc2FsLFxuICBmaW5hbGl6ZVByb3Bvc2FsLFxuICByZWRlZW1MaXF1aWRpdHksXG4gIGFkZEhpc3RvcmljYWxQcm9wb3NhbCxcbiAgaW5pdGlhbGl6ZVBhcmVudERBTyxcbiAgaW5pdGlhbGl6ZUNoaWxkREFPLFxuICB1cGdyYWRlREFPLFxufSBmcm9tIFwiLi9pbnN0cnVjdGlvbnNcIjtcbmltcG9ydCB7IFR4T3B0aW9ucyB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5pbXBvcnQgeyBWYXVsdENsaWVudCwgZGVyaXZlVmF1bHRQREEsIGRlcml2ZUNvbmRpdGlvbmFsTWludCwgVmF1bHRUeXBlIH0gZnJvbSBcIi4uL3ZhdWx0XCI7XG5pbXBvcnQgeyBBTU1DbGllbnQsIGRlcml2ZVBvb2xQREEsIGRlcml2ZVJlc2VydmVQREEsIGRlcml2ZUZlZVZhdWx0UERBLCBGRUVfQVVUSE9SSVRZIH0gZnJvbSBcIi4uL2FtbVwiO1xuXG5pbXBvcnQgeyBGdXRhcmNoeUlETCB9IGZyb20gXCIuLi9nZW5lcmF0ZWQvaWRsc1wiO1xuaW1wb3J0ICogYXMgbXVsdGlzaWcgZnJvbSBcIkBzcWRzL211bHRpc2lnXCI7XG5cbmNvbnN0IERFRkFVTFRfQ09NUFVURV9VTklUUyA9IDUwMF8wMDA7XG5cbmV4cG9ydCBjbGFzcyBGdXRhcmNoeUNsaWVudCB7XG4gIHB1YmxpYyBwcm9ncmFtOiBQcm9ncmFtPEZ1dGFyY2h5PjtcbiAgcHVibGljIHByb2dyYW1JZDogUHVibGljS2V5O1xuICBwdWJsaWMgdmF1bHQ6IFZhdWx0Q2xpZW50O1xuICBwdWJsaWMgYW1tOiBBTU1DbGllbnQ7XG4gIHByaXZhdGUgZGVmYXVsdENvbXB1dGVVbml0czogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByb3ZpZGVyOiBBbmNob3JQcm92aWRlciwgcHJvZ3JhbUlkPzogUHVibGljS2V5LCBjb21wdXRlVW5pdHM/OiBudW1iZXIpIHtcbiAgICB0aGlzLnByb2dyYW1JZCA9IHByb2dyYW1JZCA/PyBQUk9HUkFNX0lEO1xuICAgIHRoaXMucHJvZ3JhbSA9IG5ldyBQcm9ncmFtKEZ1dGFyY2h5SURMIGFzIEZ1dGFyY2h5LCBwcm92aWRlcik7XG4gICAgdGhpcy52YXVsdCA9IG5ldyBWYXVsdENsaWVudChwcm92aWRlcik7XG4gICAgdGhpcy5hbW0gPSBuZXcgQU1NQ2xpZW50KHByb3ZpZGVyKTtcbiAgICB0aGlzLmRlZmF1bHRDb21wdXRlVW5pdHMgPSBjb21wdXRlVW5pdHMgPz8gREVGQVVMVF9DT01QVVRFX1VOSVRTO1xuICB9XG5cbiAgLyogUERBIEhlbHBlcnMgKi9cblxuICBkZXJpdmVEQU9QREEobmFtZTogc3RyaW5nKTogW1B1YmxpY0tleSwgbnVtYmVyXSB7XG4gICAgcmV0dXJuIGRlcml2ZURBT1BEQShuYW1lLCB0aGlzLnByb2dyYW1JZCk7XG4gIH1cblxuICBkZXJpdmVNb2RlcmF0b3JQREEobmFtZTogc3RyaW5nKTogW1B1YmxpY0tleSwgbnVtYmVyXSB7XG4gICAgcmV0dXJuIGRlcml2ZU1vZGVyYXRvclBEQShuYW1lLCB0aGlzLnByb2dyYW1JZCk7XG4gIH1cblxuICBkZXJpdmVQcm9wb3NhbFBEQShtb2RlcmF0b3I6IFB1YmxpY0tleSwgcHJvcG9zYWxJZDogbnVtYmVyKTogW1B1YmxpY0tleSwgbnVtYmVyXSB7XG4gICAgcmV0dXJuIGRlcml2ZVByb3Bvc2FsUERBKG1vZGVyYXRvciwgcHJvcG9zYWxJZCwgdGhpcy5wcm9ncmFtSWQpO1xuICB9XG5cbiAgLyogRmV0Y2hlcnMgKi9cblxuICBhc3luYyBmZXRjaERBTyhkYW9QZGE6IFB1YmxpY0tleSk6IFByb21pc2U8REFPQWNjb3VudD4ge1xuICAgIHJldHVybiBmZXRjaERBT0FjY291bnQodGhpcy5wcm9ncmFtLCBkYW9QZGEpO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hNb2RlcmF0b3IobW9kZXJhdG9yUGRhOiBQdWJsaWNLZXkpOiBQcm9taXNlPE1vZGVyYXRvckFjY291bnQ+IHtcbiAgICByZXR1cm4gZmV0Y2hNb2RlcmF0b3JBY2NvdW50KHRoaXMucHJvZ3JhbSwgbW9kZXJhdG9yUGRhKTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoUHJvcG9zYWwocHJvcG9zYWxQZGE6IFB1YmxpY0tleSk6IFByb21pc2U8UHJvcG9zYWxBY2NvdW50PiB7XG4gICAgcmV0dXJuIGZldGNoUHJvcG9zYWxBY2NvdW50KHRoaXMucHJvZ3JhbSwgcHJvcG9zYWxQZGEpO1xuICB9XG5cbiAgLyogUHJvcG9zYWwgSGVscGVycyAqL1xuXG4gIGlzUHJvcG9zYWxFeHBpcmVkKHByb3Bvc2FsOiBQcm9wb3NhbEFjY291bnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNQcm9wb3NhbEV4cGlyZWQocHJvcG9zYWwpO1xuICB9XG5cbiAgZ2V0VGltZVJlbWFpbmluZyhwcm9wb3NhbDogUHJvcG9zYWxBY2NvdW50KTogbnVtYmVyIHtcbiAgICByZXR1cm4gZ2V0VGltZVJlbWFpbmluZyhwcm9wb3NhbCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbXB1dGVVbml0cyhvcHRpb25zPzogVHhPcHRpb25zKTogbnVtYmVyIHtcbiAgICByZXR1cm4gb3B0aW9ucz8uY29tcHV0ZVVuaXRzID8/IHRoaXMuZGVmYXVsdENvbXB1dGVVbml0cztcbiAgfVxuXG4gIHByaXZhdGUgbWF5YmVBZGRDb21wdXRlQnVkZ2V0KG9wdGlvbnM/OiBUeE9wdGlvbnMpOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10ge1xuICAgIGlmIChvcHRpb25zPy5pbmNsdWRlQ3VCdWRnZXQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBbQ29tcHV0ZUJ1ZGdldFByb2dyYW0uc2V0Q29tcHV0ZVVuaXRMaW1pdCh7IHVuaXRzOiB0aGlzLmdldENvbXB1dGVVbml0cyhvcHRpb25zKSB9KV07XG4gIH1cblxuICAvKiBJbnN0cnVjdGlvbiBCdWlsZGVycyAqL1xuXG4gIGFzeW5jIGluaXRpYWxpemVNb2RlcmF0b3IoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBiYXNlTWludDogUHVibGljS2V5LFxuICAgIHF1b3RlTWludDogUHVibGljS2V5LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHhPcHRpb25zXG4gICkge1xuICAgIGNvbnN0IFttb2RlcmF0b3JQZGFdID0gdGhpcy5kZXJpdmVNb2RlcmF0b3JQREEobmFtZSk7XG5cbiAgICBjb25zdCBidWlsZGVyID0gaW5pdGlhbGl6ZU1vZGVyYXRvcihcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGFkbWluLFxuICAgICAgYmFzZU1pbnQsXG4gICAgICBxdW90ZU1pbnQsXG4gICAgICBtb2RlcmF0b3JQZGEsXG4gICAgICBuYW1lXG4gICAgKS5wcmVJbnN0cnVjdGlvbnModGhpcy5tYXliZUFkZENvbXB1dGVCdWRnZXQob3B0aW9ucykpO1xuXG4gICAgcmV0dXJuIHsgYnVpbGRlciwgbW9kZXJhdG9yUGRhLCBuYW1lIH07XG4gIH1cblxuICBhc3luYyBhZGRIaXN0b3JpY2FsUHJvcG9zYWwoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBtb2RlcmF0b3JQZGE6IFB1YmxpY0tleSxcbiAgICBudW1PcHRpb25zOiBudW1iZXIsXG4gICAgd2lubmluZ0lkeDogbnVtYmVyLFxuICAgIGxlbmd0aDogbnVtYmVyLFxuICAgIGNyZWF0ZWRBdDogQk4gfCBudW1iZXIsXG4gICAgb3B0aW9ucz86IFR4T3B0aW9uc1xuICApIHtcbiAgICBjb25zdCBtb2RlcmF0b3IgPSBhd2FpdCB0aGlzLmZldGNoTW9kZXJhdG9yKG1vZGVyYXRvclBkYSk7XG4gICAgY29uc3QgcHJvcG9zYWxJZCA9IG1vZGVyYXRvci5wcm9wb3NhbElkQ291bnRlcjtcbiAgICBjb25zdCBbcHJvcG9zYWxQZGFdID0gdGhpcy5kZXJpdmVQcm9wb3NhbFBEQShtb2RlcmF0b3JQZGEsIHByb3Bvc2FsSWQpO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IGFkZEhpc3RvcmljYWxQcm9wb3NhbChcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGFkbWluLFxuICAgICAgbW9kZXJhdG9yUGRhLFxuICAgICAgcHJvcG9zYWxQZGEsXG4gICAgICBudW1PcHRpb25zLFxuICAgICAgd2lubmluZ0lkeCxcbiAgICAgIGxlbmd0aCxcbiAgICAgIGNyZWF0ZWRBdFxuICAgICkucHJlSW5zdHJ1Y3Rpb25zKHRoaXMubWF5YmVBZGRDb21wdXRlQnVkZ2V0KG9wdGlvbnMpKTtcblxuICAgIHJldHVybiB7IGJ1aWxkZXIsIHByb3Bvc2FsUGRhLCBwcm9wb3NhbElkIH07XG4gIH1cblxuICBhc3luYyBpbml0aWFsaXplUHJvcG9zYWwoXG4gICAgY3JlYXRvcjogUHVibGljS2V5LFxuICAgIG1vZGVyYXRvclBkYTogUHVibGljS2V5LFxuICAgIHByb3Bvc2FsUGFyYW1zOiBQcm9wb3NhbFBhcmFtcyxcbiAgICBtZXRhZGF0YT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHhPcHRpb25zXG4gICkge1xuICAgIGNvbnN0IG1vZGVyYXRvciA9IGF3YWl0IHRoaXMuZmV0Y2hNb2RlcmF0b3IobW9kZXJhdG9yUGRhKTtcbiAgICBjb25zdCBwcm9wb3NhbElkID0gbW9kZXJhdG9yLnByb3Bvc2FsSWRDb3VudGVyO1xuICAgIGNvbnN0IFtwcm9wb3NhbFBkYV0gPSB0aGlzLmRlcml2ZVByb3Bvc2FsUERBKG1vZGVyYXRvclBkYSwgcHJvcG9zYWxJZCk7XG5cbiAgICAvLyBEZXJpdmUgdmF1bHQgUERBIChwcm9wb3NhbCBpcyB0aGUgb3duZXIsIG5vbmNlPXByb3Bvc2FsSWQpXG4gICAgY29uc3QgW3ZhdWx0UGRhXSA9IGRlcml2ZVZhdWx0UERBKHByb3Bvc2FsUGRhLCBwcm9wb3NhbElkLCB0aGlzLnZhdWx0LnByb2dyYW1JZCk7XG5cbiAgICAvLyBEZXJpdmUgY29uZGl0aW9uYWwgbWludHMgZm9yIGluaXRpYWwgMiBvcHRpb25zXG4gICAgY29uc3QgW2NvbmRCYXNlTWludDBdID0gZGVyaXZlQ29uZGl0aW9uYWxNaW50KHZhdWx0UGRhLCBWYXVsdFR5cGUuQmFzZSwgMCwgdGhpcy52YXVsdC5wcm9ncmFtSWQpO1xuICAgIGNvbnN0IFtjb25kQmFzZU1pbnQxXSA9IGRlcml2ZUNvbmRpdGlvbmFsTWludCh2YXVsdFBkYSwgVmF1bHRUeXBlLkJhc2UsIDEsIHRoaXMudmF1bHQucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbY29uZFF1b3RlTWludDBdID0gZGVyaXZlQ29uZGl0aW9uYWxNaW50KHZhdWx0UGRhLCBWYXVsdFR5cGUuUXVvdGUsIDAsIHRoaXMudmF1bHQucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbY29uZFF1b3RlTWludDFdID0gZGVyaXZlQ29uZGl0aW9uYWxNaW50KHZhdWx0UGRhLCBWYXVsdFR5cGUuUXVvdGUsIDEsIHRoaXMudmF1bHQucHJvZ3JhbUlkKTtcblxuICAgIC8vIERlcml2ZSBwb29sIFBEQXMgZm9yIGluaXRpYWwgMiBvcHRpb25zIChwcm9wb3NhbCBpcyBhZG1pbiwgbWludEE9Y29uZFF1b3RlLCBtaW50Qj1jb25kQmFzZSlcbiAgICBjb25zdCBbcG9vbDBdID0gZGVyaXZlUG9vbFBEQShwcm9wb3NhbFBkYSwgY29uZFF1b3RlTWludDAsIGNvbmRCYXNlTWludDAsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgY29uc3QgW3Bvb2wxXSA9IGRlcml2ZVBvb2xQREEocHJvcG9zYWxQZGEsIGNvbmRRdW90ZU1pbnQxLCBjb25kQmFzZU1pbnQxLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuXG4gICAgLy8gRGVyaXZlIHJlc2VydmVzIGFuZCBmZWUgdmF1bHRzXG4gICAgY29uc3QgW3Jlc2VydmVBMF0gPSBkZXJpdmVSZXNlcnZlUERBKHBvb2wwLCBjb25kUXVvdGVNaW50MCwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUIwXSA9IGRlcml2ZVJlc2VydmVQREEocG9vbDAsIGNvbmRCYXNlTWludDAsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgY29uc3QgW2ZlZVZhdWx0MF0gPSBkZXJpdmVGZWVWYXVsdFBEQShwb29sMCwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUExXSA9IGRlcml2ZVJlc2VydmVQREEocG9vbDEsIGNvbmRRdW90ZU1pbnQxLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgIGNvbnN0IFtyZXNlcnZlQjFdID0gZGVyaXZlUmVzZXJ2ZVBEQShwb29sMSwgY29uZEJhc2VNaW50MSwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbZmVlVmF1bHQxXSA9IGRlcml2ZUZlZVZhdWx0UERBKHBvb2wxLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuXG4gICAgLy8gVmF1bHQgdG9rZW4gYWNjb3VudHNcbiAgICBjb25zdCBiYXNlVG9rZW5BY2MgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtb2RlcmF0b3IuYmFzZU1pbnQsIHZhdWx0UGRhLCB0cnVlKTtcbiAgICBjb25zdCBxdW90ZVRva2VuQWNjID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobW9kZXJhdG9yLnF1b3RlTWludCwgdmF1bHRQZGEsIHRydWUpO1xuXG4gICAgLy8gQnVpbGQgcmVtYWluaW5nIGFjY291bnRzIGluIGV4cGVjdGVkIG9yZGVyIChzZWUgaW5pdGlhbGl6ZV9wcm9wb3NhbC5ycylcbiAgICBjb25zdCByZW1haW5pbmdBY2NvdW50cyA9IFtcbiAgICAgIHsgcHVia2V5OiBtb2RlcmF0b3IuYmFzZU1pbnQsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSwgICAgICAvLyAwOiBiYXNlX21pbnRcbiAgICAgIHsgcHVia2V5OiBtb2RlcmF0b3IucXVvdGVNaW50LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sICAgICAvLyAxOiBxdW90ZV9taW50XG4gICAgICB7IHB1YmtleTogdmF1bHRQZGEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAgICAgLy8gMjogdmF1bHRcbiAgICAgIHsgcHVia2V5OiBiYXNlVG9rZW5BY2MsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAvLyAzOiBiYXNlX3Rva2VuX2FjY1xuICAgICAgeyBwdWJrZXk6IHF1b3RlVG9rZW5BY2MsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgIC8vIDQ6IHF1b3RlX3Rva2VuX2FjY1xuICAgICAgeyBwdWJrZXk6IGNvbmRCYXNlTWludDAsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgIC8vIDU6IGNvbmRfYmFzZV9taW50XzBcbiAgICAgIHsgcHVia2V5OiBjb25kQmFzZU1pbnQxLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAvLyA2OiBjb25kX2Jhc2VfbWludF8xXG4gICAgICB7IHB1YmtleTogY29uZFF1b3RlTWludDAsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgLy8gNzogY29uZF9xdW90ZV9taW50XzBcbiAgICAgIHsgcHVia2V5OiBjb25kUXVvdGVNaW50MSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAvLyA4OiBjb25kX3F1b3RlX21pbnRfMVxuICAgICAgeyBwdWJrZXk6IHBvb2wwLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgICAgICAgIC8vIDk6IHBvb2xfMFxuICAgICAgeyBwdWJrZXk6IHJlc2VydmVBMCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgIC8vIDEwOiByZXNlcnZlX2FfMFxuICAgICAgeyBwdWJrZXk6IHJlc2VydmVCMCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgIC8vIDExOiByZXNlcnZlX2JfMFxuICAgICAgeyBwdWJrZXk6IEZFRV9BVVRIT1JJVFksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSwgICAgICAgICAgIC8vIDEyOiBmZWVfYXV0aG9yaXR5XG4gICAgICB7IHB1YmtleTogZmVlVmF1bHQwLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgICAgLy8gMTM6IGZlZV92YXVsdF8wXG4gICAgICB7IHB1YmtleTogcG9vbDEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAgICAgICAgLy8gMTQ6IHBvb2xfMVxuICAgICAgeyBwdWJrZXk6IHJlc2VydmVBMSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgIC8vIDE1OiByZXNlcnZlX2FfMVxuICAgICAgeyBwdWJrZXk6IHJlc2VydmVCMSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgIC8vIDE2OiByZXNlcnZlX2JfMVxuICAgICAgeyBwdWJrZXk6IGZlZVZhdWx0MSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgIC8vIDE3OiBmZWVfdmF1bHRfMVxuICAgIF07XG5cbiAgICBjb25zdCBidWlsZGVyID0gaW5pdGlhbGl6ZVByb3Bvc2FsKFxuICAgICAgdGhpcy5wcm9ncmFtLFxuICAgICAgY3JlYXRvcixcbiAgICAgIG1vZGVyYXRvclBkYSxcbiAgICAgIHByb3Bvc2FsUGRhLFxuICAgICAgcHJvcG9zYWxQYXJhbXMsXG4gICAgICBtZXRhZGF0YSA/PyBudWxsLFxuICAgICAgcmVtYWluaW5nQWNjb3VudHNcbiAgICApLnByZUluc3RydWN0aW9ucyh0aGlzLm1heWJlQWRkQ29tcHV0ZUJ1ZGdldChvcHRpb25zKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYnVpbGRlcixcbiAgICAgIHByb3Bvc2FsUGRhLFxuICAgICAgcHJvcG9zYWxJZCxcbiAgICAgIHZhdWx0UGRhLFxuICAgICAgcG9vbHM6IFtwb29sMCwgcG9vbDFdLFxuICAgICAgY29uZEJhc2VNaW50czogW2NvbmRCYXNlTWludDAsIGNvbmRCYXNlTWludDFdLFxuICAgICAgY29uZFF1b3RlTWludHM6IFtjb25kUXVvdGVNaW50MCwgY29uZFF1b3RlTWludDFdLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBhZGRPcHRpb24oY3JlYXRvcjogUHVibGljS2V5LCBwcm9wb3NhbFBkYTogUHVibGljS2V5LCBvcHRpb25zPzogVHhPcHRpb25zKSB7XG4gICAgY29uc3QgcHJvcG9zYWwgPSBhd2FpdCB0aGlzLmZldGNoUHJvcG9zYWwocHJvcG9zYWxQZGEpO1xuICAgIGNvbnN0IG9wdGlvbkluZGV4ID0gcHJvcG9zYWwubnVtT3B0aW9ucztcblxuICAgIC8vIERlcml2ZSBuZXcgY29uZGl0aW9uYWwgbWludHNcbiAgICBjb25zdCBbY29uZEJhc2VNaW50XSA9IGRlcml2ZUNvbmRpdGlvbmFsTWludChwcm9wb3NhbC52YXVsdCwgVmF1bHRUeXBlLkJhc2UsIG9wdGlvbkluZGV4LCB0aGlzLnZhdWx0LnByb2dyYW1JZCk7XG4gICAgY29uc3QgW2NvbmRRdW90ZU1pbnRdID0gZGVyaXZlQ29uZGl0aW9uYWxNaW50KHByb3Bvc2FsLnZhdWx0LCBWYXVsdFR5cGUuUXVvdGUsIG9wdGlvbkluZGV4LCB0aGlzLnZhdWx0LnByb2dyYW1JZCk7XG5cbiAgICAvLyBEZXJpdmUgcG9vbCBQREFcbiAgICBjb25zdCBbcG9vbF0gPSBkZXJpdmVQb29sUERBKHByb3Bvc2FsUGRhLCBjb25kUXVvdGVNaW50LCBjb25kQmFzZU1pbnQsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgY29uc3QgW3Jlc2VydmVBXSA9IGRlcml2ZVJlc2VydmVQREEocG9vbCwgY29uZFF1b3RlTWludCwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUJdID0gZGVyaXZlUmVzZXJ2ZVBEQShwb29sLCBjb25kQmFzZU1pbnQsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgY29uc3QgW2ZlZVZhdWx0XSA9IGRlcml2ZUZlZVZhdWx0UERBKHBvb2wsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG5cbiAgICAvLyBCdWlsZCByZW1haW5pbmcgYWNjb3VudHMgKHNlZSBhZGRfb3B0aW9uLnJzKVxuICAgIGNvbnN0IHJlbWFpbmluZ0FjY291bnRzID0gW1xuICAgICAgeyBwdWJrZXk6IHByb3Bvc2FsLnZhdWx0LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgIC8vIDA6IHZhdWx0XG4gICAgICB7IHB1YmtleTogY29uZEJhc2VNaW50LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgLy8gMTogY29uZF9iYXNlX21pbnRcbiAgICAgIHsgcHVia2V5OiBjb25kUXVvdGVNaW50LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAvLyAyOiBjb25kX3F1b3RlX21pbnRcbiAgICAgIHsgcHVia2V5OiBwb29sLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgICAgICAgICAvLyAzOiBwb29sXG4gICAgICB7IHB1YmtleTogcmVzZXJ2ZUEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAgICAgLy8gNDogcmVzZXJ2ZV9hXG4gICAgICB7IHB1YmtleTogcmVzZXJ2ZUIsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAgICAgLy8gNTogcmVzZXJ2ZV9iXG4gICAgICB7IHB1YmtleTogRkVFX0FVVEhPUklUWSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LCAgICAgICAgICAgLy8gNjogZmVlX2F1dGhvcml0eVxuICAgICAgeyBwdWJrZXk6IGZlZVZhdWx0LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgICAgIC8vIDc6IGZlZV92YXVsdFxuICAgIF07XG5cbiAgICBjb25zdCBidWlsZGVyID0gYWRkT3B0aW9uKHRoaXMucHJvZ3JhbSwgY3JlYXRvciwgcHJvcG9zYWxQZGEsIHJlbWFpbmluZ0FjY291bnRzKVxuICAgICAgLnByZUluc3RydWN0aW9ucyh0aGlzLm1heWJlQWRkQ29tcHV0ZUJ1ZGdldChvcHRpb25zKSk7XG5cbiAgICByZXR1cm4geyBidWlsZGVyLCBvcHRpb25JbmRleCwgcG9vbCwgY29uZEJhc2VNaW50LCBjb25kUXVvdGVNaW50IH07XG4gIH1cblxuICBhc3luYyBsYXVuY2hQcm9wb3NhbChcbiAgICBjcmVhdG9yOiBQdWJsaWNLZXksXG4gICAgcHJvcG9zYWxQZGE6IFB1YmxpY0tleSxcbiAgICBiYXNlQW1vdW50OiBCTiB8IG51bWJlcixcbiAgICBxdW90ZUFtb3VudDogQk4gfCBudW1iZXIsXG4gICAgb3B0aW9ucz86IFR4T3B0aW9uc1xuICApIHtcbiAgICBjb25zdCBwcm9wb3NhbCA9IGF3YWl0IHRoaXMuZmV0Y2hQcm9wb3NhbChwcm9wb3NhbFBkYSk7XG4gICAgY29uc3QgdmF1bHQgPSBhd2FpdCB0aGlzLnZhdWx0LmZldGNoVmF1bHQocHJvcG9zYWwudmF1bHQpO1xuICAgIGNvbnN0IG51bU9wdGlvbnMgPSBwcm9wb3NhbC5udW1PcHRpb25zO1xuXG4gICAgLy8gU2xpY2UgYXJyYXlzIHRvIG51bU9wdGlvbnMgKGZpeGVkLXNpemUgYXJyYXlzIGZyb20gUnVzdCBpbmNsdWRlIGVtcHR5IHNsb3RzKVxuICAgIGNvbnN0IGNvbmRCYXNlTWludHMgPSB2YXVsdC5jb25kQmFzZU1pbnRzLnNsaWNlKDAsIG51bU9wdGlvbnMpO1xuICAgIGNvbnN0IGNvbmRRdW90ZU1pbnRzID0gdmF1bHQuY29uZFF1b3RlTWludHMuc2xpY2UoMCwgbnVtT3B0aW9ucyk7XG5cbiAgICAvLyBQcmUtY3JlYXRlIGNvbmRpdGlvbmFsIEFUQXMgZm9yIDMrIG9wdGlvbnMgdG8gYXZvaWQgZXhjZWVkaW5nIHRoZVxuICAgIC8vIDY0IGluc3RydWN0aW9uIHRyYWNlIGxpbWl0LiBFYWNoIEFUQSBjcmVhdGlvbiB2aWEgdmF1bHQgZGVwb3NpdCBhZGRzXG4gICAgLy8gNSBpbm5lciBpbnN0cnVjdGlvbnM7IHdpdGggNCBvcHRpb25zIHRoYXQncyA0MCBleHRyYSBpbnN0cnVjdGlvbnMuXG4gICAgY29uc3Qgc2hvdWxkRW5zdXJlQVRBcyA9IG9wdGlvbnM/LmVuc3VyZUFUQXMgPz8gKG51bU9wdGlvbnMgPj0gMyk7XG4gICAgaWYgKHNob3VsZEVuc3VyZUFUQXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2NyZWF0ZUNvbmRpdGlvbmFsQVRBcyhjcmVhdG9yLCBjb25kQmFzZU1pbnRzLCBjb25kUXVvdGVNaW50cyk7XG4gICAgfVxuICAgIGNvbnN0IHBvb2xzID0gcHJvcG9zYWwucG9vbHMuc2xpY2UoMCwgbnVtT3B0aW9ucyk7XG5cbiAgICAvLyBEZXJpdmUgYWxsIHVzZXIgY29uZGl0aW9uYWwgdG9rZW4gQVRBc1xuICAgIGNvbnN0IHVzZXJDb25kQmFzZUFUQXMgPSBjb25kQmFzZU1pbnRzLm1hcCgobSkgPT4gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobSwgY3JlYXRvcikpO1xuICAgIGNvbnN0IHVzZXJDb25kUXVvdGVBVEFzID0gY29uZFF1b3RlTWludHMubWFwKChtKSA9PiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtLCBjcmVhdG9yKSk7XG5cbiAgICAvLyBEZXJpdmUgcmVzZXJ2ZSBhY2NvdW50cyBmb3IgZWFjaCBwb29sXG4gICAgY29uc3QgcmVzZXJ2ZXNBOiBQdWJsaWNLZXlbXSA9IFtdO1xuICAgIGNvbnN0IHJlc2VydmVzQjogUHVibGljS2V5W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9wdGlvbnM7IGkrKykge1xuICAgICAgY29uc3QgW3Jlc0FdID0gZGVyaXZlUmVzZXJ2ZVBEQShwb29sc1tpXSwgY29uZFF1b3RlTWludHNbaV0sIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgICBjb25zdCBbcmVzQl0gPSBkZXJpdmVSZXNlcnZlUERBKHBvb2xzW2ldLCBjb25kQmFzZU1pbnRzW2ldLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgICAgcmVzZXJ2ZXNBLnB1c2gocmVzQSk7XG4gICAgICByZXNlcnZlc0IucHVzaChyZXNCKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCByZW1haW5pbmcgYWNjb3VudHMgKHNlZSBsYXVuY2hfcHJvcG9zYWwucnMpXG4gICAgLy8gTGF5b3V0OiA2IGZpeGVkICsgNypOIHZhcmlhYmxlXG4gICAgY29uc3QgcmVtYWluaW5nQWNjb3VudHM6IHsgcHVia2V5OiBQdWJsaWNLZXk7IGlzU2lnbmVyOiBib29sZWFuOyBpc1dyaXRhYmxlOiBib29sZWFuIH1bXSA9IFtcbiAgICAgIHsgcHVia2V5OiB2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDogYmFzZV9taW50XG4gICAgICB7IHB1YmtleTogdmF1bHQucXVvdGVNaW50LmFkZHJlc3MsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHF1b3RlX21pbnRcbiAgICAgIHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBwcm9wb3NhbC52YXVsdCwgdHJ1ZSksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgIC8vIDI6IHZhdWx0X2Jhc2VfYXRhXG4gICAgICB7IHB1YmtleTogZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQucXVvdGVNaW50LmFkZHJlc3MsIHByb3Bvc2FsLnZhdWx0LCB0cnVlKSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAvLyAzOiB2YXVsdF9xdW90ZV9hdGFcbiAgICAgIHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBjcmVhdG9yKSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAvLyA0OiB1c2VyX2Jhc2VfYXRhXG4gICAgICB7IHB1YmtleTogZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQucXVvdGVNaW50LmFkZHJlc3MsIGNyZWF0b3IpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgLy8gNTogdXNlcl9xdW90ZV9hdGFcbiAgICBdO1xuXG4gICAgLy8gNi4uNitOOiBjb25kX2Jhc2VfbWludHNcbiAgICBmb3IgKGNvbnN0IG1pbnQgb2YgY29uZEJhc2VNaW50cykge1xuICAgICAgcmVtYWluaW5nQWNjb3VudHMucHVzaCh7IHB1YmtleTogbWludCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgICAvLyA2K04uLjYrMk46IGNvbmRfcXVvdGVfbWludHNcbiAgICBmb3IgKGNvbnN0IG1pbnQgb2YgY29uZFF1b3RlTWludHMpIHtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IG1pbnQsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLy8gNisyTi4uNiszTjogdXNlcl9jb25kX2Jhc2VfYXRhc1xuICAgIGZvciAoY29uc3QgYXRhIG9mIHVzZXJDb25kQmFzZUFUQXMpIHtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IGF0YSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgICAvLyA2KzNOLi42KzROOiB1c2VyX2NvbmRfcXVvdGVfYXRhc1xuICAgIGZvciAoY29uc3QgYXRhIG9mIHVzZXJDb25kUXVvdGVBVEFzKSB7XG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiBhdGEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLy8gNis0Ti4uNis1TjogcG9vbHNcbiAgICBmb3IgKGNvbnN0IHBvb2wgb2YgcG9vbHMpIHtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IHBvb2wsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLy8gNis1Ti4uNis2TjogcmVzZXJ2ZXNfYVxuICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc2VydmVzQSkge1xuICAgICAgcmVtYWluaW5nQWNjb3VudHMucHVzaCh7IHB1YmtleTogcmVzLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gICAgfVxuICAgIC8vIDYrNk4uLjYrN046IHJlc2VydmVzX2JcbiAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXNlcnZlc0IpIHtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IHJlcywgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBsYXVuY2hQcm9wb3NhbChcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGNyZWF0b3IsXG4gICAgICBwcm9wb3NhbFBkYSxcbiAgICAgIHByb3Bvc2FsLnZhdWx0LFxuICAgICAgYmFzZUFtb3VudCxcbiAgICAgIHF1b3RlQW1vdW50LFxuICAgICAgcmVtYWluaW5nQWNjb3VudHNcbiAgICApLnByZUluc3RydWN0aW9ucyh0aGlzLm1heWJlQWRkQ29tcHV0ZUJ1ZGdldChvcHRpb25zKSk7XG5cbiAgICByZXR1cm4geyBidWlsZGVyIH07XG4gIH1cblxuICAvKipcbiAgICogUHJlLWNyZWF0ZXMgYWxsIGNvbmRpdGlvbmFsIHRva2VuIEFUQXMgZm9yIGEgdXNlciBiZWZvcmUgbGF1bmNoaW5nIGEgcHJvcG9zYWwuXG4gICAqXG4gICAqIFRoaXMgaXMgUkVRVUlSRUQgZm9yIHByb3Bvc2FscyB3aXRoIDMrIG9wdGlvbnMgdG8gYXZvaWQgZXhjZWVkaW5nIFNvbGFuYSdzXG4gICAqIG1heCBpbnN0cnVjdGlvbiB0cmFjZSBsZW5ndGggbGltaXQgKDY0IGluc3RydWN0aW9ucykuIFRoZSB2YXVsdCdzIGRlcG9zaXQgQ1BJXG4gICAqIGNyZWF0ZXMgQVRBcyBvbi10aGUtZmx5LCBlYWNoIHJlcXVpcmluZyA1IGlubmVyIGluc3RydWN0aW9ucy4gRm9yIDQgb3B0aW9uczpcbiAgICogOCBBVEFzIMOXIDUgPSA0MCBleHRyYSBpbnN0cnVjdGlvbnMsIHB1c2hpbmcgdGhlIHRvdGFsIG92ZXIgNjQuXG4gICAqXG4gICAqIFByZS1jcmVhdGluZyBBVEFzIGVsaW1pbmF0ZXMgdGhpcyBvdmVyaGVhZCwgcmVkdWNpbmcgdGhlIHRyYWNlIHRvIH4zMiBpbnN0cnVjdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBjcmVhdG9yIC0gVGhlIHVzZXIgd2hvIHdpbGwgcmVjZWl2ZSBjb25kaXRpb25hbCB0b2tlbnNcbiAgICogQHBhcmFtIHByb3Bvc2FsUGRhIC0gVGhlIHByb3Bvc2FsIFBEQSAobXVzdCBiZSBpbml0aWFsaXplZCBidXQgbm90IGxhdW5jaGVkKVxuICAgKiBAcmV0dXJucyBUcmFuc2FjdGlvbiBzaWduYXR1cmVcbiAgICovXG4gIGFzeW5jIGVuc3VyZUNvbmRpdGlvbmFsQVRBcyhcbiAgICBjcmVhdG9yOiBQdWJsaWNLZXksXG4gICAgcHJvcG9zYWxQZGE6IFB1YmxpY0tleSxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwcm9wb3NhbCA9IGF3YWl0IHRoaXMuZmV0Y2hQcm9wb3NhbChwcm9wb3NhbFBkYSk7XG4gICAgY29uc3QgdmF1bHQgPSBhd2FpdCB0aGlzLnZhdWx0LmZldGNoVmF1bHQocHJvcG9zYWwudmF1bHQpO1xuICAgIGNvbnN0IGNvbmRCYXNlTWludHMgPSB2YXVsdC5jb25kQmFzZU1pbnRzLnNsaWNlKDAsIHByb3Bvc2FsLm51bU9wdGlvbnMpO1xuICAgIGNvbnN0IGNvbmRRdW90ZU1pbnRzID0gdmF1bHQuY29uZFF1b3RlTWludHMuc2xpY2UoMCwgcHJvcG9zYWwubnVtT3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUNvbmRpdGlvbmFsQVRBcyhjcmVhdG9yLCBjb25kQmFzZU1pbnRzLCBjb25kUXVvdGVNaW50cyk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgaGVscGVyIHRvIGNyZWF0ZSBjb25kaXRpb25hbCBBVEFzIGdpdmVuIG1pbnQgYXJyYXlzLlxuICAgKiBVc2VkIGJ5IGJvdGggZW5zdXJlQ29uZGl0aW9uYWxBVEFzIGFuZCBsYXVuY2hQcm9wb3NhbCB0byBhdm9pZCByZWR1bmRhbnQgZmV0Y2hlcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2NyZWF0ZUNvbmRpdGlvbmFsQVRBcyhcbiAgICBjcmVhdG9yOiBQdWJsaWNLZXksXG4gICAgY29uZEJhc2VNaW50czogUHVibGljS2V5W10sXG4gICAgY29uZFF1b3RlTWludHM6IFB1YmxpY0tleVtdLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5wcm9ncmFtLnByb3ZpZGVyIGFzIEFuY2hvclByb3ZpZGVyO1xuXG4gICAgLy8gQnVpbGQgQVRBIGNyZWF0aW9uIGluc3RydWN0aW9ucyAoaWRlbXBvdGVudCAtIHdvbid0IGZhaWwgaWYgZXhpc3RzKVxuICAgIGNvbnN0IGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25kQmFzZU1pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB1c2VyQ29uZEJhc2VBdGEgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhjb25kQmFzZU1pbnRzW2ldLCBjcmVhdG9yKTtcbiAgICAgIGNvbnN0IHVzZXJDb25kUXVvdGVBdGEgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhjb25kUXVvdGVNaW50c1tpXSwgY3JlYXRvcik7XG5cbiAgICAgIGluc3RydWN0aW9ucy5wdXNoKFxuICAgICAgICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SWRlbXBvdGVudEluc3RydWN0aW9uKFxuICAgICAgICAgIGNyZWF0b3IsXG4gICAgICAgICAgdXNlckNvbmRCYXNlQXRhLFxuICAgICAgICAgIGNyZWF0b3IsXG4gICAgICAgICAgY29uZEJhc2VNaW50c1tpXVxuICAgICAgICApLFxuICAgICAgICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SWRlbXBvdGVudEluc3RydWN0aW9uKFxuICAgICAgICAgIGNyZWF0b3IsXG4gICAgICAgICAgdXNlckNvbmRRdW90ZUF0YSxcbiAgICAgICAgICBjcmVhdG9yLFxuICAgICAgICAgIGNvbmRRdW90ZU1pbnRzW2ldXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU2VuZCB0cmFuc2FjdGlvblxuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKC4uLmluc3RydWN0aW9ucyk7XG4gICAgcmV0dXJuIHByb3ZpZGVyLnNlbmRBbmRDb25maXJtKHR4KTtcbiAgfVxuXG4gIGFzeW5jIGZpbmFsaXplUHJvcG9zYWwoc2lnbmVyOiBQdWJsaWNLZXksIHByb3Bvc2FsUGRhOiBQdWJsaWNLZXksIG9wdGlvbnM/OiBUeE9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm9wb3NhbCA9IGF3YWl0IHRoaXMuZmV0Y2hQcm9wb3NhbChwcm9wb3NhbFBkYSk7XG4gICAgY29uc3QgdmF1bHQgPSBhd2FpdCB0aGlzLnZhdWx0LmZldGNoVmF1bHQocHJvcG9zYWwudmF1bHQpO1xuICAgIGNvbnN0IG51bU9wdGlvbnMgPSBwcm9wb3NhbC5udW1PcHRpb25zO1xuXG4gICAgLy8gQnVpbGQgcmVtYWluaW5nIGFjY291bnRzICgzIHBlciBwb29sOiBwb29sLCByZXNlcnZlX2EsIHJlc2VydmVfYilcbiAgICBjb25zdCByZW1haW5pbmdBY2NvdW50czogeyBwdWJrZXk6IFB1YmxpY0tleTsgaXNTaWduZXI6IGJvb2xlYW47IGlzV3JpdGFibGU6IGJvb2xlYW4gfVtdID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9wdGlvbnM7IGkrKykge1xuICAgICAgY29uc3QgcG9vbCA9IHByb3Bvc2FsLnBvb2xzW2ldO1xuICAgICAgY29uc3QgW3Jlc2VydmVBXSA9IGRlcml2ZVJlc2VydmVQREEocG9vbCwgdmF1bHQuY29uZFF1b3RlTWludHNbaV0sIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgICBjb25zdCBbcmVzZXJ2ZUJdID0gZGVyaXZlUmVzZXJ2ZVBEQShwb29sLCB2YXVsdC5jb25kQmFzZU1pbnRzW2ldLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuXG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiBwb29sLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiByZXNlcnZlQSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9KTtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IHJlc2VydmVCLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBmaW5hbGl6ZVByb3Bvc2FsKFxuICAgICAgdGhpcy5wcm9ncmFtLFxuICAgICAgc2lnbmVyLFxuICAgICAgcHJvcG9zYWxQZGEsXG4gICAgICBwcm9wb3NhbC52YXVsdCxcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzXG4gICAgKS5wcmVJbnN0cnVjdGlvbnModGhpcy5tYXliZUFkZENvbXB1dGVCdWRnZXQob3B0aW9ucykpO1xuXG4gICAgcmV0dXJuIHsgYnVpbGRlciB9O1xuICB9XG5cbiAgYXN5bmMgcmVkZWVtTGlxdWlkaXR5KGNyZWF0b3I6IFB1YmxpY0tleSwgcHJvcG9zYWxQZGE6IFB1YmxpY0tleSwgb3B0aW9ucz86IFR4T3B0aW9ucykge1xuICAgIGNvbnN0IHByb3Bvc2FsID0gYXdhaXQgdGhpcy5mZXRjaFByb3Bvc2FsKHByb3Bvc2FsUGRhKTtcbiAgICBjb25zdCB2YXVsdCA9IGF3YWl0IHRoaXMudmF1bHQuZmV0Y2hWYXVsdChwcm9wb3NhbC52YXVsdCk7XG4gICAgY29uc3QgbnVtT3B0aW9ucyA9IHByb3Bvc2FsLm51bU9wdGlvbnM7XG5cbiAgICBjb25zdCB7IHdpbm5pbmdJZHggfSA9IHBhcnNlUHJvcG9zYWxTdGF0ZShwcm9wb3NhbC5zdGF0ZSk7XG4gICAgaWYgKHdpbm5pbmdJZHggPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlByb3Bvc2FsIG5vdCBmaW5hbGl6ZWRcIik7XG4gICAgfVxuICAgIGNvbnN0IHdpbm5pbmdQb29sID0gcHJvcG9zYWwucG9vbHNbd2lubmluZ0lkeF07XG5cbiAgICAvLyBEZXJpdmUgd2lubmluZyBwb29sIHJlc2VydmVzXG4gICAgY29uc3QgW3Jlc2VydmVBXSA9IGRlcml2ZVJlc2VydmVQREEod2lubmluZ1Bvb2wsIHZhdWx0LmNvbmRRdW90ZU1pbnRzW3dpbm5pbmdJZHhdLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgIGNvbnN0IFtyZXNlcnZlQl0gPSBkZXJpdmVSZXNlcnZlUERBKHdpbm5pbmdQb29sLCB2YXVsdC5jb25kQmFzZU1pbnRzW3dpbm5pbmdJZHhdLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuXG4gICAgLy8gVXNlcidzIHdpbm5pbmcgY29uZGl0aW9uYWwgdG9rZW4gQVRBc1xuICAgIGNvbnN0IGNyZWF0b3JDb25kUXVvdGVBdGEgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5jb25kUXVvdGVNaW50c1t3aW5uaW5nSWR4XSwgY3JlYXRvcik7XG4gICAgY29uc3QgY3JlYXRvckNvbmRCYXNlQXRhID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQuY29uZEJhc2VNaW50c1t3aW5uaW5nSWR4XSwgY3JlYXRvcik7XG5cbiAgICAvLyBCdWlsZCByZW1haW5pbmcgYWNjb3VudHMgKHNlZSByZWRlZW1fbGlxdWlkaXR5LnJzKVxuICAgIGNvbnN0IHJlbWFpbmluZ0FjY291bnRzOiB7IHB1YmtleTogUHVibGljS2V5OyBpc1NpZ25lcjogYm9vbGVhbjsgaXNXcml0YWJsZTogYm9vbGVhbiB9W10gPSBbXG4gICAgICAvLyByZW1vdmVfbGlxdWlkaXR5IGFjY291bnRzICgwLTMpXG4gICAgICB7IHB1YmtleTogcmVzZXJ2ZUEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBwdWJrZXk6IHJlc2VydmVCLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgIHsgcHVia2V5OiBjcmVhdG9yQ29uZFF1b3RlQXRhLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgIHsgcHVia2V5OiBjcmVhdG9yQ29uZEJhc2VBdGEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuXG4gICAgICAvLyByZWRlZW1fd2lubmluZ3MgYmFzZSBmaXhlZCBhY2NvdW50cyAoNC02KVxuICAgICAgeyBwdWJrZXk6IHZhdWx0LmJhc2VNaW50LmFkZHJlc3MsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICAgIHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBwcm9wb3NhbC52YXVsdCwgdHJ1ZSksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBwdWJrZXk6IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHZhdWx0LmJhc2VNaW50LmFkZHJlc3MsIGNyZWF0b3IpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICBdO1xuXG4gICAgLy8gcmVkZWVtX3dpbm5pbmdzIGJhc2UgcmVtYWluaW5nICg3Li43KzJOKTogW2NvbmRfYmFzZV9taW50X2ksIHVzZXJfY29uZF9iYXNlX2F0YV9pXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtT3B0aW9uczsgaSsrKSB7XG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiB2YXVsdC5jb25kQmFzZU1pbnRzW2ldLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5jb25kQmFzZU1pbnRzW2ldLCBjcmVhdG9yKSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIHJlZGVlbV93aW5uaW5ncyBxdW90ZSBmaXhlZCBhY2NvdW50c1xuICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IHZhdWx0LnF1b3RlTWludC5hZGRyZXNzLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0pO1xuICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHZhdWx0LnF1b3RlTWludC5hZGRyZXNzLCBwcm9wb3NhbC52YXVsdCwgdHJ1ZSksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5xdW90ZU1pbnQuYWRkcmVzcywgY3JlYXRvciksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcblxuICAgIC8vIHJlZGVlbV93aW5uaW5ncyBxdW90ZSByZW1haW5pbmc6IFtjb25kX3F1b3RlX21pbnRfaSwgdXNlcl9jb25kX3F1b3RlX2F0YV9pXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtT3B0aW9uczsgaSsrKSB7XG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiB2YXVsdC5jb25kUXVvdGVNaW50c1tpXSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgICAgcmVtYWluaW5nQWNjb3VudHMucHVzaCh7IHB1YmtleTogZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQuY29uZFF1b3RlTWludHNbaV0sIGNyZWF0b3IpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRlciA9IHJlZGVlbUxpcXVpZGl0eShcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGNyZWF0b3IsXG4gICAgICBwcm9wb3NhbFBkYSxcbiAgICAgIHByb3Bvc2FsLnZhdWx0LFxuICAgICAgd2lubmluZ1Bvb2wsXG4gICAgICByZW1haW5pbmdBY2NvdW50c1xuICAgICkucHJlSW5zdHJ1Y3Rpb25zKHRoaXMubWF5YmVBZGRDb21wdXRlQnVkZ2V0KG9wdGlvbnMpKTtcblxuICAgIHJldHVybiB7IGJ1aWxkZXIsIG51bU9wdGlvbnMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIEFkZHJlc3MgTG9va3VwIFRhYmxlIGZvciByZWRlbXB0aW9uIG9wZXJhdGlvbnMuXG4gICAqIFJlcXVpcmVkIGZvciBwcm9wb3NhbHMgd2l0aCAzKyBvcHRpb25zIHRvIGF2b2lkIGV4Y2VlZGluZyB0cmFuc2FjdGlvbiBzaXplIGxpbWl0cy5cbiAgICpcbiAgICogQHBhcmFtIGNyZWF0b3IgLSBUaGUgdXNlciByZWRlZW1pbmcgKGNyZWF0b3Igb2YgcHJvcG9zYWwgb3IgbGlxdWlkaXR5IHByb3ZpZGVyKVxuICAgKiBAcGFyYW0gcHJvcG9zYWxQZGEgLSBUaGUgcHJvcG9zYWwgUERBXG4gICAqIEByZXR1cm5zIEFMVCBhZGRyZXNzXG4gICAqL1xuICBhc3luYyBjcmVhdGVSZWRlbXB0aW9uQUxUKFxuICAgIGNyZWF0b3I6IFB1YmxpY0tleSxcbiAgICBwcm9wb3NhbFBkYTogUHVibGljS2V5LFxuICApOiBQcm9taXNlPHsgYWx0QWRkcmVzczogUHVibGljS2V5IH0+IHtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMucHJvZ3JhbS5wcm92aWRlciBhcyBBbmNob3JQcm92aWRlcjtcbiAgICBjb25zdCBwcm9wb3NhbCA9IGF3YWl0IHRoaXMuZmV0Y2hQcm9wb3NhbChwcm9wb3NhbFBkYSk7XG4gICAgY29uc3QgdmF1bHQgPSBhd2FpdCB0aGlzLnZhdWx0LmZldGNoVmF1bHQocHJvcG9zYWwudmF1bHQpO1xuICAgIGNvbnN0IG51bU9wdGlvbnMgPSBwcm9wb3NhbC5udW1PcHRpb25zO1xuXG4gICAgY29uc3QgeyB3aW5uaW5nSWR4IH0gPSBwYXJzZVByb3Bvc2FsU3RhdGUocHJvcG9zYWwuc3RhdGUpO1xuICAgIGlmICh3aW5uaW5nSWR4ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm9wb3NhbCBub3QgZmluYWxpemVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZHJlc3NlczogUHVibGljS2V5W10gPSBbXG4gICAgICAvLyBQcm9ncmFtc1xuICAgICAgdGhpcy5wcm9ncmFtSWQsXG4gICAgICB0aGlzLnZhdWx0LnByb2dyYW1JZCxcbiAgICAgIHRoaXMuYW1tLnByb2dyYW1JZCxcbiAgICAgIFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLFxuICAgICAgVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgIEFTU09DSUFURURfVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgIC8vIENvcmUgYWNjb3VudHNcbiAgICAgIHByb3Bvc2FsUGRhLFxuICAgICAgcHJvcG9zYWwudmF1bHQsXG4gICAgICBwcm9wb3NhbC5tb2RlcmF0b3IsXG4gICAgICB2YXVsdC5iYXNlTWludC5hZGRyZXNzLFxuICAgICAgdmF1bHQucXVvdGVNaW50LmFkZHJlc3MsXG4gICAgICAvLyBXaW5uaW5nIHBvb2wgYW5kIHJlc2VydmVzXG4gICAgICBwcm9wb3NhbC5wb29sc1t3aW5uaW5nSWR4XSxcbiAgICAgIC8vIFZhdWx0IHRva2VuIGFjY291bnRzXG4gICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBwcm9wb3NhbC52YXVsdCwgdHJ1ZSksXG4gICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5xdW90ZU1pbnQuYWRkcmVzcywgcHJvcG9zYWwudmF1bHQsIHRydWUpLFxuICAgICAgLy8gQ3JlYXRvcidzIGJhc2UvcXVvdGUgQVRBc1xuICAgICAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQuYmFzZU1pbnQuYWRkcmVzcywgY3JlYXRvciksXG4gICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5xdW90ZU1pbnQuYWRkcmVzcywgY3JlYXRvciksXG4gICAgXTtcblxuICAgIC8vIFdpbm5pbmcgcG9vbCByZXNlcnZlc1xuICAgIGNvbnN0IFtyZXNlcnZlQV0gPSBkZXJpdmVSZXNlcnZlUERBKHByb3Bvc2FsLnBvb2xzW3dpbm5pbmdJZHhdLCB2YXVsdC5jb25kUXVvdGVNaW50c1t3aW5uaW5nSWR4XSwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUJdID0gZGVyaXZlUmVzZXJ2ZVBEQShwcm9wb3NhbC5wb29sc1t3aW5uaW5nSWR4XSwgdmF1bHQuY29uZEJhc2VNaW50c1t3aW5uaW5nSWR4XSwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBhZGRyZXNzZXMucHVzaChyZXNlcnZlQSwgcmVzZXJ2ZUIpO1xuXG4gICAgLy8gUGVyLW9wdGlvbiBhY2NvdW50cyAoY29uZGl0aW9uYWwgbWludHMgYW5kIHVzZXIgQVRBcylcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9wdGlvbnM7IGkrKykge1xuICAgICAgYWRkcmVzc2VzLnB1c2goXG4gICAgICAgIHZhdWx0LmNvbmRCYXNlTWludHNbaV0sXG4gICAgICAgIHZhdWx0LmNvbmRRdW90ZU1pbnRzW2ldLFxuICAgICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5jb25kQmFzZU1pbnRzW2ldLCBjcmVhdG9yKSxcbiAgICAgICAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQuY29uZFF1b3RlTWludHNbaV0sIGNyZWF0b3IpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgcmVjZW50IHNsb3QgZm9yIEFMVCBjcmVhdGlvblxuICAgIGNvbnN0IHNsb3QgPSBhd2FpdCBwcm92aWRlci5jb25uZWN0aW9uLmdldFNsb3QoXCJmaW5hbGl6ZWRcIik7XG5cbiAgICBjb25zdCBbY3JlYXRlSXgsIGFsdEFkZHJlc3NdID0gQWRkcmVzc0xvb2t1cFRhYmxlUHJvZ3JhbS5jcmVhdGVMb29rdXBUYWJsZSh7XG4gICAgICBhdXRob3JpdHk6IGNyZWF0b3IsXG4gICAgICBwYXllcjogY3JlYXRvcixcbiAgICAgIHJlY2VudFNsb3Q6IHNsb3QsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgQUxUXG4gICAgY29uc3QgY3JlYXRlVHggPSBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoY3JlYXRlSXgpO1xuICAgIGNyZWF0ZVR4LnJlY2VudEJsb2NraGFzaCA9IChhd2FpdCBwcm92aWRlci5jb25uZWN0aW9uLmdldExhdGVzdEJsb2NraGFzaCgpKS5ibG9ja2hhc2g7XG4gICAgY3JlYXRlVHguZmVlUGF5ZXIgPSBjcmVhdG9yO1xuICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgcHJvdmlkZXIud2FsbGV0LnNpZ25UcmFuc2FjdGlvbihjcmVhdGVUeCk7XG4gICAgY29uc3Qgc2lnID0gYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5zZW5kUmF3VHJhbnNhY3Rpb24oc2lnbmVkVHguc2VyaWFsaXplKCksIHtcbiAgICAgIHNraXBQcmVmbGlnaHQ6IHRydWUsXG4gICAgfSk7XG4gICAgYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5jb25maXJtVHJhbnNhY3Rpb24oc2lnLCBcImNvbmZpcm1lZFwiKTtcblxuICAgIC8vIEV4dGVuZCBBTFQgd2l0aCBhZGRyZXNzZXNcbiAgICBjb25zdCBDSFVOS19TSVpFID0gMjA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRyZXNzZXMubGVuZ3RoOyBpICs9IENIVU5LX1NJWkUpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gYWRkcmVzc2VzLnNsaWNlKGksIGkgKyBDSFVOS19TSVpFKTtcbiAgICAgIGNvbnN0IGV4dGVuZEl4ID0gQWRkcmVzc0xvb2t1cFRhYmxlUHJvZ3JhbS5leHRlbmRMb29rdXBUYWJsZSh7XG4gICAgICAgIHBheWVyOiBjcmVhdG9yLFxuICAgICAgICBhdXRob3JpdHk6IGNyZWF0b3IsXG4gICAgICAgIGxvb2t1cFRhYmxlOiBhbHRBZGRyZXNzLFxuICAgICAgICBhZGRyZXNzZXM6IGNodW5rLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBleHRlbmRUeCA9IG5ldyBUcmFuc2FjdGlvbigpLmFkZChleHRlbmRJeCk7XG4gICAgICBhd2FpdCBwcm92aWRlci5zZW5kQW5kQ29uZmlybShleHRlbmRUeCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYWx0QWRkcmVzcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHZlcnNpb25lZCB0cmFuc2FjdGlvbiBmb3IgcmVkZWVtaW5nIGxpcXVpZGl0eSB3aXRoIEFMVC5cbiAgICogUmVxdWlyZWQgZm9yIHByb3Bvc2FscyB3aXRoIDMrIG9wdGlvbnMgdG8gYXZvaWQgZXhjZWVkaW5nIHRyYW5zYWN0aW9uIHNpemUgbGltaXRzLlxuICAgKlxuICAgKiBAcGFyYW0gY3JlYXRvciAtIFRoZSB1c2VyIHJlZGVlbWluZ1xuICAgKiBAcGFyYW0gcHJvcG9zYWxQZGEgLSBUaGUgcHJvcG9zYWwgUERBXG4gICAqIEBwYXJhbSBhbHRBZGRyZXNzIC0gT3B0aW9uYWwgQUxUIGFkZHJlc3MgKHdpbGwgYmUgY3JlYXRlZCBpZiBub3QgcHJvdmlkZWQgZm9yIDMrIG9wdGlvbnMpXG4gICAqIEByZXR1cm5zIFVuc2lnbmVkIHZlcnNpb25lZCB0cmFuc2FjdGlvbiwgQUxUIGFkZHJlc3MsIGFuZCBudW1iZXIgb2Ygb3B0aW9uc1xuICAgKi9cbiAgYXN5bmMgcmVkZWVtTGlxdWlkaXR5VmVyc2lvbmVkKFxuICAgIGNyZWF0b3I6IFB1YmxpY0tleSxcbiAgICBwcm9wb3NhbFBkYTogUHVibGljS2V5LFxuICAgIGFsdEFkZHJlc3M/OiBQdWJsaWNLZXksXG4gICk6IFByb21pc2U8eyB2ZXJzaW9uZWRUeDogVmVyc2lvbmVkVHJhbnNhY3Rpb247IGFsdEFkZHJlc3M6IFB1YmxpY0tleTsgbnVtT3B0aW9uczogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMucHJvZ3JhbS5wcm92aWRlciBhcyBBbmNob3JQcm92aWRlcjtcbiAgICBjb25zdCB7IGJ1aWxkZXIsIG51bU9wdGlvbnMgfSA9IGF3YWl0IHRoaXMucmVkZWVtTGlxdWlkaXR5KGNyZWF0b3IsIHByb3Bvc2FsUGRhKTtcblxuICAgIC8vIENyZWF0ZSBBTFQgaWYgbm90IHByb3ZpZGVkIGFuZCBuZWVkZWRcbiAgICBsZXQgYWx0UHVia2V5ID0gYWx0QWRkcmVzcztcbiAgICBsZXQgdmVyaWZpZWRBTFQ6IEFkZHJlc3NMb29rdXBUYWJsZUFjY291bnQgfCBudWxsID0gbnVsbDtcblxuICAgIGlmICghYWx0UHVia2V5ICYmIG51bU9wdGlvbnMgPj0gMykge1xuICAgICAgY29uc29sZS5sb2coYCAgQ3JlYXRpbmcgcmVkZW1wdGlvbiBBTFQgZm9yICR7bnVtT3B0aW9uc30gb3B0aW9ucy4uLmApO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jcmVhdGVSZWRlbXB0aW9uQUxUKGNyZWF0b3IsIHByb3Bvc2FsUGRhKTtcbiAgICAgIGFsdFB1YmtleSA9IHJlc3VsdC5hbHRBZGRyZXNzO1xuICAgICAgY29uc29sZS5sb2coYCAg4pyTIFJlZGVtcHRpb24gQUxUIGNyZWF0ZWQ6ICR7YWx0UHVia2V5LnRvQmFzZTU4KCl9YCk7XG5cbiAgICAgIC8vIFdhaXQgZm9yIEFMVCB0byBiZSBmdWxseSBhdmFpbGFibGUgd2l0aCBhbGwgYWRkcmVzc2VzXG4gICAgICAvLyBVc2UgbG9uZ2VyIGRlbGF5cyBhZnRlciBleHRlbmRpbmcgdG8gZW5zdXJlIHByb3BhZ2F0aW9uXG4gICAgICBjb25zb2xlLmxvZyhgICBXYWl0aW5nIGZvciBBTFQgcHJvcGFnYXRpb24uLi5gKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkQWRkcmVzc2VzID0gMTggKyAobnVtT3B0aW9ucyAqIDQpOyAvLyBCYXNlIGFjY291bnRzICsgcGVyLW9wdGlvbiBhY2NvdW50c1xuICAgICAgbGV0IGF0dGVtcHRzID0gMDtcblxuICAgICAgLy8gSW5pdGlhbCBkZWxheSBhZnRlciBleHRlbnNpb25cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyMDAwKSk7XG5cbiAgICAgIHdoaWxlIChhdHRlbXB0cyA8IDMwKSB7XG4gICAgICAgIGNvbnN0IGFsdEFjY291bnQgPSBhd2FpdCBwcm92aWRlci5jb25uZWN0aW9uLmdldEFkZHJlc3NMb29rdXBUYWJsZShhbHRQdWJrZXksIHtcbiAgICAgICAgICBjb21taXRtZW50OiAnY29uZmlybWVkJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChhbHRBY2NvdW50LnZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgYWRkcmVzc0NvdW50ID0gYWx0QWNjb3VudC52YWx1ZS5zdGF0ZS5hZGRyZXNzZXMubGVuZ3RoO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIEF0dGVtcHQgJHthdHRlbXB0cyArIDF9OiBBTFQgaGFzICR7YWRkcmVzc0NvdW50fS8ke2V4cGVjdGVkQWRkcmVzc2VzfSBhZGRyZXNzZXNgKTtcbiAgICAgICAgICBpZiAoYWRkcmVzc0NvdW50ID49IGV4cGVjdGVkQWRkcmVzc2VzKSB7XG4gICAgICAgICAgICB2ZXJpZmllZEFMVCA9IGFsdEFjY291bnQudmFsdWU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICDinJMgQUxUIHZlcmlmaWVkIHdpdGggJHthZGRyZXNzQ291bnR9IGFkZHJlc3Nlc2ApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDAwKSk7XG4gICAgICAgIGF0dGVtcHRzKys7XG4gICAgICB9XG5cbiAgICAgIGlmICghdmVyaWZpZWRBTFQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBTFQgZmFpbGVkIHRvIHBvcHVsYXRlIHdpdGggZXhwZWN0ZWQgJHtleHBlY3RlZEFkZHJlc3Nlc30gYWRkcmVzc2VzIGFmdGVyICR7YXR0ZW1wdHN9IGF0dGVtcHRzYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFhbHRQdWJrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFMVCBhZGRyZXNzIHJlcXVpcmVkIGZvciBtdWx0aS1vcHRpb24gcmVkZW1wdGlvblwiKTtcbiAgICB9XG5cbiAgICAvLyBGZXRjaCBBTFQgaWYgd2UgZG9uJ3QgaGF2ZSBpdCB2ZXJpZmllZCBhbHJlYWR5XG4gICAgaWYgKCF2ZXJpZmllZEFMVCkge1xuICAgICAgdmVyaWZpZWRBTFQgPSBhd2FpdCB0aGlzLmZldGNoQUxUKGFsdFB1YmtleSk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgaW5zdHJ1Y3Rpb25cbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IGF3YWl0IGJ1aWxkZXIuaW5zdHJ1Y3Rpb24oKTtcbiAgICBjb25zdCBjb21wdXRlQnVkZ2V0SXggPSBDb21wdXRlQnVkZ2V0UHJvZ3JhbS5zZXRDb21wdXRlVW5pdExpbWl0KHsgdW5pdHM6IDUwMF8wMDAgfSk7XG5cbiAgICAvLyBHZXQgZnJlc2ggYmxvY2toYXNoXG4gICAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IHByb3ZpZGVyLmNvbm5lY3Rpb24uZ2V0TGF0ZXN0QmxvY2toYXNoKCk7XG5cbiAgICAvLyBCdWlsZCB2ZXJzaW9uZWQgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIHZlcmlmaWVkIEFMVCAobm8gcmUtZmV0Y2gpXG4gICAgY29uc3QgdmVyc2lvbmVkVHggPSB0aGlzLmJ1aWxkVmVyc2lvbmVkVHhXaXRoQUxUKFxuICAgICAgY3JlYXRvcixcbiAgICAgIFtjb21wdXRlQnVkZ2V0SXgsIGluc3RydWN0aW9uXSxcbiAgICAgIHZlcmlmaWVkQUxULFxuICAgICAgYmxvY2toYXNoLFxuICAgICk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHZlcnNpb25lZCB0cmFuc2FjdGlvbiBmb3IgdGhlIGNhbGxlciB0byBzaWduIGFuZCBzZW5kXG4gICAgLy8gVGhpcyBhbGxvd3MgdGhlIGNhbGxlciB0byB1c2UgdGhlaXIgb3duIHNpZ25pbmcgbWVjaGFuaXNtIChlLmcuLCBrZXlwYWlyLnNpZ24pXG4gICAgcmV0dXJuIHsgdmVyc2lvbmVkVHgsIGFsdEFkZHJlc3M6IGFsdFB1YmtleSwgbnVtT3B0aW9ucyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBzZW5kIGEgc2lnbmVkIHZlcnNpb25lZCB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIHNlbmRWZXJzaW9uZWRUcmFuc2FjdGlvbihcbiAgICBzaWduZWRUeDogVmVyc2lvbmVkVHJhbnNhY3Rpb24sXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLnByb2dyYW0ucHJvdmlkZXIgYXMgQW5jaG9yUHJvdmlkZXI7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5zZW5kVHJhbnNhY3Rpb24oc2lnbmVkVHgsIHtcbiAgICAgIHNraXBQcmVmbGlnaHQ6IGZhbHNlLFxuICAgICAgcHJlZmxpZ2h0Q29tbWl0bWVudDogJ2NvbmZpcm1lZCcsXG4gICAgfSk7XG4gICAgYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5jb25maXJtVHJhbnNhY3Rpb24oc2lnbmF0dXJlLCAnY29uZmlybWVkJyk7XG4gICAgcmV0dXJuIHNpZ25hdHVyZTtcbiAgfVxuXG4gIC8qIEFkZHJlc3MgTG9va3VwIFRhYmxlICovXG5cbiAgYXN5bmMgY3JlYXRlUHJvcG9zYWxBTFQoXG4gICAgY3JlYXRvcjogUHVibGljS2V5LFxuICAgIG1vZGVyYXRvclBkYTogUHVibGljS2V5LFxuICAgIG51bU9wdGlvbnM6IG51bWJlciA9IDIsXG4gICk6IFByb21pc2U8eyBhbHRBZGRyZXNzOiBQdWJsaWNLZXkgfT4ge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5wcm9ncmFtLnByb3ZpZGVyIGFzIEFuY2hvclByb3ZpZGVyO1xuICAgIGNvbnN0IG1vZGVyYXRvciA9IGF3YWl0IHRoaXMuZmV0Y2hNb2RlcmF0b3IobW9kZXJhdG9yUGRhKTtcbiAgICBjb25zdCBwcm9wb3NhbElkID0gbW9kZXJhdG9yLnByb3Bvc2FsSWRDb3VudGVyO1xuICAgIGNvbnN0IFtwcm9wb3NhbFBkYV0gPSB0aGlzLmRlcml2ZVByb3Bvc2FsUERBKG1vZGVyYXRvclBkYSwgcHJvcG9zYWxJZCk7XG4gICAgY29uc3QgW3ZhdWx0UGRhXSA9IGRlcml2ZVZhdWx0UERBKHByb3Bvc2FsUGRhLCBwcm9wb3NhbElkLCB0aGlzLnZhdWx0LnByb2dyYW1JZCk7XG5cbiAgICBjb25zdCBhZGRyZXNzZXM6IFB1YmxpY0tleVtdID0gW1xuICAgICAgLy8gUHJvZ3JhbXNcbiAgICAgIHRoaXMucHJvZ3JhbUlkLFxuICAgICAgdGhpcy52YXVsdC5wcm9ncmFtSWQsXG4gICAgICB0aGlzLmFtbS5wcm9ncmFtSWQsXG4gICAgICBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZCxcbiAgICAgIFRPS0VOX1BST0dSQU1fSUQsXG4gICAgICBBU1NPQ0lBVEVEX1RPS0VOX1BST0dSQU1fSUQsXG4gICAgICAvLyBDb3JlIGFjY291bnRzXG4gICAgICBtb2RlcmF0b3JQZGEsXG4gICAgICBwcm9wb3NhbFBkYSxcbiAgICAgIHZhdWx0UGRhLFxuICAgICAgbW9kZXJhdG9yLmJhc2VNaW50LFxuICAgICAgbW9kZXJhdG9yLnF1b3RlTWludCxcbiAgICAgIEZFRV9BVVRIT1JJVFksXG4gICAgICAvLyBWYXVsdCB0b2tlbiBhY2NvdW50c1xuICAgICAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobW9kZXJhdG9yLmJhc2VNaW50LCB2YXVsdFBkYSwgdHJ1ZSksXG4gICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtb2RlcmF0b3IucXVvdGVNaW50LCB2YXVsdFBkYSwgdHJ1ZSksXG4gICAgICAvLyBDcmVhdG9yJ3MgYmFzZS9xdW90ZSBBVEFzXG4gICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtb2RlcmF0b3IuYmFzZU1pbnQsIGNyZWF0b3IpLFxuICAgICAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobW9kZXJhdG9yLnF1b3RlTWludCwgY3JlYXRvciksXG4gICAgXTtcblxuICAgIC8vIFBlci1vcHRpb24gYWNjb3VudHNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9wdGlvbnM7IGkrKykge1xuICAgICAgY29uc3QgW2NvbmRCYXNlTWludF0gPSBkZXJpdmVDb25kaXRpb25hbE1pbnQodmF1bHRQZGEsIFZhdWx0VHlwZS5CYXNlLCBpLCB0aGlzLnZhdWx0LnByb2dyYW1JZCk7XG4gICAgICBjb25zdCBbY29uZFF1b3RlTWludF0gPSBkZXJpdmVDb25kaXRpb25hbE1pbnQodmF1bHRQZGEsIFZhdWx0VHlwZS5RdW90ZSwgaSwgdGhpcy52YXVsdC5wcm9ncmFtSWQpO1xuICAgICAgY29uc3QgW3Bvb2xdID0gZGVyaXZlUG9vbFBEQShwcm9wb3NhbFBkYSwgY29uZFF1b3RlTWludCwgY29uZEJhc2VNaW50LCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgICAgY29uc3QgW3Jlc2VydmVBXSA9IGRlcml2ZVJlc2VydmVQREEocG9vbCwgY29uZFF1b3RlTWludCwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICAgIGNvbnN0IFtyZXNlcnZlQl0gPSBkZXJpdmVSZXNlcnZlUERBKHBvb2wsIGNvbmRCYXNlTWludCwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICAgIGNvbnN0IFtmZWVWYXVsdF0gPSBkZXJpdmVGZWVWYXVsdFBEQShwb29sLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuXG4gICAgICBhZGRyZXNzZXMucHVzaChcbiAgICAgICAgY29uZEJhc2VNaW50LFxuICAgICAgICBjb25kUXVvdGVNaW50LFxuICAgICAgICBwb29sLFxuICAgICAgICByZXNlcnZlQSxcbiAgICAgICAgcmVzZXJ2ZUIsXG4gICAgICAgIGZlZVZhdWx0LFxuICAgICAgICAvLyBDcmVhdG9yJ3MgY29uZGl0aW9uYWwgdG9rZW4gQVRBc1xuICAgICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhjb25kQmFzZU1pbnQsIGNyZWF0b3IpLFxuICAgICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhjb25kUXVvdGVNaW50LCBjcmVhdG9yKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBtb3N0IHJlY2VudCBzbG90IHVzaW5nIFwiZmluYWxpemVkXCIgY29tbWl0bWVudCBmb3Igc3RhYmlsaXR5XG4gICAgY29uc3Qgc2xvdCA9IGF3YWl0IHByb3ZpZGVyLmNvbm5lY3Rpb24uZ2V0U2xvdChcImZpbmFsaXplZFwiKTtcblxuICAgIGNvbnN0IFtjcmVhdGVJeCwgYWx0QWRkcmVzc10gPSBBZGRyZXNzTG9va3VwVGFibGVQcm9ncmFtLmNyZWF0ZUxvb2t1cFRhYmxlKHtcbiAgICAgIGF1dGhvcml0eTogY3JlYXRvcixcbiAgICAgIHBheWVyOiBjcmVhdG9yLFxuICAgICAgcmVjZW50U2xvdDogc2xvdCxcbiAgICB9KTtcblxuICAgIC8vIFNlbmQgY3JlYXRlIHRyYW5zYWN0aW9uIGltbWVkaWF0ZWx5LCBza2lwIHByZWZsaWdodCB0byBhdm9pZCBzbG90IHRpbWluZyBpc3N1ZXNcbiAgICBjb25zdCBjcmVhdGVUeCA9IG5ldyBUcmFuc2FjdGlvbigpLmFkZChjcmVhdGVJeCk7XG4gICAgY3JlYXRlVHgucmVjZW50QmxvY2toYXNoID0gKGF3YWl0IHByb3ZpZGVyLmNvbm5lY3Rpb24uZ2V0TGF0ZXN0QmxvY2toYXNoKCkpLmJsb2NraGFzaDtcbiAgICBjcmVhdGVUeC5mZWVQYXllciA9IGNyZWF0b3I7XG4gICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCBwcm92aWRlci53YWxsZXQuc2lnblRyYW5zYWN0aW9uKGNyZWF0ZVR4KTtcbiAgICBjb25zdCBzaWcgPSBhd2FpdCBwcm92aWRlci5jb25uZWN0aW9uLnNlbmRSYXdUcmFuc2FjdGlvbihzaWduZWRUeC5zZXJpYWxpemUoKSwge1xuICAgICAgc2tpcFByZWZsaWdodDogdHJ1ZSxcbiAgICB9KTtcbiAgICBhd2FpdCBwcm92aWRlci5jb25uZWN0aW9uLmNvbmZpcm1UcmFuc2FjdGlvbihzaWcsIFwiY29uZmlybWVkXCIpO1xuXG4gICAgLy8gU3BsaXQgYWRkcmVzc2VzIGludG8gY2h1bmtzIHRvIGF2b2lkIHRyYW5zYWN0aW9uIHNpemUgbGltaXRzXG4gICAgLy8gRWFjaCBhZGRyZXNzIGlzIDMyIGJ5dGVzLCB+MjAgYWRkcmVzc2VzIHBlciBleHRlbmQgaW5zdHJ1Y3Rpb24gaXMgc2FmZVxuICAgIGNvbnN0IENIVU5LX1NJWkUgPSAyMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZHJlc3Nlcy5sZW5ndGg7IGkgKz0gQ0hVTktfU0laRSkge1xuICAgICAgY29uc3QgY2h1bmsgPSBhZGRyZXNzZXMuc2xpY2UoaSwgaSArIENIVU5LX1NJWkUpO1xuICAgICAgY29uc3QgZXh0ZW5kSXggPSBBZGRyZXNzTG9va3VwVGFibGVQcm9ncmFtLmV4dGVuZExvb2t1cFRhYmxlKHtcbiAgICAgICAgcGF5ZXI6IGNyZWF0b3IsXG4gICAgICAgIGF1dGhvcml0eTogY3JlYXRvcixcbiAgICAgICAgbG9va3VwVGFibGU6IGFsdEFkZHJlc3MsXG4gICAgICAgIGFkZHJlc3NlczogY2h1bmssXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGV4dGVuZFR4ID0gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGV4dGVuZEl4KTtcbiAgICAgIGF3YWl0IHByb3ZpZGVyLnNlbmRBbmRDb25maXJtKGV4dGVuZFR4KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBhbHRBZGRyZXNzIH07XG4gIH1cblxuICBhc3luYyBmZXRjaEFMVChhbHRBZGRyZXNzOiBQdWJsaWNLZXkpOiBQcm9taXNlPEFkZHJlc3NMb29rdXBUYWJsZUFjY291bnQ+IHtcbiAgICBjb25zdCBhbHQgPSBhd2FpdCB0aGlzLnByb2dyYW0ucHJvdmlkZXIuY29ubmVjdGlvbi5nZXRBZGRyZXNzTG9va3VwVGFibGUoYWx0QWRkcmVzcyk7XG4gICAgaWYgKCFhbHQudmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFMVCBub3QgZm91bmRcIik7XG4gICAgfVxuICAgIHJldHVybiBhbHQudmFsdWU7XG4gIH1cblxuICBhc3luYyBidWlsZFZlcnNpb25lZFR4KFxuICAgIHBheWVyOiBQdWJsaWNLZXksXG4gICAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gICAgYWx0QWRkcmVzczogUHVibGljS2V5LFxuICApOiBQcm9taXNlPFZlcnNpb25lZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLnByb2dyYW0ucHJvdmlkZXIgYXMgQW5jaG9yUHJvdmlkZXI7XG4gICAgY29uc3QgYWx0ID0gYXdhaXQgdGhpcy5mZXRjaEFMVChhbHRBZGRyZXNzKTtcbiAgICBjb25zdCB7IGJsb2NraGFzaCB9ID0gYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5nZXRMYXRlc3RCbG9ja2hhc2goKTtcbiAgICByZXR1cm4gdGhpcy5idWlsZFZlcnNpb25lZFR4V2l0aEFMVChwYXllciwgaW5zdHJ1Y3Rpb25zLCBhbHQsIGJsb2NraGFzaCk7XG4gIH1cblxuICBidWlsZFZlcnNpb25lZFR4V2l0aEFMVChcbiAgICBwYXllcjogUHVibGljS2V5LFxuICAgIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICAgIGFsdDogQWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudCxcbiAgICBibG9ja2hhc2g6IHN0cmluZyxcbiAgKTogVmVyc2lvbmVkVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgVHJhbnNhY3Rpb25NZXNzYWdlKHtcbiAgICAgIHBheWVyS2V5OiBwYXllcixcbiAgICAgIHJlY2VudEJsb2NraGFzaDogYmxvY2toYXNoLFxuICAgICAgaW5zdHJ1Y3Rpb25zLFxuICAgIH0pLmNvbXBpbGVUb1YwTWVzc2FnZShbYWx0XSk7XG5cbiAgICByZXR1cm4gbmV3IFZlcnNpb25lZFRyYW5zYWN0aW9uKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyogREFPIE1ldGhvZHMgKi9cblxuICBkZXJpdmVNaW50Q3JlYXRlS2V5UERBKGRhb1BkYTogUHVibGljS2V5LCBuYW1lOiBzdHJpbmcpOiBbUHVibGljS2V5LCBudW1iZXJdIHtcbiAgICByZXR1cm4gZGVyaXZlTWludENyZWF0ZUtleVBEQShkYW9QZGEsIG5hbWUsIHRoaXMucHJvZ3JhbUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hTcXVhZHNQcm9ncmFtQ29uZmlnKCkge1xuICAgIGNvbnN0IFtwcm9ncmFtQ29uZmlnUGRhXSA9IG11bHRpc2lnLmdldFByb2dyYW1Db25maWdQZGEoe1xuICAgICAgcHJvZ3JhbUlkOiBTUVVBRFNfUFJPR1JBTV9JRCxcbiAgICB9KTtcbiAgICBjb25zdCBwcm9ncmFtQ29uZmlnID0gYXdhaXQgbXVsdGlzaWcuYWNjb3VudHMuUHJvZ3JhbUNvbmZpZy5mcm9tQWNjb3VudEFkZHJlc3MoXG4gICAgICB0aGlzLnByb2dyYW0ucHJvdmlkZXIuY29ubmVjdGlvbixcbiAgICAgIHByb2dyYW1Db25maWdQZGFcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBwcm9ncmFtQ29uZmlnOiBwcm9ncmFtQ29uZmlnUGRhLFxuICAgICAgcHJvZ3JhbUNvbmZpZ1RyZWFzdXJ5OiBwcm9ncmFtQ29uZmlnLnRyZWFzdXJ5LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGRlcml2ZU11bHRpc2lnUGRhKGNyZWF0ZUtleTogUHVibGljS2V5KTogUHVibGljS2V5IHtcbiAgICBjb25zdCBbbXVsdGlzaWdQZGFdID0gbXVsdGlzaWcuZ2V0TXVsdGlzaWdQZGEoe1xuICAgICAgY3JlYXRlS2V5LFxuICAgICAgcHJvZ3JhbUlkOiBTUVVBRFNfUFJPR1JBTV9JRCxcbiAgICB9KTtcbiAgICByZXR1cm4gbXVsdGlzaWdQZGE7XG4gIH1cblxuICBhc3luYyBpbml0aWFsaXplUGFyZW50REFPKFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgcGFyZW50QWRtaW46IFB1YmxpY0tleSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgYmFzZU1pbnQ6IFB1YmxpY0tleSxcbiAgICBxdW90ZU1pbnQ6IFB1YmxpY0tleSxcbiAgICB0cmVhc3VyeUNvc2lnbmVyOiBQdWJsaWNLZXksXG4gICAgcG9vbDogUHVibGljS2V5LFxuICAgIHBvb2xUeXBlOiBQb29sVHlwZSxcbiAgICBvcHRpb25zPzogVHhPcHRpb25zXG4gICkge1xuICAgIGNvbnN0IFtkYW9QZGFdID0gdGhpcy5kZXJpdmVEQU9QREEobmFtZSk7XG4gICAgY29uc3QgW21vZGVyYXRvclBkYV0gPSB0aGlzLmRlcml2ZU1vZGVyYXRvclBEQShuYW1lKTtcbiAgICBjb25zdCBbbWludENyZWF0ZUtleVBkYV0gPSB0aGlzLmRlcml2ZU1pbnRDcmVhdGVLZXlQREEoZGFvUGRhLCBuYW1lKTtcblxuICAgIC8vIERlcml2ZSBTcXVhZHMgYWNjb3VudHMgKHNpbmdsZSBSUEMgY2FsbClcbiAgICBjb25zdCBzcXVhZHNDb25maWcgPSBhd2FpdCB0aGlzLmZldGNoU3F1YWRzUHJvZ3JhbUNvbmZpZygpO1xuICAgIGNvbnN0IHRyZWFzdXJ5TXVsdGlzaWdQZGEgPSB0aGlzLmRlcml2ZU11bHRpc2lnUGRhKGRhb1BkYSk7XG4gICAgY29uc3QgbWludE11bHRpc2lnUGRhID0gdGhpcy5kZXJpdmVNdWx0aXNpZ1BkYShtaW50Q3JlYXRlS2V5UGRhKTtcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0aWFsaXplUGFyZW50REFPKFxuICAgICAgdGhpcy5wcm9ncmFtLFxuICAgICAgYWRtaW4sXG4gICAgICBwYXJlbnRBZG1pbixcbiAgICAgIGRhb1BkYSxcbiAgICAgIG1vZGVyYXRvclBkYSxcbiAgICAgIGJhc2VNaW50LFxuICAgICAgcXVvdGVNaW50LFxuICAgICAgc3F1YWRzQ29uZmlnLnByb2dyYW1Db25maWcsXG4gICAgICBzcXVhZHNDb25maWcucHJvZ3JhbUNvbmZpZ1RyZWFzdXJ5LFxuICAgICAgdHJlYXN1cnlNdWx0aXNpZ1BkYSxcbiAgICAgIG1pbnRNdWx0aXNpZ1BkYSxcbiAgICAgIG1pbnRDcmVhdGVLZXlQZGEsXG4gICAgICBTUVVBRFNfUFJPR1JBTV9JRCxcbiAgICAgIG5hbWUsXG4gICAgICB0cmVhc3VyeUNvc2lnbmVyLFxuICAgICAgcG9vbCxcbiAgICAgIHBvb2xUeXBlXG4gICAgKS5wcmVJbnN0cnVjdGlvbnModGhpcy5tYXliZUFkZENvbXB1dGVCdWRnZXQob3B0aW9ucykpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1aWxkZXIsXG4gICAgICBkYW9QZGEsXG4gICAgICBtb2RlcmF0b3JQZGEsXG4gICAgICB0cmVhc3VyeU11bHRpc2lnOiB0cmVhc3VyeU11bHRpc2lnUGRhLFxuICAgICAgbWludE11bHRpc2lnOiBtaW50TXVsdGlzaWdQZGEsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemVDaGlsZERBTyhcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIHBhcmVudEFkbWluOiBQdWJsaWNLZXksXG4gICAgcGFyZW50RGFvTmFtZTogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0b2tlbk1pbnQ6IFB1YmxpY0tleSxcbiAgICB0cmVhc3VyeUNvc2lnbmVyOiBQdWJsaWNLZXksXG4gICAgb3B0aW9ucz86IFR4T3B0aW9uc1xuICApIHtcbiAgICBjb25zdCBbZGFvUGRhXSA9IHRoaXMuZGVyaXZlREFPUERBKG5hbWUpO1xuICAgIGNvbnN0IFtwYXJlbnREYW9QZGFdID0gdGhpcy5kZXJpdmVEQU9QREEocGFyZW50RGFvTmFtZSk7XG4gICAgY29uc3QgW21pbnRDcmVhdGVLZXlQZGFdID0gdGhpcy5kZXJpdmVNaW50Q3JlYXRlS2V5UERBKGRhb1BkYSwgbmFtZSk7XG5cbiAgICAvLyBEZXJpdmUgU3F1YWRzIGFjY291bnRzIChzaW5nbGUgUlBDIGNhbGwpXG4gICAgY29uc3Qgc3F1YWRzQ29uZmlnID0gYXdhaXQgdGhpcy5mZXRjaFNxdWFkc1Byb2dyYW1Db25maWcoKTtcbiAgICBjb25zdCB0cmVhc3VyeU11bHRpc2lnUGRhID0gdGhpcy5kZXJpdmVNdWx0aXNpZ1BkYShkYW9QZGEpO1xuICAgIGNvbnN0IG1pbnRNdWx0aXNpZ1BkYSA9IHRoaXMuZGVyaXZlTXVsdGlzaWdQZGEobWludENyZWF0ZUtleVBkYSk7XG5cbiAgICBjb25zdCBidWlsZGVyID0gaW5pdGlhbGl6ZUNoaWxkREFPKFxuICAgICAgdGhpcy5wcm9ncmFtLFxuICAgICAgYWRtaW4sXG4gICAgICBwYXJlbnRBZG1pbixcbiAgICAgIGRhb1BkYSxcbiAgICAgIHBhcmVudERhb1BkYSxcbiAgICAgIHRva2VuTWludCxcbiAgICAgIHNxdWFkc0NvbmZpZy5wcm9ncmFtQ29uZmlnLFxuICAgICAgc3F1YWRzQ29uZmlnLnByb2dyYW1Db25maWdUcmVhc3VyeSxcbiAgICAgIHRyZWFzdXJ5TXVsdGlzaWdQZGEsXG4gICAgICBtaW50TXVsdGlzaWdQZGEsXG4gICAgICBtaW50Q3JlYXRlS2V5UGRhLFxuICAgICAgU1FVQURTX1BST0dSQU1fSUQsXG4gICAgICBuYW1lLFxuICAgICAgdHJlYXN1cnlDb3NpZ25lclxuICAgICkucHJlSW5zdHJ1Y3Rpb25zKHRoaXMubWF5YmVBZGRDb21wdXRlQnVkZ2V0KG9wdGlvbnMpKTtcblxuICAgIHJldHVybiB7XG4gICAgICBidWlsZGVyLFxuICAgICAgZGFvUGRhLFxuICAgICAgcGFyZW50RGFvUGRhLFxuICAgICAgdHJlYXN1cnlNdWx0aXNpZzogdHJlYXN1cnlNdWx0aXNpZ1BkYSxcbiAgICAgIG1pbnRNdWx0aXNpZzogbWludE11bHRpc2lnUGRhLFxuICAgIH07XG4gIH1cblxuICBhc3luYyB1cGdyYWRlREFPKFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgcGFyZW50QWRtaW46IFB1YmxpY0tleSxcbiAgICBkYW9OYW1lOiBzdHJpbmcsXG4gICAgcGFyZW50RGFvTmFtZTogc3RyaW5nLFxuICAgIGJhc2VNaW50OiBQdWJsaWNLZXksXG4gICAgcXVvdGVNaW50OiBQdWJsaWNLZXksXG4gICAgcG9vbDogUHVibGljS2V5LFxuICAgIHBvb2xUeXBlOiBQb29sVHlwZSxcbiAgICBvcHRpb25zPzogVHhPcHRpb25zXG4gICkge1xuICAgIGNvbnN0IFtkYW9QZGFdID0gdGhpcy5kZXJpdmVEQU9QREEoZGFvTmFtZSk7XG4gICAgY29uc3QgW3BhcmVudERhb1BkYV0gPSB0aGlzLmRlcml2ZURBT1BEQShwYXJlbnREYW9OYW1lKTtcbiAgICBjb25zdCBbbW9kZXJhdG9yUGRhXSA9IHRoaXMuZGVyaXZlTW9kZXJhdG9yUERBKGRhb05hbWUpO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IHVwZ3JhZGVEQU8oXG4gICAgICB0aGlzLnByb2dyYW0sXG4gICAgICBhZG1pbixcbiAgICAgIHBhcmVudEFkbWluLFxuICAgICAgZGFvUGRhLFxuICAgICAgcGFyZW50RGFvUGRhLFxuICAgICAgbW9kZXJhdG9yUGRhLFxuICAgICAgYmFzZU1pbnQsXG4gICAgICBxdW90ZU1pbnQsXG4gICAgICBwb29sLFxuICAgICAgcG9vbFR5cGVcbiAgICApLnByZUluc3RydWN0aW9ucyh0aGlzLm1heWJlQWRkQ29tcHV0ZUJ1ZGdldChvcHRpb25zKSk7XG5cbiAgICByZXR1cm4geyBidWlsZGVyLCBkYW9QZGEsIG1vZGVyYXRvclBkYSB9O1xuICB9XG59XG4iXX0=
688
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Z1dGFyY2h5L2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCw4Q0FBZ0U7QUFDaEUsNkNBVXlCO0FBQ3pCLGlEQUsyQjtBQUMzQiwyQ0FBNEQ7QUFTNUQsbUNBV2lCO0FBQ2pCLGlEQVd3QjtBQUd4QixvQ0FBeUY7QUFDekYsZ0NBQXNHO0FBRXRHLDRDQUFnRDtBQUNoRCx5REFBMkM7QUFFM0MsTUFBTSxxQkFBcUIsR0FBRyxNQUFPLENBQUM7QUFFdEMsTUFBYSxjQUFjO0lBT3pCLFlBQVksUUFBd0IsRUFBRSxTQUFxQixFQUFFLFlBQXFCO1FBQ2hGLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxJQUFJLHNCQUFVLENBQUM7UUFDekMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGdCQUFPLENBQUMsa0JBQXVCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLG1CQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLGVBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsWUFBWSxJQUFJLHFCQUFxQixDQUFDO0lBQ25FLENBQUM7SUFFRCxpQkFBaUI7SUFFakIsWUFBWSxDQUFDLElBQVk7UUFDdkIsT0FBTyxJQUFBLG9CQUFZLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsSUFBWTtRQUM3QixPQUFPLElBQUEsMEJBQWtCLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsU0FBb0IsRUFBRSxV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TSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV4RCxNQUFNLE9BQU8sR0FBRyxJQUFBLHlCQUFVLEVBQ3hCLElBQUksQ0FBQyxPQUFPLEVBQ1osS0FBSyxFQUNMLFdBQVcsRUFDWCxNQUFNLEVBQ04sWUFBWSxFQUNaLFlBQVksRUFDWixRQUFRLEVBQ1IsU0FBUyxFQUNULElBQUksRUFDSixRQUFRLENBQ1QsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUM7SUFDM0MsQ0FBQztDQUNGO0FBcjhCRCx3Q0FxOEJDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIEhpZ2gtbGV2ZWwgY2xpZW50IGZvciB0aGUgRnV0YXJjaHkgcHJvZ3JhbS5cbiAqIEhhbmRsZXMgYWNjb3VudCBkZXJpdmF0aW9uLCBpbnN0cnVjdGlvbiBidWlsZGluZywgYW5kIHRyYW5zYWN0aW9uIGNvbXBvc2l0aW9uLlxuICovXG5cbmltcG9ydCB7IFByb2dyYW0sIEFuY2hvclByb3ZpZGVyLCBCTiB9IGZyb20gXCJAY29yYWwteHl6L2FuY2hvclwiO1xuaW1wb3J0IHtcbiAgUHVibGljS2V5LFxuICBDb21wdXRlQnVkZ2V0UHJvZ3JhbSxcbiAgQWRkcmVzc0xvb2t1cFRhYmxlUHJvZ3JhbSxcbiAgQWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudCxcbiAgU3lzdGVtUHJvZ3JhbSxcbiAgVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG4gIFRyYW5zYWN0aW9uTWVzc2FnZSxcbiAgVmVyc2lvbmVkVHJhbnNhY3Rpb24sXG59IGZyb20gXCJAc29sYW5hL3dlYjMuanNcIjtcbmltcG9ydCB7XG4gIGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jLFxuICBUT0tFTl9QUk9HUkFNX0lELFxuICBBU1NPQ0lBVEVEX1RPS0VOX1BST0dSQU1fSUQsXG4gIGNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnRJZGVtcG90ZW50SW5zdHJ1Y3Rpb24sXG59IGZyb20gXCJAc29sYW5hL3NwbC10b2tlblwiO1xuaW1wb3J0IHsgUFJPR1JBTV9JRCwgU1FVQURTX1BST0dSQU1fSUQgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEZ1dGFyY2h5LFxuICBEQU9BY2NvdW50LFxuICBNb2RlcmF0b3JBY2NvdW50LFxuICBQcm9wb3NhbEFjY291bnQsXG4gIFByb3Bvc2FsUGFyYW1zLFxuICBQb29sVHlwZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGRlcml2ZURBT1BEQSxcbiAgZGVyaXZlTW9kZXJhdG9yUERBLFxuICBkZXJpdmVQcm9wb3NhbFBEQSxcbiAgZGVyaXZlTWludENyZWF0ZUtleVBEQSxcbiAgZmV0Y2hEQU9BY2NvdW50LFxuICBmZXRjaE1vZGVyYXRvckFjY291bnQsXG4gIGZldGNoUHJvcG9zYWxBY2NvdW50LFxuICBwYXJzZVByb3Bvc2FsU3RhdGUsXG4gIGlzUHJvcG9zYWxFeHBpcmVkLFxuICBnZXRUaW1lUmVtYWluaW5nLFxufSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgaW5pdGlhbGl6ZU1vZGVyYXRvcixcbiAgaW5pdGlhbGl6ZVByb3Bvc2FsLFxuICBhZGRPcHRpb24sXG4gIGxhdW5jaFByb3Bvc2FsLFxuICBmaW5hbGl6ZVByb3Bvc2FsLFxuICByZWRlZW1MaXF1aWRpdHksXG4gIGFkZEhpc3RvcmljYWxQcm9wb3NhbCxcbiAgaW5pdGlhbGl6ZVBhcmVudERBTyxcbiAgaW5pdGlhbGl6ZUNoaWxkREFPLFxuICB1cGdyYWRlREFPLFxufSBmcm9tIFwiLi9pbnN0cnVjdGlvbnNcIjtcbmltcG9ydCB7IFR4T3B0aW9ucyB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5pbXBvcnQgeyBWYXVsdENsaWVudCwgZGVyaXZlVmF1bHRQREEsIGRlcml2ZUNvbmRpdGlvbmFsTWludCwgVmF1bHRUeXBlIH0gZnJvbSBcIi4uL3ZhdWx0XCI7XG5pbXBvcnQgeyBBTU1DbGllbnQsIGRlcml2ZVBvb2xQREEsIGRlcml2ZVJlc2VydmVQREEsIGRlcml2ZUZlZVZhdWx0UERBLCBGRUVfQVVUSE9SSVRZIH0gZnJvbSBcIi4uL2FtbVwiO1xuXG5pbXBvcnQgeyBGdXRhcmNoeUlETCB9IGZyb20gXCIuLi9nZW5lcmF0ZWQvaWRsc1wiO1xuaW1wb3J0ICogYXMgbXVsdGlzaWcgZnJvbSBcIkBzcWRzL211bHRpc2lnXCI7XG5cbmNvbnN0IERFRkFVTFRfQ09NUFVURV9VTklUUyA9IDUwMF8wMDA7XG5cbmV4cG9ydCBjbGFzcyBGdXRhcmNoeUNsaWVudCB7XG4gIHB1YmxpYyBwcm9ncmFtOiBQcm9ncmFtPEZ1dGFyY2h5PjtcbiAgcHVibGljIHByb2dyYW1JZDogUHVibGljS2V5O1xuICBwdWJsaWMgdmF1bHQ6IFZhdWx0Q2xpZW50O1xuICBwdWJsaWMgYW1tOiBBTU1DbGllbnQ7XG4gIHByaXZhdGUgZGVmYXVsdENvbXB1dGVVbml0czogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByb3ZpZGVyOiBBbmNob3JQcm92aWRlciwgcHJvZ3JhbUlkPzogUHVibGljS2V5LCBjb21wdXRlVW5pdHM/OiBudW1iZXIpIHtcbiAgICB0aGlzLnByb2dyYW1JZCA9IHByb2dyYW1JZCA/PyBQUk9HUkFNX0lEO1xuICAgIHRoaXMucHJvZ3JhbSA9IG5ldyBQcm9ncmFtKEZ1dGFyY2h5SURMIGFzIEZ1dGFyY2h5LCBwcm92aWRlcik7XG4gICAgdGhpcy52YXVsdCA9IG5ldyBWYXVsdENsaWVudChwcm92aWRlcik7XG4gICAgdGhpcy5hbW0gPSBuZXcgQU1NQ2xpZW50KHByb3ZpZGVyKTtcbiAgICB0aGlzLmRlZmF1bHRDb21wdXRlVW5pdHMgPSBjb21wdXRlVW5pdHMgPz8gREVGQVVMVF9DT01QVVRFX1VOSVRTO1xuICB9XG5cbiAgLyogUERBIEhlbHBlcnMgKi9cblxuICBkZXJpdmVEQU9QREEobmFtZTogc3RyaW5nKTogW1B1YmxpY0tleSwgbnVtYmVyXSB7XG4gICAgcmV0dXJuIGRlcml2ZURBT1BEQShuYW1lLCB0aGlzLnByb2dyYW1JZCk7XG4gIH1cblxuICBkZXJpdmVNb2RlcmF0b3JQREEobmFtZTogc3RyaW5nKTogW1B1YmxpY0tleSwgbnVtYmVyXSB7XG4gICAgcmV0dXJuIGRlcml2ZU1vZGVyYXRvclBEQShuYW1lLCB0aGlzLnByb2dyYW1JZCk7XG4gIH1cblxuICBkZXJpdmVQcm9wb3NhbFBEQShtb2RlcmF0b3I6IFB1YmxpY0tleSwgcHJvcG9zYWxJZDogbnVtYmVyKTogW1B1YmxpY0tleSwgbnVtYmVyXSB7XG4gICAgcmV0dXJuIGRlcml2ZVByb3Bvc2FsUERBKG1vZGVyYXRvciwgcHJvcG9zYWxJZCwgdGhpcy5wcm9ncmFtSWQpO1xuICB9XG5cbiAgLyogRmV0Y2hlcnMgKi9cblxuICBhc3luYyBmZXRjaERBTyhkYW9QZGE6IFB1YmxpY0tleSk6IFByb21pc2U8REFPQWNjb3VudD4ge1xuICAgIHJldHVybiBmZXRjaERBT0FjY291bnQodGhpcy5wcm9ncmFtLCBkYW9QZGEpO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hNb2RlcmF0b3IobW9kZXJhdG9yUGRhOiBQdWJsaWNLZXkpOiBQcm9taXNlPE1vZGVyYXRvckFjY291bnQ+IHtcbiAgICByZXR1cm4gZmV0Y2hNb2RlcmF0b3JBY2NvdW50KHRoaXMucHJvZ3JhbSwgbW9kZXJhdG9yUGRhKTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoUHJvcG9zYWwocHJvcG9zYWxQZGE6IFB1YmxpY0tleSk6IFByb21pc2U8UHJvcG9zYWxBY2NvdW50PiB7XG4gICAgcmV0dXJuIGZldGNoUHJvcG9zYWxBY2NvdW50KHRoaXMucHJvZ3JhbSwgcHJvcG9zYWxQZGEpO1xuICB9XG5cbiAgLyogUHJvcG9zYWwgSGVscGVycyAqL1xuXG4gIGlzUHJvcG9zYWxFeHBpcmVkKHByb3Bvc2FsOiBQcm9wb3NhbEFjY291bnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNQcm9wb3NhbEV4cGlyZWQocHJvcG9zYWwpO1xuICB9XG5cbiAgZ2V0VGltZVJlbWFpbmluZyhwcm9wb3NhbDogUHJvcG9zYWxBY2NvdW50KTogbnVtYmVyIHtcbiAgICByZXR1cm4gZ2V0VGltZVJlbWFpbmluZyhwcm9wb3NhbCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbXB1dGVVbml0cyhvcHRpb25zPzogVHhPcHRpb25zKTogbnVtYmVyIHtcbiAgICByZXR1cm4gb3B0aW9ucz8uY29tcHV0ZVVuaXRzID8/IHRoaXMuZGVmYXVsdENvbXB1dGVVbml0cztcbiAgfVxuXG4gIHByaXZhdGUgbWF5YmVBZGRDb21wdXRlQnVkZ2V0KG9wdGlvbnM/OiBUeE9wdGlvbnMpOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10ge1xuICAgIGlmIChvcHRpb25zPy5pbmNsdWRlQ3VCdWRnZXQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBbQ29tcHV0ZUJ1ZGdldFByb2dyYW0uc2V0Q29tcHV0ZVVuaXRMaW1pdCh7IHVuaXRzOiB0aGlzLmdldENvbXB1dGVVbml0cyhvcHRpb25zKSB9KV07XG4gIH1cblxuICAvKiBJbnN0cnVjdGlvbiBCdWlsZGVycyAqL1xuXG4gIGFzeW5jIGluaXRpYWxpemVNb2RlcmF0b3IoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBiYXNlTWludDogUHVibGljS2V5LFxuICAgIHF1b3RlTWludDogUHVibGljS2V5LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHhPcHRpb25zXG4gICkge1xuICAgIGNvbnN0IFttb2RlcmF0b3JQZGFdID0gdGhpcy5kZXJpdmVNb2RlcmF0b3JQREEobmFtZSk7XG5cbiAgICBjb25zdCBidWlsZGVyID0gaW5pdGlhbGl6ZU1vZGVyYXRvcihcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGFkbWluLFxuICAgICAgYmFzZU1pbnQsXG4gICAgICBxdW90ZU1pbnQsXG4gICAgICBtb2RlcmF0b3JQZGEsXG4gICAgICBuYW1lXG4gICAgKS5wcmVJbnN0cnVjdGlvbnModGhpcy5tYXliZUFkZENvbXB1dGVCdWRnZXQob3B0aW9ucykpO1xuXG4gICAgcmV0dXJuIHsgYnVpbGRlciwgbW9kZXJhdG9yUGRhLCBuYW1lIH07XG4gIH1cblxuICBhc3luYyBhZGRIaXN0b3JpY2FsUHJvcG9zYWwoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBtb2RlcmF0b3JQZGE6IFB1YmxpY0tleSxcbiAgICBudW1PcHRpb25zOiBudW1iZXIsXG4gICAgd2lubmluZ0lkeDogbnVtYmVyLFxuICAgIGxlbmd0aDogbnVtYmVyLFxuICAgIGNyZWF0ZWRBdDogQk4gfCBudW1iZXIsXG4gICAgb3B0aW9ucz86IFR4T3B0aW9uc1xuICApIHtcbiAgICBjb25zdCBtb2RlcmF0b3IgPSBhd2FpdCB0aGlzLmZldGNoTW9kZXJhdG9yKG1vZGVyYXRvclBkYSk7XG4gICAgY29uc3QgcHJvcG9zYWxJZCA9IG1vZGVyYXRvci5wcm9wb3NhbElkQ291bnRlcjtcbiAgICBjb25zdCBbcHJvcG9zYWxQZGFdID0gdGhpcy5kZXJpdmVQcm9wb3NhbFBEQShtb2RlcmF0b3JQZGEsIHByb3Bvc2FsSWQpO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IGFkZEhpc3RvcmljYWxQcm9wb3NhbChcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGFkbWluLFxuICAgICAgbW9kZXJhdG9yUGRhLFxuICAgICAgcHJvcG9zYWxQZGEsXG4gICAgICBudW1PcHRpb25zLFxuICAgICAgd2lubmluZ0lkeCxcbiAgICAgIGxlbmd0aCxcbiAgICAgIGNyZWF0ZWRBdFxuICAgICkucHJlSW5zdHJ1Y3Rpb25zKHRoaXMubWF5YmVBZGRDb21wdXRlQnVkZ2V0KG9wdGlvbnMpKTtcblxuICAgIHJldHVybiB7IGJ1aWxkZXIsIHByb3Bvc2FsUGRhLCBwcm9wb3NhbElkIH07XG4gIH1cblxuICBhc3luYyBpbml0aWFsaXplUHJvcG9zYWwoXG4gICAgY3JlYXRvcjogUHVibGljS2V5LFxuICAgIG1vZGVyYXRvclBkYTogUHVibGljS2V5LFxuICAgIHByb3Bvc2FsUGFyYW1zOiBQcm9wb3NhbFBhcmFtcyxcbiAgICBtZXRhZGF0YT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHhPcHRpb25zXG4gICkge1xuICAgIGNvbnN0IG1vZGVyYXRvciA9IGF3YWl0IHRoaXMuZmV0Y2hNb2RlcmF0b3IobW9kZXJhdG9yUGRhKTtcbiAgICBjb25zdCBwcm9wb3NhbElkID0gbW9kZXJhdG9yLnByb3Bvc2FsSWRDb3VudGVyO1xuICAgIGNvbnN0IFtwcm9wb3NhbFBkYV0gPSB0aGlzLmRlcml2ZVByb3Bvc2FsUERBKG1vZGVyYXRvclBkYSwgcHJvcG9zYWxJZCk7XG5cbiAgICAvLyBEZXJpdmUgdmF1bHQgUERBIChwcm9wb3NhbCBpcyB0aGUgb3duZXIsIG5vbmNlPXByb3Bvc2FsSWQpXG4gICAgY29uc3QgW3ZhdWx0UGRhXSA9IGRlcml2ZVZhdWx0UERBKHByb3Bvc2FsUGRhLCBwcm9wb3NhbElkLCB0aGlzLnZhdWx0LnByb2dyYW1JZCk7XG5cbiAgICAvLyBEZXJpdmUgY29uZGl0aW9uYWwgbWludHMgZm9yIGluaXRpYWwgMiBvcHRpb25zXG4gICAgY29uc3QgW2NvbmRCYXNlTWludDBdID0gZGVyaXZlQ29uZGl0aW9uYWxNaW50KHZhdWx0UGRhLCBWYXVsdFR5cGUuQmFzZSwgMCwgdGhpcy52YXVsdC5wcm9ncmFtSWQpO1xuICAgIGNvbnN0IFtjb25kQmFzZU1pbnQxXSA9IGRlcml2ZUNvbmRpdGlvbmFsTWludCh2YXVsdFBkYSwgVmF1bHRUeXBlLkJhc2UsIDEsIHRoaXMudmF1bHQucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbY29uZFF1b3RlTWludDBdID0gZGVyaXZlQ29uZGl0aW9uYWxNaW50KHZhdWx0UGRhLCBWYXVsdFR5cGUuUXVvdGUsIDAsIHRoaXMudmF1bHQucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbY29uZFF1b3RlTWludDFdID0gZGVyaXZlQ29uZGl0aW9uYWxNaW50KHZhdWx0UGRhLCBWYXVsdFR5cGUuUXVvdGUsIDEsIHRoaXMudmF1bHQucHJvZ3JhbUlkKTtcblxuICAgIC8vIERlcml2ZSBwb29sIFBEQXMgZm9yIGluaXRpYWwgMiBvcHRpb25zIChwcm9wb3NhbCBpcyBhZG1pbiwgbWludEE9Y29uZFF1b3RlLCBtaW50Qj1jb25kQmFzZSlcbiAgICBjb25zdCBbcG9vbDBdID0gZGVyaXZlUG9vbFBEQShwcm9wb3NhbFBkYSwgY29uZFF1b3RlTWludDAsIGNvbmRCYXNlTWludDAsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgY29uc3QgW3Bvb2wxXSA9IGRlcml2ZVBvb2xQREEocHJvcG9zYWxQZGEsIGNvbmRRdW90ZU1pbnQxLCBjb25kQmFzZU1pbnQxLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuXG4gICAgLy8gRGVyaXZlIHJlc2VydmVzIGFuZCBmZWUgdmF1bHRzXG4gICAgY29uc3QgW3Jlc2VydmVBMF0gPSBkZXJpdmVSZXNlcnZlUERBKHBvb2wwLCBjb25kUXVvdGVNaW50MCwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUIwXSA9IGRlcml2ZVJlc2VydmVQREEocG9vbDAsIGNvbmRCYXNlTWludDAsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgY29uc3QgW2ZlZVZhdWx0MF0gPSBkZXJpdmVGZWVWYXVsdFBEQShwb29sMCwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUExXSA9IGRlcml2ZVJlc2VydmVQREEocG9vbDEsIGNvbmRRdW90ZU1pbnQxLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgIGNvbnN0IFtyZXNlcnZlQjFdID0gZGVyaXZlUmVzZXJ2ZVBEQShwb29sMSwgY29uZEJhc2VNaW50MSwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbZmVlVmF1bHQxXSA9IGRlcml2ZUZlZVZhdWx0UERBKHBvb2wxLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuXG4gICAgLy8gVmF1bHQgdG9rZW4gYWNjb3VudHNcbiAgICBjb25zdCBiYXNlVG9rZW5BY2MgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtb2RlcmF0b3IuYmFzZU1pbnQsIHZhdWx0UGRhLCB0cnVlKTtcbiAgICBjb25zdCBxdW90ZVRva2VuQWNjID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobW9kZXJhdG9yLnF1b3RlTWludCwgdmF1bHRQZGEsIHRydWUpO1xuXG4gICAgLy8gQnVpbGQgcmVtYWluaW5nIGFjY291bnRzIGluIGV4cGVjdGVkIG9yZGVyIChzZWUgaW5pdGlhbGl6ZV9wcm9wb3NhbC5ycylcbiAgICBjb25zdCByZW1haW5pbmdBY2NvdW50cyA9IFtcbiAgICAgIHsgcHVia2V5OiBtb2RlcmF0b3IuYmFzZU1pbnQsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSwgICAgICAvLyAwOiBiYXNlX21pbnRcbiAgICAgIHsgcHVia2V5OiBtb2RlcmF0b3IucXVvdGVNaW50LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sICAgICAvLyAxOiBxdW90ZV9taW50XG4gICAgICB7IHB1YmtleTogdmF1bHRQZGEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAgICAgLy8gMjogdmF1bHRcbiAgICAgIHsgcHVia2V5OiBiYXNlVG9rZW5BY2MsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAvLyAzOiBiYXNlX3Rva2VuX2FjY1xuICAgICAgeyBwdWJrZXk6IHF1b3RlVG9rZW5BY2MsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgIC8vIDQ6IHF1b3RlX3Rva2VuX2FjY1xuICAgICAgeyBwdWJrZXk6IGNvbmRCYXNlTWludDAsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgIC8vIDU6IGNvbmRfYmFzZV9taW50XzBcbiAgICAgIHsgcHVia2V5OiBjb25kQmFzZU1pbnQxLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAvLyA2OiBjb25kX2Jhc2VfbWludF8xXG4gICAgICB7IHB1YmtleTogY29uZFF1b3RlTWludDAsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgLy8gNzogY29uZF9xdW90ZV9taW50XzBcbiAgICAgIHsgcHVia2V5OiBjb25kUXVvdGVNaW50MSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAvLyA4OiBjb25kX3F1b3RlX21pbnRfMVxuICAgICAgeyBwdWJrZXk6IHBvb2wwLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgICAgICAgIC8vIDk6IHBvb2xfMFxuICAgICAgeyBwdWJrZXk6IHJlc2VydmVBMCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgIC8vIDEwOiByZXNlcnZlX2FfMFxuICAgICAgeyBwdWJrZXk6IHJlc2VydmVCMCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgIC8vIDExOiByZXNlcnZlX2JfMFxuICAgICAgeyBwdWJrZXk6IEZFRV9BVVRIT1JJVFksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSwgICAgICAgICAgIC8vIDEyOiBmZWVfYXV0aG9yaXR5XG4gICAgICB7IHB1YmtleTogZmVlVmF1bHQwLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgICAgLy8gMTM6IGZlZV92YXVsdF8wXG4gICAgICB7IHB1YmtleTogcG9vbDEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAgICAgICAgLy8gMTQ6IHBvb2xfMVxuICAgICAgeyBwdWJrZXk6IHJlc2VydmVBMSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgIC8vIDE1OiByZXNlcnZlX2FfMVxuICAgICAgeyBwdWJrZXk6IHJlc2VydmVCMSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgIC8vIDE2OiByZXNlcnZlX2JfMVxuICAgICAgeyBwdWJrZXk6IGZlZVZhdWx0MSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgIC8vIDE3OiBmZWVfdmF1bHRfMVxuICAgIF07XG5cbiAgICBjb25zdCBidWlsZGVyID0gaW5pdGlhbGl6ZVByb3Bvc2FsKFxuICAgICAgdGhpcy5wcm9ncmFtLFxuICAgICAgY3JlYXRvcixcbiAgICAgIG1vZGVyYXRvclBkYSxcbiAgICAgIHByb3Bvc2FsUGRhLFxuICAgICAgcHJvcG9zYWxQYXJhbXMsXG4gICAgICBtZXRhZGF0YSA/PyBudWxsLFxuICAgICAgcmVtYWluaW5nQWNjb3VudHNcbiAgICApLnByZUluc3RydWN0aW9ucyh0aGlzLm1heWJlQWRkQ29tcHV0ZUJ1ZGdldChvcHRpb25zKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYnVpbGRlcixcbiAgICAgIHByb3Bvc2FsUGRhLFxuICAgICAgcHJvcG9zYWxJZCxcbiAgICAgIHZhdWx0UGRhLFxuICAgICAgcG9vbHM6IFtwb29sMCwgcG9vbDFdLFxuICAgICAgY29uZEJhc2VNaW50czogW2NvbmRCYXNlTWludDAsIGNvbmRCYXNlTWludDFdLFxuICAgICAgY29uZFF1b3RlTWludHM6IFtjb25kUXVvdGVNaW50MCwgY29uZFF1b3RlTWludDFdLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBhZGRPcHRpb24oY3JlYXRvcjogUHVibGljS2V5LCBwcm9wb3NhbFBkYTogUHVibGljS2V5LCBvcHRpb25zPzogVHhPcHRpb25zKSB7XG4gICAgY29uc3QgcHJvcG9zYWwgPSBhd2FpdCB0aGlzLmZldGNoUHJvcG9zYWwocHJvcG9zYWxQZGEpO1xuICAgIGNvbnN0IG9wdGlvbkluZGV4ID0gcHJvcG9zYWwubnVtT3B0aW9ucztcblxuICAgIC8vIERlcml2ZSBuZXcgY29uZGl0aW9uYWwgbWludHNcbiAgICBjb25zdCBbY29uZEJhc2VNaW50XSA9IGRlcml2ZUNvbmRpdGlvbmFsTWludChwcm9wb3NhbC52YXVsdCwgVmF1bHRUeXBlLkJhc2UsIG9wdGlvbkluZGV4LCB0aGlzLnZhdWx0LnByb2dyYW1JZCk7XG4gICAgY29uc3QgW2NvbmRRdW90ZU1pbnRdID0gZGVyaXZlQ29uZGl0aW9uYWxNaW50KHByb3Bvc2FsLnZhdWx0LCBWYXVsdFR5cGUuUXVvdGUsIG9wdGlvbkluZGV4LCB0aGlzLnZhdWx0LnByb2dyYW1JZCk7XG5cbiAgICAvLyBEZXJpdmUgcG9vbCBQREFcbiAgICBjb25zdCBbcG9vbF0gPSBkZXJpdmVQb29sUERBKHByb3Bvc2FsUGRhLCBjb25kUXVvdGVNaW50LCBjb25kQmFzZU1pbnQsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgY29uc3QgW3Jlc2VydmVBXSA9IGRlcml2ZVJlc2VydmVQREEocG9vbCwgY29uZFF1b3RlTWludCwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUJdID0gZGVyaXZlUmVzZXJ2ZVBEQShwb29sLCBjb25kQmFzZU1pbnQsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgY29uc3QgW2ZlZVZhdWx0XSA9IGRlcml2ZUZlZVZhdWx0UERBKHBvb2wsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG5cbiAgICAvLyBCdWlsZCByZW1haW5pbmcgYWNjb3VudHMgKHNlZSBhZGRfb3B0aW9uLnJzKVxuICAgIGNvbnN0IHJlbWFpbmluZ0FjY291bnRzID0gW1xuICAgICAgeyBwdWJrZXk6IHByb3Bvc2FsLnZhdWx0LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgIC8vIDA6IHZhdWx0XG4gICAgICB7IHB1YmtleTogY29uZEJhc2VNaW50LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgLy8gMTogY29uZF9iYXNlX21pbnRcbiAgICAgIHsgcHVia2V5OiBjb25kUXVvdGVNaW50LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAvLyAyOiBjb25kX3F1b3RlX21pbnRcbiAgICAgIHsgcHVia2V5OiBwb29sLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgICAgICAgICAvLyAzOiBwb29sXG4gICAgICB7IHB1YmtleTogcmVzZXJ2ZUEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAgICAgLy8gNDogcmVzZXJ2ZV9hXG4gICAgICB7IHB1YmtleTogcmVzZXJ2ZUIsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAgICAgLy8gNTogcmVzZXJ2ZV9iXG4gICAgICB7IHB1YmtleTogRkVFX0FVVEhPUklUWSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LCAgICAgICAgICAgLy8gNjogZmVlX2F1dGhvcml0eVxuICAgICAgeyBwdWJrZXk6IGZlZVZhdWx0LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgICAgIC8vIDc6IGZlZV92YXVsdFxuICAgIF07XG5cbiAgICBjb25zdCBidWlsZGVyID0gYWRkT3B0aW9uKHRoaXMucHJvZ3JhbSwgY3JlYXRvciwgcHJvcG9zYWxQZGEsIHJlbWFpbmluZ0FjY291bnRzKVxuICAgICAgLnByZUluc3RydWN0aW9ucyh0aGlzLm1heWJlQWRkQ29tcHV0ZUJ1ZGdldChvcHRpb25zKSk7XG5cbiAgICByZXR1cm4geyBidWlsZGVyLCBvcHRpb25JbmRleCwgcG9vbCwgY29uZEJhc2VNaW50LCBjb25kUXVvdGVNaW50IH07XG4gIH1cblxuICBhc3luYyBsYXVuY2hQcm9wb3NhbChcbiAgICBjcmVhdG9yOiBQdWJsaWNLZXksXG4gICAgcHJvcG9zYWxQZGE6IFB1YmxpY0tleSxcbiAgICBiYXNlQW1vdW50OiBCTiB8IG51bWJlcixcbiAgICBxdW90ZUFtb3VudDogQk4gfCBudW1iZXIsXG4gICAgb3B0aW9ucz86IFR4T3B0aW9uc1xuICApIHtcbiAgICBjb25zdCBwcm9wb3NhbCA9IGF3YWl0IHRoaXMuZmV0Y2hQcm9wb3NhbChwcm9wb3NhbFBkYSk7XG4gICAgY29uc3QgdmF1bHQgPSBhd2FpdCB0aGlzLnZhdWx0LmZldGNoVmF1bHQocHJvcG9zYWwudmF1bHQpO1xuICAgIGNvbnN0IG51bU9wdGlvbnMgPSBwcm9wb3NhbC5udW1PcHRpb25zO1xuXG4gICAgLy8gU2xpY2UgYXJyYXlzIHRvIG51bU9wdGlvbnMgKGZpeGVkLXNpemUgYXJyYXlzIGZyb20gUnVzdCBpbmNsdWRlIGVtcHR5IHNsb3RzKVxuICAgIGNvbnN0IGNvbmRCYXNlTWludHMgPSB2YXVsdC5jb25kQmFzZU1pbnRzLnNsaWNlKDAsIG51bU9wdGlvbnMpO1xuICAgIGNvbnN0IGNvbmRRdW90ZU1pbnRzID0gdmF1bHQuY29uZFF1b3RlTWludHMuc2xpY2UoMCwgbnVtT3B0aW9ucyk7XG5cbiAgICAvLyBQcmUtY3JlYXRlIGNvbmRpdGlvbmFsIEFUQXMgZm9yIDMrIG9wdGlvbnMgdG8gYXZvaWQgZXhjZWVkaW5nIHRoZVxuICAgIC8vIDY0IGluc3RydWN0aW9uIHRyYWNlIGxpbWl0LiBFYWNoIEFUQSBjcmVhdGlvbiB2aWEgdmF1bHQgZGVwb3NpdCBhZGRzXG4gICAgLy8gNSBpbm5lciBpbnN0cnVjdGlvbnM7IHdpdGggNCBvcHRpb25zIHRoYXQncyA0MCBleHRyYSBpbnN0cnVjdGlvbnMuXG4gICAgY29uc3Qgc2hvdWxkRW5zdXJlQVRBcyA9IG9wdGlvbnM/LmVuc3VyZUFUQXMgPz8gKG51bU9wdGlvbnMgPj0gMyk7XG4gICAgaWYgKHNob3VsZEVuc3VyZUFUQXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2NyZWF0ZUNvbmRpdGlvbmFsQVRBcyhjcmVhdG9yLCBjb25kQmFzZU1pbnRzLCBjb25kUXVvdGVNaW50cyk7XG4gICAgfVxuICAgIGNvbnN0IHBvb2xzID0gcHJvcG9zYWwucG9vbHMuc2xpY2UoMCwgbnVtT3B0aW9ucyk7XG5cbiAgICAvLyBEZXJpdmUgYWxsIHVzZXIgY29uZGl0aW9uYWwgdG9rZW4gQVRBc1xuICAgIGNvbnN0IHVzZXJDb25kQmFzZUFUQXMgPSBjb25kQmFzZU1pbnRzLm1hcCgobSkgPT4gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobSwgY3JlYXRvcikpO1xuICAgIGNvbnN0IHVzZXJDb25kUXVvdGVBVEFzID0gY29uZFF1b3RlTWludHMubWFwKChtKSA9PiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtLCBjcmVhdG9yKSk7XG5cbiAgICAvLyBEZXJpdmUgcmVzZXJ2ZSBhY2NvdW50cyBmb3IgZWFjaCBwb29sXG4gICAgY29uc3QgcmVzZXJ2ZXNBOiBQdWJsaWNLZXlbXSA9IFtdO1xuICAgIGNvbnN0IHJlc2VydmVzQjogUHVibGljS2V5W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9wdGlvbnM7IGkrKykge1xuICAgICAgY29uc3QgW3Jlc0FdID0gZGVyaXZlUmVzZXJ2ZVBEQShwb29sc1tpXSwgY29uZFF1b3RlTWludHNbaV0sIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgICBjb25zdCBbcmVzQl0gPSBkZXJpdmVSZXNlcnZlUERBKHBvb2xzW2ldLCBjb25kQmFzZU1pbnRzW2ldLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgICAgcmVzZXJ2ZXNBLnB1c2gocmVzQSk7XG4gICAgICByZXNlcnZlc0IucHVzaChyZXNCKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCByZW1haW5pbmcgYWNjb3VudHMgKHNlZSBsYXVuY2hfcHJvcG9zYWwucnMpXG4gICAgLy8gTGF5b3V0OiA2IGZpeGVkICsgNypOIHZhcmlhYmxlXG4gICAgY29uc3QgcmVtYWluaW5nQWNjb3VudHM6IHsgcHVia2V5OiBQdWJsaWNLZXk7IGlzU2lnbmVyOiBib29sZWFuOyBpc1dyaXRhYmxlOiBib29sZWFuIH1bXSA9IFtcbiAgICAgIHsgcHVia2V5OiB2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDogYmFzZV9taW50XG4gICAgICB7IHB1YmtleTogdmF1bHQucXVvdGVNaW50LmFkZHJlc3MsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHF1b3RlX21pbnRcbiAgICAgIHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBwcm9wb3NhbC52YXVsdCwgdHJ1ZSksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgIC8vIDI6IHZhdWx0X2Jhc2VfYXRhXG4gICAgICB7IHB1YmtleTogZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQucXVvdGVNaW50LmFkZHJlc3MsIHByb3Bvc2FsLnZhdWx0LCB0cnVlKSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAvLyAzOiB2YXVsdF9xdW90ZV9hdGFcbiAgICAgIHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBjcmVhdG9yKSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAvLyA0OiB1c2VyX2Jhc2VfYXRhXG4gICAgICB7IHB1YmtleTogZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQucXVvdGVNaW50LmFkZHJlc3MsIGNyZWF0b3IpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgLy8gNTogdXNlcl9xdW90ZV9hdGFcbiAgICBdO1xuXG4gICAgLy8gNi4uNitOOiBjb25kX2Jhc2VfbWludHNcbiAgICBmb3IgKGNvbnN0IG1pbnQgb2YgY29uZEJhc2VNaW50cykge1xuICAgICAgcmVtYWluaW5nQWNjb3VudHMucHVzaCh7IHB1YmtleTogbWludCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgICAvLyA2K04uLjYrMk46IGNvbmRfcXVvdGVfbWludHNcbiAgICBmb3IgKGNvbnN0IG1pbnQgb2YgY29uZFF1b3RlTWludHMpIHtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IG1pbnQsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLy8gNisyTi4uNiszTjogdXNlcl9jb25kX2Jhc2VfYXRhc1xuICAgIGZvciAoY29uc3QgYXRhIG9mIHVzZXJDb25kQmFzZUFUQXMpIHtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IGF0YSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgICAvLyA2KzNOLi42KzROOiB1c2VyX2NvbmRfcXVvdGVfYXRhc1xuICAgIGZvciAoY29uc3QgYXRhIG9mIHVzZXJDb25kUXVvdGVBVEFzKSB7XG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiBhdGEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLy8gNis0Ti4uNis1TjogcG9vbHNcbiAgICBmb3IgKGNvbnN0IHBvb2wgb2YgcG9vbHMpIHtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IHBvb2wsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLy8gNis1Ti4uNis2TjogcmVzZXJ2ZXNfYVxuICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc2VydmVzQSkge1xuICAgICAgcmVtYWluaW5nQWNjb3VudHMucHVzaCh7IHB1YmtleTogcmVzLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gICAgfVxuICAgIC8vIDYrNk4uLjYrN046IHJlc2VydmVzX2JcbiAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXNlcnZlc0IpIHtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IHJlcywgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBsYXVuY2hQcm9wb3NhbChcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGNyZWF0b3IsXG4gICAgICBwcm9wb3NhbFBkYSxcbiAgICAgIHByb3Bvc2FsLnZhdWx0LFxuICAgICAgYmFzZUFtb3VudCxcbiAgICAgIHF1b3RlQW1vdW50LFxuICAgICAgcmVtYWluaW5nQWNjb3VudHNcbiAgICApLnByZUluc3RydWN0aW9ucyh0aGlzLm1heWJlQWRkQ29tcHV0ZUJ1ZGdldChvcHRpb25zKSk7XG5cbiAgICByZXR1cm4geyBidWlsZGVyIH07XG4gIH1cblxuICAvKipcbiAgICogUHJlLWNyZWF0ZXMgYWxsIGNvbmRpdGlvbmFsIHRva2VuIEFUQXMgZm9yIGEgdXNlciBiZWZvcmUgbGF1bmNoaW5nIGEgcHJvcG9zYWwuXG4gICAqXG4gICAqIFRoaXMgaXMgUkVRVUlSRUQgZm9yIHByb3Bvc2FscyB3aXRoIDMrIG9wdGlvbnMgdG8gYXZvaWQgZXhjZWVkaW5nIFNvbGFuYSdzXG4gICAqIG1heCBpbnN0cnVjdGlvbiB0cmFjZSBsZW5ndGggbGltaXQgKDY0IGluc3RydWN0aW9ucykuIFRoZSB2YXVsdCdzIGRlcG9zaXQgQ1BJXG4gICAqIGNyZWF0ZXMgQVRBcyBvbi10aGUtZmx5LCBlYWNoIHJlcXVpcmluZyA1IGlubmVyIGluc3RydWN0aW9ucy4gRm9yIDQgb3B0aW9uczpcbiAgICogOCBBVEFzIMOXIDUgPSA0MCBleHRyYSBpbnN0cnVjdGlvbnMsIHB1c2hpbmcgdGhlIHRvdGFsIG92ZXIgNjQuXG4gICAqXG4gICAqIFByZS1jcmVhdGluZyBBVEFzIGVsaW1pbmF0ZXMgdGhpcyBvdmVyaGVhZCwgcmVkdWNpbmcgdGhlIHRyYWNlIHRvIH4zMiBpbnN0cnVjdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBjcmVhdG9yIC0gVGhlIHVzZXIgd2hvIHdpbGwgcmVjZWl2ZSBjb25kaXRpb25hbCB0b2tlbnNcbiAgICogQHBhcmFtIHByb3Bvc2FsUGRhIC0gVGhlIHByb3Bvc2FsIFBEQSAobXVzdCBiZSBpbml0aWFsaXplZCBidXQgbm90IGxhdW5jaGVkKVxuICAgKiBAcmV0dXJucyBUcmFuc2FjdGlvbiBzaWduYXR1cmVcbiAgICovXG4gIGFzeW5jIGVuc3VyZUNvbmRpdGlvbmFsQVRBcyhcbiAgICBjcmVhdG9yOiBQdWJsaWNLZXksXG4gICAgcHJvcG9zYWxQZGE6IFB1YmxpY0tleSxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwcm9wb3NhbCA9IGF3YWl0IHRoaXMuZmV0Y2hQcm9wb3NhbChwcm9wb3NhbFBkYSk7XG4gICAgY29uc3QgdmF1bHQgPSBhd2FpdCB0aGlzLnZhdWx0LmZldGNoVmF1bHQocHJvcG9zYWwudmF1bHQpO1xuICAgIGNvbnN0IGNvbmRCYXNlTWludHMgPSB2YXVsdC5jb25kQmFzZU1pbnRzLnNsaWNlKDAsIHByb3Bvc2FsLm51bU9wdGlvbnMpO1xuICAgIGNvbnN0IGNvbmRRdW90ZU1pbnRzID0gdmF1bHQuY29uZFF1b3RlTWludHMuc2xpY2UoMCwgcHJvcG9zYWwubnVtT3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUNvbmRpdGlvbmFsQVRBcyhjcmVhdG9yLCBjb25kQmFzZU1pbnRzLCBjb25kUXVvdGVNaW50cyk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgaGVscGVyIHRvIGNyZWF0ZSBjb25kaXRpb25hbCBBVEFzIGdpdmVuIG1pbnQgYXJyYXlzLlxuICAgKiBVc2VkIGJ5IGJvdGggZW5zdXJlQ29uZGl0aW9uYWxBVEFzIGFuZCBsYXVuY2hQcm9wb3NhbCB0byBhdm9pZCByZWR1bmRhbnQgZmV0Y2hlcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2NyZWF0ZUNvbmRpdGlvbmFsQVRBcyhcbiAgICBjcmVhdG9yOiBQdWJsaWNLZXksXG4gICAgY29uZEJhc2VNaW50czogUHVibGljS2V5W10sXG4gICAgY29uZFF1b3RlTWludHM6IFB1YmxpY0tleVtdLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5wcm9ncmFtLnByb3ZpZGVyIGFzIEFuY2hvclByb3ZpZGVyO1xuXG4gICAgLy8gQnVpbGQgQVRBIGNyZWF0aW9uIGluc3RydWN0aW9ucyAoaWRlbXBvdGVudCAtIHdvbid0IGZhaWwgaWYgZXhpc3RzKVxuICAgIGNvbnN0IGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25kQmFzZU1pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB1c2VyQ29uZEJhc2VBdGEgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhjb25kQmFzZU1pbnRzW2ldLCBjcmVhdG9yKTtcbiAgICAgIGNvbnN0IHVzZXJDb25kUXVvdGVBdGEgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhjb25kUXVvdGVNaW50c1tpXSwgY3JlYXRvcik7XG5cbiAgICAgIGluc3RydWN0aW9ucy5wdXNoKFxuICAgICAgICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SWRlbXBvdGVudEluc3RydWN0aW9uKFxuICAgICAgICAgIGNyZWF0b3IsXG4gICAgICAgICAgdXNlckNvbmRCYXNlQXRhLFxuICAgICAgICAgIGNyZWF0b3IsXG4gICAgICAgICAgY29uZEJhc2VNaW50c1tpXVxuICAgICAgICApLFxuICAgICAgICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SWRlbXBvdGVudEluc3RydWN0aW9uKFxuICAgICAgICAgIGNyZWF0b3IsXG4gICAgICAgICAgdXNlckNvbmRRdW90ZUF0YSxcbiAgICAgICAgICBjcmVhdG9yLFxuICAgICAgICAgIGNvbmRRdW90ZU1pbnRzW2ldXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU2VuZCB0cmFuc2FjdGlvblxuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKC4uLmluc3RydWN0aW9ucyk7XG4gICAgcmV0dXJuIHByb3ZpZGVyLnNlbmRBbmRDb25maXJtKHR4KTtcbiAgfVxuXG4gIGFzeW5jIGZpbmFsaXplUHJvcG9zYWwoc2lnbmVyOiBQdWJsaWNLZXksIHByb3Bvc2FsUGRhOiBQdWJsaWNLZXksIG9wdGlvbnM/OiBUeE9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm9wb3NhbCA9IGF3YWl0IHRoaXMuZmV0Y2hQcm9wb3NhbChwcm9wb3NhbFBkYSk7XG4gICAgY29uc3QgdmF1bHQgPSBhd2FpdCB0aGlzLnZhdWx0LmZldGNoVmF1bHQocHJvcG9zYWwudmF1bHQpO1xuICAgIGNvbnN0IG51bU9wdGlvbnMgPSBwcm9wb3NhbC5udW1PcHRpb25zO1xuXG4gICAgLy8gQnVpbGQgcmVtYWluaW5nIGFjY291bnRzICgzIHBlciBwb29sOiBwb29sLCByZXNlcnZlX2EsIHJlc2VydmVfYilcbiAgICBjb25zdCByZW1haW5pbmdBY2NvdW50czogeyBwdWJrZXk6IFB1YmxpY0tleTsgaXNTaWduZXI6IGJvb2xlYW47IGlzV3JpdGFibGU6IGJvb2xlYW4gfVtdID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9wdGlvbnM7IGkrKykge1xuICAgICAgY29uc3QgcG9vbCA9IHByb3Bvc2FsLnBvb2xzW2ldO1xuICAgICAgY29uc3QgW3Jlc2VydmVBXSA9IGRlcml2ZVJlc2VydmVQREEocG9vbCwgdmF1bHQuY29uZFF1b3RlTWludHNbaV0sIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgICBjb25zdCBbcmVzZXJ2ZUJdID0gZGVyaXZlUmVzZXJ2ZVBEQShwb29sLCB2YXVsdC5jb25kQmFzZU1pbnRzW2ldLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuXG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiBwb29sLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiByZXNlcnZlQSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9KTtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IHJlc2VydmVCLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBmaW5hbGl6ZVByb3Bvc2FsKFxuICAgICAgdGhpcy5wcm9ncmFtLFxuICAgICAgc2lnbmVyLFxuICAgICAgcHJvcG9zYWxQZGEsXG4gICAgICBwcm9wb3NhbC52YXVsdCxcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzXG4gICAgKS5wcmVJbnN0cnVjdGlvbnModGhpcy5tYXliZUFkZENvbXB1dGVCdWRnZXQob3B0aW9ucykpO1xuXG4gICAgcmV0dXJuIHsgYnVpbGRlciB9O1xuICB9XG5cbiAgYXN5bmMgcmVkZWVtTGlxdWlkaXR5KGNyZWF0b3I6IFB1YmxpY0tleSwgcHJvcG9zYWxQZGE6IFB1YmxpY0tleSwgb3B0aW9ucz86IFR4T3B0aW9ucykge1xuICAgIGNvbnN0IHByb3Bvc2FsID0gYXdhaXQgdGhpcy5mZXRjaFByb3Bvc2FsKHByb3Bvc2FsUGRhKTtcbiAgICBjb25zdCB2YXVsdCA9IGF3YWl0IHRoaXMudmF1bHQuZmV0Y2hWYXVsdChwcm9wb3NhbC52YXVsdCk7XG4gICAgY29uc3QgbnVtT3B0aW9ucyA9IHByb3Bvc2FsLm51bU9wdGlvbnM7XG5cbiAgICBjb25zdCB7IHdpbm5pbmdJZHggfSA9IHBhcnNlUHJvcG9zYWxTdGF0ZShwcm9wb3NhbC5zdGF0ZSk7XG4gICAgaWYgKHdpbm5pbmdJZHggPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlByb3Bvc2FsIG5vdCBmaW5hbGl6ZWRcIik7XG4gICAgfVxuICAgIGNvbnN0IHdpbm5pbmdQb29sID0gcHJvcG9zYWwucG9vbHNbd2lubmluZ0lkeF07XG5cbiAgICAvLyBEZXJpdmUgd2lubmluZyBwb29sIHJlc2VydmVzXG4gICAgY29uc3QgW3Jlc2VydmVBXSA9IGRlcml2ZVJlc2VydmVQREEod2lubmluZ1Bvb2wsIHZhdWx0LmNvbmRRdW90ZU1pbnRzW3dpbm5pbmdJZHhdLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgIGNvbnN0IFtyZXNlcnZlQl0gPSBkZXJpdmVSZXNlcnZlUERBKHdpbm5pbmdQb29sLCB2YXVsdC5jb25kQmFzZU1pbnRzW3dpbm5pbmdJZHhdLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuXG4gICAgLy8gVXNlcidzIHdpbm5pbmcgY29uZGl0aW9uYWwgdG9rZW4gQVRBc1xuICAgIGNvbnN0IGNyZWF0b3JDb25kUXVvdGVBdGEgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5jb25kUXVvdGVNaW50c1t3aW5uaW5nSWR4XSwgY3JlYXRvcik7XG4gICAgY29uc3QgY3JlYXRvckNvbmRCYXNlQXRhID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQuY29uZEJhc2VNaW50c1t3aW5uaW5nSWR4XSwgY3JlYXRvcik7XG5cbiAgICAvLyBCdWlsZCByZW1haW5pbmcgYWNjb3VudHMgKHNlZSByZWRlZW1fbGlxdWlkaXR5LnJzKVxuICAgIGNvbnN0IHJlbWFpbmluZ0FjY291bnRzOiB7IHB1YmtleTogUHVibGljS2V5OyBpc1NpZ25lcjogYm9vbGVhbjsgaXNXcml0YWJsZTogYm9vbGVhbiB9W10gPSBbXG4gICAgICAvLyByZW1vdmVfbGlxdWlkaXR5IGFjY291bnRzICgwLTMpXG4gICAgICB7IHB1YmtleTogcmVzZXJ2ZUEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBwdWJrZXk6IHJlc2VydmVCLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgIHsgcHVia2V5OiBjcmVhdG9yQ29uZFF1b3RlQXRhLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgIHsgcHVia2V5OiBjcmVhdG9yQ29uZEJhc2VBdGEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuXG4gICAgICAvLyByZWRlZW1fd2lubmluZ3MgYmFzZSBmaXhlZCBhY2NvdW50cyAoNC02KVxuICAgICAgeyBwdWJrZXk6IHZhdWx0LmJhc2VNaW50LmFkZHJlc3MsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICAgIHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBwcm9wb3NhbC52YXVsdCwgdHJ1ZSksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBwdWJrZXk6IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHZhdWx0LmJhc2VNaW50LmFkZHJlc3MsIGNyZWF0b3IpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICBdO1xuXG4gICAgLy8gcmVkZWVtX3dpbm5pbmdzIGJhc2UgcmVtYWluaW5nICg3Li43KzJOKTogW2NvbmRfYmFzZV9taW50X2ksIHVzZXJfY29uZF9iYXNlX2F0YV9pXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtT3B0aW9uczsgaSsrKSB7XG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiB2YXVsdC5jb25kQmFzZU1pbnRzW2ldLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5jb25kQmFzZU1pbnRzW2ldLCBjcmVhdG9yKSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIHJlZGVlbV93aW5uaW5ncyBxdW90ZSBmaXhlZCBhY2NvdW50c1xuICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IHZhdWx0LnF1b3RlTWludC5hZGRyZXNzLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0pO1xuICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHZhdWx0LnF1b3RlTWludC5hZGRyZXNzLCBwcm9wb3NhbC52YXVsdCwgdHJ1ZSksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5xdW90ZU1pbnQuYWRkcmVzcywgY3JlYXRvciksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcblxuICAgIC8vIHJlZGVlbV93aW5uaW5ncyBxdW90ZSByZW1haW5pbmc6IFtjb25kX3F1b3RlX21pbnRfaSwgdXNlcl9jb25kX3F1b3RlX2F0YV9pXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtT3B0aW9uczsgaSsrKSB7XG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiB2YXVsdC5jb25kUXVvdGVNaW50c1tpXSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgICAgcmVtYWluaW5nQWNjb3VudHMucHVzaCh7IHB1YmtleTogZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQuY29uZFF1b3RlTWludHNbaV0sIGNyZWF0b3IpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRlciA9IHJlZGVlbUxpcXVpZGl0eShcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGNyZWF0b3IsXG4gICAgICBwcm9wb3NhbFBkYSxcbiAgICAgIHByb3Bvc2FsLnZhdWx0LFxuICAgICAgd2lubmluZ1Bvb2wsXG4gICAgICByZW1haW5pbmdBY2NvdW50c1xuICAgICkucHJlSW5zdHJ1Y3Rpb25zKHRoaXMubWF5YmVBZGRDb21wdXRlQnVkZ2V0KG9wdGlvbnMpKTtcblxuICAgIHJldHVybiB7IGJ1aWxkZXIsIG51bU9wdGlvbnMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIEFkZHJlc3MgTG9va3VwIFRhYmxlIGZvciByZWRlbXB0aW9uIG9wZXJhdGlvbnMuXG4gICAqIFJlcXVpcmVkIGZvciBwcm9wb3NhbHMgd2l0aCAzKyBvcHRpb25zIHRvIGF2b2lkIGV4Y2VlZGluZyB0cmFuc2FjdGlvbiBzaXplIGxpbWl0cy5cbiAgICpcbiAgICogQHBhcmFtIGNyZWF0b3IgLSBUaGUgdXNlciByZWRlZW1pbmcgKGNyZWF0b3Igb2YgcHJvcG9zYWwgb3IgbGlxdWlkaXR5IHByb3ZpZGVyKVxuICAgKiBAcGFyYW0gcHJvcG9zYWxQZGEgLSBUaGUgcHJvcG9zYWwgUERBXG4gICAqIEByZXR1cm5zIEFMVCBhZGRyZXNzXG4gICAqL1xuICBhc3luYyBjcmVhdGVSZWRlbXB0aW9uQUxUKFxuICAgIGNyZWF0b3I6IFB1YmxpY0tleSxcbiAgICBwcm9wb3NhbFBkYTogUHVibGljS2V5LFxuICApOiBQcm9taXNlPHsgYWx0QWRkcmVzczogUHVibGljS2V5IH0+IHtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMucHJvZ3JhbS5wcm92aWRlciBhcyBBbmNob3JQcm92aWRlcjtcbiAgICBjb25zdCBwcm9wb3NhbCA9IGF3YWl0IHRoaXMuZmV0Y2hQcm9wb3NhbChwcm9wb3NhbFBkYSk7XG4gICAgY29uc3QgdmF1bHQgPSBhd2FpdCB0aGlzLnZhdWx0LmZldGNoVmF1bHQocHJvcG9zYWwudmF1bHQpO1xuICAgIGNvbnN0IG51bU9wdGlvbnMgPSBwcm9wb3NhbC5udW1PcHRpb25zO1xuXG4gICAgY29uc3QgeyB3aW5uaW5nSWR4IH0gPSBwYXJzZVByb3Bvc2FsU3RhdGUocHJvcG9zYWwuc3RhdGUpO1xuICAgIGlmICh3aW5uaW5nSWR4ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm9wb3NhbCBub3QgZmluYWxpemVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZHJlc3NlczogUHVibGljS2V5W10gPSBbXG4gICAgICAvLyBQcm9ncmFtc1xuICAgICAgdGhpcy5wcm9ncmFtSWQsXG4gICAgICB0aGlzLnZhdWx0LnByb2dyYW1JZCxcbiAgICAgIHRoaXMuYW1tLnByb2dyYW1JZCxcbiAgICAgIFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLFxuICAgICAgVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgIEFTU09DSUFURURfVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgIC8vIENvcmUgYWNjb3VudHNcbiAgICAgIHByb3Bvc2FsUGRhLFxuICAgICAgcHJvcG9zYWwudmF1bHQsXG4gICAgICBwcm9wb3NhbC5tb2RlcmF0b3IsXG4gICAgICB2YXVsdC5iYXNlTWludC5hZGRyZXNzLFxuICAgICAgdmF1bHQucXVvdGVNaW50LmFkZHJlc3MsXG4gICAgICAvLyBXaW5uaW5nIHBvb2wgYW5kIHJlc2VydmVzXG4gICAgICBwcm9wb3NhbC5wb29sc1t3aW5uaW5nSWR4XSxcbiAgICAgIC8vIFZhdWx0IHRva2VuIGFjY291bnRzXG4gICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBwcm9wb3NhbC52YXVsdCwgdHJ1ZSksXG4gICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5xdW90ZU1pbnQuYWRkcmVzcywgcHJvcG9zYWwudmF1bHQsIHRydWUpLFxuICAgICAgLy8gQ3JlYXRvcidzIGJhc2UvcXVvdGUgQVRBc1xuICAgICAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQuYmFzZU1pbnQuYWRkcmVzcywgY3JlYXRvciksXG4gICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5xdW90ZU1pbnQuYWRkcmVzcywgY3JlYXRvciksXG4gICAgXTtcblxuICAgIC8vIFdpbm5pbmcgcG9vbCByZXNlcnZlc1xuICAgIGNvbnN0IFtyZXNlcnZlQV0gPSBkZXJpdmVSZXNlcnZlUERBKHByb3Bvc2FsLnBvb2xzW3dpbm5pbmdJZHhdLCB2YXVsdC5jb25kUXVvdGVNaW50c1t3aW5uaW5nSWR4XSwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUJdID0gZGVyaXZlUmVzZXJ2ZVBEQShwcm9wb3NhbC5wb29sc1t3aW5uaW5nSWR4XSwgdmF1bHQuY29uZEJhc2VNaW50c1t3aW5uaW5nSWR4XSwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBhZGRyZXNzZXMucHVzaChyZXNlcnZlQSwgcmVzZXJ2ZUIpO1xuXG4gICAgLy8gUGVyLW9wdGlvbiBhY2NvdW50cyAoY29uZGl0aW9uYWwgbWludHMgYW5kIHVzZXIgQVRBcylcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9wdGlvbnM7IGkrKykge1xuICAgICAgYWRkcmVzc2VzLnB1c2goXG4gICAgICAgIHZhdWx0LmNvbmRCYXNlTWludHNbaV0sXG4gICAgICAgIHZhdWx0LmNvbmRRdW90ZU1pbnRzW2ldLFxuICAgICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5jb25kQmFzZU1pbnRzW2ldLCBjcmVhdG9yKSxcbiAgICAgICAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQuY29uZFF1b3RlTWludHNbaV0sIGNyZWF0b3IpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgcmVjZW50IHNsb3QgZm9yIEFMVCBjcmVhdGlvblxuICAgIGNvbnN0IHNsb3QgPSBhd2FpdCBwcm92aWRlci5jb25uZWN0aW9uLmdldFNsb3QoXCJmaW5hbGl6ZWRcIik7XG5cbiAgICBjb25zdCBbY3JlYXRlSXgsIGFsdEFkZHJlc3NdID0gQWRkcmVzc0xvb2t1cFRhYmxlUHJvZ3JhbS5jcmVhdGVMb29rdXBUYWJsZSh7XG4gICAgICBhdXRob3JpdHk6IGNyZWF0b3IsXG4gICAgICBwYXllcjogY3JlYXRvcixcbiAgICAgIHJlY2VudFNsb3Q6IHNsb3QsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgQUxUXG4gICAgY29uc3QgY3JlYXRlVHggPSBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoY3JlYXRlSXgpO1xuICAgIGNyZWF0ZVR4LnJlY2VudEJsb2NraGFzaCA9IChhd2FpdCBwcm92aWRlci5jb25uZWN0aW9uLmdldExhdGVzdEJsb2NraGFzaCgpKS5ibG9ja2hhc2g7XG4gICAgY3JlYXRlVHguZmVlUGF5ZXIgPSBjcmVhdG9yO1xuICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgcHJvdmlkZXIud2FsbGV0LnNpZ25UcmFuc2FjdGlvbihjcmVhdGVUeCk7XG4gICAgY29uc3Qgc2lnID0gYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5zZW5kUmF3VHJhbnNhY3Rpb24oc2lnbmVkVHguc2VyaWFsaXplKCksIHtcbiAgICAgIHNraXBQcmVmbGlnaHQ6IHRydWUsXG4gICAgfSk7XG4gICAgYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5jb25maXJtVHJhbnNhY3Rpb24oc2lnLCBcImNvbmZpcm1lZFwiKTtcblxuICAgIC8vIEV4dGVuZCBBTFQgd2l0aCBhZGRyZXNzZXNcbiAgICAvLyBVc2Ugc2tpcFByZWZsaWdodCB0byBhdm9pZCByYWNlIGNvbmRpdGlvbiB3aGVyZSBzaW11bGF0aW9uIHNlZXMgc3RhbGUgc3RhdGVcbiAgICAvLyBiZWZvcmUgcHJldmlvdXMgZXh0ZW5kIGhhcyBwcm9wYWdhdGVkIChzYW1lIHBhdHRlcm4gYXMgQ1JFQVRFIGFib3ZlKVxuICAgIGNvbnN0IENIVU5LX1NJWkUgPSAyMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZHJlc3Nlcy5sZW5ndGg7IGkgKz0gQ0hVTktfU0laRSkge1xuICAgICAgY29uc3QgY2h1bmsgPSBhZGRyZXNzZXMuc2xpY2UoaSwgaSArIENIVU5LX1NJWkUpO1xuICAgICAgY29uc3QgZXh0ZW5kSXggPSBBZGRyZXNzTG9va3VwVGFibGVQcm9ncmFtLmV4dGVuZExvb2t1cFRhYmxlKHtcbiAgICAgICAgcGF5ZXI6IGNyZWF0b3IsXG4gICAgICAgIGF1dGhvcml0eTogY3JlYXRvcixcbiAgICAgICAgbG9va3VwVGFibGU6IGFsdEFkZHJlc3MsXG4gICAgICAgIGFkZHJlc3NlczogY2h1bmssXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGV4dGVuZFR4ID0gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGV4dGVuZEl4KTtcbiAgICAgIGV4dGVuZFR4LnJlY2VudEJsb2NraGFzaCA9IChhd2FpdCBwcm92aWRlci5jb25uZWN0aW9uLmdldExhdGVzdEJsb2NraGFzaCgpKS5ibG9ja2hhc2g7XG4gICAgICBleHRlbmRUeC5mZWVQYXllciA9IGNyZWF0b3I7XG4gICAgICBjb25zdCBzaWduZWRFeHRlbmRUeCA9IGF3YWl0IHByb3ZpZGVyLndhbGxldC5zaWduVHJhbnNhY3Rpb24oZXh0ZW5kVHgpO1xuICAgICAgY29uc3QgZXh0ZW5kU2lnID0gYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5zZW5kUmF3VHJhbnNhY3Rpb24oc2lnbmVkRXh0ZW5kVHguc2VyaWFsaXplKCksIHtcbiAgICAgICAgc2tpcFByZWZsaWdodDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5jb25maXJtVHJhbnNhY3Rpb24oZXh0ZW5kU2lnLCBcImNvbmZpcm1lZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBhbHRBZGRyZXNzIH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgdmVyc2lvbmVkIHRyYW5zYWN0aW9uIGZvciByZWRlZW1pbmcgbGlxdWlkaXR5IHdpdGggQUxULlxuICAgKiBSZXF1aXJlZCBmb3IgcHJvcG9zYWxzIHdpdGggMysgb3B0aW9ucyB0byBhdm9pZCBleGNlZWRpbmcgdHJhbnNhY3Rpb24gc2l6ZSBsaW1pdHMuXG4gICAqXG4gICAqIEBwYXJhbSBjcmVhdG9yIC0gVGhlIHVzZXIgcmVkZWVtaW5nXG4gICAqIEBwYXJhbSBwcm9wb3NhbFBkYSAtIFRoZSBwcm9wb3NhbCBQREFcbiAgICogQHBhcmFtIGFsdEFkZHJlc3MgLSBPcHRpb25hbCBBTFQgYWRkcmVzcyAod2lsbCBiZSBjcmVhdGVkIGlmIG5vdCBwcm92aWRlZCBmb3IgMysgb3B0aW9ucylcbiAgICogQHJldHVybnMgVW5zaWduZWQgdmVyc2lvbmVkIHRyYW5zYWN0aW9uLCBBTFQgYWRkcmVzcywgYW5kIG51bWJlciBvZiBvcHRpb25zXG4gICAqL1xuICBhc3luYyByZWRlZW1MaXF1aWRpdHlWZXJzaW9uZWQoXG4gICAgY3JlYXRvcjogUHVibGljS2V5LFxuICAgIHByb3Bvc2FsUGRhOiBQdWJsaWNLZXksXG4gICAgYWx0QWRkcmVzcz86IFB1YmxpY0tleSxcbiAgKTogUHJvbWlzZTx7IHZlcnNpb25lZFR4OiBWZXJzaW9uZWRUcmFuc2FjdGlvbjsgYWx0QWRkcmVzczogUHVibGljS2V5OyBudW1PcHRpb25zOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5wcm9ncmFtLnByb3ZpZGVyIGFzIEFuY2hvclByb3ZpZGVyO1xuICAgIGNvbnN0IHsgYnVpbGRlciwgbnVtT3B0aW9ucyB9ID0gYXdhaXQgdGhpcy5yZWRlZW1MaXF1aWRpdHkoY3JlYXRvciwgcHJvcG9zYWxQZGEpO1xuXG4gICAgLy8gQ3JlYXRlIEFMVCBpZiBub3QgcHJvdmlkZWQgYW5kIG5lZWRlZFxuICAgIGxldCBhbHRQdWJrZXkgPSBhbHRBZGRyZXNzO1xuICAgIGxldCB2ZXJpZmllZEFMVDogQWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudCB8IG51bGwgPSBudWxsO1xuXG4gICAgaWYgKCFhbHRQdWJrZXkgJiYgbnVtT3B0aW9ucyA+PSAzKSB7XG4gICAgICBjb25zb2xlLmxvZyhgICBDcmVhdGluZyByZWRlbXB0aW9uIEFMVCBmb3IgJHtudW1PcHRpb25zfSBvcHRpb25zLi4uYCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNyZWF0ZVJlZGVtcHRpb25BTFQoY3JlYXRvciwgcHJvcG9zYWxQZGEpO1xuICAgICAgYWx0UHVia2V5ID0gcmVzdWx0LmFsdEFkZHJlc3M7XG4gICAgICBjb25zb2xlLmxvZyhgICDinJMgUmVkZW1wdGlvbiBBTFQgY3JlYXRlZDogJHthbHRQdWJrZXkudG9CYXNlNTgoKX1gKTtcblxuICAgICAgLy8gV2FpdCBmb3IgQUxUIHRvIGJlIGZ1bGx5IGF2YWlsYWJsZSB3aXRoIGFsbCBhZGRyZXNzZXNcbiAgICAgIC8vIFVzZSBsb25nZXIgZGVsYXlzIGFmdGVyIGV4dGVuZGluZyB0byBlbnN1cmUgcHJvcGFnYXRpb25cbiAgICAgIGNvbnNvbGUubG9nKGAgIFdhaXRpbmcgZm9yIEFMVCBwcm9wYWdhdGlvbi4uLmApO1xuICAgICAgY29uc3QgZXhwZWN0ZWRBZGRyZXNzZXMgPSAxOCArIChudW1PcHRpb25zICogNCk7IC8vIEJhc2UgYWNjb3VudHMgKyBwZXItb3B0aW9uIGFjY291bnRzXG4gICAgICBsZXQgYXR0ZW1wdHMgPSAwO1xuXG4gICAgICAvLyBJbml0aWFsIGRlbGF5IGFmdGVyIGV4dGVuc2lvblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDIwMDApKTtcblxuICAgICAgd2hpbGUgKGF0dGVtcHRzIDwgMzApIHtcbiAgICAgICAgY29uc3QgYWx0QWNjb3VudCA9IGF3YWl0IHByb3ZpZGVyLmNvbm5lY3Rpb24uZ2V0QWRkcmVzc0xvb2t1cFRhYmxlKGFsdFB1YmtleSwge1xuICAgICAgICAgIGNvbW1pdG1lbnQ6ICdjb25maXJtZWQnLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGFsdEFjY291bnQudmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBhZGRyZXNzQ291bnQgPSBhbHRBY2NvdW50LnZhbHVlLnN0YXRlLmFkZHJlc3Nlcy5sZW5ndGg7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQXR0ZW1wdCAke2F0dGVtcHRzICsgMX06IEFMVCBoYXMgJHthZGRyZXNzQ291bnR9LyR7ZXhwZWN0ZWRBZGRyZXNzZXN9IGFkZHJlc3Nlc2ApO1xuICAgICAgICAgIGlmIChhZGRyZXNzQ291bnQgPj0gZXhwZWN0ZWRBZGRyZXNzZXMpIHtcbiAgICAgICAgICAgIHZlcmlmaWVkQUxUID0gYWx0QWNjb3VudC52YWx1ZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgIOKckyBBTFQgdmVyaWZpZWQgd2l0aCAke2FkZHJlc3NDb3VudH0gYWRkcmVzc2VzYCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKTtcbiAgICAgICAgYXR0ZW1wdHMrKztcbiAgICAgIH1cblxuICAgICAgaWYgKCF2ZXJpZmllZEFMVCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFMVCBmYWlsZWQgdG8gcG9wdWxhdGUgd2l0aCBleHBlY3RlZCAke2V4cGVjdGVkQWRkcmVzc2VzfSBhZGRyZXNzZXMgYWZ0ZXIgJHthdHRlbXB0c30gYXR0ZW1wdHNgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWFsdFB1YmtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQUxUIGFkZHJlc3MgcmVxdWlyZWQgZm9yIG11bHRpLW9wdGlvbiByZWRlbXB0aW9uXCIpO1xuICAgIH1cblxuICAgIC8vIEZldGNoIEFMVCBpZiB3ZSBkb24ndCBoYXZlIGl0IHZlcmlmaWVkIGFscmVhZHlcbiAgICBpZiAoIXZlcmlmaWVkQUxUKSB7XG4gICAgICB2ZXJpZmllZEFMVCA9IGF3YWl0IHRoaXMuZmV0Y2hBTFQoYWx0UHVia2V5KTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBpbnN0cnVjdGlvblxuICAgIGNvbnN0IGluc3RydWN0aW9uID0gYXdhaXQgYnVpbGRlci5pbnN0cnVjdGlvbigpO1xuICAgIGNvbnN0IGNvbXB1dGVCdWRnZXRJeCA9IENvbXB1dGVCdWRnZXRQcm9ncmFtLnNldENvbXB1dGVVbml0TGltaXQoeyB1bml0czogNTAwXzAwMCB9KTtcblxuICAgIC8vIEdldCBmcmVzaCBibG9ja2hhc2hcbiAgICBjb25zdCB7IGJsb2NraGFzaCB9ID0gYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5nZXRMYXRlc3RCbG9ja2hhc2goKTtcblxuICAgIC8vIEJ1aWxkIHZlcnNpb25lZCB0cmFuc2FjdGlvbiB1c2luZyB0aGUgdmVyaWZpZWQgQUxUIChubyByZS1mZXRjaClcbiAgICBjb25zdCB2ZXJzaW9uZWRUeCA9IHRoaXMuYnVpbGRWZXJzaW9uZWRUeFdpdGhBTFQoXG4gICAgICBjcmVhdG9yLFxuICAgICAgW2NvbXB1dGVCdWRnZXRJeCwgaW5zdHJ1Y3Rpb25dLFxuICAgICAgdmVyaWZpZWRBTFQsXG4gICAgICBibG9ja2hhc2gsXG4gICAgKTtcblxuICAgIC8vIFJldHVybiB0aGUgdmVyc2lvbmVkIHRyYW5zYWN0aW9uIGZvciB0aGUgY2FsbGVyIHRvIHNpZ24gYW5kIHNlbmRcbiAgICAvLyBUaGlzIGFsbG93cyB0aGUgY2FsbGVyIHRvIHVzZSB0aGVpciBvd24gc2lnbmluZyBtZWNoYW5pc20gKGUuZy4sIGtleXBhaXIuc2lnbilcbiAgICByZXR1cm4geyB2ZXJzaW9uZWRUeCwgYWx0QWRkcmVzczogYWx0UHVia2V5LCBudW1PcHRpb25zIH07XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIHNlbmQgYSBzaWduZWQgdmVyc2lvbmVkIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgc2VuZFZlcnNpb25lZFRyYW5zYWN0aW9uKFxuICAgIHNpZ25lZFR4OiBWZXJzaW9uZWRUcmFuc2FjdGlvbixcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMucHJvZ3JhbS5wcm92aWRlciBhcyBBbmNob3JQcm92aWRlcjtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCBwcm92aWRlci5jb25uZWN0aW9uLnNlbmRUcmFuc2FjdGlvbihzaWduZWRUeCwge1xuICAgICAgc2tpcFByZWZsaWdodDogZmFsc2UsXG4gICAgICBwcmVmbGlnaHRDb21taXRtZW50OiAnY29uZmlybWVkJyxcbiAgICB9KTtcbiAgICBhd2FpdCBwcm92aWRlci5jb25uZWN0aW9uLmNvbmZpcm1UcmFuc2FjdGlvbihzaWduYXR1cmUsICdjb25maXJtZWQnKTtcbiAgICByZXR1cm4gc2lnbmF0dXJlO1xuICB9XG5cbiAgLyogQWRkcmVzcyBMb29rdXAgVGFibGUgKi9cblxuICBhc3luYyBjcmVhdGVQcm9wb3NhbEFMVChcbiAgICBjcmVhdG9yOiBQdWJsaWNLZXksXG4gICAgbW9kZXJhdG9yUGRhOiBQdWJsaWNLZXksXG4gICAgbnVtT3B0aW9uczogbnVtYmVyID0gMixcbiAgKTogUHJvbWlzZTx7IGFsdEFkZHJlc3M6IFB1YmxpY0tleSB9PiB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLnByb2dyYW0ucHJvdmlkZXIgYXMgQW5jaG9yUHJvdmlkZXI7XG4gICAgY29uc3QgbW9kZXJhdG9yID0gYXdhaXQgdGhpcy5mZXRjaE1vZGVyYXRvcihtb2RlcmF0b3JQZGEpO1xuICAgIGNvbnN0IHByb3Bvc2FsSWQgPSBtb2RlcmF0b3IucHJvcG9zYWxJZENvdW50ZXI7XG4gICAgY29uc3QgW3Byb3Bvc2FsUGRhXSA9IHRoaXMuZGVyaXZlUHJvcG9zYWxQREEobW9kZXJhdG9yUGRhLCBwcm9wb3NhbElkKTtcbiAgICBjb25zdCBbdmF1bHRQZGFdID0gZGVyaXZlVmF1bHRQREEocHJvcG9zYWxQZGEsIHByb3Bvc2FsSWQsIHRoaXMudmF1bHQucHJvZ3JhbUlkKTtcblxuICAgIGNvbnN0IGFkZHJlc3NlczogUHVibGljS2V5W10gPSBbXG4gICAgICAvLyBQcm9ncmFtc1xuICAgICAgdGhpcy5wcm9ncmFtSWQsXG4gICAgICB0aGlzLnZhdWx0LnByb2dyYW1JZCxcbiAgICAgIHRoaXMuYW1tLnByb2dyYW1JZCxcbiAgICAgIFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLFxuICAgICAgVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgIEFTU09DSUFURURfVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgIC8vIENvcmUgYWNjb3VudHNcbiAgICAgIG1vZGVyYXRvclBkYSxcbiAgICAgIHByb3Bvc2FsUGRhLFxuICAgICAgdmF1bHRQZGEsXG4gICAgICBtb2RlcmF0b3IuYmFzZU1pbnQsXG4gICAgICBtb2RlcmF0b3IucXVvdGVNaW50LFxuICAgICAgRkVFX0FVVEhPUklUWSxcbiAgICAgIC8vIFZhdWx0IHRva2VuIGFjY291bnRzXG4gICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtb2RlcmF0b3IuYmFzZU1pbnQsIHZhdWx0UGRhLCB0cnVlKSxcbiAgICAgIGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKG1vZGVyYXRvci5xdW90ZU1pbnQsIHZhdWx0UGRhLCB0cnVlKSxcbiAgICAgIC8vIENyZWF0b3IncyBiYXNlL3F1b3RlIEFUQXNcbiAgICAgIGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKG1vZGVyYXRvci5iYXNlTWludCwgY3JlYXRvciksXG4gICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtb2RlcmF0b3IucXVvdGVNaW50LCBjcmVhdG9yKSxcbiAgICBdO1xuXG4gICAgLy8gUGVyLW9wdGlvbiBhY2NvdW50c1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtT3B0aW9uczsgaSsrKSB7XG4gICAgICBjb25zdCBbY29uZEJhc2VNaW50XSA9IGRlcml2ZUNvbmRpdGlvbmFsTWludCh2YXVsdFBkYSwgVmF1bHRUeXBlLkJhc2UsIGksIHRoaXMudmF1bHQucHJvZ3JhbUlkKTtcbiAgICAgIGNvbnN0IFtjb25kUXVvdGVNaW50XSA9IGRlcml2ZUNvbmRpdGlvbmFsTWludCh2YXVsdFBkYSwgVmF1bHRUeXBlLlF1b3RlLCBpLCB0aGlzLnZhdWx0LnByb2dyYW1JZCk7XG4gICAgICBjb25zdCBbcG9vbF0gPSBkZXJpdmVQb29sUERBKHByb3Bvc2FsUGRhLCBjb25kUXVvdGVNaW50LCBjb25kQmFzZU1pbnQsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgICBjb25zdCBbcmVzZXJ2ZUFdID0gZGVyaXZlUmVzZXJ2ZVBEQShwb29sLCBjb25kUXVvdGVNaW50LCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgICAgY29uc3QgW3Jlc2VydmVCXSA9IGRlcml2ZVJlc2VydmVQREEocG9vbCwgY29uZEJhc2VNaW50LCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgICAgY29uc3QgW2ZlZVZhdWx0XSA9IGRlcml2ZUZlZVZhdWx0UERBKHBvb2wsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG5cbiAgICAgIGFkZHJlc3Nlcy5wdXNoKFxuICAgICAgICBjb25kQmFzZU1pbnQsXG4gICAgICAgIGNvbmRRdW90ZU1pbnQsXG4gICAgICAgIHBvb2wsXG4gICAgICAgIHJlc2VydmVBLFxuICAgICAgICByZXNlcnZlQixcbiAgICAgICAgZmVlVmF1bHQsXG4gICAgICAgIC8vIENyZWF0b3IncyBjb25kaXRpb25hbCB0b2tlbiBBVEFzXG4gICAgICAgIGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKGNvbmRCYXNlTWludCwgY3JlYXRvciksXG4gICAgICAgIGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKGNvbmRRdW90ZU1pbnQsIGNyZWF0b3IpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIG1vc3QgcmVjZW50IHNsb3QgdXNpbmcgXCJmaW5hbGl6ZWRcIiBjb21taXRtZW50IGZvciBzdGFiaWxpdHlcbiAgICBjb25zdCBzbG90ID0gYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5nZXRTbG90KFwiZmluYWxpemVkXCIpO1xuXG4gICAgY29uc3QgW2NyZWF0ZUl4LCBhbHRBZGRyZXNzXSA9IEFkZHJlc3NMb29rdXBUYWJsZVByb2dyYW0uY3JlYXRlTG9va3VwVGFibGUoe1xuICAgICAgYXV0aG9yaXR5OiBjcmVhdG9yLFxuICAgICAgcGF5ZXI6IGNyZWF0b3IsXG4gICAgICByZWNlbnRTbG90OiBzbG90LFxuICAgIH0pO1xuXG4gICAgLy8gU2VuZCBjcmVhdGUgdHJhbnNhY3Rpb24gaW1tZWRpYXRlbHksIHNraXAgcHJlZmxpZ2h0IHRvIGF2b2lkIHNsb3QgdGltaW5nIGlzc3Vlc1xuICAgIGNvbnN0IGNyZWF0ZVR4ID0gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGNyZWF0ZUl4KTtcbiAgICBjcmVhdGVUeC5yZWNlbnRCbG9ja2hhc2ggPSAoYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5nZXRMYXRlc3RCbG9ja2hhc2goKSkuYmxvY2toYXNoO1xuICAgIGNyZWF0ZVR4LmZlZVBheWVyID0gY3JlYXRvcjtcbiAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IHByb3ZpZGVyLndhbGxldC5zaWduVHJhbnNhY3Rpb24oY3JlYXRlVHgpO1xuICAgIGNvbnN0IHNpZyA9IGF3YWl0IHByb3ZpZGVyLmNvbm5lY3Rpb24uc2VuZFJhd1RyYW5zYWN0aW9uKHNpZ25lZFR4LnNlcmlhbGl6ZSgpLCB7XG4gICAgICBza2lwUHJlZmxpZ2h0OiB0cnVlLFxuICAgIH0pO1xuICAgIGF3YWl0IHByb3ZpZGVyLmNvbm5lY3Rpb24uY29uZmlybVRyYW5zYWN0aW9uKHNpZywgXCJjb25maXJtZWRcIik7XG5cbiAgICAvLyBTcGxpdCBhZGRyZXNzZXMgaW50byBjaHVua3MgdG8gYXZvaWQgdHJhbnNhY3Rpb24gc2l6ZSBsaW1pdHNcbiAgICAvLyBFYWNoIGFkZHJlc3MgaXMgMzIgYnl0ZXMsIH4yMCBhZGRyZXNzZXMgcGVyIGV4dGVuZCBpbnN0cnVjdGlvbiBpcyBzYWZlXG4gICAgLy8gVXNlIHNraXBQcmVmbGlnaHQgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24gd2hlcmUgc2ltdWxhdGlvbiBzZWVzIHN0YWxlIHN0YXRlXG4gICAgLy8gYmVmb3JlIHByZXZpb3VzIGV4dGVuZCBoYXMgcHJvcGFnYXRlZCAoc2FtZSBwYXR0ZXJuIGFzIENSRUFURSBhYm92ZSlcbiAgICBjb25zdCBDSFVOS19TSVpFID0gMjA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRyZXNzZXMubGVuZ3RoOyBpICs9IENIVU5LX1NJWkUpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gYWRkcmVzc2VzLnNsaWNlKGksIGkgKyBDSFVOS19TSVpFKTtcbiAgICAgIGNvbnN0IGV4dGVuZEl4ID0gQWRkcmVzc0xvb2t1cFRhYmxlUHJvZ3JhbS5leHRlbmRMb29rdXBUYWJsZSh7XG4gICAgICAgIHBheWVyOiBjcmVhdG9yLFxuICAgICAgICBhdXRob3JpdHk6IGNyZWF0b3IsXG4gICAgICAgIGxvb2t1cFRhYmxlOiBhbHRBZGRyZXNzLFxuICAgICAgICBhZGRyZXNzZXM6IGNodW5rLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBleHRlbmRUeCA9IG5ldyBUcmFuc2FjdGlvbigpLmFkZChleHRlbmRJeCk7XG4gICAgICBleHRlbmRUeC5yZWNlbnRCbG9ja2hhc2ggPSAoYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5nZXRMYXRlc3RCbG9ja2hhc2goKSkuYmxvY2toYXNoO1xuICAgICAgZXh0ZW5kVHguZmVlUGF5ZXIgPSBjcmVhdG9yO1xuICAgICAgY29uc3Qgc2lnbmVkRXh0ZW5kVHggPSBhd2FpdCBwcm92aWRlci53YWxsZXQuc2lnblRyYW5zYWN0aW9uKGV4dGVuZFR4KTtcbiAgICAgIGNvbnN0IGV4dGVuZFNpZyA9IGF3YWl0IHByb3ZpZGVyLmNvbm5lY3Rpb24uc2VuZFJhd1RyYW5zYWN0aW9uKHNpZ25lZEV4dGVuZFR4LnNlcmlhbGl6ZSgpLCB7XG4gICAgICAgIHNraXBQcmVmbGlnaHQ6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHByb3ZpZGVyLmNvbm5lY3Rpb24uY29uZmlybVRyYW5zYWN0aW9uKGV4dGVuZFNpZywgXCJjb25maXJtZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYWx0QWRkcmVzcyB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hBTFQoYWx0QWRkcmVzczogUHVibGljS2V5KTogUHJvbWlzZTxBZGRyZXNzTG9va3VwVGFibGVBY2NvdW50PiB7XG4gICAgY29uc3QgYWx0ID0gYXdhaXQgdGhpcy5wcm9ncmFtLnByb3ZpZGVyLmNvbm5lY3Rpb24uZ2V0QWRkcmVzc0xvb2t1cFRhYmxlKGFsdEFkZHJlc3MpO1xuICAgIGlmICghYWx0LnZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBTFQgbm90IGZvdW5kXCIpO1xuICAgIH1cbiAgICByZXR1cm4gYWx0LnZhbHVlO1xuICB9XG5cbiAgYXN5bmMgYnVpbGRWZXJzaW9uZWRUeChcbiAgICBwYXllcjogUHVibGljS2V5LFxuICAgIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICAgIGFsdEFkZHJlc3M6IFB1YmxpY0tleSxcbiAgKTogUHJvbWlzZTxWZXJzaW9uZWRUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5wcm9ncmFtLnByb3ZpZGVyIGFzIEFuY2hvclByb3ZpZGVyO1xuICAgIGNvbnN0IGFsdCA9IGF3YWl0IHRoaXMuZmV0Y2hBTFQoYWx0QWRkcmVzcyk7XG4gICAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IHByb3ZpZGVyLmNvbm5lY3Rpb24uZ2V0TGF0ZXN0QmxvY2toYXNoKCk7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRWZXJzaW9uZWRUeFdpdGhBTFQocGF5ZXIsIGluc3RydWN0aW9ucywgYWx0LCBibG9ja2hhc2gpO1xuICB9XG5cbiAgYnVpbGRWZXJzaW9uZWRUeFdpdGhBTFQoXG4gICAgcGF5ZXI6IFB1YmxpY0tleSxcbiAgICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSxcbiAgICBhbHQ6IEFkZHJlc3NMb29rdXBUYWJsZUFjY291bnQsXG4gICAgYmxvY2toYXNoOiBzdHJpbmcsXG4gICk6IFZlcnNpb25lZFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCBtZXNzYWdlID0gbmV3IFRyYW5zYWN0aW9uTWVzc2FnZSh7XG4gICAgICBwYXllcktleTogcGF5ZXIsXG4gICAgICByZWNlbnRCbG9ja2hhc2g6IGJsb2NraGFzaCxcbiAgICAgIGluc3RydWN0aW9ucyxcbiAgICB9KS5jb21waWxlVG9WME1lc3NhZ2UoW2FsdF0pO1xuXG4gICAgcmV0dXJuIG5ldyBWZXJzaW9uZWRUcmFuc2FjdGlvbihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qIERBTyBNZXRob2RzICovXG5cbiAgZGVyaXZlTWludENyZWF0ZUtleVBEQShkYW9QZGE6IFB1YmxpY0tleSwgbmFtZTogc3RyaW5nKTogW1B1YmxpY0tleSwgbnVtYmVyXSB7XG4gICAgcmV0dXJuIGRlcml2ZU1pbnRDcmVhdGVLZXlQREEoZGFvUGRhLCBuYW1lLCB0aGlzLnByb2dyYW1JZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoU3F1YWRzUHJvZ3JhbUNvbmZpZygpIHtcbiAgICBjb25zdCBbcHJvZ3JhbUNvbmZpZ1BkYV0gPSBtdWx0aXNpZy5nZXRQcm9ncmFtQ29uZmlnUGRhKHtcbiAgICAgIHByb2dyYW1JZDogU1FVQURTX1BST0dSQU1fSUQsXG4gICAgfSk7XG4gICAgY29uc3QgcHJvZ3JhbUNvbmZpZyA9IGF3YWl0IG11bHRpc2lnLmFjY291bnRzLlByb2dyYW1Db25maWcuZnJvbUFjY291bnRBZGRyZXNzKFxuICAgICAgdGhpcy5wcm9ncmFtLnByb3ZpZGVyLmNvbm5lY3Rpb24sXG4gICAgICBwcm9ncmFtQ29uZmlnUGRhXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvZ3JhbUNvbmZpZzogcHJvZ3JhbUNvbmZpZ1BkYSxcbiAgICAgIHByb2dyYW1Db25maWdUcmVhc3VyeTogcHJvZ3JhbUNvbmZpZy50cmVhc3VyeSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBkZXJpdmVNdWx0aXNpZ1BkYShjcmVhdGVLZXk6IFB1YmxpY0tleSk6IFB1YmxpY0tleSB7XG4gICAgY29uc3QgW211bHRpc2lnUGRhXSA9IG11bHRpc2lnLmdldE11bHRpc2lnUGRhKHtcbiAgICAgIGNyZWF0ZUtleSxcbiAgICAgIHByb2dyYW1JZDogU1FVQURTX1BST0dSQU1fSUQsXG4gICAgfSk7XG4gICAgcmV0dXJuIG11bHRpc2lnUGRhO1xuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZVBhcmVudERBTyhcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIHBhcmVudEFkbWluOiBQdWJsaWNLZXksXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGJhc2VNaW50OiBQdWJsaWNLZXksXG4gICAgcXVvdGVNaW50OiBQdWJsaWNLZXksXG4gICAgdHJlYXN1cnlDb3NpZ25lcjogUHVibGljS2V5LFxuICAgIHBvb2w6IFB1YmxpY0tleSxcbiAgICBwb29sVHlwZTogUG9vbFR5cGUsXG4gICAgb3B0aW9ucz86IFR4T3B0aW9uc1xuICApIHtcbiAgICBjb25zdCBbZGFvUGRhXSA9IHRoaXMuZGVyaXZlREFPUERBKG5hbWUpO1xuICAgIGNvbnN0IFttb2RlcmF0b3JQZGFdID0gdGhpcy5kZXJpdmVNb2RlcmF0b3JQREEobmFtZSk7XG4gICAgY29uc3QgW21pbnRDcmVhdGVLZXlQZGFdID0gdGhpcy5kZXJpdmVNaW50Q3JlYXRlS2V5UERBKGRhb1BkYSwgbmFtZSk7XG5cbiAgICAvLyBEZXJpdmUgU3F1YWRzIGFjY291bnRzIChzaW5nbGUgUlBDIGNhbGwpXG4gICAgY29uc3Qgc3F1YWRzQ29uZmlnID0gYXdhaXQgdGhpcy5mZXRjaFNxdWFkc1Byb2dyYW1Db25maWcoKTtcbiAgICBjb25zdCB0cmVhc3VyeU11bHRpc2lnUGRhID0gdGhpcy5kZXJpdmVNdWx0aXNpZ1BkYShkYW9QZGEpO1xuICAgIGNvbnN0IG1pbnRNdWx0aXNpZ1BkYSA9IHRoaXMuZGVyaXZlTXVsdGlzaWdQZGEobWludENyZWF0ZUtleVBkYSk7XG5cbiAgICBjb25zdCBidWlsZGVyID0gaW5pdGlhbGl6ZVBhcmVudERBTyhcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGFkbWluLFxuICAgICAgcGFyZW50QWRtaW4sXG4gICAgICBkYW9QZGEsXG4gICAgICBtb2RlcmF0b3JQZGEsXG4gICAgICBiYXNlTWludCxcbiAgICAgIHF1b3RlTWludCxcbiAgICAgIHNxdWFkc0NvbmZpZy5wcm9ncmFtQ29uZmlnLFxuICAgICAgc3F1YWRzQ29uZmlnLnByb2dyYW1Db25maWdUcmVhc3VyeSxcbiAgICAgIHRyZWFzdXJ5TXVsdGlzaWdQZGEsXG4gICAgICBtaW50TXVsdGlzaWdQZGEsXG4gICAgICBtaW50Q3JlYXRlS2V5UGRhLFxuICAgICAgU1FVQURTX1BST0dSQU1fSUQsXG4gICAgICBuYW1lLFxuICAgICAgdHJlYXN1cnlDb3NpZ25lcixcbiAgICAgIHBvb2wsXG4gICAgICBwb29sVHlwZVxuICAgICkucHJlSW5zdHJ1Y3Rpb25zKHRoaXMubWF5YmVBZGRDb21wdXRlQnVkZ2V0KG9wdGlvbnMpKTtcblxuICAgIHJldHVybiB7XG4gICAgICBidWlsZGVyLFxuICAgICAgZGFvUGRhLFxuICAgICAgbW9kZXJhdG9yUGRhLFxuICAgICAgdHJlYXN1cnlNdWx0aXNpZzogdHJlYXN1cnlNdWx0aXNpZ1BkYSxcbiAgICAgIG1pbnRNdWx0aXNpZzogbWludE11bHRpc2lnUGRhLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBpbml0aWFsaXplQ2hpbGREQU8oXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBwYXJlbnRBZG1pbjogUHVibGljS2V5LFxuICAgIHBhcmVudERhb05hbWU6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdG9rZW5NaW50OiBQdWJsaWNLZXksXG4gICAgdHJlYXN1cnlDb3NpZ25lcjogUHVibGljS2V5LFxuICAgIG9wdGlvbnM/OiBUeE9wdGlvbnNcbiAgKSB7XG4gICAgY29uc3QgW2Rhb1BkYV0gPSB0aGlzLmRlcml2ZURBT1BEQShuYW1lKTtcbiAgICBjb25zdCBbcGFyZW50RGFvUGRhXSA9IHRoaXMuZGVyaXZlREFPUERBKHBhcmVudERhb05hbWUpO1xuICAgIGNvbnN0IFttaW50Q3JlYXRlS2V5UGRhXSA9IHRoaXMuZGVyaXZlTWludENyZWF0ZUtleVBEQShkYW9QZGEsIG5hbWUpO1xuXG4gICAgLy8gRGVyaXZlIFNxdWFkcyBhY2NvdW50cyAoc2luZ2xlIFJQQyBjYWxsKVxuICAgIGNvbnN0IHNxdWFkc0NvbmZpZyA9IGF3YWl0IHRoaXMuZmV0Y2hTcXVhZHNQcm9ncmFtQ29uZmlnKCk7XG4gICAgY29uc3QgdHJlYXN1cnlNdWx0aXNpZ1BkYSA9IHRoaXMuZGVyaXZlTXVsdGlzaWdQZGEoZGFvUGRhKTtcbiAgICBjb25zdCBtaW50TXVsdGlzaWdQZGEgPSB0aGlzLmRlcml2ZU11bHRpc2lnUGRhKG1pbnRDcmVhdGVLZXlQZGEpO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IGluaXRpYWxpemVDaGlsZERBTyhcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGFkbWluLFxuICAgICAgcGFyZW50QWRtaW4sXG4gICAgICBkYW9QZGEsXG4gICAgICBwYXJlbnREYW9QZGEsXG4gICAgICB0b2tlbk1pbnQsXG4gICAgICBzcXVhZHNDb25maWcucHJvZ3JhbUNvbmZpZyxcbiAgICAgIHNxdWFkc0NvbmZpZy5wcm9ncmFtQ29uZmlnVHJlYXN1cnksXG4gICAgICB0cmVhc3VyeU11bHRpc2lnUGRhLFxuICAgICAgbWludE11bHRpc2lnUGRhLFxuICAgICAgbWludENyZWF0ZUtleVBkYSxcbiAgICAgIFNRVUFEU19QUk9HUkFNX0lELFxuICAgICAgbmFtZSxcbiAgICAgIHRyZWFzdXJ5Q29zaWduZXJcbiAgICApLnByZUluc3RydWN0aW9ucyh0aGlzLm1heWJlQWRkQ29tcHV0ZUJ1ZGdldChvcHRpb25zKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYnVpbGRlcixcbiAgICAgIGRhb1BkYSxcbiAgICAgIHBhcmVudERhb1BkYSxcbiAgICAgIHRyZWFzdXJ5TXVsdGlzaWc6IHRyZWFzdXJ5TXVsdGlzaWdQZGEsXG4gICAgICBtaW50TXVsdGlzaWc6IG1pbnRNdWx0aXNpZ1BkYSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgdXBncmFkZURBTyhcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIHBhcmVudEFkbWluOiBQdWJsaWNLZXksXG4gICAgZGFvTmFtZTogc3RyaW5nLFxuICAgIHBhcmVudERhb05hbWU6IHN0cmluZyxcbiAgICBiYXNlTWludDogUHVibGljS2V5LFxuICAgIHF1b3RlTWludDogUHVibGljS2V5LFxuICAgIHBvb2w6IFB1YmxpY0tleSxcbiAgICBwb29sVHlwZTogUG9vbFR5cGUsXG4gICAgb3B0aW9ucz86IFR4T3B0aW9uc1xuICApIHtcbiAgICBjb25zdCBbZGFvUGRhXSA9IHRoaXMuZGVyaXZlREFPUERBKGRhb05hbWUpO1xuICAgIGNvbnN0IFtwYXJlbnREYW9QZGFdID0gdGhpcy5kZXJpdmVEQU9QREEocGFyZW50RGFvTmFtZSk7XG4gICAgY29uc3QgW21vZGVyYXRvclBkYV0gPSB0aGlzLmRlcml2ZU1vZGVyYXRvclBEQShkYW9OYW1lKTtcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSB1cGdyYWRlREFPKFxuICAgICAgdGhpcy5wcm9ncmFtLFxuICAgICAgYWRtaW4sXG4gICAgICBwYXJlbnRBZG1pbixcbiAgICAgIGRhb1BkYSxcbiAgICAgIHBhcmVudERhb1BkYSxcbiAgICAgIG1vZGVyYXRvclBkYSxcbiAgICAgIGJhc2VNaW50LFxuICAgICAgcXVvdGVNaW50LFxuICAgICAgcG9vbCxcbiAgICAgIHBvb2xUeXBlXG4gICAgKS5wcmVJbnN0cnVjdGlvbnModGhpcy5tYXliZUFkZENvbXB1dGVCdWRnZXQob3B0aW9ucykpO1xuXG4gICAgcmV0dXJuIHsgYnVpbGRlciwgZGFvUGRhLCBtb2RlcmF0b3JQZGEgfTtcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zcomb/programs-sdk",
3
- "version": "1.3.0",
3
+ "version": "1.5.0",
4
4
  "description": "SDK for ZCombinator Programs",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/amm/client.ts CHANGED
@@ -330,7 +330,7 @@ export class AMMClient {
330
330
  minOutputAmount: BN | number,
331
331
  options?: AmmActionOptions
332
332
  ) {
333
- const { autoWrapUnwrap = true, includeCuBudget = true, computeUnits } = options ?? {};
333
+ const { autoCreateTokenAccounts = true, includeCuBudget = true, computeUnits } = options ?? {};
334
334
 
335
335
  const pool = await this.fetchPool(poolPda);
336
336
  const [reserveA] = this.deriveReservePDA(poolPda, pool.mintA);
@@ -340,7 +340,6 @@ export class AMMClient {
340
340
  const traderAccountB = getAssociatedTokenAddressSync(pool.mintB, trader);
341
341
 
342
342
  const preIxs: TransactionInstruction[] = [];
343
- const postIxs: TransactionInstruction[] = [];
344
343
 
345
344
  if (includeCuBudget) {
346
345
  preIxs.push(
@@ -350,13 +349,7 @@ export class AMMClient {
350
349
  );
351
350
  }
352
351
 
353
- const inputMint = swapAToB ? pool.mintA : pool.mintB;
354
- const outputMint = swapAToB ? pool.mintB : pool.mintA;
355
- const inputAta = swapAToB ? traderAccountA : traderAccountB;
356
- const outputAta = swapAToB ? traderAccountB : traderAccountA;
357
-
358
- if (autoWrapUnwrap) {
359
- // Create ATAs idempotently
352
+ if (autoCreateTokenAccounts) {
360
353
  preIxs.push(
361
354
  createAssociatedTokenAccountIdempotentInstruction(
362
355
  trader,
@@ -371,24 +364,6 @@ export class AMMClient {
371
364
  pool.mintB
372
365
  )
373
366
  );
374
-
375
- // Wrap input SOL if needed
376
- if (inputMint.equals(NATIVE_MINT)) {
377
- const input = typeof inputAmount === "number" ? new BN(inputAmount) : inputAmount;
378
- preIxs.push(
379
- SystemProgram.transfer({
380
- fromPubkey: trader,
381
- toPubkey: inputAta,
382
- lamports: BigInt(input.toString()),
383
- }),
384
- createSyncNativeInstruction(inputAta)
385
- );
386
- }
387
-
388
- // Unwrap output SOL if needed
389
- if (outputMint.equals(NATIVE_MINT)) {
390
- postIxs.push(createCloseAccountInstruction(outputAta, trader, trader));
391
- }
392
367
  }
393
368
 
394
369
  let builder = swapIx(
@@ -408,9 +383,6 @@ export class AMMClient {
408
383
  if (preIxs.length > 0) {
409
384
  builder = builder.preInstructions(preIxs);
410
385
  }
411
- if (postIxs.length > 0) {
412
- builder = builder.postInstructions(postIxs);
413
- }
414
386
 
415
387
  return builder;
416
388
  }
@@ -434,8 +406,7 @@ export class AMMClient {
434
406
  * - Fetches current reserves and computes quote
435
407
  * - Calculates minOutput based on slippage tolerance
436
408
  * - Adds compute budget instruction (if includeCuBudget is true)
437
- * - Creates token accounts if they don't exist (if autoWrapUnwrap is true)
438
- * - Handles WSOL wrapping/unwrapping if needed (if autoWrapUnwrap is true)
409
+ * - Creates token accounts if they don't exist (if autoCreateTokenAccounts is true)
439
410
  */
440
411
  async swapWithSlippage(
441
412
  trader: PublicKey,
@@ -445,7 +416,7 @@ export class AMMClient {
445
416
  slippagePercent: number = 0.5,
446
417
  options?: AmmActionOptions
447
418
  ) {
448
- const { autoWrapUnwrap = true, includeCuBudget = true, computeUnits } = options ?? {};
419
+ const { autoCreateTokenAccounts = true, includeCuBudget = true, computeUnits } = options ?? {};
449
420
 
450
421
  const pool = await this.fetchPool(poolPda);
451
422
  const input = typeof inputAmount === "number" ? new BN(inputAmount) : inputAmount;
@@ -476,7 +447,6 @@ export class AMMClient {
476
447
  );
477
448
 
478
449
  const preIxs: TransactionInstruction[] = [];
479
- const postIxs: TransactionInstruction[] = [];
480
450
 
481
451
  if (includeCuBudget) {
482
452
  preIxs.push(
@@ -486,7 +456,7 @@ export class AMMClient {
486
456
  );
487
457
  }
488
458
 
489
- if (autoWrapUnwrap) {
459
+ if (autoCreateTokenAccounts) {
490
460
  preIxs.push(
491
461
  createAssociatedTokenAccountIdempotentInstruction(
492
462
  trader,
@@ -503,35 +473,9 @@ export class AMMClient {
503
473
  );
504
474
  }
505
475
 
506
- // Handle WSOL for input/output tokens
507
- const inputMint = swapAToB ? pool.mintA : pool.mintB;
508
- const outputMint = swapAToB ? pool.mintB : pool.mintA;
509
- const inputAta = swapAToB ? traderAccountA : traderAccountB;
510
- const outputAta = swapAToB ? traderAccountB : traderAccountA;
511
-
512
- if (autoWrapUnwrap && inputMint.equals(NATIVE_MINT)) {
513
- // Wrap SOL before swap
514
- preIxs.push(
515
- SystemProgram.transfer({
516
- fromPubkey: trader,
517
- toPubkey: inputAta,
518
- lamports: BigInt(input.toString()),
519
- }),
520
- createSyncNativeInstruction(inputAta)
521
- );
522
- }
523
-
524
- if (autoWrapUnwrap && outputMint.equals(NATIVE_MINT)) {
525
- // Unwrap SOL after swap
526
- postIxs.push(createCloseAccountInstruction(outputAta, trader, trader));
527
- }
528
-
529
476
  if (preIxs.length > 0) {
530
477
  builder = builder.preInstructions(preIxs);
531
478
  }
532
- if (postIxs.length > 0) {
533
- builder = builder.postInstructions(postIxs);
534
- }
535
479
 
536
480
  return {
537
481
  builder,
package/src/amm/types.ts CHANGED
@@ -57,5 +57,6 @@ export type AMMEvent =
57
57
  /* Options */
58
58
 
59
59
  export interface AmmActionOptions extends TxOptions {
60
- autoWrapUnwrap?: boolean; // Auto wrap/unwrap native SOL (default: true)
60
+ autoWrapUnwrap?: boolean; // Auto wrap/unwrap native SOL (default: true) - for liquidity operations
61
+ autoCreateTokenAccounts?: boolean; // Auto create token accounts (default: true) - for swaps
61
62
  }
@@ -615,6 +615,8 @@ export class FutarchyClient {
615
615
  await provider.connection.confirmTransaction(sig, "confirmed");
616
616
 
617
617
  // Extend ALT with addresses
618
+ // Use skipPreflight to avoid race condition where simulation sees stale state
619
+ // before previous extend has propagated (same pattern as CREATE above)
618
620
  const CHUNK_SIZE = 20;
619
621
  for (let i = 0; i < addresses.length; i += CHUNK_SIZE) {
620
622
  const chunk = addresses.slice(i, i + CHUNK_SIZE);
@@ -625,7 +627,13 @@ export class FutarchyClient {
625
627
  addresses: chunk,
626
628
  });
627
629
  const extendTx = new Transaction().add(extendIx);
628
- await provider.sendAndConfirm(extendTx);
630
+ extendTx.recentBlockhash = (await provider.connection.getLatestBlockhash()).blockhash;
631
+ extendTx.feePayer = creator;
632
+ const signedExtendTx = await provider.wallet.signTransaction(extendTx);
633
+ const extendSig = await provider.connection.sendRawTransaction(signedExtendTx.serialize(), {
634
+ skipPreflight: true,
635
+ });
636
+ await provider.connection.confirmTransaction(extendSig, "confirmed");
629
637
  }
630
638
 
631
639
  return { altAddress };
@@ -812,6 +820,8 @@ export class FutarchyClient {
812
820
 
813
821
  // Split addresses into chunks to avoid transaction size limits
814
822
  // Each address is 32 bytes, ~20 addresses per extend instruction is safe
823
+ // Use skipPreflight to avoid race condition where simulation sees stale state
824
+ // before previous extend has propagated (same pattern as CREATE above)
815
825
  const CHUNK_SIZE = 20;
816
826
  for (let i = 0; i < addresses.length; i += CHUNK_SIZE) {
817
827
  const chunk = addresses.slice(i, i + CHUNK_SIZE);
@@ -822,7 +832,13 @@ export class FutarchyClient {
822
832
  addresses: chunk,
823
833
  });
824
834
  const extendTx = new Transaction().add(extendIx);
825
- await provider.sendAndConfirm(extendTx);
835
+ extendTx.recentBlockhash = (await provider.connection.getLatestBlockhash()).blockhash;
836
+ extendTx.feePayer = creator;
837
+ const signedExtendTx = await provider.wallet.signTransaction(extendTx);
838
+ const extendSig = await provider.connection.sendRawTransaction(signedExtendTx.serialize(), {
839
+ skipPreflight: true,
840
+ });
841
+ await provider.connection.confirmTransaction(extendSig, "confirmed");
826
842
  }
827
843
 
828
844
  return { altAddress };