@zcomb/programs-sdk 1.3.0 → 1.4.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.
- package/dist/amm/client.d.ts +1 -2
- package/dist/amm/client.js +6 -50
- package/dist/amm/types.d.ts +1 -0
- package/dist/amm/types.js +1 -1
- package/package.json +1 -1
- package/src/amm/client.ts +5 -61
- package/src/amm/types.ts +2 -1
package/dist/amm/client.d.ts
CHANGED
|
@@ -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
|
|
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, {
|
package/dist/amm/client.js
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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
|
|
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 {
|
|
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 (
|
|
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=
|
package/dist/amm/types.d.ts
CHANGED
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/
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYW1tL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQXlCSCxXQUFXO0FBRVgsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ25CLGdDQUFtQixDQUFBO0lBQ25CLG9DQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFIVyxTQUFTLHlCQUFULFNBQVMsUUFHcEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogVHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIEFNTSBwcm9ncmFtLlxuICogRXhwb3J0cyBJREwtZGVyaXZlZCB0eXBlcyBhbmQgU0RLLWZyaWVuZGx5IGVudW1zLlxuICovXG5cbmltcG9ydCB7IEJOLCBJZGxBY2NvdW50cywgSWRsRXZlbnRzLCBJZGxUeXBlcyB9IGZyb20gXCJAY29yYWwteHl6L2FuY2hvclwiO1xuaW1wb3J0IHsgVHhPcHRpb25zIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbi8qIElETCBUeXBlIFJlLWV4cG9ydCAqL1xuXG5leHBvcnQgeyBBbW0gfSBmcm9tIFwiLi4vZ2VuZXJhdGVkL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFtbSB9IGZyb20gXCIuLi9nZW5lcmF0ZWQvdHlwZXNcIjtcblxuLyogSURMLWRlcml2ZWQgVHlwZXMgKi9cblxuZXhwb3J0IHR5cGUgUG9vbEFjY291bnQgPSBJZGxBY2NvdW50czxBbW0+W1wicG9vbEFjY291bnRcIl07XG5leHBvcnQgdHlwZSBQb29sU3RhdGVSYXcgPSBJZGxUeXBlczxBbW0+W1wicG9vbFN0YXRlXCJdO1xuZXhwb3J0IHR5cGUgVHdhcE9yYWNsZSA9IElkbFR5cGVzPEFtbT5bXCJ0d2FwT3JhY2xlXCJdO1xuZXhwb3J0IHR5cGUgUG9vbEJ1bXBzID0gSWRsVHlwZXM8QW1tPltcInBvb2xCdW1wc1wiXTtcblxuLyogRXZlbnQgVHlwZXMgKi9cblxuZXhwb3J0IHR5cGUgUG9vbENyZWF0ZWRFdmVudCA9IElkbEV2ZW50czxBbW0+W1wicG9vbENyZWF0ZWRcIl07XG5leHBvcnQgdHlwZSBMaXF1aWRpdHlBZGRlZEV2ZW50ID0gSWRsRXZlbnRzPEFtbT5bXCJsaXF1aWRpdHlBZGRlZFwiXTtcbmV4cG9ydCB0eXBlIExpcXVpZGl0eVJlbW92ZWRFdmVudCA9IElkbEV2ZW50czxBbW0+W1wibGlxdWlkaXR5UmVtb3ZlZFwiXTtcbmV4cG9ydCB0eXBlIENvbmRTd2FwRXZlbnQgPSBJZGxFdmVudHM8QW1tPltcImNvbmRTd2FwXCJdO1xuZXhwb3J0IHR5cGUgVFdBUFVwZGF0ZUV2ZW50ID0gSWRsRXZlbnRzPEFtbT5bXCJ0d2FwVXBkYXRlXCJdO1xuXG4vKiBFbnVtcyAqL1xuXG5leHBvcnQgZW51bSBQb29sU3RhdGUge1xuICBUcmFkaW5nID0gXCJ0cmFkaW5nXCIsXG4gIEZpbmFsaXplZCA9IFwiZmluYWxpemVkXCIsXG59XG5cbi8qIFF1b3RlIFR5cGVzICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgU3dhcFF1b3RlIHtcbiAgaW5wdXRBbW91bnQ6IEJOO1xuICBvdXRwdXRBbW91bnQ6IEJOO1xuICBtaW5PdXRwdXRBbW91bnQ6IEJOO1xuICBmZWVBbW91bnQ6IEJOO1xuICBwcmljZUltcGFjdDogbnVtYmVyO1xuICBzcG90UHJpY2VCZWZvcmU6IEJOO1xuICBzcG90UHJpY2VBZnRlcjogQk47XG59XG5cbi8qIEV2ZW50IFVuaW9uIFR5cGUgKi9cblxuZXhwb3J0IHR5cGUgQU1NRXZlbnQgPVxuICB8IHsgbmFtZTogXCJQb29sQ3JlYXRlZFwiOyBkYXRhOiBQb29sQ3JlYXRlZEV2ZW50IH1cbiAgfCB7IG5hbWU6IFwiTGlxdWlkaXR5QWRkZWRcIjsgZGF0YTogTGlxdWlkaXR5QWRkZWRFdmVudCB9XG4gIHwgeyBuYW1lOiBcIkxpcXVpZGl0eVJlbW92ZWRcIjsgZGF0YTogTGlxdWlkaXR5UmVtb3ZlZEV2ZW50IH1cbiAgfCB7IG5hbWU6IFwiQ29uZFN3YXBcIjsgZGF0YTogQ29uZFN3YXBFdmVudCB9XG4gIHwgeyBuYW1lOiBcIlRXQVBVcGRhdGVcIjsgZGF0YTogVFdBUFVwZGF0ZUV2ZW50IH07XG5cbi8qIE9wdGlvbnMgKi9cblxuZXhwb3J0IGludGVyZmFjZSBBbW1BY3Rpb25PcHRpb25zIGV4dGVuZHMgVHhPcHRpb25zIHtcbiAgYXV0b1dyYXBVbndyYXA/OiBib29sZWFuOyAvLyBBdXRvIHdyYXAvdW53cmFwIG5hdGl2ZSBTT0wgKGRlZmF1bHQ6IHRydWUpIC0gZm9yIGxpcXVpZGl0eSBvcGVyYXRpb25zXG4gIGF1dG9DcmVhdGVUb2tlbkFjY291bnRzPzogYm9vbGVhbjsgLy8gQXV0byBjcmVhdGUgdG9rZW4gYWNjb3VudHMgKGRlZmF1bHQ6IHRydWUpIC0gZm9yIHN3YXBzXG59XG4iXX0=
|
package/package.json
CHANGED
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 {
|
|
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
|
-
|
|
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
|
|
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 {
|
|
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 (
|
|
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
|
}
|