@allbridge/bridge-core-sdk 3.25.0 → 3.26.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.js +6 -1
- package/dist/browser/index.js.map +4 -4
- package/dist/cjs/index.js +6 -1
- package/dist/cjs/index.js.map +4 -4
- package/dist/esm/index.js +6 -1
- package/dist/esm/index.js.map +4 -4
- package/dist/src/chains/chain.enums.d.ts +7 -2
- package/dist/src/chains/chain.enums.js +5 -0
- package/dist/src/chains/chain.enums.js.map +1 -1
- package/dist/src/chains/index.js +6 -0
- package/dist/src/chains/index.js.map +1 -1
- package/dist/src/client/core-api/core-api-mapper.js +1 -0
- package/dist/src/client/core-api/core-api-mapper.js.map +1 -1
- package/dist/src/client/core-api/core-api.model.d.ts +1 -0
- package/dist/src/client/core-api/core-api.model.js.map +1 -1
- package/dist/src/services/bridge/alg/index.d.ts +15 -0
- package/dist/src/services/bridge/alg/index.js +157 -0
- package/dist/src/services/bridge/alg/index.js.map +1 -0
- package/dist/src/services/bridge/index.js +16 -0
- package/dist/src/services/bridge/index.js.map +1 -1
- package/dist/src/services/bridge/models/bridge.model.d.ts +1 -0
- package/dist/src/services/bridge/models/bridge.model.js.map +1 -1
- package/dist/src/services/bridge/sui/index.js.map +1 -1
- package/dist/src/services/bridge/utils.d.ts +3 -1
- package/dist/src/services/bridge/utils.js +72 -15
- package/dist/src/services/bridge/utils.js.map +1 -1
- package/dist/src/services/liquidity-pool/alg/index.d.ts +19 -0
- package/dist/src/services/liquidity-pool/alg/index.js +141 -0
- package/dist/src/services/liquidity-pool/alg/index.js.map +1 -0
- package/dist/src/services/liquidity-pool/index.js +16 -0
- package/dist/src/services/liquidity-pool/index.js.map +1 -1
- package/dist/src/services/liquidity-pool/sui/index.js.map +1 -1
- package/dist/src/services/liquidity-pool/trx/index.js.map +1 -1
- package/dist/src/services/models/alg/BridgeClient.d.ts +2718 -0
- package/dist/src/services/models/alg/BridgeClient.js +2633 -0
- package/dist/src/services/models/alg/BridgeClient.js.map +1 -0
- package/dist/src/services/models/alg/PoolClient.d.ts +2265 -0
- package/dist/src/services/models/alg/PoolClient.js +2176 -0
- package/dist/src/services/models/alg/PoolClient.js.map +1 -0
- package/dist/src/services/models/index.d.ts +6 -5
- package/dist/src/services/models/index.js.map +1 -1
- package/dist/src/services/token/alg/index.d.ts +17 -0
- package/dist/src/services/token/alg/index.js +46 -0
- package/dist/src/services/token/alg/index.js.map +1 -0
- package/dist/src/services/token/index.js +16 -0
- package/dist/src/services/token/index.js.map +1 -1
- package/dist/src/services/token/sui/index.js.map +1 -1
- package/dist/src/services/utils/alg/index.d.ts +18 -0
- package/dist/src/services/utils/alg/index.js +94 -0
- package/dist/src/services/utils/alg/index.js.map +1 -0
- package/dist/src/services/utils/trx/index.js.map +1 -1
- package/dist/src/services/yield/index.js +4 -0
- package/dist/src/services/yield/index.js.map +1 -1
- package/dist/src/tokens-info/tokens-info.model.d.ts +4 -0
- package/dist/src/tokens-info/tokens-info.model.js.map +1 -1
- package/dist/src/utils/alg/index.d.ts +21 -0
- package/dist/src/utils/alg/index.js +67 -0
- package/dist/src/utils/alg/index.js.map +1 -0
- package/dist/src/utils/index.d.ts +3 -0
- package/dist/src/utils/index.js +3 -0
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/package.json +5 -2
package/dist/esm/index.js
CHANGED
|
@@ -1,2 +1,7 @@
|
|
|
1
|
-
var Pi=Object.create;var Kr=Object.defineProperty;var wi=Object.getOwnPropertyDescriptor;var Ci=Object.getOwnPropertyNames;var Bi=Object.getPrototypeOf,Ri=Object.prototype.hasOwnProperty;var Ii=(s,a)=>()=>(s&&(a=s(s=0)),a);var dr=(s,a)=>()=>(a||s((a={exports:{}}).exports,a),a.exports);var vi=(s,a,r,i)=>{if(a&&typeof a=="object"||typeof a=="function")for(let o of Ci(a))!Ri.call(s,o)&&o!==r&&Kr(s,o,{get:()=>a[o],enumerable:!(i=wi(a,o))||i.enumerable});return s};var Re=(s,a,r)=>(r=s!=null?Pi(Bi(s)):{},vi(a||!s||!s.__esModule?Kr(r,"default",{value:s,enumerable:!0}):r,s));import{bcs as Ae}from"@mysten/sui/bcs";function is(s,a=["<",">"]){let[r,i]=a,o=[],c="",A=0;for(let m=0;m<s.length;m++){let u=s[m];if(u===r&&A++,u===i&&A--,A===0&&u===","){o.push(c.trim()),c="";continue}c+=u}return o.push(c.trim()),o}function te(s){if(typeof s!="string")throw new Error(`Illegal type passed as a name of the type: ${s}`);let[a,r]=["<",">"],i=s.indexOf(a),o=Array.from(s).reverse().indexOf(r);if(i===-1&&o===-1)return{typeName:s,typeArgs:[]};if(i===-1||o===-1)throw new Error(`Unclosed generic in name '${s}'`);let c=s.slice(0,i),A=is(s.slice(i+1,s.length-o-1),[a,r]);return{typeName:c,typeArgs:A}}function Da(s){return!s||typeof s!="object"||Array.isArray(s)?!1:"GasCoin"in s||"Input"in s||"Result"in s||"NestedResult"in s}function v(s,a){return Da(a)?a:s.object(a)}function Se(s,a,r){if(Da(a))return v(s,a);function i(d){let{typeName:l,typeArgs:p}=te(d);switch(l){case"bool":return Ae.Bool;case"u8":return Ae.U8;case"u16":return Ae.U16;case"u32":return Ae.U32;case"u64":return Ae.U64;case"u128":return Ae.U128;case"u256":return Ae.U256;case"address":return Ae.Address;case"0x1::string::String":case"0x1::ascii::String":return Ae.String;case"0x2::object::ID":return Ae.Address;case"0x1::option::Option":return Ae.option(i(p[0]));case"vector":return Ae.vector(i(p[0]));default:throw new Error(`invalid primitive type ${d}`)}}function o(d){for(let l of d){if(typeof l>"u"||l===null)return!0;if(Array.isArray(l))return o(l)}return!1}function c(d){for(let l of d){if(!Array.isArray(l)){if(l===null)continue;switch(typeof l){case"string":case"number":case"bigint":case"boolean":continue;default:return!1}}return c(l)}return!0}function A(d){for(let l of d){if(!Array.isArray(l))switch(typeof l){case"string":case"number":case"bigint":case"boolean":return!0;default:continue}return A(l)}return!1}let{typeName:m,typeArgs:u}=te(r);switch(m){case"0x1::option::Option":if(a===null)return s.pure.option("bool",null);if(c([a]))return s.pure(i(r).serialize(a));if(A([a]))throw new Error("mixing primitive and TransactionArgument values is not supported");return s.moveCall({target:"0x1::option::some",typeArguments:[u[0]],arguments:[Se(s,a,u[0])]});case"vector":if(!Array.isArray(a))throw new Error("expected an array for vector type");if(a.length===0)return s.pure(Ae.vector(Ae.Bool).serialize([]));if(o(a))throw new Error("the provided array contains undefined or null values");if(c(a))return s.pure(i(r).serialize(a));if(A(a))throw new Error("mixing primitive and TransactionArgument values is not supported");return s.makeMoveVec({type:u[0],elements:a});default:return s.pure(i(r).serialize(a))}}function ss(s){let a=s.split("0x").join("");for(let r=0;r<a.length;r++)if(a[r]!=="0")return`0x${a.substring(r)}`;return"0x0"}function w(s){let{typeName:a,typeArgs:r}=te(s);switch(a){case"bool":case"u8":case"u16":case"u32":case"u64":case"u128":case"u256":case"address":case"signer":return a;case"vector":return`vector<${w(r[0])}>`;default:{let i=a.split("::");i[0]=ss(i[0]);let o=i.join("::");return r.length>0?`${o}<${r.map(c=>w(c)).join(",")}>`:o}}}function U(s,...a){return a.length>0?`${s}<${a.join(", ")}>`:s}var z=Ii(()=>{"use strict"});var ze=dr((_m,Wa)=>{"use strict";z();var Ir=class s{static $PACKAGE_ID="";static $PUBLISHED_AT="";static $PKG_V=[];get PACKAGE_ID(){return w(s.$PACKAGE_ID)}get PUBLISHED_AT(){return w(s.$PUBLISHED_AT)}get PKG_V1(){return w(s.$PKG_V[1])}setPackageId(a){s.$PACKAGE_ID=a}setPublishedAt(a){s.$PUBLISHED_AT=a}setPkgV(a,r){s.$PKG_V[a]=r}setAddress(a,r){s.$PACKAGE_ID=a,s.$PUBLISHED_AT=a,s.$PKG_V[1]=r||a}},os=new Ir;Wa.exports=os});var xr=dr((Lm,Za)=>{"use strict";z();var Fr=class s{static $PACKAGE_ID="";static $PUBLISHED_AT="";static $PKG_V=[];get PACKAGE_ID(){return w(s.$PACKAGE_ID)}get PUBLISHED_AT(){return w(s.$PUBLISHED_AT)}get PKG_V1(){return w(s.$PKG_V[1])}setPackageId(a){s.$PACKAGE_ID=a}setPublishedAt(a){s.$PUBLISHED_AT=a}setPkgV(a,r){s.$PKG_V[a]=r}setAddress(a,r){s.$PACKAGE_ID=a,s.$PUBLISHED_AT=a,s.$PKG_V[1]=r||a}},cs=new Fr;Za.exports=cs});var Dr=dr((Qm,$a)=>{"use strict";z();var Or=class s{static $PACKAGE_ID="";static $PUBLISHED_AT="";static $PKG_V=[];get PACKAGE_ID(){return w(s.$PACKAGE_ID)}get PUBLISHED_AT(){return w(s.$PUBLISHED_AT)}get PKG_V1(){return w(s.$PKG_V[1])}setPackageId(a){s.$PACKAGE_ID=a}setPublishedAt(a){s.$PUBLISHED_AT=a}setPkgV(a,r){s.$PKG_V[a]=r}setAddress(a,r){s.$PACKAGE_ID=a,s.$PUBLISHED_AT=a,s.$PKG_V[1]=r||a}},As=new Or;$a.exports=As});var on={coreApiUrl:"https://core.api.allbridgecoreapi.net",coreApiQueryParams:{},coreApiHeaders:{},jupiterUrl:"https://lite-api.jup.ag/swap/v1",wormholeMessengerProgramId:"worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth",solanaLookUpTable:"2JcBAEVnAwVo4u8d61iqgHPrzZuugur7cVTjWubsVLHj",sorobanNetworkPassphrase:"Public Global Stellar Network ; September 2015",tronJsonRpc:"https://api.trongrid.io/jsonrpc",cctpParams:{cctpTransmitterProgramId:"CCTPmbSD7gX1bxKPAmg77w8oFzNFpaQiQUWD43TKaecd",cctpTokenMessengerMinter:"CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3",cctpDomains:{ETH:0,AVA:1,OPT:2,ARB:3,SOL:5,BAS:6,POL:7,SUI:8}},cachePoolInfoChainSec:20},Eo={solanaRpcUrl:"https://api.mainnet-beta.solana.com",tronRpcUrl:"https://api.trongrid.io"},Vo={SOL:"https://api.mainnet-beta.solana.com",TRX:"https://api.trongrid.io",SRB:"https://rpc.stellar.org:443",STLR:"https://horizon.stellar.org",SUI:"https://fullnode.mainnet.sui.io"};import{TronWeb as Ss}from"tronweb";import{Web3 as Ps}from"web3";var $=class extends Error{errorCode;constructor(a,r){super(r),this.errorCode=a}},y=class extends ${constructor(a){super("SdkError",a)}},$e=class extends ${constructor(a){super("InvalidAmountError",a)}},lt=class extends ${constructor(a){super("AmountNotEnoughError",a)}},Je=class extends ${constructor(a){super("InsufficientPoolLiquidityError",a)}},q=class extends ${constructor(a){super("JupiterError",a)}},Wt=class extends ${constructor(a){super("InvalidGasFeePaymentOptionError",a)}},cn=class extends ${constructor(a){super("InvalidMessengerOptionError",a)}},J=class extends ${constructor(a){super("MethodNotSupportedError",a)}},Nt=class extends ${constructor(a){super("VerifyTxError",a)}},pt=class extends ${constructor(a){super("InvalidTxError",a)}},An=class extends ${constructor(a){super("ExtraGasMaxLimitExceededError",a)}},mn=class extends ${constructor(a,r,i){super("ArgumentInvalidDecimalsError",`Argument '${a}' decimals '${r}' cannot be greater than '${i}'`)}},Gt=class extends ${constructor(a){super("TimeoutError",a)}},un=class extends ${constructor(a){super("NodeRpcUrlNotInitializedError",`For chain '${a}' Node RPC URL not initialized`)}},re=class extends ${constructor(a){super("CCTPDoesNotSupportedError",a)}},ae=class extends ${constructor(a){super("OFTDoesNotSupportedError",a)}},dn=class extends ${constructor(a){super("YieldDoesNotSupportedError",a)}},ln=class extends ${constructor(){super("TxTooLargeError","Transaction too large: try again later or switch to another messenger or pay relayer fee in native gas currency")}},ki=(h=>(h.SDK_ERROR="SdkError",h.INVALID_AMOUNT_ERROR="InvalidAmountError",h.AMOUNT_NOT_ENOUGH_ERROR="AmountNotEnoughError",h.INSUFFICIENT_POOL_LIQUIDITY_ERROR="InsufficientPoolLiquidityError",h.JUPITER_ERROR="JupiterError",h.INVALID_GAS_FEE_PAYMENT_OPTION_ERROR="InvalidGasFeePaymentOptionError",h.INVALID_MESSENGER_OPTION_ERROR="InvalidMessengerOptionError",h.METHOD_NOT_SUPPORTED_ERROR="MethodNotSupportedError",h.VERIFY_TX_ERROR="VerifyTxError",h.INVALID_TX_ERROR="InvalidTxError",h.EXTRA_GAS_MAX_LIMIT_EXCEEDED_ERROR="ExtraGasMaxLimitExceededError",h.ARGUMENT_INVALID_DECIMALS_ERROR="ArgumentInvalidDecimalsError",h.TIMEOUT_ERROR="TimeoutError",h.NODE_RPC_URL_NOT_INITIALIZED_ERROR="NodeRpcUrlNotInitializedError",h.CCTP_DOES_NOT_SUPPORTED_ERROR="CCTPDoesNotSupportedError",h.OFT_DOES_NOT_SUPPORTED_ERROR="OFTDoesNotSupportedError",h.YIELD_DOES_NOT_SUPPORTED_ERROR="YieldDoesNotSupportedError",h.TX_TOO_LARGE="TxTooLargeError",h))(ki||{});var he=(f=>(f.BSC="BSC",f.ETH="ETH",f.BAS="BAS",f.SOL="SOL",f.TRX="TRX",f.POL="POL",f.ARB="ARB",f.CEL="CEL",f.AVA="AVA",f.SRB="SRB",f.STLR="STLR",f.OPT="OPT",f.SUI="SUI",f.SNC="SNC",f.UNI="UNI",f))(he||{}),Z=(c=>(c.EVM="EVM",c.SOLANA="SOLANA",c.TRX="TRX",c.SRB="SRB",c.SUI="SUI",c))(Z||{});var Fi={EVM:18,SOLANA:9,TRX:6,SRB:7,SUI:9},xi={BSC:{chainSymbol:"BSC",chainId:"0x38",name:"BNB Chain",chainType:"EVM"},ETH:{chainSymbol:"ETH",chainId:"0x1",name:"Ethereum",chainType:"EVM"},BAS:{chainSymbol:"BAS",chainId:"0x2105",name:"Base",chainType:"EVM"},ARB:{chainSymbol:"ARB",chainId:"0xa4b1",name:"Arbitrum",chainType:"EVM"},AVA:{chainSymbol:"AVA",chainId:"0xa86a",name:"Avalanche",chainType:"EVM"},CEL:{chainSymbol:"CEL",chainId:"0xa4ec",name:"Celo",chainType:"EVM"},POL:{chainSymbol:"POL",chainId:"0x89",name:"Polygon",chainType:"EVM"},OPT:{chainSymbol:"OPT",chainId:"0xa",name:"OP Mainnet",chainType:"EVM"},SNC:{chainSymbol:"SNC",chainId:"0x92",name:"Sonic",chainType:"EVM"},UNI:{chainSymbol:"UNI",chainId:"0x82",name:"Unichain",chainType:"EVM"},SOL:{chainSymbol:"SOL",name:"Solana",chainType:"SOLANA"},TRX:{chainSymbol:"TRX",name:"Tron",chainType:"TRX"},SRB:{chainSymbol:"SRB",name:"Stellar",chainType:"SRB"},STLR:{chainSymbol:"STLR",name:"Stellar",chainType:"SRB"},SUI:{chainSymbol:"SUI",name:"Sui",chainType:"SUI"}},x=(()=>{let s={...xi};return{addChainsProperties(a){s={...s,...a}},getChainProperty(a){let r=s[a];if(!r)throw new y(`Cannot find chain properties for ${a}`);return r},getChainsProperties(){return s},getChainDecimalsByType(a){return Fi[a]}}})();var lr=(A=>(A.OK="OK",A.INVALID="INVALID",A.FORBIDDEN="FORBIDDEN",A.UNINITIALIZED="UNINITIALIZED",A.CONTRACT_ADDRESS="CONTRACT_ADDRESS",A.WRONG_ASSOCIATED_ACCOUNT_OWNER="WRONG_ASSOCIATED_ACCOUNT_OWNER",A))(lr||{});var Te=(c=>(c[c.ALLBRIDGE=1]="ALLBRIDGE",c[c.WORMHOLE=2]="WORMHOLE",c[c.CCTP=3]="CCTP",c[c.CCTP_V2=4]="CCTP_V2",c[c.OFT=5]="OFT",c))(Te||{});import{Big as Hr}from"big.js";async function H(s,a){return await s.getPoolInfoByKey({chainSymbol:a.chainSymbol,poolAddress:a.poolAddress})}function M(s){if(Hr(s).lte(0))throw new $e("Amount must be greater than zero")}function W(s,a,r){let i=Hr(a).toFixed(),[o,c]=i.split(".");if(c&&c.length>r)throw new mn(s,c.length,r)}async function pn(s,a,r){return await Promise.race([s,new Promise((i,o)=>{setTimeout(()=>o(new Gt(a)),r)})])}async function pr(s,a,r,i){if(r<1)throw new Error(`Bad argument: 'maxRetries' must be greater than 0, but ${r} was received.`);let o=0;for(;;)try{return await pn(s(),a,i)}catch{if(++o>=r)throw new Gt(a)}}async function Qr(s,a,r,i=1.5,o=!1){let c=[],A=0,m=await s();if(c.push(m),!a(m))return c;let u=new Date(Date.now()+r*1e3).valueOf(),d=1e3,l=d;for(;Date.now()<u;){let p=c[c.length-1];if(p===void 0||!a(p))break;A++,o&&console.info(`Waiting ${d}ms before trying again (bringing the total wait time to ${l}ms so far, of total ${r*1e3}ms)`),await new Promise(T=>setTimeout(T,d)),d=d*i,new Date(Date.now()+d).valueOf()>u&&(d=u-Date.now(),o&&console.info(`was gonna wait too long; new waitTime: ${d}ms`)),l=d+l;let g=await s(p);c.push(g),o&&a(g)&&console.info(`${A}. Called ${s.name}; ${c.length} prev attempts. Most recent: ${JSON.stringify(c[c.length-1],null,2)}`)}return c}import{Big as $i}from"big.js";var Mi={abi:[{inputs:[{internalType:"uint256",name:"_chainId",type:"uint256"},{internalType:"uint256",name:"_chainPrecision",type:"uint256"},{internalType:"contract Messenger",name:"_allbridgeMessenger",type:"address"},{internalType:"contract WormholeMessenger",name:"_wormholeMessenger",type:"address"},{internalType:"contract IGasOracle",name:"_gasOracle",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"gas",type:"uint256"}],name:"BridgingFeeFromTokens",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"bridgeTransactionCost",type:"uint256"},{indexed:!1,internalType:"uint256",name:"messageTransactionCost",type:"uint256"}],name:"ReceiveFee",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Received",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"address",name:"recipient",type:"address"},{indexed:!1,internalType:"bytes32",name:"sendToken",type:"bytes32"},{indexed:!1,internalType:"bytes32",name:"receiveToken",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"sendAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receiveAmount",type:"uint256"}],name:"Swapped",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bytes32",name:"recipient",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"nonce",type:"uint256"},{indexed:!1,internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"},{indexed:!1,internalType:"bytes32",name:"message",type:"bytes32"}],name:"TokensReceived",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bytes32",name:"recipient",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"destinationChainId",type:"uint256"},{indexed:!1,internalType:"bytes32",name:"receiveToken",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"nonce",type:"uint256"},{indexed:!1,internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"}],name:"TokensSent",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[{internalType:"uint256",name:"_chainId",type:"uint256"},{internalType:"bytes32",name:"tokenAddress",type:"bytes32"}],name:"addBridgeToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract Pool",name:"pool",type:"address"},{internalType:"bytes32",name:"token",type:"bytes32"}],name:"addPool",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"canSwap",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"chainId",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"gasUsage",outputs:[{internalType:"uint256",name:"amount",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"},{internalType:"address",name:"tokenAddress",type:"address"}],name:"getBridgingCostInTokens",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"enum MessengerProtocol",name:"protocol",type:"uint8"}],name:"getMessageCost",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"enum MessengerProtocol",name:"protocol",type:"uint8"}],name:"getMessageGasUsage",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"getTransactionCost",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"message",type:"bytes32"},{internalType:"enum MessengerProtocol",name:"protocol",type:"uint8"}],name:"hasReceivedMessage",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"message",type:"bytes32"}],name:"hasSentMessage",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"sourceChainId",type:"uint256"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"bytes32",name:"receiveToken",type:"bytes32"},{internalType:"uint256",name:"nonce",type:"uint256"},{internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"}],name:"hashMessage",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"bytes32",name:"tokenAddress",type:"bytes32"}],name:"otherBridgeTokens",outputs:[{internalType:"bool",name:"isSupported",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"otherBridges",outputs:[{internalType:"bytes32",name:"bridgeAddress",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"tokenId",type:"bytes32"}],name:"pools",outputs:[{internalType:"contract Pool",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"messageHash",type:"bytes32"}],name:"processedMessages",outputs:[{internalType:"uint256",name:"isProcessed",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"sourceChainId",type:"uint256"},{internalType:"bytes32",name:"receiveToken",type:"bytes32"},{internalType:"uint256",name:"nonce",type:"uint256"},{internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"},{internalType:"uint256",name:"receiveAmountMin",type:"uint256"}],name:"receiveTokens",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"uint256",name:"_chainId",type:"uint256"},{internalType:"bytes32",name:"bridgeAddress",type:"bytes32"}],name:"registerBridge",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_chainId",type:"uint256"},{internalType:"bytes32",name:"tokenAddress",type:"bytes32"}],name:"removeBridgeToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"messageHash",type:"bytes32"}],name:"sentMessages",outputs:[{internalType:"uint256",name:"isSent",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract Messenger",name:"_allbridgeMessenger",type:"address"}],name:"setAllbridgeMessenger",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract IGasOracle",name:"_gasOracle",type:"address"}],name:"setGasOracle",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"uint256",name:"gasAmount",type:"uint256"}],name:"setGasUsage",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_rebalancer",type:"address"}],name:"setRebalancer",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_stopAuthority",type:"address"}],name:"setStopAuthority",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract WormholeMessenger",name:"_wormholeMessenger",type:"address"}],name:"setWormholeMessenger",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"startSwap",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"stopSwap",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"token",type:"bytes32"},{internalType:"bytes32",name:"receiveToken",type:"bytes32"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"receiveAmountMin",type:"uint256"}],name:"swap",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"token",type:"bytes32"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"bytes32",name:"receiveToken",type:"bytes32"},{internalType:"uint256",name:"nonce",type:"uint256"},{internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"},{internalType:"uint256",name:"feeTokenAmount",type:"uint256"}],name:"swapAndBridge",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract IERC20",name:"token",type:"address"}],name:"withdrawBridgingFeeInTokens",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"}],name:"withdrawGasTokens",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},zr=Mi;var Oi={abi:[{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint256",name:"chainPrecision_",type:"uint256"},{internalType:"address",name:"tokenAddress",type:"address"},{internalType:"address",name:"cctpMessenger_",type:"address"},{internalType:"address",name:"cctpTransmitter_",type:"address"},{internalType:"contract IGasOracle",name:"gasOracle_",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"recipient",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"ReceivedExtraGas",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"ReceivedGas",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"uint256",name:"nonce",type:"uint256"},{indexed:!1,internalType:"bytes32",name:"newRecipient",type:"bytes32"}],name:"RecipientReplaced",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"bytes32",name:"recipientWalletAddress",type:"bytes32"}],name:"TokensSentExtras",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"bytes32",name:"recipient",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"destinationChainId",type:"uint256"},{indexed:!1,internalType:"uint256",name:"nonce",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeFromGas",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeFromTokens",type:"uint256"},{indexed:!1,internalType:"uint256",name:"relayerFee",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeTokenAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"adminFeeTokenAmount",type:"uint256"}],name:"TokensSent",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[],name:"adminFeeShareBP",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"uint256",name:"relayerFeeTokenAmount",type:"uint256"}],name:"bridge",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"bytes32",name:"recipientWalletAddress",type:"bytes32"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"uint256",name:"relayerFeeTokenAmount",type:"uint256"}],name:"bridgeWithWalletAddress",outputs:[],stateMutability:"payable",type:"function"},{inputs:[],name:"chainId",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes",name:"originalMessage",type:"bytes"},{internalType:"bytes",name:"originalAttestation",type:"bytes"},{internalType:"bytes32",name:"newRecipient",type:"bytes32"}],name:"changeRecipient",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"gasUsage",outputs:[{internalType:"uint256",name:"amount",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"destinationChainId",type:"uint256"}],name:"getBridgingCostInTokens",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"}],name:"getDomainByChainId",outputs:[{internalType:"uint32",name:"",type:"uint32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"getTransactionCost",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"sourceChainId",type:"uint256"},{internalType:"uint64",name:"nonce",type:"uint64"}],name:"isMessageProcessed",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"bytes",name:"message",type:"bytes"},{internalType:"bytes",name:"signature",type:"bytes"}],name:"receiveTokens",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint32",name:"domain",type:"uint32"}],name:"registerBridgeDestination",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"adminFeeShareBP_",type:"uint256"}],name:"setAdminFeeShare",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract IGasOracle",name:"gasOracle_",type:"address"}],name:"setGasOracle",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"uint256",name:"gasAmount",type:"uint256"}],name:"setGasUsage",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"}],name:"unregisterBridgeDestination",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"withdrawFeeInTokens",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"}],name:"withdrawGas",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},qr=Oi;var Di={abi:[{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint256",name:"chainPrecision_",type:"uint256"},{internalType:"contract IGasOracle",name:"gasOracle_",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[{internalType:"uint16",name:"optionType",type:"uint16"}],name:"InvalidOptionType",type:"error"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"bytes32",name:"recipient",type:"bytes32"},{indexed:!1,internalType:"address",name:"tokenAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"destinationChainId",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeFromGas",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeFromTokens",type:"uint256"},{indexed:!1,internalType:"uint256",name:"relayerFeeWithExtraGas",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeTokenAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"adminFeeTokenAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"extraGasDestinationToken",type:"uint256"}],name:"OftTokensSent",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"ReceivedGas",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[{internalType:"address",name:"oft_",type:"address"}],name:"addToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress",type:"address"}],name:"adminFeeShareBP",outputs:[{internalType:"uint256",name:"feeShare",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"uint256",name:"relayerFeeTokenAmount",type:"uint256"},{internalType:"uint256",name:"extraGasInDestinationToken",type:"uint256"},{internalType:"uint256",name:"slippageBP",type:"uint256"}],name:"bridge",outputs:[],stateMutability:"payable",type:"function"},{inputs:[],name:"chainId",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress_",type:"address"},{internalType:"uint256",name:"destinationChainId_",type:"uint256"},{internalType:"uint128",name:"extraGasAmount_",type:"uint128"}],name:"extraGasPrice",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"}],name:"getEidByChainId",outputs:[{internalType:"uint32",name:"",type:"uint32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress",type:"address"}],name:"oftAddress",outputs:[{internalType:"address",name:"oftAddress",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint32",name:"eid_",type:"uint32"},{internalType:"uint128",name:"lzGasLimit_",type:"uint128"}],name:"registerBridgeDestination",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress_",type:"address"},{internalType:"uint256",name:"destinationChainId_",type:"uint256"}],name:"relayerFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"oft_",type:"address"}],name:"removeToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress_",type:"address"},{internalType:"uint256",name:"adminFeeShareBP_",type:"uint256"}],name:"setAdminFeeShare",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint128",name:"lzGasLimit_",type:"uint128"}],name:"setLzGasLimit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint256",name:"maxExtraGas_",type:"uint256"}],name:"setMaxExtraGas",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"}],name:"unregisterBridgeDestination",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract IERC20",name:"token_",type:"address"}],name:"withdrawFeeInTokens",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount_",type:"uint256"}],name:"withdrawGas",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},ea=Di;import*as yn from"@project-serum/anchor";import{PublicKey as ba}from"@solana/web3.js";import*as ee from"@project-serum/anchor";import{PublicKey as ie}from"@solana/web3.js";async function Ie(s,a){return ee.utils.token.associatedAddress({mint:a,owner:s})}async function Ke(s){let[a]=await ie.findProgramAddress([ee.utils.bytes.utf8.encode("config")],s);return a}async function ta(s,a){let[r]=await ie.findProgramAddress([ee.utils.bytes.utf8.encode("lock"),Uint8Array.from(s)],a);return r}async function Ut(s,a){let[r]=await ie.findProgramAddress([ee.utils.bytes.utf8.encode("price_v2"),Uint8Array.from([s])],a);return r}async function gt(s){let a=await Ke(s),[r]=await ie.findProgramAddress([a.toBuffer()],s);return r}async function na(s,a){let[r]=await ie.findProgramAddress([s.toBuffer()],a);return r}async function ft(s,a){let[r]=await ie.findProgramAddress([ee.utils.bytes.utf8.encode("token"),s.toBytes()],a);return r}async function ra(s,a,r){let[i]=await ie.findProgramAddress([ee.utils.bytes.utf8.encode("other_bridge_token"),Buffer.from([s]),a],r);return i}async function gr(s,a){let[r]=await ie.findProgramAddress([ee.utils.bytes.utf8.encode("chain_bridge"),Uint8Array.from([s])],a);return r}async function fr(s,a){let[r]=await ie.findProgramAddress([ee.utils.bytes.utf8.encode("gas_usage"),Uint8Array.from([s])],a);return r}async function aa(s,a){let[r]=await ie.findProgramAddress([ee.utils.bytes.utf8.encode("sent_message"),s],a);return r}async function yr(s,a,r){let[i]=await ie.findProgramAddress([ee.utils.bytes.utf8.encode("user_deposit"),a.toBytes(),s.toBytes()],r);return i}async function ia(s,a){let[r]=await ie.findProgramAddress([ee.utils.bytes.utf8.encode("cctp_bridge"),s.toBytes()],a);return r}async function sa(s,a){let[r]=await ie.findProgramAddress([ee.utils.bytes.utf8.encode("token"),s.toBytes()],a);return r}function oa(s,a){let[r]=ie.findProgramAddressSync([ee.utils.bytes.utf8.encode("lock"),a.toBuffer()],s);return r}function ca(s,a,r,i){let o=at("message_transmitter",r),c=at("token_messenger",i),A=at("__event_authority",i),m=at("token_minter",i),u=at("local_token",i,[a]),d=at("remote_token_messenger",i,[s.toString()]),l=at("sender_authority",i);return{messageTransmitterAccount:o,tokenMessenger:c,tokenMessengerEventAuthority:A,tokenMinter:m,localToken:u,remoteTokenMessengerKey:d,authorityPda:l}}function at(s,a,r=[]){let i=[Buffer.from(ee.utils.bytes.utf8.encode(s))];for(let c of r)typeof c=="string"?i.push(Buffer.from(ee.utils.bytes.utf8.encode(c))):Array.isArray(c)||Buffer.isBuffer(c)?i.push(Buffer.from(Uint8Array.from(c))):i.push(Buffer.from(Uint8Array.from(c.toBuffer())));return ie.findProgramAddressSync(i,a)[0]}import{AnchorProvider as Wi}from"@project-serum/anchor";import{Connection as Ni,PublicKey as Gi}from"@solana/web3.js";function He(s,a){let r=new Ni(s,"confirmed"),i=new Gi(a);return new Wi(r,{publicKey:i},{preflightCommitment:"confirmed",commitment:"confirmed"})}import{PublicKey as Ui}from"@solana/web3.js";import{Address as Ei}from"@stellar/stellar-sdk";import{Big as le}from"big.js";import ya from"randombytes";import{utils as ga}from"tronweb";import{Big as b}from"big.js";import hr from"bn.js";function Tr(s,a){return b(100).minus(b(100).times(a).div(s)).toNumber()}function it(s,a){return be(s,a,3).round(0,b.roundDown)}function de(s,a){return be(s,3,a)}function be(s,a,r){let i=b(r).minus(a).toNumber();return b(s).times(Et(i))}function Et(s){return b(10).pow(s)}function I(s,a){return b(s).times(Et(a))}function R(s,a){let r=b(s);return r.eq(0)?b(0):b(r).div(Et(a))}function se(s){return R(b(s.tokenBalance).minus(s.vUsdBalance).toFixed(),3).div(2).toFixed()}function Ge(s,{feeShare:a,decimals:r},i){let o=b(s);if(o.lte(0))return"0";let c=o.times(a),A=o.minus(c),m=it(A,r),u=b(i.tokenBalance).plus(m),d=Ue(u,i.aValue,i.dValue);return b(i.vUsdBalance).minus(d).round(0,b.roundDown).toFixed()}function Vt(s,{feeShare:a,decimals:r},i){let o=b(s);if(o.lte(0))return b(0).toFixed();let c=o.plus(i.vUsdBalance),A=Ue(c,i.aValue,i.dValue),m=de(b(i.tokenBalance).minus(A),r),u=b(m).times(a);return b(m).minus(u).round(0,b.roundDown).toFixed()}function Aa(s,a){let r=b(s);if(r.lte(0))return a;let i=r.plus(a.vUsdBalance),o=Ue(i,a.aValue,a.dValue);return{aValue:a.aValue,dValue:a.dValue,tokenBalance:o.toFixed(0),vUsdBalance:i.toFixed(0)}}function ma(s,{feeShare:a,decimals:r},i){if(b(s).lte(0))return b(0);let o=b(i.vUsdBalance).minus(s);if(o.lte(0))throw new Je;let c=Ue(o,i.aValue,i.dValue),A=b(c).minus(i.tokenBalance),m=de(A,r),u=b(a).div(b(1).minus(a)),d=b(m).times(u).round(0,b.roundUp);return b(m).plus(d).round(0,b.roundDown)}function ua(s,{feeShare:a,decimals:r},i){if(b(s).lte(0))return b(0);let o=b(a).div(b(1).minus(a)),c=b(s).times(o).round(0,b.roundUp),A=b(s).plus(c),m=it(A,r),u=b(i.tokenBalance).minus(m);if(u.lte(0))throw new Je;let d=Ue(u,i.aValue,i.dValue);return b(d).minus(i.vUsdBalance).round(0,b.roundDown)}function Ue(s,a,r){let i=b(4).times(a).times(b(r).minus(s)).minus(r),o=b(r).pow(3),c=i.pow(2),A=b(s).times(b(s).times(c).plus(b(4).times(a).times(o))).sqrt().round(0,b.roundDown),m=b(8).times(a).times(s),u=i.times(s).plus(A).div(m).round(0,b.roundDown);return u.eq(0)?b(0):u.plus(1)}function da(s,a,r,i){let o=new hr(s),c=new hr(r),A=new hr(a);return o.mul(c).shrn(i).sub(A).toString()}function la(s){return b(s).gt(0)?`${Number(b(s).times(100).toFixed(2)).toLocaleString()}%`:"N/A"}function pa(s,a,r){let i=b(a).times(r),o=b(a).plus(r),c=b(8).times(s).times(i).times(o),A=i.times(b(16).times(s).minus(4)).div(3),m=c.times(c),u=A.times(A).times(A),d=m.plus(u),l=b(d).sqrt(),p=b(Math.cbrt(+c.plus(l).toFixed())),g=b(Math.cbrt(+c.minus(l).toFixed()));return p.plus(g).toFixed()}function Ye(s,a,r){let i;switch(a){case"EVM":{i=fa(s);break}case"SOLANA":{i=new Ui(s).toBuffer();break}case"TRX":{i=Vi(s);break}case"SRB":{i=new Ei(s).toBuffer();break}case"SUI":{i=fa(s);break}}switch(r){case"EVM":return"0x"+i.toString("hex");case"SOLANA":return Array.from(i);case"TRX":return i;case"SRB":return i.toJSON().data;case"SUI":return"0x"+i.toString("hex")}}function ve(s){return s.replace(/^0x/i,"")}function ha(s){return Buffer.from(s.replace(/^0x/i,""),"hex")}function fa(s){let r=ha(s);return Buffer.concat([Buffer.alloc(32-r.length,0),r],32)}function Vi(s){let a=jt(s),r=ha(a);return ji(r,32)}function jt(s){let a=ga.crypto.decodeBase58Address(s);return a?ga.bytes.byteArray2hexStr(a).replace(/^41/,"0x"):""}function ji(s,a){if(s.length>=a)return s;let r=Buffer.alloc(a,0);return s.copy(r,a-s.length),r}function gn(){return ya(32)}function Ee(){let s=ya(32).readBigInt64BE();return s<0?s*-1n:s}function Ve(s,a){let r={},i=a.sourceToken;if(r.amount=I(a.amount,i.decimals).toFixed(),r.contractAddress=i.bridgeAddress,r.fromAccountAddress=a.fromAccountAddress,s==="SUI"){if(!i.originTokenAddress)throw new y("SUI sourceToken must contain 'originTokenAddress'");r.fromTokenAddress=i.originTokenAddress}else r.fromTokenAddress=Ye(i.tokenAddress,s,s);if(r.toAccountAddress=a.toAccountAddress,s==="SUI"){if(!a.destinationToken.originTokenAddress)throw new y("SUI destinationToken must contain 'originTokenAddress'");r.toTokenAddress=a.destinationToken.originTokenAddress}else r.toTokenAddress=Ye(a.destinationToken.tokenAddress,s,s);return r.minimumReceiveAmount=a.minimumReceiveAmount?I(a.minimumReceiveAmount,a.destinationToken.decimals).toFixed():"0",r}async function ke(s,a,r){let i={};i.fromChainId=a.sourceToken.allbridgeChainId,i.fromChainSymbol=a.sourceToken.chainSymbol;let o=x.getChainProperty(a.destinationToken.chainSymbol).chainType;if(s==="SUI"){if(!a.sourceToken.originTokenAddress)throw new y("SUI token must contain 'originTokenAddress'");i.fromTokenAddress=a.sourceToken.originTokenAddress}else i.fromTokenAddress=a.sourceToken.tokenAddress;i.toChainId=a.destinationToken.allbridgeChainId,i.toTokenAddress=a.destinationToken.tokenAddress,a.gasFeePaymentMethod==="stablecoin"?i.gasFeePaymentMethod="stablecoin":i.gasFeePaymentMethod="native";let c=a.sourceToken;switch(a.messenger){case 3:if(!c.cctpAddress||!a.destinationToken.cctpAddress)throw new re("Such route does not support CCTP protocol");i.contractAddress=c.cctpAddress;break;case 4:if(!c.cctpV2Address||!a.destinationToken.cctpV2Address)throw new re("Such route does not support CCTP V2 protocol");i.contractAddress=c.cctpV2Address;break;case 5:if(!c.oftBridgeAddress||!a.destinationToken.oftBridgeAddress||c.oftId!==a.destinationToken.oftId)throw new ae("Such route does not support OFT protocol");i.contractAddress=c.oftBridgeAddress;break;case 1:case 2:i.contractAddress=c.bridgeAddress;break}i.messenger=a.messenger,i.fromAccountAddress=a.fromAccountAddress,i.amount=I(a.amount,c.decimals).toFixed();let{fee:A,feeFormat:m}=a;if(!A){let p=(await br(a.sourceToken,i.toChainId,i.messenger,r))[i.gasFeePaymentMethod];if(!p)throw new Wt;A=p.int,m="int"}if(m=="float")switch(i.gasFeePaymentMethod){case"native":i.fee=I(A,x.getChainDecimalsByType(c.chainType)).toFixed(0);break;case"stablecoin":i.fee=I(A,c.decimals).toFixed(0);break}else i.fee=A;let{extraGas:u,extraGasFormat:d}=a;if(u&&+u>0){let l=await Sr(c,a.destinationToken,i.messenger,r),p,g;switch(i.gasFeePaymentMethod){case"native":p=x.getChainDecimalsByType(c.chainType),g=le(l.exchangeRate);break;case"stablecoin":p=c.decimals,g=le(l.exchangeRate).div(l.sourceNativeTokenPrice);break}switch(d??"int"){case"float":{i.extraGas=I(u,p).toFixed(0);let T=g.mul(u);i.extraGasDest=I(T,x.getChainDecimalsByType(a.destinationToken.chainType)).toFixed(0,le.roundDown);break}case"int":{i.extraGas=u;let T=R(i.extraGas,x.getChainDecimalsByType(c.chainType)),C=g.mul(T);i.extraGasDest=I(C,x.getChainDecimalsByType(a.destinationToken.chainType)).toFixed(0,le.roundDown);break}}_i(i.extraGas,i.gasFeePaymentMethod,l)}return s!=="SUI"&&(i.fromTokenAddress=Ye(i.fromTokenAddress,s,s)),i.toAccountAddress=Ye(a.toAccountAddress,o,s),i.toTokenAddress=Ye(i.toTokenAddress,o,s),i.gasFeePaymentMethod=="stablecoin"&&Zi(i.amount,c.decimals,i.fee,i.extraGas),i}function Zi(s,a,r,i){let o=le(s).minus(r).minus(i??0);if(o.lte(0))throw new lt(`Amount not enough to pay fee, ${R(le(o).minus(1).neg(),a).toFixed()} stables is missing`)}async function br(s,a,r,i){let o=await i.getReceiveTransactionCost({sourceChainId:s.allbridgeChainId,destinationChainId:a,messenger:r,sourceToken:s.tokenAddress}),c={native:{int:o.fee,float:R(o.fee,x.getChainDecimalsByType(s.chainType)).toFixed()},adminFeeShareWithExtras:o.adminFeeShareWithExtras};if(o.sourceNativeTokenPrice){let A=be(new le(o.fee).mul(o.sourceNativeTokenPrice),x.getChainDecimalsByType(s.chainType),s.decimals).toFixed(0,le.roundUp);c.stablecoin={int:A,float:R(A,s.decimals).toFixed()}}return c}function _i(s,a,r){let i=r.extraGasMax[a];if(!i)throw new Wt(`Impossible to pay extra gas by '${a}' payment method`);let o=i.int;if(le(s).gt(o))throw new An(`Extra gas ${s} in int format, exceeded limit ${o} for '${a}' payment method`)}async function Sr(s,a,r,i){let o={},c=await i.getReceiveTransactionCost({sourceChainId:s.allbridgeChainId,destinationChainId:a.allbridgeChainId,messenger:r,sourceToken:s.tokenAddress}),A=a.txCostAmount.maxAmount,m=R(A,x.getChainDecimalsByType(a.chainType)).toFixed(),u=le(m).div(c.exchangeRate).toFixed(x.getChainDecimalsByType(s.chainType),le.roundDown),d=I(u,x.getChainDecimalsByType(s.chainType)).toFixed(0);if(o.native={int:d,float:u},c.sourceNativeTokenPrice){let l=le(u).mul(c.sourceNativeTokenPrice).toFixed(s.decimals,le.roundDown);o.stablecoin={int:I(l,s.decimals).toFixed(0),float:l}}return{extraGasMax:o,destinationChain:{gasAmountMax:{int:A,float:m},swap:{int:a.txCostAmount.swap,float:R(a.txCostAmount.swap,x.getChainDecimalsByType(a.chainType)).toFixed()},transfer:{int:a.txCostAmount.transfer,float:R(a.txCostAmount.transfer,x.getChainDecimalsByType(a.chainType)).toFixed()}},exchangeRate:c.exchangeRate,sourceNativeTokenPrice:c.sourceNativeTokenPrice}}function Ta(s){return s.sourceToken.chainSymbol!==s.destinationToken.chainSymbol}async function hn(s,a,r,i){let o,c=new ba(a),A=new ba(r),m=await Ie(c,A),u=He(i,a);yn.setProvider(u);let d=await yn.Spl.token(u).account.token.fetchNullable(m);if(d?.authority.equals(c))o=Ye(m.toBase58(),"SOLANA",s);else{let l=await u.connection.getTokenAccountsByOwner(c,{mint:A});if(l.value.length===0&&!d)o=Ye(m.toBase58(),"SOLANA",s);else if(l.value.length>0){let p=l.value[0];if(!p?.pubkey)throw new y("First token account or its public key is undefined");o=Ye(p.pubkey.toBase58(),"SOLANA",s)}else throw new y("Associated account has wrong owner")}return o}var pe=class{};var Zt=class extends pe{constructor(r,i,o){super();this.web3=r;this.api=i;this.nodeRpcUrlsConfig=o}chainType="EVM";async send(r){let i=await this.buildRawTransactionSend(r);return this.sendRawTransaction(i)}async buildRawTransactionSwap(r){let i=Ve(this.chainType,r);return await this.buildRawTransactionSwapFromParams(i)}async buildRawTransactionSwapFromParams(r){let{amount:i,contractAddress:o,fromAccountAddress:c,fromTokenAddress:A,toAccountAddress:m,toTokenAddress:u,minimumReceiveAmount:d}=r,p=this.getBridgeContract(o).methods.swap(i,A,u,m,d);return Promise.resolve({from:c,to:o,data:p.encodeABI()})}async buildRawTransactionSend(r){let i=await ke(this.chainType,r,this.api),{amount:o,contractAddress:c,fromAccountAddress:A,fromTokenAddress:m,toChainId:u,toAccountAddress:d,toTokenAddress:l,messenger:p,fee:g,gasFeePaymentMethod:T,extraGas:C,extraGasDest:f}=i,B="0x"+gn().toString("hex"),P,h,S=g;switch(C&&(S=$i(S).plus(C).toFixed()),p){case 3:case 4:{let F=await this.buildRawTransactionCctpSend(r,i,S);P=F.sendMethod,h=F.value;break}case 5:{let F=this.buildRawTransactionOftSend(r,i,S,f);P=F.sendMethod,h=F.value;break}case 1:case 2:{let F=this.getBridgeContract(c);T==="stablecoin"?(P=F.methods.swapAndBridge(m,o,d,u,l,B,p,S),h="0"):(P=F.methods.swapAndBridge(m,o,d,u,l,B,p,0),h=S)}break}return Promise.resolve({from:A,to:c,value:h,data:P.encodeABI()})}async buildRawTransactionCctpSend(r,i,o){let{amount:c,contractAddress:A,toChainId:m,toAccountAddress:u,gasFeePaymentMethod:d}=i,l=this.getCctpBridgeContract(A),p,g;if(r.destinationToken.chainType==="SOLANA"){let T=await hn(this.chainType,r.toAccountAddress,r.destinationToken.tokenAddress,this.nodeRpcUrlsConfig.getNodeRpcUrl("SOL"));d==="stablecoin"?(p=l.methods.bridgeWithWalletAddress(c,T,u,m,o),g="0"):(p=l.methods.bridgeWithWalletAddress(c,T,u,m,0),g=o)}else d==="stablecoin"?(p=l.methods.bridge(c,u,m,o),g="0"):(p=l.methods.bridge(c,u,m,0),g=o);return{sendMethod:p,value:g}}buildRawTransactionOftSend(r,i,o,c){let{amount:A,contractAddress:m,toChainId:u,toAccountAddress:d,gasFeePaymentMethod:l}=i,p=this.getOftBridgeContract(m),g,T;return l==="stablecoin"?(g=p.methods.bridge(r.sourceToken.tokenAddress,A,d,u,o,c??"0","10"),T="0"):(g=p.methods.bridge(r.sourceToken.tokenAddress,A,d,u,0,c??"0","10"),T=o),{sendMethod:g,value:T}}async sendRawTransaction(r){let i=await this.web3.eth.estimateGas(r),o={maxPriorityFeePerGas:null,maxFeePerGas:null},{transactionHash:c}=await this.web3.eth.sendTransaction({...r,gas:i,...o});return{txId:c.toString()}}getBridgeContract(r){return new this.web3.eth.Contract(zr.abi,r)}getCctpBridgeContract(r){return new this.web3.eth.Contract(qr.abi,r)}getOftBridgeContract(r){return new this.web3.eth.Contract(ea.abi,r)}};var Tn=class{constructor(a,r,i,o){this.api=a;this.nodeRpcUrlsConfig=r;this.params=i;this.tokenService=o}async approve(a,r){let i,o;r?(i=a,o=r):o=a;let c=_t(o.token,o.messenger);return this.tokenService.buildRawTransactionApprove({...o,spender:c},i)}async send(a,r){return M(a.amount),W("amount",a.amount,a.sourceToken.decimals),Ta(a)?bn(a.sourceToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,r).buildRawTransactionSend(a):bn(a.sourceToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,r).buildRawTransactionSwap(a)}};import{BN as Tt,Program as Cr,Spl as es,web3 as Qe}from"@project-serum/anchor";import{Keypair as Ma,PublicKey as _,SystemProgram as ts}from"@solana/web3.js";import{Big as Fe}from"big.js";var $t={version:"0.1.0",name:"bridge",instructions:[{name:"initialize",accounts:[{name:"admin",isMut:!0,isSigner:!0},{name:"config",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"InitializeArgs"}}]},{name:"initializePool",accounts:[{name:"payer",isMut:!0,isSigner:!0},{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"mint",isMut:!1,isSigner:!1},{name:"token",isMut:!0,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1},{name:"rent",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"InitializePoolArgs"}}]},{name:"initDepositAccount",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[]},{name:"deposit",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"amount",type:"u64"}]},{name:"withdraw",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"amountLp",type:"u64"}]},{name:"swapAndBridge",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"lock",isMut:!0,isSigner:!1},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1},{name:"otherBridgeToken",isMut:!0,isSigner:!1},{name:"messenger",isMut:!1,isSigner:!1},{name:"messengerConfig",isMut:!0,isSigner:!1},{name:"sentMessageAccount",isMut:!0,isSigner:!1},{name:"messengerGasUsage",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"gasPrice",isMut:!1,isSigner:!1},{name:"thisGasPrice",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"BridgeArgs"}}]},{name:"swapAndBridgeWormhole",accounts:[{name:"user",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"lock",isMut:!0,isSigner:!1},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1},{name:"otherBridgeToken",isMut:!0,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"gasPrice",isMut:!1,isSigner:!1},{name:"thisGasPrice",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"wormholeMessenger",isMut:!1,isSigner:!1},{name:"wormholeMessengerConfig",isMut:!0,isSigner:!1},{name:"wormholeProgram",isMut:!1,isSigner:!1},{name:"bridge",isMut:!0,isSigner:!1},{name:"message",isMut:!0,isSigner:!0},{name:"sequence",isMut:!0,isSigner:!1},{name:"feeCollector",isMut:!0,isSigner:!1},{name:"messengerGasUsage",isMut:!1,isSigner:!1},{name:"clock",isMut:!1,isSigner:!1},{name:"rent",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"BridgeArgs"}}]},{name:"swap",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"sendMint",isMut:!1,isSigner:!1},{name:"receiveMint",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1},{name:"sendPool",isMut:!0,isSigner:!1},{name:"receivePool",isMut:!0,isSigner:!1},{name:"sendBridgeToken",isMut:!0,isSigner:!1},{name:"receiveBridgeToken",isMut:!0,isSigner:!1},{name:"sendUserToken",isMut:!0,isSigner:!1},{name:"receiveUserToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1}],args:[{name:"amount",type:"u64"},{name:"receiveAmountMin",type:"u64"}]},{name:"registerChainBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"RegisterChainBridgeArgs"}}]},{name:"updateChainBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!0,isSigner:!1}],args:[{name:"args",type:{defined:"UpdateChainBridgeArgs"}}]},{name:"receiveAndSwap",accounts:[{name:"user",isMut:!0,isSigner:!1},{name:"payer",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"receivedMessageAccount",isMut:!1,isSigner:!1},{name:"unlock",isMut:!0,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1},{name:"messengerProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"UnlockArgs"}}]},{name:"receiveAndSwapWormhole",accounts:[{name:"user",isMut:!0,isSigner:!1},{name:"payer",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"receivedMessageAccount",isMut:!1,isSigner:!1},{name:"unlock",isMut:!0,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1},{name:"messengerProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"UnlockArgs"}}]},{name:"withdrawGasToken",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"recipient",isMut:!0,isSigner:!1},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"amount",type:"u64"}]},{name:"claimRewards",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[]},{name:"setAdmin",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"newAdmin",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1}],args:[]},{name:"startBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"actionType",type:{defined:"ActionType"}}]},{name:"stopBridge",accounts:[{name:"stopAuthority",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"actionType",type:{defined:"ActionType"}}]},{name:"setRebalancer",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1},{name:"rebalancer",isMut:!1,isSigner:!1}],args:[]},{name:"setStopAuthority",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"newAuthority",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1}],args:[]},{name:"setAllbridgeMessengerProgramId",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]},{name:"setWormholeMessengerProgramId",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]},{name:"setGasOracleProgramId",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]},{name:"setPoolFeeShare",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1}],args:[{name:"feeShareBp",type:"u64"}]},{name:"setBalanceRatioMin",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1}],args:[{name:"balanceRatioMinBp",type:"u16"}]},{name:"setPoolAdminFeeShare",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1}],args:[{name:"feeShareBp",type:"u64"}]},{name:"addOtherBridgeToken",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"otherBridgeToken",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"chainId",type:"u8"},{name:"tokenAddress",type:{array:["u8",32]}}]},{name:"removeOtherBridgeToken",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"config",isMut:!0,isSigner:!1},{name:"otherBridgeToken",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"chainId",type:"u8"},{name:"tokenAddress",type:{array:["u8",32]}}]},{name:"withdrawAdminFee",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"adminToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[]},{name:"adjustTotalLpAmount",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1}],args:[]}],accounts:[{name:"chainBridge",type:{kind:"struct",fields:[{name:"address",type:{array:["u8",32]}},{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"}]}},{name:"config",type:{kind:"struct",fields:[{name:"admin",type:"publicKey"},{name:"allbridgeMessengerProgramId",type:"publicKey"},{name:"wormholeMessengerProgramId",type:"publicKey"},{name:"gasOracleProgramId",type:"publicKey"},{name:"rebalancer",type:"publicKey"},{name:"stopAuthority",type:"publicKey"},{name:"authorityBumpSeed",type:"u8"},{name:"canSwap",type:"bool"},{name:"canDeposit",type:"bool"},{name:"canWithdraw",type:"bool"}]}},{name:"lock",type:{kind:"struct",fields:[{name:"sender",type:"publicKey"},{name:"sentTokenAddress",type:"publicKey"},{name:"amount",type:"u64"},{name:"vusdAmount",type:"u64"},{name:"recipient",type:{array:["u8",32]}},{name:"destinationChainId",type:"u8"},{name:"receiveToken",type:{array:["u8",32]}},{name:"nonce",type:{array:["u8",32]}},{name:"messenger",type:{defined:"Messenger"}},{name:"slot",type:"u64"},{name:"fee",type:"u64"}]}},{name:"otherBridgeToken",type:{kind:"struct",fields:[]}},{name:"pool",type:{kind:"struct",fields:[{name:"mint",type:"publicKey"},{name:"a",type:"u64"},{name:"d",type:"u64"},{name:"tokenBalance",type:"u64"},{name:"vUsdBalance",type:"u64"},{name:"reserves",type:"u64"},{name:"decimals",type:"u8"},{name:"totalLpAmount",type:"u64"},{name:"feeShareBp",type:"u64"},{name:"adminFeeShareBp",type:"u64"},{name:"accRewardPerShareP",type:"u128"},{name:"adminFeeAmount",type:"u64"},{name:"balanceRatioMinBp",type:"u16"}]}},{name:"unlock",type:{kind:"struct",fields:[{name:"hash",type:{array:["u8",32]}},{name:"amount",type:"u64"},{name:"fee",type:"u64"},{name:"vUsdAmount",type:"u64"},{name:"slot",type:"u64"}]}},{name:"userDeposit",type:{kind:"struct",fields:[{name:"userAddress",type:"publicKey"},{name:"mint",type:"publicKey"},{name:"lpAmount",type:"u64"},{name:"rewardDebt",type:"u64"}]}}],types:[{name:"RegisterChainBridgeArgs",type:{kind:"struct",fields:[{name:"chainBridgeAddress",type:{array:["u8",32]}},{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"}]}},{name:"UpdateChainBridgeArgs",type:{kind:"struct",fields:[{name:"chainBridgeAddress",type:{array:["u8",32]}},{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"}]}},{name:"InitializeArgs",type:{kind:"struct",fields:[{name:"allbridgeMessengerProgramId",type:"publicKey"},{name:"wormholeMessengerProgramId",type:"publicKey"},{name:"gasOracleProgramId",type:"publicKey"}]}},{name:"InitializePoolArgs",type:{kind:"struct",fields:[{name:"a",type:"u64"},{name:"feeShareBp",type:"u64"},{name:"adminFeeShareBp",type:"u64"},{name:"balanceRatioMinBp",type:"u16"}]}},{name:"BridgeArgs",type:{kind:"struct",fields:[{name:"nonce",type:{array:["u8",32]}},{name:"recipient",type:{array:["u8",32]}},{name:"destinationChainId",type:"u8"},{name:"receiveToken",type:{array:["u8",32]}},{name:"vusdAmount",type:"u64"}]}},{name:"UnlockArgs",type:{kind:"struct",fields:[{name:"nonce",type:{array:["u8",32]}},{name:"amount",type:"u64"},{name:"recipient",type:"publicKey"},{name:"sourceChainId",type:"u8"},{name:"receiveToken",type:"publicKey"},{name:"messenger",type:{defined:"Messenger"}},{name:"hash",type:{array:["u8",32]}},{name:"receiveAmountMin",type:"u64"}]}},{name:"RewardError",type:{kind:"enum",variants:[{name:"FeeTooHigh"}]}},{name:"Messenger",type:{kind:"enum",variants:[{name:"None"},{name:"Allbridge"},{name:"Wormhole"}]}},{name:"ActionType",type:{kind:"enum",variants:[{name:"Deposit"},{name:"Withdraw"},{name:"Swap"}]}}],errors:[{code:6e3,name:"AccountAlreadyInitialized",msg:"This account has already been initialized"},{code:6001,name:"AdminAuthorityInvalid",msg:"This instruction requires admin authority"},{code:6002,name:"InvalidSignature",msg:"Provided signature has wrong signer or message"},{code:6003,name:"InvalidHash",msg:"Wrong unlock message hash"},{code:6004,name:"PoolOverflow",msg:"PoolInfo overflow"},{code:6005,name:"ReservesExhausted",msg:"Reserves exhausted"},{code:6006,name:"ZeroAmount",msg:"Zero amount"},{code:6007,name:"ZeroChanges",msg:"Zero changes"},{code:6008,name:"HighVusdAmount",msg:"vUSD amount is too high"},{code:6009,name:"BalanceRatioExceeded",msg:"Balance ratio exceeded"},{code:6010,name:"InsufficientReceivedAmount",msg:"Received insufficient amount"},{code:6011,name:"ForbiddenAction",msg:"ForbiddenAction"},{code:6012,name:"ValueTooHigh",msg:"Value is too high"}]};var Sa={version:"0.1.0",name:"cctp_bridge",instructions:[{name:"initialize",accounts:[{name:"payer",isMut:!0,isSigner:!0},{name:"admin",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"rent",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"InitializeArgs"}}]},{name:"bridge",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"messageSentEventData",isMut:!0,isSigner:!0},{name:"lock",isMut:!0,isSigner:!1},{name:"mint",isMut:!0,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1},{name:"cctpMessenger",isMut:!1,isSigner:!1},{name:"messageTransmitterProgram",isMut:!1,isSigner:!1},{name:"messageTransmitterAccount",isMut:!0,isSigner:!1},{name:"tokenMessenger",isMut:!1,isSigner:!1},{name:"tokenMinter",isMut:!1,isSigner:!1},{name:"localToken",isMut:!0,isSigner:!1},{name:"remoteTokenMessengerKey",isMut:!1,isSigner:!1},{name:"authorityPda",isMut:!1,isSigner:!1},{name:"eventAuthority",isMut:!1,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"gasPrice",isMut:!1,isSigner:!1},{name:"thisGasPrice",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"BridgeArgs"}}]},{name:"registerChainBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"cctpBridge",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"RegisterChainBridgeArgs"}}]},{name:"updateChainBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"cctpBridge",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!0,isSigner:!1}],args:[{name:"args",type:{defined:"UpdateChainBridgeArgs"}}]},{name:"setAdminFeeShare",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1}],args:[{name:"feeShareBp",type:"u64"}]},{name:"setGasOracleProgramId",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]},{name:"withdrawGasToken",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"recipient",isMut:!0,isSigner:!1},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1}],args:[{name:"amount",type:"u64"}]},{name:"withdrawAdminFee",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!1,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"adminToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[]},{name:"setCctpTokenMessengerMinter",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]}],accounts:[{name:"cctpBridge",type:{kind:"struct",fields:[{name:"mint",type:"publicKey"},{name:"admin",type:"publicKey"},{name:"cctpTokenMessengerMinter",type:"publicKey"},{name:"gasOracleProgramId",type:"publicKey"},{name:"authorityBumpSeed",type:"u8"},{name:"adminFeeShareBp",type:"u64"},{name:"adminFeeAmount",type:"u64"}]}},{name:"chainBridge",type:{kind:"struct",fields:[{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"},{name:"domain",type:"u32"}]}},{name:"lock",type:{kind:"struct",fields:[{name:"sender",type:"publicKey"},{name:"amount",type:"u64"},{name:"adminFee",type:"u64"},{name:"relayerFee",type:"u64"},{name:"recipient",type:{array:["u8",32]}},{name:"destinationChainId",type:"u8"},{name:"slot",type:"u64"}]}}],types:[{name:"RegisterChainBridgeArgs",type:{kind:"struct",fields:[{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"},{name:"domain",type:"u32"},{name:"mint",type:"publicKey"}]}},{name:"UpdateChainBridgeArgs",type:{kind:"struct",fields:[{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"},{name:"domain",type:"u32"},{name:"mint",type:"publicKey"}]}},{name:"BridgeArgs",type:{kind:"struct",fields:[{name:"recipient",type:{array:["u8",32]}},{name:"destinationChainId",type:"u8"},{name:"receiveToken",type:{array:["u8",32]}},{name:"amount",type:"u64"}]}},{name:"InitializeArgs",type:{kind:"struct",fields:[{name:"gasOracleProgramId",type:"publicKey"},{name:"cctpTokenMessengerMinter",type:"publicKey"}]}}],errors:[{code:6e3,name:"ValueTooHigh",msg:"Value is too high"}]};import{Spl as Ji}from"@project-serum/anchor";import Yi from"big.js";import{Web3 as Sn}from"web3";async function yt(s,a){return await Ji.token(a).account.token.fetch(s)}async function Pa(s,a,r){let i=await a.account.pool.fetch(r),o=i.decimals,c=Yi(i.feeShareBp.toString()).div(1e4).toFixed(),A={aValue:i.a.toString(),dValue:i.d.toString(),totalLpAmount:i.totalLpAmount.toString(),tokenBalance:i.tokenBalance.toString(),vUsdBalance:i.vUsdBalance.toString(),accRewardPerShareP:i.accRewardPerShareP.toString()};return Ge(s,{decimals:o,feeShare:c},A)}function wa(s){let a=s.amount,r="0x"+s.recipient.toString("hex"),i=s.sourceChainId,o=s.destinationChainId,c="0x"+s.receiveToken.toString("hex"),A="0x"+s.nonce.toString("hex"),m=1,u="0x"+s.chainBridge.toString("hex"),d=Sn.utils.encodePacked({t:"uint256",v:a},{t:"bytes32",v:r},{t:"uint256",v:i},{t:"bytes32",v:c},{t:"uint256",v:A},{t:"uint8",v:m});if(!d)throw new y("message cannot be undefined");let l=Sn.utils.keccak256(Buffer.from(d.replace("0x",""),"hex")),p=Buffer.from(l.replace("0x",""),"hex");p[0]=i,p[1]=o;let g=Sn.utils.encodePacked({t:"bytes32",v:"0x"+p.toString("hex")},{t:"bytes32",v:u});if(!g)throw new pt("messageWithSigner cannot be undefined");let T=Sn.utils.keccak256(Buffer.from(g.replace("0x",""),"hex")),C=Buffer.from(T.replace("0x",""),"hex");return C[0]=p[0],C[1]=p[1],C}import{ComputeBudgetInstruction as Ba,ComputeBudgetProgram as Pn,Connection as Ra,TransactionMessage as Li}from"@solana/web3.js";import{Big as Xi}from"big.js";import{AddressLookupTableAccount as Ca}from"@solana/web3.js";async function ot(s,a){return await Promise.all(s.message.addressTableLookups.map(async r=>new Ca({key:r.accountKey,state:Ca.deserialize(await a.getAccountInfo(r.accountKey).then(i=>{if(!i)throw new y("Cannot get AccountInfo");return i.data}))})))}var Pr="AUTO";async function ht(s,a,r){let i=new Ra(r,"confirmed"),o=(await i.simulateTransaction(s)).value.unitsConsumed;await va(s.instructions,o,a,i)}async function Ia(s,a,r){let i=new Ra(r,"confirmed"),o=await ot(s,i),c=Li.decompile(s.message,{addressLookupTableAccounts:o});if(s.serialize().length>1232)throw new ln;await va(c.instructions,769230,a,i),s.message=c.compileToV0Message(o)}async function va(s,a,r,i){if(a>0){let o=Ki(a,s);if(r?.solana){let c=r.solana;if(c===Pr)await wr(s,i);else if("pricePerUnitInMicroLamports"in c)await wr(s,i,c.pricePerUnitInMicroLamports);else{let A=Xi(c.extraFeeInLamports).div(o).mul(Et(6)).toFixed(0);await wr(s,i,A)}}}}function Ki(s,a){let r=a.findIndex(c=>c.programId.equals(Pn.programId)&&Ba.decodeInstructionType(c)==="SetComputeUnitLimit"),i=Number((s*1.3).toFixed(0)),o=Pn.setComputeUnitLimit({units:i});return r>=0?a[r]=o:a.push(o),i.toString()}async function wr(s,a,r){let i=s.findIndex(A=>A.programId.equals(Pn.programId)&&Ba.decodeInstructionType(A)==="SetComputeUnitPrice"),o=BigInt(r||await Hi(a)),c=Pn.setComputeUnitPrice({microLamports:o});return i>=0?s[i]=c:s.push(c),o.toString()}async function Hi(s){let a=await s.getRecentPrioritizationFees(),r=0;for(let i of a)r+=i.prioritizationFee;return(r/a.length).toFixed(0)}import{NATIVE_MINT as Qi}from"@solana/spl-token";import{Connection as zi,TransactionMessage as ka,VersionedTransaction as qi}from"@solana/web3.js";import Fa,{AxiosError as xa}from"axios";var wn=class{connection;jupiterUrl;apiKeyHeader;maxAccounts;constructor(a,r){this.connection=new zi(a),this.jupiterUrl=r.jupiterUrl.replace(/\/$/,""),this.apiKeyHeader=r.jupiterApiKeyHeader,this.maxAccounts=r.jupiterMaxAccounts}async getJupiterSwapTx(a,r,i,o){let c;try{let p=o?"ExactOut":"ExactIn",g=`${this.jupiterUrl}/quote?inputMint=${r}&outputMint=${Qi.toString()}&amount=${i}&swapMode=${p}&slippageBps=100&onlyDirectRoutes=true`;this.maxAccounts&&(g+=`&maxAccounts=${this.maxAccounts}`),c=await Fa.get(g,{headers:this.apiKeyHeader?{"x-api-key":this.apiKeyHeader}:void 0})}catch(p){throw p instanceof xa&&p.response&&p.response.data&&p.response.data.error?new q(p.response.data.error):new q("Cannot get route")}let A;if(o&&c?.data?.inAmount)A=c.data.inAmount;else if(o)throw new q("Cannot get inAmount");let m;try{m=await Fa.post(`${this.jupiterUrl}/swap`,{quoteResponse:c.data,userPublicKey:a,wrapAndUnwrapSol:!0},{headers:this.apiKeyHeader?{"x-api-key":this.apiKeyHeader}:void 0})}catch(p){throw p instanceof xa&&p.response&&p.response.data&&p.response.data.error?new q(p.response.data.error):new q("Cannot get swap transaction")}let u;if(m?.data?.swapTransaction)u=m.data.swapTransaction;else throw new q("Cannot get swap transaction");let d=Buffer.from(u,"base64"),l=qi.deserialize(d);return o?{tx:l,amountIn:A}:{tx:l}}async amendJupiterWithSdkTx(a,r){try{let i=await ot(a,this.connection),o=await ot(r,this.connection),c=ka.decompile(a.message,{addressLookupTableAccounts:i}),A=ka.decompile(r.message,{addressLookupTableAccounts:o});if(A.instructions.shift(),c.instructions.push(...A.instructions),i.push(...o),a.message=c.compileToV0Message(i),r.message.header.numRequiredSignatures===2&&a.signatures.length===1){let m=r.signatures[0];if(!m)throw new y("Signature is undefined");a.signatures.push(m)}return a}catch(i){throw i instanceof Error&&i.message?new q(`Some error occurred during creation final swap and bridge transaction. ${i.message}`):new q("Some error occurred during creation final swap and bridge transaction")}}};var Br=1e6,Oa=1.1,Cn=class extends pe{constructor(r,i,o){super();this.solanaRpcUrl=r;this.params=i;this.api=o;this.jupiterService=new wn(r,i.jupiterParams)}chainType="SOLANA";jupiterService;async buildRawTransactionSwap(r){let i=Ve(this.chainType,r);return await this.buildSwapTransaction(i,r.sourceToken.poolAddress,r.destinationToken.poolAddress,r.txFeeParams)}async buildSwapTransaction(r,i,o,c){let{fromAccountAddress:A,amount:m,contractAddress:u,fromTokenAddress:d,toTokenAddress:l,toAccountAddress:p,minimumReceiveAmount:g}=r,T=A,C=u,f=d,B=l,P=o,h=p,S=new _(T),F=He(this.solanaRpcUrl,S.toString()),j=new Cr($t,C,F),G=await gt(j.programId),me=await Ke(j.programId),K=new _(f),Oe=await ft(K,j.programId),De=new _(i),_e=await Ie(S,K),we=new _(h),ce=new _(B),ye=await ft(ce,j.programId),Ce=new _(P),ue=await Ie(we,ce),We=[Qe.ComputeBudgetProgram.setComputeUnitLimit({units:Br})];try{await yt(ue,F)}catch{let Si=await es.associatedToken(F).methods.create().accounts({mint:ce,owner:we,associatedAccount:ue}).instruction();We.push(Si)}let Ne=await j.methods.swap(new Tt(m),new Tt(g||0)).accounts({payer:S,config:me,bridgeAuthority:G,user:S,sendBridgeToken:Oe,sendMint:K,sendPool:De,sendUserToken:_e,receiveBridgeToken:ye,receiveMint:ce,receivePool:Ce,receiveUserToken:ue}).preInstructions(We).transaction(),Be=F.connection;return Ne.recentBlockhash=(await Be.getLatestBlockhash()).blockhash,Ne.feePayer=S,await ht(Ne,c,this.solanaRpcUrl),await this.convertToVersionedTransaction(Ne,Be)}async buildRawTransactionSend(r){let i=await ke(this.chainType,r,this.api),o=this.addPoolAddress(r,i),c=o.gasFeePaymentMethod=="stablecoin",A;if(c)try{let{tx:d,solTxSendUpdatedParams:l}=await this.processJup(o,r,!0);A=d,o={...o,...l}}catch{try{let{tx:l,solTxSendUpdatedParams:p}=await this.processJup(o,r,!1);A=l,o={...o,...p}}catch(l){throw l instanceof $?l:l instanceof Error&&l.message?new q(`Some error occurred during creation Jupiter swap transaction. ${l.message}`):new q("Some error occurred during creation Jupiter swap transaction")}}let m,u;switch(i.messenger){case 1:{let d=await this.prepareSwapAndBridgeData(o);m=await this.buildSwapAndBridgeAllbridgeTransaction(d);break}case 2:{let d=await this.prepareSwapAndBridgeData(o),{transaction:l,messageAccount:p}=await this.buildSwapAndBridgeWormholeTransaction(d);m=l,u=p;break}case 3:case 4:{let d=await this.prepareSwapAndBridgeCctpData(o),{transaction:l,messageSentEventDataKeypair:p}=await this.buildSwapAndBridgeCctpTransaction(r.destinationToken.chainSymbol,d);m=l,u=p;break}case 5:throw new ae("Messenger OFT is not supported yet.")}if(c){if(!A)throw new q("Swap tx is absent");m=await this.jupiterService.amendJupiterWithSdkTx(A,m)}return await Ia(m,r.txFeeParams,this.solanaRpcUrl),u&&m.sign([u]),m}async processJup(r,i,o){let{fee:c,extraGas:A,gasFeePaymentMethod:m}=await this.convertStableCoinFeeAndExtraGasToNativeCurrency(i.sourceToken,r),u=o?Fe(c):Fe(r.fee);A&&(u=u.plus(A)),o||(u=u.mul(Oa));let{tx:d,amountIn:l}=await this.jupiterService.getJupiterSwapTx(i.fromAccountAddress,i.sourceToken.tokenAddress,u.toFixed(0),o),p;if(o){if(!l)throw new q("Cannot get inAmount");p=Fe(r.amount).minus(Fe(l).mul(Oa)).toFixed(0)}else p=Fe(r.amount).minus(u).toFixed(0);if(Fe(p).lte(0))throw new lt(`Amount not enough to pay fee, ${R(Fe(p).minus(1).neg(),i.sourceToken.decimals).toFixed()} stables is missing`);return{tx:d,solTxSendUpdatedParams:{amount:p,fee:c,extraGas:A,gasFeePaymentMethod:m}}}addPoolAddress(r,i){return{...i,poolAddress:r.sourceToken.poolAddress}}async convertStableCoinFeeAndExtraGasToNativeCurrency(r,i){if(i.gasFeePaymentMethod=="stablecoin"){let o=(await this.api.getReceiveTransactionCost({sourceChainId:i.fromChainId,destinationChainId:i.toChainId,messenger:i.messenger,sourceToken:r.tokenAddress})).sourceNativeTokenPrice,c=Fe(i.fee).div(o).mul(Fe(10).pow(x.getChainDecimalsByType("SOLANA")-r.decimals)).toFixed(0),A;return i.extraGas&&(A=Fe(i.extraGas).div(o).mul(Fe(10).pow(x.getChainDecimalsByType("SOLANA")-r.decimals)).toFixed(0)),{fee:c,extraGas:A,gasFeePaymentMethod:"native"}}return{fee:i.fee,extraGas:i.extraGas,gasFeePaymentMethod:"native"}}getExtraGasInstruction(r,i,o){return Qe.SystemProgram.transfer({fromPubkey:i,toPubkey:o,lamports:+r})}async prepareSwapAndBridgeData(r){let{amount:i,contractAddress:o,fromChainId:c,fromAccountAddress:A,fromTokenAddress:m,toChainId:u,toAccountAddress:d,toTokenAddress:l,poolAddress:p,extraGas:g}=r,T=m,C=A,f=u,B=l,P=d,h=o,S=c,F=He(this.solanaRpcUrl,C),j=new Cr($t,h,F),G=Array.from(gn()),me=new _(p),K=await Pa(i,j,me),Oe=await ta(G,j.programId),De=await gt(j.programId),_e=await Ie(new _(C),new _(T)),we=await ft(new _(T),j.programId),ce=await gr(f,j.programId),ye=await ra(f,Buffer.from(B),j.programId),Ce=await Ke(j.programId),ue=await j.account.config.fetch(Ce),We=await Ut(f,ue.gasOracleProgramId),Ne=await Ut(S,ue.gasOracleProgramId),Be=wa({amount:K,recipient:Buffer.from(P),nonce:Buffer.from(G),receiveToken:Buffer.from(B),destinationChainId:f,sourceChainId:S,chainBridge:(await gt(j.programId)).toBuffer()}),E={};return E.bridge=j,E.amount=new Tt(i),E.vusdAmount=new Tt(K),E.nonce=G,E.recipient=Array.from(P),E.receiveToken=Array.from(B),E.poolAccount=me,E.lockAccount=Oe,E.bridgeAuthority=De,E.userToken=_e,E.bridgeTokenAccount=we,E.chainBridgeAccount=ce,E.otherBridgeTokenAccount=ye,E.userAccount=new _(C),E.destinationChainId=f,E.mint=new _(T),E.config=Ce,E.configAccountInfo=ue,E.gasPrice=We,E.thisGasPrice=Ne,E.message=Be,g&&(E.extraGasInstruction=this.getExtraGasInstruction(g,E.userAccount,Ce)),E}async buildSwapAndBridgeAllbridgeTransaction(r){let{bridge:i,vusdAmount:o,nonce:c,recipient:A,receiveToken:m,poolAccount:u,lockAccount:d,bridgeAuthority:l,userToken:p,bridgeTokenAccount:g,chainBridgeAccount:T,otherBridgeTokenAccount:C,userAccount:f,destinationChainId:B,mint:P,config:h,configAccountInfo:S,gasPrice:F,thisGasPrice:j,message:G,extraGasInstruction:me}=r,K=S.allbridgeMessengerProgramId,Oe=await fr(B,K),De=await Ke(K),_e=await aa(G,K),we=[];me&&we.push(me);let ce=await i.methods.swapAndBridge({vusdAmount:o,nonce:c,destinationChainId:B,recipient:A,receiveToken:m}).accounts({mint:P,user:f,config:h,lock:d,pool:u,gasPrice:F,thisGasPrice:j,bridgeAuthority:l,userToken:p,bridgeToken:g,chainBridge:T,messenger:K,messengerGasUsage:Oe,messengerConfig:De,sentMessageAccount:_e,otherBridgeToken:C}).preInstructions([Qe.ComputeBudgetProgram.setComputeUnitLimit({units:Br})]).postInstructions(we).transaction(),ye=He(this.solanaRpcUrl,f.toString()).connection;return ce.recentBlockhash=(await ye.getLatestBlockhash()).blockhash,ce.feePayer=f,await this.convertToVersionedTransaction(ce,ye)}async convertToVersionedTransaction(r,i){let o=await i.getAddressLookupTable(new _(this.params.solanaLookUpTable)).then(A=>A.value);if(!o)throw new y("Cannot find allbridgeLookupTableAccount");let c=new Qe.TransactionMessage({payerKey:r.feePayer,recentBlockhash:r.recentBlockhash,instructions:r.instructions}).compileToV0Message([o]);return new Qe.VersionedTransaction(c)}async buildSwapAndBridgeWormholeTransaction(r){let{bridge:i,vusdAmount:o,nonce:c,recipient:A,receiveToken:m,poolAccount:u,lockAccount:d,bridgeAuthority:l,userToken:p,bridgeTokenAccount:g,chainBridgeAccount:T,otherBridgeTokenAccount:C,userAccount:f,destinationChainId:B,mint:P,config:h,configAccountInfo:S,gasPrice:F,thisGasPrice:j,message:G,extraGasInstruction:me}=r,K=this.params.wormholeMessengerProgramId,[Oe]=_.findProgramAddressSync([Buffer.from("Bridge")],new _(K)),[De]=_.findProgramAddressSync([Buffer.from("fee_collector")],new _(K)),[_e]=_.findProgramAddressSync([Buffer.from("Sequence"),l.toBuffer()],new _(K)),we=await fr(B,S.wormholeMessengerProgramId),ce=await Ke(S.wormholeMessengerProgramId),ye=Ma.generate(),Ce=He(this.solanaRpcUrl,f.toString()),ue=await Ce.connection.getAccountInfo(Oe);if(ue==null)throw new y("Cannot fetch wormhole bridge account info");let We=new Tt(ue.data.slice(16,24),"le").toString(),Ne=ts.transfer({fromPubkey:f,toPubkey:De,lamports:+We}),Be=[];me&&Be.push(me);let E={mint:P,user:f,config:h,lock:d,pool:u,gasPrice:F,thisGasPrice:j,bridgeAuthority:l,userToken:p,bridgeToken:g,chainBridge:T,otherBridgeToken:C,messengerGasUsage:we,wormholeProgram:K,bridge:Oe,message:ye.publicKey,wormholeMessenger:S.wormholeMessengerProgramId,sequence:_e,feeCollector:De,wormholeMessengerConfig:ce,clock:Qe.SYSVAR_CLOCK_PUBKEY},sn=await i.methods.swapAndBridgeWormhole({vusdAmount:o,nonce:c,destinationChainId:B,recipient:A,receiveToken:m}).accounts(E).preInstructions([Qe.ComputeBudgetProgram.setComputeUnitLimit({units:Br}),Ne]).postInstructions(Be).signers([ye]).transaction();return sn.recentBlockhash=(await Ce.connection.getLatestBlockhash()).blockhash,sn.feePayer=f,{transaction:await this.convertToVersionedTransaction(sn,Ce.connection),messageAccount:ye}}async prepareSwapAndBridgeCctpData(r){let{contractAddress:i,amount:o,fromAccountAddress:c,fromTokenAddress:A,toChainId:m,toAccountAddress:u,toTokenAddress:d,extraGas:l}=r,p=i;if(!p)throw new re("Such route does not support CCTP protocol");let g=4,T=c,C=d,f=u,B=He(this.solanaRpcUrl,T),P=new Cr(Sa,p,B),h=new _(A),S=await ia(h,P.programId),F=new _(T),j=await P.account.cctpBridge.fetch(S),G={};return G.cctpBridge=P,G.cctpBridgeAccount=S,G.cctpAddressAccount=new _(p),G.amount=new Tt(o),G.recipient=Array.from(f),G.receiveToken=Array.from(C),G.userToken=await Ie(F,h),G.bridgeAuthority=await na(S,P.programId),G.bridgeTokenAccount=await sa(h,P.programId),G.chainBridgeAccount=await gr(m,P.programId),G.userAccount=F,G.destinationChainId=m,G.mint=h,G.gasPrice=await Ut(m,j.gasOracleProgramId),G.thisGasPrice=await Ut(g,j.gasOracleProgramId),G.provider=B,l&&(G.extraGasInstruction=this.getExtraGasInstruction(l,G.userAccount,S)),G}async buildSwapAndBridgeCctpTransaction(r,i){let{cctpBridge:o,cctpBridgeAccount:c,amount:A,recipient:m,receiveToken:u,bridgeAuthority:d,userToken:l,bridgeTokenAccount:p,chainBridgeAccount:g,userAccount:T,destinationChainId:C,mint:f,gasPrice:B,thisGasPrice:P,extraGasInstruction:h,provider:S}=i,F=this.params.cctpParams.cctpDomains[r],j=this.params.cctpParams.cctpTransmitterProgramId,G=this.params.cctpParams.cctpTokenMessengerMinter;if(F==null||!j||!G)throw new y("CCTP is not configured");let me=new _(j),K=new _(G),{messageTransmitterAccount:Oe,tokenMessenger:De,tokenMessengerEventAuthority:_e,tokenMinter:we,localToken:ce,remoteTokenMessengerKey:ye,authorityPda:Ce}=ca(F,f,me,K),ue=[];h&&ue.push(h);let We=Ma.generate(),Ne=oa(o.programId,We.publicKey),Be=await o.methods.bridge({amount:A,destinationChainId:C,recipient:m,receiveToken:u}).accounts({mint:f,user:T,cctpBridge:c,messageSentEventData:We.publicKey,lock:Ne,cctpMessenger:K,messageTransmitterProgram:me,messageTransmitterAccount:Oe,tokenMessenger:De,tokenMinter:we,localToken:ce,remoteTokenMessengerKey:ye,authorityPda:Ce,eventAuthority:_e,bridgeToken:p,gasPrice:B,thisGasPrice:P,chainBridge:g,userToken:l,bridgeAuthority:d}).preInstructions([Qe.ComputeBudgetProgram.setComputeUnitLimit({units:2e6})]).postInstructions(ue).transaction(),E=S.connection;return Be.recentBlockhash=(await E.getLatestBlockhash()).blockhash,Be.feePayer=T,{transaction:await this.convertToVersionedTransaction(Be,E),messageSentEventDataKeypair:We}}send(r){throw new J}};import{Address as Rr,contract as _P}from"@stellar/stellar-sdk";import{Big as as}from"big.js";import{contract as n}from"@stellar/stellar-sdk";var ns=n.Spec,rs=n.Client;var Jt=class extends rs{constructor(r){super(new ns(["AAAAAAAAAAAAAAAKaW5pdGlhbGl6ZQAAAAAABAAAAAAAAAAFYWRtaW4AAAAAAAATAAAAAAAAAAltZXNzZW5nZXIAAAAAAAATAAAAAAAAAApnYXNfb3JhY2xlAAAAAAATAAAAAAAAAAxuYXRpdmVfdG9rZW4AAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAPc3dhcF9hbmRfYnJpZGdlAAAAAAkAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAFdG9rZW4AAAAAAAATAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAACXJlY2lwaWVudAAAAAAAA+4AAAAgAAAAAAAAABRkZXN0aW5hdGlvbl9jaGFpbl9pZAAAAAQAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAFbm9uY2UAAAAAAAAMAAAAAAAAAApnYXNfYW1vdW50AAAAAAAKAAAAAAAAABBmZWVfdG9rZW5fYW1vdW50AAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAOcmVjZWl2ZV90b2tlbnMAAAAAAAgAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAlyZWNpcGllbnQAAAAAAAATAAAAAAAAAA9zb3VyY2VfY2hhaW5faWQAAAAABAAAAAAAAAANcmVjZWl2ZV90b2tlbgAAAAAAA+4AAAAgAAAAAAAAAAVub25jZQAAAAAAAAwAAAAAAAAAEnJlY2VpdmVfYW1vdW50X21pbgAAAAAACgAAAAAAAAAJZXh0cmFfZ2FzAAAAAAAD6AAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAAEc3dhcAAAAAYAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAV0b2tlbgAAAAAAA+4AAAAgAAAAAAAAAA1yZWNlaXZlX3Rva2VuAAAAAAAD7gAAACAAAAAAAAAACXJlY2lwaWVudAAAAAAAABMAAAAAAAAAEnJlY2VpdmVfYW1vdW50X21pbgAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAJc3RvcF9zd2FwAAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAKc3RhcnRfc3dhcAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAOc2V0X2dhc19vcmFjbGUAAAAAAAEAAAAAAAAAC25ld19hZGRyZXNzAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAASc2V0X3N0b3BfYXV0aG9yaXR5AAAAAAABAAAAAAAAAA5zdG9wX2F1dGhvcml0eQAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAOc2V0X3JlYmFsYW5jZXIAAAAAAAEAAAAAAAAACnJlYmFsYW5jZXIAAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAANc2V0X21lc3NlbmdlcgAAAAAAAAEAAAAAAAAACW1lc3NlbmdlcgAAAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAANc2V0X2dhc191c2FnZQAAAAAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAAJZ2FzX3VzYWdlAAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAPcmVnaXN0ZXJfYnJpZGdlAAAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAAOYnJpZGdlX2FkZHJlc3MAAAAAA+4AAAAgAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAQYWRkX2JyaWRnZV90b2tlbgAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAANdG9rZW5fYWRkcmVzcwAAAAAAA+4AAAAgAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAATcmVtb3ZlX2JyaWRnZV90b2tlbgAAAAACAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAPuAAAAIAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAIYWRkX3Bvb2wAAAACAAAAAAAAAARwb29sAAAAEwAAAAAAAAAFdG9rZW4AAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAATd2l0aGRyYXdfZ2FzX3Rva2VucwAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABmFtb3VudAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAfd2l0aGRyYXdfYnJpZGdpbmdfZmVlX2luX3Rva2VucwAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAVaGFzX3Byb2Nlc3NlZF9tZXNzYWdlAAAAAAAAAQAAAAAAAAAHbWVzc2FnZQAAAAPuAAAAIAAAAAEAAAPpAAAAAQAAAAM=","AAAAAAAAAAAAAAAUaGFzX3JlY2VpdmVkX21lc3NhZ2UAAAABAAAAAAAAAAdtZXNzYWdlAAAAA+4AAAAgAAAAAQAAA+kAAAABAAAAAw==","AAAAAAAAAAAAAAAQZ2V0X3Bvb2xfYWRkcmVzcwAAAAEAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAPuAAAAIAAAAAEAAAPpAAAAEwAAAAM=","AAAAAAAAAAAAAAAKZ2V0X2NvbmZpZwAAAAAAAAAAAAEAAAPpAAAH0AAAAAZCcmlkZ2UAAAAAAAM=","AAAAAAAAAAAAAAASZ2V0X3N0b3BfYXV0aG9yaXR5AAAAAAAAAAAAAQAAA+kAAAATAAAAAw==","AAAAAAAAAAAAAAAUZ2V0X3RyYW5zYWN0aW9uX2Nvc3QAAAABAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAABAAAD6QAAAAoAAAAD","AAAAAAAAAAAAAAANZ2V0X2dhc191c2FnZQAAAAAAAAEAAAAAAAAACGNoYWluX2lkAAAABAAAAAEAAAPpAAAACgAAAAM=","AAAAAAAAAAAAAAAJZ2V0X2FkbWluAAAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=","AAAAAAAAAAAAAAAOZ2V0X2dhc19vcmFjbGUAAAAAAAAAAAABAAAD6QAAABMAAAAD","AAAAAAAAAAAAAAASZ2V0X2Fub3RoZXJfYnJpZGdlAAAAAAABAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAABAAAD6QAAB9AAAAANQW5vdGhlckJyaWRnZQAAAAAAAAM=","AAAAAAAAAAAAAAAJc2V0X2FkbWluAAAAAAAAAQAAAAAAAAAJbmV3X2FkbWluAAAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAHdXBncmFkZQAAAAABAAAAAAAAAA1uZXdfd2FzbV9oYXNoAAAAAAAD7gAAACAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAQAAAAAAAAAAAAAAB1N3YXBwZWQAAAAABgAAAAAAAAAOcmVjZWl2ZV9hbW91bnQAAAAAAAoAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAJcmVjaXBpZW50AAAAAAAAEwAAAAAAAAALc2VuZF9hbW91bnQAAAAACgAAAAAAAAAKc2VuZF90b2tlbgAAAAAD7gAAACAAAAAAAAAABnNlbmRlcgAAAAAAEw==","AAAAAQAAAAAAAAAAAAAAClRva2Vuc1NlbnQAAAAAAAUAAAAAAAAABmFtb3VudAAAAAAACgAAAAAAAAAUZGVzdGluYXRpb25fY2hhaW5faWQAAAAEAAAAAAAAAAVub25jZQAAAAAAAAwAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAJcmVjaXBpZW50AAAAAAAD7gAAACA=","AAAAAQAAAAAAAAAAAAAADlRva2Vuc1JlY2VpdmVkAAAAAAAEAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAB21lc3NhZ2UAAAAD7gAAACAAAAAAAAAABW5vbmNlAAAAAAAADAAAAAAAAAAJcmVjaXBpZW50AAAAAAAD7gAAACA=","AAAAAQAAAAAAAAAAAAAAClJlY2VpdmVGZWUAAAAAAAMAAAAAAAAAF2JyaWRnZV90cmFuc2FjdGlvbl9jb3N0AAAAAAoAAAAAAAAACWV4dHJhX2dhcwAAAAAAAAoAAAAAAAAAGG1lc3NhZ2VfdHJhbnNhY3Rpb25fY29zdAAAAAo=","AAAAAQAAAAAAAAAAAAAAFUJyaWRnaW5nRmVlRnJvbVRva2VucwAAAAAAAAIAAAAAAAAAEGZlZV90b2tlbl9hbW91bnQAAAAKAAAAAAAAAANnYXMAAAAACg==","AAAAAQAAAAAAAAAAAAAADUFub3RoZXJCcmlkZ2UAAAAAAAACAAAAAAAAAAdhZGRyZXNzAAAAA+4AAAAgAAAAAAAAAAZ0b2tlbnMAAAAAA+wAAAPuAAAAIAAAAAE=","AAAAAQAAAAAAAAAAAAAABkJyaWRnZQAAAAAABgAAAGBwcmVjb21wdXRlZCB2YWx1ZXMgb2YgdGhlIHNjYWxpbmcgZmFjdG9yIHJlcXVpcmVkIGZvciBwYXlpbmcgdGhlIGJyaWRnaW5nIGZlZSB3aXRoIHN0YWJsZSB0b2tlbnMAAAAeYnJpZGdpbmdfZmVlX2NvbnZlcnNpb25fZmFjdG9yAAAAAAPsAAAAEwAAAAoAAAAAAAAACGNhbl9zd2FwAAAAAQAAAGxwcmVjb21wdXRlZCB2YWx1ZXMgdG8gZGl2aWRlIGJ5IHRvIGNoYW5nZSB0aGUgcHJlY2lzaW9uIGZyb20gdGhlIEdhcyBPcmFjbGUgcHJlY2lzaW9uIHRvIHRoZSB0b2tlbiBwcmVjaXNpb24AAAAWZnJvbV9nYXNfb3JhY2xlX2ZhY3RvcgAAAAAD7AAAABMAAAAKAAAAAAAAAAltZXNzZW5nZXIAAAAAAAATAAAAAAAAAAVwb29scwAAAAAAA+wAAAPuAAAAIAAAABMAAAAAAAAACnJlYmFsYW5jZXIAAAAAABM=","AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAwAAAAEAAAAAAAAAC090aGVyQnJpZGdlAAAAAAEAAAAEAAAAAQAAAAAAAAALU2VudE1lc3NhZ2UAAAAAAQAAA+4AAAAgAAAAAQAAAAAAAAAPUmVjZWl2ZWRNZXNzYWdlAAAAAAEAAAPuAAAAIA==","AAAAAQAAAAAAAAAAAAAABUFkbWluAAAAAAAAAQAAAAAAAAABMAAAAAAAABM=","AAAAAQAAAAAAAAAAAAAAEEdhc09yYWNsZUFkZHJlc3MAAAABAAAAAAAAAAEwAAAAAAAAEw==","AAAAAQAAAAAAAAAAAAAACEdhc1VzYWdlAAAAAQAAAAAAAAABMAAAAAAAA+wAAAAEAAAACg==","AAAAAQAAAAAAAAAAAAAAC05hdGl2ZVRva2VuAAAAAAEAAAAAAAAAATAAAAAAAAAT","AAAAAQAAAAAAAAAAAAAADVN0b3BBdXRob3JpdHkAAAAAAAABAAAAAAAAAAEwAAAAAAAAEw==","AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAKAAAAAAAAAANVW5pbXBsZW1lbnRlZAAAAAAAAAAAAAAAAAAAC0luaXRpYWxpemVkAAAAAAEAAAAAAAAADVVuaW5pdGlhbGl6ZWQAAAAAAAACAAAAAAAAAAxVbmF1dGhvcml6ZWQAAAADAAAAAAAAAApJbnZhbGlkQXJnAAAAAAAEAAAAAAAAAA5JbnZhbGlkQ2hhaW5JZAAAAAAABQAAAAAAAAATSW52YWxpZE90aGVyQ2hhaW5JZAAAAAAGAAAAAAAAAA5HYXNVc2FnZU5vdFNldAAAAAAABwAAAAAAAAANQnJva2VuQWRkcmVzcwAAAAAAAAgAAAAAAAAACE5vdEZvdW5kAAAACQAAAAAAAAAYVG9rZW5JbnN1ZmZpY2llbnRCYWxhbmNlAAAACgAAAAAAAAAKQ2FzdEZhaWxlZAAAAAAACwAAAAAAAAAMVTI1Nk92ZXJmbG93AAAADAAAAAAAAAAKWmVyb0Ftb3VudAAAAAAAZwAAAAAAAAAMUG9vbE92ZXJmbG93AAAAaAAAAAAAAAALWmVyb0NoYW5nZXMAAAAAaQAAAAAAAAARUmVzZXJ2ZXNFeGhhdXN0ZWQAAAAAAABqAAAAAAAAABpJbnN1ZmZpY2llbnRSZWNlaXZlZEFtb3VudAAAAAAAawAAAAAAAAAUQmFsYW5jZVJhdGlvRXhjZWVkZWQAAABsAAAAAAAAAAlGb3JiaWRkZW4AAAAAAABtAAAAAAAAABlVbmF1dGhvcml6ZWRTdG9wQXV0aG9yaXR5AAAAAAAAywAAAAAAAAAOU3dhcFByb2hpYml0ZWQAAAAAAMwAAAAAAAAAEkFtb3VudFRvb0xvd0ZvckZlZQAAAAAAzQAAAAAAAAAWQnJpZGdlVG9UaGVaZXJvQWRkcmVzcwAAAAAAzgAAAAAAAAAORW1wdHlSZWNpcGllbnQAAAAAAM8AAAAAAAAAE1NvdXJjZU5vdFJlZ2lzdGVyZWQAAAAA0AAAAAAAAAAVV3JvbmdEZXN0aW5hdGlvbkNoYWluAAAAAAAA0QAAAAAAAAATVW5rbm93bkFub3RoZXJDaGFpbgAAAADSAAAAAAAAABFUb2tlbnNBbHJlYWR5U2VudAAAAAAAANMAAAAAAAAAEE1lc3NhZ2VQcm9jZXNzZWQAAADUAAAAAAAAAAxOb3RFbm91Z2hGZWUAAADWAAAAAAAAAAlOb01lc3NhZ2UAAAAAAADXAAAAAAAAAA1Ob1JlY2VpdmVQb29sAAAAAAAA2AAAAAAAAAAGTm9Qb29sAAAAAADZAAAAAAAAABNVbmtub3duQW5vdGhlclRva2VuAAAAANoAAAAAAAAAD1dyb25nQnl0ZUxlbmd0aAAAAAEsAAAAAAAAAApIYXNNZXNzYWdlAAAAAAEtAAAAAAAAABdJbnZhbGlkUHJpbWFyeVNpZ25hdHVyZQAAAAEuAAAAAAAAABlJbnZhbGlkU2Vjb25kYXJ5U2lnbmF0dXJlAAAAAAABLwAAAAAAAAARTm9HYXNEYXRhRm9yQ2hhaW4AAAAAAAGQ"]),r);this.options=r}fromJSON={initialize:this.txFromJSON,swap_and_bridge:this.txFromJSON,receive_tokens:this.txFromJSON,swap:this.txFromJSON,stop_swap:this.txFromJSON,start_swap:this.txFromJSON,set_gas_oracle:this.txFromJSON,set_stop_authority:this.txFromJSON,set_rebalancer:this.txFromJSON,set_messenger:this.txFromJSON,set_gas_usage:this.txFromJSON,register_bridge:this.txFromJSON,add_bridge_token:this.txFromJSON,remove_bridge_token:this.txFromJSON,add_pool:this.txFromJSON,withdraw_gas_tokens:this.txFromJSON,withdraw_bridging_fee_in_tokens:this.txFromJSON,has_processed_message:this.txFromJSON,has_received_message:this.txFromJSON,get_pool_address:this.txFromJSON,get_config:this.txFromJSON,get_stop_authority:this.txFromJSON,get_transaction_cost:this.txFromJSON,get_gas_usage:this.txFromJSON,get_admin:this.txFromJSON,get_gas_oracle:this.txFromJSON,get_another_bridge:this.txFromJSON,set_admin:this.txFromJSON,upgrade:this.txFromJSON}};var Bn=class extends pe{constructor(r,i,o){super();this.nodeRpcUrlsConfig=r;this.params=i;this.api=o}chainType="SRB";async buildRawTransactionSend(r){let i=await ke(this.chainType,r,this.api);return await this.buildRawTransactionSendFromParams(i)}async buildRawTransactionSendFromParams(r){let{amount:i,contractAddress:o,fromAccountAddress:c,fromTokenAddress:A,toChainId:m,toAccountAddress:u,toTokenAddress:d,fee:l,gasFeePaymentMethod:p,extraGas:g}=r,T=l;g&&(T=as(T).plus(g).toFixed());let C=this.getContract(Jt,o,c),f;return p==="stablecoin"?f=await C.swap_and_bridge({sender:c,token:Rr.contract(Buffer.from(A)).toString(),amount:BigInt(i),recipient:Buffer.from(u),destination_chain_id:+m,receive_token:Buffer.from(d),nonce:Ee(),gas_amount:BigInt(0),fee_token_amount:BigInt(T)}):f=await C.swap_and_bridge({sender:c,token:Rr.contract(Buffer.from(A)).toString(),amount:BigInt(i),recipient:Buffer.from(u),destination_chain_id:+m,receive_token:Buffer.from(d),nonce:Ee(),gas_amount:BigInt(T),fee_token_amount:BigInt(0)}),f.toXDR()}async buildRawTransactionSwap(r){let i=Ve(this.chainType,r);return await this.buildRawTransactionSwapFromParams(i)}async buildRawTransactionSwapFromParams(r){let{amount:i,contractAddress:o,fromAccountAddress:c,fromTokenAddress:A,toAccountAddress:m,toTokenAddress:u,minimumReceiveAmount:d}=r;return(await this.getContract(Jt,o,c).swap({sender:c,amount:BigInt(i),token:Rr.contract(Buffer.from(A)).toBuffer(),receive_token:Buffer.from(u),recipient:m,receive_amount_min:BigInt(d)})).toXDR()}send(r){throw new J}getContract(r,i,o){let c={publicKey:o,contractId:i,networkPassphrase:this.params.sorobanNetworkPassphrase,rpcUrl:this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")};return new r(c)}};import{SuiClient as ys}from"@mysten/sui/client";import{coinWithBalance as L,Transaction as Ur}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as Xa}from"@mysten/sui/utils";import{Big as Er}from"big.js";var Vr=Re(ze());var Le=Re(ze());z();function Na(s,a,r){return s.moveCall({target:`${Le.PUBLISHED_AT}::bridge_interface::swap`,typeArguments:a,arguments:[v(s,r.bridge),v(s,r.coin),Se(s,r.receiveAmountMin,"u64")]})}function Ga(s,a,r){return s.moveCall({target:`${Le.PUBLISHED_AT}::bridge_interface::deposit`,typeArguments:[a],arguments:[v(s,r.bridge),v(s,r.userDeposit),v(s,r.coin)]})}function Ua(s,a,r){return s.moveCall({target:`${Le.PUBLISHED_AT}::bridge_interface::withdraw`,typeArguments:[a],arguments:[v(s,r.bridge),v(s,r.userDeposit),Se(s,r.amountLp,"u64")]})}function Ea(s,a,r){return s.moveCall({target:`${Le.PUBLISHED_AT}::bridge_interface::claim_reward`,typeArguments:[a],arguments:[v(s,r.bridge),v(s,r.userDeposit)]})}function Va(s,a,r){return s.moveCall({target:`${Le.PUBLISHED_AT}::bridge_interface::pool`,typeArguments:[a],arguments:[v(s,r)]})}function vr(s,a,r){return s.moveCall({target:`${Le.PUBLISHED_AT}::bridge_interface::swap_and_bridge_wormhole`,typeArguments:[a],arguments:[v(s,r.bridge),v(s,r.messenger),v(s,r.wormholeState),v(s,r.theClock),v(s,r.gasOracle),v(s,r.amount),v(s,r.recipient),Se(s,r.destinationChainId,"u8"),v(s,r.receiveToken),Se(s,r.nonce,"u256"),v(s,r.feeSuiCoin),v(s,r.feeTokenCoin)]})}function ja(s,a){return s.moveCall({target:`${Le.PUBLISHED_AT}::bridge_interface::new_user_deposit`,typeArguments:[a],arguments:[]})}function kr(s,a,r){return s.moveCall({target:`${Le.PUBLISHED_AT}::bridge_interface::swap_and_bridge`,typeArguments:[a],arguments:[v(s,r.bridge),v(s,r.messenger),v(s,r.gasOracle),v(s,r.amount),v(s,r.recipient),Se(s,r.destinationChainId,"u8"),v(s,r.receiveToken),Se(s,r.nonce,"u256"),v(s,r.feeSuiCoin),v(s,r.feeTokenCoin)]})}var Ka=Re(xr());var _a=Re(xr());z();function Mr(s,a,r){return s.moveCall({target:`${_a.PUBLISHED_AT}::cctp_bridge_interface::bridge`,typeArguments:[a],arguments:[v(s,r.cctpBridge),v(s,r.gasOracle),v(s,r.tokenMessengerMinterState),v(s,r.messageTransmitterState),v(s,r.treasury),v(s,r.denyList),v(s,r.amount),v(s,r.feeSuiCoin),v(s,r.feeTokenCoin),Se(s,r.destinationChainId,"u8"),v(s,r.recipient),v(s,r.recipientWalletAddress)]})}var Ha=Re(Dr());var La=Re(Dr());z();import{bcs as qe}from"@mysten/sui/bcs";import{fromHEX as us,toHEX as ds}from"@mysten/sui/utils";import{bcs as ms}from"@mysten/sui/bcs";z();var Wr=class s{__VectorClass=!0;static $typeName="vector";static $numTypeParams=1;static $isPhantom=[!1];$typeName="vector";$fullTypeName;$typeArgs;$isPhantom=[!1];elements;constructor(a,r){this.$fullTypeName=U(this.$typeName,...a),this.$typeArgs=a,this.elements=r}static reified(a){return{typeName:s.$typeName,fullTypeName:U(s.$typeName,k(a)),typeArgs:[k(a)],isPhantom:s.$isPhantom,reifiedTypeArgs:[a],fromFields:r=>s.fromFields(a,r),fromFieldsWithTypes:r=>s.fromFieldsWithTypes(a,r),fromBcs:r=>s.fromBcs(a,r),bcs:s.bcs(Yt(a)),fromJSONField:r=>s.fromJSONField(a,r),fromJSON:r=>s.fromJSON(a,r),new:r=>new s([k(a)],r),kind:"VectorClassReified"}}static get r(){return s.reified}static get bcs(){return ms.vector}static fromFields(a,r){return s.reified(a).new(r.map(i=>N(a,i)))}static fromFieldsWithTypes(a,r){return s.reified(a).new(r.map(i=>O(a,i)))}static fromBcs(a,r){return s.fromFields(a,s.bcs(Yt(a)).parse(r))}toJSONField(){return this.elements.map(a=>ct(this.$typeArgs[0],a))}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,elements:this.toJSONField()}}static fromJSONField(a,r){return s.reified(a).new(r.map(i=>D(a,i)))}static fromJSON(a,r){if(r.$typeName!==s.$typeName)throw new Error("not a vector json object");return s.fromJSONField(a,r.elements)}};function bt(s){return Wr.r(s)}function Y(s){return typeof s=="string"?{phantomType:s,kind:"PhantomReified"}:{phantomType:s.fullTypeName,kind:"PhantomReified"}}var ls=qe.bytes(32).transform({input:s=>us(s),output:s=>ds(s)});function Yt(s){switch(s){case"bool":return qe.bool();case"u8":return qe.u8();case"u16":return qe.u16();case"u32":return qe.u32();case"u64":return qe.u64();case"u128":return qe.u128();case"u256":return qe.u256();case"address":return ls;default:return s.bcs}}function k(s){switch(s){case"u8":case"u16":case"u32":case"u64":case"u128":case"u256":case"bool":case"address":return s}switch(s.kind){case"PhantomReified":return s.phantomType;case"StructClassReified":return s.fullTypeName;case"VectorClassReified":return s.fullTypeName}throw new Error("unreachable")}function N(s,a){switch(s){case"bool":case"u8":case"u16":case"u32":return a;case"u64":case"u128":case"u256":return BigInt(a);case"address":return`0x${a}`}if(s.kind==="VectorClassReified")return s.fromFields(a).elements;switch(s.typeName){case"0x1::string::String":case"0x1::ascii::String":return new TextDecoder().decode(Uint8Array.from(a.bytes)).toString();case"0x2::url::Url":return new TextDecoder().decode(Uint8Array.from(a.url.bytes)).toString();case"0x2::object::ID":return`0x${a.bytes}`;case"0x2::object::UID":return`0x${a.id.bytes}`;case"0x1::option::Option":return a.vec.length===0?null:s.fromFields(a).vec[0];default:return s.fromFields(a)}}function O(s,a){switch(s){case"bool":case"u8":case"u16":case"u32":return a;case"u64":case"u128":case"u256":return BigInt(a);case"address":return a}if(s.kind==="VectorClassReified")return s.fromFieldsWithTypes(a).elements;switch(s.typeName){case"0x1::string::String":case"0x1::ascii::String":case"0x2::url::Url":case"0x2::object::ID":return a;case"0x2::object::UID":return a.id;case"0x2::balance::Balance":return s.fromFields({value:BigInt(a)});case"0x1::option::Option":return a===null?null:O(s.reifiedTypeArgs[0],a);default:return s.fromFieldsWithTypes(a)}}function xe(s,a,r){if(r.length!==a.length)throw new Error(`provided item has mismatching number of type argments ${s} (expected ${r.length}, got ${a.length}))`);for(let i=0;i<a.length;i++)if(w(a[i])!==w(k(r[i])))throw new Error(`provided item has mismatching type argments ${s} (expected ${k(r[i])}, got ${a[i]}))`)}function je(s,a){let{typeArgs:r}=te(s.type);xe(s.type,r,a)}function ct(s,a){let{typeName:r,typeArgs:i}=te(s);switch(r){case"bool":return a;case"u8":case"u16":case"u32":return a;case"u64":case"u128":case"u256":return a.toString();case"address":case"signer":return a;case"vector":return a.map(o=>ct(i[0],o));case"0x1::string::String":case"0x1::ascii::String":case"0x2::url::Url":case"0x2::object::ID":case"0x2::object::UID":return a;case"0x1::option::Option":return a===null?null:ct(i[0],a);default:return a.toJSONField()}}function D(s,a){switch(s){case"bool":case"u8":case"u16":case"u32":return a;case"u64":case"u128":case"u256":return BigInt(a);case"address":return a}if(s.kind==="VectorClassReified")return s.fromJSONField(a).elements;switch(s.typeName){case"0x1::string::String":case"0x1::ascii::String":case"0x2::url::Url":case"0x2::object::ID":case"0x2::object::UID":return a;case"0x1::option::Option":return a===null?null:D(s.reifiedTypeArgs[0],a);default:return s.fromJSONField(a)}}z();var Rn="0x1";import{bcs as Iu}from"@mysten/sui/bcs";import{fromB64 as ku}from"@mysten/sui/utils";z();import{bcs as Nr}from"@mysten/sui/bcs";import{fromB64 as ps}from"@mysten/sui/utils";function In(s){return s=w(s),s===`${Rn}::string::String`}var vn=class s{__StructClass=!0;static get $typeName(){return`${Rn}::string::String`}static $numTypeParams=0;static $isPhantom=[];$typeName=s.$typeName;$fullTypeName;$typeArgs;$isPhantom=s.$isPhantom;bytes;constructor(a,r){this.$fullTypeName=U(s.$typeName,...a),this.$typeArgs=a,this.bytes=r.bytes}static reified(){return{typeName:s.$typeName,fullTypeName:U(s.$typeName),typeArgs:[],isPhantom:s.$isPhantom,reifiedTypeArgs:[],fromFields:a=>s.fromFields(a),fromFieldsWithTypes:a=>s.fromFieldsWithTypes(a),fromBcs:a=>s.fromBcs(a),bcs:s.bcs,fromJSONField:a=>s.fromJSONField(a),fromJSON:a=>s.fromJSON(a),fromSuiParsedData:a=>s.fromSuiParsedData(a),fromSuiObjectData:a=>s.fromSuiObjectData(a),fetch:async(a,r)=>s.fetch(a,r),new:a=>new s([],a),kind:"StructClassReified"}}static get r(){return s.reified()}static phantom(){return Y(s.reified())}static get p(){return s.phantom()}static get bcs(){return Nr.struct("String",{bytes:Nr.vector(Nr.u8())})}static fromFields(a){return s.reified().new({bytes:N(bt("u8"),a.bytes)})}static fromFieldsWithTypes(a){if(!In(a.type))throw new Error("not a String type");return s.reified().new({bytes:O(bt("u8"),a.fields.bytes)})}static fromBcs(a){return s.fromFields(s.bcs.parse(a))}toJSONField(){return{bytes:ct("vector<u8>",this.bytes)}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(a){return s.reified().new({bytes:D(bt("u8"),a.bytes)})}static fromJSON(a){if(a.$typeName!==s.$typeName)throw new Error("not a WithTwoGenerics json object");return s.fromJSONField(a)}static fromSuiParsedData(a){if(a.dataType!=="moveObject")throw new Error("not an object");if(!In(a.type))throw new Error(`object at ${a.fields.id} is not a String object`);return s.fromFieldsWithTypes(a)}static fromSuiObjectData(a){if(a.bcs){if(a.bcs.dataType!=="moveObject"||!In(a.bcs.type))throw new Error("object at is not a String object");return s.fromBcs(ps(a.bcs.bcsBytes))}if(a.content)return s.fromSuiParsedData(a.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(a,r){let i=await a.getObject({id:r,options:{showBcs:!0}});if(i.error)throw new Error(`error fetching String object at id ${r}: ${i.error.code}`);if(i.data?.bcs?.dataType!=="moveObject"||!In(i.data.bcs.type))throw new Error(`object at id ${r} is not a String object`);return s.fromSuiObjectData(i.data)}};z();z();var et="0x2";import{bcs as Gr}from"@mysten/sui/bcs";import{fromB64 as Ya,fromHEX as gs,toHEX as fs}from"@mysten/sui/utils";function kn(s){return s=w(s),s===`${et}::object::ID`}var At=class s{__StructClass=!0;static get $typeName(){return`${et}::object::ID`}static $numTypeParams=0;static $isPhantom=[];$typeName=s.$typeName;$fullTypeName;$typeArgs;$isPhantom=s.$isPhantom;bytes;constructor(a,r){this.$fullTypeName=U(s.$typeName,...a),this.$typeArgs=a,this.bytes=r.bytes}static reified(){return{typeName:s.$typeName,fullTypeName:U(s.$typeName),typeArgs:[],isPhantom:s.$isPhantom,reifiedTypeArgs:[],fromFields:a=>s.fromFields(a),fromFieldsWithTypes:a=>s.fromFieldsWithTypes(a),fromBcs:a=>s.fromBcs(a),bcs:s.bcs,fromJSONField:a=>s.fromJSONField(a),fromJSON:a=>s.fromJSON(a),fromSuiParsedData:a=>s.fromSuiParsedData(a),fromSuiObjectData:a=>s.fromSuiObjectData(a),fetch:async(a,r)=>s.fetch(a,r),new:a=>new s([],a),kind:"StructClassReified"}}static get r(){return s.reified()}static phantom(){return Y(s.reified())}static get p(){return s.phantom()}static get bcs(){return Gr.struct("ID",{bytes:Gr.bytes(32).transform({input:a=>gs(a),output:a=>fs(a)})})}static fromFields(a){return s.reified().new({bytes:N("address",a.bytes)})}static fromFieldsWithTypes(a){if(!kn(a.type))throw new Error("not a ID type");return s.reified().new({bytes:O("address",a.fields.bytes)})}static fromBcs(a){return s.fromFields(s.bcs.parse(a))}toJSONField(){return{bytes:this.bytes}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(a){return s.reified().new({bytes:D("address",a.bytes)})}static fromJSON(a){if(a.$typeName!==s.$typeName)throw new Error("not a WithTwoGenerics json object");return s.fromJSONField(a)}static fromSuiParsedData(a){if(a.dataType!=="moveObject")throw new Error("not an object");if(!kn(a.type))throw new Error(`object at ${a.fields.id} is not a ID object`);return s.fromFieldsWithTypes(a)}static fromSuiObjectData(a){if(a.bcs){if(a.bcs.dataType!=="moveObject"||!kn(a.bcs.type))throw new Error("object at is not a ID object");return s.fromBcs(Ya(a.bcs.bcsBytes))}if(a.content)return s.fromSuiParsedData(a.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(a,r){let i=await a.getObject({id:r,options:{showBcs:!0}});if(i.error)throw new Error(`error fetching ID object at id ${r}: ${i.error.code}`);if(i.data?.bcs?.dataType!=="moveObject"||!kn(i.data.bcs.type))throw new Error(`object at id ${r} is not a ID object`);return s.fromSuiObjectData(i.data)}};function Fn(s){return s=w(s),s===`${et}::object::UID`}var Pe=class s{__StructClass=!0;static get $typeName(){return`${et}::object::UID`}static $numTypeParams=0;static $isPhantom=[];$typeName=s.$typeName;$fullTypeName;$typeArgs;$isPhantom=s.$isPhantom;id;constructor(a,r){this.$fullTypeName=U(s.$typeName,...a),this.$typeArgs=a,this.id=r.id}static reified(){return{typeName:s.$typeName,fullTypeName:U(s.$typeName),typeArgs:[],isPhantom:s.$isPhantom,reifiedTypeArgs:[],fromFields:a=>s.fromFields(a),fromFieldsWithTypes:a=>s.fromFieldsWithTypes(a),fromBcs:a=>s.fromBcs(a),bcs:s.bcs,fromJSONField:a=>s.fromJSONField(a),fromJSON:a=>s.fromJSON(a),fromSuiParsedData:a=>s.fromSuiParsedData(a),fromSuiObjectData:a=>s.fromSuiObjectData(a),fetch:async(a,r)=>s.fetch(a,r),new:a=>new s([],a),kind:"StructClassReified"}}static get r(){return s.reified()}static phantom(){return Y(s.reified())}static get p(){return s.phantom()}static get bcs(){return Gr.struct("UID",{id:At.bcs})}static fromFields(a){return s.reified().new({id:N(At.reified(),a.id)})}static fromFieldsWithTypes(a){if(!Fn(a.type))throw new Error("not a UID type");return s.reified().new({id:O(At.reified(),a.fields.id)})}static fromBcs(a){return s.fromFields(s.bcs.parse(a))}toJSONField(){return{id:this.id}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(a){return s.reified().new({id:D(At.reified(),a.id)})}static fromJSON(a){if(a.$typeName!==s.$typeName)throw new Error("not a WithTwoGenerics json object");return s.fromJSONField(a)}static fromSuiParsedData(a){if(a.dataType!=="moveObject")throw new Error("not an object");if(!Fn(a.type))throw new Error(`object at ${a.fields.id} is not a UID object`);return s.fromFieldsWithTypes(a)}static fromSuiObjectData(a){if(a.bcs){if(a.bcs.dataType!=="moveObject"||!Fn(a.bcs.type))throw new Error("object at is not a UID object");return s.fromBcs(Ya(a.bcs.bcsBytes))}if(a.content)return s.fromSuiParsedData(a.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(a,r){let i=await a.getObject({id:r,options:{showBcs:!0}});if(i.error)throw new Error(`error fetching UID object at id ${r}: ${i.error.code}`);if(i.data?.bcs?.dataType!=="moveObject"||!Fn(i.data.bcs.type))throw new Error(`object at id ${r} is not a UID object`);return s.fromSuiObjectData(i.data)}};function Me(s,a){return s.moveCall({target:`${La.PUBLISHED_AT}::bytes32::from_hex`,arguments:[Se(s,a,`${vn.$typeName}`)]})}async function Ze(s,a,r=[]){let i=await s(a),o=r.concat(i.data);return i.hasNextPage&&i.nextCursor?Ze(s,i.nextCursor,o):o}var St=class extends pe{constructor(r,i){super();this.nodeRpcUrlsConfig=r;this.api=i;this.client=new ys({url:r.getNodeRpcUrl(this.chainSymbol)})}chainType="SUI";chainSymbol="SUI";client;send(){throw new y("Method send not implemented.")}async buildRawTransactionSwap(r){let i=r.sourceToken.suiAddresses;if(!i)throw new y("SUI token must contain 'suiAddresses'");(0,Vr.setAddress)(i.bridgeAddress,i.bridgeAddressOrigin);let o=Ve(this.chainType,r);return await this.buildRawTransactionSwapFromParams(o,i)}async buildRawTransactionSwapFromParams(r,i){let{amount:o,fromAccountAddress:c,fromTokenAddress:A,toTokenAddress:m,minimumReceiveAmount:u}=r,d=new Ur;d.setSender(c);let l={bridge:i.bridgeObjectAddress,coin:L({balance:BigInt(o),type:A}),receiveAmountMin:BigInt(u)},p=Na(d,[A,m],l),g=await Ze(T=>this.client.getCoins({owner:r.toAccountAddress,coinType:m,cursor:T}));return g.length===0||!g[0]?d.transferObjects([p],r.toAccountAddress):d.mergeCoins(g[0].coinObjectId,[p]),await d.toJSON({client:this.client})}async buildRawTransactionSendFromCustomTx(r,i,o){let c=Ur.from(r);return this.buildRawTransactionSendFromTx(o,c,i)}async buildRawTransactionSend(r){return this.buildRawTransactionSendFromTx(r,new Ur)}async buildRawTransactionSendFromTx(r,i,o){let c=await ke(this.chainType,r,this.api),{messenger:A}=c,m=r.sourceToken.suiAddresses;if(!m)throw new y("SUI token must contain 'suiAddresses'");switch((0,Vr.setAddress)(m.bridgeAddress,m.bridgeAddressOrigin),(0,Ha.setAddress)(m.utilsAddress),A){case 1:return this.buildRawTransactionAllbridgeSend(c,m,i,o);case 2:return this.buildRawTransactionWormholeSend(c,m,i,o);case 3:case 4:return this.buildRawTransactionCctpSend(r,c,m,i,o);case 5:throw new ae("Messenger OFT is not supported yet.")}}async buildRawTransactionAllbridgeSend(r,i,o,c){let{amount:A,fromAccountAddress:m,fromTokenAddress:u,toChainId:d,toAccountAddress:l,toTokenAddress:p,fee:g,gasFeePaymentMethod:T,extraGas:C}=r,f=g;if(C&&(f=Er(f).plus(C).toFixed()),o.setSender(m),T==="stablecoin"){let B=BigInt(A)-BigInt(f),P,h;if(c){let[F]=o.splitCoins(c,[f]);P=c,h=F}else P=L({balance:B,type:u}),h=L({balance:BigInt(f),type:u});let S={bridge:i.bridgeObjectAddress,messenger:i.allbridgeMessengerObjectAddress,amount:P,destinationChainId:d,nonce:Ee(),recipient:Me(o,ve(l)),receiveToken:Me(o,ve(p)),gasOracle:i.gasOracleObjectAddress,feeTokenCoin:h,feeSuiCoin:L({balance:BigInt(0),useGasCoin:!1})};kr(o,u,S)}else{let B=f==="0"?L({balance:BigInt(f),useGasCoin:!1}):L({balance:BigInt(f)}),P={bridge:i.bridgeObjectAddress,messenger:i.allbridgeMessengerObjectAddress,amount:c??L({balance:BigInt(A),type:u}),destinationChainId:d,nonce:Ee(),recipient:Me(o,ve(l)),receiveToken:Me(o,ve(p)),gasOracle:i.gasOracleObjectAddress,feeTokenCoin:L({balance:BigInt(0),type:u}),feeSuiCoin:B};kr(o,u,P)}return await o.toJSON({client:this.client})}async buildRawTransactionWormholeSend(r,i,o,c){let{amount:A,fromAccountAddress:m,fromTokenAddress:u,toChainId:d,toAccountAddress:l,toTokenAddress:p,fee:g,gasFeePaymentMethod:T,extraGas:C}=r,f=g;if(C&&(f=Er(f).plus(C).toFixed()),o.setSender(m),T==="stablecoin"){let B=BigInt(A)-BigInt(f),P,h;if(c){let[F]=o.splitCoins(c,[f]);P=c,h=F}else P=L({balance:B,type:u}),h=L({balance:BigInt(f),type:u});let S={bridge:i.bridgeObjectAddress,messenger:i.wormholeMessengerObjectAddress,wormholeState:i.wormholeStateObjectAddress,theClock:Xa,amount:P,destinationChainId:d,nonce:Ee(),recipient:Me(o,ve(l)),receiveToken:Me(o,ve(p)),gasOracle:i.gasOracleObjectAddress,feeTokenCoin:h,feeSuiCoin:L({balance:BigInt(0),useGasCoin:!1})};vr(o,u,S)}else{let B=f==="0"?L({balance:BigInt(f),useGasCoin:!1}):L({balance:BigInt(f)}),P={bridge:i.bridgeObjectAddress,messenger:i.wormholeMessengerObjectAddress,wormholeState:i.wormholeStateObjectAddress,theClock:Xa,amount:c??L({balance:BigInt(A),type:u}),destinationChainId:d,nonce:Ee(),recipient:Me(o,ve(l)),receiveToken:Me(o,ve(p)),gasOracle:i.gasOracleObjectAddress,feeTokenCoin:L({balance:BigInt(0),type:u}),feeSuiCoin:B};vr(o,u,P)}return await o.toJSON({client:this.client})}async buildRawTransactionCctpSend(r,i,o,c,A){let{amount:m,fromAccountAddress:u,fromTokenAddress:d,toChainId:l,toAccountAddress:p,fee:g,gasFeePaymentMethod:T,extraGas:C}=i;(0,Ka.setAddress)(o.cctpAddress,o.cctpAddressOrigin);let f=g;C&&(f=Er(f).plus(C).toFixed()),c.setSender(u);let B=Me(c,ve(p)),P;if(r.destinationToken.chainType==="SOLANA"){let h=await hn(this.chainType,r.toAccountAddress,r.destinationToken.tokenAddress,this.nodeRpcUrlsConfig.getNodeRpcUrl("SOL"));P=Me(c,ve(h))}else P=B;if(T==="stablecoin"){let h=BigInt(m)-BigInt(f),S,F;if(A){let[G]=c.splitCoins(A,[f]);S=A,F=G}else S=L({balance:h,type:d}),F=L({balance:BigInt(f),type:d});let j={cctpBridge:o.cctpObjectAddress,tokenMessengerMinterState:o.cctpTokenMessengerMinterStateObjectAddress,messageTransmitterState:o.cctpMessageTransmitterStateObjectAddress,treasury:o.cctpTreasuryObjectAddress,denyList:o.cctpDenyListObjectAddress,amount:S,destinationChainId:l,recipient:P,recipientWalletAddress:B,gasOracle:o.gasOracleObjectAddress,feeTokenCoin:F,feeSuiCoin:L({balance:BigInt(0),useGasCoin:!1})};Mr(c,d,j)}else{let h=f==="0"?L({balance:BigInt(f),useGasCoin:!1}):L({balance:BigInt(f)}),S={cctpBridge:o.cctpObjectAddress,tokenMessengerMinterState:o.cctpTokenMessengerMinterStateObjectAddress,messageTransmitterState:o.cctpMessageTransmitterStateObjectAddress,treasury:o.cctpTreasuryObjectAddress,denyList:o.cctpDenyListObjectAddress,amount:A??L({balance:BigInt(m),type:d}),destinationChainId:l,recipient:P,recipientWalletAddress:B,gasOracle:o.gasOracleObjectAddress,feeTokenCoin:L({balance:BigInt(0),type:d}),feeSuiCoin:h};Mr(c,d,S)}return await c.toJSON({client:this.client})}};import{Big as bs}from"big.js";import hs from"bn.js";function xn(s){return"0x"+new hs(s).toString("hex")}function Qa(s){return new Promise(a=>setTimeout(()=>a(),s))}async function Mn(s,a){let r=await s.trx.sign(a);if(!r.signature)throw new pt("Transaction was not signed properly");let o=(await s.trx.sendRawTransaction(r)).transaction.txID;return await Ts(s,o),{txId:o}}async function Ts(s,a,r=1e4){let i=Date.now();for(;;){if(Date.now()-i>r)throw new Nt("Transaction not found");let o=await s.trx.getUnconfirmedTransactionInfo(a);if(!o?.receipt){await Qa(2e3);continue}if(o.receipt.result==="SUCCESS")return o;throw new Nt(`Transaction status is ${o.receipt.result}`)}}var Lt=class extends pe{constructor(r,i){super();this.tronWeb=r;this.api=i}chainType="TRX";async send(r){let i=await ke(this.chainType,r,this.api),o=await this.buildRawTransactionSendFromParams(r,i);return await Mn(this.tronWeb,o)}async buildRawTransactionSwap(r){let i=Ve(this.chainType,r);return await this.buildRawTransactionSwapFromParams(i)}async buildRawTransactionSwapFromParams(r){let{amount:i,contractAddress:o,fromAccountAddress:c,fromTokenAddress:A,toAccountAddress:m,toTokenAddress:u,minimumReceiveAmount:d}=r,l=[{type:"uint256",value:i},{type:"bytes32",value:A},{type:"bytes32",value:u},{type:"address",value:m},{type:"uint256",value:d}];return this.buildRawTransaction(o,"swap(uint256,bytes32,bytes32,address,uint256)",l,"0",c)}async buildRawTransactionSend(r){let i=await ke(this.chainType,r,this.api);return this.buildRawTransactionSendFromParams(r,i)}async buildRawTransactionSendFromParams(r,i){let{amount:o,contractAddress:c,fromAccountAddress:A,fromTokenAddress:m,toChainId:u,toAccountAddress:d,toTokenAddress:l,messenger:p,fee:g,gasFeePaymentMethod:T,extraGas:C,extraGasDest:f}=i,B=g;C&&(B=bs(B).plus(C).toFixed());let P=Ee().toString(),h,S,F;switch(p){case 3:case 4:T==="stablecoin"?(h=[{type:"uint256",value:o},{type:"bytes32",value:d},{type:"uint256",value:u},{type:"uint256",value:B}],S="0"):(h=[{type:"uint256",value:o},{type:"bytes32",value:d},{type:"uint256",value:u},{type:"uint256",value:0}],S=B),F="bridge(uint256,bytes32,uint256,uint256)";break;case 5:T==="stablecoin"?(h=[{type:"address",value:r.sourceToken.tokenAddress},{type:"uint256",value:o},{type:"bytes32",value:d},{type:"uint256",value:u},{type:"uint256",value:B},{type:"uint256",value:f??"0"},{type:"uint256",value:"10"}],S="0"):(h=[{type:"address",value:r.sourceToken.tokenAddress},{type:"uint256",value:o},{type:"bytes32",value:d},{type:"uint256",value:u},{type:"uint256",value:0},{type:"uint256",value:f??"0"},{type:"uint256",value:"10"}],S=B),F="bridge(address,uint256,bytes32,uint256,uint256,uint256,uint256)";break;case 1:case 2:T==="stablecoin"?(h=[{type:"bytes32",value:m},{type:"uint256",value:o},{type:"bytes32",value:d},{type:"uint256",value:u},{type:"bytes32",value:l},{type:"uint256",value:P},{type:"uint8",value:p},{type:"uint256",value:B}],S="0"):(h=[{type:"bytes32",value:m},{type:"uint256",value:o},{type:"bytes32",value:d},{type:"uint256",value:u},{type:"bytes32",value:l},{type:"uint256",value:P},{type:"uint8",value:p},{type:"uint256",value:0}],S=B),F="swapAndBridge(bytes32,uint256,bytes32,uint256,bytes32,uint256,uint8,uint256)";break}return this.buildRawTransaction(c,F,h,S,A)}async buildRawTransaction(r,i,o,c,A){let m=await this.tronWeb.transactionBuilder.triggerSmartContract(r,i,{callValue:+c},o,A);if(!m?.result?.result)throw new y("Unknown error: "+JSON.stringify(m,null,2));return m.transaction}};var On=class{constructor(a,r,i,o){this.api=a;this.nodeRpcUrlsConfig=r;this.params=i;this.tokenService=o;this.rawTxBuilder=new Tn(a,r,i,o)}rawTxBuilder;async getAllowance(a,r){let i,o;r?(i=a,o=r):o=a;let c=_t(o.token,o.messenger);return await this.tokenService.getAllowance({...o,spender:c},i)}async checkAllowance(a,r){let i,o;r?(i=a,o=r):o=a;let c=_t(o.token,o.messenger);return this.tokenService.checkAllowance({...o,spender:c},i)}async approve(a,r){let i=_t(r.token,r.messenger);return this.tokenService.approve(a,{...r,spender:i})}async send(a,r){return M(r.amount),W("amount",r.amount,r.sourceToken.decimals),bn(r.sourceToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).send(r)}};function _t(s,a=1){switch(a){case 3:if(s.cctpAddress)return s.cctpAddress;throw new re("Such route does not support CCTP protocol");case 4:if(s.cctpV2Address)return s.cctpV2Address;throw new re("Such route does not support CCTP V2 protocol");case 5:if(s.oftBridgeAddress)return s.oftBridgeAddress;throw new ae("Such route does not support OFT protocol");case 1:case 2:return s.bridgeAddress}}function bn(s,a,r,i,o){switch(x.getChainProperty(s).chainType){case"EVM":{if(o)return new Zt(o,a,r);{let c=r.getNodeRpcUrl(s);return new Zt(new Ps(c),a,r)}}case"TRX":{if(o)return new Lt(o,a);{let c=r.getNodeRpcUrl(s);return new Lt(new Ss({fullHost:c,solidityNode:c,eventServer:c}),a)}}case"SOLANA":return new Cn(r.getNodeRpcUrl("SOL"),{wormholeMessengerProgramId:i.wormholeMessengerProgramId,solanaLookUpTable:i.solanaLookUpTable,cctpParams:i.cctpParams,jupiterParams:{jupiterUrl:i.jupiterUrl,jupiterApiKeyHeader:i.jupiterApiKeyHeader,jupiterMaxAccounts:i.jupiterMaxAccounts}},a);case"SRB":return new Bn(r,i,a);case"SUI":return new St(r,a)}}import{Big as Vs}from"big.js";import js from"timed-cache";import{TronWeb as Zs}from"tronweb";import{FMT_BYTES as _s,FMT_NUMBER as $s,Web3 as Js}from"web3";import{Big as Xe}from"big.js";function za(s,a,r,i,o){let c=I(s,3),A=Xe(c),m=Xe(r),u=Xe(i).plus(o),d,l;if(m.eq(0)||u.eq(0)){let g=A.div(2);d=Xe(i).plus(g),l=Xe(o).plus(g)}else d=Xe(i).plus(A.mul(i).div(u)),l=Xe(o).plus(A.mul(o).div(u));return Xe(pa(a,d.toFixed(),l.toFixed())).minus(m).toFixed()}function qa(s){let a=I(s,3);return Xe(a).round().toFixed()}import{Web3 as tt}from"web3";var ws={abi:[{inputs:[{internalType:"address",name:"_router",type:"address"},{internalType:"uint256",name:"_a",type:"uint256"},{internalType:"contract ERC20",name:"_token",type:"address"},{internalType:"uint16",name:"_feeShareBP",type:"uint16"},{internalType:"uint256",name:"_balanceRatioMinBP",type:"uint256"},{internalType:"string",name:"lpName",type:"string"},{internalType:"string",name:"lpSymbol",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Deposit",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"RewardsClaimed",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"recipient",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"vUsdAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"fee",type:"uint256"}],name:"SwappedFromVUsd",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"vUsdAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"fee",type:"uint256"}],name:"SwappedToVUsd",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[],name:"a",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"accRewardPerShareP",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"adjustTotalLpAmount",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"adminFeeAmount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"adminFeeShareBP",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"balanceRatioMinBP",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"canDeposit",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"canWithdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"claimAdminFee",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"claimRewards",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"d",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"}],name:"deposit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"feeShareBP",outputs:[{internalType:"uint16",name:"",type:"uint16"}],stateMutability:"view",type:"function"},{inputs:[],name:"getPrice",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"x",type:"uint256"}],name:"getY",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"pendingReward",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"reserves",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"router",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"_adminFeeShareBP",type:"uint256"}],name:"setAdminFeeShare",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_balanceRatioMinBP",type:"uint256"}],name:"setBalanceRatioMinBP",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint16",name:"_feeShareBP",type:"uint16"}],name:"setFeeShare",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_router",type:"address"}],name:"setRouter",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_stopAuthority",type:"address"}],name:"setStopAuthority",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"startDeposit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"startWithdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"stopDeposit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"stopWithdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"receiveAmountMin",type:"uint256"},{internalType:"bool",name:"zeroFee",type:"bool"}],name:"swapFromVUsd",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bool",name:"zeroFee",type:"bool"}],name:"swapToVUsd",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"token",outputs:[{internalType:"contract ERC20",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"tokenBalance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"userRewardDebt",outputs:[{internalType:"uint256",name:"amount",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"vUsdBalance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amountLp",type:"uint256"}],name:"withdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},Xt=ws;var oe=class{lpAmount;rewardDebt;constructor(a){this.lpAmount=a.lpAmount,this.rewardDebt=a.rewardDebt}get userLiquidity(){return R(this.lpAmount,3).toFixed()}earned(a,r){let i=da(this.lpAmount,this.rewardDebt,a.accRewardPerShareP,a.p);return r?R(i,r).toFixed():i}};var ge=class{};var Kt=class extends ge{constructor(r,i){super();this.web3=r;this.api=i}chainType="EVM";P=52;async getUserBalanceInfo(r,i){let o;try{o=await pn(this.getUserBalanceInfoByBatch(r,i),`Cannot get UserBalanceInfo for ${i.name} on ${i.chainSymbol}`,5e3)}catch{o=await pr(()=>this.getUserBalanceInfoPerProperty(r,i),`Cannot get UserBalanceInfo for ${i.name} on ${i.chainSymbol}`,5,2e3)}return o}async getPoolInfoFromChain(r){let i;try{i=await pn(this.getPoolInfoByBatch(r),`Cannot get PoolInfo for ${r.name} on ${r.chainSymbol}`,5e3)}catch{i=await pr(()=>this.getPoolInfoPerProperty(r),`Cannot get PoolInfo for ${r.name} on ${r.chainSymbol}`,5,2e3)}return i}async getUserBalanceInfoByBatch(r,i){let o=new this.web3.eth.BatchRequest,c=this.getPoolContract(i.poolAddress),A=c.methods.userRewardDebt(r).encodeABI(),m=c.methods.balanceOf(r).encodeABI();o.add({method:"eth_call",params:[{to:i.poolAddress,data:A},"latest"]}),o.add({method:"eth_call",params:[{to:i.poolAddress,data:m},"latest"]});let[u,d]=await o.execute();if(u&&d&&!u.error&&!d.error)return new oe({lpAmount:tt.utils.toBigInt(d.result).toString(),rewardDebt:tt.utils.toBigInt(u.result).toString()});throw new Error("Batched failed")}async getUserBalanceInfoPerProperty(r,i){let o=(await this.getPoolContract(i.poolAddress).methods.userRewardDebt(r).call()).toString(),c=(await this.getPoolContract(i.poolAddress).methods.balanceOf(r).call()).toString();return new oe({lpAmount:c,rewardDebt:o})}async getPoolInfoByBatch(r){let i=new this.web3.eth.BatchRequest,o=this.getPoolContract(r.poolAddress),c=o.methods.a().encodeABI(),A=o.methods.d().encodeABI(),m=o.methods.tokenBalance().encodeABI(),u=o.methods.vUsdBalance().encodeABI(),d=o.methods.totalSupply().encodeABI(),l=o.methods.accRewardPerShareP().encodeABI();i.add({method:"eth_call",params:[{to:r.poolAddress,data:c},"latest"]}),i.add({method:"eth_call",params:[{to:r.poolAddress,data:A},"latest"]}),i.add({method:"eth_call",params:[{to:r.poolAddress,data:m},"latest"]}),i.add({method:"eth_call",params:[{to:r.poolAddress,data:u},"latest"]}),i.add({method:"eth_call",params:[{to:r.poolAddress,data:d},"latest"]}),i.add({method:"eth_call",params:[{to:r.poolAddress,data:l},"latest"]});let[p,g,T,C,f,B]=await i.execute();if(p&&g&&T&&C&&f&&B&&!p.error&&!g.error&&!T.error&&!C.error&&!f.error&&!B.error){let P=tt.utils.toBigInt(T.result).toString(),h=tt.utils.toBigInt(C.result).toString(),S=se({tokenBalance:P,vUsdBalance:h});return{aValue:tt.utils.toBigInt(p.result).toString(),dValue:tt.utils.toBigInt(g.result).toString(),tokenBalance:P,vUsdBalance:h,totalLpAmount:tt.utils.toBigInt(f.result).toString(),accRewardPerShareP:tt.utils.toBigInt(B.result).toString(),p:this.P,imbalance:S}}throw new Error("Batched failed")}async getPoolInfoPerProperty(r){let i=this.getPoolContract(r.poolAddress),o=(await i.methods.a().call()).toString(),c=(await i.methods.d().call()).toString(),A=(await i.methods.tokenBalance().call()).toString(),m=(await i.methods.vUsdBalance().call()).toString(),u=(await i.methods.totalSupply().call()).toString(),d=(await i.methods.accRewardPerShareP().call()).toString(),l=se({tokenBalance:A,vUsdBalance:m});return{aValue:o,dValue:c,tokenBalance:A,vUsdBalance:m,totalLpAmount:u,accRewardPerShareP:d,p:this.P,imbalance:l}}async buildRawTransactionDeposit(r){return Promise.resolve({...this.buildTxParams(r),data:this.getPoolContract(r.token.poolAddress).methods.deposit(r.amount).encodeABI()})}async buildRawTransactionWithdraw(r){return Promise.resolve({...this.buildTxParams(r),data:this.getPoolContract(r.token.poolAddress).methods.withdraw(r.amount).encodeABI()})}async buildRawTransactionClaimRewards(r){return Promise.resolve({...this.buildTxParams(r),data:this.getPoolContract(r.token.poolAddress).methods.claimRewards().encodeABI()})}buildTxParams(r){return{from:r.accountAddress,to:r.token.poolAddress,value:"0"}}getPoolContract(r){return new this.web3.eth.Contract(Xt.abi,r)}};var Dn=class{constructor(a,r,i,o){this.api=a;this.nodeRpcUrlsConfig=r;this.params=i;this.tokenService=o}async approve(a,r){if(r){let i=a,o=r;return this.tokenService.buildRawTransactionApprove({...o,spender:o.token.poolAddress},i)}else{let i=a;return this.tokenService.buildRawTransactionApprove({...i,spender:i.token.poolAddress})}}async deposit(a,r){return M(a.amount),W("amount",a.amount,a.token.decimals),a.amount=I(a.amount,a.token.decimals).toFixed(),Pt(a.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,r).buildRawTransactionDeposit(a)}async withdraw(a,r){return M(a.amount),W("amount",a.amount,a.token.decimals),a.amount=I(a.amount,3).toFixed(),Pt(a.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,r).buildRawTransactionWithdraw(a)}async claimRewards(a,r){return Pt(a.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,r).buildRawTransactionClaimRewards(a)}};import{AnchorProvider as Cs,BN as ei,Program as Bs,Spl as Rs,web3 as Is}from"@project-serum/anchor";import{Connection as vs,PublicKey as nt}from"@solana/web3.js";var Wn=class extends ge{constructor(r,i){super();this.solanaRpcUrl=r;this.api=i}chainType="SOLANA";P=48;async getUserBalanceInfo(r,i){let o=this.buildAnchorProvider(r),c=this.getBridge(i.bridgeAddress,o),A=new nt(i.poolAddress),m=await c.account.pool.fetch(A);try{let u=await yr(new nt(r),m.mint,c.programId),{lpAmount:d,rewardDebt:l}=await c.account.userDeposit.fetch(u);return new oe({lpAmount:d.toString(),rewardDebt:l.toString()})}catch{return new oe({lpAmount:"0",rewardDebt:"0"})}}async getPoolInfoFromChain(r){let i=this.buildAnchorProvider(r.bridgeAddress),o=await this.getBridge(r.bridgeAddress,i).account.pool.fetch(r.poolAddress),c=o.vUsdBalance.toString(),A=o.tokenBalance.toString(),m=se({tokenBalance:A,vUsdBalance:c});return{dValue:o.d.toString(),aValue:o.a.toString(),totalLpAmount:o.totalLpAmount.toString(),vUsdBalance:c,tokenBalance:A,accRewardPerShareP:o.accRewardPerShareP.toString(),p:this.P,imbalance:m}}async buildRawTransactionDeposit(r){let{bridge:i,accounts:o,preInstructions:c}=await this.prepareDataForTransaction(r),A=await i.methods.deposit(new ei(r.amount)).accounts(o).preInstructions(c).transaction();return A.recentBlockhash=(await this.buildAnchorProvider(r.accountAddress).connection.getLatestBlockhash()).blockhash,A.feePayer=new nt(r.accountAddress),await ht(A,r.txFeeParams,this.solanaRpcUrl),A}async buildRawTransactionWithdraw(r){let{bridge:i,accounts:o,preInstructions:c}=await this.prepareDataForTransaction(r),A=await i.methods.withdraw(new ei(r.amount)).accounts(o).preInstructions(c).transaction();return A.recentBlockhash=(await this.buildAnchorProvider(r.accountAddress).connection.getLatestBlockhash()).blockhash,A.feePayer=new nt(r.accountAddress),await ht(A,r.txFeeParams,this.solanaRpcUrl),A}async buildRawTransactionClaimRewards(r){let{bridge:i,accounts:o,preInstructions:c}=await this.prepareDataForTransaction(r),A=await i.methods.claimRewards().accounts(o).preInstructions(c).transaction();return A.recentBlockhash=(await this.buildAnchorProvider(r.accountAddress).connection.getLatestBlockhash()).blockhash,A.feePayer=new nt(r.accountAddress),await ht(A,r.txFeeParams,this.solanaRpcUrl),A}async prepareDataForTransaction(r){let i=this.buildAnchorProvider(r.accountAddress),o=this.getBridge(r.token.bridgeAddress,i),{accounts:c,preInstructions:A}=await this._getLPTransactionData(o,r.token.poolAddress,r.accountAddress,i);return{bridge:o,accounts:c,preInstructions:A}}getBridge(r,i){return new Bs($t,r,i)}buildAnchorProvider(r){let i=new vs(this.solanaRpcUrl,"confirmed"),o=new nt(r);return new Cs(i,{publicKey:o},{preflightCommitment:"confirmed",commitment:"confirmed"})}async _getLPTransactionData(r,i,o,c){let A=new nt(o),m=await Ke(r.programId),u=await gt(r.programId),d=new nt(i),p=(await r.account.pool.fetch(d)).mint,g=await Ie(A,p),T=await ft(p,r.programId),C=await yr(A,p,r.programId),f=[Is.ComputeBudgetProgram.setComputeUnitLimit({units:1e6})];try{await yt(g,c)}catch{let S=await Rs.associatedToken(c).methods.create().accounts({mint:p,owner:A,associatedAccount:g}).instruction();f.push(S)}try{await r.account.userDeposit.fetch(C)}catch{let h=await r.methods.initDepositAccount().accounts({mint:p,user:A,userDeposit:C}).instruction();f.push(h)}return{accounts:{mint:p,user:A,config:m,pool:d,bridgeAuthority:u,userDeposit:C,userToken:g,bridgeToken:T},preInstructions:f}}};import{contract as $P}from"@stellar/stellar-sdk";import{contract as t}from"@stellar/stellar-sdk";var ks=t.Spec,Fs=t.Client;var Nn=class extends Fs{constructor(r){super(new ks(["AAAAAAAAAAAAAAAKaW5pdGlhbGl6ZQAAAAAABwAAAAAAAAAFYWRtaW4AAAAAAAATAAAAAAAAAAZicmlkZ2UAAAAAABMAAAAAAAAAAWEAAAAAAAAKAAAAAAAAAAV0b2tlbgAAAAAAABMAAAAAAAAADGZlZV9zaGFyZV9icAAAAAoAAAAAAAAAFGJhbGFuY2VfcmF0aW9fbWluX2JwAAAACgAAAAAAAAASYWRtaW5fZmVlX3NoYXJlX2JwAAAAAAAKAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAHZGVwb3NpdAAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABmFtb3VudAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAId2l0aGRyYXcAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAACWFtb3VudF9scAAAAAAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAANc3dhcF90b192X3VzZAAAAAAAAAMAAAAAAAAABHVzZXIAAAATAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAACHplcm9fZmVlAAAAAQAAAAEAAAPpAAAACgAAAAM=","AAAAAAAAAAAAAAAPc3dhcF9mcm9tX3ZfdXNkAAAAAAQAAAAAAAAABHVzZXIAAAATAAAAAAAAAAt2dXNkX2Ftb3VudAAAAAAKAAAAAAAAABJyZWNlaXZlX2Ftb3VudF9taW4AAAAAAAoAAAAAAAAACHplcm9fZmVlAAAAAQAAAAEAAAPpAAAACgAAAAM=","AAAAAAAAAAAAAAANY2xhaW1fcmV3YXJkcwAAAAAAAAEAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAdgYWRtaW5gAAAAAA1zZXRfZmVlX3NoYXJlAAAAAAAAAQAAAAAAAAAMZmVlX3NoYXJlX2JwAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAWYWRqdXN0X3RvdGFsX2xwX2Ftb3VudAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAYc2V0X2JhbGFuY2VfcmF0aW9fbWluX2JwAAAAAQAAAAAAAAAUYmFsYW5jZV9yYXRpb19taW5fYnAAAAAKAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAMc3RvcF9kZXBvc2l0AAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAANc3RhcnRfZGVwb3NpdAAAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAANc3RvcF93aXRoZHJhdwAAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAAOc3RhcnRfd2l0aGRyYXcAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAASc2V0X3N0b3BfYXV0aG9yaXR5AAAAAAABAAAAAAAAAA5zdG9wX2F1dGhvcml0eQAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAKc2V0X2JyaWRnZQAAAAAAAQAAAAAAAAAGYnJpZGdlAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAJc2V0X2FkbWluAAAAAAAAAQAAAAAAAAAJbmV3X2FkbWluAAAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAATc2V0X2FkbWluX2ZlZV9zaGFyZQAAAAABAAAAAAAAABJhZG1pbl9mZWVfc2hhcmVfYnAAAAAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAAPY2xhaW1fYWRtaW5fZmVlAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAZgdmlld2AAAAAAAA5wZW5kaW5nX3Jld2FyZAAAAAAAAQAAAAAAAAAEdXNlcgAAABMAAAABAAAD6QAAAAoAAAAD","AAAAAAAAAAAAAAAIZ2V0X3Bvb2wAAAAAAAAAAQAAA+kAAAfQAAAABFBvb2wAAAAD","AAAAAAAAAAAAAAAJZ2V0X2FkbWluAAAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=","AAAAAAAAAAAAAAASZ2V0X3N0b3BfYXV0aG9yaXR5AAAAAAAAAAAAAQAAA+kAAAATAAAAAw==","AAAAAAAAAAAAAAAKZ2V0X2JyaWRnZQAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=","AAAAAAAAAAAAAAAQZ2V0X3VzZXJfZGVwb3NpdAAAAAEAAAAAAAAABHVzZXIAAAATAAAAAQAAA+kAAAfQAAAAC1VzZXJEZXBvc2l0AAAAAAM=","AAAAAAAAAAAAAAAHdXBncmFkZQAAAAABAAAAAAAAAA1uZXdfd2FzbV9oYXNoAAAAAAAD7gAAACAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAQAAAAAAAAAAAAAAD1N3YXBwZWRGcm9tVlVzZAAAAAAFAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAA2ZlZQAAAAAKAAAAAAAAAAlyZWNpcGllbnQAAAAAAAATAAAAAAAAAAV0b2tlbgAAAAAAABMAAAAAAAAAC3Z1c2RfYW1vdW50AAAAAAo=","AAAAAQAAAAAAAAAAAAAADVN3YXBwZWRUb1ZVc2QAAAAAAAAFAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAA2ZlZQAAAAAKAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABXRva2VuAAAAAAAAEwAAAAAAAAALdnVzZF9hbW91bnQAAAAACg==","AAAAAQAAAAAAAAAAAAAAB0RlcG9zaXQAAAAAAgAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAR1c2VyAAAAEw==","AAAAAQAAAAAAAAAAAAAACFdpdGhkcmF3AAAAAgAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAR1c2VyAAAAEw==","AAAAAQAAAAAAAAAAAAAADlJld2FyZHNDbGFpbWVkAAAAAAACAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAABHVzZXIAAAAT","AAAAAQAAAAAAAAAAAAAABkJyaWRnZQAAAAAAAQAAAAAAAAABMAAAAAAAABM=","AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAQAAAAEAAAAAAAAAC1VzZXJEZXBvc2l0AAAAAAEAAAAT","AAAAAQAAAAAAAAAAAAAABFBvb2wAAAAPAAAAAAAAAAFhAAAAAAAACgAAAAAAAAAWYWNjX3Jld2FyZF9wZXJfc2hhcmVfcAAAAAAACgAAAAAAAAAQYWRtaW5fZmVlX2Ftb3VudAAAAAoAAAAAAAAAEmFkbWluX2ZlZV9zaGFyZV9icAAAAAAACgAAAAAAAAAUYmFsYW5jZV9yYXRpb19taW5fYnAAAAAKAAAAAAAAAAtjYW5fZGVwb3NpdAAAAAABAAAAAAAAAAxjYW5fd2l0aGRyYXcAAAABAAAAAAAAAAFkAAAAAAAACgAAAAAAAAAIZGVjaW1hbHMAAAAEAAAAAAAAAAxmZWVfc2hhcmVfYnAAAAAKAAAAAAAAAAhyZXNlcnZlcwAAAAoAAAAAAAAABXRva2VuAAAAAAAAEwAAAAAAAAANdG9rZW5fYmFsYW5jZQAAAAAAAAoAAAAAAAAAD3RvdGFsX2xwX2Ftb3VudAAAAAAKAAAAAAAAAA12X3VzZF9iYWxhbmNlAAAAAAAACg==","AAAAAQAAAAAAAAAAAAAAC1VzZXJEZXBvc2l0AAAAAAIAAAAAAAAACWxwX2Ftb3VudAAAAAAAAAoAAAAAAAAAC3Jld2FyZF9kZWJ0AAAAAAo=","AAAAAQAAAAAAAAAAAAAABUFkbWluAAAAAAAAAQAAAAAAAAABMAAAAAAAABM=","AAAAAQAAAAAAAAAAAAAAEEdhc09yYWNsZUFkZHJlc3MAAAABAAAAAAAAAAEwAAAAAAAAEw==","AAAAAQAAAAAAAAAAAAAACEdhc1VzYWdlAAAAAQAAAAAAAAABMAAAAAAAA+wAAAAEAAAACg==","AAAAAQAAAAAAAAAAAAAAC05hdGl2ZVRva2VuAAAAAAEAAAAAAAAAATAAAAAAAAAT","AAAAAQAAAAAAAAAAAAAADVN0b3BBdXRob3JpdHkAAAAAAAABAAAAAAAAAAEwAAAAAAAAEw==","AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAKAAAAAAAAAANVW5pbXBsZW1lbnRlZAAAAAAAAAAAAAAAAAAAC0luaXRpYWxpemVkAAAAAAEAAAAAAAAADVVuaW5pdGlhbGl6ZWQAAAAAAAACAAAAAAAAAAxVbmF1dGhvcml6ZWQAAAADAAAAAAAAAApJbnZhbGlkQXJnAAAAAAAEAAAAAAAAAA5JbnZhbGlkQ2hhaW5JZAAAAAAABQAAAAAAAAATSW52YWxpZE90aGVyQ2hhaW5JZAAAAAAGAAAAAAAAAA5HYXNVc2FnZU5vdFNldAAAAAAABwAAAAAAAAANQnJva2VuQWRkcmVzcwAAAAAAAAgAAAAAAAAACE5vdEZvdW5kAAAACQAAAAAAAAAYVG9rZW5JbnN1ZmZpY2llbnRCYWxhbmNlAAAACgAAAAAAAAAKQ2FzdEZhaWxlZAAAAAAACwAAAAAAAAAMVTI1Nk92ZXJmbG93AAAADAAAAAAAAAAKWmVyb0Ftb3VudAAAAAAAZwAAAAAAAAAMUG9vbE92ZXJmbG93AAAAaAAAAAAAAAALWmVyb0NoYW5nZXMAAAAAaQAAAAAAAAARUmVzZXJ2ZXNFeGhhdXN0ZWQAAAAAAABqAAAAAAAAABpJbnN1ZmZpY2llbnRSZWNlaXZlZEFtb3VudAAAAAAAawAAAAAAAAAUQmFsYW5jZVJhdGlvRXhjZWVkZWQAAABsAAAAAAAAAAlGb3JiaWRkZW4AAAAAAABtAAAAAAAAABlVbmF1dGhvcml6ZWRTdG9wQXV0aG9yaXR5AAAAAAAAywAAAAAAAAAOU3dhcFByb2hpYml0ZWQAAAAAAMwAAAAAAAAAEkFtb3VudFRvb0xvd0ZvckZlZQAAAAAAzQAAAAAAAAAWQnJpZGdlVG9UaGVaZXJvQWRkcmVzcwAAAAAAzgAAAAAAAAAORW1wdHlSZWNpcGllbnQAAAAAAM8AAAAAAAAAE1NvdXJjZU5vdFJlZ2lzdGVyZWQAAAAA0AAAAAAAAAAVV3JvbmdEZXN0aW5hdGlvbkNoYWluAAAAAAAA0QAAAAAAAAATVW5rbm93bkFub3RoZXJDaGFpbgAAAADSAAAAAAAAABFUb2tlbnNBbHJlYWR5U2VudAAAAAAAANMAAAAAAAAAEE1lc3NhZ2VQcm9jZXNzZWQAAADUAAAAAAAAAAxOb3RFbm91Z2hGZWUAAADWAAAAAAAAAAlOb01lc3NhZ2UAAAAAAADXAAAAAAAAAA1Ob1JlY2VpdmVQb29sAAAAAAAA2AAAAAAAAAAGTm9Qb29sAAAAAADZAAAAAAAAABNVbmtub3duQW5vdGhlclRva2VuAAAAANoAAAAAAAAAD1dyb25nQnl0ZUxlbmd0aAAAAAEsAAAAAAAAAApIYXNNZXNzYWdlAAAAAAEtAAAAAAAAABdJbnZhbGlkUHJpbWFyeVNpZ25hdHVyZQAAAAEuAAAAAAAAABlJbnZhbGlkU2Vjb25kYXJ5U2lnbmF0dXJlAAAAAAABLwAAAAAAAAARTm9HYXNEYXRhRm9yQ2hhaW4AAAAAAAGQ"]),r);this.options=r}fromJSON={initialize:this.txFromJSON,deposit:this.txFromJSON,withdraw:this.txFromJSON,swap_to_v_usd:this.txFromJSON,swap_from_v_usd:this.txFromJSON,claim_rewards:this.txFromJSON,set_fee_share:this.txFromJSON,adjust_total_lp_amount:this.txFromJSON,set_balance_ratio_min_bp:this.txFromJSON,stop_deposit:this.txFromJSON,start_deposit:this.txFromJSON,stop_withdraw:this.txFromJSON,start_withdraw:this.txFromJSON,set_stop_authority:this.txFromJSON,set_bridge:this.txFromJSON,set_admin:this.txFromJSON,set_admin_fee_share:this.txFromJSON,claim_admin_fee:this.txFromJSON,pending_reward:this.txFromJSON,get_pool:this.txFromJSON,get_admin:this.txFromJSON,get_stop_authority:this.txFromJSON,get_bridge:this.txFromJSON,get_user_deposit:this.txFromJSON,upgrade:this.txFromJSON}};import{contract as tp,rpc as xs}from"@stellar/stellar-sdk";var ti=xs.Api;function wt(s){let{simulation:a,options:r}=s;if(!a)throw new Error("Soroban assembled transaction does not have simulation");if(ti.isSimulationSuccess(a))return a.result==null?void 0:r.parseResultXdr(a.result.retval);throw new Error(a.error)}function Ct(s){let{simulation:a}=s;if(!a)throw new Error("Soroban assembled transaction does not have simulation");return ti.isSimulationError(a)}var Gn=class extends ge{constructor(r,i,o){super();this.nodeRpcUrlsConfig=r;this.params=i;this.api=o}chainType="SRB";P=48;async getUserBalanceInfo(r,i){let c=await this.getContract(i.poolAddress).get_user_deposit({user:r});if(Ct(c))throw new y;let A=wt(c);if(!A)throw new y;let m=A.unwrap();return new oe({lpAmount:m.lp_amount.toString(),rewardDebt:m.reward_debt.toString()})}async getPoolInfoFromChain(r){let o=await this.getContract(r.poolAddress).get_pool();if(Ct(o))throw new y;let c=wt(o);if(!c)throw new y;let A=c.unwrap();return{aValue:A.a.toString(),accRewardPerShareP:A.acc_reward_per_share_p.toString(),dValue:A.d.toString(),tokenBalance:A.token_balance.toString(),p:this.P,totalLpAmount:A.total_lp_amount.toString(),vUsdBalance:A.v_usd_balance.toString(),imbalance:se({tokenBalance:A.token_balance.toString(),vUsdBalance:A.v_usd_balance.toString()})}}async buildRawTransactionDeposit(r){return(await this.getContract(r.token.poolAddress,r.accountAddress).deposit({sender:r.accountAddress,amount:BigInt(r.amount)})).toXDR()}async buildRawTransactionWithdraw(r){return(await this.getContract(r.token.poolAddress,r.accountAddress).withdraw({sender:r.accountAddress,amount_lp:BigInt(r.amount)})).toXDR()}async buildRawTransactionClaimRewards(r){return(await this.getContract(r.token.poolAddress,r.accountAddress).claim_rewards({sender:r.accountAddress})).toXDR()}getContract(r,i){let o={publicKey:i,contractId:r,networkPassphrase:this.params.sorobanNetworkPassphrase,rpcUrl:this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")};return new Nn(o)}};import{SuiClient as Us}from"@mysten/sui/client";import{Transaction as Yn}from"@mysten/sui/transactions";var Rt=Re(ze());z();z();import{bcs as ni}from"@mysten/sui/bcs";import{fromB64 as Ms}from"@mysten/sui/utils";function Un(s){return s=w(s),s.startsWith(`${et}::balance::Balance<`)}var ne=class s{__StructClass=!0;static get $typeName(){return`${et}::balance::Balance`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=s.$typeName;$fullTypeName;$typeArgs;$isPhantom=s.$isPhantom;value;constructor(a,r){this.$fullTypeName=U(s.$typeName,...a),this.$typeArgs=a,this.value=r.value}static reified(a){return{typeName:s.$typeName,fullTypeName:U(s.$typeName,k(a)),typeArgs:[k(a)],isPhantom:s.$isPhantom,reifiedTypeArgs:[a],fromFields:r=>s.fromFields(a,r),fromFieldsWithTypes:r=>s.fromFieldsWithTypes(a,r),fromBcs:r=>s.fromBcs(a,r),bcs:s.bcs,fromJSONField:r=>s.fromJSONField(a,r),fromJSON:r=>s.fromJSON(a,r),fromSuiParsedData:r=>s.fromSuiParsedData(a,r),fromSuiObjectData:r=>s.fromSuiObjectData(a,r),fetch:async(r,i)=>s.fetch(r,a,i),new:r=>new s([k(a)],r),kind:"StructClassReified"}}static get r(){return s.reified}static phantom(a){return Y(s.reified(a))}static get p(){return s.phantom}static get bcs(){return ni.struct("Balance",{value:ni.u64()})}static fromFields(a,r){return s.reified(a).new({value:N("u64",r.value)})}static fromFieldsWithTypes(a,r){if(!Un(r.type))throw new Error("not a Balance type");return je(r,[a]),s.reified(a).new({value:O("u64",r.fields.value)})}static fromBcs(a,r){return s.fromFields(a,s.bcs.parse(r))}toJSONField(){return{value:this.value.toString()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(a,r){return s.reified(a).new({value:D("u64",r.value)})}static fromJSON(a,r){if(r.$typeName!==s.$typeName)throw new Error("not a WithTwoGenerics json object");return xe(U(s.$typeName,k(a)),r.$typeArgs,[a]),s.fromJSONField(a,r)}static fromSuiParsedData(a,r){if(r.dataType!=="moveObject")throw new Error("not an object");if(!Un(r.type))throw new Error(`object at ${r.fields.id} is not a Balance object`);return s.fromFieldsWithTypes(a,r)}static fromSuiObjectData(a,r){if(r.bcs){if(r.bcs.dataType!=="moveObject"||!Un(r.bcs.type))throw new Error("object at is not a Balance object");let i=te(r.bcs.type).typeArgs;if(i.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${i.length}'`);let o=w(i[0]),c=w(k(a));if(o!==w(k(a)))throw new Error(`type argument mismatch: expected '${c}' but got '${o}'`);return s.fromBcs(a,Ms(r.bcs.bcsBytes))}if(r.content)return s.fromSuiParsedData(a,r.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(a,r,i){let o=await a.getObject({id:i,options:{showBcs:!0}});if(o.error)throw new Error(`error fetching Balance object at id ${i}: ${o.error.code}`);if(o.data?.bcs?.dataType!=="moveObject"||!Un(o.data.bcs.type))throw new Error(`object at id ${i} is not a Balance object`);return s.fromSuiObjectData(r,o.data)}};var _r=Re(ze());z();var jr=Re(ze());import{bcs as En}from"@mysten/sui/bcs";import{fromB64 as Os}from"@mysten/sui/utils";function Vn(s){return s=w(s),s.startsWith(`${jr.PKG_V1}::pool_rewards::PoolRewards<`)}var mt=class s{__StructClass=!0;static get $typeName(){return`${jr.PKG_V1}::pool_rewards::PoolRewards`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=s.$typeName;$fullTypeName;$typeArgs;$isPhantom=s.$isPhantom;accRewardPerShareP;adminFeeShareBp;adminFee;rewards;lpSupply;constructor(a,r){this.$fullTypeName=U(s.$typeName,...a),this.$typeArgs=a,this.accRewardPerShareP=r.accRewardPerShareP,this.adminFeeShareBp=r.adminFeeShareBp,this.adminFee=r.adminFee,this.rewards=r.rewards,this.lpSupply=r.lpSupply}static reified(a){return{typeName:s.$typeName,fullTypeName:U(s.$typeName,k(a)),typeArgs:[k(a)],isPhantom:s.$isPhantom,reifiedTypeArgs:[a],fromFields:r=>s.fromFields(a,r),fromFieldsWithTypes:r=>s.fromFieldsWithTypes(a,r),fromBcs:r=>s.fromBcs(a,r),bcs:s.bcs,fromJSONField:r=>s.fromJSONField(a,r),fromJSON:r=>s.fromJSON(a,r),fromSuiParsedData:r=>s.fromSuiParsedData(a,r),fromSuiObjectData:r=>s.fromSuiObjectData(a,r),fetch:async(r,i)=>s.fetch(r,a,i),new:r=>new s([k(a)],r),kind:"StructClassReified"}}static get r(){return s.reified}static phantom(a){return Y(s.reified(a))}static get p(){return s.phantom}static get bcs(){return En.struct("PoolRewards",{acc_reward_per_share_p:En.u128(),admin_fee_share_bp:En.u64(),admin_fee:ne.bcs,rewards:ne.bcs,lp_supply:En.u64()})}static fromFields(a,r){return s.reified(a).new({accRewardPerShareP:N("u128",r.acc_reward_per_share_p),adminFeeShareBp:N("u64",r.admin_fee_share_bp),adminFee:N(ne.reified(a),r.admin_fee),rewards:N(ne.reified(a),r.rewards),lpSupply:N("u64",r.lp_supply)})}static fromFieldsWithTypes(a,r){if(!Vn(r.type))throw new Error("not a PoolRewards type");return je(r,[a]),s.reified(a).new({accRewardPerShareP:O("u128",r.fields.acc_reward_per_share_p),adminFeeShareBp:O("u64",r.fields.admin_fee_share_bp),adminFee:O(ne.reified(a),r.fields.admin_fee),rewards:O(ne.reified(a),r.fields.rewards),lpSupply:O("u64",r.fields.lp_supply)})}static fromBcs(a,r){return s.fromFields(a,s.bcs.parse(r))}toJSONField(){return{accRewardPerShareP:this.accRewardPerShareP.toString(),adminFeeShareBp:this.adminFeeShareBp.toString(),adminFee:this.adminFee.toJSONField(),rewards:this.rewards.toJSONField(),lpSupply:this.lpSupply.toString()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(a,r){return s.reified(a).new({accRewardPerShareP:D("u128",r.accRewardPerShareP),adminFeeShareBp:D("u64",r.adminFeeShareBp),adminFee:D(ne.reified(a),r.adminFee),rewards:D(ne.reified(a),r.rewards),lpSupply:D("u64",r.lpSupply)})}static fromJSON(a,r){if(r.$typeName!==s.$typeName)throw new Error("not a WithTwoGenerics json object");return xe(U(s.$typeName,k(a)),r.$typeArgs,[a]),s.fromJSONField(a,r)}static fromSuiParsedData(a,r){if(r.dataType!=="moveObject")throw new Error("not an object");if(!Vn(r.type))throw new Error(`object at ${r.fields.id} is not a PoolRewards object`);return s.fromFieldsWithTypes(a,r)}static fromSuiObjectData(a,r){if(r.bcs){if(r.bcs.dataType!=="moveObject"||!Vn(r.bcs.type))throw new Error("object at is not a PoolRewards object");let i=te(r.bcs.type).typeArgs;if(i.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${i.length}'`);let o=w(i[0]),c=w(k(a));if(o!==w(k(a)))throw new Error(`type argument mismatch: expected '${c}' but got '${o}'`);return s.fromBcs(a,Os(r.bcs.bcsBytes))}if(r.content)return s.fromSuiParsedData(a,r.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(a,r,i){let o=await a.getObject({id:i,options:{showBcs:!0}});if(o.error)throw new Error(`error fetching PoolRewards object at id ${i}: ${o.error.code}`);if(o.data?.bcs?.dataType!=="moveObject"||!Vn(o.data.bcs.type))throw new Error(`object at id ${i} is not a PoolRewards object`);return s.fromSuiObjectData(r,o.data)}};z();var Zr=Re(ze());import{bcs as Bt}from"@mysten/sui/bcs";import{fromB64 as Ds}from"@mysten/sui/utils";function jn(s){return s=w(s),s.startsWith(`${Zr.PKG_V1}::pool_state::PoolState<`)}var ut=class s{__StructClass=!0;static get $typeName(){return`${Zr.PKG_V1}::pool_state::PoolState`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=s.$typeName;$fullTypeName;$typeArgs;$isPhantom=s.$isPhantom;tokenBalance;vusdBalance;d;a;balanceRatioMinBp;constructor(a,r){this.$fullTypeName=U(s.$typeName,...a),this.$typeArgs=a,this.tokenBalance=r.tokenBalance,this.vusdBalance=r.vusdBalance,this.d=r.d,this.a=r.a,this.balanceRatioMinBp=r.balanceRatioMinBp}static reified(a){return{typeName:s.$typeName,fullTypeName:U(s.$typeName,k(a)),typeArgs:[k(a)],isPhantom:s.$isPhantom,reifiedTypeArgs:[a],fromFields:r=>s.fromFields(a,r),fromFieldsWithTypes:r=>s.fromFieldsWithTypes(a,r),fromBcs:r=>s.fromBcs(a,r),bcs:s.bcs,fromJSONField:r=>s.fromJSONField(a,r),fromJSON:r=>s.fromJSON(a,r),fromSuiParsedData:r=>s.fromSuiParsedData(a,r),fromSuiObjectData:r=>s.fromSuiObjectData(a,r),fetch:async(r,i)=>s.fetch(r,a,i),new:r=>new s([k(a)],r),kind:"StructClassReified"}}static get r(){return s.reified}static phantom(a){return Y(s.reified(a))}static get p(){return s.phantom}static get bcs(){return Bt.struct("PoolState",{token_balance:Bt.u64(),vusd_balance:Bt.u64(),d:Bt.u64(),a:Bt.u64(),balance_ratio_min_bp:Bt.u64()})}static fromFields(a,r){return s.reified(a).new({tokenBalance:N("u64",r.token_balance),vusdBalance:N("u64",r.vusd_balance),d:N("u64",r.d),a:N("u64",r.a),balanceRatioMinBp:N("u64",r.balance_ratio_min_bp)})}static fromFieldsWithTypes(a,r){if(!jn(r.type))throw new Error("not a PoolState type");return je(r,[a]),s.reified(a).new({tokenBalance:O("u64",r.fields.token_balance),vusdBalance:O("u64",r.fields.vusd_balance),d:O("u64",r.fields.d),a:O("u64",r.fields.a),balanceRatioMinBp:O("u64",r.fields.balance_ratio_min_bp)})}static fromBcs(a,r){return s.fromFields(a,s.bcs.parse(r))}toJSONField(){return{tokenBalance:this.tokenBalance.toString(),vusdBalance:this.vusdBalance.toString(),d:this.d.toString(),a:this.a.toString(),balanceRatioMinBp:this.balanceRatioMinBp.toString()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(a,r){return s.reified(a).new({tokenBalance:D("u64",r.tokenBalance),vusdBalance:D("u64",r.vusdBalance),d:D("u64",r.d),a:D("u64",r.a),balanceRatioMinBp:D("u64",r.balanceRatioMinBp)})}static fromJSON(a,r){if(r.$typeName!==s.$typeName)throw new Error("not a WithTwoGenerics json object");return xe(U(s.$typeName,k(a)),r.$typeArgs,[a]),s.fromJSONField(a,r)}static fromSuiParsedData(a,r){if(r.dataType!=="moveObject")throw new Error("not an object");if(!jn(r.type))throw new Error(`object at ${r.fields.id} is not a PoolState object`);return s.fromFieldsWithTypes(a,r)}static fromSuiObjectData(a,r){if(r.bcs){if(r.bcs.dataType!=="moveObject"||!jn(r.bcs.type))throw new Error("object at is not a PoolState object");let i=te(r.bcs.type).typeArgs;if(i.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${i.length}'`);let o=w(i[0]),c=w(k(a));if(o!==w(k(a)))throw new Error(`type argument mismatch: expected '${c}' but got '${o}'`);return s.fromBcs(a,Ds(r.bcs.bcsBytes))}if(r.content)return s.fromSuiParsedData(a,r.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(a,r,i){let o=await a.getObject({id:i,options:{showBcs:!0}});if(o.error)throw new Error(`error fetching PoolState object at id ${i}: ${o.error.code}`);if(o.data?.bcs?.dataType!=="moveObject"||!jn(o.data.bcs.type))throw new Error(`object at id ${i} is not a PoolState object`);return s.fromSuiObjectData(r,o.data)}};import{bcs as Ht}from"@mysten/sui/bcs";import{fromB64 as Ws}from"@mysten/sui/utils";function Zn(s){return s=w(s),s.startsWith(`${_r.PKG_V1}::pool::Pool<`)}var _n=class s{__StructClass=!0;static get $typeName(){return`${_r.PKG_V1}::pool::Pool`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=s.$typeName;$fullTypeName;$typeArgs;$isPhantom=s.$isPhantom;id;state;rewards;feeShareBp;canDeposit;canWithdraw;decimals;balance;constructor(a,r){this.$fullTypeName=U(s.$typeName,...a),this.$typeArgs=a,this.id=r.id,this.state=r.state,this.rewards=r.rewards,this.feeShareBp=r.feeShareBp,this.canDeposit=r.canDeposit,this.canWithdraw=r.canWithdraw,this.decimals=r.decimals,this.balance=r.balance}static reified(a){return{typeName:s.$typeName,fullTypeName:U(s.$typeName,k(a)),typeArgs:[k(a)],isPhantom:s.$isPhantom,reifiedTypeArgs:[a],fromFields:r=>s.fromFields(a,r),fromFieldsWithTypes:r=>s.fromFieldsWithTypes(a,r),fromBcs:r=>s.fromBcs(a,r),bcs:s.bcs,fromJSONField:r=>s.fromJSONField(a,r),fromJSON:r=>s.fromJSON(a,r),fromSuiParsedData:r=>s.fromSuiParsedData(a,r),fromSuiObjectData:r=>s.fromSuiObjectData(a,r),fetch:async(r,i)=>s.fetch(r,a,i),new:r=>new s([k(a)],r),kind:"StructClassReified"}}static get r(){return s.reified}static phantom(a){return Y(s.reified(a))}static get p(){return s.phantom}static get bcs(){return Ht.struct("Pool",{id:Pe.bcs,state:ut.bcs,rewards:mt.bcs,fee_share_bp:Ht.u64(),can_deposit:Ht.bool(),can_withdraw:Ht.bool(),decimals:Ht.u8(),balance:ne.bcs})}static fromFields(a,r){return s.reified(a).new({id:N(Pe.reified(),r.id),state:N(ut.reified(a),r.state),rewards:N(mt.reified(a),r.rewards),feeShareBp:N("u64",r.fee_share_bp),canDeposit:N("bool",r.can_deposit),canWithdraw:N("bool",r.can_withdraw),decimals:N("u8",r.decimals),balance:N(ne.reified(a),r.balance)})}static fromFieldsWithTypes(a,r){if(!Zn(r.type))throw new Error("not a Pool type");return je(r,[a]),s.reified(a).new({id:O(Pe.reified(),r.fields.id),state:O(ut.reified(a),r.fields.state),rewards:O(mt.reified(a),r.fields.rewards),feeShareBp:O("u64",r.fields.fee_share_bp),canDeposit:O("bool",r.fields.can_deposit),canWithdraw:O("bool",r.fields.can_withdraw),decimals:O("u8",r.fields.decimals),balance:O(ne.reified(a),r.fields.balance)})}static fromBcs(a,r){return s.fromFields(a,s.bcs.parse(r))}toJSONField(){return{id:this.id,state:this.state.toJSONField(),rewards:this.rewards.toJSONField(),feeShareBp:this.feeShareBp.toString(),canDeposit:this.canDeposit,canWithdraw:this.canWithdraw,decimals:this.decimals,balance:this.balance.toJSONField()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(a,r){return s.reified(a).new({id:D(Pe.reified(),r.id),state:D(ut.reified(a),r.state),rewards:D(mt.reified(a),r.rewards),feeShareBp:D("u64",r.feeShareBp),canDeposit:D("bool",r.canDeposit),canWithdraw:D("bool",r.canWithdraw),decimals:D("u8",r.decimals),balance:D(ne.reified(a),r.balance)})}static fromJSON(a,r){if(r.$typeName!==s.$typeName)throw new Error("not a WithTwoGenerics json object");return xe(U(s.$typeName,k(a)),r.$typeArgs,[a]),s.fromJSONField(a,r)}static fromSuiParsedData(a,r){if(r.dataType!=="moveObject")throw new Error("not an object");if(!Zn(r.type))throw new Error(`object at ${r.fields.id} is not a Pool object`);return s.fromFieldsWithTypes(a,r)}static fromSuiObjectData(a,r){if(r.bcs){if(r.bcs.dataType!=="moveObject"||!Zn(r.bcs.type))throw new Error("object at is not a Pool object");let i=te(r.bcs.type).typeArgs;if(i.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${i.length}'`);let o=w(i[0]),c=w(k(a));if(o!==w(k(a)))throw new Error(`type argument mismatch: expected '${c}' but got '${o}'`);return s.fromBcs(a,Ws(r.bcs.bcsBytes))}if(r.content)return s.fromSuiParsedData(a,r.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(a,r,i){let o=await a.getObject({id:i,options:{showBcs:!0}});if(o.error)throw new Error(`error fetching Pool object at id ${i}: ${o.error.code}`);if(o.data?.bcs?.dataType!=="moveObject"||!Zn(o.data.bcs.type))throw new Error(`object at id ${i} is not a Pool object`);return s.fromSuiObjectData(r,o.data)}};z();var Jr=Re(ze());import{bcs as $r}from"@mysten/sui/bcs";import{fromB64 as Ns}from"@mysten/sui/utils";function $n(s){return s=w(s),s.startsWith(`${Jr.PKG_V1}::user_deposit::UserDeposit<`)}var Jn=class s{__StructClass=!0;static get $typeName(){return`${Jr.PKG_V1}::user_deposit::UserDeposit`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=s.$typeName;$fullTypeName;$typeArgs;$isPhantom=s.$isPhantom;id;lpAmount;rewardDebt;constructor(a,r){this.$fullTypeName=U(s.$typeName,...a),this.$typeArgs=a,this.id=r.id,this.lpAmount=r.lpAmount,this.rewardDebt=r.rewardDebt}static reified(a){return{typeName:s.$typeName,fullTypeName:U(s.$typeName,k(a)),typeArgs:[k(a)],isPhantom:s.$isPhantom,reifiedTypeArgs:[a],fromFields:r=>s.fromFields(a,r),fromFieldsWithTypes:r=>s.fromFieldsWithTypes(a,r),fromBcs:r=>s.fromBcs(a,r),bcs:s.bcs,fromJSONField:r=>s.fromJSONField(a,r),fromJSON:r=>s.fromJSON(a,r),fromSuiParsedData:r=>s.fromSuiParsedData(a,r),fromSuiObjectData:r=>s.fromSuiObjectData(a,r),fetch:async(r,i)=>s.fetch(r,a,i),new:r=>new s([k(a)],r),kind:"StructClassReified"}}static get r(){return s.reified}static phantom(a){return Y(s.reified(a))}static get p(){return s.phantom}static get bcs(){return $r.struct("UserDeposit",{id:Pe.bcs,lp_amount:$r.u64(),reward_debt:$r.u64()})}static fromFields(a,r){return s.reified(a).new({id:N(Pe.reified(),r.id),lpAmount:N("u64",r.lp_amount),rewardDebt:N("u64",r.reward_debt)})}static fromFieldsWithTypes(a,r){if(!$n(r.type))throw new Error("not a UserDeposit type");return je(r,[a]),s.reified(a).new({id:O(Pe.reified(),r.fields.id),lpAmount:O("u64",r.fields.lp_amount),rewardDebt:O("u64",r.fields.reward_debt)})}static fromBcs(a,r){return s.fromFields(a,s.bcs.parse(r))}toJSONField(){return{id:this.id,lpAmount:this.lpAmount.toString(),rewardDebt:this.rewardDebt.toString()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(a,r){return s.reified(a).new({id:D(Pe.reified(),r.id),lpAmount:D("u64",r.lpAmount),rewardDebt:D("u64",r.rewardDebt)})}static fromJSON(a,r){if(r.$typeName!==s.$typeName)throw new Error("not a WithTwoGenerics json object");return xe(U(s.$typeName,k(a)),r.$typeArgs,[a]),s.fromJSONField(a,r)}static fromSuiParsedData(a,r){if(r.dataType!=="moveObject")throw new Error("not an object");if(!$n(r.type))throw new Error(`object at ${r.fields.id} is not a UserDeposit object`);return s.fromFieldsWithTypes(a,r)}static fromSuiObjectData(a,r){if(r.bcs){if(r.bcs.dataType!=="moveObject"||!$n(r.bcs.type))throw new Error("object at is not a UserDeposit object");let i=te(r.bcs.type).typeArgs;if(i.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${i.length}'`);let o=w(i[0]),c=w(k(a));if(o!==w(k(a)))throw new Error(`type argument mismatch: expected '${c}' but got '${o}'`);return s.fromBcs(a,Ns(r.bcs.bcsBytes))}if(r.content)return s.fromSuiParsedData(a,r.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(a,r,i){let o=await a.getObject({id:i,options:{showBcs:!0}});if(o.error)throw new Error(`error fetching UserDeposit object at id ${i}: ${o.error.code}`);if(o.data?.bcs?.dataType!=="moveObject"||!$n(o.data.bcs.type))throw new Error(`object at id ${i} is not a UserDeposit object`);return s.fromSuiObjectData(r,o.data)}};function ai(s,a,r){if(a.length===0||!a[0])return[];let i=a[0],o=s.reduce((m,u)=>m+BigInt(u),BigInt(0)),c=BigInt(i.balance),A=[];for(let m of a.slice(1)){if(c>o)return ri(r,i,A,s);c+=BigInt(m.balance),A.push(m)}return c>=o?ri(r,i,A,s):[]}function ri(s,a,r,i){let o=i.map(c=>s.pure.u64(c));return r.length>0&&s.mergeCoins(a.coinObjectId,r.map(c=>c.coinObjectId)),s.splitCoins(a.coinObjectId,o)}var Gs="0x0000000000000000000000000000000000000000000000000000000000000000";async function ii(s,a,r){let i=await s.devInspectTransactionBlock({sender:Gs,transactionBlock:a});if(i.effects.status.status!=="success")throw new Error(`inspectionResult failed. ${JSON.stringify(i,null,2)}`);let o=i.results?.pop()?.returnValues?.pop();if(!o)throw new Error(`Something with inspectionResult went wrong. ${JSON.stringify(i,null,2)}`);let[c,A]=o;return typeof r=="object"?r.fromBcs(Uint8Array.from(c)).toJSONField():Yt(r).parse(Uint8Array.from(c))}var Ln=class extends ge{constructor(r,i){super();this.suiRpcUrl=r;this.api=i;this.client=new Us({url:r})}chainType="SUI";client;async getUserBalanceInfo(r,i){if(!i.originTokenAddress)throw new y("SUI token must contain 'originTokenAddress'");let o=i.suiAddresses;if(!o)throw new y("SUI token must contain 'suiAddresses'");(0,Rt.setAddress)(o.bridgeAddress,o.bridgeAddressOrigin);let A=(await this.fetchDeposits(r,i.originTokenAddress)).reduce((m,u)=>{if(u.data)return m.lpAmount+=BigInt(u.data.content.fields.lp_amount),m.rewardDebt+=BigInt(u.data.content.fields.reward_debt),m;throw new y("Deposits fetch failed")},{lpAmount:BigInt(0),rewardDebt:BigInt(0)});return new oe({lpAmount:A.lpAmount.toString(),rewardDebt:A.rewardDebt.toString()})}async fetchDeposits(r,i){return await Ze(o=>this.client.getOwnedObjects({owner:r,filter:{StructType:Jn.phantom(Y(i)).phantomType},options:{showContent:!0},cursor:o}))}async getPoolInfoFromChain(r){let i=r.suiAddresses;if(!i)throw new y("SUI token must contain 'suiAddresses'");if((0,Rt.setAddress)(i.bridgeAddress,i.bridgeAddressOrigin),!r.originTokenAddress)throw new y("SUI token must contain 'originTokenAddress'");let o=48,c=new Yn;Va(c,r.originTokenAddress,i.bridgeObjectAddress);let A=await ii(this.client,c,_n.reified(Y(r.originTokenAddress))),m=A.state.tokenBalance,u=A.state.vusdBalance,d=se({tokenBalance:m,vUsdBalance:u});return{dValue:A.state.d,aValue:A.state.a,totalLpAmount:A.rewards.lpSupply,vUsdBalance:u,tokenBalance:m,accRewardPerShareP:A.rewards.accRewardPerShareP,p:o,imbalance:d}}async buildRawTransactionDeposit(r){let i=r.token.suiAddresses;if(!i)throw new y("SUI token must contain 'suiAddresses'");if((0,Rt.setAddress)(i.bridgeAddress,i.bridgeAddressOrigin),!r.token.originTokenAddress)throw new y("SUI token must contain 'originTokenAddress'");let o=await Ze(p=>this.client.getCoins({owner:r.accountAddress,coinType:r.token.originTokenAddress,cursor:p}));if(o.length===0||!o[0])throw new $e("No coins to deposit");let c=o[0],A=new Yn;A.setSender(r.accountAddress);let{depositObj:m,isNewDeposit:u}=await this.getDepositObject(r.accountAddress,r.token.originTokenAddress,A),[d]=ai([r.amount],o,A);if(!d)throw new $e("No coins to deposit");if(!r.token.originTokenAddress)throw new y("SUI token must contain 'originTokenAddress'");let l=Ga(A,r.token.originTokenAddress,{bridge:i.bridgeObjectAddress,userDeposit:m,coin:d});return A.mergeCoins(c.coinObjectId,[l]),u&&A.transferObjects([m],r.accountAddress),await A.toJSON({client:this.client})}async getDepositObject(r,i,o){let c=await this.fetchDeposits(r,i);if(c.length===0||!c[0]){let A=Y(i).phantomType;return{depositObj:ja(o,A),isNewDeposit:!0}}else{if(c[0].data?.objectId)return{depositObj:c[0].data.objectId,isNewDeposit:!1};throw new y("Something went wrong while deposit")}}async buildRawTransactionWithdraw(r){let i=r.token.suiAddresses;if(!i)throw new y("SUI token must contain 'suiAddresses'");if((0,Rt.setAddress)(i.bridgeAddress,i.bridgeAddressOrigin),!r.token.originTokenAddress)throw new y("SUI token must contain 'originTokenAddress'");let o=Y(r.token.originTokenAddress).phantomType,c=new Yn;c.setSender(r.accountAddress);let{depositObj:A,isNewDeposit:m}=await this.getDepositObject(r.accountAddress,r.token.originTokenAddress,c);if(m)throw new $e("No deposit found");let u=Ua(c,o,{bridge:i.bridgeObjectAddress,userDeposit:A,amountLp:BigInt(r.amount)}),d=await Ze(l=>this.client.getCoins({owner:r.accountAddress,coinType:r.token.originTokenAddress,cursor:l}));if(!u[0]||!u[1])throw new y("No rewards found");return d[0]?c.mergeCoins(d[0].coinObjectId,[u[0],u[1]]):(c.mergeCoins(u[0],[u[1]]),c.transferObjects([u[0]],r.accountAddress)),await c.toJSON({client:this.client})}async buildRawTransactionClaimRewards(r){let i=r.token.suiAddresses;if(!i)throw new y("SUI token must contain 'suiAddresses'");if((0,Rt.setAddress)(i.bridgeAddress,i.bridgeAddressOrigin),!r.token.originTokenAddress)throw new y("SUI token must contain 'originTokenAddress'");let o=Y(r.token.originTokenAddress).phantomType,c=new Yn;c.setSender(r.accountAddress);let{depositObj:A,isNewDeposit:m}=await this.getDepositObject(r.accountAddress,r.token.originTokenAddress,c);if(m)throw new $e("No deposit found");let u=Ea(c,o,{bridge:i.bridgeObjectAddress,userDeposit:A}),d=await Ze(l=>this.client.getCoins({owner:r.accountAddress,coinType:r.token.originTokenAddress,cursor:l}));return d[0]?c.mergeCoins(d[0].coinObjectId,[u]):c.transferObjects([u],r.accountAddress),await c.toJSON({client:this.client})}};import{Web3 as Xn}from"web3";import{encodeFunctionCall as Es}from"web3-eth-abi";var Qt=class extends ge{constructor(r,i,o){super();this.tronWeb=r;this.api=i;this.tronJsonRpc=o}chainType="TRX";P=52;async getUserBalanceInfo(r,i){let o;if(this.tronJsonRpc)try{o=await this.getUserBalanceInfoByBatch(this.tronJsonRpc,r,i)}catch{o=await this.getUserBalanceInfoPerProperty(r,i)}else o=await this.getUserBalanceInfoPerProperty(r,i);return o}async getUserBalanceInfoByBatch(r,i,o){let c=jt(o.poolAddress),A=jt(i),m=[{jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:c,data:this.getFunctionAbi("userRewardDebt",A)},"latest"]},{jsonrpc:"2.0",id:2,method:"eth_call",params:[{to:c,data:this.getFunctionAbi("balanceOf",A)},"latest"]}],d=await(await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(m)})).json();if(Array.isArray(d)&&d.length===2){let l=p=>{let g=d.find(T=>T.id===p);if(!g||!g.result)throw new Error(`Missing or invalid result for id ${p}`);return Xn.utils.toBigInt(g.result).toString()};return new oe({lpAmount:Xn.utils.toBigInt(l(2)).toString(),rewardDebt:Xn.utils.toBigInt(l(1)).toString()})}throw new Error("Batched HTTP call failed")}async getUserBalanceInfoPerProperty(r,i){this.tronWeb.defaultAddress.base58||this.tronWeb.setAddress(r);let o=this.getContract(i.poolAddress),c=(await o.methods.userRewardDebt(r).call()).toString(),A=(await o.methods.balanceOf(r).call()).toString();return new oe({lpAmount:A,rewardDebt:c})}async getPoolInfoFromChain(r){let i;if(this.tronJsonRpc)try{i=await this.getPoolInfoByBatch(this.tronJsonRpc,r)}catch{i=await this.getPoolInfoPerProperty(r)}else i=await this.getPoolInfoPerProperty(r);return i}async getPoolInfoByBatch(r,i){let o=jt(i.poolAddress),c=[{jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:o,data:this.getFunctionAbi("a")},"latest"]},{jsonrpc:"2.0",id:2,method:"eth_call",params:[{to:o,data:this.getFunctionAbi("d")},"latest"]},{jsonrpc:"2.0",id:3,method:"eth_call",params:[{to:o,data:this.getFunctionAbi("tokenBalance")},"latest"]},{jsonrpc:"2.0",id:4,method:"eth_call",params:[{to:o,data:this.getFunctionAbi("vUsdBalance")},"latest"]},{jsonrpc:"2.0",id:5,method:"eth_call",params:[{to:o,data:this.getFunctionAbi("totalSupply")},"latest"]},{jsonrpc:"2.0",id:6,method:"eth_call",params:[{to:o,data:this.getFunctionAbi("accRewardPerShareP")},"latest"]}],m=await(await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)})).json();if(Array.isArray(m)&&m.length===6){let u=g=>{let T=m.find(C=>C.id===g);if(!T||!T.result)throw new Error(`Missing or invalid result for id ${g}`);return Xn.utils.toBigInt(T.result).toString()},d=u(3),l=u(4),p=se({tokenBalance:d,vUsdBalance:l});return{aValue:u(1),dValue:u(2),tokenBalance:d,vUsdBalance:l,totalLpAmount:u(5),accRewardPerShareP:u(6),p:this.P,imbalance:p}}throw new Error("Batched pool info call failed")}async getPoolInfoPerProperty(r){this.tronWeb.defaultAddress.base58||this.tronWeb.setAddress(r.poolAddress);let i=this.getContract(r.poolAddress),[o,c,A,m,u,d]=await Promise.all([i.methods.a().call(),i.methods.d().call(),i.methods.tokenBalance().call(),i.methods.vUsdBalance().call(),i.methods.totalSupply().call(),i.methods.accRewardPerShareP().call()]),l=A.toString(),p=m.toString(),g=se({tokenBalance:l,vUsdBalance:p});return{aValue:o.toString(),dValue:c.toString(),tokenBalance:l,vUsdBalance:p,totalLpAmount:u.toString(),accRewardPerShareP:d.toString(),p:this.P,imbalance:g}}buildRawTransactionDeposit(r){let{amount:i,accountAddress:o}=r,c=[{type:"uint256",value:i}];return this.buildRawTransaction(r.token.poolAddress,"deposit(uint256)",c,"0",o)}buildRawTransactionWithdraw(r){let{amount:i,accountAddress:o}=r,c=[{type:"uint256",value:i}];return this.buildRawTransaction(r.token.poolAddress,"withdraw(uint256)",c,"0",o)}buildRawTransactionClaimRewards(r){let{accountAddress:i}=r,o=[];return this.buildRawTransaction(r.token.poolAddress,"claimRewards()",o,"0",i)}async buildRawTransaction(r,i,o,c,A){let m=await this.tronWeb.transactionBuilder.triggerSmartContract(r,i,{callValue:+c},o,A);if(!m?.result?.result)throw new y("Unknown error: "+JSON.stringify(m,null,2));return m.transaction}getContract(r){return this.tronWeb.contract(Xt.abi,r)}getFunctionAbi(r,...i){let o=Xt.abi.find(c=>c.type==="function"&&"name"in c&&c.name===r);if(!o)throw new Error(`${r} method not found in Pool ABI`);return Es(o,i)}};var Kn=class{constructor(a,r,i,o){this.api=a;this.nodeRpcUrlsConfig=r;this.params=i;this.tokenService=o;this.rawTxBuilder=new Dn(a,r,this.params,o);let c=i.cachePoolInfoChainSec>0?i.cachePoolInfoChainSec*1e3:20*1e3;this.cache=new js({defaultTtl:c})}rawTxBuilder;cache;async getAllowance(a,r){if(r){let i=a,o=r;return await this.tokenService.getAllowance({...o,spender:o.token.poolAddress},i)}else{let i=a;return await this.tokenService.getAllowance({...i,spender:i.token.poolAddress})}}async checkAllowance(a,r){if(r){let i=a,o=r;return this.tokenService.checkAllowance({...o,spender:o.token.poolAddress},i)}else{let i=a;return this.tokenService.checkAllowance({...i,spender:i.token.poolAddress})}}async approve(a,r){return this.tokenService.approve(a,{...r,spender:r.token.poolAddress})}async getAmountToBeDeposited(a,r,i){M(a),W("amount",a,r.decimals);let o=await this.getPoolInfoFromChain(r,i),{vUsdBalance:c,tokenBalance:A,aValue:m,dValue:u}=o,d=za(a,m,u,A,c);return R(d,3).toFixed()}async getAmountToBeWithdrawn(a,r,i,o){M(a),W("amount",a,i.decimals);let c=await this.getPoolInfoFromChain(i,o),A=qa(a),m=de(A,i.decimals),d=(await this.getUserBalanceInfo(r,i,o)).earned(c)||"0",l=Vs(m).plus(d).toFixed();return R(l,i.decimals).toFixed()}async getUserBalanceInfo(a,r,i){return Pt(r.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,i).getUserBalanceInfo(a,r)}async getPoolInfoFromChain(a,r){let i={chainSymbol:a.chainSymbol,poolAddress:a.poolAddress},o=this.cache.get(i);if(o)return o;{let c=await Pt(a.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,r).getPoolInfoFromChain(a);return this.cache.put(i,c),this.api.cachePut({chainSymbol:a.chainSymbol,poolAddress:a.poolAddress},c),c}}};function Pt(s,a,r,i,o){switch(x.getChainProperty(s).chainType){case"EVM":{if(o)return new Kt(o,a);{let c=r.getNodeRpcUrl(s),A=new Js(c);return A.defaultReturnFormat={number:$s.STR,bytes:_s.HEX},new Kt(A,a)}}case"TRX":{let c=r.getNodeRpcUrl(s),A=i.tronJsonRpc;if(o)return new Qt(o,a,A);{let m=new Zs({fullHost:c});return new Qt(m,a,A)}}case"SOLANA":{let c=r.getNodeRpcUrl(s);return new Wn(c,a)}case"SRB":return new Gn(r,i,a);case"SUI":return new Ln(r.getNodeRpcUrl(s),a)}}import{TronWeb as Xs}from"tronweb";import{FMT_BYTES as Ks,FMT_NUMBER as Hs,Web3 as Qs}from"web3";var Ys={abi:[{inputs:[{internalType:"string",name:"tokenName_",type:"string"},{internalType:"string",name:"tokenSymbol_",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"lpAmount",type:"uint256"}],name:"Deposited",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"address",name:"token",type:"address"}],name:"DepositedRewards",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256[4]",name:"values",type:"uint256[4]"}],name:"MultiTransfer",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdrawn",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[],name:"NUM_TOKENS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"},{internalType:"uint256",name:"minVirtualAmount",type:"uint256"}],name:"deposit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"depositRewards",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"}],name:"getEstimatedAmountOnDeposit",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"index",type:"uint256"}],name:"getRewardsAmount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"},{internalType:"uint256",name:"virtualAmount",type:"uint256"}],name:"getWithdrawProportionAmount",outputs:[{internalType:"uint256[4]",name:"",type:"uint256[4]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"pools",outputs:[{internalType:"contract IPool",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"index",type:"uint256"},{internalType:"contract IPool",name:"pool",type:"address"}],name:"setPool",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"index",type:"uint256"}],name:"subBalanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"index",type:"uint256"}],name:"subDepositRewards",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"index",type:"uint256"}],name:"subTotalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"}],name:"subTransfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"}],name:"subTransferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"virtualAmount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"}],name:"subWithdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"tokens",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"virtualAmount",type:"uint256"}],name:"withdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},Hn=Ys;var dt=class{};var zt=class extends dt{constructor(r,i){super();this.web3=r;this.api=i}chainType="EVM";async balanceOf(r){let i=(await this.getYieldContract(r.token.yieldAddress).methods.balanceOf(r.owner).call()).toString();return R(i,3).toFixed()}async getEstimatedAmountOnDeposit(r){let i=I(r.amount,r.token.decimals).toFixed(),o=(await this.getYieldContract(r.token.yieldAddress).methods.getEstimatedAmountOnDeposit(i,r.token.yieldId).call()).toString();return R(o,3).toFixed()}async getWithdrawProportionAmount(r){let i=I(r.amount,3).toFixed();return await this.getYieldContract(r.cydToken.yieldAddress).methods.getWithdrawProportionAmount(r.owner,i).call()}async buildRawTransactionDeposit(r){return Promise.resolve({...this.buildTxParams({owner:r.owner,yieldAddress:r.token.yieldAddress}),data:this.getYieldContract(r.token.yieldAddress).methods.deposit(r.amount,r.token.yieldId,r.minVirtualAmount).encodeABI()})}async buildRawTransactionWithdraw(r){return Promise.resolve({...this.buildTxParams({owner:r.owner,yieldAddress:r.token.yieldAddress}),data:this.getYieldContract(r.token.yieldAddress).methods.withdraw(r.amount).encodeABI()})}buildTxParams(r){return{from:r.owner,to:r.yieldAddress,value:"0"}}getYieldContract(r){return new this.web3.eth.Contract(Hn.abi,r)}};var Qn=class{constructor(a,r,i,o){this.api=a;this.nodeRpcUrlsConfig=r;this.params=i;this.tokenService=o}async approve(a,r){return this.tokenService.buildRawTransactionApprove({...a,spender:a.token.yieldAddress},r)}async deposit(a,r){return M(a.amount),W("amount",a.amount,a.token.decimals),M(a.minVirtualAmount),W("minVirtualAmount",a.minVirtualAmount,3),a.amount=I(a.amount,a.token.decimals).toFixed(),a.minVirtualAmount=I(a.minVirtualAmount,3).toFixed(),It(a.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,a.owner,r).buildRawTransactionDeposit(a)}async withdraw(a,r){return M(a.amount),W("amount",a.amount,3),a.amount=I(a.amount,3).toFixed(),It(a.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,a.owner,r).buildRawTransactionWithdraw(a)}};var qt=class extends dt{constructor(r,i){super();this.tronWeb=r;this.api=i}chainType="TRX";async balanceOf(r){let i=(await(await this.getContract(r.token.yieldAddress)).methods.balanceOf(r.owner).call()).toString();return R(i,3).toFixed()}async getEstimatedAmountOnDeposit(r){let i=I(r.amount,r.token.decimals).toFixed(),o=(await(await this.getContract(r.token.yieldAddress)).methods.getEstimatedAmountOnDeposit(i,r.token.yieldId).call()).toString();return R(o,3).toFixed()}async getWithdrawProportionAmount(r){let i=I(r.amount,3).toFixed();return(await(await this.getContract(r.cydToken.yieldAddress)).methods.getWithdrawProportionAmount(r.owner,i).call()).toString().split(",")}async buildRawTransactionDeposit(r){let{amount:i,owner:o,token:c,minVirtualAmount:A}=r,m=[{type:"uint256",value:i},{type:"uint256",value:c.yieldId},{type:"uint256",value:A}];return this.buildRawTransaction(r.token.yieldAddress,"deposit(uint256,uint256,uint256)",m,"0",o)}async buildRawTransactionWithdraw(r){let{amount:i,owner:o}=r,c=[{type:"uint256",value:i}];return this.buildRawTransaction(r.token.yieldAddress,"withdraw(uint256)",c,"0",o)}async buildRawTransaction(r,i,o,c,A){let m=await this.tronWeb.transactionBuilder.triggerSmartContract(r,i,{callValue:+c},o,A);if(!m?.result?.result)throw new y("Unknown error: "+JSON.stringify(m,null,2));return m.transaction}getContract(r){return this.tronWeb.contract(Hn.abi,r)}};function Ls(s){if(!zn(s))throw new dn("Token does not support Yield")}function zn(s){return!!s.yieldAddress&&s.yieldId!==void 0}var qn=class{constructor(a,r,i,o){this.api=a;this.nodeRpcUrlsConfig=r;this.params=i;this.tokenService=o;this.rawTxBuilder=new Qn(a,r,i,o)}rawTxBuilder;async getCYDTokens(){let a=[],r=await this.api.getChainDetailsMap("pool");return Object.values(r).forEach(i=>{if(i.yieldAddress){let o=i.tokens.find(A=>A.tokenAddress===i.yieldAddress),c=i.tokens.filter(zn);if(c.length>0){let A=o??{allbridgeChainId:i.allbridgeChainId,apr:"",apr30d:"",apr7d:"",bridgeAddress:i.bridgeAddress,chainId:i.chainId,chainName:i.name,chainSymbol:i.chainSymbol,chainType:i.chainType,confirmations:i.confirmations,decimals:3,feeShare:"",lpRate:"",name:"Core Yield",poolAddress:"",symbol:"CYD",tokenAddress:i.yieldAddress,transferTime:{},txCostAmount:{maxAmount:"0",swap:"0",transfer:"0"},yieldAddress:i.yieldAddress};a.push({...A,yieldAddress:i.yieldAddress,tokens:c})}}}),a}async getAllowance(a,r){return await this.tokenService.getAllowance({...a,spender:a.token.yieldAddress},r)}async checkAllowance(a,r){return this.tokenService.checkAllowance({...a,spender:a.token.yieldAddress},r)}async balanceOf(a,r){return It(a.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,a.owner,r).balanceOf(a)}async getEstimatedAmountOnDeposit(a,r){return M(a.amount),W("amount",a.amount,a.token.decimals),It(a.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,a.token.yieldAddress,r).getEstimatedAmountOnDeposit(a)}async getWithdrawAmounts(a,r){M(a.amount),W("amount",a.amount,3);let i=await It(a.cydToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,a.owner,r).getWithdrawProportionAmount(a);return a.cydToken.tokens.filter(o=>i[o.yieldId]!==void 0).map(o=>({amount:R(i[o.yieldId],o.decimals).toFixed(),token:o}))}};function It(s,a,r,i,o){switch(x.getChainProperty(s).chainType){case"EVM":{if(o)return new zt(o,a);{let c=r.getNodeRpcUrl(s),A=new Qs(c);return A.defaultReturnFormat={number:Hs.STR,bytes:Ks.HEX},new zt(A,a)}}case"TRX":{if(o)return new qt(o,a);{let c=r.getNodeRpcUrl(s),A=new Xs({fullHost:c});return A.setAddress(i),new qt(A,a)}}case"SOLANA":throw new J;case"SRB":throw new J;case"SUI":throw new J}}import{Big as X}from"big.js";function ci(s,a,r){let i=zs(s,{decimals:a.decimals,feeShare:a.feeShare},a.poolInfo),o=qs(i.amountIncludingCommissionInSystemPrecision,{decimals:r.decimals,feeShare:r.feeShare},r.poolInfo);return{swapToVUsdCalcResult:i,swapFromVUsdCalcResult:o}}function Ai(s,a,r){let i=eo(s,{decimals:r.decimals,feeShare:r.feeShare},r.poolInfo),o=to(i.amountIncludingCommissionInSystemPrecision,{decimals:a.decimals,feeShare:a.feeShare},a.poolInfo);return{swapToVUsdCalcResult:i,swapFromVUsdCalcResult:o}}function zs(s,{feeShare:a,decimals:r},i){let o=X(s),c=o.times(a),A=o.minus(c);return{bridgeFeeInTokenPrecision:c.round().toFixed(),amountIncludingCommissionInSystemPrecision:si(it(A,r),i),amountExcludingCommissionInSystemPrecision:si(it(o,r),i)}}function si(s,a){if(s.eq(0))return"0";let r=X(a.tokenBalance).plus(s),i=Ue(r.toFixed(),a.aValue,a.dValue);return X(a.vUsdBalance).minus(i).round().toFixed()}function qs(s,{feeShare:a,decimals:r},i){if(X(s).eq(0))return{bridgeFeeInTokenPrecision:"0",amountIncludingCommissionInTokenPrecision:"0",amountExcludingCommissionInTokenPrecision:"0"};let c=X(s).plus(i.vUsdBalance),A=Ue(c,i.aValue,i.dValue),m=de(X(i.tokenBalance).minus(A),r),u=X(m).times(a),d=X(m).minus(u).round();return{bridgeFeeInTokenPrecision:u.round().toFixed(),amountIncludingCommissionInTokenPrecision:d.toFixed(),amountExcludingCommissionInTokenPrecision:m.toFixed()}}function eo(s,{feeShare:a,decimals:r},i){let o=X(a).div(X(1).minus(a)),c=X(s).times(o),A=X(s).plus(c);return{bridgeFeeInTokenPrecision:c.round().toFixed(),amountIncludingCommissionInSystemPrecision:oi(it(A,r),i),amountExcludingCommissionInSystemPrecision:oi(it(s,r),i)}}function oi(s,a){let r=X(a.tokenBalance).minus(s),i=Ue(r.toFixed(),a.aValue,a.dValue);return X(i).minus(a.vUsdBalance).round().toFixed()}function to(s,{feeShare:a,decimals:r},i){if(X(s).eq(0))return{bridgeFeeInTokenPrecision:"0",amountIncludingCommissionInTokenPrecision:"0",amountExcludingCommissionInTokenPrecision:"0"};let o=X(i.vUsdBalance).minus(s),c=Ue(o.toFixed(),i.aValue,i.dValue),A=X(c).minus(i.tokenBalance),m=de(A.toFixed(),r),u=X(a).div(X(1).minus(a)),d=X(m).times(u),l=X(m).plus(d);return{bridgeFeeInTokenPrecision:d.round().toFixed(),amountIncludingCommissionInTokenPrecision:l.round().toFixed(),amountExcludingCommissionInTokenPrecision:m.toFixed()}}import{Big as rt}from"big.js";function mi(s,a,r,i,o){let c=Ge(s,a,r),A=de(c,a.decimals),m=Vt(c,i,o),u=rt(s).times(a.feeShare),d=rt(m).div(rt(1).minus(i.feeShare)).minus(m);return{sourceLPSwap:{fee:R(u,a.decimals).neg().round(a.decimals,rt.roundUp).toFixed(),swap:R(rt(s).minus(A).minus(u),a.decimals).neg().round(a.decimals,rt.roundUp).toFixed()},destLPSwap:{fee:R(d,i.decimals).neg().round(i.decimals,rt.roundUp).toFixed(),swap:R(de(c,i.decimals).minus(m).minus(d),i.decimals).neg().round(i.decimals,rt.roundUp).toFixed()}}}import oo from"axios";var ui="3.25.0";function di(s){return Object.entries(s).reduce((a,r)=>{let i=r[0],o=r[1],c=so(i,o);return c&&(a[i]=c),a},{})}function li(s){let a={};for(let[r,i]of Object.entries(s)){let o=r;for(let c of i.tokens){let A=vt({chainSymbol:o,poolAddress:c.poolAddress}),m=se(c.poolInfo);a[A]={...c.poolInfo,imbalance:m}}}return a}function no(s,a){let{name:r,...i}=s,{poolInfo:o,...c}=a;return{...c,...i,chainName:r}}function ro(s){switch(s){case"allbridge":return 1;case"wormhole":return 2;case"cctp":return 3;case"cctpV2":return 4;case"oft":return 5}}function ao(s){return Object.entries(s).reduce((a,[r,i])=>(a[r]=io(i),a),{})}function io(s){return Object.entries(s).reduce((a,[r,i])=>{let o=ro(r);return o&&i!=null&&(a[o]=i),a},{})}function so(s,a){let r=x.getChainsProperties()[s];if(!r)return null;let i={...r,allbridgeChainId:a.chainId,bridgeAddress:a.bridgeAddress,oftBridgeAddress:a.oftBridgeAddress,yieldAddress:a.yieldAddress,transferTime:ao(a.transferTime),txCostAmount:a.txCostAmount,confirmations:a.confirmations,suiAddresses:a.suiAddresses};return{...i,tokens:a.tokens.map(o=>no(i,o))}}function vt(s){return s.chainSymbol+"_"+s.poolAddress}function pi(s){let a=[];for(let[r,i]of Object.entries(s)){let o=r;for(let c of i.tokens)a.push({chainSymbol:o,poolAddress:c.poolAddress})}return a}function gi(s){let a={};for(let[r,i]of Object.entries(s)){let o=r;for(let[c,A]of Object.entries(i))A.imbalance=se(A),a[vt({chainSymbol:o,poolAddress:c})]=A}return a}var kt=class{api;constructor(a){this.api=oo.create({baseURL:a.coreApiUrl,headers:{Accept:"application/json",...a.coreApiHeaders,"x-Sdk-Agent":"AllbridgeCoreSDK/"+ui},params:a.coreApiQueryParams})}async getTokenInfo(){let{data:a}=await this.api.get("/token-info",{params:{filter:"all"}});return{chainDetailsMap:di(a),poolInfoMap:li(a)}}async getPendingInfo(){let{data:a}=await this.api.get("/pending-info");return a}async getGasBalance(a,r){let{data:i}=await this.api.get(`/check/${a}/${r}`);return i}async getTransferStatus(a,r){let{data:i}=await this.api.get(`/chain/${a}/${r}`);return i}async getReceiveTransactionCost(a){if(a.messenger===5&&!a.sourceToken)throw new cn("For OFT sourceToken required");let{data:r}=await this.api.post("/receive-fee",a,{headers:{"Content-Type":"application/json"}});return{exchangeRate:r.exchangeRate,fee:r.fee,sourceNativeTokenPrice:r.sourceNativeTokenPrice,adminFeeShareWithExtras:r.adminFeeShareWithExtras}}async getPoolInfoMap(a){let r=a instanceof Array?a:[a],{data:i}=await this.api.post("/pool-info",{pools:r},{headers:{"Content-Type":"application/json"}});return gi(i)}};import er from"timed-cache";var Yr=20*1e3,co=55*1e3,Ft=class{constructor(a){this.apiClient=a;this.tokenInfoCache=new er({defaultTtl:co}),this.receivedTransactionCache=new er({defaultTtl:Yr}),this.pendingInfoCache=new er({defaultTtl:Yr}),this.gasBalanceCache=new er({defaultTtl:Yr})}tokenInfoCache;pendingInfoCache;gasBalanceCache;receivedTransactionCache;getTokenInfo(){let a="TOKEN_INFO_CACHE_KEY",r=this.tokenInfoCache.get(a);if(r)return r;let i=this.apiClient.getTokenInfo();return this.tokenInfoCache.put(a,i),i}async getGasBalance(a,r){let i=`GAS_BALANCE_${a}_${r}`,o=this.gasBalanceCache.get(i);if(o)return o;let c=this.apiClient.getGasBalance(a,r);return this.gasBalanceCache.put(i,c),c}async getPendingInfo(){let a="PENDING_INFO_CACHE_KEY",r=this.pendingInfoCache.get(a);if(r)return r;let i=this.apiClient.getPendingInfo();return this.pendingInfoCache.put(a,i),i}async getReceiveTransactionCost(a){let r=`RECEIVE_TX_COST_${a.sourceChainId}_${a.destinationChainId}_${a.messenger}${a.sourceToken?"_"+a.sourceToken:""}`,i=this.receivedTransactionCache.get(r);if(i)return i;let o=await this.apiClient.getReceiveTransactionCost(a);return this.receivedTransactionCache.put(r,o),o}async getTransferStatus(a,r){return this.apiClient.getTransferStatus(a,r)}async getPoolInfoMap(a){return this.apiClient.getPoolInfoMap(a)}};var xt=class{constructor(a){this.apiClient=a}async getChainDetailsMap(){return(await this.apiClient.getTokenInfo()).chainDetailsMap}async tokens(){let a=await this.getChainDetailsMap();return Object.values(a).flatMap(r=>r.tokens)}async getPendingInfo(){return this.apiClient.getPendingInfo()}async getGasBalance(a,r){return this.apiClient.getGasBalance(a,r)}async getChainDetailsMapAndPoolInfoMap(){return await this.apiClient.getTokenInfo()}async getTransferStatus(a,r){return await this.apiClient.getTransferStatus(a,r)}async getReceiveTransactionCost(a){return await this.apiClient.getReceiveTransactionCost(a)}async getPoolInfoMap(a){return await this.apiClient.getPoolInfoMap(a)}};var Mt=class{constructor(a,r){this.client=a;this.isStaging=r.coreApiQueryParams?.staging==="true"}isStaging;async getChainDetailsMap(a){let r=await this.client.getChainDetailsMap(),i={};for(let o in r){let c=r[o];c&&(i[o]={...c,tokens:fi(c.tokens,a,this.isStaging)})}return i}async tokens(a){return fi(await this.client.tokens(),a,this.isStaging)}async getPendingInfo(){return this.client.getPendingInfo()}async getGasBalance(a,r){return this.client.getGasBalance(a,r)}async getTransferStatus(a,r){return await this.client.getTransferStatus(a,r)}async getReceiveTransactionCost(a){return await this.client.getReceiveTransactionCost(a)}cachePut(a,r){return this.client.cachePut(a,r)}getPoolInfoByKey(a){return this.client.getPoolInfoByKey(a)}refreshPoolInfo(a){return this.client.refreshPoolInfo(a)}};function fi(s,a,r){return s.filter(i=>r?!0:i.flags[a]).map(Ao)}function Ao(s){let{flags:a,...r}=s;return r}import mo from"timed-cache";var uo=55*1e3,Ot=class{constructor(a){this.client=a;this.poolInfoCache=new Lr}poolInfoCache;async getChainDetailsMap(){return(await this.client.getChainDetailsMapAndPoolInfoMap()).chainDetailsMap}async tokens(){return await this.client.tokens()}getTransferStatus(a,r){return this.client.getTransferStatus(a,r)}getReceiveTransactionCost(a){return this.client.getReceiveTransactionCost(a)}getPendingInfo(){return this.client.getPendingInfo()}getGasBalance(a,r){return this.client.getGasBalance(a,r)}async getPoolInfoByKey(a){this.poolInfoCache.putAllIfNotExists((await this.client.getChainDetailsMapAndPoolInfoMap()).poolInfoMap);let r=this.poolInfoCache.get(a);if(r)return r;{let i=await this.client.getPoolInfoMap(a);this.poolInfoCache.putAll(i);let o=i[vt(a)];if(o)return o;throw new y("Cannot find pool info for "+a.poolAddress+" on chain "+a.chainSymbol)}}async refreshPoolInfo(a){let r;if(a)this.poolInfoCache.putAllIfNotExists((await this.client.getChainDetailsMapAndPoolInfoMap()).poolInfoMap),r=await this.client.getPoolInfoMap(a);else{let i=await this.client.getChainDetailsMapAndPoolInfoMap();r=await this.client.getPoolInfoMap(pi(i.chainDetailsMap))}this.poolInfoCache.putAll(r)}cachePut(a,r){this.poolInfoCache.put(vt(a),r)}},Lr=class{cache;constructor(){this.cache=new mo({defaultTtl:uo})}putAll(a){for(let[r,i]of Object.entries(a))this.cache.put(r,i)}putAllIfNotExists(a){for(let[r,i]of Object.entries(a))this.cache.get(r)||this.cache.put(r,i)}put(a,r){this.cache.put(a,r)}get(a){let r=vt(a);return this.cache.get(r)}};import{Big as Po}from"big.js";import{TronWeb as wo}from"tronweb";import{Web3 as Co}from"web3";var lo={abi:[{inputs:[{internalType:"string",name:"name_",type:"string"},{internalType:"string",name:"symbol_",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"}]},tr=lo;import{Big as yi}from"big.js";var fe=class{async checkAllowance(a){let r=await this.getAllowance(a);return yi(r).gte(yi(a.amount))}};var po="0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",go="0xdac17f958d2ee523a2206206994597c13d831ec7",fo=1e5,en=class extends fe{constructor(r,i){super();this.web3=r;this.api=i}chainType="EVM";getAllowance(r){let i=r.token.tokenAddress,o=r.owner,c=r.spender;return this.getAllowanceByTokenAddress(i,o,c)}getAllowanceByTokenAddress(r,i,o){return this.getERC20Contract(r).methods.allowance(i,o).call()}async getTokenBalance(r){return await this.getERC20Contract(r.token.tokenAddress).methods.balanceOf(r.account).call()}async getNativeTokenBalance(r){return(await this.web3.eth.getBalance(r.account)).toString()}async approve(r){if(this.isUsdt(r.tokenAddress)&&await this.getAllowanceByTokenAddress(r.tokenAddress,r.owner,r.spender)!=="0"){let c=await this.buildRawTransactionApprove({...r,amount:"0"});await this.sendRawTransaction(c,r.chainSymbol)}let i=await this.buildRawTransactionApprove(r);return await this.sendRawTransaction(i,r.chainSymbol)}isUsdt(r){return r.toLowerCase()===go}buildRawTransactionApprove(r){let{tokenAddress:i,spender:o,owner:c,amount:A}=r,u=this.getERC20Contract(i).methods.approve(o,A==null?po:xn(A));return Promise.resolve({from:c,to:i,value:"0",data:u.encodeABI()})}async sendRawTransaction(r,i){let o=r,c={maxPriorityFeePerGas:void 0,maxFeePerGas:void 0};i==="POL"?o.gas=fo:o.gas=await this.web3.eth.estimateGas(r);let{transactionHash:A}=await this.web3.eth.sendTransaction({...o,...c});return{txId:A.toString()}}getERC20Contract(r){return new this.web3.eth.Contract(tr.abi,r)}};import{AnchorProvider as yo}from"@project-serum/anchor";import{Connection as ho,PublicKey as nr}from"@solana/web3.js";var rr=class extends fe{constructor(r,i){super();this.solanaRpcUrl=r;this.api=i}chainType="SOLANA";approve(r){throw new J}buildRawTransactionApprove(r){throw new J}buildAnchorProvider(r){let i=new ho(this.solanaRpcUrl,"confirmed"),o=new nr(r);return new yo(i,{publicKey:o},{preflightCommitment:"confirmed",commitment:"confirmed"})}getAllowance(r){throw new J}async getTokenBalance(r){let{account:i,token:o}=r;try{let c=await Ie(new nr(i),new nr(o.tokenAddress));return(await yt(c,this.buildAnchorProvider(i))).amount.toString()}catch(c){if(c instanceof Error)return c.message.startsWith("Account does not exist"),"0";throw c}}async getNativeTokenBalance(r){return(await this.buildAnchorProvider(r.account).connection.getBalance(new nr(r.account))).toString()}};import{Horizon as tT,NotFoundError as To}from"@stellar/stellar-sdk";var ar=class extends fe{constructor(r,i,o){super();this.nodeRpcUrlsConfig=r;this.params=i;this.api=o}chainType="SRB";getAllowance(){throw new J}async getTokenBalance(r){if(!r.token.originTokenAddress)throw new y("OriginTokenAddress missing");let[i,o]=r.token.originTokenAddress.split(":"),c=new tT.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")),A;try{A=await c.loadAccount(r.account)}catch(d){if(d instanceof To)return"0";throw d}let u=A.balances.find(d=>(d.asset_type==="credit_alphanum4"||d.asset_type==="credit_alphanum12")&&d.asset_code==i&&d.asset_issuer==o);return u?.balance?I(u.balance,x.getChainDecimalsByType(x.getChainProperty(r.token.chainSymbol).chainType)).toFixed():"0"}async getNativeTokenBalance(r){let A=(await new tT.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")).loadAccount(r.account)).balances.find(m=>m.asset_type==="native");return A?.balance?I(A.balance,x.getChainDecimalsByType(x.getChainProperty(r.chainSymbol).chainType)).toFixed():"0"}approve(){throw new J}buildRawTransactionApprove(){throw new J}};import{SuiClient as bo}from"@mysten/sui/client";var ir=class extends fe{constructor(r,i){super();this.suiRpcUrl=r;this.api=i;this.suiClient=new bo({url:this.suiRpcUrl})}chainType="SUI";suiClient;approve(r){throw new J}buildRawTransactionApprove(r){throw new J}getAllowance(r){throw new J}async getTokenBalance(r){if(!r.token.originTokenAddress)throw new y("SUI token must contain 'originTokenAddress'");return(await this.suiClient.getBalance({owner:r.account,coinType:r.token.originTokenAddress})).totalBalance}async getNativeTokenBalance(r){let i=await Ze(o=>this.suiClient.getCoins({owner:r.account,cursor:o}));return i.length===0?"0":i.reduce((o,c)=>o+BigInt(c.balance),BigInt(0)).toString()}};var So="0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",tn=class extends fe{constructor(r,i){super();this.tronWeb=r;this.api=i}chainType="TRX";async getAllowance(r){let{token:{tokenAddress:i},owner:o}=r;return(await(await this.getContract(i)).methods.allowance(o,r.spender).call()).toString()}async getTokenBalance(r){return(await(await this.getContract(r.token.tokenAddress)).balanceOf(r.account).call()).toString()}async getNativeTokenBalance(r){return(await this.tronWeb.trx.getBalance(r.account)).toString()}async approve(r){let i=await this.buildRawTransactionApprove(r);return await Mn(this.tronWeb,i)}async buildRawTransactionApprove(r){let{tokenAddress:i,spender:o,owner:c,amount:A}=r,m=A==null?So:xn(A),u=[{type:"address",value:o},{type:"uint256",value:m}];return this.buildRawTransaction(i,"approve(address,uint256)",u,"0",c)}getContract(r){return this.tronWeb.contract(tr.abi,r)}async buildRawTransaction(r,i,o,c,A){let m=await this.tronWeb.transactionBuilder.triggerSmartContract(r,i,{callValue:+c},o,A);if(!m?.result?.result)throw new y("Unknown error: "+JSON.stringify(m,null,2));return m.transaction}};var Dt=class{constructor(a,r,i){this.api=a;this.nodeRpcUrlsConfig=r;this.params=i}async getAllowance(a,r){let i=await this.getChainTokenService(a.token.chainSymbol,a.owner,r).getAllowance(a);return R(i,a.token.decimals).toFixed()}async checkAllowance(a,r){return M(a.amount),W("amount",a.amount,a.token.decimals),this.getChainTokenService(a.token.chainSymbol,a.owner,r).checkAllowance(this.prepareCheckAllowanceParams(a))}async approve(a,r){return r.amount&&(M(r.amount),W("amount",r.amount,r.token.decimals)),this.getChainTokenService(r.token.chainSymbol,r.owner,a).approve(this.prepareApproveParams(r))}async buildRawTransactionApprove(a,r){return a.amount&&(M(a.amount),W("amount",a.amount,a.token.decimals)),this.getChainTokenService(a.token.chainSymbol,a.owner,r).buildRawTransactionApprove(this.prepareApproveParams(a))}async getTokenBalance(a,r){let i=await this.getChainTokenService(a.token.chainSymbol,a.account,r).getTokenBalance(a);return a.token.decimals?R(i,a.token.decimals).toFixed():i}async getNativeTokenBalance(a,r){let i=await this.getChainTokenService(a.chainSymbol,a.account,r).getNativeTokenBalance(a);return{int:i,float:R(i,x.getChainDecimalsByType(x.getChainProperty(a.chainSymbol).chainType)).toFixed()}}getChainTokenService(a,r,i){switch(x.getChainProperty(a).chainType){case"EVM":{if(i)return new en(i,this.api);{let o=this.nodeRpcUrlsConfig.getNodeRpcUrl(a);return new en(new Co(o),this.api)}}case"TRX":{if(i)return new tn(i,this.api);{let o=this.nodeRpcUrlsConfig.getNodeRpcUrl(a),c=new wo({fullHost:o});return c.setAddress(r),new tn(c,this.api)}}case"SOLANA":{let o=this.nodeRpcUrlsConfig.getNodeRpcUrl(a);return new rr(o,this.api)}case"SRB":return new ar(this.nodeRpcUrlsConfig,this.params,this.api);case"SUI":return new ir(this.nodeRpcUrlsConfig.getNodeRpcUrl(a),this.api)}}prepareCheckAllowanceParams(a){return{...a,amount:I(a.amount,a.token.decimals)}}prepareApproveParams(a){return{tokenAddress:a.token.tokenAddress,owner:a.owner,spender:a.spender,chainSymbol:a.token.chainSymbol,amount:a.amount==null?void 0:Po(a.amount).toFixed()}}};var sr=class{constructor(a,r){this.nodeRpcUrlsConfig=a;this.params=r;let i=new kt(r),o=new Ft(i),c=new xt(o),A=new Ot(c);this.api=new Mt(A,r),this.tokenService=new Dt(this.api,a,r)}api;tokenService;buildRawTransactionApprove(a,r){return this.tokenService.buildRawTransactionApprove(a,r)}checkAllowance(a,r){return this.tokenService.checkAllowance(a,r)}getAllowance(a,r){return this.tokenService.getAllowance(a,r)}};import{Connection as Bo,PublicKey as Ro,TransactionMessage as Io}from"@solana/web3.js";var or=class{constructor(a,r){this.nodeRpcUrlsConfig=a;this.params=r}async addMemoToTx(a,r){if(r.length>28)throw new y("InvalidArgumentException memo cannot be more than 28 characters");let i=new Bo(this.nodeRpcUrlsConfig.getNodeRpcUrl("SOL"),"confirmed"),o=await ot(a,i),c=Io.decompile(a.message,{addressLookupTableAccounts:o}),A=c.instructions[c.instructions.length-1];if(!A?.keys)throw new y("Last instruction or its keys are invalid.");A.keys.push({pubkey:new Ro(Buffer.from(r)),isSigner:!1,isWritable:!1}),a.message=c.compileToV0Message(o)}};import{Asset as Fo,BASE_FEE as xo,contract as JP,Horizon as hi,Operation as Mo,Operation as Oo,rpc as rn,TimeoutInfinite as Do,TransactionBuilder as Xr,TransactionBuilder as Ti}from"@stellar/stellar-sdk";import{contract as e}from"@stellar/stellar-sdk";var vo=e.Spec,ko=e.Client;var nn=class extends ko{constructor(r){super(new vo(["AAAAAAAAAYlSZXR1cm5zIHRoZSBhbGxvd2FuY2UgZm9yIGBzcGVuZGVyYCB0byB0cmFuc2ZlciBmcm9tIGBmcm9tYC4KClRoZSBhbW91bnQgcmV0dXJuZWQgaXMgdGhlIGFtb3VudCB0aGF0IHNwZW5kZXIgaXMgYWxsb3dlZCB0byB0cmFuc2ZlcgpvdXQgb2YgZnJvbSdzIGJhbGFuY2UuIFdoZW4gdGhlIHNwZW5kZXIgdHJhbnNmZXJzIGFtb3VudHMsIHRoZSBhbGxvd2FuY2UKd2lsbCBiZSByZWR1Y2VkIGJ5IHRoZSBhbW91bnQgdHJhbnNmZXJlZC4KCiMgQXJndW1lbnRzCgoqIGBmcm9tYCAtIFRoZSBhZGRyZXNzIGhvbGRpbmcgdGhlIGJhbGFuY2Ugb2YgdG9rZW5zIHRvIGJlIGRyYXduIGZyb20uCiogYHNwZW5kZXJgIC0gVGhlIGFkZHJlc3Mgc3BlbmRpbmcgdGhlIHRva2VucyBoZWxkIGJ5IGBmcm9tYC4AAAAAAAAJYWxsb3dhbmNlAAAAAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAAB3NwZW5kZXIAAAAAEwAAAAEAAAAL","AAAAAAAAAIlSZXR1cm5zIHRydWUgaWYgYGlkYCBpcyBhdXRob3JpemVkIHRvIHVzZSBpdHMgYmFsYW5jZS4KCiMgQXJndW1lbnRzCgoqIGBpZGAgLSBUaGUgYWRkcmVzcyBmb3Igd2hpY2ggdG9rZW4gYXV0aG9yaXphdGlvbiBpcyBiZWluZyBjaGVja2VkLgAAAAAAAAphdXRob3JpemVkAAAAAAABAAAAAAAAAAJpZAAAAAAAEwAAAAEAAAAB","AAAAAAAAA55TZXQgdGhlIGFsbG93YW5jZSBieSBgYW1vdW50YCBmb3IgYHNwZW5kZXJgIHRvIHRyYW5zZmVyL2J1cm4gZnJvbQpgZnJvbWAuCgpUaGUgYW1vdW50IHNldCBpcyB0aGUgYW1vdW50IHRoYXQgc3BlbmRlciBpcyBhcHByb3ZlZCB0byB0cmFuc2ZlciBvdXQgb2YKZnJvbSdzIGJhbGFuY2UuIFRoZSBzcGVuZGVyIHdpbGwgYmUgYWxsb3dlZCB0byB0cmFuc2ZlciBhbW91bnRzLCBhbmQKd2hlbiBhbiBhbW91bnQgaXMgdHJhbnNmZXJyZWQgdGhlIGFsbG93YW5jZSB3aWxsIGJlIHJlZHVjZWQgYnkgdGhlCmFtb3VudCB0cmFuc2ZlcmVkLgoKIyBBcmd1bWVudHMKCiogYGZyb21gIC0gVGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgYmFsYW5jZSBvZiB0b2tlbnMgdG8gYmUgZHJhd24gZnJvbS4KKiBgc3BlbmRlcmAgLSBUaGUgYWRkcmVzcyBiZWluZyBhdXRob3JpemVkIHRvIHNwZW5kIHRoZSB0b2tlbnMgaGVsZCBieQpgZnJvbWAuCiogYGFtb3VudGAgLSBUaGUgdG9rZW5zIHRvIGJlIG1hZGUgYXZhaWxhYmxlIHRvIGBzcGVuZGVyYC4KKiBgZXhwaXJhdGlvbl9sZWRnZXJgIC0gVGhlIGxlZGdlciBudW1iZXIgd2hlcmUgdGhpcyBhbGxvd2FuY2UgZXhwaXJlcy4gQ2Fubm90CmJlIGxlc3MgdGhhbiB0aGUgY3VycmVudCBsZWRnZXIgbnVtYmVyIHVubGVzcyB0aGUgYW1vdW50IGlzIGJlaW5nIHNldCB0byAwLgpBbiBleHBpcmVkIGVudHJ5ICh3aGVyZSBleHBpcmF0aW9uX2xlZGdlciA8IHRoZSBjdXJyZW50IGxlZGdlciBudW1iZXIpCnNob3VsZCBiZSB0cmVhdGVkIGFzIGEgMCBhbW91bnQgYWxsb3dhbmNlLgoKIyBFdmVudHMKCkVtaXRzIGFuIGV2ZW50IHdpdGggdG9waWNzIGBbImFwcHJvdmUiLCBmcm9tOiBBZGRyZXNzLApzcGVuZGVyOiBBZGRyZXNzXSwgZGF0YSA9IFthbW91bnQ6IGkxMjgsIGV4cGlyYXRpb25fbGVkZ2VyOiB1MzJdYAAAAAAAB2FwcHJvdmUAAAAABAAAAAAAAAAEZnJvbQAAABMAAAAAAAAAB3NwZW5kZXIAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAAAAABFleHBpcmF0aW9uX2xlZGdlcgAAAAAAAAQAAAAA","AAAAAAAAAJhSZXR1cm5zIHRoZSBiYWxhbmNlIG9mIGBpZGAuCgojIEFyZ3VtZW50cwoKKiBgaWRgIC0gVGhlIGFkZHJlc3MgZm9yIHdoaWNoIGEgYmFsYW5jZSBpcyBiZWluZyBxdWVyaWVkLiBJZiB0aGUKYWRkcmVzcyBoYXMgbm8gZXhpc3RpbmcgYmFsYW5jZSwgcmV0dXJucyAwLgAAAAdiYWxhbmNlAAAAAAEAAAAAAAAAAmlkAAAAAAATAAAAAQAAAAs=","AAAAAAAAAWRCdXJuIGBhbW91bnRgIGZyb20gYGZyb21gLgoKUmVkdWNlcyBmcm9tJ3MgYmFsYW5jZSBieSB0aGUgYW1vdW50LCB3aXRob3V0IHRyYW5zZmVycmluZyB0aGUgYmFsYW5jZQp0byBhbm90aGVyIGhvbGRlcidzIGJhbGFuY2UuCgojIEFyZ3VtZW50cwoKKiBgZnJvbWAgLSBUaGUgYWRkcmVzcyBob2xkaW5nIHRoZSBiYWxhbmNlIG9mIHRva2VucyB3aGljaCB3aWxsIGJlCmJ1cm5lZCBmcm9tLgoqIGBhbW91bnRgIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdG8gYmUgYnVybmVkLgoKIyBFdmVudHMKCkVtaXRzIGFuIGV2ZW50IHdpdGggdG9waWNzIGBbImJ1cm4iLCBmcm9tOiBBZGRyZXNzXSwgZGF0YSA9IFthbW91bnQ6CmkxMjhdYAAAAARidXJuAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=","AAAAAAAAAtxCdXJuIGBhbW91bnRgIGZyb20gYGZyb21gLCBjb25zdW1pbmcgdGhlIGFsbG93YW5jZSBvZiBgc3BlbmRlcmAuCgpSZWR1Y2VzIGZyb20ncyBiYWxhbmNlIGJ5IHRoZSBhbW91bnQsIHdpdGhvdXQgdHJhbnNmZXJyaW5nIHRoZSBiYWxhbmNlCnRvIGFub3RoZXIgaG9sZGVyJ3MgYmFsYW5jZS4KClRoZSBzcGVuZGVyIHdpbGwgYmUgYWxsb3dlZCB0byBidXJuIHRoZSBhbW91bnQgZnJvbSBmcm9tJ3MgYmFsYW5jZSwgaWYKdGhlIGFtb3VudCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGFsbG93YW5jZSB0aGF0IHRoZSBzcGVuZGVyIGhhcwpvbiB0aGUgZnJvbSdzIGJhbGFuY2UuIFRoZSBzcGVuZGVyJ3MgYWxsb3dhbmNlIG9uIGZyb20ncyBiYWxhbmNlIHdpbGwgYmUKcmVkdWNlZCBieSB0aGUgYW1vdW50LgoKIyBBcmd1bWVudHMKCiogYHNwZW5kZXJgIC0gVGhlIGFkZHJlc3MgYXV0aG9yaXppbmcgdGhlIGJ1cm4sIGFuZCBoYXZpbmcgaXRzIGFsbG93YW5jZQpjb25zdW1lZCBkdXJpbmcgdGhlIGJ1cm4uCiogYGZyb21gIC0gVGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgYmFsYW5jZSBvZiB0b2tlbnMgd2hpY2ggd2lsbCBiZQpidXJuZWQgZnJvbS4KKiBgYW1vdW50YCAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIHRvIGJlIGJ1cm5lZC4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJidXJuIiwgZnJvbTogQWRkcmVzc10sIGRhdGEgPSBbYW1vdW50OgppMTI4XWAAAAAJYnVybl9mcm9tAAAAAAAAAwAAAAAAAAAHc3BlbmRlcgAAAAATAAAAAAAAAARmcm9tAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA==","AAAAAAAAAVNDbGF3YmFjayBgYW1vdW50YCBmcm9tIGBmcm9tYCBhY2NvdW50LiBgYW1vdW50YCBpcyBidXJuZWQgaW4gdGhlCmNsYXdiYWNrIHByb2Nlc3MuCgojIEFyZ3VtZW50cwoKKiBgZnJvbWAgLSBUaGUgYWRkcmVzcyBob2xkaW5nIHRoZSBiYWxhbmNlIGZyb20gd2hpY2ggdGhlIGNsYXdiYWNrIHdpbGwKdGFrZSB0b2tlbnMuCiogYGFtb3VudGAgLSBUaGUgYW1vdW50IG9mIHRva2VucyB0byBiZSBjbGF3ZWQgYmFjay4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJjbGF3YmFjayIsIGFkbWluOiBBZGRyZXNzLCB0bzogQWRkcmVzc10sCmRhdGEgPSBbYW1vdW50OiBpMTI4XWAAAAAACGNsYXdiYWNrAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=","AAAAAAAAAIBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGVjaW1hbHMgdXNlZCB0byByZXByZXNlbnQgYW1vdW50cyBvZiB0aGlzIHRva2VuLgoKIyBQYW5pY3MKCklmIHRoZSBjb250cmFjdCBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLgAAAAhkZWNpbWFscwAAAAAAAAABAAAABA==","AAAAAAAAAPVNaW50cyBgYW1vdW50YCB0byBgdG9gLgoKIyBBcmd1bWVudHMKCiogYHRvYCAtIFRoZSBhZGRyZXNzIHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgbWludGVkIHRva2Vucy4KKiBgYW1vdW50YCAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIHRvIGJlIG1pbnRlZC4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJtaW50IiwgYWRtaW46IEFkZHJlc3MsIHRvOiBBZGRyZXNzXSwgZGF0YQo9IFthbW91bnQ6IGkxMjhdYAAAAAAAAARtaW50AAAAAgAAAAAAAAACdG8AAAAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=","AAAAAAAAAFlSZXR1cm5zIHRoZSBuYW1lIGZvciB0aGlzIHRva2VuLgoKIyBQYW5pY3MKCklmIHRoZSBjb250cmFjdCBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLgAAAAAAAARuYW1lAAAAAAAAAAEAAAAQ","AAAAAAAAAQxTZXRzIHRoZSBhZG1pbmlzdHJhdG9yIHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBgbmV3X2FkbWluYC4KCiMgQXJndW1lbnRzCgoqIGBuZXdfYWRtaW5gIC0gVGhlIGFkZHJlc3Mgd2hpY2ggd2lsbCBoZW5jZWZvcnRoIGJlIHRoZSBhZG1pbmlzdHJhdG9yCm9mIHRoaXMgdG9rZW4gY29udHJhY3QuCgojIEV2ZW50cwoKRW1pdHMgYW4gZXZlbnQgd2l0aCB0b3BpY3MgYFsic2V0X2FkbWluIiwgYWRtaW46IEFkZHJlc3NdLCBkYXRhID0KW25ld19hZG1pbjogQWRkcmVzc11gAAAACXNldF9hZG1pbgAAAAAAAAEAAAAAAAAACW5ld19hZG1pbgAAAAAAABMAAAAA","AAAAAAAAAEZSZXR1cm5zIHRoZSBhZG1pbiBvZiB0aGUgY29udHJhY3QuCgojIFBhbmljcwoKSWYgdGhlIGFkbWluIGlzIG5vdCBzZXQuAAAAAAAFYWRtaW4AAAAAAAAAAAAAAQAAABM=","AAAAAAAAAVBTZXRzIHdoZXRoZXIgdGhlIGFjY291bnQgaXMgYXV0aG9yaXplZCB0byB1c2UgaXRzIGJhbGFuY2UuIElmCmBhdXRob3JpemVkYCBpcyB0cnVlLCBgaWRgIHNob3VsZCBiZSBhYmxlIHRvIHVzZSBpdHMgYmFsYW5jZS4KCiMgQXJndW1lbnRzCgoqIGBpZGAgLSBUaGUgYWRkcmVzcyBiZWluZyAoZGUtKWF1dGhvcml6ZWQuCiogYGF1dGhvcml6ZWAgLSBXaGV0aGVyIG9yIG5vdCBgaWRgIGNhbiB1c2UgaXRzIGJhbGFuY2UuCgojIEV2ZW50cwoKRW1pdHMgYW4gZXZlbnQgd2l0aCB0b3BpY3MgYFsic2V0X2F1dGhvcml6ZWQiLCBpZDogQWRkcmVzc10sIGRhdGEgPQpbYXV0aG9yaXplOiBib29sXWAAAAAOc2V0X2F1dGhvcml6ZWQAAAAAAAIAAAAAAAAAAmlkAAAAAAATAAAAAAAAAAlhdXRob3JpemUAAAAAAAABAAAAAA==","AAAAAAAAAFtSZXR1cm5zIHRoZSBzeW1ib2wgZm9yIHRoaXMgdG9rZW4uCgojIFBhbmljcwoKSWYgdGhlIGNvbnRyYWN0IGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQuAAAAAAZzeW1ib2wAAAAAAAAAAAABAAAAEA==","AAAAAAAAAWRUcmFuc2ZlciBgYW1vdW50YCBmcm9tIGBmcm9tYCB0byBgdG9gLgoKIyBBcmd1bWVudHMKCiogYGZyb21gIC0gVGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgYmFsYW5jZSBvZiB0b2tlbnMgd2hpY2ggd2lsbCBiZQp3aXRoZHJhd24gZnJvbS4KKiBgdG9gIC0gVGhlIGFkZHJlc3Mgd2hpY2ggd2lsbCByZWNlaXZlIHRoZSB0cmFuc2ZlcnJlZCB0b2tlbnMuCiogYGFtb3VudGAgLSBUaGUgYW1vdW50IG9mIHRva2VucyB0byBiZSB0cmFuc2ZlcnJlZC4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJ0cmFuc2ZlciIsIGZyb206IEFkZHJlc3MsIHRvOiBBZGRyZXNzXSwKZGF0YSA9IFthbW91bnQ6IGkxMjhdYAAAAAh0cmFuc2ZlcgAAAAMAAAAAAAAABGZyb20AAAATAAAAAAAAAAJ0bwAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA==","AAAAAAAAAzNUcmFuc2ZlciBgYW1vdW50YCBmcm9tIGBmcm9tYCB0byBgdG9gLCBjb25zdW1pbmcgdGhlIGFsbG93YW5jZSB0aGF0CmBzcGVuZGVyYCBoYXMgb24gYGZyb21gJ3MgYmFsYW5jZS4gQXV0aG9yaXplZCBieSBzcGVuZGVyCihgc3BlbmRlci5yZXF1aXJlX2F1dGgoKWApLgoKVGhlIHNwZW5kZXIgd2lsbCBiZSBhbGxvd2VkIHRvIHRyYW5zZmVyIHRoZSBhbW91bnQgZnJvbSBmcm9tJ3MgYmFsYW5jZQppZiB0aGUgYW1vdW50IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgYWxsb3dhbmNlIHRoYXQgdGhlIHNwZW5kZXIKaGFzIG9uIHRoZSBmcm9tJ3MgYmFsYW5jZS4gVGhlIHNwZW5kZXIncyBhbGxvd2FuY2Ugb24gZnJvbSdzIGJhbGFuY2UKd2lsbCBiZSByZWR1Y2VkIGJ5IHRoZSBhbW91bnQuCgojIEFyZ3VtZW50cwoKKiBgc3BlbmRlcmAgLSBUaGUgYWRkcmVzcyBhdXRob3JpemluZyB0aGUgdHJhbnNmZXIsIGFuZCBoYXZpbmcgaXRzCmFsbG93YW5jZSBjb25zdW1lZCBkdXJpbmcgdGhlIHRyYW5zZmVyLgoqIGBmcm9tYCAtIFRoZSBhZGRyZXNzIGhvbGRpbmcgdGhlIGJhbGFuY2Ugb2YgdG9rZW5zIHdoaWNoIHdpbGwgYmUKd2l0aGRyYXduIGZyb20uCiogYHRvYCAtIFRoZSBhZGRyZXNzIHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgdHJhbnNmZXJyZWQgdG9rZW5zLgoqIGBhbW91bnRgIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdG8gYmUgdHJhbnNmZXJyZWQuCgojIEV2ZW50cwoKRW1pdHMgYW4gZXZlbnQgd2l0aCB0b3BpY3MgYFsidHJhbnNmZXIiLCBmcm9tOiBBZGRyZXNzLCB0bzogQWRkcmVzc10sCmRhdGEgPSBbYW1vdW50OiBpMTI4XWAAAAAADXRyYW5zZmVyX2Zyb20AAAAAAAAEAAAAAAAAAAdzcGVuZGVyAAAAABMAAAAAAAAABGZyb20AAAATAAAAAAAAAAJ0bwAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA=="]),r);this.options=r}fromJSON={allowance:this.txFromJSON,authorized:this.txFromJSON,approve:this.txFromJSON,balance:this.txFromJSON,burn:this.txFromJSON,burn_from:this.txFromJSON,clawback:this.txFromJSON,decimals:this.txFromJSON,mint:this.txFromJSON,name:this.txFromJSON,set_admin:this.txFromJSON,admin:this.txFromJSON,set_authorized:this.txFromJSON,symbol:this.txFromJSON,transfer:this.txFromJSON,transfer_from:this.txFromJSON}};var Wo=100,No=180,cr=class{constructor(a,r){this.nodeRpcUrlsConfig=a;this.params=r}async buildChangeTrustLineXdrTx(a){let i=await new hi.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")).loadAccount(a.sender),c=await this.getContract(nn,a.tokenAddress).name();if(Ct(c))throw new y;let A=wt(c);if(!A)throw new y;let[m,u]=A.split(":");if(m===void 0||u===void 0)throw new y("Invalid token name format. Expected format 'symbol:srbTokenAddress'");let d=new Fo(m,u),l=Oo.changeTrust({asset:d,limit:a.limit});return new Ti(i,{fee:Wo.toString(10),networkPassphrase:this.params.sorobanNetworkPassphrase}).addOperation(l).setTimeout(No).build().toXDR()}async getBalanceLine(a,r){let o=await this.getContract(nn,r).name();if(Ct(o))throw new y;let c=wt(o);if(!c)throw new y;let[A,m]=c.split(":"),u=this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR");return(await new hi.Server(u).loadAccount(a)).balances.find(g=>(g.asset_type==="credit_alphanum4"||g.asset_type==="credit_alphanum12")&&g.asset_code==A&&g.asset_issuer==m)}async submitTransactionStellar(a){let r=new hi.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")),i=Ti.fromXDR(a,this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR"));return await r.submitTransaction(i)}async simulateAndCheckRestoreTxRequiredSoroban(a,r){let i=new rn.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")),o=await i.getAccount(r),c=Xr.fromXDR(a,this.params.sorobanNetworkPassphrase),A=await i.simulateTransaction(c);if(rn.Api.isSimulationRestore(A))return new Xr(o,{fee:(+xo+ +A.restorePreamble.minResourceFee).toString(),networkPassphrase:this.params.sorobanNetworkPassphrase}).setSorobanData(A.restorePreamble.transactionData.build()).addOperation(Mo.restoreFootprint({})).setTimeout(Do).build().toXDR()}async sendTransactionSoroban(a){let r=new rn.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")),i=Xr.fromXDR(a,this.params.sorobanNetworkPassphrase);return r.sendTransaction(i)}async confirmTx(a,r=15){let i=new rn.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")),o=await Qr(()=>i.getTransaction(a),A=>A.status===rn.Api.GetTransactionStatus.NOT_FOUND,r);if(o.length===0)throw new y("No transaction responses found.");let c=o[o.length-1];if(!c)throw new y("Unexpected error: last response is undefined.");return c}getContract(a,r){let i={contractId:r,networkPassphrase:this.params.sorobanNetworkPassphrase,rpcUrl:this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")};return new a(i)}};var Ar=class{constructor(a,r){this.nodeRpcUrlsConfig=a;this.api=r}_suiBridgeService;async buildSendTxFromCustomTx(a,r,i){return this.suiBridgeService.buildRawTransactionSendFromCustomTx(a,r,i)}get suiBridgeService(){return this._suiBridgeService||(this._suiBridgeService=new St(this.nodeRpcUrlsConfig,this.api)),this._suiBridgeService}};var mr=class{constructor(a){this.service=a;this.srb=new cr(a.nodeRpcUrlsConfig,a.params),this.sol=new or(a.nodeRpcUrlsConfig,a.params),this.sui=new Ar(a.nodeRpcUrlsConfig,a.api),this.evm=new sr(a.nodeRpcUrlsConfig,a.params)}srb;sol;sui;evm};var st=(r=>(r.WITH_NATIVE_CURRENCY="native",r.WITH_STABLECOIN="stablecoin",r))(st||{}),fn=(r=>(r.INT="int",r.FLOAT="float",r))(fn||{});import{Big as Q}from"big.js";var an=class{constructor(a){this.nodeRpcUrls=a}getNodeRpcUrl(a){let r=this.nodeRpcUrls[a];if(r!==void 0)return r;throw new un(a)}},ur=class{constructor(a,r=on){this.nodeRpcUrlsConfig=a;x.addChainsProperties(r.additionalChainsProperties);let i=new kt(r),o=new Ft(i),c=new xt(o),A=new Ot(c);this.api=new Mt(A,r),this.tokenService=new Dt(this.api,a,r),this.bridge=new On(this.api,a,r,this.tokenService),this.pool=new Kn(this.api,a,r,this.tokenService),this.yield=new qn(this.api,a,r,this.tokenService),this.params=r}api;tokenService;params;bridge;pool;yield;async chainDetailsMap(a){return this.api.getChainDetailsMap(a)}async tokens(a){return this.api.tokens(a)}async tokensByChain(a,r){let o=(await this.api.getChainDetailsMap(r))[a];return o?o.tokens:[]}async getTransferStatus(a,r){return this.api.getTransferStatus(a,r)}async getGasBalance(a,r){return this.api.getGasBalance(a,r)}async checkAddress(){return new Promise(a=>{a({status:"OK",gasBalance:null})})}async getPendingStatusInfo(a,r,i,o){M(a);let c;r=="float"?(W("amount",a,i.decimals),c=I(a,i.decimals).toFixed()):c=a;let A=Ge(c,i,await H(this.api,i)),m=await H(this.api,o),u=this.getAmountFromVUsdFormatted(A,o,m),d,l=await this.api.getPendingInfo();for(let p in l[o.chainSymbol]){let g=l[o.chainSymbol];if(!g)throw new y("Cannot find pending info for "+o.chainSymbol);d=g[p]}if(d){let p=Aa(d.totalSentAmount,m),g=this.getAmountFromVUsdFormatted(A,o,p),T;return Q(g.int).gt(u.int)?T={min:u,max:g}:T={min:g,max:u},{pendingTxs:d.pendingTxs,pendingAmount:{int:be(d.totalSentAmount,3,o.decimals).toFixed(0),float:R(d.totalSentAmount,3).toFixed()},estimatedAmount:T}}return{pendingTxs:0,pendingAmount:{int:"0",float:"0"},estimatedAmount:{min:u,max:u}}}async getTokenBalance(a,r){return this.tokenService.getTokenBalance(a,r)}async getNativeTokenBalance(a,r){return this.tokenService.getNativeTokenBalance(a,r)}async calculateFeePercentOnSourceChain(a,r){M(a),W("amountFloat",a,r.decimals);let i=I(a,r.decimals);if(i.eq(0))return 0;let o=Ge(i,r,await H(this.api,r)),c=de(o,r.decimals);return Tr(i,c)}async calculateFeePercentOnDestinationChain(a,r,i){M(a),W("amountFloat",a,r.decimals);let o=I(a,r.decimals);if(o.eq(0))return 0;let c=Ge(o,r,await H(this.api,r)),A=Vt(c,i,await H(this.api,i)),m=de(c,i.decimals);return Tr(m,A)}async getAmountToBeReceivedAndGasFeeOptions(a,r,i,o){return M(a),W("amountToSendFloat",a,r.decimals),{amountToSendFloat:Q(a).toFixed(),amountToBeReceivedFloat:await this.getAmountToBeReceived(a,r,i,o),gasFeeOptions:await this.getGasFeeOptions(r,i,o)}}async getAmountToSendAndGasFeeOptions(a,r,i,o){return M(a),W("amountToBeReceivedFloat",a,i.decimals),{amountToSendFloat:await this.getAmountToSend(a,r,i,o),amountToBeReceivedFloat:Q(a).toFixed(),gasFeeOptions:await this.getGasFeeOptions(r,i,o)}}async getAmountToBeReceived(a,r,i,o){return this.getAmountToBeReceivedCompute(a,r,i,o,async()=>await H(this.api,r),async()=>await H(this.api,i))}async getAmountToBeReceivedFromChain(a,r,i,o,c,A){return this.getAmountToBeReceivedCompute(a,r,i,o,async()=>await this.pool.getPoolInfoFromChain(r,c),async()=>await this.pool.getPoolInfoFromChain(i,A))}async getAmountToBeReceivedCompute(a,r,i,o=1,c,A){switch(o){case 1:case 2:return this.getAmountToBeReceivedComputeWithPools(a,r,i,await c(),await A());case 3:case 4:return this.getAmountToBeReceivedComputeCctp(a,r,i,o);case 5:return this.getAmountToBeReceivedComputeOft(a,r,i)}}getAmountToBeReceivedComputeWithPools(a,r,i,o,c){M(a),W("amountToSendFloat",a,r.decimals);let A=I(a,r.decimals),m=Ge(A,r,o);return this.getAmountFromVUsdFormatted(m,i,c).float}getAmountToBeReceivedComputeCctp(a,r,i,o){M(a),W("amountToSendFloat",a,r.decimals);let c=I(a,r.decimals);switch(o){case 3:{if(!r.cctpAddress||!i.cctpAddress||!r.cctpFeeShare)throw new re("Such route does not support CCTP protocol");let A=c.mul(Q(1).minus(r.cctpFeeShare)).round(0,Q.roundUp),m=be(A,r.decimals,i.decimals).round(0);return R(m,i.decimals).toFixed()}case 4:{if(!r.cctpV2Address||!i.cctpV2Address||!r.cctpV2FeeShare)throw new re("Such route does not support CCTP V2 protocol");let A=c.mul(Q(1).minus(r.cctpV2FeeShare)).round(0,Q.roundUp),m=be(A,r.decimals,i.decimals).round(0);return R(m,i.decimals).toFixed()}}}async getAmountToBeReceivedComputeOft(a,r,i){M(a),W("amountToSendFloat",a,r.decimals);let o=I(a,r.decimals);if(!r.oftBridgeAddress||!i.oftBridgeAddress||r.oftId!==i.oftId)throw new ae("Such route does not support OFT protocol");let{adminFeeShareWithExtras:c}=await this.api.getReceiveTransactionCost({sourceChainId:r.allbridgeChainId,destinationChainId:i.allbridgeChainId,messenger:5,sourceToken:r.tokenAddress});if(!c)throw new ae("Such route does not support OFT protocol");let A=o.mul(Q(1).minus(c)).round(0,Q.roundUp),m=be(A,r.decimals,i.decimals).round(0);return R(m,i.decimals).toFixed()}async getAmountToSend(a,r,i,o){return this.getAmountToSendCompute(a,r,i,o,()=>H(this.api,r),()=>H(this.api,i))}async getAmountToSendFromChain(a,r,i,o,c,A){return this.getAmountToSendCompute(a,r,i,o,()=>this.pool.getPoolInfoFromChain(r,c),()=>this.pool.getPoolInfoFromChain(i,A))}async getAmountToSendCompute(a,r,i,o=1,c,A){switch(o){case 1:case 2:return this.getAmountToSendComputeWithPools(a,r,i,await c(),await A());case 3:case 4:return this.getAmountToSendComputeCctp(a,r,i,o);case 5:return this.getAmountToSendComputeOft(a,r,i)}}getAmountToSendComputeWithPools(a,r,i,o,c){M(a),W("amountToBeReceivedFloat",a,i.decimals);let A=I(a,i.decimals),m=ua(A,i,c),u=ma(m,r,o);if(Q(u).lte(0))throw new Je;return R(u,r.decimals).toFixed()}getAmountToSendComputeCctp(a,r,i,o){M(a),W("amountToBeReceivedFloat",a,i.decimals);let c=I(a,i.decimals);switch(o){case 3:{if(!r.cctpAddress||!i.cctpAddress||!r.cctpFeeShare)throw new re("Such route does not support CCTP protocol");let A=c.div(Q(1).minus(r.cctpFeeShare)).round(0,Q.roundDown),m=be(A,i.decimals,r.decimals).round(0);return R(m,r.decimals).toFixed()}case 4:{if(!r.cctpV2Address||!i.cctpV2Address||!r.cctpV2FeeShare)throw new re("Such route does not support CCTP V2 protocol");let A=c.div(Q(1).minus(r.cctpV2FeeShare)).round(0,Q.roundDown),m=be(A,i.decimals,r.decimals).round(0);return R(m,r.decimals).toFixed()}}}async getAmountToSendComputeOft(a,r,i){M(a),W("amountToBeReceivedFloat",a,i.decimals);let o=I(a,i.decimals);if(!r.oftId||!i.oftId||!r.oftBridgeAddress||r.oftId!==i.oftId)throw new ae("Such route does not support OFT protocol");let{adminFeeShareWithExtras:c}=await this.api.getReceiveTransactionCost({sourceChainId:r.allbridgeChainId,destinationChainId:i.allbridgeChainId,messenger:5,sourceToken:r.tokenAddress});if(!c)throw new ae("Such route does not support OFT protocol");let A=o.div(Q(1).minus(c)).round(0,Q.roundDown),m=be(A,i.decimals,r.decimals).round(0);return R(m,r.decimals).toFixed()}async getGasFeeOptions(a,r,i){return br(a,r.allbridgeChainId,i,this.api)}getAverageTransferTime(a,r,i){return a.transferTime?.[r.chainSymbol]?.[i]??null}async getPoolInfoByToken(a){return await this.api.getPoolInfoByKey({chainSymbol:a.chainSymbol,poolAddress:a.poolAddress})}async refreshPoolInfo(a){if(a){let i=(a instanceof Array?a:[a]).map(o=>({chainSymbol:o.chainSymbol,poolAddress:o.poolAddress}));return this.api.refreshPoolInfo(i)}return this.api.refreshPoolInfo()}aprInPercents(a){return la(a)}async getExtraGasMaxLimits(a,r,i){return await Sr(a,r,i,this.api)}async getVUsdFromAmount(a,r,i){M(a);let o;r=="float"?(W("amount",a,i.decimals),o=I(a,i.decimals).toFixed()):o=a;let c=Ge(o,i,await H(this.api,i));return{int:c,float:R(c,3).toFixed()}}async getAmountFromVUsd(a,r){return this.getAmountFromVUsdFormatted(a,r,await H(this.api,r))}getAmountFromVUsdFormatted(a,r,i){M(a);let o=Vt(a,r,i);if(Q(o).lt(0))throw new Je;return{int:o,float:R(o,r.decimals).toFixed()}}async swapAndBridgeFeeCalculation(a,r,i){return ci(a,{decimals:r.decimals,feeShare:r.feeShare,poolInfo:await H(this.api,r)},{decimals:i.decimals,feeShare:i.feeShare,poolInfo:await H(this.api,i)})}async swapAndBridgeFeeCalculationReverse(a,r,i){let o=Ai(a,{decimals:r.decimals,feeShare:r.feeShare,poolInfo:await H(this.api,r)},{decimals:i.decimals,feeShare:i.feeShare,poolInfo:await H(this.api,i)}),c=o.swapFromVUsdCalcResult.amountIncludingCommissionInTokenPrecision;if(Q(c).lt(0))throw new Je;return o}async getSendAmountDetails(a,r,i,o){M(a);let c;return r=="float"?(W("amount",a,i.decimals),c=I(a,i.decimals).toFixed()):c=a,mi(c,i,await H(this.api,i),o,await H(this.api,o))}};function Go(s){return"solanaRpcUrl"in s}var bi=class{params;bridge;pool;yield;utils;service;constructor(a,r=on){let i;Go(a)?i=new an({SOL:a.solanaRpcUrl,TRX:a.tronRpcUrl}):i=new an(a),this.service=new ur(i,r),this.bridge=this.service.bridge,this.pool=this.service.pool,this.yield=this.service.yield,this.utils=new mr(this.service),this.params=r}async chainDetailsMap(a="swap"){return this.service.chainDetailsMap(a)}async tokens(a="swap"){return this.service.tokens(a)}async tokensByChain(a,r="swap"){return this.service.tokensByChain(a,r)}async getTransferStatus(a,r){return this.service.getTransferStatus(a,r)}async getGasBalance(a,r){return this.service.getGasBalance(a,r)}async checkAddress(a,r,i){return await this.service.checkAddress()}async getPendingStatusInfo(a,r,i,o){return this.service.getPendingStatusInfo(a,r,i,o)}async getTokenBalance(a,r){return this.service.getTokenBalance(a,r)}async getNativeTokenBalance(a,r){return this.service.getNativeTokenBalance(a,r)}async calculateFeePercentOnSourceChain(a,r){return this.service.calculateFeePercentOnSourceChain(a,r)}async calculateFeePercentOnDestinationChain(a,r,i){return this.service.calculateFeePercentOnDestinationChain(a,r,i)}async getAmountToBeReceivedAndGasFeeOptions(a,r,i,o){return this.service.getAmountToBeReceivedAndGasFeeOptions(a,r,i,o)}async getAmountToSendAndGasFeeOptions(a,r,i,o){return this.service.getAmountToSendAndGasFeeOptions(a,r,i,o)}async getAmountToBeReceived(a,r,i,o=1){return this.service.getAmountToBeReceived(a,r,i,o)}async getAmountToBeReceivedFromChain(a,r,i,o=1,c,A){return this.service.getAmountToBeReceivedFromChain(a,r,i,o,c,A)}getAmountToBeReceivedFromPools(a,r,i,o,c,A=1){switch(A){case 1:case 2:return this.service.getAmountToBeReceivedComputeWithPools(a,r,i,o,c);case 3:case 4:return this.service.getAmountToBeReceivedComputeCctp(a,r,i,A)}}async getAmountToSend(a,r,i,o=1){return this.service.getAmountToSend(a,r,i,o)}async getAmountToSendFromChain(a,r,i,o=1,c,A){return this.service.getAmountToSendFromChain(a,r,i,o,c,A)}getAmountToSendFromPools(a,r,i,o,c,A=1){switch(A){case 1:case 2:return this.service.getAmountToSendComputeWithPools(a,r,i,o,c);case 3:case 4:return this.service.getAmountToSendComputeCctp(a,r,i,A)}}async getGasFeeOptions(a,r,i){return this.service.getGasFeeOptions(a,r,i)}getAverageTransferTime(a,r,i){return this.service.getAverageTransferTime(a,r,i)}async getPoolInfoByToken(a){return this.service.getPoolInfoByToken(a)}async refreshPoolInfo(a){return this.service.refreshPoolInfo(a)}aprInPercents(a){return this.service.aprInPercents(a)}async getExtraGasMaxLimits(a,r,i=1){return this.service.getExtraGasMaxLimits(a,r,i)}async getVUsdFromAmount(a,r,i){return this.service.getVUsdFromAmount(a,r,i)}async getAmountFromVUsd(a,r){return this.service.getAmountFromVUsd(a,r)}async swapAndBridgeFeeCalculation(a,r,i){return this.service.swapAndBridgeFeeCalculation(a,r,i)}async swapAndBridgeFeeCalculationReverse(a,r,i){return this.service.swapAndBridgeFeeCalculationReverse(a,r,i)}async getSendAmountDetails(a,r,i,o){return this.service.getSendAmountDetails(a,r,i,o)}};export{lr as AddressStatus,bi as AllbridgeCoreSdk,fn as AmountFormat,lt as AmountNotEnoughError,mn as ArgumentInvalidDecimalsError,re as CCTPDoesNotSupportedError,he as ChainSymbol,Z as ChainType,ki as ErrorCode,An as ExtraGasMaxLimitExceededError,st as FeePaymentMethod,Je as InsufficientPoolLiquidityError,$e as InvalidAmountError,Wt as InvalidGasFeePaymentOptionError,cn as InvalidMessengerOptionError,pt as InvalidTxError,q as JupiterError,Te as Messenger,J as MethodNotSupportedError,un as NodeRpcUrlNotInitializedError,ae as OFTDoesNotSupportedError,y as SdkError,$ as SdkRootError,Pr as SolanaAutoTxFee,Gt as TimeoutError,ln as TxTooLargeError,Nt as VerifyTxError,dn as YieldDoesNotSupportedError,Ls as assertYieldIsSupported,zn as isYieldSupported,on as mainnet,Vo as nodeRpcUrlsDefault,Eo as nodeUrlsDefault};
|
|
1
|
+
var Do=Object.create;var pa=Object.defineProperty;var Eo=Object.getOwnPropertyDescriptor;var _o=Object.getOwnPropertyNames;var $o=Object.getPrototypeOf,qo=Object.prototype.hasOwnProperty;var er=(r,i)=>()=>(r&&(i=r(r=0)),i);var Ni=(r,i)=>()=>(i||r((i={exports:{}}).exports,i),i.exports);var tr=(r,i,a,o)=>{if(i&&typeof i=="object"||typeof i=="function")for(let s of _o(i))!qo.call(r,s)&&s!==a&&pa(r,s,{get:()=>i[s],enumerable:!(o=Eo(i,s))||o.enumerable});return r};var Ne=(r,i,a)=>(a=r!=null?Do($o(r)):{},tr(i||!r||!r.__esModule?pa(a,"default",{value:r,enumerable:!0}):a,r));import{bcs as me}from"@mysten/sui/bcs";function zr(r,i=["<",">"]){let[a,o]=i,s=[],d="",A=0;for(let g=0;g<r.length;g++){let c=r[g];if(c===a&&A++,c===o&&A--,A===0&&c===","){s.push(d.trim()),d="";continue}d+=c}return s.push(d.trim()),s}function oe(r){if(typeof r!="string")throw new Error(`Illegal type passed as a name of the type: ${r}`);let[i,a]=["<",">"],o=r.indexOf(i),s=Array.from(r).reverse().indexOf(a);if(o===-1&&s===-1)return{typeName:r,typeArgs:[]};if(o===-1||s===-1)throw new Error(`Unclosed generic in name '${r}'`);let d=r.slice(0,o),A=zr(r.slice(o+1,r.length-s-1),[i,a]);return{typeName:d,typeArgs:A}}function no(r){return!r||typeof r!="object"||Array.isArray(r)?!1:"GasCoin"in r||"Input"in r||"Result"in r||"NestedResult"in r}function N(r,i){return no(i)?i:r.object(i)}function Be(r,i,a){if(no(i))return N(r,i);function o(l){let{typeName:u,typeArgs:m}=oe(l);switch(u){case"bool":return me.Bool;case"u8":return me.U8;case"u16":return me.U16;case"u32":return me.U32;case"u64":return me.U64;case"u128":return me.U128;case"u256":return me.U256;case"address":return me.Address;case"0x1::string::String":case"0x1::ascii::String":return me.String;case"0x2::object::ID":return me.Address;case"0x1::option::Option":return me.option(o(m[0]));case"vector":return me.vector(o(m[0]));default:throw new Error(`invalid primitive type ${l}`)}}function s(l){for(let u of l){if(typeof u>"u"||u===null)return!0;if(Array.isArray(u))return s(u)}return!1}function d(l){for(let u of l){if(!Array.isArray(u)){if(u===null)continue;switch(typeof u){case"string":case"number":case"bigint":case"boolean":continue;default:return!1}}return d(u)}return!0}function A(l){for(let u of l){if(!Array.isArray(u))switch(typeof u){case"string":case"number":case"bigint":case"boolean":return!0;default:continue}return A(u)}return!1}let{typeName:g,typeArgs:c}=oe(a);switch(g){case"0x1::option::Option":if(i===null)return r.pure.option("bool",null);if(d([i]))return r.pure(o(a).serialize(i));if(A([i]))throw new Error("mixing primitive and TransactionArgument values is not supported");return r.moveCall({target:"0x1::option::some",typeArguments:[c[0]],arguments:[Be(r,i,c[0])]});case"vector":if(!Array.isArray(i))throw new Error("expected an array for vector type");if(i.length===0)return r.pure(me.vector(me.Bool).serialize([]));if(s(i))throw new Error("the provided array contains undefined or null values");if(d(i))return r.pure(o(a).serialize(i));if(A(i))throw new Error("mixing primitive and TransactionArgument values is not supported");return r.makeMoveVec({type:c[0],elements:i});default:return r.pure(o(a).serialize(i))}}function xr(r){let i=r.split("0x").join("");for(let a=0;a<i.length;a++)if(i[a]!=="0")return`0x${i.substring(a)}`;return"0x0"}function G(r){let{typeName:i,typeArgs:a}=oe(r);switch(i){case"bool":case"u8":case"u16":case"u32":case"u64":case"u128":case"u256":case"address":case"signer":return i;case"vector":return`vector<${G(a[0])}>`;default:{let o=i.split("::");o[0]=xr(o[0]);let s=o.join("::");return a.length>0?`${s}<${a.map(d=>G(d)).join(",")}>`:s}}}function j(r,...i){return i.length>0?`${r}<${i.join(", ")}>`:r}var ne=er(()=>{"use strict"});var nt=Ni((Il,io)=>{"use strict";ne();var Qi=class r{static $PACKAGE_ID="";static $PUBLISHED_AT="";static $PKG_V=[];get PACKAGE_ID(){return G(r.$PACKAGE_ID)}get PUBLISHED_AT(){return G(r.$PUBLISHED_AT)}get PKG_V1(){return G(r.$PKG_V[1])}setPackageId(i){r.$PACKAGE_ID=i}setPublishedAt(i){r.$PUBLISHED_AT=i}setPkgV(i,a){r.$PKG_V[i]=a}setAddress(i,a){r.$PACKAGE_ID=i,r.$PUBLISHED_AT=i,r.$PKG_V[1]=a||i}},Or=new Qi;io.exports=Or});var Ei=Ni((vl,co)=>{"use strict";ne();var Di=class r{static $PACKAGE_ID="";static $PUBLISHED_AT="";static $PKG_V=[];get PACKAGE_ID(){return G(r.$PACKAGE_ID)}get PUBLISHED_AT(){return G(r.$PUBLISHED_AT)}get PKG_V1(){return G(r.$PKG_V[1])}setPackageId(i){r.$PACKAGE_ID=i}setPublishedAt(i){r.$PUBLISHED_AT=i}setPkgV(i,a){r.$PKG_V[i]=a}setAddress(i,a){r.$PACKAGE_ID=i,r.$PUBLISHED_AT=i,r.$PKG_V[1]=a||i}},Qr=new Di;co.exports=Qr});var qi=Ni((Bl,uo)=>{"use strict";ne();var $i=class r{static $PACKAGE_ID="";static $PUBLISHED_AT="";static $PKG_V=[];get PACKAGE_ID(){return G(r.$PACKAGE_ID)}get PUBLISHED_AT(){return G(r.$PUBLISHED_AT)}get PKG_V1(){return G(r.$PKG_V[1])}setPackageId(i){r.$PACKAGE_ID=i}setPublishedAt(i){r.$PUBLISHED_AT=i}setPkgV(i,a){r.$PKG_V[i]=a}setAddress(i,a){r.$PACKAGE_ID=i,r.$PUBLISHED_AT=i,r.$PKG_V[1]=a||i}},Kr=new $i;uo.exports=Kr});var Cn={coreApiUrl:"https://core.api.allbridgecoreapi.net",coreApiQueryParams:{},coreApiHeaders:{},jupiterUrl:"https://lite-api.jup.ag/swap/v1",wormholeMessengerProgramId:"worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth",solanaLookUpTable:"2JcBAEVnAwVo4u8d61iqgHPrzZuugur7cVTjWubsVLHj",sorobanNetworkPassphrase:"Public Global Stellar Network ; September 2015",tronJsonRpc:"https://api.trongrid.io/jsonrpc",cctpParams:{cctpTransmitterProgramId:"CCTPmbSD7gX1bxKPAmg77w8oFzNFpaQiQUWD43TKaecd",cctpTokenMessengerMinter:"CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3",cctpDomains:{ETH:0,AVA:1,OPT:2,ARB:3,SOL:5,BAS:6,POL:7,SUI:8}},cachePoolInfoChainSec:20},Gd={solanaRpcUrl:"https://api.mainnet-beta.solana.com",tronRpcUrl:"https://api.trongrid.io"},Fd={SOL:"https://api.mainnet-beta.solana.com",TRX:"https://api.trongrid.io",SRB:"https://rpc.stellar.org:443",STLR:"https://horizon.stellar.org",SUI:"https://fullnode.mainnet.sui.io"};import{AlgorandClient as vo}from"@algorandfoundation/algokit-utils";import{TronWeb as os}from"tronweb";import{Web3 as rs}from"web3";var K=class extends Error{errorCode;constructor(i,a){super(a),this.errorCode=i}},I=class extends K{constructor(i){super("SdkError",i)}},Qe=class extends K{constructor(i){super("InvalidAmountError",i)}},It=class extends K{constructor(i){super("AmountNotEnoughError",i)}},Ke=class extends K{constructor(i){super("InsufficientPoolLiquidityError",i)}},ie=class extends K{constructor(i){super("JupiterError",i)}},Jt=class extends K{constructor(i){super("InvalidGasFeePaymentOptionError",i)}},In=class extends K{constructor(i){super("InvalidMessengerOptionError",i)}},k=class extends K{constructor(i){super("MethodNotSupportedError",i)}},kt=class extends K{constructor(i){super("VerifyTxError",i)}},bt=class extends K{constructor(i){super("InvalidTxError",i)}},bn=class extends K{constructor(i){super("ExtraGasMaxLimitExceededError",i)}},yn=class extends K{constructor(i,a,o){super("ArgumentInvalidDecimalsError",`Argument '${i}' decimals '${a}' cannot be greater than '${o}'`)}},zt=class extends K{constructor(i){super("TimeoutError",i)}},hn=class extends K{constructor(i){super("NodeRpcUrlNotInitializedError",`For chain '${i}' Node RPC URL not initialized`)}},se=class extends K{constructor(i){super("CCTPDoesNotSupportedError",i)}},de=class extends K{constructor(i){super("OFTDoesNotSupportedError",i)}},vn=class extends K{constructor(i){super("YieldDoesNotSupportedError",i)}},Yn=class extends K{constructor(){super("TxTooLargeError","Transaction too large: try again later or switch to another messenger or pay relayer fee in native gas currency")}},nr=(h=>(h.SDK_ERROR="SdkError",h.INVALID_AMOUNT_ERROR="InvalidAmountError",h.AMOUNT_NOT_ENOUGH_ERROR="AmountNotEnoughError",h.INSUFFICIENT_POOL_LIQUIDITY_ERROR="InsufficientPoolLiquidityError",h.JUPITER_ERROR="JupiterError",h.INVALID_GAS_FEE_PAYMENT_OPTION_ERROR="InvalidGasFeePaymentOptionError",h.INVALID_MESSENGER_OPTION_ERROR="InvalidMessengerOptionError",h.METHOD_NOT_SUPPORTED_ERROR="MethodNotSupportedError",h.VERIFY_TX_ERROR="VerifyTxError",h.INVALID_TX_ERROR="InvalidTxError",h.EXTRA_GAS_MAX_LIMIT_EXCEEDED_ERROR="ExtraGasMaxLimitExceededError",h.ARGUMENT_INVALID_DECIMALS_ERROR="ArgumentInvalidDecimalsError",h.TIMEOUT_ERROR="TimeoutError",h.NODE_RPC_URL_NOT_INITIALIZED_ERROR="NodeRpcUrlNotInitializedError",h.CCTP_DOES_NOT_SUPPORTED_ERROR="CCTPDoesNotSupportedError",h.OFT_DOES_NOT_SUPPORTED_ERROR="OFTDoesNotSupportedError",h.YIELD_DOES_NOT_SUPPORTED_ERROR="YieldDoesNotSupportedError",h.TX_TOO_LARGE="TxTooLargeError",h))(nr||{});var Ie=(Y=>(Y.BSC="BSC",Y.ETH="ETH",Y.BAS="BAS",Y.SOL="SOL",Y.TRX="TRX",Y.POL="POL",Y.ARB="ARB",Y.CEL="CEL",Y.AVA="AVA",Y.SRB="SRB",Y.STLR="STLR",Y.OPT="OPT",Y.SUI="SUI",Y.SNC="SNC",Y.UNI="UNI",Y.ALG="ALG",Y))(Ie||{}),z=(A=>(A.EVM="EVM",A.SOLANA="SOLANA",A.TRX="TRX",A.SRB="SRB",A.SUI="SUI",A.ALG="ALG",A))(z||{});var ir={EVM:18,SOLANA:9,TRX:6,SRB:7,SUI:9,ALG:6},ar={BSC:{chainSymbol:"BSC",chainId:"0x38",name:"BNB Chain",chainType:"EVM"},ETH:{chainSymbol:"ETH",chainId:"0x1",name:"Ethereum",chainType:"EVM"},BAS:{chainSymbol:"BAS",chainId:"0x2105",name:"Base",chainType:"EVM"},ARB:{chainSymbol:"ARB",chainId:"0xa4b1",name:"Arbitrum",chainType:"EVM"},AVA:{chainSymbol:"AVA",chainId:"0xa86a",name:"Avalanche",chainType:"EVM"},CEL:{chainSymbol:"CEL",chainId:"0xa4ec",name:"Celo",chainType:"EVM"},POL:{chainSymbol:"POL",chainId:"0x89",name:"Polygon",chainType:"EVM"},OPT:{chainSymbol:"OPT",chainId:"0xa",name:"OP Mainnet",chainType:"EVM"},SNC:{chainSymbol:"SNC",chainId:"0x92",name:"Sonic",chainType:"EVM"},UNI:{chainSymbol:"UNI",chainId:"0x82",name:"Unichain",chainType:"EVM"},SOL:{chainSymbol:"SOL",name:"Solana",chainType:"SOLANA"},TRX:{chainSymbol:"TRX",name:"Tron",chainType:"TRX"},SRB:{chainSymbol:"SRB",name:"Stellar",chainType:"SRB"},STLR:{chainSymbol:"STLR",name:"Stellar",chainType:"SRB"},SUI:{chainSymbol:"SUI",name:"Sui",chainType:"SUI"},ALG:{chainSymbol:"ALG",name:"Algorand",chainType:"ALG"}},X=(()=>{let r={...ar};return{addChainsProperties(i){r={...r,...i}},getChainProperty(i){let a=r[i];if(!a)throw new I(`Cannot find chain properties for ${i}`);return a},getChainsProperties(){return r},getChainDecimalsByType(i){return ir[i]}}})();var Ti=(A=>(A.OK="OK",A.INVALID="INVALID",A.FORBIDDEN="FORBIDDEN",A.UNINITIALIZED="UNINITIALIZED",A.CONTRACT_ADDRESS="CONTRACT_ADDRESS",A.WRONG_ASSOCIATED_ACCOUNT_OWNER="WRONG_ASSOCIATED_ACCOUNT_OWNER",A))(Ti||{});var Ye=(d=>(d[d.ALLBRIDGE=1]="ALLBRIDGE",d[d.WORMHOLE=2]="WORMHOLE",d[d.CCTP=3]="CCTP",d[d.CCTP_V2=4]="CCTP_V2",d[d.OFT=5]="OFT",d))(Ye||{});import{Big as Ca}from"big.js";async function $(r,i){return await r.getPoolInfoByKey({chainSymbol:i.chainSymbol,poolAddress:i.poolAddress})}function V(r){if(Ca(r).lte(0))throw new Qe("Amount must be greater than zero")}function H(r,i,a){let o=Ca(i).toFixed(),[s,d]=o.split(".");if(d&&d.length>a)throw new yn(r,d.length,a)}async function Rn(r,i,a){return await Promise.race([r,new Promise((o,s)=>{setTimeout(()=>s(new zt(i)),a)})])}async function wi(r,i,a,o){if(a<1)throw new Error(`Bad argument: 'maxRetries' must be greater than 0, but ${a} was received.`);let s=0;for(;;)try{return await Rn(r(),i,o)}catch{if(++s>=a)throw new zt(i)}}async function Ia(r,i,a,o=1.5,s=!1){let d=[],A=0,g=await r();if(d.push(g),!i(g))return d;let c=new Date(Date.now()+a*1e3).valueOf(),l=1e3,u=l;for(;Date.now()<c;){let m=d[d.length-1];if(m===void 0||!i(m))break;A++,s&&console.info(`Waiting ${l}ms before trying again (bringing the total wait time to ${u}ms so far, of total ${a*1e3}ms)`),await new Promise(b=>setTimeout(b,l)),l=l*o,new Date(Date.now()+l).valueOf()>c&&(l=c-Date.now(),s&&console.info(`was gonna wait too long; new waitTime: ${l}ms`)),u=l+u;let p=await r(m);d.push(p),s&&i(p)&&console.info(`${A}. Called ${r.name}; ${d.length} prev attempts. Most recent: ${JSON.stringify(d[d.length-1],null,2)}`)}return d}import{AlgoAmount as vr}from"@algorandfoundation/algokit-utils/types/amount";import fa,{Address as Na}from"algosdk";import{getArc56ReturnValue as or}from"@algorandfoundation/algokit-utils/types/app-arc56";import{AppClient as Wn}from"@algorandfoundation/algokit-utils/types/app-client";import{AppFactory as iA}from"@algorandfoundation/algokit-utils/types/app-factory";var Bn={name:"Bridge",structs:{},methods:[{name:"createApplication",args:[{type:"address",name:"owner"},{type:"byte",name:"chainId"},{type:"application",name:"messenger"},{type:"application",name:"gasOracle"}],returns:{type:"void"},actions:{create:["NoOp"],call:[]},readonly:!1,events:[],recommendations:{}},{name:"optInAsset",args:[{type:"uint64",name:"assetId"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"noop",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"swapAndBridge",args:[{type:"uint64",name:"tokenId"},{type:"byte[32]",name:"recipient"},{type:"byte",name:"destinationChainId"},{type:"byte[32]",name:"receiveToken"},{type:"byte[32]",name:"nonce"},{type:"uint64",name:"feeTokenAmount",defaultValue:{source:"literal",data:"AAAAAAAAAAA=",type:"uint64"}}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"BridgingFeeFromTokens",args:[{type:"uint64",name:"feeFromNative"},{type:"uint64",name:"feeFromStable"},{type:"uint64",name:"feeStableTokenAmount"}]},{name:"ReceiveFee",args:[{type:"uint64",name:"bridgeTransactionCost"},{type:"uint64",name:"messageTransactionCost"}]},{name:"TokensSent",args:[{type:"uint64",name:"amount"},{type:"byte[32]",name:"recipient"},{type:"byte",name:"destinationChainId"},{type:"byte[32]",name:"receiveToken"},{type:"byte[32]",name:"nonce"},{type:"byte",name:"messenger"}]}],recommendations:{}},{name:"receiveTokens",args:[{type:"uint64",name:"amount"},{type:"byte[32]",name:"recipient"},{type:"byte",name:"sourceChainId"},{type:"byte[32]",name:"receiveToken"},{type:"byte[32]",name:"nonce"},{type:"uint64",name:"receiveAmountMin"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"TokensReceived",args:[{type:"uint64",name:"receiveAmount"},{type:"address",name:"recipient"},{type:"byte[32]",name:"nonce"},{type:"byte",name:"messenger"},{type:"byte[32]",name:"message"}]}],recommendations:{}},{name:"registerBridge",args:[{type:"byte",name:"chainId"},{type:"byte[32]",name:"bridgeAddress"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"addBridgeToken",args:[{type:"byte",name:"chainId"},{type:"byte[32]",name:"tokenAddress"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"removeBridgeToken",args:[{type:"byte",name:"chainId"},{type:"byte[32]",name:"tokenAddress"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"withdrawGasTokens",args:[{type:"uint64",name:"amount"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"withdrawBridgingFeeInTokens",args:[{type:"uint64",name:"assetId"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"getBridgingCostInTokens",args:[{type:"byte",name:"destinationChainId"},{type:"uint64",name:"tokenId"}],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"hashMessage",args:[{type:"uint64",name:"amount"},{type:"byte[32]",name:"recipient"},{type:"byte",name:"sourceChainId"},{type:"byte",name:"destinationChainId"},{type:"byte[32]",name:"receiveToken"},{type:"byte[32]",name:"nonce"}],returns:{type:"byte[32]"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"isOtherBridgeTokenSupported",args:[{type:"byte",name:"chainId"},{type:"byte[32]",name:"token"}],returns:{type:"bool"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"getTransactionCost",args:[{type:"byte",name:"chainId"}],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"getReceiveTokensCost",args:[],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"getSendTransactionStorageCost",args:[],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"swap",args:[{type:"uint64",name:"tokenId",desc:"The token to be swapped."},{type:"uint64",name:"receiveTokenId",desc:"The token to receive in exchange for the swapped token."},{type:"address",name:"recipient",desc:"The address to receive the tokens."},{type:"uint64",name:"receiveAmountMin",desc:"The minimum amount of tokens required to receive during the swap."}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"Swapped",args:[{type:"address",name:"sender"},{type:"address",name:"recipient"},{type:"uint64",name:"tokenId"},{type:"uint64",name:"receiveTokenId"},{type:"uint64",name:"amount"},{type:"uint64",name:"receivedAmount"}]}],recommendations:{}},{name:"addPool",args:[{type:"uint64",name:"poolId",desc:"The address of the `Pool` contract."},{type:"uint64",name:"tokenId",desc:"The address of the token in the liquidity pool."}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"removePool",args:[{type:"uint64",name:"tokenId"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"stopSwap",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"startSwap",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"setStopAuthority",args:[{type:"address",name:"stopAuthority"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"setRebalancer",args:[{type:"address",name:"rebalancer"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"getGasUsage",args:[{type:"byte",name:"chainId"}],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"setGasUsage",args:[{type:"byte",name:"chainId"},{type:"uint64",name:"gasAmount"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"setGasOracle",args:[{type:"application",name:"gasOracle"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"getTransactionRelayerCost",args:[{type:"byte",name:"chainId"}],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"transferOwnership",args:[{type:"address",name:"newOwner"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}}],arcs:[22,28],networks:{},state:{schema:{global:{ints:3,bytes:4},local:{ints:0,bytes:0}},keys:{global:{chainId:{keyType:"AVMString",valueType:"byte",key:"Y2hhaW5JZA=="},messenger:{keyType:"AVMString",valueType:"AVMUint64",key:"bWVzc2VuZ2Vy"},stopAuthority:{keyType:"AVMString",valueType:"address",key:"c3RvcEF1dGhvcml0eQ=="},rebalancer:{keyType:"AVMString",valueType:"address",key:"cmViYWxhbmNlcg=="},canSwap:{keyType:"AVMString",valueType:"AVMUint64",key:"Y2FuU3dhcA=="},gasOracle:{keyType:"AVMString",valueType:"AVMUint64",key:"Z2FzT3JhY2xl"},owner:{keyType:"AVMString",valueType:"address",key:"b3duZXI="}},local:{},box:{}},maps:{global:{},local:{},box:{processedMessages:{keyType:"byte[32]",valueType:"byte[0]",prefix:"bQ=="},sentMessages:{keyType:"byte[32]",valueType:"byte[0]",prefix:"cw=="},otherBridges:{keyType:"byte",valueType:"byte[32]",prefix:"Yg=="},otherBridgeTokens:{keyType:"AVMBytes",valueType:"byte[0]",prefix:"dA=="},pools:{keyType:"uint64",valueType:"uint64",prefix:"cA=="},fromGasOracleScalingFactor:{keyType:"uint64",valueType:"uint64",prefix:"ZQ=="},bridgingFeeConversionScalingFactor:{keyType:"uint64",valueType:"uint64",prefix:"Zg=="},gasUsage:{keyType:"byte",valueType:"uint64",prefix:"Zw=="}}}},bareActions:{create:[],call:[]},sourceInfo:{approval:{sourceInfo:[{pc:[906],errorMessage:"Asset must go to app"},{pc:[889],errorMessage:"Asset txn missing"},{pc:[1391,1858,2149,2235,2329,2371],errorMessage:"Box must have value"},{pc:[1122],errorMessage:"Bridge: amount too low for fee"},{pc:[1130],errorMessage:"Bridge: bridge to the zero address"},{pc:[1518],errorMessage:"Bridge: message processed"},{pc:[1561],errorMessage:"Bridge: no message"},{pc:[1352,1469],errorMessage:"Bridge: not enough fee"},{pc:[1460],errorMessage:"Bridge: source not registered"},{pc:[1242],errorMessage:"Bridge: tokens already sent"},{pc:[1205],errorMessage:"Bridge: unknown chain or token"},{pc:[1192],errorMessage:"Bridge: wrong destination chain"},{pc:[1283,1437,1558,1797,1844,2213,2314,2415],errorMessage:"Bytes has valid prefix"},{pc:[927],errorMessage:"CloseTo not allowed"},{pc:[1248],errorMessage:"Index access is out of bounds"},{pc:[341,356,376,394,413,433,448,463,475,487,503,523,550,562,574,594,622,657,681,697,713,731,749,767,799,831,840,856],errorMessage:"OnCompletion is not NoOp"},{pc:[2425],errorMessage:"Only owner"},{pc:[920],errorMessage:"Rekey not allowed"},{pc:[2094],errorMessage:"Router: is not stopAuthority"},{pc:[2230],errorMessage:"Router: no pool"},{pc:[2144],errorMessage:"Router: no receive pool"},{pc:[1112,1450,1947],errorMessage:"Router: swap prohibited"},{pc:[913],errorMessage:"Wrong asset"},{pc:[1724],errorMessage:"account opted into asset"},{pc:[1291,2240],errorMessage:"application exists"},{pc:[2035],errorMessage:"asset exists"},{pc:[860],errorMessage:"can only call when creating"},{pc:[344,359,379,397,416,436,451,466,478,490,506,526,553,565,577,597,625,660,684,700,716,734,752,770,802,834,843],errorMessage:"can only call when not creating"},{pc:[1111,1188,1210,1255,1288,1295,1400,1405,1449,1474,1526,1692,1732,1767,1804,1946,2092,2161,2266,2377,2423],errorMessage:"check GlobalState exists"},{pc:[1910],errorMessage:"invalid size"},{pc:[899],errorMessage:"transaction type is axfer"},{pc:[975],errorMessage:"transaction type is pay"}],pcOffsetMethod:"none"},clear:{sourceInfo:[],pcOffsetMethod:"none"}},source:{approval:"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDYgNCAxNTcwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJjYW5Td2FwIiAibWVzc2VuZ2VyIiAib3duZXIiICJnYXNPcmFjbGUiICJjaGFpbklkIiAicmViYWxhbmNlciIgInQiICJwIiAweDAwICJzdG9wQXV0aG9yaXR5IiAweDAxICJnIiAweDQzNDE3YWEzIDB4Zjc0NzViODIgMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDNkNTQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NDkKICAgIC8vIHByaXZhdGUgcmViYWxhbmNlciA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KHsgaW5pdGlhbFZhbHVlOiBuZXcgQWRkcmVzcyhiemVybygwKSkgfSk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ6ZXJvCiAgICBieXRlYyA2IC8vICJyZWJhbGFuY2VyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NTAKICAgIC8vIGNhblN3YXAgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYWZ0ZXJfaWZfZWxzZUAzNgogICAgcHVzaGJ5dGVzcyAweGZmZjgyODQxIDB4NjVmNzA1NzMgMHhlODNhODdhYiAweDJjOWY2ODQ3IDB4MzE5MTliMjggMHg0ZWJhMDcyMSAweGM2MTdlZDczIDB4NTc1MzE1NjAgMHg2MzgwODI3OCAweDA2NTA3YzZhIDB4ZjVmOTZlYjMgMHg0YjA2MmNhMCAweGMzY2RkOTJhIC8vIG1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oYWRkcmVzcyxieXRlLGFwcGxpY2F0aW9uLGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgIm9wdEluQXNzZXQodWludDY0KXZvaWQiLCBtZXRob2QgIm5vb3AoKXZvaWQiLCBtZXRob2QgInN3YXBBbmRCcmlkZ2UodWludDY0LGJ5dGVbMzJdLGJ5dGUsYnl0ZVszMl0sYnl0ZVszMl0sdWludDY0KXZvaWQiLCBtZXRob2QgInJlY2VpdmVUb2tlbnModWludDY0LGJ5dGVbMzJdLGJ5dGUsYnl0ZVszMl0sYnl0ZVszMl0sdWludDY0KXZvaWQiLCBtZXRob2QgInJlZ2lzdGVyQnJpZGdlKGJ5dGUsYnl0ZVszMl0pdm9pZCIsIG1ldGhvZCAiYWRkQnJpZGdlVG9rZW4oYnl0ZSxieXRlWzMyXSl2b2lkIiwgbWV0aG9kICJyZW1vdmVCcmlkZ2VUb2tlbihieXRlLGJ5dGVbMzJdKXZvaWQiLCBtZXRob2QgIndpdGhkcmF3R2FzVG9rZW5zKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnModWludDY0KXZvaWQiLCBtZXRob2QgImdldEJyaWRnaW5nQ29zdEluVG9rZW5zKGJ5dGUsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiaGFzaE1lc3NhZ2UodWludDY0LGJ5dGVbMzJdLGJ5dGUsYnl0ZSxieXRlWzMyXSxieXRlWzMyXSlieXRlWzMyXSIsIG1ldGhvZCAiaXNPdGhlckJyaWRnZVRva2VuU3VwcG9ydGVkKGJ5dGUsYnl0ZVszMl0pYm9vbCIKICAgIGJ5dGVjIDEzIC8vIG1ldGhvZCAiZ2V0VHJhbnNhY3Rpb25Db3N0KGJ5dGUpdWludDY0IgogICAgcHVzaGJ5dGVzcyAweDA3ZGY4NDI5IDB4ODBjNWM3MGYgMHhmYWIxMTFhMiAweGVmMTVmODU1IDB4NmIxZWUyMjMgMHgxODcwYTQ5MiAweDM1NTczMjRkIDB4MDRiMTYxZjEgMHhkMmIzNTdlYiAvLyBtZXRob2QgImdldFJlY2VpdmVUb2tlbnNDb3N0KCl1aW50NjQiLCBtZXRob2QgImdldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0KCl1aW50NjQiLCBtZXRob2QgInN3YXAodWludDY0LHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJhZGRQb29sKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAicmVtb3ZlUG9vbCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic3RvcFN3YXAoKXZvaWQiLCBtZXRob2QgInN0YXJ0U3dhcCgpdm9pZCIsIG1ldGhvZCAic2V0U3RvcEF1dGhvcml0eShhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldFJlYmFsYW5jZXIoYWRkcmVzcyl2b2lkIgogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJnZXRHYXNVc2FnZShieXRlKXVpbnQ2NCIKICAgIHB1c2hieXRlc3MgMHgwY2E1YWU3YSAweDM5N2I5MThiIDB4Y2JmYzZkMDIgMHhlMTdiYWZiNCAvLyBtZXRob2QgInNldEdhc1VzYWdlKGJ5dGUsdWludDY0KXZvaWQiLCBtZXRob2QgInNldEdhc09yYWNsZShhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJnZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGJ5dGUpdWludDY0IiwgbWV0aG9kICJ0cmFuc2Zlck93bmVyc2hpcChhZGRyZXNzKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NyZWF0ZUFwcGxpY2F0aW9uX3JvdXRlQDUgbWFpbl9vcHRJbkFzc2V0X3JvdXRlQDYgbWFpbl9ub29wX3JvdXRlQDcgbWFpbl9zd2FwQW5kQnJpZGdlX3JvdXRlQDggbWFpbl9yZWNlaXZlVG9rZW5zX3JvdXRlQDkgbWFpbl9yZWdpc3RlckJyaWRnZV9yb3V0ZUAxMCBtYWluX2FkZEJyaWRnZVRva2VuX3JvdXRlQDExIG1haW5fcmVtb3ZlQnJpZGdlVG9rZW5fcm91dGVAMTIgbWFpbl93aXRoZHJhd0dhc1Rva2Vuc19yb3V0ZUAxMyBtYWluX3dpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vuc19yb3V0ZUAxNCBtYWluX2dldEJyaWRnaW5nQ29zdEluVG9rZW5zX3JvdXRlQDE1IG1haW5faGFzaE1lc3NhZ2Vfcm91dGVAMTYgbWFpbl9pc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWRfcm91dGVAMTcgbWFpbl9nZXRUcmFuc2FjdGlvbkNvc3Rfcm91dGVAMTggbWFpbl9nZXRSZWNlaXZlVG9rZW5zQ29zdF9yb3V0ZUAxOSBtYWluX2dldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0X3JvdXRlQDIwIG1haW5fc3dhcF9yb3V0ZUAyMSBtYWluX2FkZFBvb2xfcm91dGVAMjIgbWFpbl9yZW1vdmVQb29sX3JvdXRlQDIzIG1haW5fc3RvcFN3YXBfcm91dGVAMjQgbWFpbl9zdGFydFN3YXBfcm91dGVAMjUgbWFpbl9zZXRTdG9wQXV0aG9yaXR5X3JvdXRlQDI2IG1haW5fc2V0UmViYWxhbmNlcl9yb3V0ZUAyNyBtYWluX2dldEdhc1VzYWdlX3JvdXRlQDI4IG1haW5fc2V0R2FzVXNhZ2Vfcm91dGVAMjkgbWFpbl9zZXRHYXNPcmFjbGVfcm91dGVAMzAgbWFpbl9nZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0X3JvdXRlQDMxIG1haW5fdHJhbnNmZXJPd25lcnNoaXBfcm91dGVAMzIKCm1haW5fYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fdHJhbnNmZXJPd25lcnNoaXBfcm91dGVAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdHJhbnNmZXJPd25lcnNoaXAKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdF9yb3V0ZUAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjM0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRHYXNPcmFjbGVfcm91dGVAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0R2FzT3JhY2xlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldEdhc1VzYWdlX3JvdXRlQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoyMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MjIKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRHYXNVc2FnZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRHYXNVc2FnZV9yb3V0ZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjE3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0R2FzVXNhZ2UKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0UmViYWxhbmNlcl9yb3V0ZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTQ2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRSZWJhbGFuY2VyCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldFN0b3BBdXRob3JpdHlfcm91dGVAMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0U3RvcEF1dGhvcml0eQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zdGFydFN3YXBfcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgc3RhcnRTd2FwCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3N0b3BTd2FwX3JvdXRlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHN0b3BTd2FwCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZVBvb2xfcm91dGVAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTEwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlUG9vbAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRQb29sX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZFBvb2wKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3dhcF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NzgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjc4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRTZW5kVHJhbnNhY3Rpb25TdG9yYWdlQ29zdF9yb3V0ZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzI3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYnl0ZWMgMTUgLy8gMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDNkNTQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRSZWNlaXZlVG9rZW5zQ29zdF9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzIwCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYnl0ZWMgMTUgLy8gMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDNkNTQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRUcmFuc2FjdGlvbkNvc3Rfcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzE1CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0VHJhbnNhY3Rpb25Db3N0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2lzT3RoZXJCcmlkZ2VUb2tlblN1cHBvcnRlZF9yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzEwCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgY2FsbHN1YiBpc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWQKICAgIGJ5dGVjIDkgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2hhc2hNZXNzYWdlX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyODMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI4MwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBjYWxsc3ViIGhhc2hNZXNzYWdlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldEJyaWRnaW5nQ29zdEluVG9rZW5zX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNjYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI2NgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBjYWxsc3ViIGdldEJyaWRnaW5nQ29zdEluVG9rZW5zCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3dpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vuc19yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTAKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiB3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fd2l0aGRyYXdHYXNUb2tlbnNfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQ0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgd2l0aGRyYXdHYXNUb2tlbnMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlQnJpZGdlVG9rZW5fcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIzOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjM4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlQnJpZGdlVG9rZW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkQnJpZGdlVG9rZW5fcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIzMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjMyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkQnJpZGdlVG9rZW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVnaXN0ZXJCcmlkZ2Vfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVnaXN0ZXJCcmlkZ2UKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVjZWl2ZVRva2Vuc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNzgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE3OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlY2VpdmVUb2tlbnMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3dhcEFuZEJyaWRnZV9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo5My05NwogICAgLy8gQGFiaW1ldGhvZCh7CiAgICAvLyAgIGRlZmF1bHRBcmd1bWVudHM6IHsKICAgIC8vICAgICBmZWVUb2tlbkFtb3VudDogeyBjb25zdGFudDogMCB9LAogICAgLy8gICB9LAogICAgLy8gfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo5My05NwogICAgLy8gQGFiaW1ldGhvZCh7CiAgICAvLyAgIGRlZmF1bHRBcmd1bWVudHM6IHsKICAgIC8vICAgICBmZWVUb2tlbkFtb3VudDogeyBjb25zdGFudDogMCB9LAogICAgLy8gICB9LAogICAgLy8gfSkKICAgIGNhbGxzdWIgc3dhcEFuZEJyaWRnZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9ub29wX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcHRJbkFzc2V0X3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc0CiAgICAvLyBvcHRJbkFzc2V0KGFzc2V0SWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc0CiAgICAvLyBvcHRJbkFzc2V0KGFzc2V0SWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgY2FsbHN1YiBvcHRJbkFzc2V0CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZUFwcGxpY2F0aW9uX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo6Z2V0UHJldkFzc2V0UGF5KGFzc2V0SWQ6IHVpbnQ2NCkgLT4gdWludDY0OgpnZXRQcmV2QXNzZXRQYXk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRQcmV2QXNzZXRQYXkoYXNzZXRJZDogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjM2CiAgICAvLyBhc3NlcnQoVHhuLmdyb3VwSW5kZXggPiAwLCBgQXNzZXQgdHhuIG1pc3NpbmdgKTsKICAgIHR4biBHcm91cEluZGV4CiAgICBhc3NlcnQgLy8gQXNzZXQgdHhuIG1pc3NpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czozOQogICAgLy8gY29uc3QgcHJldklkeDogdWludDY0ID0gVHhuLmdyb3VwSW5kZXggLSAxOwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDEKICAgIC8vIGNvbnN0IHBheSA9IGd0eG4uQXNzZXRUcmFuc2ZlclR4bihwcmV2SWR4KTsKICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDQKICAgIC8vIGFzc2VydChwYXkuYXNzZXRSZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIGBBc3NldCBtdXN0IGdvIHRvIGFwcGApOwogICAgZHVwCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBBc3NldCBtdXN0IGdvIHRvIGFwcAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjQ1CiAgICAvLyBhc3NlcnQocGF5LnhmZXJBc3NldC5pZCA9PT0gYXNzZXRJZCwgYFdyb25nIGFzc2V0YCk7CiAgICBkdXAKICAgIGd0eG5zIFhmZXJBc3NldAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDgKICAgIC8vIGFzc2VydChwYXkucmVrZXlUbyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLCBgUmVrZXkgbm90IGFsbG93ZWRgKTsKICAgIGR1cAogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIFJla2V5IG5vdCBhbGxvd2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDkKICAgIC8vIGFzc2VydChwYXkuYXNzZXRDbG9zZVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsIGBDbG9zZVRvIG5vdCBhbGxvd2VkYCk7CiAgICBkdXAKICAgIGd0eG5zIEFzc2V0Q2xvc2VUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIENsb3NlVG8gbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo1MAogICAgLy8gcmV0dXJuIHBheS5hc3NldEFtb3VudDsKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6OmdldFByZXZQYXkocmVsVHhJbmRleDogdWludDY0KSAtPiB1aW50NjQ6CmdldFByZXZQYXk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTMKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRQcmV2UGF5KHJlbFR4SW5kZXg6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTQKICAgIC8vIGlmIChUeG4uZ3JvdXBJbmRleCA8IHJlbFR4SW5kZXgpIHJldHVybiAwOwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYnogZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDIKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTYKICAgIC8vIGNvbnN0IHR4SWR4OiB1aW50NjQgPSBUeG4uZ3JvdXBJbmRleCAtIHJlbFR4SW5kZXg7CiAgICB0eG4gR3JvdXBJbmRleAogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjU4CiAgICAvLyBpZiAoZ3R4bi5UcmFuc2FjdGlvbih0eElkeCkudHlwZSAhPT0gVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpIHJldHVybiAwOwogICAgZ3R4bnMgVHlwZUVudW0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA0CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjU5CiAgICAvLyBjb25zdCBwYXkgPSBndHhuLlBheW1lbnRUeG4odHhJZHgpOwogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo2MQogICAgLy8gaWYgKHBheS5yZWNlaXZlciAhPT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpIHJldHVybiAwOwogICAgZnJhbWVfZGlnIDEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgIT0KICAgIGJ6IGdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA2CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjYzCiAgICAvLyBpZiAocGF5LnJla2V5VG8gIT09IEdsb2JhbC56ZXJvQWRkcmVzcykgcmV0dXJuIDA7CiAgICBmcmFtZV9kaWcgMQogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDgKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NjQKICAgIC8vIGlmIChwYXkuY2xvc2VSZW1haW5kZXJUbyAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSByZXR1cm4gMDsKICAgIGZyYW1lX2RpZyAxCiAgICBndHhucyBDbG9zZVJlbWFpbmRlclRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBnZXRQcmV2UGF5X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjY2CiAgICAvLyByZXR1cm4gcGF5LmFtb3VudDsKICAgIGZyYW1lX2RpZyAxCiAgICBndHhucyBBbW91bnQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLmNyZWF0ZUFwcGxpY2F0aW9uKG93bmVyOiBieXRlcywgY2hhaW5JZDogYnl0ZXMsIG1lc3NlbmdlcjogdWludDY0LCBnYXNPcmFjbGU6IHVpbnQ2NCkgLT4gdm9pZDoKY3JlYXRlQXBwbGljYXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgcHJvdG8gNCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgYnl0ZWNfMyAvLyAib3duZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo5CiAgICAvLyB0aGlzLm93bmVyLnZhbHVlID0gb3duZXI7CiAgICBmcmFtZV9kaWcgLTQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjkKICAgIC8vIGdhc09yYWNsZSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgYnl0ZWMgNCAvLyAiZ2FzT3JhY2xlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxNAogICAgLy8gdGhpcy5nYXNPcmFjbGUudmFsdWUgPSBnYXNPcmFjbGU7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjM5CiAgICAvLyBwcml2YXRlIHN0b3BBdXRob3JpdHkgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGJ5dGVjIDEwIC8vICJzdG9wQXV0aG9yaXR5IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1NAogICAgLy8gdGhpcy5zdG9wQXV0aG9yaXR5LnZhbHVlID0gb3duZXI7CiAgICBmcmFtZV9kaWcgLTQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBjaGFpbklkID0gR2xvYmFsU3RhdGU8Qnl0ZT4oKTsKICAgIGJ5dGVjIDUgLy8gImNoYWluSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjcwCiAgICAvLyB0aGlzLmNoYWluSWQudmFsdWUgPSBjaGFpbklkOwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gbWVzc2VuZ2VyID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBieXRlY18yIC8vICJtZXNzZW5nZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyB0aGlzLm1lc3Nlbmdlci52YWx1ZSA9IG1lc3NlbmdlcjsKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5vcHRJbkFzc2V0KGFzc2V0SWQ6IHVpbnQ2NCkgLT4gdm9pZDoKb3B0SW5Bc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NzQKICAgIC8vIG9wdEluQXNzZXQoYXNzZXRJZDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NzUKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo3OC04NAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBBc3NldChhc3NldElkKSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo4MgogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjgxCiAgICAvLyBhc3NldEFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc4LTgzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IEFzc2V0KGFzc2V0SWQpLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo3OC04NAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBBc3NldChhc3NldElkKSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6ODYKICAgIC8vIGxvZygnQnJpZGdlOiBvcHQtaW4gY29tcGxldGVkJyk7CiAgICBwdXNoYnl0ZXMgIkJyaWRnZTogb3B0LWluIGNvbXBsZXRlZCIKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLnN3YXBBbmRCcmlkZ2UodG9rZW5JZDogdWludDY0LCByZWNpcGllbnQ6IGJ5dGVzLCBkZXN0aW5hdGlvbkNoYWluSWQ6IGJ5dGVzLCByZWNlaXZlVG9rZW46IGJ5dGVzLCBub25jZTogYnl0ZXMsIGZlZVRva2VuQW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CnN3YXBBbmRCcmlkZ2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjkzLTEwNQogICAgLy8gQGFiaW1ldGhvZCh7CiAgICAvLyAgIGRlZmF1bHRBcmd1bWVudHM6IHsKICAgIC8vICAgICBmZWVUb2tlbkFtb3VudDogeyBjb25zdGFudDogMCB9LAogICAgLy8gICB9LAogICAgLy8gfSkKICAgIC8vIHN3YXBBbmRCcmlkZ2UoCiAgICAvLyAgIHRva2VuSWQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIGRlc3RpbmF0aW9uQ2hhaW5JZDogQnl0ZSwKICAgIC8vICAgcmVjZWl2ZVRva2VuOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIG5vbmNlOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIGZlZVRva2VuQW1vdW50OiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDYgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1MAogICAgLy8gY2FuU3dhcCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2MQogICAgLy8gYXNzZXJ0KHRoaXMuY2FuU3dhcC52YWx1ZSwgJ1JvdXRlcjogc3dhcCBwcm9oaWJpdGVkJyk7CiAgICBhc3NlcnQgLy8gUm91dGVyOiBzd2FwIHByb2hpYml0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyBjb25zdCBhbW91bnQgPSBnZXRQcmV2QXNzZXRQYXkodG9rZW5JZCk7CiAgICBmcmFtZV9kaWcgLTYKICAgIGNhbGxzdWIgZ2V0UHJldkFzc2V0UGF5CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTA4CiAgICAvLyBhc3NlcnQoYW1vdW50ID4gZmVlVG9rZW5BbW91bnQsICdCcmlkZ2U6IGFtb3VudCB0b28gbG93IGZvciBmZWUnKTsKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEJyaWRnZTogYW1vdW50IHRvbyBsb3cgZm9yIGZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMDkKICAgIC8vIGFzc2VydCghcmVjaXBpZW50LmJ5dGVzLmVxdWFscyhiemVybygzMikpLCAnQnJpZGdlOiBicmlkZ2UgdG8gdGhlIHplcm8gYWRkcmVzcycpOwogICAgcHVzaGludCAzMiAvLyAzMgogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtNQogICAgPT0KICAgICEKICAgIGFzc2VydCAvLyBCcmlkZ2U6IGJyaWRnZSB0byB0aGUgemVybyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gY29uc3QgZmVlRnJvbU5hdGl2ZTogdWludDY0ID0gZ2V0UHJldlBheSgyKTsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBjYWxsc3ViIGdldFByZXZQYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzQxCiAgICAvLyBpZiAoZmVlVG9rZW5BbW91bnQgPT09IDApIHJldHVybiAwOwogICAgZnJhbWVfZGlnIC0xCiAgICBibnogc3dhcEFuZEJyaWRnZV9hZnRlcl9pZl9lbHNlQDMKICAgIGludGNfMCAvLyAwCgpzd2FwQW5kQnJpZGdlX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLl9jb252ZXJ0QnJpZGdpbmdGZWVJblRva2Vuc1RvTmF0aXZlVG9rZW5ANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTEzCiAgICAvLyBjb25zdCBicmlkZ2luZ0ZlZTogdWludDY0ID0gZmVlRnJvbU5hdGl2ZSArIGZlZUZyb21TdGFibGU7CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBkaWcgMgogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIGVtaXQ8QnJpZGdpbmdGZWVGcm9tVG9rZW5zPih7IGZlZUZyb21OYXRpdmUsIGZlZUZyb21TdGFibGUsIGZlZVN0YWJsZVRva2VuQW1vdW50OiBmZWVUb2tlbkFtb3VudCB9KTsKICAgIHN3YXAKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MzZiYWZhZGQgLy8gbWV0aG9kICJCcmlkZ2luZ0ZlZUZyb21Ub2tlbnModWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTE2CiAgICAvLyBjb25zdCBhbW91bnRBZnRlckZlZTogdWludDY0ID0gYW1vdW50IC0gZmVlVG9rZW5BbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gY29uc3QgdlVzZEFtb3VudCA9IHRoaXMuc2VuZEFuZFN3YXBUb1ZVc2QodG9rZW5JZCwgc2VuZGVyLCBhbW91bnRBZnRlckZlZSk7CiAgICBmcmFtZV9kaWcgLTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTE3CiAgICAvLyBjb25zdCBzZW5kZXIgPSBuZXcgQWRkcmVzcyhUeG4uc2VuZGVyKTsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTE4CiAgICAvLyBjb25zdCB2VXNkQW1vdW50ID0gdGhpcy5zZW5kQW5kU3dhcFRvVlVzZCh0b2tlbklkLCBzZW5kZXIsIGFtb3VudEFmdGVyRmVlKTsKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBzZW5kQW5kU3dhcFRvVlVzZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NgogICAgLy8gY2hhaW5JZCA9IEdsb2JhbFN0YXRlPEJ5dGU+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiY2hhaW5JZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gYXNzZXJ0KGRlc3RpbmF0aW9uQ2hhaW5JZCAhPT0gdGhpcy5jaGFpbklkLnZhbHVlLCAnQnJpZGdlOiB3cm9uZyBkZXN0aW5hdGlvbiBjaGFpbicpOwogICAgZnJhbWVfZGlnIC00CiAgICAhPQogICAgYXNzZXJ0IC8vIEJyaWRnZTogd3JvbmcgZGVzdGluYXRpb24gY2hhaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzM3CiAgICAvLyByZXR1cm4gY2hhaW5JZC5ieXRlcy5jb25jYXQodG9rZW4uYnl0ZXMpOwogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2NgogICAgLy8gb3RoZXJCcmlkZ2VUb2tlbnMgPSBCb3hNYXA8Ynl0ZXMsIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ3QnIH0pOwogICAgYnl0ZWMgNyAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzEKICAgIC8vIGFzc2VydCh0aGlzLm90aGVyQnJpZGdlVG9rZW5zKHRoaXMuX2dldE90aGVyQnJpZGdlVG9rZW5zS2V5KGRlc3RpbmF0aW9uQ2hhaW5JZCwgcmVjZWl2ZVRva2VuKSkuZXhpc3RzLCAnQnJpZGdlOiB1bmtub3duIGNoYWluIG9yIHRva2VuJyk7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBCcmlkZ2U6IHVua25vd24gY2hhaW4gb3IgdG9rZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIGNoYWluSWQgPSBHbG9iYWxTdGF0ZTxCeXRlPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImNoYWluSWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzMKICAgIC8vIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmhhc2hNZXNzYWdlKGFtb3VudCwgcmVjaXBpZW50LCB0aGlzLmNoYWluSWQudmFsdWUsIGRlc3RpbmF0aW9uQ2hhaW5JZCwgcmVjZWl2ZVRva2VuLCBub25jZSk7CiAgICBkaWcgMQogICAgZnJhbWVfZGlnIC01CiAgICB1bmNvdmVyIDIKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgaGFzaE1lc3NhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTM0CiAgICAvLyBjb25zdCBicmlkZ2VUcmFuc2FjdGlvbkNvc3QgPSB0aGlzLmdldFRyYW5zYWN0aW9uQ29zdChkZXN0aW5hdGlvbkNoYWluSWQpOwogICAgZnJhbWVfZGlnIC00CiAgICBjYWxsc3ViIGdldFRyYW5zYWN0aW9uQ29zdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2MQogICAgLy8gc2VudE1lc3NhZ2VzID0gQm94TWFwPFN0YXRpY0J5dGVzPDMyPiwgU3RhdGljQnl0ZXM+KHsga2V5UHJlZml4OiAncycgfSk7CiAgICBwdXNoYnl0ZXMgInMiCiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE1MgogICAgLy8gYXNzZXJ0KCF0aGlzLnNlbnRNZXNzYWdlcyhtZXNzYWdlKS5leGlzdHMsICdCcmlkZ2U6IHRva2VucyBhbHJlYWR5IHNlbnQnKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gQnJpZGdlOiB0b2tlbnMgYWxyZWFkeSBzZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE1NAogICAgLy8gdGhpcy5zZW50TWVzc2FnZXMobWVzc2FnZSkudmFsdWUgPSBuZXcgU3RhdGljQnl0ZXMoKTsKICAgIHB1c2hieXRlcyAweAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGNvbnN0IGRlc3RpbmF0aW9uQ2hhaW5JZCA9IG1lc3NhZ2UuYXQoMSk7CiAgICBkaWcgMQogICAgZXh0cmFjdCAxIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE1Ny0xNjAKICAgIC8vIGNvbnN0IG1lc3NhZ2VDb3N0ID0gYWJpQ2FsbChNZXNzZW5nZXIucHJvdG90eXBlLmdldFRyYW5zYWN0aW9uQ29zdCwgewogICAgLy8gICBhcHBJZDogdGhpcy5tZXNzZW5nZXIudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtkZXN0aW5hdGlvbkNoYWluSWRdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU3CiAgICAvLyBtZXNzZW5nZXIgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJtZXNzZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTctMTYwCiAgICAvLyBjb25zdCBtZXNzYWdlQ29zdCA9IGFiaUNhbGwoTWVzc2VuZ2VyLnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbkNvc3QsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgYnl0ZWMgMTMgLy8gbWV0aG9kICJnZXRUcmFuc2FjdGlvbkNvc3QoYnl0ZSl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU3CiAgICAvLyBtZXNzZW5nZXIgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJtZXNzZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIHJlY2VpdmVyOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5hZGRyZXNzLAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gbWVzc2VuZ2VyID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibWVzc2VuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTc0CiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKHBheW1lbnRQYXJhbXMsIGFwcENhbGxQYXJhbXMpOwogICAgaXR4bl9iZWdpbgogICAgc3dhcAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE2Mi0xNjUKICAgIC8vIGNvbnN0IHBheW1lbnRQYXJhbXMgPSBpdHhuLnBheW1lbnQoewogICAgLy8gICBhbW91bnQ6IG1lc3NhZ2VDb3N0LAogICAgLy8gICByZWNlaXZlcjogdGhpcy5tZXNzZW5nZXIudmFsdWUuYWRkcmVzcywKICAgIC8vIH0pOwogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNzQKICAgIC8vIGl0eG4uc3VibWl0R3JvdXAocGF5bWVudFBhcmFtcywgYXBwQ2FsbFBhcmFtcyk7CiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBhcmM0Lm1ldGhvZFNlbGVjdG9yKCdzZW5kTWVzc2FnZShieXRlWzMyXSl2b2lkJyksCiAgICBwdXNoYnl0ZXMgMHhhMzI0OTk4OSAvLyBtZXRob2QgInNlbmRNZXNzYWdlKGJ5dGVbMzJdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE2Ny0xNzMKICAgIC8vIGNvbnN0IGFwcENhbGxQYXJhbXMgPSBpdHhuLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgIGFwcElkOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5pZCwKICAgIC8vICAgYXBwQXJnczogWwogICAgLy8gICAgIGFyYzQubWV0aG9kU2VsZWN0b3IoJ3NlbmRNZXNzYWdlKGJ5dGVbMzJdKXZvaWQnKSwKICAgIC8vICAgICBtZXNzYWdlLAogICAgLy8gICBdLAogICAgLy8gfSk7CiAgICBpbnRjXzIgLy8gNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE3NAogICAgLy8gaXR4bi5zdWJtaXRHcm91cChwYXltZW50UGFyYW1zLCBhcHBDYWxsUGFyYW1zKTsKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzNgogICAgLy8gZW1pdDxSZWNlaXZlRmVlPih7IGJyaWRnZVRyYW5zYWN0aW9uQ29zdCwgbWVzc2FnZVRyYW5zYWN0aW9uQ29zdCB9KTsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBkaWcgMQogICAgaXRvYgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg0YjU1NDE5YiAvLyBtZXRob2QgIlJlY2VpdmVGZWUodWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzcKICAgIC8vIGFzc2VydChicmlkZ2luZ0ZlZSA+PSBicmlkZ2VUcmFuc2FjdGlvbkNvc3QgKyBtZXNzYWdlVHJhbnNhY3Rpb25Db3N0LCAnQnJpZGdlOiBub3QgZW5vdWdoIGZlZScpOwogICAgKwogICAgdW5jb3ZlciAyCiAgICA8PQogICAgYXNzZXJ0IC8vIEJyaWRnZTogbm90IGVub3VnaCBmZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTM5CiAgICAvLyBhbW91bnQsCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzOC0xNDUKICAgIC8vIGVtaXQ8VG9rZW5zU2VudD4oewogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICByZWNpcGllbnQsCiAgICAvLyAgICAgZGVzdGluYXRpb25DaGFpbklkLAogICAgLy8gICAgIHJlY2VpdmVUb2tlbiwKICAgIC8vICAgICBub25jZSwKICAgIC8vICAgICBtZXNzZW5nZXI6IEFMTEJSSURHRV9NRVNTRU5HRVIsCiAgICAvLyAgIH0sCiAgICBmcmFtZV9kaWcgLTUKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC00CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1MgogICAgLy8gY29uc3QgQUxMQlJJREdFX01FU1NFTkdFUiA9IG5ldyBCeXRlKDEpOwogICAgYnl0ZWMgMTEgLy8gMHgwMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzgtMTQ1CiAgICAvLyBlbWl0PFRva2Vuc1NlbnQ+KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGRlc3RpbmF0aW9uQ2hhaW5JZCwKICAgIC8vICAgICByZWNlaXZlVG9rZW4sCiAgICAvLyAgICAgbm9uY2UsCiAgICAvLyAgICAgbWVzc2VuZ2VyOiBBTExCUklER0VfTUVTU0VOR0VSLAogICAgLy8gICB9LAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzOC0xNDYKICAgIC8vIGVtaXQ8VG9rZW5zU2VudD4oewogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICByZWNpcGllbnQsCiAgICAvLyAgICAgZGVzdGluYXRpb25DaGFpbklkLAogICAgLy8gICAgIHJlY2VpdmVUb2tlbiwKICAgIC8vICAgICBub25jZSwKICAgIC8vICAgICBtZXNzZW5nZXI6IEFMTEJSSURHRV9NRVNTRU5HRVIsCiAgICAvLyAgIH0sCiAgICAvLyApOwogICAgcHVzaGJ5dGVzIDB4MjI5ZmJhZWMgLy8gbWV0aG9kICJUb2tlbnNTZW50KHVpbnQ2NCxieXRlWzMyXSxieXRlLGJ5dGVbMzJdLGJ5dGVbMzJdLGJ5dGUpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKc3dhcEFuZEJyaWRnZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjM0MwogICAgLy8gY29uc3QgZmVlOiB1aW50NjQgPSB0aGlzLmJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWUgKiBmZWVUb2tlbkFtb3VudCAvIGFiaUNhbGwoR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRQcmljZSwgewogICAgZnJhbWVfZGlnIC02CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjM2CiAgICAvLyBwcm90ZWN0ZWQgYnJpZGdpbmdGZWVDb252ZXJzaW9uU2NhbGluZ0ZhY3RvciA9IEJveE1hcDx1aW50NjQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdmJyB9KTsKICAgIHB1c2hieXRlcyAiZiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozNDMKICAgIC8vIGNvbnN0IGZlZTogdWludDY0ID0gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlICogZmVlVG9rZW5BbW91bnQgLyBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0UHJpY2UsIHsKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHN3YXAKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzQzLTM0NgogICAgLy8gY29uc3QgZmVlOiB1aW50NjQgPSB0aGlzLmJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWUgKiBmZWVUb2tlbkFtb3VudCAvIGFiaUNhbGwoR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRQcmljZSwgewogICAgLy8gICBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLmNoYWluSWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjkKICAgIC8vIGdhc09yYWNsZSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdhc09yYWNsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBjaGFpbklkID0gR2xvYmFsU3RhdGU8Qnl0ZT4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjaGFpbklkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzQzLTM0NgogICAgLy8gY29uc3QgZmVlOiB1aW50NjQgPSB0aGlzLmJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWUgKiBmZWVUb2tlbkFtb3VudCAvIGFiaUNhbGwoR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRQcmljZSwgewogICAgLy8gICBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLmNoYWluSWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBwdXNoYnl0ZXMgMHgxZGI3MGNkZCAvLyBtZXRob2QgImdldFByaWNlKGJ5dGUpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYnRvaQogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMTIKICAgIC8vIGNvbnN0IGZlZUZyb21TdGFibGU6IHVpbnQ2NCA9IHRoaXMuX2NvbnZlcnRCcmlkZ2luZ0ZlZUluVG9rZW5zVG9OYXRpdmVUb2tlbih0b2tlbklkLCBmZWVUb2tlbkFtb3VudCk7CiAgICBiIHN3YXBBbmRCcmlkZ2VfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuX2NvbnZlcnRCcmlkZ2luZ0ZlZUluVG9rZW5zVG9OYXRpdmVUb2tlbkA1CgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLnJlY2VpdmVUb2tlbnMoYW1vdW50OiB1aW50NjQsIHJlY2lwaWVudDogYnl0ZXMsIHNvdXJjZUNoYWluSWQ6IGJ5dGVzLCByZWNlaXZlVG9rZW46IGJ5dGVzLCBub25jZTogYnl0ZXMsIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCkgLT4gdm9pZDoKcmVjZWl2ZVRva2VuczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTc4LTE4NgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyByZWNlaXZlVG9rZW5zKAogICAgLy8gICBhbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIHNvdXJjZUNoYWluSWQ6IEJ5dGUsCiAgICAvLyAgIHJlY2VpdmVUb2tlbjogU3RhdGljQnl0ZXM8MzI+LAogICAgLy8gICBub25jZTogU3RhdGljQnl0ZXM8MzI+LAogICAgLy8gICByZWNlaXZlQW1vdW50TWluOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDYgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1MAogICAgLy8gY2FuU3dhcCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2MQogICAgLy8gYXNzZXJ0KHRoaXMuY2FuU3dhcC52YWx1ZSwgJ1JvdXRlcjogc3dhcCBwcm9oaWJpdGVkJyk7CiAgICBhc3NlcnQgLy8gUm91dGVyOiBzd2FwIHByb2hpYml0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NjMKICAgIC8vIG90aGVyQnJpZGdlcyA9IEJveE1hcDxCeXRlLCBTdGF0aWNCeXRlczwzMj4+KHsga2V5UHJlZml4OiAnYicgfSk7CiAgICBwdXNoYnl0ZXMgImIiCiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxODgKICAgIC8vIGFzc2VydCh0aGlzLm90aGVyQnJpZGdlcyhzb3VyY2VDaGFpbklkKS5leGlzdHMsICdCcmlkZ2U6IHNvdXJjZSBub3QgcmVnaXN0ZXJlZCcpOwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQnJpZGdlOiBzb3VyY2Ugbm90IHJlZ2lzdGVyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTg5CiAgICAvLyBjb25zdCB2YWx1ZTogdWludDY0ID0gZ2V0UHJldlBheSgxKTsKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGdldFByZXZQYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTkxCiAgICAvLyBhc3NlcnQodmFsdWUgPj0gc3RvcmFnZUZlZSwgJ0JyaWRnZTogbm90IGVub3VnaCBmZWUnKTsKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMjQKICAgIC8vIHJldHVybiAxNTcwMDsKICAgIGludGMgNCAvLyAxNTcwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxOTEKICAgIC8vIGFzc2VydCh2YWx1ZSA+PSBzdG9yYWdlRmVlLCAnQnJpZGdlOiBub3QgZW5vdWdoIGZlZScpOwogICAgPj0KICAgIGFzc2VydCAvLyBCcmlkZ2U6IG5vdCBlbm91Z2ggZmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBjaGFpbklkID0gR2xvYmFsU3RhdGU8Qnl0ZT4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjaGFpbklkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTkzCiAgICAvLyBjb25zdCBtZXNzYWdlID0gdGhpcy5oYXNoTWVzc2FnZShhbW91bnQsIHJlY2lwaWVudCwgc291cmNlQ2hhaW5JZCwgdGhpcy5jaGFpbklkLnZhbHVlLCByZWNlaXZlVG9rZW4sIG5vbmNlKTsKICAgIGZyYW1lX2RpZyAtNgogICAgZnJhbWVfZGlnIC01CiAgICBmcmFtZV9kaWcgLTQKICAgIHVuY292ZXIgMwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgaGFzaE1lc3NhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo4MAogICAgLy8gY29uc3QgaDogYnl0ZXMgPSBvcC5rZWNjYWsyNTYob3AuY29uY2F0KG1lc3NhZ2UuYnl0ZXMsIHNlbmRlckFkZHJlc3MpKTsKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIGNvbnN0IG1lc3NhZ2VXaXRoU2VuZGVyID0gaGFzaFdpdGhTZW5kZXJBZGRyZXNzKG1lc3NhZ2UsIFR4bi5zZW5kZXIuYnl0ZXMpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjgwCiAgICAvLyBjb25zdCBoOiBieXRlcyA9IG9wLmtlY2NhazI1NihvcC5jb25jYXQobWVzc2FnZS5ieXRlcywgc2VuZGVyQWRkcmVzcykpOwogICAgY29uY2F0CiAgICBrZWNjYWsyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo4MwogICAgLy8gY29uc3QgZmlyc3QyID0gb3Auc3Vic3RyaW5nKG1lc3NhZ2UuYnl0ZXMsIDAsIDIpOwogICAgc3dhcAogICAgc3Vic3RyaW5nIDAgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjg1CiAgICAvLyBjb25zdCBsYXN0MzAgPSBvcC5zdWJzdHJpbmcoaCwgMiwgMzIpOwogICAgc3dhcAogICAgc3Vic3RyaW5nIDIgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo4OAogICAgLy8gcmV0dXJuIG5ldyBTdGF0aWNCeXRlczwzMj4ob3AuY29uY2F0KGZpcnN0MiwgbGFzdDMwKSk7CiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1OQogICAgLy8gcHJvY2Vzc2VkTWVzc2FnZXMgPSBCb3hNYXA8U3RhdGljQnl0ZXM8MzI+LCBTdGF0aWNCeXRlcz4oeyBrZXlQcmVmaXg6ICdtJyB9KTsKICAgIHB1c2hieXRlcyAibSIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTk2CiAgICAvLyBhc3NlcnQoIXRoaXMucHJvY2Vzc2VkTWVzc2FnZXMobWVzc2FnZVdpdGhTZW5kZXIpLmV4aXN0cywgJ0JyaWRnZTogbWVzc2FnZSBwcm9jZXNzZWQnKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gQnJpZGdlOiBtZXNzYWdlIHByb2Nlc3NlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxOTgKICAgIC8vIHRoaXMucHJvY2Vzc2VkTWVzc2FnZXMobWVzc2FnZVdpdGhTZW5kZXIpLnZhbHVlID0gbmV3IFN0YXRpY0J5dGVzKCk7CiAgICBwdXNoYnl0ZXMgMHgKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjAxLTIwNAogICAgLy8gYXNzZXJ0KGFiaUNhbGwoTWVzc2VuZ2VyLnByb3RvdHlwZS5yZWNlaXZlZE1lc3NhZ2VzLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW21lc3NhZ2VXaXRoU2VuZGVyXSwKICAgIC8vIH0pLnJldHVyblZhbHVlLCAnQnJpZGdlOiBubyBtZXNzYWdlJyk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU3CiAgICAvLyBtZXNzZW5nZXIgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJtZXNzZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMDEtMjA0CiAgICAvLyBhc3NlcnQoYWJpQ2FsbChNZXNzZW5nZXIucHJvdG90eXBlLnJlY2VpdmVkTWVzc2FnZXMsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbbWVzc2FnZVdpdGhTZW5kZXJdLAogICAgLy8gfSkucmV0dXJuVmFsdWUsICdCcmlkZ2U6IG5vIG1lc3NhZ2UnKTsKICAgIHB1c2hieXRlcyAweDMzZTE0N2FhIC8vIG1ldGhvZCAicmVjZWl2ZWRNZXNzYWdlcyhieXRlWzMyXSlib29sIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYXNzZXJ0IC8vIEJyaWRnZTogbm8gbWVzc2FnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMDYKICAgIC8vIGNvbnN0IHRva2VuSWQ6IHVpbnQ2NCA9IG9wLmV4dHJhY3RVaW50NjQocmVjZWl2ZVRva2VuLmJ5dGVzLCAyNCk7CiAgICBmcmFtZV9kaWcgLTMKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIwOC0yMTMKICAgIC8vIGNvbnN0IHJlY2VpdmVBbW91bnQgPSB0aGlzLnJlY2VpdmVBbmRTd2FwRnJvbVZVc2QoCiAgICAvLyAgIHRva2VuSWQsCiAgICAvLyAgIHJlY2lwaWVudEFkZHJlc3MsCiAgICAvLyAgIGFtb3VudCwKICAgIC8vICAgcmVjZWl2ZUFtb3VudE1pbiwKICAgIC8vICk7CiAgICBmcmFtZV9kaWcgLTUKICAgIGZyYW1lX2RpZyAtNgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHJlY2VpdmVBbmRTd2FwRnJvbVZVc2QKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjE2CiAgICAvLyBjb25zdCBleHRyYUdhczogdWludDY0ID0gdmFsdWUgLSBzdG9yYWdlRmVlOwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMyNAogICAgLy8gcmV0dXJuIDE1NzAwOwogICAgaW50YyA0IC8vIDE1NzAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIxNgogICAgLy8gY29uc3QgZXh0cmFHYXM6IHVpbnQ2NCA9IHZhbHVlIC0gc3RvcmFnZUZlZTsKICAgIC0KICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzI0CiAgICAvLyByZXR1cm4gMTU3MDA7CiAgICBpbnRjIDQgLy8gMTU3MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjE3CiAgICAvLyBpZiAodmFsdWUgPiBzdG9yYWdlRmVlKSB7CiAgICA+CiAgICBieiByZWNlaXZlVG9rZW5zX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMTgtMjIxCiAgICAvLyBwYXltZW50KHsKICAgIC8vICAgYW1vdW50OiBleHRyYUdhcywKICAgIC8vICAgcmVjZWl2ZXI6IHJlY2lwaWVudEFkZHJlc3MuYnl0ZXMsCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtNQogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZnJhbWVfZGlnIDIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAoKcmVjZWl2ZVRva2Vuc19hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyMwogICAgLy8gZW1pdDxUb2tlbnNSZWNlaXZlZD4oeyByZWNlaXZlQW1vdW50LCByZWNpcGllbnQ6IHJlY2lwaWVudEFkZHJlc3MsIG5vbmNlLCBtZXNzZW5nZXI6IEFMTEJSSURHRV9NRVNTRU5HRVIsIG1lc3NhZ2U6IG1lc3NhZ2VXaXRoU2VuZGVyIH0pOwogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1MgogICAgLy8gY29uc3QgQUxMQlJJREdFX01FU1NFTkdFUiA9IG5ldyBCeXRlKDEpOwogICAgYnl0ZWMgMTEgLy8gMHgwMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMjMKICAgIC8vIGVtaXQ8VG9rZW5zUmVjZWl2ZWQ+KHsgcmVjZWl2ZUFtb3VudCwgcmVjaXBpZW50OiByZWNpcGllbnRBZGRyZXNzLCBub25jZSwgbWVzc2VuZ2VyOiBBTExCUklER0VfTUVTU0VOR0VSLCBtZXNzYWdlOiBtZXNzYWdlV2l0aFNlbmRlciB9KTsKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4NDU4MzZhZDYgLy8gbWV0aG9kICJUb2tlbnNSZWNlaXZlZCh1aW50NjQsYWRkcmVzcyxieXRlWzMyXSxieXRlLGJ5dGVbMzJdKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UucmVnaXN0ZXJCcmlkZ2UoY2hhaW5JZDogYnl0ZXMsIGJyaWRnZUFkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpyZWdpc3RlckJyaWRnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjI2LTIyNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyByZWdpc3RlckJyaWRnZShjaGFpbklkOiBCeXRlLCBicmlkZ2VBZGRyZXNzOiBTdGF0aWNCeXRlczwzMj4pOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMjgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2MwogICAgLy8gb3RoZXJCcmlkZ2VzID0gQm94TWFwPEJ5dGUsIFN0YXRpY0J5dGVzPDMyPj4oeyBrZXlQcmVmaXg6ICdiJyB9KTsKICAgIHB1c2hieXRlcyAiYiIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyOQogICAgLy8gdGhpcy5vdGhlckJyaWRnZXMoY2hhaW5JZCkudmFsdWUgPSBicmlkZ2VBZGRyZXNzOwogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuYWRkQnJpZGdlVG9rZW4oY2hhaW5JZDogYnl0ZXMsIHRva2VuQWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6CmFkZEJyaWRnZVRva2VuOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMzItMjMzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGFkZEJyaWRnZVRva2VuKGNoYWluSWQ6IEJ5dGUsIHRva2VuQWRkcmVzczogU3RhdGljQnl0ZXM8MzI+KTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjM0CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzM3CiAgICAvLyByZXR1cm4gY2hhaW5JZC5ieXRlcy5jb25jYXQodG9rZW4uYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2NgogICAgLy8gb3RoZXJCcmlkZ2VUb2tlbnMgPSBCb3hNYXA8Ynl0ZXMsIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ3QnIH0pOwogICAgYnl0ZWMgNyAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMzUKICAgIC8vIHRoaXMub3RoZXJCcmlkZ2VUb2tlbnModGhpcy5fZ2V0T3RoZXJCcmlkZ2VUb2tlbnNLZXkoY2hhaW5JZCwgdG9rZW5BZGRyZXNzKSkudmFsdWUgPSBuZXcgU3RhdGljQnl0ZXMoKTsKICAgIHB1c2hieXRlcyAweAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLnJlbW92ZUJyaWRnZVRva2VuKGNoYWluSWQ6IGJ5dGVzLCB0b2tlbkFkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVCcmlkZ2VUb2tlbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjM4LTIzOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyByZW1vdmVCcmlkZ2VUb2tlbihjaGFpbklkOiBCeXRlLCB0b2tlbkFkZHJlc3M6IFN0YXRpY0J5dGVzPDMyPik6IHZvaWQgewogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0MAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMzNwogICAgLy8gcmV0dXJuIGNoYWluSWQuYnl0ZXMuY29uY2F0KHRva2VuLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NjYKICAgIC8vIG90aGVyQnJpZGdlVG9rZW5zID0gQm94TWFwPGJ5dGVzLCBTdGF0aWNCeXRlcz4oeyBrZXlQcmVmaXg6ICd0JyB9KTsKICAgIGJ5dGVjIDcgLy8gInQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQxCiAgICAvLyB0aGlzLm90aGVyQnJpZGdlVG9rZW5zKHRoaXMuX2dldE90aGVyQnJpZGdlVG9rZW5zS2V5KGNoYWluSWQsIHRva2VuQWRkcmVzcykpLmRlbGV0ZSgpOwogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2Uud2l0aGRyYXdHYXNUb2tlbnMoYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CndpdGhkcmF3R2FzVG9rZW5zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNDQtMjQ1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHdpdGhkcmF3R2FzVG9rZW5zKGFtb3VudDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQ2CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQ3CiAgICAvLyBwYXltZW50KHsgYW1vdW50OiBhbW91bnQsIHJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0NwogICAgLy8gcGF5bWVudCh7IGFtb3VudDogYW1vdW50LCByZWNlaXZlcjogdGhpcy5vd25lci52YWx1ZS5ieXRlcyB9KS5zdWJtaXQoKTsKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2Uud2l0aGRyYXdCcmlkZ2luZ0ZlZUluVG9rZW5zKGFzc2V0SWQ6IHVpbnQ2NCkgLT4gdm9pZDoKd2l0aGRyYXdCcmlkZ2luZ0ZlZUluVG9rZW5zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTAtMjUxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHdpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vucyhhc3NldElkOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTIKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTQKICAgIC8vIGNvbnN0IGFwcEFjY3Q6IEFjY291bnQgPSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzczsKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjU1CiAgICAvLyBjb25zdCBiYWxhbmNlID0gYXNzZXQuYmFsYW5jZShhcHBBY2N0KTsKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTYKICAgIC8vIGlmIChiYWxhbmNlID4gVWludDY0KDApKSB7CiAgICBieiB3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI1Ny0yNjIKICAgIC8vIGFzc2V0VHJhbnNmZXIoewogICAgLy8gICBzZW5kZXI6IGFwcEFjY3QsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBiYWxhbmNlLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjYKICAgIC8vIHByb3RlY3RlZCBvd25lciA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3duZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgZnJhbWVfZGlnIDAKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI1Ny0yNjIKICAgIC8vIGFzc2V0VHJhbnNmZXIoewogICAgLy8gICBzZW5kZXI6IGFwcEFjY3QsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBiYWxhbmNlLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0Cgp3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLmdldEJyaWRnaW5nQ29zdEluVG9rZW5zKGRlc3RpbmF0aW9uQ2hhaW5JZDogYnl0ZXMsIHRva2VuSWQ6IHVpbnQ2NCkgLT4gdWludDY0OgpnZXRCcmlkZ2luZ0Nvc3RJblRva2VuczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjY2LTI3MAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBnZXRCcmlkZ2luZ0Nvc3RJblRva2VucygKICAgIC8vICAgZGVzdGluYXRpb25DaGFpbklkOiBCeXRlLAogICAgLy8gICB0b2tlbklkOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI3MQogICAgLy8gY29uc3QgYnJpZGdlR2FzQW1vdW50OiB1aW50NjQgPSB0aGlzLmdldEdhc1VzYWdlKGRlc3RpbmF0aW9uQ2hhaW5JZCk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgZ2V0R2FzVXNhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjcyLTI3NQogICAgLy8gY29uc3QgbWVzc2VuZ2VyR2FzQW1vdW50OiB1aW50NjQgPSBhYmlDYWxsKE1lc3Nlbmdlci5wcm90b3R5cGUuZ2V0R2FzVXNhZ2UsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gbWVzc2VuZ2VyID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibWVzc2VuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjcyLTI3NQogICAgLy8gY29uc3QgbWVzc2VuZ2VyR2FzQW1vdW50OiB1aW50NjQgPSBhYmlDYWxsKE1lc3Nlbmdlci5wcm90b3R5cGUuZ2V0R2FzVXNhZ2UsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJnZXRHYXNVc2FnZShieXRlKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzctMjgwCiAgICAvLyByZXR1cm4gYWJpQ2FsbChHYXNPcmFjbGUucHJvdG90eXBlLmdldFRyYW5zYWN0aW9uR2FzQ29zdEluVVNELCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2Rlc3RpbmF0aW9uQ2hhaW5JZCwgYnJpZGdlR2FzQW1vdW50ICsgbWVzc2VuZ2VyR2FzQW1vdW50XSwKICAgIC8vIH0pLnJldHVyblZhbHVlIC8gdGhpcy5mcm9tR2FzT3JhY2xlU2NhbGluZ0ZhY3Rvcih0b2tlbklkKS52YWx1ZTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6OQogICAgLy8gZ2FzT3JhY2xlID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiZ2FzT3JhY2xlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6Mjc5CiAgICAvLyBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkLCBicmlkZ2VHYXNBbW91bnQgKyBtZXNzZW5nZXJHYXNBbW91bnRdLAogICAgY292ZXIgMgogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzctMjgwCiAgICAvLyByZXR1cm4gYWJpQ2FsbChHYXNPcmFjbGUucHJvdG90eXBlLmdldFRyYW5zYWN0aW9uR2FzQ29zdEluVVNELCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2Rlc3RpbmF0aW9uQ2hhaW5JZCwgYnJpZGdlR2FzQW1vdW50ICsgbWVzc2VuZ2VyR2FzQW1vdW50XSwKICAgIC8vIH0pLnJldHVyblZhbHVlIC8gdGhpcy5mcm9tR2FzT3JhY2xlU2NhbGluZ0ZhY3Rvcih0b2tlbklkKS52YWx1ZTsKICAgIHB1c2hieXRlcyAweDdiZjdkNTBjIC8vIG1ldGhvZCAiZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5VU0QoYnl0ZSx1aW50NjQpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyODAKICAgIC8vIH0pLnJldHVyblZhbHVlIC8gdGhpcy5mcm9tR2FzT3JhY2xlU2NhbGluZ0ZhY3Rvcih0b2tlbklkKS52YWx1ZTsKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozMwogICAgLy8gcHJvdGVjdGVkIGZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ2UnIH0pOwogICAgcHVzaGJ5dGVzICJlIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI4MAogICAgLy8gfSkucmV0dXJuVmFsdWUgLyB0aGlzLmZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlOwogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgc3dhcAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6Mjc3LTI4MAogICAgLy8gcmV0dXJuIGFiaUNhbGwoR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbkdhc0Nvc3RJblVTRCwgewogICAgLy8gICBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtkZXN0aW5hdGlvbkNoYWluSWQsIGJyaWRnZUdhc0Ftb3VudCArIG1lc3Nlbmdlckdhc0Ftb3VudF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZSAvIHRoaXMuZnJvbUdhc09yYWNsZVNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWU7CiAgICAvCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuaGFzaE1lc3NhZ2UoYW1vdW50OiB1aW50NjQsIHJlY2lwaWVudDogYnl0ZXMsIHNvdXJjZUNoYWluSWQ6IGJ5dGVzLCBkZXN0aW5hdGlvbkNoYWluSWQ6IGJ5dGVzLCByZWNlaXZlVG9rZW46IGJ5dGVzLCBub25jZTogYnl0ZXMpIC0+IGJ5dGVzOgpoYXNoTWVzc2FnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjgzLTI5MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBoYXNoTWVzc2FnZSgKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHJlY2lwaWVudDogU3RhdGljQnl0ZXM8MzI+LAogICAgLy8gICBzb3VyY2VDaGFpbklkOiBCeXRlLAogICAgLy8gICBkZXN0aW5hdGlvbkNoYWluSWQ6IEJ5dGUsCiAgICAvLyAgIHJlY2VpdmVUb2tlbjogU3RhdGljQnl0ZXM8MzI+LAogICAgLy8gICBub25jZTogU3RhdGljQnl0ZXM8MzI+LAogICAgLy8gKTogU3RhdGljQnl0ZXM8MzI+IHsKICAgIHByb3RvIDYgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyOTIKICAgIC8vIGNvbnN0IGFtb3VudDMyID0gYnplcm8oMjQpLmNvbmNhdChvcC5pdG9iKGFtb3VudCkpOwogICAgcHVzaGludCAyNCAvLyAyNAogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtNgogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI5MwogICAgLy8gY29uc3Qgc291cmNlQ2hhaW5JZDMyID0gYnplcm8oMzEpLmNvbmNhdChzb3VyY2VDaGFpbklkLmJ5dGVzKTsKICAgIHB1c2hpbnQgMzEgLy8gMzEKICAgIGJ6ZXJvCiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyOTQtMjk1CiAgICAvLyBjb25zdCBwYWNrZWQgPSBhbW91bnQzMgogICAgLy8gICAuY29uY2F0KHJlY2lwaWVudC5ieXRlcykKICAgIHN3YXAKICAgIGZyYW1lX2RpZyAtNQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI5NC0yOTYKICAgIC8vIGNvbnN0IHBhY2tlZCA9IGFtb3VudDMyCiAgICAvLyAgIC5jb25jYXQocmVjaXBpZW50LmJ5dGVzKQogICAgLy8gICAuY29uY2F0KHNvdXJjZUNoYWluSWQzMikKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyOTQtMjk3CiAgICAvLyBjb25zdCBwYWNrZWQgPSBhbW91bnQzMgogICAgLy8gICAuY29uY2F0KHJlY2lwaWVudC5ieXRlcykKICAgIC8vICAgLmNvbmNhdChzb3VyY2VDaGFpbklkMzIpCiAgICAvLyAgIC5jb25jYXQocmVjZWl2ZVRva2VuLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6Mjk0LTI5OAogICAgLy8gY29uc3QgcGFja2VkID0gYW1vdW50MzIKICAgIC8vICAgLmNvbmNhdChyZWNpcGllbnQuYnl0ZXMpCiAgICAvLyAgIC5jb25jYXQoc291cmNlQ2hhaW5JZDMyKQogICAgLy8gICAuY29uY2F0KHJlY2VpdmVUb2tlbi5ieXRlcykKICAgIC8vICAgLmNvbmNhdChub25jZS5ieXRlcykKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjUyCiAgICAvLyBjb25zdCBBTExCUklER0VfTUVTU0VOR0VSID0gbmV3IEJ5dGUoMSk7CiAgICBieXRlYyAxMSAvLyAweDAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI5NC0yOTkKICAgIC8vIGNvbnN0IHBhY2tlZCA9IGFtb3VudDMyCiAgICAvLyAgIC5jb25jYXQocmVjaXBpZW50LmJ5dGVzKQogICAgLy8gICAuY29uY2F0KHNvdXJjZUNoYWluSWQzMikKICAgIC8vICAgLmNvbmNhdChyZWNlaXZlVG9rZW4uYnl0ZXMpCiAgICAvLyAgIC5jb25jYXQobm9uY2UuYnl0ZXMpCiAgICAvLyAgIC5jb25jYXQoQUxMQlJJREdFX01FU1NFTkdFUi5ieXRlcyk7CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzAxCiAgICAvLyBjb25zdCBoYXNoID0gb3Aua2VjY2FrMjU2KHBhY2tlZCk7IC8vIDMyIGJ5dGVzCiAgICBrZWNjYWsyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzA0CiAgICAvLyBjb25zdCB3aXRoU3JjID0gb3Auc2V0Qnl0ZShoYXNoLCAwLCBvcC5idG9pKHNvdXJjZUNoYWluSWQuYnl0ZXMpKTsKICAgIGZyYW1lX2RpZyAtNAogICAgYnRvaQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIHNldGJ5dGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzA1CiAgICAvLyBjb25zdCB3aXRoRHN0ID0gb3Auc2V0Qnl0ZSh3aXRoU3JjLCAxLCBvcC5idG9pKGRlc3RpbmF0aW9uQ2hhaW5JZC5ieXRlcykpOwogICAgZnJhbWVfZGlnIC0zCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgc3dhcAogICAgc2V0Ynl0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMDcKICAgIC8vIHJldHVybiBuZXcgU3RhdGljQnl0ZXM8MzI+KHdpdGhEc3QpOwogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBzaXplCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuaXNPdGhlckJyaWRnZVRva2VuU3VwcG9ydGVkKGNoYWluSWQ6IGJ5dGVzLCB0b2tlbjogYnl0ZXMpIC0+IHVpbnQ2NDoKaXNPdGhlckJyaWRnZVRva2VuU3VwcG9ydGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTAtMzExCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIGlzT3RoZXJCcmlkZ2VUb2tlblN1cHBvcnRlZChjaGFpbklkOiBCeXRlLCB0b2tlbjogU3RhdGljQnl0ZXM8MzI+KTogYm9vbGVhbiB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzM3CiAgICAvLyByZXR1cm4gY2hhaW5JZC5ieXRlcy5jb25jYXQodG9rZW4uYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2NgogICAgLy8gb3RoZXJCcmlkZ2VUb2tlbnMgPSBCb3hNYXA8Ynl0ZXMsIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ3QnIH0pOwogICAgYnl0ZWMgNyAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTIKICAgIC8vIHJldHVybiB0aGlzLm90aGVyQnJpZGdlVG9rZW5zKHRoaXMuX2dldE90aGVyQnJpZGdlVG9rZW5zS2V5KGNoYWluSWQsIHRva2VuKSkuZXhpc3RzOwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuZ2V0VHJhbnNhY3Rpb25Db3N0KGNoYWluSWQ6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldFRyYW5zYWN0aW9uQ29zdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzE1LTMxNgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBnZXRUcmFuc2FjdGlvbkNvc3QoY2hhaW5JZDogQnl0ZSk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzE3CiAgICAvLyByZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGNoYWluSWQpICsgdGhpcy5nZXRTZW5kVHJhbnNhY3Rpb25TdG9yYWdlQ29zdCgpOwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldFRyYW5zYWN0aW9uUmVsYXllckNvc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzMxCiAgICAvLyByZXR1cm4gMTU3MDA7CiAgICBpbnRjIDQgLy8gMTU3MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzE3CiAgICAvLyByZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGNoYWluSWQpICsgdGhpcy5nZXRTZW5kVHJhbnNhY3Rpb25TdG9yYWdlQ29zdCgpOwogICAgKwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnN3YXAodG9rZW5JZDogdWludDY0LCByZWNlaXZlVG9rZW5JZDogdWludDY0LCByZWNpcGllbnQ6IGJ5dGVzLCByZWNlaXZlQW1vdW50TWluOiB1aW50NjQpIC0+IHZvaWQ6CnN3YXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjc4LTg0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHN3YXAoCiAgICAvLyAgIHRva2VuSWQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjZWl2ZVRva2VuSWQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBBZGRyZXNzLAogICAgLy8gICByZWNlaXZlQW1vdW50TWluOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDQgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1MAogICAgLy8gY2FuU3dhcCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2MQogICAgLy8gYXNzZXJ0KHRoaXMuY2FuU3dhcC52YWx1ZSwgJ1JvdXRlcjogc3dhcCBwcm9oaWJpdGVkJyk7CiAgICBhc3NlcnQgLy8gUm91dGVyOiBzd2FwIHByb2hpYml0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6ODYKICAgIC8vIGNvbnN0IHNlbmRlciA9IG5ldyBBZGRyZXNzKFR4bi5zZW5kZXIpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo4NwogICAgLy8gY29uc3QgYW1vdW50ID0gZ2V0UHJldkFzc2V0UGF5KHRva2VuSWQpOwogICAgZnJhbWVfZGlnIC00CiAgICBjYWxsc3ViIGdldFByZXZBc3NldFBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo4OAogICAgLy8gY29uc3QgdlVzZEFtb3VudCA9IHRoaXMuc2VuZEFuZFN3YXBUb1ZVc2QodG9rZW5JZCwgc2VuZGVyLCBhbW91bnQpOwogICAgZnJhbWVfZGlnIC00CiAgICBkaWcgMgogICAgZGlnIDIKICAgIGNhbGxzdWIgc2VuZEFuZFN3YXBUb1ZVc2QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6ODkKICAgIC8vIGNvbnN0IHJlY2VpdmVkQW1vdW50ID0gdGhpcy5yZWNlaXZlQW5kU3dhcEZyb21WVXNkKHJlY2VpdmVUb2tlbklkLCByZWNpcGllbnQsIHZVc2RBbW91bnQsIHJlY2VpdmVBbW91bnRNaW4pOwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIHVuY292ZXIgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHJlY2VpdmVBbmRTd2FwRnJvbVZVc2QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OTAKICAgIC8vIGVtaXQ8U3dhcHBlZD4oeyBzZW5kZXIsIHJlY2lwaWVudCwgdG9rZW5JZCwgcmVjZWl2ZVRva2VuSWQsIGFtb3VudCwgcmVjZWl2ZWRBbW91bnQgfSk7CiAgICBmcmFtZV9kaWcgLTQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIHVuY292ZXIgNAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTU0MDQ0YjMgLy8gbWV0aG9kICJTd2FwcGVkKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5hZGRQb29sKHBvb2xJZDogdWludDY0LCB0b2tlbklkOiB1aW50NjQpIC0+IHZvaWQ6CmFkZFBvb2w6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwMC0xMDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gYWRkUG9vbChwb29sSWQ6IHVpbnQ2NCwgdG9rZW5JZDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTAyCiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTAzCiAgICAvLyB0aGlzLnBvb2xzKHRva2VuSWQpLnZhbHVlID0gcG9vbElkOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjMxCiAgICAvLyBwb29scyA9IEJveE1hcDx1aW50NjQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdwJyB9KTsKICAgIGJ5dGVjIDggLy8gInAiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwMwogICAgLy8gdGhpcy5wb29scyh0b2tlbklkKS52YWx1ZSA9IHBvb2xJZDsKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDUKICAgIC8vIGNvbnN0IHRva2VuRGVjaW1hbHMgPSBhc3NldC5kZWNpbWFsczsKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy1vcmFjbGUuY29udHJhY3QuYWxnby50czo4CiAgICAvLyBleHBvcnQgY29uc3QgT1JBQ0xFX1BSSUNFX1BSRUNJU0lPTjogdWludDY0ID0gOTsKICAgIHB1c2hpbnQgOSAvLyA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwNgogICAgLy8gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlID0gMTAgKiogKE9SQUNMRV9QUklDRV9QUkVDSVNJT04gLSB0b2tlbkRlY2ltYWxzICsgQ0hBSU5fUFJFQ0lTSU9OKTsKICAgIHN3YXAKICAgIC0KICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtb3JhY2xlLmNvbnRyYWN0LmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNvbnN0IENIQUlOX1BSRUNJU0lPTjogdWludDY0ID0gNjsKICAgIGludGNfMiAvLyA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwNgogICAgLy8gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlID0gMTAgKiogKE9SQUNMRV9QUklDRV9QUkVDSVNJT04gLSB0b2tlbkRlY2ltYWxzICsgQ0hBSU5fUFJFQ0lTSU9OKTsKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzYKICAgIC8vIHByb3RlY3RlZCBicmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ2YnIH0pOwogICAgcHVzaGJ5dGVzICJmIgogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDYKICAgIC8vIHRoaXMuYnJpZGdpbmdGZWVDb252ZXJzaW9uU2NhbGluZ0ZhY3Rvcih0b2tlbklkKS52YWx1ZSA9IDEwICoqIChPUkFDTEVfUFJJQ0VfUFJFQ0lTSU9OIC0gdG9rZW5EZWNpbWFscyArIENIQUlOX1BSRUNJU0lPTik7CiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICB1bmNvdmVyIDIKICAgIGV4cAogICAgaXRvYgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozMwogICAgLy8gcHJvdGVjdGVkIGZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ2UnIH0pOwogICAgcHVzaGJ5dGVzICJlIgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTA3CiAgICAvLyB0aGlzLmZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlID0gMTAgKiogKE9SQUNMRV9QUklDRV9QUkVDSVNJT04gLSB0b2tlbkRlY2ltYWxzKTsKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIHVuY292ZXIgMgogICAgZXhwCiAgICBpdG9iCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIucmVtb3ZlUG9vbCh0b2tlbklkOiB1aW50NjQpIC0+IHZvaWQ6CnJlbW92ZVBvb2w6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMC0xMTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gcmVtb3ZlUG9vbCh0b2tlbklkOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTIKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTMKICAgIC8vIHRoaXMucG9vbHModG9rZW5JZCkuZGVsZXRlKCk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzEKICAgIC8vIHBvb2xzID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ3AnIH0pOwogICAgYnl0ZWMgOCAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTMKICAgIC8vIHRoaXMucG9vbHModG9rZW5JZCkuZGVsZXRlKCk7CiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5zdG9wU3dhcCgpIC0+IHZvaWQ6CnN0b3BTd2FwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2OAogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZS5ieXRlcywgJ1JvdXRlcjogaXMgbm90IHN0b3BBdXRob3JpdHknKTsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzkKICAgIC8vIHByaXZhdGUgc3RvcEF1dGhvcml0eSA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJzdG9wQXV0aG9yaXR5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NjgKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLnN0b3BBdXRob3JpdHkudmFsdWUuYnl0ZXMsICdSb3V0ZXI6IGlzIG5vdCBzdG9wQXV0aG9yaXR5Jyk7CiAgICA9PQogICAgYXNzZXJ0IC8vIFJvdXRlcjogaXMgbm90IHN0b3BBdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NTAKICAgIC8vIGNhblN3YXAgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEyMgogICAgLy8gdGhpcy5jYW5Td2FwLnZhbHVlID0gZmFsc2U7CiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5zdGFydFN3YXAoKSAtPiB2b2lkOgpzdGFydFN3YXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzMAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjUwCiAgICAvLyBjYW5Td2FwID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7CiAgICBieXRlY18xIC8vICJjYW5Td2FwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMzEKICAgIC8vIHRoaXMuY2FuU3dhcC52YWx1ZSA9IHRydWU7CiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5zZXRTdG9wQXV0aG9yaXR5KHN0b3BBdXRob3JpdHk6IGJ5dGVzKSAtPiB2b2lkOgpzZXRTdG9wQXV0aG9yaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMzctMTM4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHNldFN0b3BBdXRob3JpdHkoc3RvcEF1dGhvcml0eTogQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzOQogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjM5CiAgICAvLyBwcml2YXRlIHN0b3BBdXRob3JpdHkgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGJ5dGVjIDEwIC8vICJzdG9wQXV0aG9yaXR5IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDAKICAgIC8vIHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZSA9IHN0b3BBdXRob3JpdHk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIuc2V0UmViYWxhbmNlcihyZWJhbGFuY2VyOiBieXRlcykgLT4gdm9pZDoKc2V0UmViYWxhbmNlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTQ2LTE0NwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBzZXRSZWJhbGFuY2VyKHJlYmFsYW5jZXI6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo0OQogICAgLy8gcHJpdmF0ZSByZWJhbGFuY2VyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oeyBpbml0aWFsVmFsdWU6IG5ldyBBZGRyZXNzKGJ6ZXJvKDApKSB9KTsvLyBjYW4gcmVzdHJpY3QgZGVwb3NpdCBvciB3aXRoZHJhdyBvcGVyYXRpb25zCiAgICBieXRlYyA2IC8vICJyZWJhbGFuY2VyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDkKICAgIC8vIHRoaXMucmViYWxhbmNlci52YWx1ZSA9IHJlYmFsYW5jZXI7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIucmVjZWl2ZUFuZFN3YXBGcm9tVlVzZCh0b2tlbklkOiB1aW50NjQsIHJlY2lwaWVudDogYnl0ZXMsIHZVc2RBbW91bnQ6IHVpbnQ2NCwgcmVjZWl2ZUFtb3VudE1pbjogdWludDY0KSAtPiB1aW50NjQ6CnJlY2VpdmVBbmRTd2FwRnJvbVZVc2Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE1Mi0xNTcKICAgIC8vIHByb3RlY3RlZCByZWNlaXZlQW5kU3dhcEZyb21WVXNkKAogICAgLy8gICB0b2tlbklkOiB1aW50NjQsCiAgICAvLyAgIHJlY2lwaWVudDogQWRkcmVzcywKICAgIC8vICAgdlVzZEFtb3VudDogdWludDY0LAogICAgLy8gICByZWNlaXZlQW1vdW50TWluOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgcHJvdG8gNCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE1OAogICAgLy8gYXNzZXJ0KHRoaXMucG9vbHModG9rZW5JZCkuZXhpc3RzLCAnUm91dGVyOiBubyByZWNlaXZlIHBvb2wnKTsKICAgIGZyYW1lX2RpZyAtNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozMQogICAgLy8gcG9vbHMgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAncCcgfSk7CiAgICBieXRlYyA4IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE1OAogICAgLy8gYXNzZXJ0KHRoaXMucG9vbHModG9rZW5JZCkuZXhpc3RzLCAnUm91dGVyOiBubyByZWNlaXZlIHBvb2wnKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gUm91dGVyOiBubyByZWNlaXZlIHBvb2wKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTU5CiAgICAvLyBjb25zdCBwb29sSWQgPSB0aGlzLnBvb2xzKHRva2VuSWQpLnZhbHVlOwogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgc3dhcAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTYwLTE2MwogICAgLy8gcmV0dXJuIGFiaUNhbGwoUG9vbC5wcm90b3R5cGUuc3dhcEZyb21WVXNkLCB7CiAgICAvLyAgIGFwcElkOiBwb29sSWQsCiAgICAvLyAgIGFyZ3M6IFtyZWNpcGllbnQsIHZVc2RBbW91bnQsIHJlY2VpdmVBbW91bnRNaW4sIHJlY2lwaWVudCA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjIKICAgIC8vIGFyZ3M6IFtyZWNpcGllbnQsIHZVc2RBbW91bnQsIHJlY2VpdmVBbW91bnRNaW4sIHJlY2lwaWVudCA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjQ5CiAgICAvLyBwcml2YXRlIHJlYmFsYW5jZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPih7IGluaXRpYWxWYWx1ZTogbmV3IEFkZHJlc3MoYnplcm8oMCkpIH0pOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJyZWJhbGFuY2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTYyCiAgICAvLyBhcmdzOiBbcmVjaXBpZW50LCB2VXNkQW1vdW50LCByZWNlaXZlQW1vdW50TWluLCByZWNpcGllbnQgPT09IHRoaXMucmViYWxhbmNlci52YWx1ZV0sCiAgICBmcmFtZV9kaWcgLTMKICAgID09CiAgICBieXRlYyA5IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjAtMTYzCiAgICAvLyByZXR1cm4gYWJpQ2FsbChQb29sLnByb3RvdHlwZS5zd2FwRnJvbVZVc2QsIHsKICAgIC8vICAgYXBwSWQ6IHBvb2xJZCwKICAgIC8vICAgYXJnczogW3JlY2lwaWVudCwgdlVzZEFtb3VudCwgcmVjZWl2ZUFtb3VudE1pbiwgcmVjaXBpZW50ID09PSB0aGlzLnJlYmFsYW5jZXIudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBwdXNoYnl0ZXMgMHgwZDFiNGMwNiAvLyBtZXRob2QgInN3YXBGcm9tVlVzZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYnRvaQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnNlbmRBbmRTd2FwVG9WVXNkKHRva2VuSWQ6IHVpbnQ2NCwgdXNlcjogYnl0ZXMsIGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6CnNlbmRBbmRTd2FwVG9WVXNkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjcKICAgIC8vIHByb3RlY3RlZCBzZW5kQW5kU3dhcFRvVlVzZCh0b2tlbklkOiB1aW50NjQsIHVzZXI6IEFkZHJlc3MsIGFtb3VudDogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjgKICAgIC8vIGFzc2VydCh0aGlzLnBvb2xzKHRva2VuSWQpLmV4aXN0cywgJ1JvdXRlcjogbm8gcG9vbCcpOwogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjMxCiAgICAvLyBwb29scyA9IEJveE1hcDx1aW50NjQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdwJyB9KTsKICAgIGJ5dGVjIDggLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTY4CiAgICAvLyBhc3NlcnQodGhpcy5wb29scyh0b2tlbklkKS5leGlzdHMsICdSb3V0ZXI6IG5vIHBvb2wnKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gUm91dGVyOiBubyBwb29sCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE2OQogICAgLy8gY29uc3QgcG9vbElkID0gdGhpcy5wb29scyh0b2tlbklkKS52YWx1ZTsKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHN3YXAKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE3MS0xNzYKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogdG9rZW5JZCwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogQXBwbGljYXRpb24ocG9vbElkKS5hZGRyZXNzLAogICAgLy8gfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNzQKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHBvb2xJZCkuYWRkcmVzcywKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAtMwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTcxLTE3NQogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgeGZlckFzc2V0OiB0b2tlbklkLAogICAgLy8gICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBBcHBsaWNhdGlvbihwb29sSWQpLmFkZHJlc3MsCiAgICAvLyB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNzEtMTc2CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRva2VuSWQsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHBvb2xJZCkuYWRkcmVzcywKICAgIC8vIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE3OC0xODEKICAgIC8vIHJldHVybiBhYmlDYWxsKFBvb2wucHJvdG90eXBlLnN3YXBUb1ZVc2QsIHsKICAgIC8vICAgYXBwSWQ6IHBvb2xJZCwKICAgIC8vICAgYXJnczogW3VzZXIsIGFtb3VudCwgdXNlciA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxODAKICAgIC8vIGFyZ3M6IFt1c2VyLCBhbW91bnQsIHVzZXIgPT09IHRoaXMucmViYWxhbmNlci52YWx1ZV0sCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NDkKICAgIC8vIHByaXZhdGUgcmViYWxhbmNlciA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KHsgaW5pdGlhbFZhbHVlOiBuZXcgQWRkcmVzcyhiemVybygwKSkgfSk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInJlYmFsYW5jZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxODAKICAgIC8vIGFyZ3M6IFt1c2VyLCBhbW91bnQsIHVzZXIgPT09IHRoaXMucmViYWxhbmNlci52YWx1ZV0sCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieXRlYyA5IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNzgtMTgxCiAgICAvLyByZXR1cm4gYWJpQ2FsbChQb29sLnByb3RvdHlwZS5zd2FwVG9WVXNkLCB7CiAgICAvLyAgIGFwcElkOiBwb29sSWQsCiAgICAvLyAgIGFyZ3M6IFt1c2VyLCBhbW91bnQsIHVzZXIgPT09IHRoaXMucmViYWxhbmNlci52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIHB1c2hieXRlcyAweGQ5NzhhZDE0IC8vIG1ldGhvZCAic3dhcFRvVlVzZChhZGRyZXNzLHVpbnQ2NCxib29sKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjpHYXNVc2FnZS5nZXRHYXNVc2FnZShjaGFpbklkOiBieXRlcykgLT4gdWludDY0OgpnZXRHYXNVc2FnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTctMTgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gZ2V0R2FzVXNhZ2UoY2hhaW5JZDogQnl0ZSk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTAKICAgIC8vIGdhc1VzYWdlID0gQm94TWFwPEJ5dGUsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdnJyB9KTsKICAgIGJ5dGVjIDEyIC8vICJnIgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTkKICAgIC8vIHJldHVybiB0aGlzLmdhc1VzYWdlKGNoYWluSWQpLnZhbHVlOwogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgc3dhcAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6Okdhc1VzYWdlLnNldEdhc1VzYWdlKGNoYWluSWQ6IGJ5dGVzLCBnYXNBbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKc2V0R2FzVXNhZ2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjIyLTIzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHNldEdhc1VzYWdlKGNoYWluSWQ6IEJ5dGUsIGdhc0Ftb3VudDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MjQKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxMAogICAgLy8gZ2FzVXNhZ2UgPSBCb3hNYXA8Qnl0ZSwgdWludDY0Pih7IGtleVByZWZpeDogJ2cnIH0pOwogICAgYnl0ZWMgMTIgLy8gImciCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoyNQogICAgLy8gdGhpcy5nYXNVc2FnZShjaGFpbklkKS52YWx1ZSA9IGdhc0Ftb3VudDsKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo6R2FzVXNhZ2Uuc2V0R2FzT3JhY2xlKGdhc09yYWNsZTogdWludDY0KSAtPiB2b2lkOgpzZXRHYXNPcmFjbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI4LTI5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHNldEdhc09yYWNsZShnYXNPcmFjbGU6IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzAKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo5CiAgICAvLyBnYXNPcmFjbGUgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGJ5dGVjIDQgLy8gImdhc09yYWNsZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzEKICAgIC8vIHRoaXMuZ2FzT3JhY2xlLnZhbHVlID0gZ2FzT3JhY2xlOwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo6R2FzVXNhZ2UuZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdChjaGFpbklkOiBieXRlcykgLT4gdWludDY0OgpnZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czozNC0zNQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBnZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGNoYWluSWQ6IEJ5dGUpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjEwCiAgICAvLyBnYXNVc2FnZSA9IEJveE1hcDxCeXRlLCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZycgfSk7CiAgICBieXRlYyAxMiAvLyAiZyIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjM2CiAgICAvLyBjb25zdCBnYXNBbW91bnQgPSB0aGlzLmdhc1VzYWdlKGNoYWluSWQpLnZhbHVlOwogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgc3dhcAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzctNDAKICAgIC8vIHJldHVybiBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5OYXRpdmVUb2tlbiwgewogICAgLy8gICBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtjaGFpbklkLCBnYXNBbW91bnRdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjkKICAgIC8vIGdhc09yYWNsZSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdhc09yYWNsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjM5CiAgICAvLyBhcmdzOiBbY2hhaW5JZCwgZ2FzQW1vdW50XSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzctNDAKICAgIC8vIHJldHVybiBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5OYXRpdmVUb2tlbiwgewogICAgLy8gICBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtjaGFpbklkLCBnYXNBbW91bnRdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBwdXNoYnl0ZXMgMHhjMmFmY2NkMSAvLyBtZXRob2QgImdldFRyYW5zYWN0aW9uR2FzQ29zdEluTmF0aXZlVG9rZW4oYnl0ZSx1aW50NjQpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYnRvaQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6Ok93bmFibGUub25seU93bmVyKCkgLT4gdm9pZDoKb25seU93bmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTMKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzLCAnT25seSBvd25lcicpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxMwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsICdPbmx5IG93bmVyJyk7CiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgb3duZXIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjpPd25hYmxlLnRyYW5zZmVyT3duZXJzaGlwKG5ld093bmVyOiBieXRlcykgLT4gdm9pZDoKdHJhbnNmZXJPd25lcnNoaXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxNi0xNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdHJhbnNmZXJPd25lcnNoaXAobmV3T3duZXI6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGJ5dGVjXzMgLy8gIm93bmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTkKICAgIC8vIHRoaXMub3duZXIudmFsdWUgPSBuZXdPd25lcjsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1Ygo=",clear:"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="},byteCode:{approval:"CiAFAAEGBNR6JhAEFR98dQdjYW5Td2FwCW1lc3NlbmdlcgVvd25lcglnYXNPcmFjbGUHY2hhaW5JZApyZWJhbGFuY2VyAXQBcAEADXN0b3BBdXRob3JpdHkBAQFnBENBeqME90dbggwVH3x1AAAAAAAAPVQxGEAACSKvJwZMZykjZzEbQQDJgg0E//goQQRl9wVzBOg6h6sELJ9oRwQxkZsoBE66ByEExhftcwRXUxVgBGOAgngEBlB8agT1+W6zBEsGLKAEw83ZKicNggkEB9+EKQSAxccPBPqxEaIE7xX4VQRrHuIjBBhwpJIENVcyTQQEsWHxBNKzV+snDoIEBAylrnoEOXuRiwTL/G0CBOF7r7Q2GgCOHAIFAfUB7AHMAawBmgGIAXYBZgFWAT4BGwD/AOsA3wDTALgApACUAIgAfABtAF4ASgA3ACUAEQACIkMxGRREMRhENhoBiAgcI0MxGRREMRhENhoBiAfJFihMULAjQzEZFEQxGEQ2GgEXwDKIB6YjQzEZFEQxGEQ2GgE2GgIXiAeDI0MxGRREMRhENhoBiAdmFihMULAjQzEZFEQxGEQ2GgGIBosjQzEZFEQxGEQ2GgGIBnAjQzEZFEQxGESIBl0jQzEZFEQxGESIBkQjQzEZFEQxGEQ2GgEXiAYkI0MxGRREMRhENhoBFzYaAheIBdcjQzEZFEQxGEQ2GgEXNhoCFzYaAzYaBBeIBXMjQzEZFEQxGEQnD7AjQzEZFEQxGEQnD7AjQzEZFEQxGEQ2GgGIBUAWKExQsCNDMRkURDEYRDYaATYaAogFGScJIk8CVChMULAjQzEZFEQxGEQ2GgEXNhoCNhoDNhoENhoFNhoGiAS9KExQsCNDMRkURDEYRDYaATYaAheIBDwWKExQsCNDMRkURDEYRDYaAReIA/cjQzEZFEQxGEQ2GgEXiAPOI0MxGRREMRhENhoBNhoCiAOqI0MxGRREMRhENhoBNhoCiAOFI0MxGRREMRhENhoBNhoCiANjI0MxGRREMRhENhoBFzYaAjYaAzYaBDYaBTYaBheIAokjQzEZFEQxGEQ2GgEXNhoCNhoDNhoENhoFNhoGF4gBFyNDMRkURDEYRCNDMRkURDEYRDYaAReIAMkjQzEZFEQxGBRENhoBNhoCNhoDF8AyNhoEF8AyiACPI0OKAQExFkQxFiMJSTgQJRJESTgUMgoSREk4EYv/EkRJOCAyAxJESTgVMgMSRDgSiYoBAYAASTEWi/8MQQAEIowAiTEWi/8JSYwBOBBJjAAjE0EABCKMAImLACMSRIsBOAcyChNBAAQijACJiwE4IDIDE0EABCKMAImLATgJMgMTQQAEIowAiYsBOAiMAImKBAAri/xnJwSL/2cnCov8ZycFi/1nKov+Z4mKAQCIBVCxMgqyFCKyEov/shElshAisgGzgBhCcmlkZ2U6IG9wdC1pbiBjb21wbGV0ZWSwiYoGACIpZUREi/qI/xZJi/8NRIEgr4v7EhREgQKI/zOL/0AA7iKLAUlLAghMFk8CFov/Fk4CUExQgAQ2uvrdTFCwiwCL/wmL+jEATwKIBAgiJwVlRIv8E0SL/Iv9UCcHTFC9RQFEIicFZURLAYv7TwKL/Iv9i/6IAnuL/IgCuYABc0sCUEm9RQEURIAAv0sBVwEBsSIqZUQnDbIashiyGiSyECKyAbO0PklXBABMVwAEKBJEFyIqZURyCEQiKmVEsUyyB0sBsggjshAisgG2gASjJJmJshpPA7IashgkshAisgGzSwEWSwEWUIAES1VBm0xQsAhPAg5EFov7UIv8UIv9UIv+UCcLUIAEIp+67ExQsImL+haAAWZMUL5MF0xEi/8LsSInBGVEIicFZUSABB23DN2yGrIashgkshAisgGztD5JVwQATFcABCgSRBcKQv7TigYAIillRESAAWKL/FC9RQFEI4j96kkhBA9EIicFZUSL+ov7i/xPA4v9i/6IAXNJMQBQAkxRAAJMUQIgUElOAoABbUsBUEm9RQEURIAAv7EiKmVEgAQz4UeqshqyGLIaJLIQIrIBs7Q+SVcEAExXAAQoEkQiU0SL/YEYW4v7i/qL/4gCKkxJIQQJTCEEDUEAELGL+7IHiwKyCCOyECKyAbOLARaL+1CL/lAnC1CLAFCABEWDatZMULCJigIAiAMPgAFii/5Qi/+/iYoCAIgC/4v+i/9QJwdMUIAAv4mKAgCIAuyL/ov/UCcHTFC8SImKAQCIAtqxIitlRLIHi/+yCCOyECKyAbOJigEAiALBMgpJi/9wAExJTwJEQQAasSIrZUSyFIsBshKL/7IRiwCyACWyECKyAbOJigIBi/6IAiqxIiplRCcOshqL/rIashgkshAisgGztD5JVwQATFcABCgSRBexIicEZUROAggWgAR799UMshqL/rIashqyGCSyECKyAbO0PklXBABMVwAEKBJEF4v/FoABZUxQvkwXTEQKiYoGAYEYr4v6FlCBH6+L/FBMi/tQTFCL/lCL/1AnC1ACi/wXIkxWi/0XI0xWSRWBIBJEiYoCAYv+i/9QJwdMUL1FAYmKAQGL/4gBpyEECImKBAAiKWVERDEAi/yI+9GL/EsCSwKIAPyL/Yv+TwKL/4gAm4v8Fov9Fk8DFk8DFk8Ei/5QTwRQTwNQTwJQTFCABBVARLNMULCJigIAiAGPi/8WJwhLAVCL/ha/i/9xAUSBCUwJSSQIgAFmSwNQgQpPApQWv4ABZU8CUIEKTwKUFr+JigEAiAFWi/8WJwhMULxIiTEAIicKZUQSRCkiZ4mIATwpI2eJigEAiAEyJwqL/2eJigEAiAEmJwaL/2eJigQBi/wWJwhMUEm9RQFEvkwXTESxi/4Wi/8WIicGZUSL/RInCSJPAlSABA0bTAayGov9shpPArIaTLIashqyGCSyECKyAbO0PklXBABMVwAEKBJEF4mKAwGL/RYnCExQSb1FAUS+TBdMRLFJcghEshSL/7ISi/2yESWyECKyAbOxi/8WIicGZUSL/hInCSJPAlSABNl4rRSyGov+shpMshqyGrIYJLIQIrIBs7Q+SVcEAExXAAQoEkQXiYoBAScMi/9QvkwXTESJigIAiABRJwyL/lCL/xa/iYoBAIgAQScEi/9niYoBAScMi/9QvkwXTESxIicEZURMFoAEwq/M0bIai/+yGrIashgkshAisgGztD5JVwQATFcABCgSRBeJMQAiK2VEEkSJigEAiP/xK4v/Z4k=",clear:"CoEBQw=="},events:[{name:"BridgingFeeFromTokens",args:[{type:"uint64",name:"feeFromNative"},{type:"uint64",name:"feeFromStable"},{type:"uint64",name:"feeStableTokenAmount"}]},{name:"ReceiveFee",args:[{type:"uint64",name:"bridgeTransactionCost"},{type:"uint64",name:"messageTransactionCost"}]},{name:"TokensSent",args:[{type:"uint64",name:"amount"},{type:"byte[32]",name:"recipient"},{type:"byte",name:"destinationChainId"},{type:"byte[32]",name:"receiveToken"},{type:"byte[32]",name:"nonce"},{type:"byte",name:"messenger"}]},{name:"TokensReceived",args:[{type:"uint64",name:"receiveAmount"},{type:"address",name:"recipient"},{type:"byte[32]",name:"nonce"},{type:"byte",name:"messenger"},{type:"byte[32]",name:"message"}]},{name:"Swapped",args:[{type:"address",name:"sender"},{type:"address",name:"recipient"},{type:"uint64",name:"tokenId"},{type:"uint64",name:"receiveTokenId"},{type:"uint64",name:"amount"},{type:"uint64",name:"receivedAmount"}]}],templateVariables:{}};var C=class r{static get create(){return{_resolveByMethod(i){switch(i.method){case"createApplication":case"createApplication(address,byte,application,application)void":return r.create.createApplication(i)}throw new Error("Unknown ' + verb + ' method")},createApplication(i){return{...i,method:"createApplication(address,byte,application,application)void",args:Array.isArray(i.args)?i.args:[i.args.owner,i.args.chainId,i.args.messenger,i.args.gasOracle]}}}}static optInAsset(i){return{...i,method:"optInAsset(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.assetId]}}static noop(i){return{...i,method:"noop()void",args:Array.isArray(i.args)?i.args:[]}}static swapAndBridge(i){return{...i,method:"swapAndBridge(uint64,byte[32],byte,byte[32],byte[32],uint64)void",args:Array.isArray(i.args)?i.args:[i.args.tokenId,i.args.recipient,i.args.destinationChainId,i.args.receiveToken,i.args.nonce,i.args.feeTokenAmount]}}static receiveTokens(i){return{...i,method:"receiveTokens(uint64,byte[32],byte,byte[32],byte[32],uint64)void",args:Array.isArray(i.args)?i.args:[i.args.amount,i.args.recipient,i.args.sourceChainId,i.args.receiveToken,i.args.nonce,i.args.receiveAmountMin]}}static registerBridge(i){return{...i,method:"registerBridge(byte,byte[32])void",args:Array.isArray(i.args)?i.args:[i.args.chainId,i.args.bridgeAddress]}}static addBridgeToken(i){return{...i,method:"addBridgeToken(byte,byte[32])void",args:Array.isArray(i.args)?i.args:[i.args.chainId,i.args.tokenAddress]}}static removeBridgeToken(i){return{...i,method:"removeBridgeToken(byte,byte[32])void",args:Array.isArray(i.args)?i.args:[i.args.chainId,i.args.tokenAddress]}}static withdrawGasTokens(i){return{...i,method:"withdrawGasTokens(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.amount]}}static withdrawBridgingFeeInTokens(i){return{...i,method:"withdrawBridgingFeeInTokens(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.assetId]}}static getBridgingCostInTokens(i){return{...i,method:"getBridgingCostInTokens(byte,uint64)uint64",args:Array.isArray(i.args)?i.args:[i.args.destinationChainId,i.args.tokenId]}}static hashMessage(i){return{...i,method:"hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32]",args:Array.isArray(i.args)?i.args:[i.args.amount,i.args.recipient,i.args.sourceChainId,i.args.destinationChainId,i.args.receiveToken,i.args.nonce]}}static isOtherBridgeTokenSupported(i){return{...i,method:"isOtherBridgeTokenSupported(byte,byte[32])bool",args:Array.isArray(i.args)?i.args:[i.args.chainId,i.args.token]}}static getTransactionCost(i){return{...i,method:"getTransactionCost(byte)uint64",args:Array.isArray(i.args)?i.args:[i.args.chainId]}}static getReceiveTokensCost(i){return{...i,method:"getReceiveTokensCost()uint64",args:Array.isArray(i.args)?i.args:[]}}static getSendTransactionStorageCost(i){return{...i,method:"getSendTransactionStorageCost()uint64",args:Array.isArray(i.args)?i.args:[]}}static swap(i){return{...i,method:"swap(uint64,uint64,address,uint64)void",args:Array.isArray(i.args)?i.args:[i.args.tokenId,i.args.receiveTokenId,i.args.recipient,i.args.receiveAmountMin]}}static addPool(i){return{...i,method:"addPool(uint64,uint64)void",args:Array.isArray(i.args)?i.args:[i.args.poolId,i.args.tokenId]}}static removePool(i){return{...i,method:"removePool(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.tokenId]}}static stopSwap(i){return{...i,method:"stopSwap()void",args:Array.isArray(i.args)?i.args:[]}}static startSwap(i){return{...i,method:"startSwap()void",args:Array.isArray(i.args)?i.args:[]}}static setStopAuthority(i){return{...i,method:"setStopAuthority(address)void",args:Array.isArray(i.args)?i.args:[i.args.stopAuthority]}}static setRebalancer(i){return{...i,method:"setRebalancer(address)void",args:Array.isArray(i.args)?i.args:[i.args.rebalancer]}}static getGasUsage(i){return{...i,method:"getGasUsage(byte)uint64",args:Array.isArray(i.args)?i.args:[i.args.chainId]}}static setGasUsage(i){return{...i,method:"setGasUsage(byte,uint64)void",args:Array.isArray(i.args)?i.args:[i.args.chainId,i.args.gasAmount]}}static setGasOracle(i){return{...i,method:"setGasOracle(application)void",args:Array.isArray(i.args)?i.args:[i.args.gasOracle]}}static getTransactionRelayerCost(i){return{...i,method:"getTransactionRelayerCost(byte)uint64",args:Array.isArray(i.args)?i.args:[i.args.chainId]}}static transferOwnership(i){return{...i,method:"transferOwnership(address)void",args:Array.isArray(i.args)?i.args:[i.args.newOwner]}}};var Zn=class r{appClient;constructor(i){this.appClient=i instanceof Wn?i:new Wn({...i,appSpec:Bn})}decodeReturnValue(i,a){return a!==void 0?or(a,this.appClient.getABIMethod(i),Bn.structs):void 0}static async fromCreatorAndName(i){return new r(await Wn.fromCreatorAndName({...i,appSpec:Bn}))}static async fromNetwork(i){return new r(await Wn.fromNetwork({...i,appSpec:Bn}))}get appId(){return this.appClient.appId}get appAddress(){return this.appClient.appAddress}get appName(){return this.appClient.appName}get appSpec(){return this.appClient.appSpec}get algorand(){return this.appClient.algorand}params={clearState:i=>this.appClient.params.bare.clearState(i),optInAsset:i=>this.appClient.params.call(C.optInAsset(i)),noop:(i={args:[]})=>this.appClient.params.call(C.noop(i)),swapAndBridge:i=>this.appClient.params.call(C.swapAndBridge(i)),receiveTokens:i=>this.appClient.params.call(C.receiveTokens(i)),registerBridge:i=>this.appClient.params.call(C.registerBridge(i)),addBridgeToken:i=>this.appClient.params.call(C.addBridgeToken(i)),removeBridgeToken:i=>this.appClient.params.call(C.removeBridgeToken(i)),withdrawGasTokens:i=>this.appClient.params.call(C.withdrawGasTokens(i)),withdrawBridgingFeeInTokens:i=>this.appClient.params.call(C.withdrawBridgingFeeInTokens(i)),getBridgingCostInTokens:i=>this.appClient.params.call(C.getBridgingCostInTokens(i)),hashMessage:i=>this.appClient.params.call(C.hashMessage(i)),isOtherBridgeTokenSupported:i=>this.appClient.params.call(C.isOtherBridgeTokenSupported(i)),getTransactionCost:i=>this.appClient.params.call(C.getTransactionCost(i)),getReceiveTokensCost:(i={args:[]})=>this.appClient.params.call(C.getReceiveTokensCost(i)),getSendTransactionStorageCost:(i={args:[]})=>this.appClient.params.call(C.getSendTransactionStorageCost(i)),swap:i=>this.appClient.params.call(C.swap(i)),addPool:i=>this.appClient.params.call(C.addPool(i)),removePool:i=>this.appClient.params.call(C.removePool(i)),stopSwap:(i={args:[]})=>this.appClient.params.call(C.stopSwap(i)),startSwap:(i={args:[]})=>this.appClient.params.call(C.startSwap(i)),setStopAuthority:i=>this.appClient.params.call(C.setStopAuthority(i)),setRebalancer:i=>this.appClient.params.call(C.setRebalancer(i)),getGasUsage:i=>this.appClient.params.call(C.getGasUsage(i)),setGasUsage:i=>this.appClient.params.call(C.setGasUsage(i)),setGasOracle:i=>this.appClient.params.call(C.setGasOracle(i)),getTransactionRelayerCost:i=>this.appClient.params.call(C.getTransactionRelayerCost(i)),transferOwnership:i=>this.appClient.params.call(C.transferOwnership(i))};createTransaction={clearState:i=>this.appClient.createTransaction.bare.clearState(i),optInAsset:i=>this.appClient.createTransaction.call(C.optInAsset(i)),noop:(i={args:[]})=>this.appClient.createTransaction.call(C.noop(i)),swapAndBridge:i=>this.appClient.createTransaction.call(C.swapAndBridge(i)),receiveTokens:i=>this.appClient.createTransaction.call(C.receiveTokens(i)),registerBridge:i=>this.appClient.createTransaction.call(C.registerBridge(i)),addBridgeToken:i=>this.appClient.createTransaction.call(C.addBridgeToken(i)),removeBridgeToken:i=>this.appClient.createTransaction.call(C.removeBridgeToken(i)),withdrawGasTokens:i=>this.appClient.createTransaction.call(C.withdrawGasTokens(i)),withdrawBridgingFeeInTokens:i=>this.appClient.createTransaction.call(C.withdrawBridgingFeeInTokens(i)),getBridgingCostInTokens:i=>this.appClient.createTransaction.call(C.getBridgingCostInTokens(i)),hashMessage:i=>this.appClient.createTransaction.call(C.hashMessage(i)),isOtherBridgeTokenSupported:i=>this.appClient.createTransaction.call(C.isOtherBridgeTokenSupported(i)),getTransactionCost:i=>this.appClient.createTransaction.call(C.getTransactionCost(i)),getReceiveTokensCost:(i={args:[]})=>this.appClient.createTransaction.call(C.getReceiveTokensCost(i)),getSendTransactionStorageCost:(i={args:[]})=>this.appClient.createTransaction.call(C.getSendTransactionStorageCost(i)),swap:i=>this.appClient.createTransaction.call(C.swap(i)),addPool:i=>this.appClient.createTransaction.call(C.addPool(i)),removePool:i=>this.appClient.createTransaction.call(C.removePool(i)),stopSwap:(i={args:[]})=>this.appClient.createTransaction.call(C.stopSwap(i)),startSwap:(i={args:[]})=>this.appClient.createTransaction.call(C.startSwap(i)),setStopAuthority:i=>this.appClient.createTransaction.call(C.setStopAuthority(i)),setRebalancer:i=>this.appClient.createTransaction.call(C.setRebalancer(i)),getGasUsage:i=>this.appClient.createTransaction.call(C.getGasUsage(i)),setGasUsage:i=>this.appClient.createTransaction.call(C.setGasUsage(i)),setGasOracle:i=>this.appClient.createTransaction.call(C.setGasOracle(i)),getTransactionRelayerCost:i=>this.appClient.createTransaction.call(C.getTransactionRelayerCost(i)),transferOwnership:i=>this.appClient.createTransaction.call(C.transferOwnership(i))};send={clearState:i=>this.appClient.send.bare.clearState(i),optInAsset:async i=>{let a=await this.appClient.send.call(C.optInAsset(i));return{...a,return:a.return}},noop:async(i={args:[]})=>{let a=await this.appClient.send.call(C.noop(i));return{...a,return:a.return}},swapAndBridge:async i=>{let a=await this.appClient.send.call(C.swapAndBridge(i));return{...a,return:a.return}},receiveTokens:async i=>{let a=await this.appClient.send.call(C.receiveTokens(i));return{...a,return:a.return}},registerBridge:async i=>{let a=await this.appClient.send.call(C.registerBridge(i));return{...a,return:a.return}},addBridgeToken:async i=>{let a=await this.appClient.send.call(C.addBridgeToken(i));return{...a,return:a.return}},removeBridgeToken:async i=>{let a=await this.appClient.send.call(C.removeBridgeToken(i));return{...a,return:a.return}},withdrawGasTokens:async i=>{let a=await this.appClient.send.call(C.withdrawGasTokens(i));return{...a,return:a.return}},withdrawBridgingFeeInTokens:async i=>{let a=await this.appClient.send.call(C.withdrawBridgingFeeInTokens(i));return{...a,return:a.return}},getBridgingCostInTokens:async i=>{let a=await this.appClient.send.call(C.getBridgingCostInTokens(i));return{...a,return:a.return}},hashMessage:async i=>{let a=await this.appClient.send.call(C.hashMessage(i));return{...a,return:a.return}},isOtherBridgeTokenSupported:async i=>{let a=await this.appClient.send.call(C.isOtherBridgeTokenSupported(i));return{...a,return:a.return}},getTransactionCost:async i=>{let a=await this.appClient.send.call(C.getTransactionCost(i));return{...a,return:a.return}},getReceiveTokensCost:async(i={args:[]})=>{let a=await this.appClient.send.call(C.getReceiveTokensCost(i));return{...a,return:a.return}},getSendTransactionStorageCost:async(i={args:[]})=>{let a=await this.appClient.send.call(C.getSendTransactionStorageCost(i));return{...a,return:a.return}},swap:async i=>{let a=await this.appClient.send.call(C.swap(i));return{...a,return:a.return}},addPool:async i=>{let a=await this.appClient.send.call(C.addPool(i));return{...a,return:a.return}},removePool:async i=>{let a=await this.appClient.send.call(C.removePool(i));return{...a,return:a.return}},stopSwap:async(i={args:[]})=>{let a=await this.appClient.send.call(C.stopSwap(i));return{...a,return:a.return}},startSwap:async(i={args:[]})=>{let a=await this.appClient.send.call(C.startSwap(i));return{...a,return:a.return}},setStopAuthority:async i=>{let a=await this.appClient.send.call(C.setStopAuthority(i));return{...a,return:a.return}},setRebalancer:async i=>{let a=await this.appClient.send.call(C.setRebalancer(i));return{...a,return:a.return}},getGasUsage:async i=>{let a=await this.appClient.send.call(C.getGasUsage(i));return{...a,return:a.return}},setGasUsage:async i=>{let a=await this.appClient.send.call(C.setGasUsage(i));return{...a,return:a.return}},setGasOracle:async i=>{let a=await this.appClient.send.call(C.setGasOracle(i));return{...a,return:a.return}},getTransactionRelayerCost:async i=>{let a=await this.appClient.send.call(C.getTransactionRelayerCost(i));return{...a,return:a.return}},transferOwnership:async i=>{let a=await this.appClient.send.call(C.transferOwnership(i));return{...a,return:a.return}}};clone(i){return new r(this.appClient.clone(i))}async getBridgingCostInTokens(i){return(await this.appClient.send.call(C.getBridgingCostInTokens(i))).return}async hashMessage(i){return(await this.appClient.send.call(C.hashMessage(i))).return}async isOtherBridgeTokenSupported(i){return(await this.appClient.send.call(C.isOtherBridgeTokenSupported(i))).return}async getTransactionCost(i){return(await this.appClient.send.call(C.getTransactionCost(i))).return}async getReceiveTokensCost(i={args:[]}){return(await this.appClient.send.call(C.getReceiveTokensCost(i))).return}async getSendTransactionStorageCost(i={args:[]}){return(await this.appClient.send.call(C.getSendTransactionStorageCost(i))).return}async getGasUsage(i){return(await this.appClient.send.call(C.getGasUsage(i))).return}async getTransactionRelayerCost(i){return(await this.appClient.send.call(C.getTransactionRelayerCost(i))).return}state={global:{getAll:async()=>{let i=await this.appClient.state.global.getAll();return{chainId:i.chainId,messenger:i.messenger,stopAuthority:i.stopAuthority,rebalancer:i.rebalancer,canSwap:i.canSwap,gasOracle:i.gasOracle,owner:i.owner}},chainId:async()=>await this.appClient.state.global.getValue("chainId"),messenger:async()=>await this.appClient.state.global.getValue("messenger"),stopAuthority:async()=>await this.appClient.state.global.getValue("stopAuthority"),rebalancer:async()=>await this.appClient.state.global.getValue("rebalancer"),canSwap:async()=>await this.appClient.state.global.getValue("canSwap"),gasOracle:async()=>await this.appClient.state.global.getValue("gasOracle"),owner:async()=>await this.appClient.state.global.getValue("owner")},box:{getAll:async()=>{let i=await this.appClient.state.box.getAll();return{}},processedMessages:{getMap:async()=>await this.appClient.state.box.getMap("processedMessages"),value:async i=>await this.appClient.state.box.getMapValue("processedMessages",i)},sentMessages:{getMap:async()=>await this.appClient.state.box.getMap("sentMessages"),value:async i=>await this.appClient.state.box.getMapValue("sentMessages",i)},otherBridges:{getMap:async()=>await this.appClient.state.box.getMap("otherBridges"),value:async i=>await this.appClient.state.box.getMapValue("otherBridges",i)},otherBridgeTokens:{getMap:async()=>await this.appClient.state.box.getMap("otherBridgeTokens"),value:async i=>await this.appClient.state.box.getMapValue("otherBridgeTokens",i)},pools:{getMap:async()=>await this.appClient.state.box.getMap("pools"),value:async i=>await this.appClient.state.box.getMapValue("pools",i)},fromGasOracleScalingFactor:{getMap:async()=>await this.appClient.state.box.getMap("fromGasOracleScalingFactor"),value:async i=>await this.appClient.state.box.getMapValue("fromGasOracleScalingFactor",i)},bridgingFeeConversionScalingFactor:{getMap:async()=>await this.appClient.state.box.getMap("bridgingFeeConversionScalingFactor"),value:async i=>await this.appClient.state.box.getMapValue("bridgingFeeConversionScalingFactor",i)},gasUsage:{getMap:async()=>await this.appClient.state.box.getMap("gasUsage"),value:async i=>await this.appClient.state.box.getMapValue("gasUsage",i)}}};newGroup(){let i=this,a=this.algorand.newGroup(),o=Promise.resolve(),s=[];return{optInAsset(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.optInAsset(d))),s.push(void 0),this},noop(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.noop(d))),s.push(void 0),this},swapAndBridge(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.swapAndBridge(d))),s.push(void 0),this},receiveTokens(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.receiveTokens(d))),s.push(void 0),this},registerBridge(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.registerBridge(d))),s.push(void 0),this},addBridgeToken(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.addBridgeToken(d))),s.push(void 0),this},removeBridgeToken(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.removeBridgeToken(d))),s.push(void 0),this},withdrawGasTokens(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.withdrawGasTokens(d))),s.push(void 0),this},withdrawBridgingFeeInTokens(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.withdrawBridgingFeeInTokens(d))),s.push(void 0),this},getBridgingCostInTokens(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.getBridgingCostInTokens(d))),s.push(A=>i.decodeReturnValue("getBridgingCostInTokens(byte,uint64)uint64",A)),this},hashMessage(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.hashMessage(d))),s.push(A=>i.decodeReturnValue("hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32]",A)),this},isOtherBridgeTokenSupported(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.isOtherBridgeTokenSupported(d))),s.push(A=>i.decodeReturnValue("isOtherBridgeTokenSupported(byte,byte[32])bool",A)),this},getTransactionCost(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.getTransactionCost(d))),s.push(A=>i.decodeReturnValue("getTransactionCost(byte)uint64",A)),this},getReceiveTokensCost(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.getReceiveTokensCost(d))),s.push(A=>i.decodeReturnValue("getReceiveTokensCost()uint64",A)),this},getSendTransactionStorageCost(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.getSendTransactionStorageCost(d))),s.push(A=>i.decodeReturnValue("getSendTransactionStorageCost()uint64",A)),this},swap(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.swap(d))),s.push(void 0),this},addPool(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.addPool(d))),s.push(void 0),this},removePool(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.removePool(d))),s.push(void 0),this},stopSwap(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.stopSwap(d))),s.push(void 0),this},startSwap(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.startSwap(d))),s.push(void 0),this},setStopAuthority(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setStopAuthority(d))),s.push(void 0),this},setRebalancer(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setRebalancer(d))),s.push(void 0),this},getGasUsage(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.getGasUsage(d))),s.push(A=>i.decodeReturnValue("getGasUsage(byte)uint64",A)),this},setGasUsage(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setGasUsage(d))),s.push(void 0),this},setGasOracle(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setGasOracle(d))),s.push(void 0),this},getTransactionRelayerCost(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.getTransactionRelayerCost(d))),s.push(A=>i.decodeReturnValue("getTransactionRelayerCost(byte)uint64",A)),this},transferOwnership(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.transferOwnership(d))),s.push(void 0),this},clearState(d){return o=o.then(()=>a.addAppCall(i.params.clearState(d))),this},addTransaction(d,A){return o=o.then(()=>a.addTransaction(d,A)),this},async composer(){return await o,a},async simulate(d){await o;let A=await(d?a.simulate(d):a.simulate());return{...A,returns:A.returns?.map((g,c)=>s[c]!==void 0?s[c](g):g.returnValue)}},async send(d){await o;let A=await a.send(d);return{...A,returns:A.returns?.map((g,c)=>s[c]!==void 0?s[c](g):g.returnValue)}}}}};import{populateAppCallResources as rr}from"@algorandfoundation/algokit-utils";import sr,{ABIMethod as dr,AtomicTransactionComposer as Ar,makeBasicAccountTransactionSigner as gr}from"algosdk";var cr=new dr({name:"noop",args:[],returns:{type:"void"}});function yt(r){let{composer:i,appId:a,sender:o,signer:s,count:d}=r;for(let A=0;A<d;A++)i.addAppCallMethodCall({appId:a,method:cr,args:[],sender:o,signer:s,note:`noop_${A}`})}function dt(r){return(r*1e3).microAlgos()}async function Xi(r,i,a){let o=new Ar,s=gr({addr:i,sk:new Uint8Array(64)});r.forEach(g=>{o.addTransaction({txn:g,signer:s})});let A=(await rr(o,a)).buildGroup().map(g=>g.txn);return _e(...A)}function _e(...r){return r.map(a=>sr.encodeUnsignedTransaction(a)).map(a=>Buffer.from(a).toString("hex"))}async function Gn(r,i,a){typeof r=="string"&&(r=BigInt(r));let s=(await a.account.getInformation(i)).assets;return s?s.find(({assetId:A})=>A===r)!==void 0:!1}async function Fn(r,i,a){typeof r=="string"&&(r=BigInt(r));let s=(await a.account.getInformation(i)).appsLocalState;return s?s.find(({id:A})=>A===r)!==void 0:!1}var Ae=class{};import{PublicKey as lr}from"@solana/web3.js";import{Address as ur}from"@stellar/stellar-sdk";import mr,{Address as pr}from"algosdk";import{Big as ye}from"big.js";import Za from"randombytes";import{utils as Wa}from"tronweb";import{Big as R}from"big.js";import Vi from"bn.js";function Si(r,i){return R(100).minus(R(100).times(i).div(r)).toNumber()}function At(r,i){return Re(r,i,3).round(0,R.roundDown)}function be(r,i){return Re(r,3,i)}function Re(r,i,a){let o=R(a).minus(i).toNumber();return R(r).times(xt(o))}function xt(r){return R(10).pow(r)}function f(r,i){return R(r).times(xt(i))}function F(r,i){let a=R(r);return a.eq(0)?R(0):R(a).div(xt(i))}function te(r){return F(R(r.tokenBalance).minus(r.vUsdBalance).toFixed(),3).div(2).toFixed()}function je(r,{feeShare:i,decimals:a},o){let s=R(r);if(s.lte(0))return"0";let d=s.times(i),A=s.minus(d),g=At(A,a),c=R(o.tokenBalance).plus(g),l=Je(c,o.aValue,o.dValue);return R(o.vUsdBalance).minus(l).round(0,R.roundDown).toFixed()}function Ot(r,{feeShare:i,decimals:a},o){let s=R(r);if(s.lte(0))return R(0).toFixed();let d=s.plus(o.vUsdBalance),A=Je(d,o.aValue,o.dValue),g=be(R(o.tokenBalance).minus(A),a),c=R(g).times(i);return R(g).minus(c).round(0,R.roundDown).toFixed()}function ba(r,i){let a=R(r);if(a.lte(0))return i;let o=a.plus(i.vUsdBalance),s=Je(o,i.aValue,i.dValue);return{aValue:i.aValue,dValue:i.dValue,tokenBalance:s.toFixed(0),vUsdBalance:o.toFixed(0)}}function ya(r,{feeShare:i,decimals:a},o){if(R(r).lte(0))return R(0);let s=R(o.vUsdBalance).minus(r);if(s.lte(0))throw new Ke;let d=Je(s,o.aValue,o.dValue),A=R(d).minus(o.tokenBalance),g=be(A,a),c=R(i).div(R(1).minus(i)),l=R(g).times(c).round(0,R.roundUp);return R(g).plus(l).round(0,R.roundDown)}function ha(r,{feeShare:i,decimals:a},o){if(R(r).lte(0))return R(0);let s=R(i).div(R(1).minus(i)),d=R(r).times(s).round(0,R.roundUp),A=R(r).plus(d),g=At(A,a),c=R(o.tokenBalance).minus(g);if(c.lte(0))throw new Ke;let l=Je(c,o.aValue,o.dValue);return R(l).minus(o.vUsdBalance).round(0,R.roundDown)}function Je(r,i,a){let o=R(4).times(i).times(R(a).minus(r)).minus(a),s=R(a).pow(3),d=o.pow(2),A=R(r).times(R(r).times(d).plus(R(4).times(i).times(s))).sqrt().round(0,R.roundDown),g=R(8).times(i).times(r),c=o.times(r).plus(A).div(g).round(0,R.roundDown);return c.eq(0)?R(0):c.plus(1)}function va(r,i,a,o){let s=new Vi(r),d=new Vi(a),A=new Vi(i);return s.mul(d).shrn(o).sub(A).toString()}function Ya(r){return R(r).gt(0)?`${Number(R(r).times(100).toFixed(2)).toLocaleString()}%`:"N/A"}function Ra(r,i,a){let o=R(i).times(a),s=R(i).plus(a),d=R(8).times(r).times(o).times(s),A=o.times(R(16).times(r).minus(4)).div(3),g=d.times(d),c=A.times(A).times(A),l=g.plus(c),u=R(l).sqrt(),m=R(Math.cbrt(+d.plus(u).toFixed())),p=R(Math.cbrt(+d.minus(u).toFixed()));return m.plus(p).toFixed()}function Ue(r,i,a){let o;switch(i){case"EVM":{o=Ba(r);break}case"SOLANA":{o=new lr(r).toBuffer();break}case"TRX":{o=Ir(r);break}case"SRB":{o=new ur(r).toBuffer();break}case"SUI":{o=Ba(r);break}case"ALG":{o=Cr(r);break}}switch(a){case"EVM":return"0x"+o.toString("hex");case"SOLANA":return Array.from(o);case"TRX":return o;case"SRB":return o.toJSON().data;case"SUI":return"0x"+o.toString("hex");case"ALG":return o}}function Te(r){return r.replace(/^0x/i,"")}function Ga(r){return Buffer.from(r.replace(/^0x/i,""),"hex")}function Ba(r){let a=Ga(r);return Buffer.concat([Buffer.alloc(32-a.length,0),a],32)}function Cr(r){if(mr.isValidAddress(r))return Buffer.from(pr.fromString(r).publicKey);if(/^\d+$/.test(r)){let i=BigInt(r).toString(16);return i=i.padStart(64,"0"),Buffer.from(i,"hex")}throw new I(`Unexpected Alg address: ${r}`)}function Ir(r){let i=Qt(r),a=Ga(i);return br(a,32)}function Qt(r){let i=Wa.crypto.decodeBase58Address(r);return i?Wa.bytes.byteArray2hexStr(i).replace(/^41/,"0x"):""}function br(r,i){if(r.length>=i)return r;let a=Buffer.alloc(i,0);return r.copy(a,i-r.length),a}function ht(){return Za(32)}function ke(){let r=Za(32).readBigInt64BE();return r<0?r*-1n:r}function We(r,i){let a={},o=i.sourceToken;switch(a.amount=f(i.amount,o.decimals).toFixed(),a.contractAddress=o.bridgeAddress,a.fromAccountAddress=i.fromAccountAddress,r){case"SUI":{if(!o.originTokenAddress)throw new I("SUI sourceToken must contain 'originTokenAddress'");a.fromTokenAddress=o.originTokenAddress;break}case"ALG":{a.fromTokenAddress=o.tokenAddress;break}default:a.fromTokenAddress=Ue(o.tokenAddress,r,r)}switch(a.toAccountAddress=i.toAccountAddress,r){case"SUI":{if(!i.destinationToken.originTokenAddress)throw new I("SUI destinationToken must contain 'originTokenAddress'");a.toTokenAddress=i.destinationToken.originTokenAddress;break}case"ALG":{a.toTokenAddress=i.destinationToken.tokenAddress;break}default:a.toTokenAddress=Ue(i.destinationToken.tokenAddress,r,r)}return a.minimumReceiveAmount=i.minimumReceiveAmount?f(i.minimumReceiveAmount,i.destinationToken.decimals).toFixed():"0",a}async function he(r,i,a){let o={};o.fromChainId=i.sourceToken.allbridgeChainId,o.fromChainSymbol=i.sourceToken.chainSymbol;let s=X.getChainProperty(i.destinationToken.chainSymbol).chainType;if(r==="SUI"){if(!i.sourceToken.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");o.fromTokenAddress=i.sourceToken.originTokenAddress}else o.fromTokenAddress=i.sourceToken.tokenAddress;o.toChainId=i.destinationToken.allbridgeChainId,o.toTokenAddress=i.destinationToken.tokenAddress,i.gasFeePaymentMethod==="stablecoin"?o.gasFeePaymentMethod="stablecoin":o.gasFeePaymentMethod="native";let d=i.sourceToken;switch(i.messenger){case 3:if(!d.cctpAddress||!i.destinationToken.cctpAddress)throw new se("Such route does not support CCTP protocol");o.contractAddress=d.cctpAddress;break;case 4:if(!d.cctpV2Address||!i.destinationToken.cctpV2Address)throw new se("Such route does not support CCTP V2 protocol");o.contractAddress=d.cctpV2Address;break;case 5:if(!d.oftBridgeAddress||!i.destinationToken.oftBridgeAddress||d.oftId!==i.destinationToken.oftId)throw new de("Such route does not support OFT protocol");o.contractAddress=d.oftBridgeAddress;break;case 1:case 2:o.contractAddress=d.bridgeAddress;break}o.messenger=i.messenger,o.fromAccountAddress=i.fromAccountAddress,o.amount=f(i.amount,d.decimals).toFixed();let{fee:A,feeFormat:g}=i;if(!A){let m=(await Mi(i.sourceToken,o.toChainId,o.messenger,a))[o.gasFeePaymentMethod];if(!m)throw new Jt;A=m.int,g="int"}if(g=="float")switch(o.gasFeePaymentMethod){case"native":o.fee=f(A,X.getChainDecimalsByType(d.chainType)).toFixed(0);break;case"stablecoin":o.fee=f(A,d.decimals).toFixed(0);break}else o.fee=A;let{extraGas:c,extraGasFormat:l}=i;if(c&&+c>0){let u=await Hi(d,i.destinationToken,o.messenger,a),m,p;switch(o.gasFeePaymentMethod){case"native":m=X.getChainDecimalsByType(d.chainType),p=ye(u.exchangeRate);break;case"stablecoin":m=d.decimals,p=ye(u.exchangeRate).div(u.sourceNativeTokenPrice);break}switch(l??"int"){case"float":{o.extraGas=f(c,m).toFixed(0);let b=p.mul(c);o.extraGasDest=f(b,X.getChainDecimalsByType(i.destinationToken.chainType)).toFixed(0,ye.roundDown);break}case"int":{o.extraGas=c;let b=F(o.extraGas,X.getChainDecimalsByType(d.chainType)),W=p.mul(b);o.extraGasDest=f(W,X.getChainDecimalsByType(i.destinationToken.chainType)).toFixed(0,ye.roundDown);break}}hr(o.extraGas,o.gasFeePaymentMethod,u)}return["SUI","ALG"].includes(r)||(o.fromTokenAddress=Ue(o.fromTokenAddress,r,r)),o.toAccountAddress=Ue(i.toAccountAddress,s,r),o.toTokenAddress=Ue(o.toTokenAddress,s,r),o.gasFeePaymentMethod=="stablecoin"&&yr(o.amount,d.decimals,o.fee,o.extraGas),o}function yr(r,i,a,o){let s=ye(r).minus(a).minus(o??0);if(s.lte(0))throw new It(`Amount not enough to pay fee, ${F(ye(s).minus(1).neg(),i).toFixed()} stables is missing`)}async function Mi(r,i,a,o){let s=await o.getReceiveTransactionCost({sourceChainId:r.allbridgeChainId,destinationChainId:i,messenger:a,sourceToken:r.tokenAddress}),d={native:{int:s.fee,float:F(s.fee,X.getChainDecimalsByType(r.chainType)).toFixed()},adminFeeShareWithExtras:s.adminFeeShareWithExtras};if(s.sourceNativeTokenPrice){let A=Re(new ye(s.fee).mul(s.sourceNativeTokenPrice),X.getChainDecimalsByType(r.chainType),r.decimals).toFixed(0,ye.roundUp);d.stablecoin={int:A,float:F(A,r.decimals).toFixed()}}return d}function hr(r,i,a){let o=a.extraGasMax[i];if(!o)throw new Jt(`Impossible to pay extra gas by '${i}' payment method`);let s=o.int;if(ye(r).gt(s))throw new bn(`Extra gas ${r} in int format, exceeded limit ${s} for '${i}' payment method`)}async function Hi(r,i,a,o){let s={},d=await o.getReceiveTransactionCost({sourceChainId:r.allbridgeChainId,destinationChainId:i.allbridgeChainId,messenger:a,sourceToken:r.tokenAddress}),A=i.txCostAmount.maxAmount,g=F(A,X.getChainDecimalsByType(i.chainType)).toFixed(),c=ye(g).div(d.exchangeRate).toFixed(X.getChainDecimalsByType(r.chainType),ye.roundDown),l=f(c,X.getChainDecimalsByType(r.chainType)).toFixed(0);if(s.native={int:l,float:c},d.sourceNativeTokenPrice){let u=ye(c).mul(d.sourceNativeTokenPrice).toFixed(r.decimals,ye.roundDown);s.stablecoin={int:f(u,r.decimals).toFixed(0),float:u}}return{extraGasMax:s,destinationChain:{gasAmountMax:{int:A,float:g},swap:{int:i.txCostAmount.swap,float:F(i.txCostAmount.swap,X.getChainDecimalsByType(i.chainType)).toFixed()},transfer:{int:i.txCostAmount.transfer,float:F(i.txCostAmount.transfer,X.getChainDecimalsByType(i.chainType)).toFixed()}},exchangeRate:d.exchangeRate,sourceNativeTokenPrice:d.sourceNativeTokenPrice}}function Fa(r){return r.sourceToken.chainSymbol!==r.destinationToken.chainSymbol}var Kt=class extends Ae{constructor(a,o){super();this.algorand=a;this.api=o;a.setDefaultSigner(fa.makeBasicAccountTransactionSigner(fa.mnemonicToSecretKey("tunnel gym elevator pulse motor evolve release orange culture make sister approve winter chair armor grocery distance festival tiger holiday dish wisdom region absorb secret")))}chainType="ALG";send(a){throw new k}async buildRawTransactionSend(a){let o=await he(this.chainType,a,this.api);if(!a.sourceToken.bridgeId)throw new I("ALG sourceToken must contain 'bridgeId'");let s=BigInt(a.sourceToken.bridgeId),d=this.getBridge(s),A=Na.fromString(a.fromAccountAddress),g=BigInt(a.sourceToken.tokenAddress),c=o.toChainId,l=o.toAccountAddress,u=o.toTokenAddress,m=ht(),p=BigInt(o.amount),b=BigInt(o.fee);o.extraGas&&(b=b+BigInt(o.extraGas));let W=o.gasFeePaymentMethod==="stablecoin",y=this.algorand.newGroup(),Y,B;W?(Y=b,B=p+Y):(y.addPayment({sender:A,receiver:d.appAddress,amount:vr.MicroAlgo(b)}),Y=0n,B=p),y.addAssetTransfer({assetId:g,amount:B,sender:A,receiver:d.appAddress}).addAppCallMethodCall(await d.params.swapAndBridge({args:{tokenId:g,recipient:l,destinationChainId:c,receiveToken:u,nonce:m,feeTokenAmount:Y},sender:A,extraFee:dt(W?9:8)})),yt({composer:y,appId:s,sender:A,count:W?3:2});let{transactions:h}=await y.buildTransactions();return Xi(h,A,this.algorand.client.algod)}async buildRawTransactionSwap(a){let o=We(this.chainType,a),s=Na.fromString(a.fromAccountAddress),d=a.toAccountAddress,A=BigInt(a.sourceToken.tokenAddress),g=BigInt(a.destinationToken.tokenAddress),c=BigInt(o.minimumReceiveAmount),l=BigInt(o.amount);if(!a.sourceToken.bridgeId)throw new I("ALG sourceToken must contain 'bridgeId'");let u=BigInt(a.sourceToken.bridgeId),m=this.getBridge(u),p=this.algorand.newGroup();a.fromAccountAddress===d&&(await Gn(g,d,this.algorand)||p.addAssetOptIn({sender:s,assetId:g})),p.addAssetTransfer({assetId:A,amount:l,sender:s,receiver:m.appAddress}),p.addAppCallMethodCall(await m.params.swap({args:{tokenId:A,recipient:d,receiveTokenId:g,receiveAmountMin:c},sender:s,extraFee:dt(4)})),yt({composer:p,appId:u,sender:s,count:1});let{transactions:b}=await p.buildTransactions();return Xi(b,s,this.algorand.client.algod)}getBridge(a){return this.algorand.client.getTypedAppClientById(Zn,{appId:a})}};import{Big as Fr}from"big.js";var Yr={abi:[{inputs:[{internalType:"uint256",name:"_chainId",type:"uint256"},{internalType:"uint256",name:"_chainPrecision",type:"uint256"},{internalType:"contract Messenger",name:"_allbridgeMessenger",type:"address"},{internalType:"contract WormholeMessenger",name:"_wormholeMessenger",type:"address"},{internalType:"contract IGasOracle",name:"_gasOracle",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"gas",type:"uint256"}],name:"BridgingFeeFromTokens",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"bridgeTransactionCost",type:"uint256"},{indexed:!1,internalType:"uint256",name:"messageTransactionCost",type:"uint256"}],name:"ReceiveFee",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Received",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"address",name:"recipient",type:"address"},{indexed:!1,internalType:"bytes32",name:"sendToken",type:"bytes32"},{indexed:!1,internalType:"bytes32",name:"receiveToken",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"sendAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receiveAmount",type:"uint256"}],name:"Swapped",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bytes32",name:"recipient",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"nonce",type:"uint256"},{indexed:!1,internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"},{indexed:!1,internalType:"bytes32",name:"message",type:"bytes32"}],name:"TokensReceived",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bytes32",name:"recipient",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"destinationChainId",type:"uint256"},{indexed:!1,internalType:"bytes32",name:"receiveToken",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"nonce",type:"uint256"},{indexed:!1,internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"}],name:"TokensSent",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[{internalType:"uint256",name:"_chainId",type:"uint256"},{internalType:"bytes32",name:"tokenAddress",type:"bytes32"}],name:"addBridgeToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract Pool",name:"pool",type:"address"},{internalType:"bytes32",name:"token",type:"bytes32"}],name:"addPool",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"canSwap",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"chainId",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"gasUsage",outputs:[{internalType:"uint256",name:"amount",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"},{internalType:"address",name:"tokenAddress",type:"address"}],name:"getBridgingCostInTokens",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"enum MessengerProtocol",name:"protocol",type:"uint8"}],name:"getMessageCost",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"enum MessengerProtocol",name:"protocol",type:"uint8"}],name:"getMessageGasUsage",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"getTransactionCost",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"message",type:"bytes32"},{internalType:"enum MessengerProtocol",name:"protocol",type:"uint8"}],name:"hasReceivedMessage",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"message",type:"bytes32"}],name:"hasSentMessage",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"sourceChainId",type:"uint256"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"bytes32",name:"receiveToken",type:"bytes32"},{internalType:"uint256",name:"nonce",type:"uint256"},{internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"}],name:"hashMessage",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"bytes32",name:"tokenAddress",type:"bytes32"}],name:"otherBridgeTokens",outputs:[{internalType:"bool",name:"isSupported",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"otherBridges",outputs:[{internalType:"bytes32",name:"bridgeAddress",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"tokenId",type:"bytes32"}],name:"pools",outputs:[{internalType:"contract Pool",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"messageHash",type:"bytes32"}],name:"processedMessages",outputs:[{internalType:"uint256",name:"isProcessed",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"sourceChainId",type:"uint256"},{internalType:"bytes32",name:"receiveToken",type:"bytes32"},{internalType:"uint256",name:"nonce",type:"uint256"},{internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"},{internalType:"uint256",name:"receiveAmountMin",type:"uint256"}],name:"receiveTokens",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"uint256",name:"_chainId",type:"uint256"},{internalType:"bytes32",name:"bridgeAddress",type:"bytes32"}],name:"registerBridge",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_chainId",type:"uint256"},{internalType:"bytes32",name:"tokenAddress",type:"bytes32"}],name:"removeBridgeToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"messageHash",type:"bytes32"}],name:"sentMessages",outputs:[{internalType:"uint256",name:"isSent",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract Messenger",name:"_allbridgeMessenger",type:"address"}],name:"setAllbridgeMessenger",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract IGasOracle",name:"_gasOracle",type:"address"}],name:"setGasOracle",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"uint256",name:"gasAmount",type:"uint256"}],name:"setGasUsage",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_rebalancer",type:"address"}],name:"setRebalancer",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_stopAuthority",type:"address"}],name:"setStopAuthority",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract WormholeMessenger",name:"_wormholeMessenger",type:"address"}],name:"setWormholeMessenger",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"startSwap",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"stopSwap",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"token",type:"bytes32"},{internalType:"bytes32",name:"receiveToken",type:"bytes32"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"receiveAmountMin",type:"uint256"}],name:"swap",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"token",type:"bytes32"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"bytes32",name:"receiveToken",type:"bytes32"},{internalType:"uint256",name:"nonce",type:"uint256"},{internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"},{internalType:"uint256",name:"feeTokenAmount",type:"uint256"}],name:"swapAndBridge",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract IERC20",name:"token",type:"address"}],name:"withdrawBridgingFeeInTokens",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"}],name:"withdrawGasTokens",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},Ta=Yr;var Rr={abi:[{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint256",name:"chainPrecision_",type:"uint256"},{internalType:"address",name:"tokenAddress",type:"address"},{internalType:"address",name:"cctpMessenger_",type:"address"},{internalType:"address",name:"cctpTransmitter_",type:"address"},{internalType:"contract IGasOracle",name:"gasOracle_",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"recipient",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"ReceivedExtraGas",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"ReceivedGas",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"uint256",name:"nonce",type:"uint256"},{indexed:!1,internalType:"bytes32",name:"newRecipient",type:"bytes32"}],name:"RecipientReplaced",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"bytes32",name:"recipientWalletAddress",type:"bytes32"}],name:"TokensSentExtras",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"bytes32",name:"recipient",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"destinationChainId",type:"uint256"},{indexed:!1,internalType:"uint256",name:"nonce",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeFromGas",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeFromTokens",type:"uint256"},{indexed:!1,internalType:"uint256",name:"relayerFee",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeTokenAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"adminFeeTokenAmount",type:"uint256"}],name:"TokensSent",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[],name:"adminFeeShareBP",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"uint256",name:"relayerFeeTokenAmount",type:"uint256"}],name:"bridge",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"bytes32",name:"recipientWalletAddress",type:"bytes32"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"uint256",name:"relayerFeeTokenAmount",type:"uint256"}],name:"bridgeWithWalletAddress",outputs:[],stateMutability:"payable",type:"function"},{inputs:[],name:"chainId",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes",name:"originalMessage",type:"bytes"},{internalType:"bytes",name:"originalAttestation",type:"bytes"},{internalType:"bytes32",name:"newRecipient",type:"bytes32"}],name:"changeRecipient",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"gasUsage",outputs:[{internalType:"uint256",name:"amount",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"destinationChainId",type:"uint256"}],name:"getBridgingCostInTokens",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"}],name:"getDomainByChainId",outputs:[{internalType:"uint32",name:"",type:"uint32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"getTransactionCost",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"sourceChainId",type:"uint256"},{internalType:"uint64",name:"nonce",type:"uint64"}],name:"isMessageProcessed",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"bytes",name:"message",type:"bytes"},{internalType:"bytes",name:"signature",type:"bytes"}],name:"receiveTokens",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint32",name:"domain",type:"uint32"}],name:"registerBridgeDestination",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"adminFeeShareBP_",type:"uint256"}],name:"setAdminFeeShare",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract IGasOracle",name:"gasOracle_",type:"address"}],name:"setGasOracle",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"uint256",name:"gasAmount",type:"uint256"}],name:"setGasUsage",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"}],name:"unregisterBridgeDestination",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"withdrawFeeInTokens",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"}],name:"withdrawGas",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},wa=Rr;var Wr={abi:[{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint256",name:"chainPrecision_",type:"uint256"},{internalType:"contract IGasOracle",name:"gasOracle_",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[{internalType:"uint16",name:"optionType",type:"uint16"}],name:"InvalidOptionType",type:"error"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"bytes32",name:"recipient",type:"bytes32"},{indexed:!1,internalType:"address",name:"tokenAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"destinationChainId",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeFromGas",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeFromTokens",type:"uint256"},{indexed:!1,internalType:"uint256",name:"relayerFeeWithExtraGas",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeTokenAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"adminFeeTokenAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"extraGasDestinationToken",type:"uint256"}],name:"OftTokensSent",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"ReceivedGas",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[{internalType:"address",name:"oft_",type:"address"}],name:"addToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress",type:"address"}],name:"adminFeeShareBP",outputs:[{internalType:"uint256",name:"feeShare",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"uint256",name:"relayerFeeTokenAmount",type:"uint256"},{internalType:"uint256",name:"extraGasInDestinationToken",type:"uint256"},{internalType:"uint256",name:"slippageBP",type:"uint256"}],name:"bridge",outputs:[],stateMutability:"payable",type:"function"},{inputs:[],name:"chainId",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress_",type:"address"},{internalType:"uint256",name:"destinationChainId_",type:"uint256"},{internalType:"uint128",name:"extraGasAmount_",type:"uint128"}],name:"extraGasPrice",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"}],name:"getEidByChainId",outputs:[{internalType:"uint32",name:"",type:"uint32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress",type:"address"}],name:"oftAddress",outputs:[{internalType:"address",name:"oftAddress",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint32",name:"eid_",type:"uint32"},{internalType:"uint128",name:"lzGasLimit_",type:"uint128"}],name:"registerBridgeDestination",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress_",type:"address"},{internalType:"uint256",name:"destinationChainId_",type:"uint256"}],name:"relayerFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"oft_",type:"address"}],name:"removeToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress_",type:"address"},{internalType:"uint256",name:"adminFeeShareBP_",type:"uint256"}],name:"setAdminFeeShare",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint128",name:"lzGasLimit_",type:"uint128"}],name:"setLzGasLimit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint256",name:"maxExtraGas_",type:"uint256"}],name:"setMaxExtraGas",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"}],name:"unregisterBridgeDestination",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract IERC20",name:"token_",type:"address"}],name:"withdrawFeeInTokens",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount_",type:"uint256"}],name:"withdrawGas",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},Xa=Wr;import*as Nn from"@project-serum/anchor";import{PublicKey as ka}from"@solana/web3.js";import*as ae from"@project-serum/anchor";import{PublicKey as ge}from"@solana/web3.js";async function we(r,i){return ae.utils.token.associatedAddress({mint:i,owner:r})}async function qe(r){let[i]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("config")],r);return i}async function Va(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("lock"),Uint8Array.from(r)],i);return a}async function Ut(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("price_v2"),Uint8Array.from([r])],i);return a}async function vt(r){let i=await qe(r),[a]=await ge.findProgramAddress([i.toBuffer()],r);return a}async function Sa(r,i){let[a]=await ge.findProgramAddress([r.toBuffer()],i);return a}async function Yt(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("token"),r.toBytes()],i);return a}async function Ma(r,i,a){let[o]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("other_bridge_token"),Buffer.from([r]),i],a);return o}async function Li(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("chain_bridge"),Uint8Array.from([r])],i);return a}async function Pi(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("gas_usage"),Uint8Array.from([r])],i);return a}async function Ha(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("sent_message"),r],i);return a}async function ji(r,i,a){let[o]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("user_deposit"),i.toBytes(),r.toBytes()],a);return o}async function La(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("cctp_bridge"),r.toBytes()],i);return a}async function Pa(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("token"),r.toBytes()],i);return a}function ja(r,i){let[a]=ge.findProgramAddressSync([ae.utils.bytes.utf8.encode("lock"),i.toBuffer()],r);return a}function Ja(r,i,a,o){let s=gt("message_transmitter",a),d=gt("token_messenger",o),A=gt("__event_authority",o),g=gt("token_minter",o),c=gt("local_token",o,[i]),l=gt("remote_token_messenger",o,[r.toString()]),u=gt("sender_authority",o);return{messageTransmitterAccount:s,tokenMessenger:d,tokenMessengerEventAuthority:A,tokenMinter:g,localToken:c,remoteTokenMessengerKey:l,authorityPda:u}}function gt(r,i,a=[]){let o=[Buffer.from(ae.utils.bytes.utf8.encode(r))];for(let d of a)typeof d=="string"?o.push(Buffer.from(ae.utils.bytes.utf8.encode(d))):Array.isArray(d)||Buffer.isBuffer(d)?o.push(Buffer.from(Uint8Array.from(d))):o.push(Buffer.from(Uint8Array.from(d.toBuffer())));return ge.findProgramAddressSync(o,i)[0]}import{AnchorProvider as Br}from"@project-serum/anchor";import{Connection as Zr,PublicKey as Gr}from"@solana/web3.js";function et(r,i){let a=new Zr(r,"confirmed"),o=new Gr(i);return new Br(a,{publicKey:o},{preflightCommitment:"confirmed",commitment:"confirmed"})}async function Tn(r,i,a,o){let s,d=new ka(i),A=new ka(a),g=await we(d,A),c=et(o,i);Nn.setProvider(c);let l=await Nn.Spl.token(c).account.token.fetchNullable(g);if(l?.authority.equals(d))s=Ue(g.toBase58(),"SOLANA",r);else{let u=await c.connection.getTokenAccountsByOwner(d,{mint:A});if(u.value.length===0&&!l)s=Ue(g.toBase58(),"SOLANA",r);else if(u.value.length>0){let m=u.value[0];if(!m?.pubkey)throw new I("First token account or its public key is undefined");s=Ue(m.pubkey.toBase58(),"SOLANA",r)}else throw new I("Associated account has wrong owner")}return s}var Dt=class extends Ae{constructor(a,o,s){super();this.web3=a;this.api=o;this.nodeRpcUrlsConfig=s}chainType="EVM";async send(a){let o=await this.buildRawTransactionSend(a);return this.sendRawTransaction(o)}async buildRawTransactionSwap(a){let o=We(this.chainType,a);return await this.buildRawTransactionSwapFromParams(o)}async buildRawTransactionSwapFromParams(a){let{amount:o,contractAddress:s,fromAccountAddress:d,fromTokenAddress:A,toAccountAddress:g,toTokenAddress:c,minimumReceiveAmount:l}=a,m=this.getBridgeContract(s).methods.swap(o,A,c,g,l);return Promise.resolve({from:d,to:s,data:m.encodeABI()})}async buildRawTransactionSend(a){let o=await he(this.chainType,a,this.api),{amount:s,contractAddress:d,fromAccountAddress:A,fromTokenAddress:g,toChainId:c,toAccountAddress:l,toTokenAddress:u,messenger:m,fee:p,gasFeePaymentMethod:b,extraGas:W,extraGasDest:y}=o,Y="0x"+ht().toString("hex"),B,h,Z=p;switch(W&&(Z=Fr(Z).plus(W).toFixed()),m){case 3:case 4:{let w=await this.buildRawTransactionCctpSend(a,o,Z);B=w.sendMethod,h=w.value;break}case 5:{let w=this.buildRawTransactionOftSend(a,o,Z,y);B=w.sendMethod,h=w.value;break}case 1:case 2:{let w=this.getBridgeContract(d);b==="stablecoin"?(B=w.methods.swapAndBridge(g,s,l,c,u,Y,m,Z),h="0"):(B=w.methods.swapAndBridge(g,s,l,c,u,Y,m,0),h=Z)}break}return Promise.resolve({from:A,to:d,value:h,data:B.encodeABI()})}async buildRawTransactionCctpSend(a,o,s){let{amount:d,contractAddress:A,toChainId:g,toAccountAddress:c,gasFeePaymentMethod:l}=o,u=this.getCctpBridgeContract(A),m,p;if(a.destinationToken.chainType==="SOLANA"){let b=await Tn(this.chainType,a.toAccountAddress,a.destinationToken.tokenAddress,this.nodeRpcUrlsConfig.getNodeRpcUrl("SOL"));l==="stablecoin"?(m=u.methods.bridgeWithWalletAddress(d,b,c,g,s),p="0"):(m=u.methods.bridgeWithWalletAddress(d,b,c,g,0),p=s)}else l==="stablecoin"?(m=u.methods.bridge(d,c,g,s),p="0"):(m=u.methods.bridge(d,c,g,0),p=s);return{sendMethod:m,value:p}}buildRawTransactionOftSend(a,o,s,d){let{amount:A,contractAddress:g,toChainId:c,toAccountAddress:l,gasFeePaymentMethod:u}=o,m=this.getOftBridgeContract(g),p,b;return u==="stablecoin"?(p=m.methods.bridge(a.sourceToken.tokenAddress,A,l,c,s,d??"0","10"),b="0"):(p=m.methods.bridge(a.sourceToken.tokenAddress,A,l,c,0,d??"0","10"),b=s),{sendMethod:p,value:b}}async sendRawTransaction(a){let o=await this.web3.eth.estimateGas(a),s={maxPriorityFeePerGas:null,maxFeePerGas:null},{transactionHash:d}=await this.web3.eth.sendTransaction({...a,gas:o,...s});return{txId:d.toString()}}getBridgeContract(a){return new this.web3.eth.Contract(Ta.abi,a)}getCctpBridgeContract(a){return new this.web3.eth.Contract(wa.abi,a)}getOftBridgeContract(a){return new this.web3.eth.Contract(Xa.abi,a)}};var wn=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s}async approve(i,a){let o,s;a?(o=i,s=a):s=i;let d=Et(s.token,s.messenger);return this.tokenService.buildRawTransactionApprove({...s,spender:d},o)}async send(i,a){return V(i.amount),H("amount",i.amount,i.sourceToken.decimals),Fa(i)?Xn(i.sourceToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionSend(i):Xn(i.sourceToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionSwap(i)}};import{BN as Bt,Program as zi,Spl as Lr,web3 as tt}from"@project-serum/anchor";import{Keypair as eo,PublicKey as Q,SystemProgram as Pr}from"@solana/web3.js";import{Big as Xe}from"big.js";var _t={version:"0.1.0",name:"bridge",instructions:[{name:"initialize",accounts:[{name:"admin",isMut:!0,isSigner:!0},{name:"config",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"InitializeArgs"}}]},{name:"initializePool",accounts:[{name:"payer",isMut:!0,isSigner:!0},{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"mint",isMut:!1,isSigner:!1},{name:"token",isMut:!0,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1},{name:"rent",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"InitializePoolArgs"}}]},{name:"initDepositAccount",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[]},{name:"deposit",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"amount",type:"u64"}]},{name:"withdraw",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"amountLp",type:"u64"}]},{name:"swapAndBridge",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"lock",isMut:!0,isSigner:!1},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1},{name:"otherBridgeToken",isMut:!0,isSigner:!1},{name:"messenger",isMut:!1,isSigner:!1},{name:"messengerConfig",isMut:!0,isSigner:!1},{name:"sentMessageAccount",isMut:!0,isSigner:!1},{name:"messengerGasUsage",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"gasPrice",isMut:!1,isSigner:!1},{name:"thisGasPrice",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"BridgeArgs"}}]},{name:"swapAndBridgeWormhole",accounts:[{name:"user",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"lock",isMut:!0,isSigner:!1},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1},{name:"otherBridgeToken",isMut:!0,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"gasPrice",isMut:!1,isSigner:!1},{name:"thisGasPrice",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"wormholeMessenger",isMut:!1,isSigner:!1},{name:"wormholeMessengerConfig",isMut:!0,isSigner:!1},{name:"wormholeProgram",isMut:!1,isSigner:!1},{name:"bridge",isMut:!0,isSigner:!1},{name:"message",isMut:!0,isSigner:!0},{name:"sequence",isMut:!0,isSigner:!1},{name:"feeCollector",isMut:!0,isSigner:!1},{name:"messengerGasUsage",isMut:!1,isSigner:!1},{name:"clock",isMut:!1,isSigner:!1},{name:"rent",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"BridgeArgs"}}]},{name:"swap",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"sendMint",isMut:!1,isSigner:!1},{name:"receiveMint",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1},{name:"sendPool",isMut:!0,isSigner:!1},{name:"receivePool",isMut:!0,isSigner:!1},{name:"sendBridgeToken",isMut:!0,isSigner:!1},{name:"receiveBridgeToken",isMut:!0,isSigner:!1},{name:"sendUserToken",isMut:!0,isSigner:!1},{name:"receiveUserToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1}],args:[{name:"amount",type:"u64"},{name:"receiveAmountMin",type:"u64"}]},{name:"registerChainBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"RegisterChainBridgeArgs"}}]},{name:"updateChainBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!0,isSigner:!1}],args:[{name:"args",type:{defined:"UpdateChainBridgeArgs"}}]},{name:"receiveAndSwap",accounts:[{name:"user",isMut:!0,isSigner:!1},{name:"payer",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"receivedMessageAccount",isMut:!1,isSigner:!1},{name:"unlock",isMut:!0,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1},{name:"messengerProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"UnlockArgs"}}]},{name:"receiveAndSwapWormhole",accounts:[{name:"user",isMut:!0,isSigner:!1},{name:"payer",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"receivedMessageAccount",isMut:!1,isSigner:!1},{name:"unlock",isMut:!0,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1},{name:"messengerProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"UnlockArgs"}}]},{name:"withdrawGasToken",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"recipient",isMut:!0,isSigner:!1},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"amount",type:"u64"}]},{name:"claimRewards",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[]},{name:"setAdmin",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"newAdmin",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1}],args:[]},{name:"startBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"actionType",type:{defined:"ActionType"}}]},{name:"stopBridge",accounts:[{name:"stopAuthority",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"actionType",type:{defined:"ActionType"}}]},{name:"setRebalancer",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1},{name:"rebalancer",isMut:!1,isSigner:!1}],args:[]},{name:"setStopAuthority",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"newAuthority",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1}],args:[]},{name:"setAllbridgeMessengerProgramId",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]},{name:"setWormholeMessengerProgramId",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]},{name:"setGasOracleProgramId",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]},{name:"setPoolFeeShare",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1}],args:[{name:"feeShareBp",type:"u64"}]},{name:"setBalanceRatioMin",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1}],args:[{name:"balanceRatioMinBp",type:"u16"}]},{name:"setPoolAdminFeeShare",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1}],args:[{name:"feeShareBp",type:"u64"}]},{name:"addOtherBridgeToken",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"otherBridgeToken",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"chainId",type:"u8"},{name:"tokenAddress",type:{array:["u8",32]}}]},{name:"removeOtherBridgeToken",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"config",isMut:!0,isSigner:!1},{name:"otherBridgeToken",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"chainId",type:"u8"},{name:"tokenAddress",type:{array:["u8",32]}}]},{name:"withdrawAdminFee",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"adminToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[]},{name:"adjustTotalLpAmount",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1}],args:[]}],accounts:[{name:"chainBridge",type:{kind:"struct",fields:[{name:"address",type:{array:["u8",32]}},{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"}]}},{name:"config",type:{kind:"struct",fields:[{name:"admin",type:"publicKey"},{name:"allbridgeMessengerProgramId",type:"publicKey"},{name:"wormholeMessengerProgramId",type:"publicKey"},{name:"gasOracleProgramId",type:"publicKey"},{name:"rebalancer",type:"publicKey"},{name:"stopAuthority",type:"publicKey"},{name:"authorityBumpSeed",type:"u8"},{name:"canSwap",type:"bool"},{name:"canDeposit",type:"bool"},{name:"canWithdraw",type:"bool"}]}},{name:"lock",type:{kind:"struct",fields:[{name:"sender",type:"publicKey"},{name:"sentTokenAddress",type:"publicKey"},{name:"amount",type:"u64"},{name:"vusdAmount",type:"u64"},{name:"recipient",type:{array:["u8",32]}},{name:"destinationChainId",type:"u8"},{name:"receiveToken",type:{array:["u8",32]}},{name:"nonce",type:{array:["u8",32]}},{name:"messenger",type:{defined:"Messenger"}},{name:"slot",type:"u64"},{name:"fee",type:"u64"}]}},{name:"otherBridgeToken",type:{kind:"struct",fields:[]}},{name:"pool",type:{kind:"struct",fields:[{name:"mint",type:"publicKey"},{name:"a",type:"u64"},{name:"d",type:"u64"},{name:"tokenBalance",type:"u64"},{name:"vUsdBalance",type:"u64"},{name:"reserves",type:"u64"},{name:"decimals",type:"u8"},{name:"totalLpAmount",type:"u64"},{name:"feeShareBp",type:"u64"},{name:"adminFeeShareBp",type:"u64"},{name:"accRewardPerShareP",type:"u128"},{name:"adminFeeAmount",type:"u64"},{name:"balanceRatioMinBp",type:"u16"}]}},{name:"unlock",type:{kind:"struct",fields:[{name:"hash",type:{array:["u8",32]}},{name:"amount",type:"u64"},{name:"fee",type:"u64"},{name:"vUsdAmount",type:"u64"},{name:"slot",type:"u64"}]}},{name:"userDeposit",type:{kind:"struct",fields:[{name:"userAddress",type:"publicKey"},{name:"mint",type:"publicKey"},{name:"lpAmount",type:"u64"},{name:"rewardDebt",type:"u64"}]}}],types:[{name:"RegisterChainBridgeArgs",type:{kind:"struct",fields:[{name:"chainBridgeAddress",type:{array:["u8",32]}},{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"}]}},{name:"UpdateChainBridgeArgs",type:{kind:"struct",fields:[{name:"chainBridgeAddress",type:{array:["u8",32]}},{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"}]}},{name:"InitializeArgs",type:{kind:"struct",fields:[{name:"allbridgeMessengerProgramId",type:"publicKey"},{name:"wormholeMessengerProgramId",type:"publicKey"},{name:"gasOracleProgramId",type:"publicKey"}]}},{name:"InitializePoolArgs",type:{kind:"struct",fields:[{name:"a",type:"u64"},{name:"feeShareBp",type:"u64"},{name:"adminFeeShareBp",type:"u64"},{name:"balanceRatioMinBp",type:"u16"}]}},{name:"BridgeArgs",type:{kind:"struct",fields:[{name:"nonce",type:{array:["u8",32]}},{name:"recipient",type:{array:["u8",32]}},{name:"destinationChainId",type:"u8"},{name:"receiveToken",type:{array:["u8",32]}},{name:"vusdAmount",type:"u64"}]}},{name:"UnlockArgs",type:{kind:"struct",fields:[{name:"nonce",type:{array:["u8",32]}},{name:"amount",type:"u64"},{name:"recipient",type:"publicKey"},{name:"sourceChainId",type:"u8"},{name:"receiveToken",type:"publicKey"},{name:"messenger",type:{defined:"Messenger"}},{name:"hash",type:{array:["u8",32]}},{name:"receiveAmountMin",type:"u64"}]}},{name:"RewardError",type:{kind:"enum",variants:[{name:"FeeTooHigh"}]}},{name:"Messenger",type:{kind:"enum",variants:[{name:"None"},{name:"Allbridge"},{name:"Wormhole"}]}},{name:"ActionType",type:{kind:"enum",variants:[{name:"Deposit"},{name:"Withdraw"},{name:"Swap"}]}}],errors:[{code:6e3,name:"AccountAlreadyInitialized",msg:"This account has already been initialized"},{code:6001,name:"AdminAuthorityInvalid",msg:"This instruction requires admin authority"},{code:6002,name:"InvalidSignature",msg:"Provided signature has wrong signer or message"},{code:6003,name:"InvalidHash",msg:"Wrong unlock message hash"},{code:6004,name:"PoolOverflow",msg:"PoolInfo overflow"},{code:6005,name:"ReservesExhausted",msg:"Reserves exhausted"},{code:6006,name:"ZeroAmount",msg:"Zero amount"},{code:6007,name:"ZeroChanges",msg:"Zero changes"},{code:6008,name:"HighVusdAmount",msg:"vUSD amount is too high"},{code:6009,name:"BalanceRatioExceeded",msg:"Balance ratio exceeded"},{code:6010,name:"InsufficientReceivedAmount",msg:"Received insufficient amount"},{code:6011,name:"ForbiddenAction",msg:"ForbiddenAction"},{code:6012,name:"ValueTooHigh",msg:"Value is too high"}]};var za={version:"0.1.0",name:"cctp_bridge",instructions:[{name:"initialize",accounts:[{name:"payer",isMut:!0,isSigner:!0},{name:"admin",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"rent",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"InitializeArgs"}}]},{name:"bridge",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"messageSentEventData",isMut:!0,isSigner:!0},{name:"lock",isMut:!0,isSigner:!1},{name:"mint",isMut:!0,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1},{name:"cctpMessenger",isMut:!1,isSigner:!1},{name:"messageTransmitterProgram",isMut:!1,isSigner:!1},{name:"messageTransmitterAccount",isMut:!0,isSigner:!1},{name:"tokenMessenger",isMut:!1,isSigner:!1},{name:"tokenMinter",isMut:!1,isSigner:!1},{name:"localToken",isMut:!0,isSigner:!1},{name:"remoteTokenMessengerKey",isMut:!1,isSigner:!1},{name:"authorityPda",isMut:!1,isSigner:!1},{name:"eventAuthority",isMut:!1,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"gasPrice",isMut:!1,isSigner:!1},{name:"thisGasPrice",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"BridgeArgs"}}]},{name:"registerChainBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"cctpBridge",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"RegisterChainBridgeArgs"}}]},{name:"updateChainBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"cctpBridge",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!0,isSigner:!1}],args:[{name:"args",type:{defined:"UpdateChainBridgeArgs"}}]},{name:"setAdminFeeShare",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1}],args:[{name:"feeShareBp",type:"u64"}]},{name:"setGasOracleProgramId",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]},{name:"withdrawGasToken",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"recipient",isMut:!0,isSigner:!1},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1}],args:[{name:"amount",type:"u64"}]},{name:"withdrawAdminFee",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!1,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"adminToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[]},{name:"setCctpTokenMessengerMinter",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]}],accounts:[{name:"cctpBridge",type:{kind:"struct",fields:[{name:"mint",type:"publicKey"},{name:"admin",type:"publicKey"},{name:"cctpTokenMessengerMinter",type:"publicKey"},{name:"gasOracleProgramId",type:"publicKey"},{name:"authorityBumpSeed",type:"u8"},{name:"adminFeeShareBp",type:"u64"},{name:"adminFeeAmount",type:"u64"}]}},{name:"chainBridge",type:{kind:"struct",fields:[{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"},{name:"domain",type:"u32"}]}},{name:"lock",type:{kind:"struct",fields:[{name:"sender",type:"publicKey"},{name:"amount",type:"u64"},{name:"adminFee",type:"u64"},{name:"relayerFee",type:"u64"},{name:"recipient",type:{array:["u8",32]}},{name:"destinationChainId",type:"u8"},{name:"slot",type:"u64"}]}}],types:[{name:"RegisterChainBridgeArgs",type:{kind:"struct",fields:[{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"},{name:"domain",type:"u32"},{name:"mint",type:"publicKey"}]}},{name:"UpdateChainBridgeArgs",type:{kind:"struct",fields:[{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"},{name:"domain",type:"u32"},{name:"mint",type:"publicKey"}]}},{name:"BridgeArgs",type:{kind:"struct",fields:[{name:"recipient",type:{array:["u8",32]}},{name:"destinationChainId",type:"u8"},{name:"receiveToken",type:{array:["u8",32]}},{name:"amount",type:"u64"}]}},{name:"InitializeArgs",type:{kind:"struct",fields:[{name:"gasOracleProgramId",type:"publicKey"},{name:"cctpTokenMessengerMinter",type:"publicKey"}]}}],errors:[{code:6e3,name:"ValueTooHigh",msg:"Value is too high"}]};import{Spl as fr}from"@project-serum/anchor";import Nr from"big.js";import{Web3 as Vn}from"web3";async function Rt(r,i){return await fr.token(i).account.token.fetch(r)}async function xa(r,i,a){let o=await i.account.pool.fetch(a),s=o.decimals,d=Nr(o.feeShareBp.toString()).div(1e4).toFixed(),A={aValue:o.a.toString(),dValue:o.d.toString(),totalLpAmount:o.totalLpAmount.toString(),tokenBalance:o.tokenBalance.toString(),vUsdBalance:o.vUsdBalance.toString(),accRewardPerShareP:o.accRewardPerShareP.toString()};return je(r,{decimals:s,feeShare:d},A)}function Oa(r){let i=r.amount,a="0x"+r.recipient.toString("hex"),o=r.sourceChainId,s=r.destinationChainId,d="0x"+r.receiveToken.toString("hex"),A="0x"+r.nonce.toString("hex"),g=1,c="0x"+r.chainBridge.toString("hex"),l=Vn.utils.encodePacked({t:"uint256",v:i},{t:"bytes32",v:a},{t:"uint256",v:o},{t:"bytes32",v:d},{t:"uint256",v:A},{t:"uint8",v:g});if(!l)throw new I("message cannot be undefined");let u=Vn.utils.keccak256(Buffer.from(l.replace("0x",""),"hex")),m=Buffer.from(u.replace("0x",""),"hex");m[0]=o,m[1]=s;let p=Vn.utils.encodePacked({t:"bytes32",v:"0x"+m.toString("hex")},{t:"bytes32",v:c});if(!p)throw new bt("messageWithSigner cannot be undefined");let b=Vn.utils.keccak256(Buffer.from(p.replace("0x",""),"hex")),W=Buffer.from(b.replace("0x",""),"hex");return W[0]=m[0],W[1]=m[1],W}import{ComputeBudgetInstruction as Ka,ComputeBudgetProgram as Sn,Connection as Ua,TransactionMessage as Tr}from"@solana/web3.js";import{Big as wr}from"big.js";import{AddressLookupTableAccount as Qa}from"@solana/web3.js";async function ct(r,i){return await Promise.all(r.message.addressTableLookups.map(async a=>new Qa({key:a.accountKey,state:Qa.deserialize(await i.getAccountInfo(a.accountKey).then(o=>{if(!o)throw new I("Cannot get AccountInfo");return o.data}))})))}var Ji="AUTO";async function Wt(r,i,a){let o=new Ua(a,"confirmed"),s=(await o.simulateTransaction(r)).value.unitsConsumed;await Ea(r.instructions,s,i,o)}async function Da(r,i,a){let o=new Ua(a,"confirmed"),s=await ct(r,o),d=Tr.decompile(r.message,{addressLookupTableAccounts:s});if(r.serialize().length>1232)throw new Yn;await Ea(d.instructions,769230,i,o),r.message=d.compileToV0Message(s)}async function Ea(r,i,a,o){if(i>0){let s=Xr(i,r);if(a?.solana){let d=a.solana;if(d===Ji)await ki(r,o);else if("pricePerUnitInMicroLamports"in d)await ki(r,o,d.pricePerUnitInMicroLamports);else{let A=wr(d.extraFeeInLamports).div(s).mul(xt(6)).toFixed(0);await ki(r,o,A)}}}}function Xr(r,i){let a=i.findIndex(d=>d.programId.equals(Sn.programId)&&Ka.decodeInstructionType(d)==="SetComputeUnitLimit"),o=Number((r*1.3).toFixed(0)),s=Sn.setComputeUnitLimit({units:o});return a>=0?i[a]=s:i.push(s),o.toString()}async function ki(r,i,a){let o=r.findIndex(A=>A.programId.equals(Sn.programId)&&Ka.decodeInstructionType(A)==="SetComputeUnitPrice"),s=BigInt(a||await Vr(i)),d=Sn.setComputeUnitPrice({microLamports:s});return o>=0?r[o]=d:r.push(d),s.toString()}async function Vr(r){let i=await r.getRecentPrioritizationFees(),a=0;for(let o of i)a+=o.prioritizationFee;return(a/i.length).toFixed(0)}import{NATIVE_MINT as Sr}from"@solana/spl-token";import{Connection as Mr,TransactionMessage as _a,VersionedTransaction as Hr}from"@solana/web3.js";import $a,{AxiosError as qa}from"axios";var Mn=class{connection;jupiterUrl;apiKeyHeader;maxAccounts;constructor(i,a){this.connection=new Mr(i),this.jupiterUrl=a.jupiterUrl.replace(/\/$/,""),this.apiKeyHeader=a.jupiterApiKeyHeader,this.maxAccounts=a.jupiterMaxAccounts}async getJupiterSwapTx(i,a,o,s){let d;try{let m=s?"ExactOut":"ExactIn",p=`${this.jupiterUrl}/quote?inputMint=${a}&outputMint=${Sr.toString()}&amount=${o}&swapMode=${m}&slippageBps=100&onlyDirectRoutes=true`;this.maxAccounts&&(p+=`&maxAccounts=${this.maxAccounts}`),d=await $a.get(p,{headers:this.apiKeyHeader?{"x-api-key":this.apiKeyHeader}:void 0})}catch(m){throw m instanceof qa&&m.response&&m.response.data&&m.response.data.error?new ie(m.response.data.error):new ie("Cannot get route")}let A;if(s&&d?.data?.inAmount)A=d.data.inAmount;else if(s)throw new ie("Cannot get inAmount");let g;try{g=await $a.post(`${this.jupiterUrl}/swap`,{quoteResponse:d.data,userPublicKey:i,wrapAndUnwrapSol:!0},{headers:this.apiKeyHeader?{"x-api-key":this.apiKeyHeader}:void 0})}catch(m){throw m instanceof qa&&m.response&&m.response.data&&m.response.data.error?new ie(m.response.data.error):new ie("Cannot get swap transaction")}let c;if(g?.data?.swapTransaction)c=g.data.swapTransaction;else throw new ie("Cannot get swap transaction");let l=Buffer.from(c,"base64"),u=Hr.deserialize(l);return s?{tx:u,amountIn:A}:{tx:u}}async amendJupiterWithSdkTx(i,a){try{let o=await ct(i,this.connection),s=await ct(a,this.connection),d=_a.decompile(i.message,{addressLookupTableAccounts:o}),A=_a.decompile(a.message,{addressLookupTableAccounts:s});if(A.instructions.shift(),d.instructions.push(...A.instructions),o.push(...s),i.message=d.compileToV0Message(o),a.message.header.numRequiredSignatures===2&&i.signatures.length===1){let g=a.signatures[0];if(!g)throw new I("Signature is undefined");i.signatures.push(g)}return i}catch(o){throw o instanceof Error&&o.message?new ie(`Some error occurred during creation final swap and bridge transaction. ${o.message}`):new ie("Some error occurred during creation final swap and bridge transaction")}}};var xi=1e6,to=1.1,Hn=class extends Ae{constructor(a,o,s){super();this.solanaRpcUrl=a;this.params=o;this.api=s;this.jupiterService=new Mn(a,o.jupiterParams)}chainType="SOLANA";jupiterService;async buildRawTransactionSwap(a){let o=We(this.chainType,a);return await this.buildSwapTransaction(o,a.sourceToken.poolAddress,a.destinationToken.poolAddress,a.txFeeParams)}async buildSwapTransaction(a,o,s,d){let{fromAccountAddress:A,amount:g,contractAddress:c,fromTokenAddress:l,toTokenAddress:u,toAccountAddress:m,minimumReceiveAmount:p}=a,b=A,W=c,y=l,Y=u,B=s,h=m,Z=new Q(b),w=et(this.solanaRpcUrl,Z.toString()),O=new zi(_t,W,w),P=await vt(O.programId),pe=await qe(O.programId),_=new Q(y),Me=await Yt(_,O.programId),He=new Q(o),Oe=await we(Z,_),Ge=new Q(h),ue=new Q(Y),ve=await Yt(ue,O.programId),Fe=new Q(B),Ce=await we(Ge,ue),Le=[tt.ComputeBudgetProgram.setComputeUnitLimit({units:xi})];try{await Rt(Ce,w)}catch{let Uo=await Lr.associatedToken(w).methods.create().accounts({mint:ue,owner:Ge,associatedAccount:Ce}).instruction();Le.push(Uo)}let Pe=await O.methods.swap(new Bt(g),new Bt(p||0)).accounts({payer:Z,config:pe,bridgeAuthority:P,user:Z,sendBridgeToken:Me,sendMint:_,sendPool:He,sendUserToken:Oe,receiveBridgeToken:ve,receiveMint:ue,receivePool:Fe,receiveUserToken:Ce}).preInstructions(Le).transaction(),fe=w.connection;return Pe.recentBlockhash=(await fe.getLatestBlockhash()).blockhash,Pe.feePayer=Z,await Wt(Pe,d,this.solanaRpcUrl),await this.convertToVersionedTransaction(Pe,fe)}async buildRawTransactionSend(a){let o=await he(this.chainType,a,this.api),s=this.addPoolAddress(a,o),d=s.gasFeePaymentMethod=="stablecoin",A;if(d)try{let{tx:l,solTxSendUpdatedParams:u}=await this.processJup(s,a,!0);A=l,s={...s,...u}}catch{try{let{tx:u,solTxSendUpdatedParams:m}=await this.processJup(s,a,!1);A=u,s={...s,...m}}catch(u){throw u instanceof K?u:u instanceof Error&&u.message?new ie(`Some error occurred during creation Jupiter swap transaction. ${u.message}`):new ie("Some error occurred during creation Jupiter swap transaction")}}let g,c;switch(o.messenger){case 1:{let l=await this.prepareSwapAndBridgeData(s);g=await this.buildSwapAndBridgeAllbridgeTransaction(l);break}case 2:{let l=await this.prepareSwapAndBridgeData(s),{transaction:u,messageAccount:m}=await this.buildSwapAndBridgeWormholeTransaction(l);g=u,c=m;break}case 3:case 4:{let l=await this.prepareSwapAndBridgeCctpData(s),{transaction:u,messageSentEventDataKeypair:m}=await this.buildSwapAndBridgeCctpTransaction(a.destinationToken.chainSymbol,l);g=u,c=m;break}case 5:throw new de("Messenger OFT is not supported yet.")}if(d){if(!A)throw new ie("Swap tx is absent");g=await this.jupiterService.amendJupiterWithSdkTx(A,g)}return await Da(g,a.txFeeParams,this.solanaRpcUrl),c&&g.sign([c]),g}async processJup(a,o,s){let{fee:d,extraGas:A,gasFeePaymentMethod:g}=await this.convertStableCoinFeeAndExtraGasToNativeCurrency(o.sourceToken,a),c=s?Xe(d):Xe(a.fee);A&&(c=c.plus(A)),s||(c=c.mul(to));let{tx:l,amountIn:u}=await this.jupiterService.getJupiterSwapTx(o.fromAccountAddress,o.sourceToken.tokenAddress,c.toFixed(0),s),m;if(s){if(!u)throw new ie("Cannot get inAmount");m=Xe(a.amount).minus(Xe(u).mul(to)).toFixed(0)}else m=Xe(a.amount).minus(c).toFixed(0);if(Xe(m).lte(0))throw new It(`Amount not enough to pay fee, ${F(Xe(m).minus(1).neg(),o.sourceToken.decimals).toFixed()} stables is missing`);return{tx:l,solTxSendUpdatedParams:{amount:m,fee:d,extraGas:A,gasFeePaymentMethod:g}}}addPoolAddress(a,o){return{...o,poolAddress:a.sourceToken.poolAddress}}async convertStableCoinFeeAndExtraGasToNativeCurrency(a,o){if(o.gasFeePaymentMethod=="stablecoin"){let s=(await this.api.getReceiveTransactionCost({sourceChainId:o.fromChainId,destinationChainId:o.toChainId,messenger:o.messenger,sourceToken:a.tokenAddress})).sourceNativeTokenPrice,d=Xe(o.fee).div(s).mul(Xe(10).pow(X.getChainDecimalsByType("SOLANA")-a.decimals)).toFixed(0),A;return o.extraGas&&(A=Xe(o.extraGas).div(s).mul(Xe(10).pow(X.getChainDecimalsByType("SOLANA")-a.decimals)).toFixed(0)),{fee:d,extraGas:A,gasFeePaymentMethod:"native"}}return{fee:o.fee,extraGas:o.extraGas,gasFeePaymentMethod:"native"}}getExtraGasInstruction(a,o,s){return tt.SystemProgram.transfer({fromPubkey:o,toPubkey:s,lamports:+a})}async prepareSwapAndBridgeData(a){let{amount:o,contractAddress:s,fromChainId:d,fromAccountAddress:A,fromTokenAddress:g,toChainId:c,toAccountAddress:l,toTokenAddress:u,poolAddress:m,extraGas:p}=a,b=g,W=A,y=c,Y=u,B=l,h=s,Z=d,w=et(this.solanaRpcUrl,W),O=new zi(_t,h,w),P=Array.from(ht()),pe=new Q(m),_=await xa(o,O,pe),Me=await Va(P,O.programId),He=await vt(O.programId),Oe=await we(new Q(W),new Q(b)),Ge=await Yt(new Q(b),O.programId),ue=await Li(y,O.programId),ve=await Ma(y,Buffer.from(Y),O.programId),Fe=await qe(O.programId),Ce=await O.account.config.fetch(Fe),Le=await Ut(y,Ce.gasOracleProgramId),Pe=await Ut(Z,Ce.gasOracleProgramId),fe=Oa({amount:_,recipient:Buffer.from(B),nonce:Buffer.from(P),receiveToken:Buffer.from(Y),destinationChainId:y,sourceChainId:Z,chainBridge:(await vt(O.programId)).toBuffer()}),J={};return J.bridge=O,J.amount=new Bt(o),J.vusdAmount=new Bt(_),J.nonce=P,J.recipient=Array.from(B),J.receiveToken=Array.from(Y),J.poolAccount=pe,J.lockAccount=Me,J.bridgeAuthority=He,J.userToken=Oe,J.bridgeTokenAccount=Ge,J.chainBridgeAccount=ue,J.otherBridgeTokenAccount=ve,J.userAccount=new Q(W),J.destinationChainId=y,J.mint=new Q(b),J.config=Fe,J.configAccountInfo=Ce,J.gasPrice=Le,J.thisGasPrice=Pe,J.message=fe,p&&(J.extraGasInstruction=this.getExtraGasInstruction(p,J.userAccount,Fe)),J}async buildSwapAndBridgeAllbridgeTransaction(a){let{bridge:o,vusdAmount:s,nonce:d,recipient:A,receiveToken:g,poolAccount:c,lockAccount:l,bridgeAuthority:u,userToken:m,bridgeTokenAccount:p,chainBridgeAccount:b,otherBridgeTokenAccount:W,userAccount:y,destinationChainId:Y,mint:B,config:h,configAccountInfo:Z,gasPrice:w,thisGasPrice:O,message:P,extraGasInstruction:pe}=a,_=Z.allbridgeMessengerProgramId,Me=await Pi(Y,_),He=await qe(_),Oe=await Ha(P,_),Ge=[];pe&&Ge.push(pe);let ue=await o.methods.swapAndBridge({vusdAmount:s,nonce:d,destinationChainId:Y,recipient:A,receiveToken:g}).accounts({mint:B,user:y,config:h,lock:l,pool:c,gasPrice:w,thisGasPrice:O,bridgeAuthority:u,userToken:m,bridgeToken:p,chainBridge:b,messenger:_,messengerGasUsage:Me,messengerConfig:He,sentMessageAccount:Oe,otherBridgeToken:W}).preInstructions([tt.ComputeBudgetProgram.setComputeUnitLimit({units:xi})]).postInstructions(Ge).transaction(),ve=et(this.solanaRpcUrl,y.toString()).connection;return ue.recentBlockhash=(await ve.getLatestBlockhash()).blockhash,ue.feePayer=y,await this.convertToVersionedTransaction(ue,ve)}async convertToVersionedTransaction(a,o){let s=await o.getAddressLookupTable(new Q(this.params.solanaLookUpTable)).then(A=>A.value);if(!s)throw new I("Cannot find allbridgeLookupTableAccount");let d=new tt.TransactionMessage({payerKey:a.feePayer,recentBlockhash:a.recentBlockhash,instructions:a.instructions}).compileToV0Message([s]);return new tt.VersionedTransaction(d)}async buildSwapAndBridgeWormholeTransaction(a){let{bridge:o,vusdAmount:s,nonce:d,recipient:A,receiveToken:g,poolAccount:c,lockAccount:l,bridgeAuthority:u,userToken:m,bridgeTokenAccount:p,chainBridgeAccount:b,otherBridgeTokenAccount:W,userAccount:y,destinationChainId:Y,mint:B,config:h,configAccountInfo:Z,gasPrice:w,thisGasPrice:O,message:P,extraGasInstruction:pe}=a,_=this.params.wormholeMessengerProgramId,[Me]=Q.findProgramAddressSync([Buffer.from("Bridge")],new Q(_)),[He]=Q.findProgramAddressSync([Buffer.from("fee_collector")],new Q(_)),[Oe]=Q.findProgramAddressSync([Buffer.from("Sequence"),u.toBuffer()],new Q(_)),Ge=await Pi(Y,Z.wormholeMessengerProgramId),ue=await qe(Z.wormholeMessengerProgramId),ve=eo.generate(),Fe=et(this.solanaRpcUrl,y.toString()),Ce=await Fe.connection.getAccountInfo(Me);if(Ce==null)throw new I("Cannot fetch wormhole bridge account info");let Le=new Bt(Ce.data.slice(16,24),"le").toString(),Pe=Pr.transfer({fromPubkey:y,toPubkey:He,lamports:+Le}),fe=[];pe&&fe.push(pe);let J={mint:B,user:y,config:h,lock:l,pool:c,gasPrice:w,thisGasPrice:O,bridgeAuthority:u,userToken:m,bridgeToken:p,chainBridge:b,otherBridgeToken:W,messengerGasUsage:Ge,wormholeProgram:_,bridge:Me,message:ve.publicKey,wormholeMessenger:Z.wormholeMessengerProgramId,sequence:Oe,feeCollector:He,wormholeMessengerConfig:ue,clock:tt.SYSVAR_CLOCK_PUBKEY},pn=await o.methods.swapAndBridgeWormhole({vusdAmount:s,nonce:d,destinationChainId:Y,recipient:A,receiveToken:g}).accounts(J).preInstructions([tt.ComputeBudgetProgram.setComputeUnitLimit({units:xi}),Pe]).postInstructions(fe).signers([ve]).transaction();return pn.recentBlockhash=(await Fe.connection.getLatestBlockhash()).blockhash,pn.feePayer=y,{transaction:await this.convertToVersionedTransaction(pn,Fe.connection),messageAccount:ve}}async prepareSwapAndBridgeCctpData(a){let{contractAddress:o,amount:s,fromAccountAddress:d,fromTokenAddress:A,toChainId:g,toAccountAddress:c,toTokenAddress:l,extraGas:u}=a,m=o;if(!m)throw new se("Such route does not support CCTP protocol");let p=4,b=d,W=l,y=c,Y=et(this.solanaRpcUrl,b),B=new zi(za,m,Y),h=new Q(A),Z=await La(h,B.programId),w=new Q(b),O=await B.account.cctpBridge.fetch(Z),P={};return P.cctpBridge=B,P.cctpBridgeAccount=Z,P.cctpAddressAccount=new Q(m),P.amount=new Bt(s),P.recipient=Array.from(y),P.receiveToken=Array.from(W),P.userToken=await we(w,h),P.bridgeAuthority=await Sa(Z,B.programId),P.bridgeTokenAccount=await Pa(h,B.programId),P.chainBridgeAccount=await Li(g,B.programId),P.userAccount=w,P.destinationChainId=g,P.mint=h,P.gasPrice=await Ut(g,O.gasOracleProgramId),P.thisGasPrice=await Ut(p,O.gasOracleProgramId),P.provider=Y,u&&(P.extraGasInstruction=this.getExtraGasInstruction(u,P.userAccount,Z)),P}async buildSwapAndBridgeCctpTransaction(a,o){let{cctpBridge:s,cctpBridgeAccount:d,amount:A,recipient:g,receiveToken:c,bridgeAuthority:l,userToken:u,bridgeTokenAccount:m,chainBridgeAccount:p,userAccount:b,destinationChainId:W,mint:y,gasPrice:Y,thisGasPrice:B,extraGasInstruction:h,provider:Z}=o,w=this.params.cctpParams.cctpDomains[a],O=this.params.cctpParams.cctpTransmitterProgramId,P=this.params.cctpParams.cctpTokenMessengerMinter;if(w==null||!O||!P)throw new I("CCTP is not configured");let pe=new Q(O),_=new Q(P),{messageTransmitterAccount:Me,tokenMessenger:He,tokenMessengerEventAuthority:Oe,tokenMinter:Ge,localToken:ue,remoteTokenMessengerKey:ve,authorityPda:Fe}=Ja(w,y,pe,_),Ce=[];h&&Ce.push(h);let Le=eo.generate(),Pe=ja(s.programId,Le.publicKey),fe=await s.methods.bridge({amount:A,destinationChainId:W,recipient:g,receiveToken:c}).accounts({mint:y,user:b,cctpBridge:d,messageSentEventData:Le.publicKey,lock:Pe,cctpMessenger:_,messageTransmitterProgram:pe,messageTransmitterAccount:Me,tokenMessenger:He,tokenMinter:Ge,localToken:ue,remoteTokenMessengerKey:ve,authorityPda:Fe,eventAuthority:Oe,bridgeToken:m,gasPrice:Y,thisGasPrice:B,chainBridge:p,userToken:u,bridgeAuthority:l}).preInstructions([tt.ComputeBudgetProgram.setComputeUnitLimit({units:2e6})]).postInstructions(Ce).transaction(),J=Z.connection;return fe.recentBlockhash=(await J.getLatestBlockhash()).blockhash,fe.feePayer=b,{transaction:await this.convertToVersionedTransaction(fe,J),messageSentEventDataKeypair:Le}}send(a){throw new k}};import{Address as Oi,contract as BW}from"@stellar/stellar-sdk";import{Big as kr}from"big.js";import{contract as n}from"@stellar/stellar-sdk";var jr=n.Spec,Jr=n.Client;var $t=class extends Jr{constructor(a){super(new jr(["AAAAAAAAAAAAAAAKaW5pdGlhbGl6ZQAAAAAABAAAAAAAAAAFYWRtaW4AAAAAAAATAAAAAAAAAAltZXNzZW5nZXIAAAAAAAATAAAAAAAAAApnYXNfb3JhY2xlAAAAAAATAAAAAAAAAAxuYXRpdmVfdG9rZW4AAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAPc3dhcF9hbmRfYnJpZGdlAAAAAAkAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAFdG9rZW4AAAAAAAATAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAACXJlY2lwaWVudAAAAAAAA+4AAAAgAAAAAAAAABRkZXN0aW5hdGlvbl9jaGFpbl9pZAAAAAQAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAFbm9uY2UAAAAAAAAMAAAAAAAAAApnYXNfYW1vdW50AAAAAAAKAAAAAAAAABBmZWVfdG9rZW5fYW1vdW50AAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAOcmVjZWl2ZV90b2tlbnMAAAAAAAgAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAlyZWNpcGllbnQAAAAAAAATAAAAAAAAAA9zb3VyY2VfY2hhaW5faWQAAAAABAAAAAAAAAANcmVjZWl2ZV90b2tlbgAAAAAAA+4AAAAgAAAAAAAAAAVub25jZQAAAAAAAAwAAAAAAAAAEnJlY2VpdmVfYW1vdW50X21pbgAAAAAACgAAAAAAAAAJZXh0cmFfZ2FzAAAAAAAD6AAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAAEc3dhcAAAAAYAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAV0b2tlbgAAAAAAA+4AAAAgAAAAAAAAAA1yZWNlaXZlX3Rva2VuAAAAAAAD7gAAACAAAAAAAAAACXJlY2lwaWVudAAAAAAAABMAAAAAAAAAEnJlY2VpdmVfYW1vdW50X21pbgAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAJc3RvcF9zd2FwAAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAKc3RhcnRfc3dhcAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAOc2V0X2dhc19vcmFjbGUAAAAAAAEAAAAAAAAAC25ld19hZGRyZXNzAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAASc2V0X3N0b3BfYXV0aG9yaXR5AAAAAAABAAAAAAAAAA5zdG9wX2F1dGhvcml0eQAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAOc2V0X3JlYmFsYW5jZXIAAAAAAAEAAAAAAAAACnJlYmFsYW5jZXIAAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAANc2V0X21lc3NlbmdlcgAAAAAAAAEAAAAAAAAACW1lc3NlbmdlcgAAAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAANc2V0X2dhc191c2FnZQAAAAAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAAJZ2FzX3VzYWdlAAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAPcmVnaXN0ZXJfYnJpZGdlAAAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAAOYnJpZGdlX2FkZHJlc3MAAAAAA+4AAAAgAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAQYWRkX2JyaWRnZV90b2tlbgAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAANdG9rZW5fYWRkcmVzcwAAAAAAA+4AAAAgAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAATcmVtb3ZlX2JyaWRnZV90b2tlbgAAAAACAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAPuAAAAIAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAIYWRkX3Bvb2wAAAACAAAAAAAAAARwb29sAAAAEwAAAAAAAAAFdG9rZW4AAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAATd2l0aGRyYXdfZ2FzX3Rva2VucwAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABmFtb3VudAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAfd2l0aGRyYXdfYnJpZGdpbmdfZmVlX2luX3Rva2VucwAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAVaGFzX3Byb2Nlc3NlZF9tZXNzYWdlAAAAAAAAAQAAAAAAAAAHbWVzc2FnZQAAAAPuAAAAIAAAAAEAAAPpAAAAAQAAAAM=","AAAAAAAAAAAAAAAUaGFzX3JlY2VpdmVkX21lc3NhZ2UAAAABAAAAAAAAAAdtZXNzYWdlAAAAA+4AAAAgAAAAAQAAA+kAAAABAAAAAw==","AAAAAAAAAAAAAAAQZ2V0X3Bvb2xfYWRkcmVzcwAAAAEAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAPuAAAAIAAAAAEAAAPpAAAAEwAAAAM=","AAAAAAAAAAAAAAAKZ2V0X2NvbmZpZwAAAAAAAAAAAAEAAAPpAAAH0AAAAAZCcmlkZ2UAAAAAAAM=","AAAAAAAAAAAAAAASZ2V0X3N0b3BfYXV0aG9yaXR5AAAAAAAAAAAAAQAAA+kAAAATAAAAAw==","AAAAAAAAAAAAAAAUZ2V0X3RyYW5zYWN0aW9uX2Nvc3QAAAABAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAABAAAD6QAAAAoAAAAD","AAAAAAAAAAAAAAANZ2V0X2dhc191c2FnZQAAAAAAAAEAAAAAAAAACGNoYWluX2lkAAAABAAAAAEAAAPpAAAACgAAAAM=","AAAAAAAAAAAAAAAJZ2V0X2FkbWluAAAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=","AAAAAAAAAAAAAAAOZ2V0X2dhc19vcmFjbGUAAAAAAAAAAAABAAAD6QAAABMAAAAD","AAAAAAAAAAAAAAASZ2V0X2Fub3RoZXJfYnJpZGdlAAAAAAABAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAABAAAD6QAAB9AAAAANQW5vdGhlckJyaWRnZQAAAAAAAAM=","AAAAAAAAAAAAAAAJc2V0X2FkbWluAAAAAAAAAQAAAAAAAAAJbmV3X2FkbWluAAAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAHdXBncmFkZQAAAAABAAAAAAAAAA1uZXdfd2FzbV9oYXNoAAAAAAAD7gAAACAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAQAAAAAAAAAAAAAAB1N3YXBwZWQAAAAABgAAAAAAAAAOcmVjZWl2ZV9hbW91bnQAAAAAAAoAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAJcmVjaXBpZW50AAAAAAAAEwAAAAAAAAALc2VuZF9hbW91bnQAAAAACgAAAAAAAAAKc2VuZF90b2tlbgAAAAAD7gAAACAAAAAAAAAABnNlbmRlcgAAAAAAEw==","AAAAAQAAAAAAAAAAAAAAClRva2Vuc1NlbnQAAAAAAAUAAAAAAAAABmFtb3VudAAAAAAACgAAAAAAAAAUZGVzdGluYXRpb25fY2hhaW5faWQAAAAEAAAAAAAAAAVub25jZQAAAAAAAAwAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAJcmVjaXBpZW50AAAAAAAD7gAAACA=","AAAAAQAAAAAAAAAAAAAADlRva2Vuc1JlY2VpdmVkAAAAAAAEAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAB21lc3NhZ2UAAAAD7gAAACAAAAAAAAAABW5vbmNlAAAAAAAADAAAAAAAAAAJcmVjaXBpZW50AAAAAAAD7gAAACA=","AAAAAQAAAAAAAAAAAAAAClJlY2VpdmVGZWUAAAAAAAMAAAAAAAAAF2JyaWRnZV90cmFuc2FjdGlvbl9jb3N0AAAAAAoAAAAAAAAACWV4dHJhX2dhcwAAAAAAAAoAAAAAAAAAGG1lc3NhZ2VfdHJhbnNhY3Rpb25fY29zdAAAAAo=","AAAAAQAAAAAAAAAAAAAAFUJyaWRnaW5nRmVlRnJvbVRva2VucwAAAAAAAAIAAAAAAAAAEGZlZV90b2tlbl9hbW91bnQAAAAKAAAAAAAAAANnYXMAAAAACg==","AAAAAQAAAAAAAAAAAAAADUFub3RoZXJCcmlkZ2UAAAAAAAACAAAAAAAAAAdhZGRyZXNzAAAAA+4AAAAgAAAAAAAAAAZ0b2tlbnMAAAAAA+wAAAPuAAAAIAAAAAE=","AAAAAQAAAAAAAAAAAAAABkJyaWRnZQAAAAAABgAAAGBwcmVjb21wdXRlZCB2YWx1ZXMgb2YgdGhlIHNjYWxpbmcgZmFjdG9yIHJlcXVpcmVkIGZvciBwYXlpbmcgdGhlIGJyaWRnaW5nIGZlZSB3aXRoIHN0YWJsZSB0b2tlbnMAAAAeYnJpZGdpbmdfZmVlX2NvbnZlcnNpb25fZmFjdG9yAAAAAAPsAAAAEwAAAAoAAAAAAAAACGNhbl9zd2FwAAAAAQAAAGxwcmVjb21wdXRlZCB2YWx1ZXMgdG8gZGl2aWRlIGJ5IHRvIGNoYW5nZSB0aGUgcHJlY2lzaW9uIGZyb20gdGhlIEdhcyBPcmFjbGUgcHJlY2lzaW9uIHRvIHRoZSB0b2tlbiBwcmVjaXNpb24AAAAWZnJvbV9nYXNfb3JhY2xlX2ZhY3RvcgAAAAAD7AAAABMAAAAKAAAAAAAAAAltZXNzZW5nZXIAAAAAAAATAAAAAAAAAAVwb29scwAAAAAAA+wAAAPuAAAAIAAAABMAAAAAAAAACnJlYmFsYW5jZXIAAAAAABM=","AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAwAAAAEAAAAAAAAAC090aGVyQnJpZGdlAAAAAAEAAAAEAAAAAQAAAAAAAAALU2VudE1lc3NhZ2UAAAAAAQAAA+4AAAAgAAAAAQAAAAAAAAAPUmVjZWl2ZWRNZXNzYWdlAAAAAAEAAAPuAAAAIA==","AAAAAQAAAAAAAAAAAAAABUFkbWluAAAAAAAAAQAAAAAAAAABMAAAAAAAABM=","AAAAAQAAAAAAAAAAAAAAEEdhc09yYWNsZUFkZHJlc3MAAAABAAAAAAAAAAEwAAAAAAAAEw==","AAAAAQAAAAAAAAAAAAAACEdhc1VzYWdlAAAAAQAAAAAAAAABMAAAAAAAA+wAAAAEAAAACg==","AAAAAQAAAAAAAAAAAAAAC05hdGl2ZVRva2VuAAAAAAEAAAAAAAAAATAAAAAAAAAT","AAAAAQAAAAAAAAAAAAAADVN0b3BBdXRob3JpdHkAAAAAAAABAAAAAAAAAAEwAAAAAAAAEw==","AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAKAAAAAAAAAANVW5pbXBsZW1lbnRlZAAAAAAAAAAAAAAAAAAAC0luaXRpYWxpemVkAAAAAAEAAAAAAAAADVVuaW5pdGlhbGl6ZWQAAAAAAAACAAAAAAAAAAxVbmF1dGhvcml6ZWQAAAADAAAAAAAAAApJbnZhbGlkQXJnAAAAAAAEAAAAAAAAAA5JbnZhbGlkQ2hhaW5JZAAAAAAABQAAAAAAAAATSW52YWxpZE90aGVyQ2hhaW5JZAAAAAAGAAAAAAAAAA5HYXNVc2FnZU5vdFNldAAAAAAABwAAAAAAAAANQnJva2VuQWRkcmVzcwAAAAAAAAgAAAAAAAAACE5vdEZvdW5kAAAACQAAAAAAAAAYVG9rZW5JbnN1ZmZpY2llbnRCYWxhbmNlAAAACgAAAAAAAAAKQ2FzdEZhaWxlZAAAAAAACwAAAAAAAAAMVTI1Nk92ZXJmbG93AAAADAAAAAAAAAAKWmVyb0Ftb3VudAAAAAAAZwAAAAAAAAAMUG9vbE92ZXJmbG93AAAAaAAAAAAAAAALWmVyb0NoYW5nZXMAAAAAaQAAAAAAAAARUmVzZXJ2ZXNFeGhhdXN0ZWQAAAAAAABqAAAAAAAAABpJbnN1ZmZpY2llbnRSZWNlaXZlZEFtb3VudAAAAAAAawAAAAAAAAAUQmFsYW5jZVJhdGlvRXhjZWVkZWQAAABsAAAAAAAAAAlGb3JiaWRkZW4AAAAAAABtAAAAAAAAABlVbmF1dGhvcml6ZWRTdG9wQXV0aG9yaXR5AAAAAAAAywAAAAAAAAAOU3dhcFByb2hpYml0ZWQAAAAAAMwAAAAAAAAAEkFtb3VudFRvb0xvd0ZvckZlZQAAAAAAzQAAAAAAAAAWQnJpZGdlVG9UaGVaZXJvQWRkcmVzcwAAAAAAzgAAAAAAAAAORW1wdHlSZWNpcGllbnQAAAAAAM8AAAAAAAAAE1NvdXJjZU5vdFJlZ2lzdGVyZWQAAAAA0AAAAAAAAAAVV3JvbmdEZXN0aW5hdGlvbkNoYWluAAAAAAAA0QAAAAAAAAATVW5rbm93bkFub3RoZXJDaGFpbgAAAADSAAAAAAAAABFUb2tlbnNBbHJlYWR5U2VudAAAAAAAANMAAAAAAAAAEE1lc3NhZ2VQcm9jZXNzZWQAAADUAAAAAAAAAAxOb3RFbm91Z2hGZWUAAADWAAAAAAAAAAlOb01lc3NhZ2UAAAAAAADXAAAAAAAAAA1Ob1JlY2VpdmVQb29sAAAAAAAA2AAAAAAAAAAGTm9Qb29sAAAAAADZAAAAAAAAABNVbmtub3duQW5vdGhlclRva2VuAAAAANoAAAAAAAAAD1dyb25nQnl0ZUxlbmd0aAAAAAEsAAAAAAAAAApIYXNNZXNzYWdlAAAAAAEtAAAAAAAAABdJbnZhbGlkUHJpbWFyeVNpZ25hdHVyZQAAAAEuAAAAAAAAABlJbnZhbGlkU2Vjb25kYXJ5U2lnbmF0dXJlAAAAAAABLwAAAAAAAAARTm9HYXNEYXRhRm9yQ2hhaW4AAAAAAAGQ"]),a);this.options=a}fromJSON={initialize:this.txFromJSON,swap_and_bridge:this.txFromJSON,receive_tokens:this.txFromJSON,swap:this.txFromJSON,stop_swap:this.txFromJSON,start_swap:this.txFromJSON,set_gas_oracle:this.txFromJSON,set_stop_authority:this.txFromJSON,set_rebalancer:this.txFromJSON,set_messenger:this.txFromJSON,set_gas_usage:this.txFromJSON,register_bridge:this.txFromJSON,add_bridge_token:this.txFromJSON,remove_bridge_token:this.txFromJSON,add_pool:this.txFromJSON,withdraw_gas_tokens:this.txFromJSON,withdraw_bridging_fee_in_tokens:this.txFromJSON,has_processed_message:this.txFromJSON,has_received_message:this.txFromJSON,get_pool_address:this.txFromJSON,get_config:this.txFromJSON,get_stop_authority:this.txFromJSON,get_transaction_cost:this.txFromJSON,get_gas_usage:this.txFromJSON,get_admin:this.txFromJSON,get_gas_oracle:this.txFromJSON,get_another_bridge:this.txFromJSON,set_admin:this.txFromJSON,upgrade:this.txFromJSON}};var Ln=class extends Ae{constructor(a,o,s){super();this.nodeRpcUrlsConfig=a;this.params=o;this.api=s}chainType="SRB";async buildRawTransactionSend(a){let o=await he(this.chainType,a,this.api);return await this.buildRawTransactionSendFromParams(o)}async buildRawTransactionSendFromParams(a){let{amount:o,contractAddress:s,fromAccountAddress:d,fromTokenAddress:A,toChainId:g,toAccountAddress:c,toTokenAddress:l,fee:u,gasFeePaymentMethod:m,extraGas:p}=a,b=u;p&&(b=kr(b).plus(p).toFixed());let W=this.getContract($t,s,d),y;return m==="stablecoin"?y=await W.swap_and_bridge({sender:d,token:Oi.contract(Buffer.from(A)).toString(),amount:BigInt(o),recipient:Buffer.from(c),destination_chain_id:+g,receive_token:Buffer.from(l),nonce:ke(),gas_amount:BigInt(0),fee_token_amount:BigInt(b)}):y=await W.swap_and_bridge({sender:d,token:Oi.contract(Buffer.from(A)).toString(),amount:BigInt(o),recipient:Buffer.from(c),destination_chain_id:+g,receive_token:Buffer.from(l),nonce:ke(),gas_amount:BigInt(b),fee_token_amount:BigInt(0)}),y.toXDR()}async buildRawTransactionSwap(a){let o=We(this.chainType,a);return await this.buildRawTransactionSwapFromParams(o)}async buildRawTransactionSwapFromParams(a){let{amount:o,contractAddress:s,fromAccountAddress:d,fromTokenAddress:A,toAccountAddress:g,toTokenAddress:c,minimumReceiveAmount:l}=a;return(await this.getContract($t,s,d).swap({sender:d,amount:BigInt(o),token:Oi.contract(Buffer.from(A)).toBuffer(),receive_token:Buffer.from(c),recipient:g,receive_amount_min:BigInt(l)})).toXDR()}send(a){throw new k}getContract(a,o,s){let d={publicKey:s,contractId:o,networkPassphrase:this.params.sorobanNetworkPassphrase,rpcUrl:this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")};return new a(d)}};import{SuiClient as ts}from"@mysten/sui/client";import{coinWithBalance as D,Transaction as ia}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as Io}from"@mysten/sui/utils";import{Big as aa}from"big.js";var oa=Ne(nt());var De=Ne(nt());ne();function ao(r,i,a){return r.moveCall({target:`${De.PUBLISHED_AT}::bridge_interface::swap`,typeArguments:i,arguments:[N(r,a.bridge),N(r,a.coin),Be(r,a.receiveAmountMin,"u64")]})}function oo(r,i,a){return r.moveCall({target:`${De.PUBLISHED_AT}::bridge_interface::deposit`,typeArguments:[i],arguments:[N(r,a.bridge),N(r,a.userDeposit),N(r,a.coin)]})}function ro(r,i,a){return r.moveCall({target:`${De.PUBLISHED_AT}::bridge_interface::withdraw`,typeArguments:[i],arguments:[N(r,a.bridge),N(r,a.userDeposit),Be(r,a.amountLp,"u64")]})}function so(r,i,a){return r.moveCall({target:`${De.PUBLISHED_AT}::bridge_interface::claim_reward`,typeArguments:[i],arguments:[N(r,a.bridge),N(r,a.userDeposit)]})}function Ao(r,i,a){return r.moveCall({target:`${De.PUBLISHED_AT}::bridge_interface::pool`,typeArguments:[i],arguments:[N(r,a)]})}function Ki(r,i,a){return r.moveCall({target:`${De.PUBLISHED_AT}::bridge_interface::swap_and_bridge_wormhole`,typeArguments:[i],arguments:[N(r,a.bridge),N(r,a.messenger),N(r,a.wormholeState),N(r,a.theClock),N(r,a.gasOracle),N(r,a.amount),N(r,a.recipient),Be(r,a.destinationChainId,"u8"),N(r,a.receiveToken),Be(r,a.nonce,"u256"),N(r,a.feeSuiCoin),N(r,a.feeTokenCoin)]})}function go(r,i){return r.moveCall({target:`${De.PUBLISHED_AT}::bridge_interface::new_user_deposit`,typeArguments:[i],arguments:[]})}function Ui(r,i,a){return r.moveCall({target:`${De.PUBLISHED_AT}::bridge_interface::swap_and_bridge`,typeArguments:[i],arguments:[N(r,a.bridge),N(r,a.messenger),N(r,a.gasOracle),N(r,a.amount),N(r,a.recipient),Be(r,a.destinationChainId,"u8"),N(r,a.receiveToken),Be(r,a.nonce,"u256"),N(r,a.feeSuiCoin),N(r,a.feeTokenCoin)]})}var bo=Ne(Ei());var lo=Ne(Ei());ne();function _i(r,i,a){return r.moveCall({target:`${lo.PUBLISHED_AT}::cctp_bridge_interface::bridge`,typeArguments:[i],arguments:[N(r,a.cctpBridge),N(r,a.gasOracle),N(r,a.tokenMessengerMinterState),N(r,a.messageTransmitterState),N(r,a.treasury),N(r,a.denyList),N(r,a.amount),N(r,a.feeSuiCoin),N(r,a.feeTokenCoin),Be(r,a.destinationChainId,"u8"),N(r,a.recipient),N(r,a.recipientWalletAddress)]})}var yo=Ne(qi());var Co=Ne(qi());ne();import{bcs as it}from"@mysten/sui/bcs";import{fromHEX as Dr,toHEX as Er}from"@mysten/sui/utils";import{bcs as Ur}from"@mysten/sui/bcs";ne();var ea=class r{__VectorClass=!0;static $typeName="vector";static $numTypeParams=1;static $isPhantom=[!1];$typeName="vector";$fullTypeName;$typeArgs;$isPhantom=[!1];elements;constructor(i,a){this.$fullTypeName=j(this.$typeName,...i),this.$typeArgs=i,this.elements=a}static reified(i){return{typeName:r.$typeName,fullTypeName:j(r.$typeName,T(i)),typeArgs:[T(i)],isPhantom:r.$isPhantom,reifiedTypeArgs:[i],fromFields:a=>r.fromFields(i,a),fromFieldsWithTypes:a=>r.fromFieldsWithTypes(i,a),fromBcs:a=>r.fromBcs(i,a),bcs:r.bcs(qt(i)),fromJSONField:a=>r.fromJSONField(i,a),fromJSON:a=>r.fromJSON(i,a),new:a=>new r([T(i)],a),kind:"VectorClassReified"}}static get r(){return r.reified}static get bcs(){return Ur.vector}static fromFields(i,a){return r.reified(i).new(a.map(o=>L(i,o)))}static fromFieldsWithTypes(i,a){return r.reified(i).new(a.map(o=>S(i,o)))}static fromBcs(i,a){return r.fromFields(i,r.bcs(qt(i)).parse(a))}toJSONField(){return this.elements.map(i=>lt(this.$typeArgs[0],i))}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,elements:this.toJSONField()}}static fromJSONField(i,a){return r.reified(i).new(a.map(o=>M(i,o)))}static fromJSON(i,a){if(a.$typeName!==r.$typeName)throw new Error("not a vector json object");return r.fromJSONField(i,a.elements)}};function Zt(r){return ea.r(r)}function U(r){return typeof r=="string"?{phantomType:r,kind:"PhantomReified"}:{phantomType:r.fullTypeName,kind:"PhantomReified"}}var _r=it.bytes(32).transform({input:r=>Dr(r),output:r=>Er(r)});function qt(r){switch(r){case"bool":return it.bool();case"u8":return it.u8();case"u16":return it.u16();case"u32":return it.u32();case"u64":return it.u64();case"u128":return it.u128();case"u256":return it.u256();case"address":return _r;default:return r.bcs}}function T(r){switch(r){case"u8":case"u16":case"u32":case"u64":case"u128":case"u256":case"bool":case"address":return r}switch(r.kind){case"PhantomReified":return r.phantomType;case"StructClassReified":return r.fullTypeName;case"VectorClassReified":return r.fullTypeName}throw new Error("unreachable")}function L(r,i){switch(r){case"bool":case"u8":case"u16":case"u32":return i;case"u64":case"u128":case"u256":return BigInt(i);case"address":return`0x${i}`}if(r.kind==="VectorClassReified")return r.fromFields(i).elements;switch(r.typeName){case"0x1::string::String":case"0x1::ascii::String":return new TextDecoder().decode(Uint8Array.from(i.bytes)).toString();case"0x2::url::Url":return new TextDecoder().decode(Uint8Array.from(i.url.bytes)).toString();case"0x2::object::ID":return`0x${i.bytes}`;case"0x2::object::UID":return`0x${i.id.bytes}`;case"0x1::option::Option":return i.vec.length===0?null:r.fromFields(i).vec[0];default:return r.fromFields(i)}}function S(r,i){switch(r){case"bool":case"u8":case"u16":case"u32":return i;case"u64":case"u128":case"u256":return BigInt(i);case"address":return i}if(r.kind==="VectorClassReified")return r.fromFieldsWithTypes(i).elements;switch(r.typeName){case"0x1::string::String":case"0x1::ascii::String":case"0x2::url::Url":case"0x2::object::ID":return i;case"0x2::object::UID":return i.id;case"0x2::balance::Balance":return r.fromFields({value:BigInt(i)});case"0x1::option::Option":return i===null?null:S(r.reifiedTypeArgs[0],i);default:return r.fromFieldsWithTypes(i)}}function Ve(r,i,a){if(a.length!==i.length)throw new Error(`provided item has mismatching number of type argments ${r} (expected ${a.length}, got ${i.length}))`);for(let o=0;o<i.length;o++)if(G(i[o])!==G(T(a[o])))throw new Error(`provided item has mismatching type argments ${r} (expected ${T(a[o])}, got ${i[o]}))`)}function ze(r,i){let{typeArgs:a}=oe(r.type);Ve(r.type,a,i)}function lt(r,i){let{typeName:a,typeArgs:o}=oe(r);switch(a){case"bool":return i;case"u8":case"u16":case"u32":return i;case"u64":case"u128":case"u256":return i.toString();case"address":case"signer":return i;case"vector":return i.map(s=>lt(o[0],s));case"0x1::string::String":case"0x1::ascii::String":case"0x2::url::Url":case"0x2::object::ID":case"0x2::object::UID":return i;case"0x1::option::Option":return i===null?null:lt(o[0],i);default:return i.toJSONField()}}function M(r,i){switch(r){case"bool":case"u8":case"u16":case"u32":return i;case"u64":case"u128":case"u256":return BigInt(i);case"address":return i}if(r.kind==="VectorClassReified")return r.fromJSONField(i).elements;switch(r.typeName){case"0x1::string::String":case"0x1::ascii::String":case"0x2::url::Url":case"0x2::object::ID":case"0x2::object::UID":return i;case"0x1::option::Option":return i===null?null:M(r.reifiedTypeArgs[0],i);default:return r.fromJSONField(i)}}ne();var Pn="0x1";import{bcs as tu}from"@mysten/sui/bcs";import{fromB64 as iu}from"@mysten/sui/utils";ne();import{bcs as ta}from"@mysten/sui/bcs";import{fromB64 as $r}from"@mysten/sui/utils";function jn(r){return r=G(r),r===`${Pn}::string::String`}var Jn=class r{__StructClass=!0;static get $typeName(){return`${Pn}::string::String`}static $numTypeParams=0;static $isPhantom=[];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;bytes;constructor(i,a){this.$fullTypeName=j(r.$typeName,...i),this.$typeArgs=i,this.bytes=a.bytes}static reified(){return{typeName:r.$typeName,fullTypeName:j(r.$typeName),typeArgs:[],isPhantom:r.$isPhantom,reifiedTypeArgs:[],fromFields:i=>r.fromFields(i),fromFieldsWithTypes:i=>r.fromFieldsWithTypes(i),fromBcs:i=>r.fromBcs(i),bcs:r.bcs,fromJSONField:i=>r.fromJSONField(i),fromJSON:i=>r.fromJSON(i),fromSuiParsedData:i=>r.fromSuiParsedData(i),fromSuiObjectData:i=>r.fromSuiObjectData(i),fetch:async(i,a)=>r.fetch(i,a),new:i=>new r([],i),kind:"StructClassReified"}}static get r(){return r.reified()}static phantom(){return U(r.reified())}static get p(){return r.phantom()}static get bcs(){return ta.struct("String",{bytes:ta.vector(ta.u8())})}static fromFields(i){return r.reified().new({bytes:L(Zt("u8"),i.bytes)})}static fromFieldsWithTypes(i){if(!jn(i.type))throw new Error("not a String type");return r.reified().new({bytes:S(Zt("u8"),i.fields.bytes)})}static fromBcs(i){return r.fromFields(r.bcs.parse(i))}toJSONField(){return{bytes:lt("vector<u8>",this.bytes)}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i){return r.reified().new({bytes:M(Zt("u8"),i.bytes)})}static fromJSON(i){if(i.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return r.fromJSONField(i)}static fromSuiParsedData(i){if(i.dataType!=="moveObject")throw new Error("not an object");if(!jn(i.type))throw new Error(`object at ${i.fields.id} is not a String object`);return r.fromFieldsWithTypes(i)}static fromSuiObjectData(i){if(i.bcs){if(i.bcs.dataType!=="moveObject"||!jn(i.bcs.type))throw new Error("object at is not a String object");return r.fromBcs($r(i.bcs.bcsBytes))}if(i.content)return r.fromSuiParsedData(i.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a){let o=await i.getObject({id:a,options:{showBcs:!0}});if(o.error)throw new Error(`error fetching String object at id ${a}: ${o.error.code}`);if(o.data?.bcs?.dataType!=="moveObject"||!jn(o.data.bcs.type))throw new Error(`object at id ${a} is not a String object`);return r.fromSuiObjectData(o.data)}};ne();ne();var at="0x2";import{bcs as na}from"@mysten/sui/bcs";import{fromB64 as po,fromHEX as qr,toHEX as es}from"@mysten/sui/utils";function kn(r){return r=G(r),r===`${at}::object::ID`}var ut=class r{__StructClass=!0;static get $typeName(){return`${at}::object::ID`}static $numTypeParams=0;static $isPhantom=[];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;bytes;constructor(i,a){this.$fullTypeName=j(r.$typeName,...i),this.$typeArgs=i,this.bytes=a.bytes}static reified(){return{typeName:r.$typeName,fullTypeName:j(r.$typeName),typeArgs:[],isPhantom:r.$isPhantom,reifiedTypeArgs:[],fromFields:i=>r.fromFields(i),fromFieldsWithTypes:i=>r.fromFieldsWithTypes(i),fromBcs:i=>r.fromBcs(i),bcs:r.bcs,fromJSONField:i=>r.fromJSONField(i),fromJSON:i=>r.fromJSON(i),fromSuiParsedData:i=>r.fromSuiParsedData(i),fromSuiObjectData:i=>r.fromSuiObjectData(i),fetch:async(i,a)=>r.fetch(i,a),new:i=>new r([],i),kind:"StructClassReified"}}static get r(){return r.reified()}static phantom(){return U(r.reified())}static get p(){return r.phantom()}static get bcs(){return na.struct("ID",{bytes:na.bytes(32).transform({input:i=>qr(i),output:i=>es(i)})})}static fromFields(i){return r.reified().new({bytes:L("address",i.bytes)})}static fromFieldsWithTypes(i){if(!kn(i.type))throw new Error("not a ID type");return r.reified().new({bytes:S("address",i.fields.bytes)})}static fromBcs(i){return r.fromFields(r.bcs.parse(i))}toJSONField(){return{bytes:this.bytes}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i){return r.reified().new({bytes:M("address",i.bytes)})}static fromJSON(i){if(i.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return r.fromJSONField(i)}static fromSuiParsedData(i){if(i.dataType!=="moveObject")throw new Error("not an object");if(!kn(i.type))throw new Error(`object at ${i.fields.id} is not a ID object`);return r.fromFieldsWithTypes(i)}static fromSuiObjectData(i){if(i.bcs){if(i.bcs.dataType!=="moveObject"||!kn(i.bcs.type))throw new Error("object at is not a ID object");return r.fromBcs(po(i.bcs.bcsBytes))}if(i.content)return r.fromSuiParsedData(i.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a){let o=await i.getObject({id:a,options:{showBcs:!0}});if(o.error)throw new Error(`error fetching ID object at id ${a}: ${o.error.code}`);if(o.data?.bcs?.dataType!=="moveObject"||!kn(o.data.bcs.type))throw new Error(`object at id ${a} is not a ID object`);return r.fromSuiObjectData(o.data)}};function zn(r){return r=G(r),r===`${at}::object::UID`}var Ze=class r{__StructClass=!0;static get $typeName(){return`${at}::object::UID`}static $numTypeParams=0;static $isPhantom=[];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;id;constructor(i,a){this.$fullTypeName=j(r.$typeName,...i),this.$typeArgs=i,this.id=a.id}static reified(){return{typeName:r.$typeName,fullTypeName:j(r.$typeName),typeArgs:[],isPhantom:r.$isPhantom,reifiedTypeArgs:[],fromFields:i=>r.fromFields(i),fromFieldsWithTypes:i=>r.fromFieldsWithTypes(i),fromBcs:i=>r.fromBcs(i),bcs:r.bcs,fromJSONField:i=>r.fromJSONField(i),fromJSON:i=>r.fromJSON(i),fromSuiParsedData:i=>r.fromSuiParsedData(i),fromSuiObjectData:i=>r.fromSuiObjectData(i),fetch:async(i,a)=>r.fetch(i,a),new:i=>new r([],i),kind:"StructClassReified"}}static get r(){return r.reified()}static phantom(){return U(r.reified())}static get p(){return r.phantom()}static get bcs(){return na.struct("UID",{id:ut.bcs})}static fromFields(i){return r.reified().new({id:L(ut.reified(),i.id)})}static fromFieldsWithTypes(i){if(!zn(i.type))throw new Error("not a UID type");return r.reified().new({id:S(ut.reified(),i.fields.id)})}static fromBcs(i){return r.fromFields(r.bcs.parse(i))}toJSONField(){return{id:this.id}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i){return r.reified().new({id:M(ut.reified(),i.id)})}static fromJSON(i){if(i.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return r.fromJSONField(i)}static fromSuiParsedData(i){if(i.dataType!=="moveObject")throw new Error("not an object");if(!zn(i.type))throw new Error(`object at ${i.fields.id} is not a UID object`);return r.fromFieldsWithTypes(i)}static fromSuiObjectData(i){if(i.bcs){if(i.bcs.dataType!=="moveObject"||!zn(i.bcs.type))throw new Error("object at is not a UID object");return r.fromBcs(po(i.bcs.bcsBytes))}if(i.content)return r.fromSuiParsedData(i.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a){let o=await i.getObject({id:a,options:{showBcs:!0}});if(o.error)throw new Error(`error fetching UID object at id ${a}: ${o.error.code}`);if(o.data?.bcs?.dataType!=="moveObject"||!zn(o.data.bcs.type))throw new Error(`object at id ${a} is not a UID object`);return r.fromSuiObjectData(o.data)}};function Se(r,i){return r.moveCall({target:`${Co.PUBLISHED_AT}::bytes32::from_hex`,arguments:[Be(r,i,`${Jn.$typeName}`)]})}async function xe(r,i,a=[]){let o=await r(i),s=a.concat(o.data);return o.hasNextPage&&o.nextCursor?xe(r,o.nextCursor,s):s}var Gt=class extends Ae{constructor(a,o){super();this.nodeRpcUrlsConfig=a;this.api=o;this.client=new ts({url:a.getNodeRpcUrl(this.chainSymbol)})}chainType="SUI";chainSymbol="SUI";client;send(){throw new I("Method send not implemented.")}async buildRawTransactionSwap(a){let o=a.sourceToken.suiAddresses;if(!o)throw new I("SUI token must contain 'suiAddresses'");(0,oa.setAddress)(o.bridgeAddress,o.bridgeAddressOrigin);let s=We(this.chainType,a);return await this.buildRawTransactionSwapFromParams(s,o)}async buildRawTransactionSwapFromParams(a,o){let{amount:s,fromAccountAddress:d,fromTokenAddress:A,toTokenAddress:g,minimumReceiveAmount:c}=a,l=new ia;l.setSender(d);let u={bridge:o.bridgeObjectAddress,coin:D({balance:BigInt(s),type:A}),receiveAmountMin:BigInt(c)},m=ao(l,[A,g],u),p=await xe(b=>this.client.getCoins({owner:a.toAccountAddress,coinType:g,cursor:b}));return p.length===0||!p[0]?l.transferObjects([m],a.toAccountAddress):l.mergeCoins(p[0].coinObjectId,[m]),await l.toJSON({client:this.client})}async buildRawTransactionSendFromCustomTx(a,o,s){let d=ia.from(a);return this.buildRawTransactionSendFromTx(s,d,o)}async buildRawTransactionSend(a){return this.buildRawTransactionSendFromTx(a,new ia)}async buildRawTransactionSendFromTx(a,o,s){let d=await he(this.chainType,a,this.api),{messenger:A}=d,g=a.sourceToken.suiAddresses;if(!g)throw new I("SUI token must contain 'suiAddresses'");switch((0,oa.setAddress)(g.bridgeAddress,g.bridgeAddressOrigin),(0,yo.setAddress)(g.utilsAddress),A){case 1:return this.buildRawTransactionAllbridgeSend(d,g,o,s);case 2:return this.buildRawTransactionWormholeSend(d,g,o,s);case 3:case 4:return this.buildRawTransactionCctpSend(a,d,g,o,s);case 5:throw new de("Messenger OFT is not supported yet.")}}async buildRawTransactionAllbridgeSend(a,o,s,d){let{amount:A,fromAccountAddress:g,fromTokenAddress:c,toChainId:l,toAccountAddress:u,toTokenAddress:m,fee:p,gasFeePaymentMethod:b,extraGas:W}=a,y=p;if(W&&(y=aa(y).plus(W).toFixed()),s.setSender(g),b==="stablecoin"){let Y=BigInt(A)-BigInt(y),B,h;if(d){let[w]=s.splitCoins(d,[y]);B=d,h=w}else B=D({balance:Y,type:c}),h=D({balance:BigInt(y),type:c});let Z={bridge:o.bridgeObjectAddress,messenger:o.allbridgeMessengerObjectAddress,amount:B,destinationChainId:l,nonce:ke(),recipient:Se(s,Te(u)),receiveToken:Se(s,Te(m)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:h,feeSuiCoin:D({balance:BigInt(0),useGasCoin:!1})};Ui(s,c,Z)}else{let Y=y==="0"?D({balance:BigInt(y),useGasCoin:!1}):D({balance:BigInt(y)}),B={bridge:o.bridgeObjectAddress,messenger:o.allbridgeMessengerObjectAddress,amount:d??D({balance:BigInt(A),type:c}),destinationChainId:l,nonce:ke(),recipient:Se(s,Te(u)),receiveToken:Se(s,Te(m)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:D({balance:BigInt(0),type:c}),feeSuiCoin:Y};Ui(s,c,B)}return await s.toJSON({client:this.client})}async buildRawTransactionWormholeSend(a,o,s,d){let{amount:A,fromAccountAddress:g,fromTokenAddress:c,toChainId:l,toAccountAddress:u,toTokenAddress:m,fee:p,gasFeePaymentMethod:b,extraGas:W}=a,y=p;if(W&&(y=aa(y).plus(W).toFixed()),s.setSender(g),b==="stablecoin"){let Y=BigInt(A)-BigInt(y),B,h;if(d){let[w]=s.splitCoins(d,[y]);B=d,h=w}else B=D({balance:Y,type:c}),h=D({balance:BigInt(y),type:c});let Z={bridge:o.bridgeObjectAddress,messenger:o.wormholeMessengerObjectAddress,wormholeState:o.wormholeStateObjectAddress,theClock:Io,amount:B,destinationChainId:l,nonce:ke(),recipient:Se(s,Te(u)),receiveToken:Se(s,Te(m)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:h,feeSuiCoin:D({balance:BigInt(0),useGasCoin:!1})};Ki(s,c,Z)}else{let Y=y==="0"?D({balance:BigInt(y),useGasCoin:!1}):D({balance:BigInt(y)}),B={bridge:o.bridgeObjectAddress,messenger:o.wormholeMessengerObjectAddress,wormholeState:o.wormholeStateObjectAddress,theClock:Io,amount:d??D({balance:BigInt(A),type:c}),destinationChainId:l,nonce:ke(),recipient:Se(s,Te(u)),receiveToken:Se(s,Te(m)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:D({balance:BigInt(0),type:c}),feeSuiCoin:Y};Ki(s,c,B)}return await s.toJSON({client:this.client})}async buildRawTransactionCctpSend(a,o,s,d,A){let{amount:g,fromAccountAddress:c,fromTokenAddress:l,toChainId:u,toAccountAddress:m,fee:p,gasFeePaymentMethod:b,extraGas:W}=o;(0,bo.setAddress)(s.cctpAddress,s.cctpAddressOrigin);let y=p;W&&(y=aa(y).plus(W).toFixed()),d.setSender(c);let Y=Se(d,Te(m)),B;if(a.destinationToken.chainType==="SOLANA"){let h=await Tn(this.chainType,a.toAccountAddress,a.destinationToken.tokenAddress,this.nodeRpcUrlsConfig.getNodeRpcUrl("SOL"));B=Se(d,Te(h))}else B=Y;if(b==="stablecoin"){let h=BigInt(g)-BigInt(y),Z,w;if(A){let[P]=d.splitCoins(A,[y]);Z=A,w=P}else Z=D({balance:h,type:l}),w=D({balance:BigInt(y),type:l});let O={cctpBridge:s.cctpObjectAddress,tokenMessengerMinterState:s.cctpTokenMessengerMinterStateObjectAddress,messageTransmitterState:s.cctpMessageTransmitterStateObjectAddress,treasury:s.cctpTreasuryObjectAddress,denyList:s.cctpDenyListObjectAddress,amount:Z,destinationChainId:u,recipient:B,recipientWalletAddress:Y,gasOracle:s.gasOracleObjectAddress,feeTokenCoin:w,feeSuiCoin:D({balance:BigInt(0),useGasCoin:!1})};_i(d,l,O)}else{let h=y==="0"?D({balance:BigInt(y),useGasCoin:!1}):D({balance:BigInt(y)}),Z={cctpBridge:s.cctpObjectAddress,tokenMessengerMinterState:s.cctpTokenMessengerMinterStateObjectAddress,messageTransmitterState:s.cctpMessageTransmitterStateObjectAddress,treasury:s.cctpTreasuryObjectAddress,denyList:s.cctpDenyListObjectAddress,amount:A??D({balance:BigInt(g),type:l}),destinationChainId:u,recipient:B,recipientWalletAddress:Y,gasOracle:s.gasOracleObjectAddress,feeTokenCoin:D({balance:BigInt(0),type:l}),feeSuiCoin:h};_i(d,l,Z)}return await d.toJSON({client:this.client})}};import{Big as as}from"big.js";import ns from"bn.js";function xn(r){return"0x"+new ns(r).toString("hex")}function ho(r){return new Promise(i=>setTimeout(()=>i(),r))}async function On(r,i){let a=await r.trx.sign(i);if(!a.signature)throw new bt("Transaction was not signed properly");let s=(await r.trx.sendRawTransaction(a)).transaction.txID;return await is(r,s),{txId:s}}async function is(r,i,a=1e4){let o=Date.now();for(;;){if(Date.now()-o>a)throw new kt("Transaction not found");let s=await r.trx.getUnconfirmedTransactionInfo(i);if(!s?.receipt){await ho(2e3);continue}if(s.receipt.result==="SUCCESS")return s;throw new kt(`Transaction status is ${s.receipt.result}`)}}var en=class extends Ae{constructor(a,o){super();this.tronWeb=a;this.api=o}chainType="TRX";async send(a){let o=await he(this.chainType,a,this.api),s=await this.buildRawTransactionSendFromParams(a,o);return await On(this.tronWeb,s)}async buildRawTransactionSwap(a){let o=We(this.chainType,a);return await this.buildRawTransactionSwapFromParams(o)}async buildRawTransactionSwapFromParams(a){let{amount:o,contractAddress:s,fromAccountAddress:d,fromTokenAddress:A,toAccountAddress:g,toTokenAddress:c,minimumReceiveAmount:l}=a,u=[{type:"uint256",value:o},{type:"bytes32",value:A},{type:"bytes32",value:c},{type:"address",value:g},{type:"uint256",value:l}];return this.buildRawTransaction(s,"swap(uint256,bytes32,bytes32,address,uint256)",u,"0",d)}async buildRawTransactionSend(a){let o=await he(this.chainType,a,this.api);return this.buildRawTransactionSendFromParams(a,o)}async buildRawTransactionSendFromParams(a,o){let{amount:s,contractAddress:d,fromAccountAddress:A,fromTokenAddress:g,toChainId:c,toAccountAddress:l,toTokenAddress:u,messenger:m,fee:p,gasFeePaymentMethod:b,extraGas:W,extraGasDest:y}=o,Y=p;W&&(Y=as(Y).plus(W).toFixed());let B=ke().toString(),h,Z,w;switch(m){case 3:case 4:b==="stablecoin"?(h=[{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"uint256",value:Y}],Z="0"):(h=[{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"uint256",value:0}],Z=Y),w="bridge(uint256,bytes32,uint256,uint256)";break;case 5:b==="stablecoin"?(h=[{type:"address",value:a.sourceToken.tokenAddress},{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"uint256",value:Y},{type:"uint256",value:y??"0"},{type:"uint256",value:"10"}],Z="0"):(h=[{type:"address",value:a.sourceToken.tokenAddress},{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"uint256",value:0},{type:"uint256",value:y??"0"},{type:"uint256",value:"10"}],Z=Y),w="bridge(address,uint256,bytes32,uint256,uint256,uint256,uint256)";break;case 1:case 2:b==="stablecoin"?(h=[{type:"bytes32",value:g},{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"bytes32",value:u},{type:"uint256",value:B},{type:"uint8",value:m},{type:"uint256",value:Y}],Z="0"):(h=[{type:"bytes32",value:g},{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"bytes32",value:u},{type:"uint256",value:B},{type:"uint8",value:m},{type:"uint256",value:0}],Z=Y),w="swapAndBridge(bytes32,uint256,bytes32,uint256,bytes32,uint256,uint8,uint256)";break}return this.buildRawTransaction(d,w,h,Z,A)}async buildRawTransaction(a,o,s,d,A){let g=await this.tronWeb.transactionBuilder.triggerSmartContract(a,o,{callValue:+d},s,A);if(!g?.result?.result)throw new I("Unknown error: "+JSON.stringify(g,null,2));return g.transaction}};var Qn=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s;this.rawTxBuilder=new wn(i,a,o,s)}rawTxBuilder;async getAllowance(i,a){let o,s;a?(o=i,s=a):s=i;let d=Et(s.token,s.messenger);return await this.tokenService.getAllowance({...s,spender:d},o)}async checkAllowance(i,a){let o,s;a?(o=i,s=a):s=i;let d=Et(s.token,s.messenger);return this.tokenService.checkAllowance({...s,spender:d},o)}async approve(i,a){let o=Et(a.token,a.messenger);return this.tokenService.approve(i,{...a,spender:o})}async send(i,a){return V(a.amount),H("amount",a.amount,a.sourceToken.decimals),Xn(a.sourceToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,i).send(a)}};function Et(r,i=1){switch(i){case 3:if(r.cctpAddress)return r.cctpAddress;throw new se("Such route does not support CCTP protocol");case 4:if(r.cctpV2Address)return r.cctpV2Address;throw new se("Such route does not support CCTP V2 protocol");case 5:if(r.oftBridgeAddress)return r.oftBridgeAddress;throw new de("Such route does not support OFT protocol");case 1:case 2:return r.bridgeAddress}}function Xn(r,i,a,o,s){switch(X.getChainProperty(r).chainType){case"EVM":{if(s)return new Dt(s,i,a);{let d=a.getNodeRpcUrl(r);return new Dt(new rs(d),i,a)}}case"TRX":{if(s)return new en(s,i);{let d=a.getNodeRpcUrl(r);return new en(new os({fullHost:d,solidityNode:d,eventServer:d}),i)}}case"SOLANA":return new Hn(a.getNodeRpcUrl("SOL"),{wormholeMessengerProgramId:o.wormholeMessengerProgramId,solanaLookUpTable:o.solanaLookUpTable,cctpParams:o.cctpParams,jupiterParams:{jupiterUrl:o.jupiterUrl,jupiterApiKeyHeader:o.jupiterApiKeyHeader,jupiterMaxAccounts:o.jupiterMaxAccounts}},i);case"SRB":return new Ln(a,o,i);case"SUI":return new Gt(a,i);case"ALG":if(s){let d=s,A=vo.fromClients({algod:d});return new Kt(A,i)}else{let d=a.getNodeRpcUrl(r),A=vo.fromConfig({algodConfig:{server:d}});return new Kt(A,i)}}}import{AlgorandClient as No}from"@algorandfoundation/algokit-utils";import{Big as Gs}from"big.js";import Fs from"timed-cache";import{TronWeb as fs}from"tronweb";import{FMT_BYTES as Ns,FMT_NUMBER as Ts,Web3 as ws}from"web3";import{Big as Ee}from"big.js";function Yo(r,i,a,o,s){let d=f(r,3),A=Ee(d),g=Ee(a),c=Ee(o).plus(s),l,u;if(g.eq(0)||c.eq(0)){let p=A.div(2);l=Ee(o).plus(p),u=Ee(s).plus(p)}else l=Ee(o).plus(A.mul(o).div(c)),u=Ee(s).plus(A.mul(s).div(c));return Ee(Ra(i,l.toFixed(),u.toFixed())).minus(g).toFixed()}function Ro(r){let i=f(r,3);return Ee(i).round().toFixed()}import{assignGroupID as ra,bytesToBigInt as As}from"algosdk";import{getArc56ReturnValue as ss}from"@algorandfoundation/algokit-utils/types/app-arc56";import{AppClient as Kn}from"@algorandfoundation/algokit-utils/types/app-client";import{AppFactory as tp}from"@algorandfoundation/algokit-utils/types/app-factory";import{encodeAddress as ds}from"algosdk";var Un={name:"Pool",structs:{},methods:[{name:"createApplication",args:[{type:"address",name:"owner"},{type:"address",name:"router"},{type:"uint64",name:"a"},{type:"uint64",name:"assetId"},{type:"uint64",name:"feeShareBP"},{type:"uint64",name:"balanceRatioMinBP"}],returns:{type:"void"},actions:{create:["NoOp"],call:[]},readonly:!1,events:[],recommendations:{}},{name:"optInToApplication",args:[],returns:{type:"void"},actions:{create:[],call:["OptIn"]},readonly:!1,events:[],recommendations:{}},{name:"optInAsset",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,desc:"Opt-in the application account to the ASA stored in `this.asset`.\nThis performs an inner axfer of 0 to the app's own address.\nCall once after deploy (or whenever you change the asset).",events:[],recommendations:{}},{name:"noop",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"deposit",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"RewardsClaimed",args:[{type:"address",name:"user"},{type:"uint64",name:"pending"}]},{name:"Deposit",args:[{type:"address",name:"to"},{type:"uint64",name:"lpAmount"}]}],recommendations:{}},{name:"withdraw",args:[{type:"uint64",name:"amountLp",desc:"The Withdrawn amount"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"RewardsClaimed",args:[{type:"address",name:"user"},{type:"uint64",name:"pending"}]},{name:"Withdraw",args:[{type:"address",name:"from"},{type:"uint64",name:"lpAmount"}]}],recommendations:{}},{name:"swapToVUsd",args:[{type:"address",name:"user"},{type:"uint64",name:"amount",desc:"The amount of tokens to swap."},{type:"bool",name:"zeroFee",desc:`When true it allows to swap without incurring any fees. It is intended for use with service
|
|
2
|
+
accounts.`}],returns:{type:"uint64",desc:"returns the difference between the old and the new value of vUsdBalance"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"SwappedToVUsd",args:[{type:"address",name:"sender"},{type:"uint64",name:"tokenId"},{type:"uint64",name:"amount"},{type:"uint64",name:"vUsdAmount"},{type:"uint64",name:"fee"}]}],recommendations:{}},{name:"swapFromVUsd",args:[{type:"address",name:"user",desc:"The address of the recipient."},{type:"uint64",name:"amount",desc:"The amount of vUSD to swap."},{type:"uint64",name:"receiveAmountMin",desc:`The minimum amount of tokens required to be received during the swap, otherwise the
|
|
3
|
+
transaction reverts.`},{type:"bool",name:"zeroFee",desc:`When true it allows to swap without incurring any fees. It is intended for use with service
|
|
4
|
+
accounts.`}],returns:{type:"uint64",desc:"returns the difference between the old and the new value of vUsdBalance"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"SwappedFromVUsd",args:[{type:"address",name:"recipient"},{type:"uint64",name:"tokenId"},{type:"uint64",name:"vUsdAmount"},{type:"uint64",name:"amount"},{type:"uint64",name:"fee"}]}],recommendations:{}},{name:"setFeeShare",args:[{type:"uint64",name:"feeShareBP"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"adjustTotalLpAmount",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"RewardsClaimed",args:[{type:"address",name:"user"},{type:"uint64",name:"pending"}]},{name:"Deposit",args:[{type:"address",name:"to"},{type:"uint64",name:"lpAmount"}]}],recommendations:{}},{name:"setBalanceRatioMinBP",args:[{type:"uint64",name:"balanceRatioMinBP"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"stopDeposit",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"startDeposit",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"stopWithdraw",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"startWithdraw",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"setStopAuthority",args:[{type:"address",name:"stopAuthority"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"setRouter",args:[{type:"address",name:"router"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"claimRewards",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"RewardsClaimed",args:[{type:"address",name:"user"},{type:"uint64",name:"pending"}]}],recommendations:{}},{name:"setAdminFeeShare",args:[{type:"uint64",name:"adminFeeShareBP"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"claimAdminFee",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"pendingReward",args:[{type:"account",name:"user"}],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"decimals",args:[],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"transferOwnership",args:[{type:"address",name:"newOwner"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}}],arcs:[22,28],desc:`4AD - D = 4A(x + y) - (D\xB3 / 4xy)
|
|
5
|
+
X - is value of real stable token
|
|
6
|
+
Y - is value of virtual usd`,networks:{},state:{schema:{global:{ints:15,bytes:4},local:{ints:2,bytes:0}},keys:{global:{feeShareBP:{keyType:"AVMString",valueType:"AVMUint64",key:"ZmVlU2hhcmVCUA=="},router:{keyType:"AVMString",valueType:"address",key:"cm91dGVy"},tokenBalance:{keyType:"AVMString",valueType:"AVMUint64",key:"dG9rZW5CYWxhbmNl"},vUsdBalance:{keyType:"AVMString",valueType:"AVMUint64",key:"dlVzZEJhbGFuY2U="},balanceRatioMinBP:{keyType:"AVMString",valueType:"AVMUint64",key:"YmFsYW5jZVJhdGlvTWluQlA="},reserves:{keyType:"AVMString",valueType:"AVMUint64",key:"cmVzZXJ2ZXM="},a:{keyType:"AVMString",valueType:"AVMUint64",key:"YQ=="},d:{keyType:"AVMString",valueType:"AVMUint64",key:"ZA=="},tokenAmountReduce:{keyType:"AVMString",valueType:"AVMUint64",key:"dG9rZW5BbW91bnRSZWR1Y2U="},tokenAmountIncrease:{keyType:"AVMString",valueType:"AVMUint64",key:"dG9rZW5BbW91bnRJbmNyZWFzZQ=="},stopAuthority:{keyType:"AVMString",valueType:"address",key:"c3RvcEF1dGhvcml0eQ=="},canDeposit:{keyType:"AVMString",valueType:"AVMUint64",key:"Y2FuRGVwb3NpdA=="},canWithdraw:{keyType:"AVMString",valueType:"AVMUint64",key:"Y2FuV2l0aGRyYXc="},asset:{keyType:"AVMString",valueType:"AVMUint64",key:"YXNzZXQ="},adminFeeShareBP:{keyType:"AVMString",valueType:"AVMUint64",key:"YWRtaW5GZWVTaGFyZUJQ"},totalSupply:{keyType:"AVMString",valueType:"AVMUint64",key:"dG90YWxTdXBwbHk="},accRewardPerShareP:{keyType:"AVMString",valueType:"AVMBytes",key:"YWNjUmV3YXJkUGVyU2hhcmVQ"},adminFeeAmount:{keyType:"AVMString",valueType:"AVMUint64",key:"YWRtaW5GZWVBbW91bnQ="},owner:{keyType:"AVMString",valueType:"address",key:"b3duZXI="}},local:{balance:{keyType:"AVMString",valueType:"AVMUint64",key:"YmFsYW5jZQ=="},userRewardDebt:{keyType:"AVMString",valueType:"AVMUint64",key:"dXNlclJld2FyZERlYnQ="}},box:{}},maps:{global:{},local:{},box:{}}},bareActions:{create:[],call:[]},sourceInfo:{approval:{sourceInfo:[{pc:[1446],errorMessage:'"Pool: withdraw prohibited'},{pc:[1249],errorMessage:"Asset must go to app"},{pc:[1232],errorMessage:"Asset txn missing"},{pc:[1270],errorMessage:"CloseTo not allowed"},{pc:[514,529,553,577,589,605,617,632,647,659,671,683,695,711,723,739,773,803,819,831,840,865],errorMessage:"OnCompletion is not NoOp"},{pc:[853],errorMessage:"OnCompletion is not OptIn"},{pc:[3306],errorMessage:"Only owner"},{pc:[1216],errorMessage:"Pool: deposit prohibited"},{pc:[1141],errorMessage:"Pool: is not stopAuthority"},{pc:[1206],errorMessage:"Pool: low token balance"},{pc:[1182],errorMessage:"Pool: low vUSD balance"},{pc:[1131],errorMessage:"Pool: only router"},{pc:[1701,1983],errorMessage:"Pool: reserves"},{pc:[2027],errorMessage:"Pool: slippage"},{pc:[2116,2175],errorMessage:"Pool: too large"},{pc:[1280],errorMessage:"Pool: too little"},{pc:[1369],errorMessage:"Pool: too much"},{pc:[1723],errorMessage:"Pool: zero D changes"},{pc:[1693],errorMessage:"Pool: zero changes"},{pc:[1263],errorMessage:"Rekey not allowed"},{pc:[1468],errorMessage:"RewardManager: not enough amount"},{pc:[2994],errorMessage:"RewardManager: too high"},{pc:[1256],errorMessage:"Wrong asset"},{pc:[984],errorMessage:"asset exists"},{pc:[869],errorMessage:"can only call when creating"},{pc:[517,532,556,580,592,608,620,635,650,662,674,686,698,714,726,742,776,806,822,834,843,856],errorMessage:"can only call when not creating"},{pc:[977,1080,1129,1139,1153,1163,1180,1204,1215,1225,1229,1284,1298,1308,1326,1336,1350,1360,1374,1412,1445,1451,1476,1531,1563,1614,1618,1624,1660,1686,1690,1697,1705,1719,1728,1775,1805,1815,1823,1833,1841,1870,1929,1939,1955,1976,1987,2002,2032,2066,2137,2148,2251,2260,2408,2413,2421,2529,2537,2578,2586,2917,2954,3015,3023,3028,3064,3092,3100,3118,3138,3152,3216,3250,3304],errorMessage:"check GlobalState exists"},{pc:[1463,1500,1516,2906,2934,3058,3078,3164,3186,3201],errorMessage:"check LocalState exists"},{pc:[2626],errorMessage:"n must be non-negative"},{pc:[1395,1426,1642,1674],errorMessage:"overflow"},{pc:[1242],errorMessage:"transaction type is axfer"}],pcOffsetMethod:"none"},clear:{sourceInfo:[],pcOffsetMethod:"none"}},source:{approval:"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNCAxMDAwMAogICAgYnl0ZWNibG9jayAidG9rZW5CYWxhbmNlIiAidlVzZEJhbGFuY2UiICJhc3NldCIgInJlc2VydmVzIiAiYmFsYW5jZSIgInVzZXJSZXdhcmREZWJ0IiAiZCIgInRvdGFsU3VwcGx5IiAiYWNjUmV3YXJkUGVyU2hhcmVQIiAweDAxMDAwMDAwMDAwMDAwIDB4MDEgImFkbWluRmVlQW1vdW50IiAiY2FuRGVwb3NpdCIgImNhbldpdGhkcmF3IiAib3duZXIiICJmZWVTaGFyZUJQIiAiYmFsYW5jZVJhdGlvTWluQlAiIDB4MDIgImFkbWluRmVlU2hhcmVCUCIgMHgxNTFmN2M3NSAiYSIgInJvdXRlciIgInN0b3BBdXRob3JpdHkiICJ0b2tlbkFtb3VudFJlZHVjZSIgInRva2VuQW1vdW50SW5jcmVhc2UiIDB4YmE4MTgwNzYgMHgwMyAweDAxMDAwMDAwMDAwMDAwMDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI4CiAgICAvLyBhZG1pbkZlZVNoYXJlQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBCUCAvIDUgfSk7IC8vIERlZmF1bHQgYWRtaW4gZmVlIGlzIDIwJQogICAgYnl0ZWMgMTggLy8gImFkbWluRmVlU2hhcmVCUCIKICAgIHB1c2hpbnQgMjAwMCAvLyAyMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlYyA3IC8vICJ0b3RhbFN1cHBseSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMwCiAgICAvLyBhY2NSZXdhcmRQZXJTaGFyZVAgPSBHbG9iYWxTdGF0ZTxiaWd1aW50Pih7IGluaXRpYWxWYWx1ZTogMG4gfSk7CiAgICBieXRlYyA4IC8vICJhY2NSZXdhcmRQZXJTaGFyZVAiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzEKICAgIC8vIGFkbWluRmVlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjIDExIC8vICJhZG1pbkZlZUFtb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIHRva2VuQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIHJlc2VydmVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NgogICAgLy8gZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlYyA2IC8vICJkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MgogICAgLy8gY2FuRGVwb3NpdCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOy8vIGlzIGRlcG9zaXQgb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDEyIC8vICJjYW5EZXBvc2l0IgogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MwogICAgLy8gY2FuV2l0aGRyYXcgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyB3aXRoZHJhd24gb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDEzIC8vICJjYW5XaXRoZHJhdyIKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMwogICAgLy8gZXhwb3J0IGNsYXNzIFBvb2wgZXh0ZW5kcyBSZXdhcmRNYW5hZ2VyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZyB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9hZnRlcl9pZl9lbHNlQDMxCiAgICBwdXNoYnl0ZXNzIDB4NTE2ZDM0N2IgMHgwMWEzYTNmZiAweDc2MTBhNDYwIDB4ZTgzYTg3YWIgMHg5MmUwM2IxYyAweDIxZjFkZGZmIDB4ZDk3OGFkMTQgMHgwZDFiNGMwNiAweDc1YmY5YTI4IDB4ZjQ5M2Q3ZWQgMHg4ZDVjYjZkZiAweGZlMDRhNWNlIDB4MDI4ZTA4NTkgMHg0MWZjOTY2ZSAweGFiZjIwMDE0IDB4MDRiMTYxZjEgMHg2NjU5MWNjZiAweGE1YWU2YmQxIDB4YTA0YzViYzQgMHgzNjFiNjE1OSAweDMyYmJiMDExIDB4Yjg3NzllZTcgMHhlMTdiYWZiNCAvLyBtZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAib3B0SW5Ub0FwcGxpY2F0aW9uKCl2b2lkIiwgbWV0aG9kICJvcHRJbkFzc2V0KCl2b2lkIiwgbWV0aG9kICJub29wKCl2b2lkIiwgbWV0aG9kICJkZXBvc2l0KCl2b2lkIiwgbWV0aG9kICJ3aXRoZHJhdyh1aW50NjQpdm9pZCIsIG1ldGhvZCAic3dhcFRvVlVzZChhZGRyZXNzLHVpbnQ2NCxib29sKXVpbnQ2NCIsIG1ldGhvZCAic3dhcEZyb21WVXNkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0RmVlU2hhcmUodWludDY0KXZvaWQiLCBtZXRob2QgImFkanVzdFRvdGFsTHBBbW91bnQoKXZvaWQiLCBtZXRob2QgInNldEJhbGFuY2VSYXRpb01pbkJQKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzdG9wRGVwb3NpdCgpdm9pZCIsIG1ldGhvZCAic3RhcnREZXBvc2l0KCl2b2lkIiwgbWV0aG9kICJzdG9wV2l0aGRyYXcoKXZvaWQiLCBtZXRob2QgInN0YXJ0V2l0aGRyYXcoKXZvaWQiLCBtZXRob2QgInNldFN0b3BBdXRob3JpdHkoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJzZXRSb3V0ZXIoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJjbGFpbVJld2FyZHMoKXZvaWQiLCBtZXRob2QgInNldEFkbWluRmVlU2hhcmUodWludDY0KXZvaWQiLCBtZXRob2QgImNsYWltQWRtaW5GZWUoKXZvaWQiLCBtZXRob2QgInBlbmRpbmdSZXdhcmQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgImRlY2ltYWxzKCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyT3duZXJzaGlwKGFkZHJlc3Mpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY3JlYXRlQXBwbGljYXRpb25fcm91dGVANSBtYWluX29wdEluVG9BcHBsaWNhdGlvbl9yb3V0ZUA2IG1haW5fb3B0SW5Bc3NldF9yb3V0ZUA3IG1haW5fbm9vcF9yb3V0ZUA4IG1haW5fZGVwb3NpdF9yb3V0ZUA5IG1haW5fd2l0aGRyYXdfcm91dGVAMTAgbWFpbl9zd2FwVG9WVXNkX3JvdXRlQDExIG1haW5fc3dhcEZyb21WVXNkX3JvdXRlQDEyIG1haW5fc2V0RmVlU2hhcmVfcm91dGVAMTMgbWFpbl9hZGp1c3RUb3RhbExwQW1vdW50X3JvdXRlQDE0IG1haW5fc2V0QmFsYW5jZVJhdGlvTWluQlBfcm91dGVAMTUgbWFpbl9zdG9wRGVwb3NpdF9yb3V0ZUAxNiBtYWluX3N0YXJ0RGVwb3NpdF9yb3V0ZUAxNyBtYWluX3N0b3BXaXRoZHJhd19yb3V0ZUAxOCBtYWluX3N0YXJ0V2l0aGRyYXdfcm91dGVAMTkgbWFpbl9zZXRTdG9wQXV0aG9yaXR5X3JvdXRlQDIwIG1haW5fc2V0Um91dGVyX3JvdXRlQDIxIG1haW5fY2xhaW1SZXdhcmRzX3JvdXRlQDIyIG1haW5fc2V0QWRtaW5GZWVTaGFyZV9yb3V0ZUAyMyBtYWluX2NsYWltQWRtaW5GZWVfcm91dGVAMjQgbWFpbl9wZW5kaW5nUmV3YXJkX3JvdXRlQDI1IG1haW5fZGVjaW1hbHNfcm91dGVAMjYgbWFpbl90cmFuc2Zlck93bmVyc2hpcF9yb3V0ZUAyNwoKbWFpbl9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl90cmFuc2Zlck93bmVyc2hpcF9yb3V0ZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiB0cmFuc2Zlck93bmVyc2hpcAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9kZWNpbWFsc19yb3V0ZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo5MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwMDAwMDAwMDAwMDAwMwogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3BlbmRpbmdSZXdhcmRfcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMwogICAgLy8gZXhwb3J0IGNsYXNzIFBvb2wgZXh0ZW5kcyBSZXdhcmRNYW5hZ2VyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZyB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjg2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgcGVuZGluZ1Jld2FyZAogICAgaXRvYgogICAgYnl0ZWMgMTkgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY2xhaW1BZG1pbkZlZV9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3MgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgY2xhaW1BZG1pbkZlZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRBZG1pbkZlZVNoYXJlX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjY1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjY1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0QWRtaW5GZWVTaGFyZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbGFpbVJld2FyZHNfcm91dGVAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsYWltUmV3YXJkcwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRSb3V0ZXJfcm91dGVAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTcKICAgIC8vIHNldFJvdXRlcihyb3V0ZXI6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzU3CiAgICAvLyBzZXRSb3V0ZXIocm91dGVyOiBBZGRyZXNzKTogdm9pZCB7CiAgICBjYWxsc3ViIHNldFJvdXRlcgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRTdG9wQXV0aG9yaXR5X3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyBzZXRTdG9wQXV0aG9yaXR5KHN0b3BBdXRob3JpdHk6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyBzZXRTdG9wQXV0aG9yaXR5KHN0b3BBdXRob3JpdHk6IEFkZHJlc3MpOiB2b2lkIHsKICAgIGNhbGxzdWIgc2V0U3RvcEF1dGhvcml0eQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zdGFydFdpdGhkcmF3X3JvdXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzQ3CiAgICAvLyBzdGFydFdpdGhkcmF3KCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHN0YXJ0V2l0aGRyYXcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3RvcFdpdGhkcmF3X3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzQyCiAgICAvLyBzdG9wV2l0aGRyYXcoKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgc3RvcFdpdGhkcmF3CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3N0YXJ0RGVwb3NpdF9yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzNwogICAgLy8gc3RhcnREZXBvc2l0KCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHN0YXJ0RGVwb3NpdAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zdG9wRGVwb3NpdF9yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzMgogICAgLy8gc3RvcERlcG9zaXQoKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgc3RvcERlcG9zaXQKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0QmFsYW5jZVJhdGlvTWluQlBfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMjYKICAgIC8vIHNldEJhbGFuY2VSYXRpb01pbkJQKGJhbGFuY2VSYXRpb01pbkJQOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzI2CiAgICAvLyBzZXRCYWxhbmNlUmF0aW9NaW5CUChiYWxhbmNlUmF0aW9NaW5CUDogdWludDY0KTogdm9pZCB7CiAgICBjYWxsc3ViIHNldEJhbGFuY2VSYXRpb01pbkJQCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2FkanVzdFRvdGFsTHBBbW91bnRfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMTMKICAgIC8vIGFkanVzdFRvdGFsTHBBbW91bnQoKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYWRqdXN0VG90YWxMcEFtb3VudAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRGZWVTaGFyZV9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMwNwogICAgLy8gc2V0RmVlU2hhcmUoZmVlU2hhcmVCUDogdWludDY0KTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyBleHBvcnQgY2xhc3MgUG9vbCBleHRlbmRzIFJld2FyZE1hbmFnZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMwNwogICAgLy8gc2V0RmVlU2hhcmUoZmVlU2hhcmVCUDogdWludDY0KTogdm9pZCB7CiAgICBjYWxsc3ViIHNldEZlZVNoYXJlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3N3YXBGcm9tVlVzZF9yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI1OS0yNjQKICAgIC8vIHN3YXBGcm9tVlVzZCgKICAgIC8vICAgdXNlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICAgemVyb0ZlZTogYm9vbGVhbiwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyBleHBvcnQgY2xhc3MgUG9vbCBleHRlbmRzIFJld2FyZE1hbmFnZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI1OS0yNjQKICAgIC8vIHN3YXBGcm9tVlVzZCgKICAgIC8vICAgdXNlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICAgemVyb0ZlZTogYm9vbGVhbiwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBjYWxsc3ViIHN3YXBGcm9tVlVzZAogICAgaXRvYgogICAgYnl0ZWMgMTkgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3dhcFRvVlVzZF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIxMy0yMTcKICAgIC8vIHN3YXBUb1ZVc2QoCiAgICAvLyAgIHVzZXI6IEFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogdWludDY0LAogICAgLy8gICB6ZXJvRmVlOiBib29sZWFuLAogICAgLy8gKTogdWludDY0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjEzLTIxNwogICAgLy8gc3dhcFRvVlVzZCgKICAgIC8vICAgdXNlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHplcm9GZWU6IGJvb2xlYW4sCiAgICAvLyApOiB1aW50NjQgewogICAgY2FsbHN1YiBzd2FwVG9WVXNkCiAgICBpdG9iCiAgICBieXRlYyAxOSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl93aXRoZHJhd19yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyBleHBvcnQgY2xhc3MgUG9vbCBleHRlbmRzIFJld2FyZE1hbmFnZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHdpdGhkcmF3CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2RlcG9zaXRfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjEyOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZGVwb3NpdAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9ub29wX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo5MgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fb3B0SW5Bc3NldF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NzcKICAgIC8vIG9wdEluQXNzZXQoKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgb3B0SW5Bc3NldAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcHRJblRvQXBwbGljYXRpb25fcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBvcHRJblRvQXBwbGljYXRpb24oKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzEgLy8gT3B0SW4KICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBPcHRJbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG9wdEluVG9BcHBsaWNhdGlvbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVBcHBsaWNhdGlvbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTUKICAgIC8vIGNyZWF0ZUFwcGxpY2F0aW9uKG93bmVyOiBBZGRyZXNzLCByb3V0ZXI6IEFkZHJlc3MsIGE6IHVpbnQ2NCwgYXNzZXRJZDogdWludDY0LCBmZWVTaGFyZUJQOiB1aW50NjQsIGJhbGFuY2VSYXRpb01pbkJQOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMwogICAgLy8gZXhwb3J0IGNsYXNzIFBvb2wgZXh0ZW5kcyBSZXdhcmRNYW5hZ2VyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZyB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1NQogICAgLy8gY3JlYXRlQXBwbGljYXRpb24ob3duZXI6IEFkZHJlc3MsIHJvdXRlcjogQWRkcmVzcywgYTogdWludDY0LCBhc3NldElkOiB1aW50NjQsIGZlZVNoYXJlQlA6IHVpbnQ2NCwgYmFsYW5jZVJhdGlvTWluQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo6YmlndWludFRvVWludDY0TW9kdWxvKHY6IGJ5dGVzKSAtPiB1aW50NjQ6CmJpZ3VpbnRUb1VpbnQ2NE1vZHVsbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czoyNgogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyh2OiBiaWd1aW50KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjI4CiAgICAvLyBjb25zdCBsZW4gPSBvcC5sZW4oYik7CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MjkKICAgIC8vIGNvbnN0IHN0YXJ0OiB1aW50NjQgPSBsZW4gPiA4ID8gKGxlbiAtIDgpIDogMDsKICAgIGludGNfMiAvLyA4CiAgICA+CiAgICBieiBiaWd1aW50VG9VaW50NjRNb2R1bG9fdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18yIC8vIDgKICAgIC0KCmJpZ3VpbnRUb1VpbnQ2NE1vZHVsb190ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzAKICAgIC8vIGNvbnN0IGxhc3Q4ID0gYi5zbGljZShzdGFydCk7ICAgICAgICAgICAvLyBrZWVwIGxlYXN0LXNpZ25pZmljYW50IDggYnl0ZXMKICAgIGR1cAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgPj0KICAgIGRpZyAyCiAgICBzd2FwCiAgICBzZWxlY3QKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzEKICAgIC8vIHJldHVybiBvcC5idG9pKGxhc3Q4KTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byB1aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIHJldHN1YgoKYmlndWludFRvVWludDY0TW9kdWxvX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czoyOQogICAgLy8gY29uc3Qgc3RhcnQ6IHVpbnQ2NCA9IGxlbiA+IDggPyAobGVuIC0gOCkgOiAwOwogICAgaW50Y18wIC8vIDAKICAgIGIgYmlndWludFRvVWludDY0TW9kdWxvX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLmNyZWF0ZUFwcGxpY2F0aW9uKG93bmVyOiBieXRlcywgcm91dGVyOiBieXRlcywgYTogdWludDY0LCBhc3NldElkOiB1aW50NjQsIGZlZVNoYXJlQlA6IHVpbnQ2NCwgYmFsYW5jZVJhdGlvTWluQlA6IHVpbnQ2NCkgLT4gdm9pZDoKY3JlYXRlQXBwbGljYXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1NQogICAgLy8gY3JlYXRlQXBwbGljYXRpb24ob3duZXI6IEFkZHJlc3MsIHJvdXRlcjogQWRkcmVzcywgYTogdWludDY0LCBhc3NldElkOiB1aW50NjQsIGZlZVNoYXJlQlA6IHVpbnQ2NCwgYmFsYW5jZVJhdGlvTWluQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gNiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgYnl0ZWMgMTQgLy8gIm93bmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6OQogICAgLy8gdGhpcy5vd25lci52YWx1ZSA9IG93bmVyOwogICAgZnJhbWVfZGlnIC02CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI3CiAgICAvLyBhc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0PigpOwogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzgKICAgIC8vIHRoaXMuYXNzZXQudmFsdWUgPSBBc3NldChhc3NldElkKTsKICAgIGZyYW1lX2RpZyAtMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ1CiAgICAvLyBhID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgMjAgLy8gImEiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gdGhpcy5hLnZhbHVlID0gYTsKICAgIGZyYW1lX2RpZyAtNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwCiAgICAvLyByb3V0ZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOy8vIGlzIGRlcG9zaXQgb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDIxIC8vICJyb3V0ZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1OAogICAgLy8gdGhpcy5yb3V0ZXIudmFsdWUgPSByb3V0ZXI7CiAgICBmcmFtZV9kaWcgLTUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MQogICAgLy8gcHJpdmF0ZSBzdG9wQXV0aG9yaXR5ID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsvLyBjYW4gcmVzdHJpY3QgZGVwb3NpdCBvciB3aXRoZHJhdyBvcGVyYXRpb25zCiAgICBieXRlYyAyMiAvLyAic3RvcEF1dGhvcml0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjU5CiAgICAvLyB0aGlzLnN0b3BBdXRob3JpdHkudmFsdWUgPSBvd25lcjsKICAgIGZyYW1lX2RpZyAtNgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM5CiAgICAvLyBmZWVTaGFyZUJQID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgMTUgLy8gImZlZVNoYXJlQlAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo2MAogICAgLy8gdGhpcy5mZWVTaGFyZUJQLnZhbHVlID0gZmVlU2hhcmVCUDsKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzCiAgICAvLyBiYWxhbmNlUmF0aW9NaW5CUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDE2IC8vICJiYWxhbmNlUmF0aW9NaW5CUCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjYxCiAgICAvLyB0aGlzLmJhbGFuY2VSYXRpb01pbkJQLnZhbHVlID0gYmFsYW5jZVJhdGlvTWluQlA7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjMKICAgIC8vIGNvbnN0IGRlY2ltYWxzID0gdGhpcy5hc3NldC52YWx1ZS5kZWNpbWFsczsKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBTWVNURU1fUFJFQ0lTSU9OOiB1aW50NjQgPSAzOwogICAgcHVzaGludCAzIC8vIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjY0CiAgICAvLyB0aGlzLnRva2VuQW1vdW50UmVkdWNlLnZhbHVlID0gZGVjaW1hbHMgPiBTWVNURU1fUFJFQ0lTSU9OID8gMTAgKiogKGRlY2ltYWxzIC0gU1lTVEVNX1BSRUNJU0lPTikgOiAwOwogICAgPgogICAgYnogY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjAKICAgIC8vIGNvbnN0IFNZU1RFTV9QUkVDSVNJT046IHVpbnQ2NCA9IDM7CiAgICBwdXNoaW50IDMgLy8gMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjQKICAgIC8vIHRoaXMudG9rZW5BbW91bnRSZWR1Y2UudmFsdWUgPSBkZWNpbWFscyA+IFNZU1RFTV9QUkVDSVNJT04gPyAxMCAqKiAoZGVjaW1hbHMgLSBTWVNURU1fUFJFQ0lTSU9OKSA6IDA7CiAgICAtCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBzd2FwCiAgICBleHAKCmNyZWF0ZUFwcGxpY2F0aW9uX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ4CiAgICAvLyBwcml2YXRlIHRva2VuQW1vdW50UmVkdWNlID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgMjMgLy8gInRva2VuQW1vdW50UmVkdWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjQKICAgIC8vIHRoaXMudG9rZW5BbW91bnRSZWR1Y2UudmFsdWUgPSBkZWNpbWFscyA+IFNZU1RFTV9QUkVDSVNJT04gPyAxMCAqKiAoZGVjaW1hbHMgLSBTWVNURU1fUFJFQ0lTSU9OKSA6IDA7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIHRoaXMudG9rZW5BbW91bnRJbmNyZWFzZS52YWx1ZSA9IGRlY2ltYWxzIDwgU1lTVEVNX1BSRUNJU0lPTiA/IDEwICoqIChTWVNURU1fUFJFQ0lTSU9OIC0gZGVjaW1hbHMpIDogMDsKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMAogICAgLy8gY29uc3QgU1lTVEVNX1BSRUNJU0lPTjogdWludDY0ID0gMzsKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo2NQogICAgLy8gdGhpcy50b2tlbkFtb3VudEluY3JlYXNlLnZhbHVlID0gZGVjaW1hbHMgPCBTWVNURU1fUFJFQ0lTSU9OID8gMTAgKiogKFNZU1RFTV9QUkVDSVNJT04gLSBkZWNpbWFscykgOiAwOwogICAgPAogICAgYnogY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMAogICAgLy8gY29uc3QgU1lTVEVNX1BSRUNJU0lPTjogdWludDY0ID0gMzsKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo2NQogICAgLy8gdGhpcy50b2tlbkFtb3VudEluY3JlYXNlLnZhbHVlID0gZGVjaW1hbHMgPCBTWVNURU1fUFJFQ0lTSU9OID8gMTAgKiogKFNZU1RFTV9QUkVDSVNJT04gLSBkZWNpbWFscykgOiAwOwogICAgZnJhbWVfZGlnIDAKICAgIC0KICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIHN3YXAKICAgIGV4cAoKY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDkKICAgIC8vIHByaXZhdGUgdG9rZW5BbW91bnRJbmNyZWFzZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDI0IC8vICJ0b2tlbkFtb3VudEluY3JlYXNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIHRoaXMudG9rZW5BbW91bnRJbmNyZWFzZS52YWx1ZSA9IGRlY2ltYWxzIDwgU1lTVEVNX1BSRUNJU0lPTiA/IDEwICoqIChTWVNURU1fUFJFQ0lTSU9OIC0gZGVjaW1hbHMpIDogMDsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCmNyZWF0ZUFwcGxpY2F0aW9uX3Rlcm5hcnlfZmFsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjY1CiAgICAvLyB0aGlzLnRva2VuQW1vdW50SW5jcmVhc2UudmFsdWUgPSBkZWNpbWFscyA8IFNZU1RFTV9QUkVDSVNJT04gPyAxMCAqKiAoU1lTVEVNX1BSRUNJU0lPTiAtIGRlY2ltYWxzKSA6IDA7CiAgICBpbnRjXzAgLy8gMAogICAgYiBjcmVhdGVBcHBsaWNhdGlvbl90ZXJuYXJ5X21lcmdlQDYKCmNyZWF0ZUFwcGxpY2F0aW9uX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjY0CiAgICAvLyB0aGlzLnRva2VuQW1vdW50UmVkdWNlLnZhbHVlID0gZGVjaW1hbHMgPiBTWVNURU1fUFJFQ0lTSU9OID8gMTAgKiogKGRlY2ltYWxzIC0gU1lTVEVNX1BSRUNJU0lPTikgOiAwOwogICAgaW50Y18wIC8vIDAKICAgIGIgY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wub3B0SW5Ub0FwcGxpY2F0aW9uKCkgLT4gdm9pZDoKb3B0SW5Ub0FwcGxpY2F0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjgKICAgIC8vIG9wdEluVG9BcHBsaWNhdGlvbigpOiB2b2lkIHsKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIHN1cGVyLm9wdEluVG9BcHBsaWNhdGlvbihUeG4uc2VuZGVyKTsKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjQyCiAgICAvLyBpZiAoIXRoaXMuYmFsYW5jZSh0bykuaGFzVmFsdWUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NDIKICAgIC8vIGlmICghdGhpcy5iYWxhbmNlKHRvKS5oYXNWYWx1ZSkgewogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICBibnogb3B0SW5Ub0FwcGxpY2F0aW9uX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjQzCiAgICAvLyB0aGlzLmJhbGFuY2UodG8pLnZhbHVlID0gMDsKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NDMKICAgIC8vIHRoaXMuYmFsYW5jZSh0bykudmFsdWUgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIGFwcF9sb2NhbF9wdXQKCm9wdEluVG9BcHBsaWNhdGlvbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NDUKICAgIC8vIGlmICghdGhpcy51c2VyUmV3YXJkRGVidCh0bykuaGFzVmFsdWUpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjM0CiAgICAvLyB1c2VyUmV3YXJkRGVidCA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNSAvLyAidXNlclJld2FyZERlYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NDUKICAgIC8vIGlmICghdGhpcy51c2VyUmV3YXJkRGVidCh0bykuaGFzVmFsdWUpIHsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYm56IG9wdEluVG9BcHBsaWNhdGlvbl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo0NgogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWUgPSAwOwogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozNAogICAgLy8gdXNlclJld2FyZERlYnQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDUgLy8gInVzZXJSZXdhcmREZWJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjQ2CiAgICAvLyB0aGlzLnVzZXJSZXdhcmREZWJ0KHRvKS52YWx1ZSA9IDA7CiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2xvY2FsX3B1dAoKb3B0SW5Ub0FwcGxpY2F0aW9uX2FmdGVyX2lmX2Vsc2VANToKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLm9wdEluQXNzZXQoKSAtPiB2b2lkOgpvcHRJbkFzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NzgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6ODEtODcKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI3CiAgICAvLyBhc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjg1CiAgICAvLyBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBhc3NldEFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6ODEtODYKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjgxLTg3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo4OQogICAgLy8gbG9nKCdQb29sOiBvcHQtaW4gY29tcGxldGVkJyk7CiAgICBwdXNoYnl0ZXMgIlBvb2w6IG9wdC1pbiBjb21wbGV0ZWQiCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLm9ubHlSb3V0ZXIoKSAtPiB2b2lkOgpvbmx5Um91dGVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OTcKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLnJvdXRlci52YWx1ZS5ieXRlcywgJ1Bvb2w6IG9ubHkgcm91dGVyJyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MAogICAgLy8gcm91dGVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsvLyBpcyBkZXBvc2l0IG9wZXJhdGlvbiBhbGxvd2VkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInJvdXRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo5NwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMucm91dGVyLnZhbHVlLmJ5dGVzLCAnUG9vbDogb25seSByb3V0ZXInKTsKICAgID09CiAgICBhc3NlcnQgLy8gUG9vbDogb25seSByb3V0ZXIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLm9ubHlTdG9wQXV0aG9yaXR5KCkgLT4gdm9pZDoKb25seVN0b3BBdXRob3JpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMDEKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLnN0b3BBdXRob3JpdHkudmFsdWUuYnl0ZXMsICdQb29sOiBpcyBub3Qgc3RvcEF1dGhvcml0eScpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTEKICAgIC8vIHByaXZhdGUgc3RvcEF1dGhvcml0eSA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vICJzdG9wQXV0aG9yaXR5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjEwMQogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZS5ieXRlcywgJ1Bvb2w6IGlzIG5vdCBzdG9wQXV0aG9yaXR5Jyk7CiAgICA9PQogICAgYXNzZXJ0IC8vIFBvb2w6IGlzIG5vdCBzdG9wQXV0aG9yaXR5CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC52YWxpZGF0ZUJhbGFuY2VSYXRpbygpIC0+IHZvaWQ6CnZhbGlkYXRlQmFsYW5jZVJhdGlvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyBwcml2YXRlIHZhbGlkYXRlQmFsYW5jZVJhdGlvKCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMTAKICAgIC8vIGlmICh0b2tlbkJhbGFuY2UgPiB2VXNkQmFsYW5jZSkgewogICAgPgogICAgYnogdmFsaWRhdGVCYWxhbmNlUmF0aW9fZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gYXNzZXJ0KCh2VXNkQmFsYW5jZSAqIEJQKSAvIHRva2VuQmFsYW5jZSA+PSB0aGlzLmJhbGFuY2VSYXRpb01pbkJQLnZhbHVlLCAnUG9vbDogbG93IHZVU0QgYmFsYW5jZScpOwogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxOQogICAgLy8gZXhwb3J0IGNvbnN0IEJQOiB1aW50NjQgPSAxMF8wMDA7CiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gYXNzZXJ0KCh2VXNkQmFsYW5jZSAqIEJQKSAvIHRva2VuQmFsYW5jZSA+PSB0aGlzLmJhbGFuY2VSYXRpb01pbkJQLnZhbHVlLCAnUG9vbDogbG93IHZVU0QgYmFsYW5jZScpOwogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzCiAgICAvLyBiYWxhbmNlUmF0aW9NaW5CUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiYmFsYW5jZVJhdGlvTWluQlAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTExCiAgICAvLyBhc3NlcnQoKHZVc2RCYWxhbmNlICogQlApIC8gdG9rZW5CYWxhbmNlID49IHRoaXMuYmFsYW5jZVJhdGlvTWluQlAudmFsdWUsICdQb29sOiBsb3cgdlVTRCBiYWxhbmNlJyk7CiAgICA+PQogICAgYXNzZXJ0IC8vIFBvb2w6IGxvdyB2VVNEIGJhbGFuY2UKCnZhbGlkYXRlQmFsYW5jZVJhdGlvX2FmdGVyX2lmX2Vsc2VANToKICAgIHJldHN1YgoKdmFsaWRhdGVCYWxhbmNlUmF0aW9fZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMTIKICAgIC8vIH0gZWxzZSBpZiAodG9rZW5CYWxhbmNlIDwgdlVzZEJhbGFuY2UpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogdmFsaWRhdGVCYWxhbmNlUmF0aW9fYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMTMKICAgIC8vIGFzc2VydCgodG9rZW5CYWxhbmNlICogQlApIC8gdlVzZEJhbGFuY2UgPj0gdGhpcy5iYWxhbmNlUmF0aW9NaW5CUC52YWx1ZSwgJ1Bvb2w6IGxvdyB0b2tlbiBiYWxhbmNlJyk7CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTEzCiAgICAvLyBhc3NlcnQoKHRva2VuQmFsYW5jZSAqIEJQKSAvIHZVc2RCYWxhbmNlID49IHRoaXMuYmFsYW5jZVJhdGlvTWluQlAudmFsdWUsICdQb29sOiBsb3cgdG9rZW4gYmFsYW5jZScpOwogICAgKgogICAgZnJhbWVfZGlnIDEKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzCiAgICAvLyBiYWxhbmNlUmF0aW9NaW5CUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiYmFsYW5jZVJhdGlvTWluQlAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTEzCiAgICAvLyBhc3NlcnQoKHRva2VuQmFsYW5jZSAqIEJQKSAvIHZVc2RCYWxhbmNlID49IHRoaXMuYmFsYW5jZVJhdGlvTWluQlAudmFsdWUsICdQb29sOiBsb3cgdG9rZW4gYmFsYW5jZScpOwogICAgPj0KICAgIGFzc2VydCAvLyBQb29sOiBsb3cgdG9rZW4gYmFsYW5jZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuZGVwb3NpdCgpIC0+IHZvaWQ6CmRlcG9zaXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMjktMTMwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlcG9zaXQoKTogdm9pZCB7CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUyCiAgICAvLyBjYW5EZXBvc2l0ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7Ly8gaXMgZGVwb3NpdCBvcGVyYXRpb24gYWxsb3dlZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJjYW5EZXBvc2l0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gYXNzZXJ0KHRoaXMuY2FuRGVwb3NpdC52YWx1ZSwgJ1Bvb2w6IGRlcG9zaXQgcHJvaGliaXRlZCcpOwogICAgYXNzZXJ0IC8vIFBvb2w6IGRlcG9zaXQgcHJvaGliaXRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDYKICAgIC8vIGQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzYKICAgIC8vIGFzc2VydChUeG4uZ3JvdXBJbmRleCA+IDAsIGBBc3NldCB0eG4gbWlzc2luZ2ApOwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGFzc2VydCAvLyBBc3NldCB0eG4gbWlzc2luZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjM5CiAgICAvLyBjb25zdCBwcmV2SWR4OiB1aW50NjQgPSBUeG4uZ3JvdXBJbmRleCAtIDE7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo0MQogICAgLy8gY29uc3QgcGF5ID0gZ3R4bi5Bc3NldFRyYW5zZmVyVHhuKHByZXZJZHgpOwogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18zIC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo0NAogICAgLy8gYXNzZXJ0KHBheS5hc3NldFJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgYEFzc2V0IG11c3QgZ28gdG8gYXBwYCk7CiAgICBkdXAKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEFzc2V0IG11c3QgZ28gdG8gYXBwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDUKICAgIC8vIGFzc2VydChwYXkueGZlckFzc2V0LmlkID09PSBhc3NldElkLCBgV3JvbmcgYXNzZXRgKTsKICAgIGR1cAogICAgZ3R4bnMgWGZlckFzc2V0CiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo0OAogICAgLy8gYXNzZXJ0KHBheS5yZWtleVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsIGBSZWtleSBub3QgYWxsb3dlZGApOwogICAgZHVwCiAgICBndHhucyBSZWtleVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gUmVrZXkgbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo0OQogICAgLy8gYXNzZXJ0KHBheS5hc3NldENsb3NlVG8gPT09IEdsb2JhbC56ZXJvQWRkcmVzcywgYENsb3NlVG8gbm90IGFsbG93ZWRgKTsKICAgIGR1cAogICAgZ3R4bnMgQXNzZXRDbG9zZVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gQ2xvc2VUbyBub3QgYWxsb3dlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjUwCiAgICAvLyByZXR1cm4gcGF5LmFzc2V0QW1vdW50OwogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjEzNgogICAgLy8gY29uc3QgYW1vdW50U1AgPSB0aGlzLnRvU3lzdGVtUHJlY2lzaW9uKGFtb3VudCk7CiAgICBjYWxsc3ViIHRvU3lzdGVtUHJlY2lzaW9uCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjEzNwogICAgLy8gYXNzZXJ0KGFtb3VudFNQID4gMCwgJ1Bvb2w6IHRvbyBsaXR0bGUnKTsKICAgIGR1cAogICAgYXNzZXJ0IC8vIFBvb2w6IHRvbyBsaXR0bGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTQwCiAgICAvLyB0aGlzLnJlc2VydmVzLnZhbHVlICs9IGFtb3VudFNQOwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIHJlc2VydmVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTQwCiAgICAvLyB0aGlzLnJlc2VydmVzLnZhbHVlICs9IGFtb3VudFNQOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciA0CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNDUKICAgIC8vIGNvbnN0IG9sZEJhbGFuY2U6IHVpbnQ2NCA9ICh0b2tlbkJhbGFuY2UgKyB2VXNkQmFsYW5jZSk7CiAgICArCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNDYKICAgIC8vIGlmIChvbGREID09PSAwIHx8IG9sZEJhbGFuY2UgPT09IDApIHsKICAgIGJ6IGRlcG9zaXRfaWZfYm9keUAyCiAgICBmcmFtZV9kaWcgNAogICAgYm56IGRlcG9zaXRfZWxzZV9ib2R5QDMKCmRlcG9zaXRfaWZfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBoYWxmQW1vdW50OiB1aW50NjQgPSBhbW91bnRTUCA+PiAxOwogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICBzaHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNDkKICAgIC8vIHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICs9IGhhbGZBbW91bnQ7CiAgICBkaWcgMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIHRva2VuQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNDkKICAgIC8vIHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICs9IGhhbGZBbW91bnQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDIKICAgIC8vIHZVc2RCYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNTAKICAgIC8vIHRoaXMudlVzZEJhbGFuY2UudmFsdWUgKz0gaGFsZkFtb3VudDsKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE1MAogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSArPSBoYWxmQW1vdW50OwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmRlcG9zaXRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyB0aGlzLnVwZGF0ZUQoKTsKICAgIGNhbGxzdWIgdXBkYXRlRAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTU4CiAgICAvLyB0aGlzLmRlcG9zaXRMcChUeG4uc2VuZGVyLCB0aGlzLmQudmFsdWUgLSBvbGREKTsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE1OAogICAgLy8gdGhpcy5kZXBvc2l0THAoVHhuLnNlbmRlciwgdGhpcy5kLnZhbHVlIC0gb2xkRCk7CiAgICBmcmFtZV9kaWcgMAogICAgLQogICAgY2FsbHN1YiBkZXBvc2l0THAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMQogICAgLy8gY29uc3QgTUFYX1RPS0VOX0JBTEFOQ0U6IHVpbnQ2NCA9IDIgKiogNDA7IC8vIE1heCBwb3NzaWJsZSB0b2tlbiBiYWxhbmNlCiAgICBwdXNoaW50IDEwOTk1MTE2Mjc3NzYgLy8gMTA5OTUxMTYyNzc3NgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTYwCiAgICAvLyBhc3NlcnQodGhpcy50b2tlbkJhbGFuY2UudmFsdWUgPCBNQVhfVE9LRU5fQkFMQU5DRSwgJ1Bvb2w6IHRvbyBtdWNoJyk7CiAgICA8CiAgICBhc3NlcnQgLy8gUG9vbDogdG9vIG11Y2gKICAgIHJldHN1YgoKZGVwb3NpdF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNTMKICAgIC8vIHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICs9IG5ldyBVaW50TjY0KChCaWdVaW50KGFtb3VudFNQKSAqIEJpZ1VpbnQodG9rZW5CYWxhbmNlKSkgLyBCaWdVaW50KG9sZEJhbGFuY2UpKS5uYXRpdmU7CiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgZnJhbWVfZGlnIDIKICAgIGl0b2IKICAgIGRpZyAxCiAgICBiKgogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBiLwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gOAogICAgYnplcm8KICAgIHN3YXAKICAgIGRpZyAxCiAgICBifAogICAgYnRvaQogICAgdW5jb3ZlciA0CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE1MwogICAgLy8gdGhpcy50b2tlbkJhbGFuY2UudmFsdWUgKz0gbmV3IFVpbnRONjQoKEJpZ1VpbnQoYW1vdW50U1ApICogQmlnVWludCh0b2tlbkJhbGFuY2UpKSAvIEJpZ1VpbnQob2xkQmFsYW5jZSkpLm5hdGl2ZTsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE1NAogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSArPSBuZXcgVWludE42NCgoQmlnVWludChhbW91bnRTUCkgKiBCaWdVaW50KHZVc2RCYWxhbmNlKSkgLyBCaWdVaW50KG9sZEJhbGFuY2UpKS5uYXRpdmU7CiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgdW5jb3ZlciA0CiAgICBiKgogICAgdW5jb3ZlciAzCiAgICBiLwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBidG9pCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNTQKICAgIC8vIHRoaXMudlVzZEJhbGFuY2UudmFsdWUgKz0gbmV3IFVpbnRONjQoKEJpZ1VpbnQoYW1vdW50U1ApICogQmlnVWludCh2VXNkQmFsYW5jZSkpIC8gQmlnVWludChvbGRCYWxhbmNlKSkubmF0aXZlOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgZGVwb3NpdF9hZnRlcl9pZl9lbHNlQDQKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC53aXRoZHJhdyhhbW91bnRMcDogdWludDY0KSAtPiB2b2lkOgp3aXRoZHJhdzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE2OC0xNjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gd2l0aGRyYXcoYW1vdW50THA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MwogICAgLy8gY2FuV2l0aGRyYXcgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyB3aXRoZHJhd24gb3BlcmF0aW9uIGFsbG93ZWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAiY2FuV2l0aGRyYXciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTIyCiAgICAvLyBhc3NlcnQodGhpcy5jYW5XaXRoZHJhdy52YWx1ZSwgJyJQb29sOiB3aXRoZHJhdyBwcm9oaWJpdGVkJyk7CiAgICBhc3NlcnQgLy8gIlBvb2w6IHdpdGhkcmF3IHByb2hpYml0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE3MwogICAgLy8gdGhpcy53aXRoZHJhd0xwKFR4bi5zZW5kZXIsIGFtb3VudExwKTsKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEyNgogICAgLy8gbGV0IHVzZXJMcEFtb3VudCA9IHRoaXMuYmFsYW5jZShmcm9tKS52YWx1ZTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTI2CiAgICAvLyBsZXQgdXNlckxwQW1vdW50ID0gdGhpcy5iYWxhbmNlKGZyb20pLnZhbHVlOwogICAgYXBwX2xvY2FsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEyNwogICAgLy8gYXNzZXJ0KHVzZXJMcEFtb3VudCA+PSBscEFtb3VudCwgJ1Jld2FyZE1hbmFnZXI6IG5vdCBlbm91Z2ggYW1vdW50Jyk7CiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgPj0KICAgIGFzc2VydCAvLyBSZXdhcmRNYW5hZ2VyOiBub3QgZW5vdWdoIGFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMwCiAgICAvLyBhY2NSZXdhcmRQZXJTaGFyZVAgPSBHbG9iYWxTdGF0ZTxiaWd1aW50Pih7IGluaXRpYWxWYWx1ZTogMG4gfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiYWNjUmV3YXJkUGVyU2hhcmVQIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMjkKICAgIC8vIGxldCBwZW5kaW5nOiB1aW50NjQgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzAKICAgIC8vIGlmICh1c2VyTHBBbW91bnQgPiAwKSB7CiAgICBieiB3aXRoZHJhd19hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzEKICAgIC8vIHBlbmRpbmcgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQoZnJvbSkudmFsdWU7CiAgICBmcmFtZV9kaWcgMgogICAgaXRvYgogICAgZnJhbWVfZGlnIDMKICAgIGIqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjAKICAgIC8vIGNvbnN0IFBfU0NBTEU6IGJpZ3VpbnQgPSBCaWdVaW50KDEgPDwgUCk7CiAgICBieXRlYyA5IC8vIDB4MDEwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzEKICAgIC8vIHBlbmRpbmcgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQoZnJvbSkudmFsdWU7CiAgICBiLwogICAgY2FsbHN1YiBiaWd1aW50VG9VaW50NjRNb2R1bG8KICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjM0CiAgICAvLyB1c2VyUmV3YXJkRGVidCA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNSAvLyAidXNlclJld2FyZERlYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTMxCiAgICAvLyBwZW5kaW5nID0gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVApIC8gUF9TQ0FMRSkgLSB0aGlzLnVzZXJSZXdhcmREZWJ0KGZyb20pLnZhbHVlOwogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAtCiAgICBmcmFtZV9idXJ5IDQKCndpdGhkcmF3X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzMKICAgIC8vIHVzZXJMcEFtb3VudCAtPSBscEFtb3VudDsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzQKICAgIC8vIHRoaXMuYmFsYW5jZShmcm9tKS52YWx1ZSAtPSBscEFtb3VudDsKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTM0CiAgICAvLyB0aGlzLmJhbGFuY2UoZnJvbSkudmFsdWUgLT0gbHBBbW91bnQ7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMwogICAgLy8gYmFsYW5jZSA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNCAvLyAiYmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzQKICAgIC8vIHRoaXMuYmFsYW5jZShmcm9tKS52YWx1ZSAtPSBscEFtb3VudDsKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAidG90YWxTdXBwbHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEzNQogICAgLy8gdGhpcy50b3RhbFN1cHBseS52YWx1ZSAtPSBscEFtb3VudDsKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlYyA3IC8vICJ0b3RhbFN1cHBseSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzUKICAgIC8vIHRoaXMudG90YWxTdXBwbHkudmFsdWUgLT0gbHBBbW91bnQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEzNgogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidChmcm9tKS52YWx1ZSA9IGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVAgLyBQX1NDQUxFKTsKICAgIHN3YXAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAzCiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBQX1NDQUxFOiBiaWd1aW50ID0gQmlnVWludCgxIDw8IFApOwogICAgYnl0ZWMgOSAvLyAweDAxMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTM2CiAgICAvLyB0aGlzLnVzZXJSZXdhcmREZWJ0KGZyb20pLnZhbHVlID0gYmlndWludFRvVWludDY0TW9kdWxvKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCAvIFBfU0NBTEUpOwogICAgYi8KICAgIGNhbGxzdWIgYmlndWludFRvVWludDY0TW9kdWxvCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzQKICAgIC8vIHVzZXJSZXdhcmREZWJ0ID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA1IC8vICJ1c2VyUmV3YXJkRGVidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzYKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQoZnJvbSkudmFsdWUgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oQmlnVWludCh1c2VyTHBBbW91bnQpICogYWNjUmV3YXJkUGVyU2hhcmVQIC8gUF9TQ0FMRSk7CiAgICBzd2FwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTM3CiAgICAvLyBpZiAocGVuZGluZyA+IDApIHsKICAgIGZyYW1lX2RpZyA0CiAgICBieiB3aXRoZHJhd19hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzgKICAgIC8vIGFzc2V0VHJhbnNmZXIoeyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsIGFzc2V0QW1vdW50OiBwZW5kaW5nLCBhc3NldFJlY2VpdmVyOiBmcm9tIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI3CiAgICAvLyBhc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzgKICAgIC8vIGFzc2V0VHJhbnNmZXIoeyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsIGFzc2V0QW1vdW50OiBwZW5kaW5nLCBhc3NldFJlY2VpdmVyOiBmcm9tIH0pLnN1Ym1pdCgpOwogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzkKICAgIC8vIGVtaXQ8UmV3YXJkc0NsYWltZWQ+KHsgdXNlcjogbmV3IEFkZHJlc3MoZnJvbSksIHBlbmRpbmcgfSk7CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDI1IC8vIG1ldGhvZCAiUmV3YXJkc0NsYWltZWQoYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKCndpdGhkcmF3X2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxNDEKICAgIC8vIGVtaXQ8V2l0aGRyYXc+KHsgZnJvbTogbmV3IEFkZHJlc3MoZnJvbSksIGxwQW1vdW50IH0pOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMQogICAgZGlnIDEKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4ZDNhZmE0ZjEgLy8gbWV0aG9kICJXaXRoZHJhdyhhZGRyZXNzLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIHRva2VuQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTgxCiAgICAvLyBjb25zdCBvbGRCYWxhbmNlOiB1aW50NjQgPSAodG9rZW5CYWxhbmNlICsgdlVzZEJhbGFuY2UpOwogICAgZHVwMgogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIHRva2VuQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE4MgogICAgLy8gdGhpcy50b2tlbkJhbGFuY2UudmFsdWUgLT0gbmV3IFVpbnRONjQoKEJpZ1VpbnQoYW1vdW50THApICogQmlnVWludCh0b2tlbkJhbGFuY2UpKSAvIEJpZ1VpbnQob2xkQmFsYW5jZSkpLm5hdGl2ZTsKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgZGlnIDQKICAgIGIqCiAgICBkaWcgMgogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGIvCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA4CiAgICBiemVybwogICAgc3dhcAogICAgZGlnIDEKICAgIGJ8CiAgICBidG9pCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyB0aGlzLnRva2VuQmFsYW5jZS52YWx1ZSAtPSBuZXcgVWludE42NCgoQmlnVWludChhbW91bnRMcCkgKiBCaWdVaW50KHRva2VuQmFsYW5jZSkpIC8gQmlnVWludChvbGRCYWxhbmNlKSkubmF0aXZlOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTgzCiAgICAvLyB0aGlzLnZVc2RCYWxhbmNlLnZhbHVlIC09IG5ldyBVaW50TjY0KChCaWdVaW50KGFtb3VudExwKSAqIEJpZ1VpbnQodlVzZEJhbGFuY2UpKSAvIEJpZ1VpbnQob2xkQmFsYW5jZSkpLm5hdGl2ZTsKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgdW5jb3ZlciA1CiAgICBiKgogICAgdW5jb3ZlciAzCiAgICBiLwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBidG9pCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxODMKICAgIC8vIHRoaXMudlVzZEJhbGFuY2UudmFsdWUgLT0gbmV3IFVpbnRONjQoKEJpZ1VpbnQoYW1vdW50THApICogQmlnVWludCh2VXNkQmFsYW5jZSkpIC8gQmlnVWludChvbGRCYWxhbmNlKSkubmF0aXZlOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE4NQogICAgLy8gYXNzZXJ0KHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICsgdGhpcy52VXNkQmFsYW5jZS52YWx1ZSA8IG9sZEJhbGFuY2UsICdQb29sOiB6ZXJvIGNoYW5nZXMnKTsKICAgICsKICAgID4KICAgIGFzc2VydCAvLyBQb29sOiB6ZXJvIGNoYW5nZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTg4CiAgICAvLyBhc3NlcnQoYW1vdW50THAgPD0gdGhpcy5yZXNlcnZlcy52YWx1ZSwgJ1Bvb2w6IHJlc2VydmVzJyk7CiAgICBmcmFtZV9kaWcgLTEKICAgID49CiAgICBhc3NlcnQgLy8gUG9vbDogcmVzZXJ2ZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTkxCiAgICAvLyB0aGlzLnJlc2VydmVzLnZhbHVlIC09IGFtb3VudExwOwogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NAogICAgLy8gcmVzZXJ2ZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxOTEKICAgIC8vIHRoaXMucmVzZXJ2ZXMudmFsdWUgLT0gYW1vdW50THA7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTk0CiAgICAvLyB0aGlzLnVwZGF0ZUQoKTsKICAgIGNhbGxzdWIgdXBkYXRlRAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDYKICAgIC8vIGQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTk1CiAgICAvLyBhc3NlcnQodGhpcy5kLnZhbHVlIDwgb2xkRCwgJ1Bvb2w6IHplcm8gRCBjaGFuZ2VzJyk7CiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYXNzZXJ0IC8vIFBvb2w6IHplcm8gRCBjaGFuZ2VzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxOTctMjAxCiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsCiAgICAvLyAgIGFzc2V0QW1vdW50OiB0aGlzLmZyb21TeXN0ZW1QcmVjaXNpb24oYW1vdW50THApLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTk5CiAgICAvLyBhc3NldEFtb3VudDogdGhpcy5mcm9tU3lzdGVtUHJlY2lzaW9uKGFtb3VudExwKSwKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBmcm9tU3lzdGVtUHJlY2lzaW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMDAKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxOTctMjAxCiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsCiAgICAvLyAgIGFzc2V0QW1vdW50OiB0aGlzLmZyb21TeXN0ZW1QcmVjaXNpb24oYW1vdW50THApLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuc3dhcFRvVlVzZCh1c2VyOiBieXRlcywgYW1vdW50OiB1aW50NjQsIHplcm9GZWU6IHVpbnQ2NCkgLT4gdWludDY0Ogpzd2FwVG9WVXNkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjEzLTIxNwogICAgLy8gc3dhcFRvVlVzZCgKICAgIC8vICAgdXNlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHplcm9GZWU6IGJvb2xlYW4sCiAgICAvLyApOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIxOAogICAgLy8gdGhpcy5vbmx5Um91dGVyKCk7CiAgICBjYWxsc3ViIG9ubHlSb3V0ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIyMAogICAgLy8gbGV0IHJlc3VsdDogdWludDY0ID0gMDsgLy8gMCBieSBkZWZhdWx0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjIwLTIyMQogICAgLy8gbGV0IHJlc3VsdDogdWludDY0ID0gMDsgLy8gMCBieSBkZWZhdWx0CiAgICAvLyBsZXQgZmVlOiB1aW50NjQgPSAwOwogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMjIKICAgIC8vIGlmIChhbW91bnQgPiAwKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIGJ6IHN3YXBUb1ZVc2RfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMjMKICAgIC8vIGlmICghemVyb0ZlZSkgewogICAgZnJhbWVfZGlnIC0xCiAgICBibnogc3dhcFRvVlVzZF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM5CiAgICAvLyBmZWVTaGFyZUJQID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJmZWVTaGFyZUJQIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIyNAogICAgLy8gZmVlID0gKGFtb3VudCAqIHRoaXMuZmVlU2hhcmVCUC52YWx1ZSkgLyBCUDsKICAgIGZyYW1lX2RpZyAtMgogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjI0CiAgICAvLyBmZWUgPSAoYW1vdW50ICogdGhpcy5mZWVTaGFyZUJQLnZhbHVlKSAvIEJQOwogICAgLwogICAgZnJhbWVfYnVyeSAyCgpzd2FwVG9WVXNkX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIyNgogICAgLy8gY29uc3QgYW1vdW50SW4gPSB0aGlzLnRvU3lzdGVtUHJlY2lzaW9uKGFtb3VudCAtIGZlZSk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICAtCiAgICBjYWxsc3ViIHRvU3lzdGVtUHJlY2lzaW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMjgKICAgIC8vIGZlZSA9IGFtb3VudCAtIHRoaXMuZnJvbVN5c3RlbVByZWNpc2lvbihhbW91bnRJbik7CiAgICBkdXAKICAgIGNhbGxzdWIgZnJvbVN5c3RlbVByZWNpc2lvbgogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICAtCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMzEKICAgIC8vIHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICs9IGFtb3VudEluOwogICAgZGlnIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjMxCiAgICAvLyB0aGlzLnRva2VuQmFsYW5jZS52YWx1ZSArPSBhbW91bnRJbjsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NAogICAgLy8gcmVzZXJ2ZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzMgogICAgLy8gdGhpcy5yZXNlcnZlcy52YWx1ZSArPSBhbW91bnRJbjsKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18zIC8vICJyZXNlcnZlcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzMgogICAgLy8gdGhpcy5yZXNlcnZlcy52YWx1ZSArPSBhbW91bnRJbjsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjM0CiAgICAvLyBjb25zdCB2VXNkTmV3QW1vdW50ID0gdGhpcy5nZXRZKHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlKTsKICAgIGNhbGxzdWIgZ2V0WQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjM1CiAgICAvLyBpZiAodGhpcy52VXNkQmFsYW5jZS52YWx1ZSA+IHZVc2ROZXdBbW91bnQpIHsKICAgIDwKICAgIGJ6IHN3YXBUb1ZVc2RfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gcmVzdWx0ID0gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSAtIHZVc2ROZXdBbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgLQogICAgZnJhbWVfYnVyeSAxCgpzd2FwVG9WVXNkX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzOAogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSA9IHZVc2ROZXdBbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzOQogICAgLy8gdGhpcy5hZGRSZXdhcmRzKGZlZSk7CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjYWxsc3ViIGFkZFJld2FyZHMKICAgIGZyYW1lX2J1cnkgMwogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgNAoKc3dhcFRvVlVzZF9hZnRlcl9pZl9lbHNlQDY6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNDIKICAgIC8vIGVtaXQ8U3dhcHBlZFRvVlVzZD4oeyBzZW5kZXI6IHVzZXIsIHRva2VuSWQ6IHRoaXMuYXNzZXQudmFsdWUuaWQsIGFtb3VudCwgdlVzZEFtb3VudDogcmVzdWx0LCBmZWUgfSk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgyYmJiZWNhMyAvLyBtZXRob2QgIlN3YXBwZWRUb1ZVc2QoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI0NAogICAgLy8gdGhpcy52YWxpZGF0ZUJhbGFuY2VSYXRpbygpOwogICAgY2FsbHN1YiB2YWxpZGF0ZUJhbGFuY2VSYXRpbwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjQ1CiAgICAvLyByZXR1cm4gcmVzdWx0OwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zd2FwRnJvbVZVc2QodXNlcjogYnl0ZXMsIGFtb3VudDogdWludDY0LCByZWNlaXZlQW1vdW50TWluOiB1aW50NjQsIHplcm9GZWU6IHVpbnQ2NCkgLT4gdWludDY0Ogpzd2FwRnJvbVZVc2Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNTktMjY0CiAgICAvLyBzd2FwRnJvbVZVc2QoCiAgICAvLyAgIHVzZXI6IEFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogdWludDY0LAogICAgLy8gICByZWNlaXZlQW1vdW50TWluOiB1aW50NjQsCiAgICAvLyAgIHplcm9GZWU6IGJvb2xlYW4sCiAgICAvLyApOiB1aW50NjQgewogICAgcHJvdG8gNCAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjY1CiAgICAvLyB0aGlzLm9ubHlSb3V0ZXIoKTsKICAgIGNhbGxzdWIgb25seVJvdXRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjY3CiAgICAvLyBsZXQgcmVzdWx0U1A6IHVpbnQ2NCA9IDA7IC8vIDAgYnkgZGVmYXVsdAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI2OC0yNjkKICAgIC8vIGxldCByZXN1bHQ6IHVpbnQ2NCA9IDA7IC8vIDAgYnkgZGVmYXVsdAogICAgLy8gbGV0IGZlZTogdWludDY0ID0gMDsKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjcwCiAgICAvLyBpZiAoYW1vdW50ID4gMCkgewogICAgZnJhbWVfZGlnIC0zCiAgICBieiBzd2FwRnJvbVZVc2RfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI3MQogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSArPSBhbW91bnQ7CiAgICBmcmFtZV9kaWcgLTMKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI3MQogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSArPSBhbW91bnQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDIKICAgIC8vIHZVc2RCYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNzIKICAgIC8vIGNvbnN0IG5ld0Ftb3VudCA9IHRoaXMuZ2V0WSh0aGlzLnZVc2RCYWxhbmNlLnZhbHVlKTsKICAgIGNhbGxzdWIgZ2V0WQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjc0CiAgICAvLyBpZiAodG9rZW5CYWxhbmNlID4gbmV3QW1vdW50KSB7CiAgICA8CiAgICBieiBzd2FwRnJvbVZVc2RfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNzUKICAgIC8vIHJlc3VsdFNQID0gdG9rZW5CYWxhbmNlIC0gbmV3QW1vdW50OwogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyByZXN1bHQgPSB0aGlzLmZyb21TeXN0ZW1QcmVjaXNpb24ocmVzdWx0U1ApOwogICAgY2FsbHN1YiBmcm9tU3lzdGVtUHJlY2lzaW9uCiAgICBmcmFtZV9idXJ5IDMKCnN3YXBGcm9tVlVzZF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NAogICAgLy8gcmVzZXJ2ZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4MAogICAgLy8gYXNzZXJ0KHJlc3VsdFNQIDw9IHRoaXMucmVzZXJ2ZXMudmFsdWUsICdQb29sOiByZXNlcnZlcycpOwogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICA8PQogICAgYXNzZXJ0IC8vIFBvb2w6IHJlc2VydmVzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NAogICAgLy8gcmVzZXJ2ZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4MgogICAgLy8gdGhpcy5yZXNlcnZlcy52YWx1ZSAtPSByZXN1bHRTUDsKICAgIHN3YXAKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18zIC8vICJyZXNlcnZlcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4MgogICAgLy8gdGhpcy5yZXNlcnZlcy52YWx1ZSAtPSByZXN1bHRTUDsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyODMKICAgIC8vIGlmICghemVyb0ZlZSkgewogICAgZnJhbWVfZGlnIC0xCiAgICBibnogc3dhcEZyb21WVXNkX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzkKICAgIC8vIGZlZVNoYXJlQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gImZlZVNoYXJlQlAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjg0CiAgICAvLyBmZWUgPSAocmVzdWx0ICogdGhpcy5mZWVTaGFyZUJQLnZhbHVlKSAvIEJQOwogICAgZnJhbWVfZGlnIDMKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxOQogICAgLy8gZXhwb3J0IGNvbnN0IEJQOiB1aW50NjQgPSAxMF8wMDA7CiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4NAogICAgLy8gZmVlID0gKHJlc3VsdCAqIHRoaXMuZmVlU2hhcmVCUC52YWx1ZSkgLyBCUDsKICAgIC8KICAgIGZyYW1lX2J1cnkgNAoKc3dhcEZyb21WVXNkX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4NwogICAgLy8gcmVzdWx0IC09IGZlZTsKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4OQogICAgLy8gdGhpcy50b2tlbkJhbGFuY2UudmFsdWUgPSBuZXdBbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI5MAogICAgLy8gYXNzZXJ0KHJlc3VsdCA+PSByZWNlaXZlQW1vdW50TWluLCAnUG9vbDogc2xpcHBhZ2UnKTsKICAgIGR1cAogICAgZnJhbWVfZGlnIC0yCiAgICA+PQogICAgYXNzZXJ0IC8vIFBvb2w6IHNsaXBwYWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyOTEtMjk1CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsCiAgICAvLyAgIGFzc2V0QW1vdW50OiByZXN1bHQsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHVzZXIubmF0aXZlLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIC00CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjkxLTI5NQogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgeGZlckFzc2V0OiB0aGlzLmFzc2V0LnZhbHVlLAogICAgLy8gICBhc3NldEFtb3VudDogcmVzdWx0LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB1c2VyLm5hdGl2ZSwKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI5NgogICAgLy8gdGhpcy5hZGRSZXdhcmRzKGZlZSk7CiAgICBkaWcgMQogICAgY2FsbHN1YiBhZGRSZXdhcmRzCiAgICBmcmFtZV9idXJ5IDYKICAgIGZyYW1lX2J1cnkgNQoKc3dhcEZyb21WVXNkX2FmdGVyX2lmX2Vsc2VANzoKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI3CiAgICAvLyBhc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI5OAogICAgLy8gZW1pdDxTd2FwcGVkRnJvbVZVc2Q+KHsgcmVjaXBpZW50OiB1c2VyLCB0b2tlbklkOiB0aGlzLmFzc2V0LnZhbHVlLmlkLCB2VXNkQW1vdW50OiBhbW91bnQsIGFtb3VudDogcmVzdWx0LCBmZWUgfSk7CiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtNAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHhkM2YxZDU0MiAvLyBtZXRob2QgIlN3YXBwZWRGcm9tVlVzZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzAwCiAgICAvLyB0aGlzLnZhbGlkYXRlQmFsYW5jZVJhdGlvKCk7CiAgICBjYWxsc3ViIHZhbGlkYXRlQmFsYW5jZVJhdGlvCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDEKICAgIC8vIHJldHVybiByZXN1bHQ7CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnNldEZlZVNoYXJlKGZlZVNoYXJlQlA6IHVpbnQ2NCkgLT4gdm9pZDoKc2V0RmVlU2hhcmU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDcKICAgIC8vIHNldEZlZVNoYXJlKGZlZVNoYXJlQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzA5CiAgICAvLyBhc3NlcnQoZmVlU2hhcmVCUCA8PSBCUCwgJ1Bvb2w6IHRvbyBsYXJnZScpOwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTkKICAgIC8vIGV4cG9ydCBjb25zdCBCUDogdWludDY0ID0gMTBfMDAwOwogICAgaW50YyA0IC8vIDEwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDkKICAgIC8vIGFzc2VydChmZWVTaGFyZUJQIDw9IEJQLCAnUG9vbDogdG9vIGxhcmdlJyk7CiAgICA8PQogICAgYXNzZXJ0IC8vIFBvb2w6IHRvbyBsYXJnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzkKICAgIC8vIGZlZVNoYXJlQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyAxNSAvLyAiZmVlU2hhcmVCUCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMxMAogICAgLy8gdGhpcy5mZWVTaGFyZUJQLnZhbHVlID0gZmVlU2hhcmVCUDsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLmFkanVzdFRvdGFsTHBBbW91bnQoKSAtPiB2b2lkOgphZGp1c3RUb3RhbExwQW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzEzCiAgICAvLyBhZGp1c3RUb3RhbExwQW1vdW50KCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMTQKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDYKICAgIC8vIGQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyOQogICAgLy8gdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsU3VwcGx5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgMwogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzE4CiAgICAvLyBpZiAoZCA+IHRvdGFsU3VwcGx5KSB7CiAgICA+CiAgICBieiBhZGp1c3RUb3RhbExwQW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzE5CiAgICAvLyB0aGlzLmRlcG9zaXRMcChUeG4uc2VuZGVyLCBkIC0gdG90YWxTdXBwbHkpOwogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICBjYWxsc3ViIGRlcG9zaXRMcAoKYWRqdXN0VG90YWxMcEFtb3VudF9hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zZXRCYWxhbmNlUmF0aW9NaW5CUChiYWxhbmNlUmF0aW9NaW5CUDogdWludDY0KSAtPiB2b2lkOgpzZXRCYWxhbmNlUmF0aW9NaW5CUDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gc2V0QmFsYW5jZVJhdGlvTWluQlAoYmFsYW5jZVJhdGlvTWluQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMjcKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzI4CiAgICAvLyBhc3NlcnQoYmFsYW5jZVJhdGlvTWluQlAgPD0gQlAsICdQb29sOiB0b28gbGFyZ2UnKTsKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzI4CiAgICAvLyBhc3NlcnQoYmFsYW5jZVJhdGlvTWluQlAgPD0gQlAsICdQb29sOiB0b28gbGFyZ2UnKTsKICAgIDw9CiAgICBhc3NlcnQgLy8gUG9vbDogdG9vIGxhcmdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MwogICAgLy8gYmFsYW5jZVJhdGlvTWluQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyAxNiAvLyAiYmFsYW5jZVJhdGlvTWluQlAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMjkKICAgIC8vIHRoaXMuYmFsYW5jZVJhdGlvTWluQlAudmFsdWUgPSBiYWxhbmNlUmF0aW9NaW5CUDsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnN0b3BEZXBvc2l0KCkgLT4gdm9pZDoKc3RvcERlcG9zaXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMzMKICAgIC8vIHRoaXMub25seVN0b3BBdXRob3JpdHkoKTsKICAgIGNhbGxzdWIgb25seVN0b3BBdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUyCiAgICAvLyBjYW5EZXBvc2l0ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7Ly8gaXMgZGVwb3NpdCBvcGVyYXRpb24gYWxsb3dlZAogICAgYnl0ZWMgMTIgLy8gImNhbkRlcG9zaXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMzQKICAgIC8vIHRoaXMuY2FuRGVwb3NpdC52YWx1ZSA9IGZhbHNlOwogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zdGFydERlcG9zaXQoKSAtPiB2b2lkOgpzdGFydERlcG9zaXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMzgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTIKICAgIC8vIGNhbkRlcG9zaXQgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyBkZXBvc2l0IG9wZXJhdGlvbiBhbGxvd2VkCiAgICBieXRlYyAxMiAvLyAiY2FuRGVwb3NpdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzOQogICAgLy8gdGhpcy5jYW5EZXBvc2l0LnZhbHVlID0gdHJ1ZTsKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuc3RvcFdpdGhkcmF3KCkgLT4gdm9pZDoKc3RvcFdpdGhkcmF3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzQzCiAgICAvLyB0aGlzLm9ubHlTdG9wQXV0aG9yaXR5KCk7CiAgICBjYWxsc3ViIG9ubHlTdG9wQXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MwogICAgLy8gY2FuV2l0aGRyYXcgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyB3aXRoZHJhd24gb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDEzIC8vICJjYW5XaXRoZHJhdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM0NAogICAgLy8gdGhpcy5jYW5XaXRoZHJhdy52YWx1ZSA9IGZhbHNlOwogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zdGFydFdpdGhkcmF3KCkgLT4gdm9pZDoKc3RhcnRXaXRoZHJhdzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM0OAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MwogICAgLy8gY2FuV2l0aGRyYXcgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyB3aXRoZHJhd24gb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDEzIC8vICJjYW5XaXRoZHJhdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM0OQogICAgLy8gdGhpcy5jYW5XaXRoZHJhdy52YWx1ZSA9IHRydWU7CiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnNldFN0b3BBdXRob3JpdHkoc3RvcEF1dGhvcml0eTogYnl0ZXMpIC0+IHZvaWQ6CnNldFN0b3BBdXRob3JpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTIKICAgIC8vIHNldFN0b3BBdXRob3JpdHkoc3RvcEF1dGhvcml0eTogQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTMKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTEKICAgIC8vIHByaXZhdGUgc3RvcEF1dGhvcml0eSA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgYnl0ZWMgMjIgLy8gInN0b3BBdXRob3JpdHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTQKICAgIC8vIHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZSA9IHN0b3BBdXRob3JpdHk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zZXRSb3V0ZXIocm91dGVyOiBieXRlcykgLT4gdm9pZDoKc2V0Um91dGVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzU3CiAgICAvLyBzZXRSb3V0ZXIocm91dGVyOiBBZGRyZXNzKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MAogICAgLy8gcm91dGVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsvLyBpcyBkZXBvc2l0IG9wZXJhdGlvbiBhbGxvd2VkCiAgICBieXRlYyAyMSAvLyAicm91dGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzU5CiAgICAvLyB0aGlzLnJvdXRlci52YWx1ZSA9IHJvdXRlcjsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLmdldFkoeDogdWludDY0KSAtPiB1aW50NjQ6CmdldFk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNjUKICAgIC8vIHByaXZhdGUgZ2V0WSh4OiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNjYKICAgIC8vIGNvbnN0IHhfID0gQmlnVWludCh4KTsKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NgogICAgLy8gZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNjcKICAgIC8vIGNvbnN0IGRfID0gQmlnVWludCh0aGlzLmQudmFsdWUpOwogICAgaXRvYgogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NQogICAgLy8gYSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNjgKICAgIC8vIGNvbnN0IGE0ID0gQmlnVWludCh0aGlzLmEudmFsdWUgPDwgMik7CiAgICBwdXNoaW50IDIgLy8gMgogICAgc2hsCiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM2OQogICAgLy8gY29uc3QgYTggPSBCaWdVaW50KGE0ICogMm4pOwogICAgYnl0ZWMgMTcgLy8gMHgwMgogICAgYioKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM3MQogICAgLy8gY29uc3QgZE1pbnVzWElzUG9zaXRpdmUgPSBkXyA+PSB4XzsKICAgIGI8PQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNzIKICAgIC8vIGNvbnN0IGRNaW51c1hBYnM6IGJpZ3VpbnQgPSBkTWludXNYSXNQb3NpdGl2ZSA/IChkXyAtIHhfKSA6ICh4XyAtIGRfKTsKICAgIGJ6IGdldFlfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIGItCgpnZXRZX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM3NAogICAgLy8gY29uc3QgYTRCeURNaW51c1hBYnM6IGJpZ3VpbnQgPSBhNCAqIGRNaW51c1hBYnM7CiAgICBmcmFtZV9kaWcgNAogICAgYioKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mzc5CiAgICAvLyBpZiAoZE1pbnVzWElzUG9zaXRpdmUpIHsKICAgIGZyYW1lX2RpZyA2CiAgICBieiBnZXRZX2Vsc2VfYm9keUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozODAKICAgIC8vIGlmIChhNEJ5RE1pbnVzWEFicyA+PSBkXykgewogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAzCiAgICBiPj0KICAgIGJ6IGdldFlfZWxzZV9ib2R5QDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM4MQogICAgLy8gcGFydDFBYnMgPSBhNEJ5RE1pbnVzWEFicyAtIGRfOwogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAzCiAgICBiLQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozODIKICAgIC8vIHBhcnQxSXNQb3NpdGl2ZSA9IHRydWU7CiAgICBpbnRjXzEgLy8gMQoKZ2V0WV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOTMKICAgIC8vIGNvbnN0IHBhcnQyOiBiaWd1aW50ID0gQmlnVWludCh4KSAqIChhNCAqIGRfICogZF8gKiBkXyArIHhfICogKHBhcnQxQWJzICogcGFydDFBYnMpKTsKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBiKgogICAgZGlnIDEKICAgIGIqCiAgICBiKgogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYioKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYioKICAgIHVuY292ZXIgMgogICAgYisKICAgIGIqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOTQKICAgIC8vIGxldCBudW1lcmF0b3I6IGJpZ3VpbnQgPSB0aGlzLnNxcnQocGFydDIpOwogICAgY2FsbHN1YiBzcXJ0CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOTcKICAgIC8vIGlmIChwYXJ0MUlzUG9zaXRpdmUpIHsKICAgIGJ6IGdldFlfZWxzZV9ib2R5QDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOTgKICAgIC8vIG51bWVyYXRvciArPSB4XyAqIHBhcnQxQWJzOwogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICBiKgogICAgYisKCmdldFlfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwNAogICAgLy8gcmV0dXJuIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhudW1lcmF0b3IgLyAoYTggKiB4XykgKyAxbik7IC8vICsxIHRvIG9mZnNldCByb3VuZGluZyBlcnJvcnMKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgMgogICAgYioKICAgIGIvCiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBiKwogICAgY2FsbHN1YiBiaWd1aW50VG9VaW50NjRNb2R1bG8KICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRZX2Vsc2VfYm9keUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwMAogICAgLy8gbnVtZXJhdG9yIC09IHhfICogcGFydDFBYnM7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIGIqCiAgICBiLQogICAgYiBnZXRZX2FmdGVyX2lmX2Vsc2VAMTIKCmdldFlfZWxzZV9ib2R5QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozODQKICAgIC8vIHBhcnQxQWJzID0gZF8gLSBhNEJ5RE1pbnVzWEFiczsKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgYi0KICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mzg1CiAgICAvLyBwYXJ0MUlzUG9zaXRpdmUgPSBmYWxzZTsKICAgIGludGNfMCAvLyAwCiAgICBiIGdldFlfYWZ0ZXJfaWZfZWxzZUA5CgpnZXRZX2Vsc2VfYm9keUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mzg4CiAgICAvLyBwYXJ0MUFicyA9IGE0QnlETWludXNYQWJzICsgZF87CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDMKICAgIGIrCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM4OQogICAgLy8gcGFydDFJc1Bvc2l0aXZlID0gZmFsc2U7CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRZX2FmdGVyX2lmX2Vsc2VAOQoKZ2V0WV90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNzIKICAgIC8vIGNvbnN0IGRNaW51c1hBYnM6IGJpZ3VpbnQgPSBkTWludXNYSXNQb3NpdGl2ZSA/IChkXyAtIHhfKSA6ICh4XyAtIGRfKTsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMwogICAgYi0KICAgIGIgZ2V0WV90ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC51cGRhdGVEKCkgLT4gdm9pZDoKdXBkYXRlRDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwNwogICAgLy8gcHJpdmF0ZSB1cGRhdGVEKCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDA4CiAgICAvLyBjb25zdCB4ID0gQmlnVWludCh0aGlzLnRva2VuQmFsYW5jZS52YWx1ZSk7CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwOQogICAgLy8gY29uc3QgeSA9IEJpZ1VpbnQodGhpcy52VXNkQmFsYW5jZS52YWx1ZSk7CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MTQKICAgIC8vIGNvbnN0IHh5OiBiaWd1aW50ID0geCAqIHk7CiAgICBkdXAyCiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDUKICAgIC8vIGEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDE1CiAgICAvLyBjb25zdCBhXyA9IEJpZ1VpbnQodGhpcy5hLnZhbHVlKTsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxNwogICAgLy8gY29uc3QgcDE6IGJpZ3VpbnQgPSBhXyAqIHh5ICogKHggKyB5KTsKICAgIGR1cAogICAgZGlnIDIKICAgIGIqCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgYisKICAgIGIqCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxOQogICAgLy8gY29uc3QgcDI6IGJpZ3VpbnQgPSAoeHkgKiAoKGFfICogNG4pIC0gMW4pKSAvIDNuOwogICAgcHVzaGJ5dGVzIDB4MDQKICAgIGIqCiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBiLQogICAgdW5jb3ZlciAyCiAgICBiKgogICAgYnl0ZWMgMjYgLy8gMHgwMwogICAgYi8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyMQogICAgLy8gY29uc3QgcDM6IGJpZ3VpbnQgPSB0aGlzLnNxcnQoKHAxICogcDEpICsgKHAyICogcDIgKiBwMikpOwogICAgZGlnIDEKICAgIGRpZyAyCiAgICBiKgogICAgZGlnIDEKICAgIGRpZyAyCiAgICBiKgogICAgdW5jb3ZlciAyCiAgICBiKgogICAgYisKICAgIGNhbGxzdWIgc3FydAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MjIKICAgIC8vIGxldCBkXyA9IHRoaXMuY2JydChwMSArIHAzKTsKICAgIGR1cDIKICAgIGIrCiAgICBjYWxsc3ViIGNicnQKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyMwogICAgLy8gaWYgKHAzID4gcDEpIHsKICAgIGI8CiAgICBieiB1cGRhdGVEX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MjQKICAgIC8vIGRfIC09IHRoaXMuY2JydChwMyAtIHAxKTsKICAgIGZyYW1lX2RpZyAwCiAgICBiLQogICAgY2FsbHN1YiBjYnJ0CiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgLQogICAgZnJhbWVfYnVyeSAxCgp1cGRhdGVEX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyOAogICAgLy8gdGhpcy5kLnZhbHVlID0gKGRfIDw8IDEpOwogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICBzaGwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjIDYgLy8gImQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MjgKICAgIC8vIHRoaXMuZC52YWx1ZSA9IChkXyA8PCAxKTsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCnVwZGF0ZURfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MjYKICAgIC8vIGRfICs9IHRoaXMuY2JydChwMSAtIHAzKTsKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBiLQogICAgY2FsbHN1YiBjYnJ0CiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHVwZGF0ZURfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wudG9TeXN0ZW1QcmVjaXNpb24oYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKdG9TeXN0ZW1QcmVjaXNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MzEKICAgIC8vIHByaXZhdGUgdG9TeXN0ZW1QcmVjaXNpb24oYW1vdW50OiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OAogICAgLy8gcHJpdmF0ZSB0b2tlbkFtb3VudFJlZHVjZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAidG9rZW5BbW91bnRSZWR1Y2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ5CiAgICAvLyBwcml2YXRlIHRva2VuQW1vdW50SW5jcmVhc2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjQgLy8gInRva2VuQW1vdW50SW5jcmVhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDM1CiAgICAvLyBpZiAodG9rZW5BbW91bnRSZWR1Y2UgPiAwKSB7CiAgICBieiB0b1N5c3RlbVByZWNpc2lvbl9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDM2CiAgICAvLyByZXR1cm4gYW1vdW50IC8gdG9rZW5BbW91bnRSZWR1Y2U7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAwCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdG9TeXN0ZW1QcmVjaXNpb25fZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MzcKICAgIC8vIH0gZWxzZSBpZiAodG9rZW5BbW91bnRJbmNyZWFzZSA+IDApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBieiB0b1N5c3RlbVByZWNpc2lvbl9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzOAogICAgLy8gcmV0dXJuIGFtb3VudCAqIHRva2VuQW1vdW50SW5jcmVhc2U7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAxCiAgICAqCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdG9TeXN0ZW1QcmVjaXNpb25fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQwCiAgICAvLyByZXR1cm4gYW1vdW50OwogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLmZyb21TeXN0ZW1QcmVjaXNpb24oYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKZnJvbVN5c3RlbVByZWNpc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0MwogICAgLy8gcHJpdmF0ZSBmcm9tU3lzdGVtUHJlY2lzaW9uKGFtb3VudDogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDgKICAgIC8vIHByaXZhdGUgdG9rZW5BbW91bnRSZWR1Y2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gInRva2VuQW1vdW50UmVkdWNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OQogICAgLy8gcHJpdmF0ZSB0b2tlbkFtb3VudEluY3JlYXNlID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJ0b2tlbkFtb3VudEluY3JlYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0NwogICAgLy8gaWYgKHRva2VuQW1vdW50UmVkdWNlID4gMCkgewogICAgYnogZnJvbVN5c3RlbVByZWNpc2lvbl9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQ4CiAgICAvLyByZXR1cm4gYW1vdW50ICogdG9rZW5BbW91bnRSZWR1Y2U7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAwCiAgICAqCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZnJvbVN5c3RlbVByZWNpc2lvbl9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0OQogICAgLy8gfSBlbHNlIGlmICh0b2tlbkFtb3VudEluY3JlYXNlID4gMCkgewogICAgZnJhbWVfZGlnIDEKICAgIGJ6IGZyb21TeXN0ZW1QcmVjaXNpb25fYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NTAKICAgIC8vIHJldHVybiBhbW91bnQgLyB0b2tlbkFtb3VudEluY3JlYXNlOwogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMQogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmZyb21TeXN0ZW1QcmVjaXNpb25fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDUyCiAgICAvLyByZXR1cm4gYW1vdW50OwogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnNxcnQobjogYnl0ZXMpIC0+IGJ5dGVzOgpzcXJ0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDU1CiAgICAvLyBwcml2YXRlIHNxcnQobjogYmlndWludCk6IGJpZ3VpbnQgewogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NTYKICAgIC8vIGFzc2VydChuID4gMG4sICduIG11c3QgYmUgbm9uLW5lZ2F0aXZlJyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hieXRlcyAweAogICAgYj4KICAgIGFzc2VydCAvLyBuIG11c3QgYmUgbm9uLW5lZ2F0aXZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NTcKICAgIC8vIGlmIChuID09PSAwbikgcmV0dXJuIDBuOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgMHgKICAgIGI9PQogICAgYnogc3FydF9hZnRlcl9pZl9lbHNlQDIKICAgIHB1c2hieXRlcyAweAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnNxcnRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDU4CiAgICAvLyBpZiAobiA8PSAzbikgcmV0dXJuIDFuOwogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlYyAyNiAvLyAweDAzCiAgICBiPD0KICAgIGJ6IHNxcnRfYWZ0ZXJfaWZfZWxzZUA0CiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKc3FydF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjEKICAgIC8vIGNvbnN0IGJsID0gYml0TGVuZ3RoKEJ5dGVzKG4pKTsKICAgIGZyYW1lX2RpZyAtMQogICAgYml0bGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjIKICAgIC8vIGxldCB3aWRlID0gZXhwdygyLCAoYmwgKyAxKSAvIDIpOwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAvCiAgICBwdXNoaW50IDIgLy8gMgogICAgc3dhcAogICAgZXhwdwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDYzCiAgICAvLyBjb25zdCBoaSA9IEJpZ1VpbnQod2lkZVswXSk7CiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjQKICAgIC8vIGNvbnN0IGxvID0gQmlnVWludCh3aWRlWzFdKTsKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2NQogICAgLy8gbGV0IHg6IGJpZ3VpbnQgPSBoaSAqIFNISUZUNjQgKyBsbzsKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIyCiAgICAvLyBjb25zdCBTSElGVDY0OiBiaWd1aW50ID0gMTg0NDY3NDQwNzM3MDk1NTE2MTZuOyAvLyAyXjY0CiAgICBieXRlYyAyNyAvLyAweDAxMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDY1CiAgICAvLyBsZXQgeDogYmlndWludCA9IGhpICogU0hJRlQ2NCArIGxvOwogICAgYioKICAgIGIrCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDY4CiAgICAvLyBsZXQgeTogYmlndWludCA9ICh4ICsgbiAvIHgpIC8gMm47CiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAxCiAgICBiLwogICAgYisKICAgIGJ5dGVjIDE3IC8vIDB4MDIKICAgIGIvCiAgICBmcmFtZV9idXJ5IDEKCnNxcnRfd2hpbGVfdG9wQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjkKICAgIC8vIHdoaWxlICh5IDwgeCkgewogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICBiPAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDY5LTQ3MgogICAgLy8gd2hpbGUgKHkgPCB4KSB7CiAgICAvLyAgIHggPSB5OwogICAgLy8gICB5ID0gKHggKyBuIC8geCkgLyAybjsKICAgIC8vIH0KICAgIGJ6IHNxcnRfYWZ0ZXJfd2hpbGVANwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDcxCiAgICAvLyB5ID0gKHggKyBuIC8geCkgLyAybjsKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYi8KICAgIGRpZyAxCiAgICBiKwogICAgYnl0ZWMgMTcgLy8gMHgwMgogICAgYi8KICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICBiIHNxcnRfd2hpbGVfdG9wQDUKCnNxcnRfYWZ0ZXJfd2hpbGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ3MwogICAgLy8gcmV0dXJuIHg7CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5jYnJ0KG46IGJ5dGVzKSAtPiB1aW50NjQ6CmNicnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NzYKICAgIC8vIHByaXZhdGUgY2JydChuOiBiaWd1aW50KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDc3CiAgICAvLyBpZiAobiA9PT0gMG4pIHJldHVybiAwOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgMHgKICAgIGI9PQogICAgYnogY2JydF9hZnRlcl9pZl9lbHNlQDIKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY2JydF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NzgKICAgIC8vIGlmIChuIDwgOG4pIHJldHVybiAxOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgMHgwOAogICAgYjwKICAgIGJ6IGNicnRfYWZ0ZXJfaWZfZWxzZUA0CiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmNicnRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDgxCiAgICAvLyBjb25zdCBibCA9IGJpdExlbmd0aChCeXRlcyhuKSk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJpdGxlbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDgyCiAgICAvLyBsZXQgd2lkZSA9IGV4cHcoMiwgKGJsICsgMikgLyAzKTsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBwdXNoaW50IDMgLy8gMwogICAgLwogICAgcHVzaGludCAyIC8vIDIKICAgIHN3YXAKICAgIGV4cHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ4MwogICAgLy8gY29uc3QgaGkgPSBCaWdVaW50KHdpZGVbMF0pOwogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDg0CiAgICAvLyBjb25zdCBsbyA9IEJpZ1VpbnQod2lkZVsxXSk7CiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0ODUKICAgIC8vIGxldCB4OiBiaWd1aW50ID0gaGkgKiBTSElGVDY0ICsgbG87CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMgogICAgLy8gY29uc3QgU0hJRlQ2NDogYmlndWludCA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE2bjsgLy8gMl42NAogICAgYnl0ZWMgMjcgLy8gMHgwMTAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ4NQogICAgLy8gbGV0IHg6IGJpZ3VpbnQgPSBoaSAqIFNISUZUNjQgKyBsbzsKICAgIGIqCiAgICBiKwogICAgZnJhbWVfYnVyeSAxCgpjYnJ0X3doaWxlX3RvcEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDg5CiAgICAvLyBjb25zdCB4MjogYmlndWludCA9IHggKiB4OwogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYioKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OTAKICAgIC8vIGlmICh4MiA9PT0gMG4pIGJyZWFrOyAvLyBzaG91bGQgbm90IGhhcHBlbiBmb3IgeD4wCiAgICBwdXNoYnl0ZXMgMHgKICAgIGI9PQogICAgYm56IGNicnRfd2hpbGVfdG9wQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OTEKICAgIC8vIGNvbnN0IG5leHQ6IGJpZ3VpbnQgPSAoMm4gKiB4ICsgbiAvIHgyKSAvIDNuOwogICAgYnl0ZWMgMTcgLy8gMHgwMgogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYioKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDMKICAgIGIvCiAgICBiKwogICAgYnl0ZWMgMjYgLy8gMHgwMwogICAgYi8KICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OTIKICAgIC8vIGlmIChuZXh0ID09PSB4IHx8IG5leHQgPT09IHggLSAxbikgewogICAgYj09CiAgICBibnogY2JydF9pZl9ib2R5QDEwCiAgICBmcmFtZV9kaWcgMQogICAgYnl0ZWMgMTAgLy8gMHgwMQogICAgYi0KICAgIGZyYW1lX2RpZyAwCiAgICBiPT0KICAgIGJ6IGNicnRfYWZ0ZXJfaWZfZWxzZUAxMQoKY2JydF9pZl9ib2R5QDEwOgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgMQoKY2JydF93aGlsZV90b3BAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MDAKICAgIC8vIHdoaWxlICgoeCArIDFuKSAqICh4ICsgMW4pICogKHggKyAxbikgPD0gbikgeCArPSAxbjsKICAgIGZyYW1lX2RpZyAxCiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBiKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGR1cAogICAgZGlnIDEKICAgIGIqCiAgICBiKgogICAgZnJhbWVfZGlnIC0xCiAgICBiPD0KICAgIGJ6IGNicnRfd2hpbGVfdG9wQDE3CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAxCiAgICBiIGNicnRfd2hpbGVfdG9wQDE0CgpjYnJ0X3doaWxlX3RvcEAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUwMQogICAgLy8gd2hpbGUgKHggKiB4ICogeCA+IG4pIHggLT0gMW47CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBkaWcgMQogICAgYioKICAgIGIqCiAgICBmcmFtZV9kaWcgLTEKICAgIGI+CiAgICBieiBjYnJ0X2FmdGVyX3doaWxlQDE5CiAgICBmcmFtZV9kaWcgMQogICAgYnl0ZWMgMTAgLy8gMHgwMQogICAgYi0KICAgIGZyYW1lX2J1cnkgMQogICAgYiBjYnJ0X3doaWxlX3RvcEAxNwoKY2JydF9hZnRlcl93aGlsZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUwMgogICAgLy8gcmV0dXJuIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyh4KTsKICAgIGZyYW1lX2RpZyAxCiAgICBjYWxsc3ViIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmNicnRfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgY2JydF93aGlsZV90b3BANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo6UmV3YXJkTWFuYWdlci5jbGFpbVJld2FyZHMoKSAtPiB2b2lkOgpjbGFpbVJld2FyZHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTAtNTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gY2xhaW1SZXdhcmRzKCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjUyCiAgICAvLyBjb25zdCB1c2VyID0gVHhuLnNlbmRlcjsKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjUzCiAgICAvLyBjb25zdCB1c2VyTHBBbW91bnQgPSB0aGlzLmJhbGFuY2UodXNlcikudmFsdWU7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMzCiAgICAvLyBiYWxhbmNlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA0IC8vICJiYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjUzCiAgICAvLyBjb25zdCB1c2VyTHBBbW91bnQgPSB0aGlzLmJhbGFuY2UodXNlcikudmFsdWU7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTQKICAgIC8vIGlmICh1c2VyTHBBbW91bnQgPiAwKSB7CiAgICBieiBjbGFpbVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTUKICAgIC8vIGNvbnN0IHJld2FyZHMgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oQmlnVWludCh1c2VyTHBBbW91bnQpICogdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUgLyBQX1NDQUxFKTsKICAgIGZyYW1lX2RpZyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzAKICAgIC8vIGFjY1Jld2FyZFBlclNoYXJlUCA9IEdsb2JhbFN0YXRlPGJpZ3VpbnQ+KHsgaW5pdGlhbFZhbHVlOiAwbiB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJhY2NSZXdhcmRQZXJTaGFyZVAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjU1CiAgICAvLyBjb25zdCByZXdhcmRzID0gYmlndWludFRvVWludDY0TW9kdWxvKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlIC8gUF9TQ0FMRSk7CiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBQX1NDQUxFOiBiaWd1aW50ID0gQmlnVWludCgxIDw8IFApOwogICAgYnl0ZWMgOSAvLyAweDAxMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTUKICAgIC8vIGNvbnN0IHJld2FyZHMgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oQmlnVWludCh1c2VyTHBBbW91bnQpICogdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUgLyBQX1NDQUxFKTsKICAgIGIvCiAgICBjYWxsc3ViIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1NgogICAgLy8gY29uc3QgcGVuZGluZzogdWludDY0ID0gcmV3YXJkcyAtIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWU7CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozNAogICAgLy8gdXNlclJld2FyZERlYnQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDUgLy8gInVzZXJSZXdhcmREZWJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjU2CiAgICAvLyBjb25zdCBwZW5kaW5nOiB1aW50NjQgPSByZXdhcmRzIC0gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZTsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1NwogICAgLy8gaWYgKHBlbmRpbmcgPiAwKSB7CiAgICBieiBjbGFpbVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTgKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWUgPSByZXdhcmRzOwogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjM0CiAgICAvLyB1c2VyUmV3YXJkRGVidCA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNSAvLyAidXNlclJld2FyZERlYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTgKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWUgPSByZXdhcmRzOwogICAgZnJhbWVfZGlnIDEKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1OQogICAgLy8gYXNzZXRUcmFuc2Zlcih7IHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwgYXNzZXRBbW91bnQ6IHBlbmRpbmcsIGFzc2V0UmVjZWl2ZXI6IHVzZXIgfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1OQogICAgLy8gYXNzZXRUcmFuc2Zlcih7IHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwgYXNzZXRBbW91bnQ6IHBlbmRpbmcsIGFzc2V0UmVjZWl2ZXI6IHVzZXIgfSkuc3VibWl0KCk7CiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjYwCiAgICAvLyBlbWl0PFJld2FyZHNDbGFpbWVkPih7IHVzZXI6IG5ldyBBZGRyZXNzKHVzZXIpLCBwZW5kaW5nIH0pOwogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlYyAyNSAvLyBtZXRob2QgIlJld2FyZHNDbGFpbWVkKGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCgpjbGFpbVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjpSZXdhcmRNYW5hZ2VyLnNldEFkbWluRmVlU2hhcmUoYWRtaW5GZWVTaGFyZUJQOiB1aW50NjQpIC0+IHZvaWQ6CnNldEFkbWluRmVlU2hhcmU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NjUtNjYKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gc2V0QWRtaW5GZWVTaGFyZShhZG1pbkZlZVNoYXJlQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NjcKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjY4CiAgICAvLyBhc3NlcnQoYWRtaW5GZWVTaGFyZUJQIDw9IEJQLCAnUmV3YXJkTWFuYWdlcjogdG9vIGhpZ2gnKTsKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjY4CiAgICAvLyBhc3NlcnQoYWRtaW5GZWVTaGFyZUJQIDw9IEJQLCAnUmV3YXJkTWFuYWdlcjogdG9vIGhpZ2gnKTsKICAgIDw9CiAgICBhc3NlcnQgLy8gUmV3YXJkTWFuYWdlcjogdG9vIGhpZ2gKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyOAogICAgLy8gYWRtaW5GZWVTaGFyZUJQID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogQlAgLyA1IH0pOyAvLyBEZWZhdWx0IGFkbWluIGZlZSBpcyAyMCUKICAgIGJ5dGVjIDE4IC8vICJhZG1pbkZlZVNoYXJlQlAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NjkKICAgIC8vIHRoaXMuYWRtaW5GZWVTaGFyZUJQLnZhbHVlID0gYWRtaW5GZWVTaGFyZUJQOwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjpSZXdhcmRNYW5hZ2VyLmNsYWltQWRtaW5GZWUoKSAtPiB2b2lkOgpjbGFpbUFkbWluRmVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjcyLTczCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGNsYWltQWRtaW5GZWUoKTogdm9pZCB7CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3NAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzEKICAgIC8vIGFkbWluRmVlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAiYWRtaW5GZWVBbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3NgogICAgLy8gaWYgKGFkbWluRmVlQW1vdW50ID4gMCkgewogICAgYnogY2xhaW1BZG1pbkZlZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3Ny04MQogICAgLy8gYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFkbWluRmVlQW1vdW50LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAib3duZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3Ny04MQogICAgLy8gYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFkbWluRmVlQW1vdW50LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMxCiAgICAvLyBhZG1pbkZlZUFtb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlYyAxMSAvLyAiYWRtaW5GZWVBbW91bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODIKICAgIC8vIHRoaXMuYWRtaW5GZWVBbW91bnQudmFsdWUgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbGFpbUFkbWluRmVlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo6UmV3YXJkTWFuYWdlci5wZW5kaW5nUmV3YXJkKHVzZXI6IGJ5dGVzKSAtPiB1aW50NjQ6CnBlbmRpbmdSZXdhcmQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODYtODcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gcGVuZGluZ1Jld2FyZCh1c2VyOiBBY2NvdW50KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjg4CiAgICAvLyByZXR1cm4gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHRoaXMuYmFsYW5jZSh1c2VyKS52YWx1ZSkgKiB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWU7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODgKICAgIC8vIHJldHVybiBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodGhpcy5iYWxhbmNlKHVzZXIpLnZhbHVlKSAqIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlKSAvIFBfU0NBTEUpIC0gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZTsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMwCiAgICAvLyBhY2NSZXdhcmRQZXJTaGFyZVAgPSBHbG9iYWxTdGF0ZTxiaWd1aW50Pih7IGluaXRpYWxWYWx1ZTogMG4gfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiYWNjUmV3YXJkUGVyU2hhcmVQIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo4OAogICAgLy8gcmV0dXJuIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbygoQmlnVWludCh0aGlzLmJhbGFuY2UodXNlcikudmFsdWUpICogdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUpIC8gUF9TQ0FMRSkgLSB0aGlzLnVzZXJSZXdhcmREZWJ0KHVzZXIpLnZhbHVlOwogICAgYioKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyMAogICAgLy8gY29uc3QgUF9TQ0FMRTogYmlndWludCA9IEJpZ1VpbnQoMSA8PCBQKTsKICAgIGJ5dGVjIDkgLy8gMHgwMTAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjg4CiAgICAvLyByZXR1cm4gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHRoaXMuYmFsYW5jZSh1c2VyKS52YWx1ZSkgKiB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWU7CiAgICBiLwogICAgY2FsbHN1YiBiaWd1aW50VG9VaW50NjRNb2R1bG8KICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozNAogICAgLy8gdXNlclJld2FyZERlYnQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDUgLy8gInVzZXJSZXdhcmREZWJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjg4CiAgICAvLyByZXR1cm4gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHRoaXMuYmFsYW5jZSh1c2VyKS52YWx1ZSkgKiB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWU7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIC0KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo6UmV3YXJkTWFuYWdlci5hZGRSZXdhcmRzKHJld2FyZEFtb3VudDogdWludDY0KSAtPiB2b2lkOgphZGRSZXdhcmRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjk2CiAgICAvLyBwcm90ZWN0ZWQgYWRkUmV3YXJkcyhyZXdhcmRBbW91bnQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjkKICAgIC8vIHRvdGFsU3VwcGx5ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ0b3RhbFN1cHBseSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjk4CiAgICAvLyBpZiAodG90YWxTdXBwbHkgPiAwKSB7CiAgICBieiBhZGRSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI4CiAgICAvLyBhZG1pbkZlZVNoYXJlQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBCUCAvIDUgfSk7IC8vIERlZmF1bHQgYWRtaW4gZmVlIGlzIDIwJQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJhZG1pbkZlZVNoYXJlQlAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjk5CiAgICAvLyBjb25zdCBhZG1pbkZlZVJld2FyZHM6IHVpbnQ2NCA9IChyZXdhcmRBbW91bnQgKiB0aGlzLmFkbWluRmVlU2hhcmVCUC52YWx1ZSkgLyBCUDsKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjk5CiAgICAvLyBjb25zdCBhZG1pbkZlZVJld2FyZHM6IHVpbnQ2NCA9IChyZXdhcmRBbW91bnQgKiB0aGlzLmFkbWluRmVlU2hhcmVCUC52YWx1ZSkgLyBCUDsKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDAKICAgIC8vIHJld2FyZEFtb3VudCAtPSBhZG1pbkZlZVJld2FyZHM7CiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAxCiAgICAtCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzAKICAgIC8vIGFjY1Jld2FyZFBlclNoYXJlUCA9IEdsb2JhbFN0YXRlPGJpZ3VpbnQ+KHsgaW5pdGlhbFZhbHVlOiAwbiB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJhY2NSZXdhcmRQZXJTaGFyZVAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwMQogICAgLy8gdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUgKz0gQmlnVWludChyZXdhcmRBbW91bnQpICogUF9TQ0FMRSAvIEJpZ1VpbnQodG90YWxTdXBwbHkpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjAKICAgIC8vIGNvbnN0IFBfU0NBTEU6IGJpZ3VpbnQgPSBCaWdVaW50KDEgPDwgUCk7CiAgICBieXRlYyA5IC8vIDB4MDEwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDEKICAgIC8vIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlICs9IEJpZ1VpbnQocmV3YXJkQW1vdW50KSAqIFBfU0NBTEUgLyBCaWdVaW50KHRvdGFsU3VwcGx5KTsKICAgIGIqCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgYi8KICAgIGIrCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzAKICAgIC8vIGFjY1Jld2FyZFBlclNoYXJlUCA9IEdsb2JhbFN0YXRlPGJpZ3VpbnQ+KHsgaW5pdGlhbFZhbHVlOiAwbiB9KTsKICAgIGJ5dGVjIDggLy8gImFjY1Jld2FyZFBlclNoYXJlUCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDEKICAgIC8vIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlICs9IEJpZ1VpbnQocmV3YXJkQW1vdW50KSAqIFBfU0NBTEUgLyBCaWdVaW50KHRvdGFsU3VwcGx5KTsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzEKICAgIC8vIGFkbWluRmVlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAiYWRtaW5GZWVBbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwMgogICAgLy8gdGhpcy5hZG1pbkZlZUFtb3VudC52YWx1ZSArPSBhZG1pbkZlZVJld2FyZHM7CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzEKICAgIC8vIGFkbWluRmVlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjIDExIC8vICJhZG1pbkZlZUFtb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDIKICAgIC8vIHRoaXMuYWRtaW5GZWVBbW91bnQudmFsdWUgKz0gYWRtaW5GZWVSZXdhcmRzOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmFkZFJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjpSZXdhcmRNYW5hZ2VyLmRlcG9zaXRMcCh0bzogYnl0ZXMsIGxwQW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmRlcG9zaXRMcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDYKICAgIC8vIHByb3RlY3RlZCBkZXBvc2l0THAodG86IEFjY291bnQsIGxwQW1vdW50OiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMwCiAgICAvLyBhY2NSZXdhcmRQZXJTaGFyZVAgPSBHbG9iYWxTdGF0ZTxiaWd1aW50Pih7IGluaXRpYWxWYWx1ZTogMG4gfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiYWNjUmV3YXJkUGVyU2hhcmVQIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDgKICAgIC8vIGxldCBwZW5kaW5nOiB1aW50NjQgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDkKICAgIC8vIGxldCB1c2VyTHBBbW91bnQgPSB0aGlzLmJhbGFuY2UodG8pLnZhbHVlOwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMzCiAgICAvLyBiYWxhbmNlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA0IC8vICJiYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwOQogICAgLy8gbGV0IHVzZXJMcEFtb3VudCA9IHRoaXMuYmFsYW5jZSh0bykudmFsdWU7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTEwCiAgICAvLyBpZiAodXNlckxwQW1vdW50ID4gMCkgewogICAgYnogZGVwb3NpdExwX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExMQogICAgLy8gcGVuZGluZyA9IGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVAgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodG8pLnZhbHVlOwogICAgZnJhbWVfZGlnIDIKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAwCiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBQX1NDQUxFOiBiaWd1aW50ID0gQmlnVWludCgxIDw8IFApOwogICAgYnl0ZWMgOSAvLyAweDAxMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTExCiAgICAvLyBwZW5kaW5nID0gYmlndWludFRvVWludDY0TW9kdWxvKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCAvIFBfU0NBTEUpIC0gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWU7CiAgICBiLwogICAgY2FsbHN1YiBiaWd1aW50VG9VaW50NjRNb2R1bG8KICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozNAogICAgLy8gdXNlclJld2FyZERlYnQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDUgLy8gInVzZXJSZXdhcmREZWJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExMQogICAgLy8gcGVuZGluZyA9IGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVAgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodG8pLnZhbHVlOwogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAtCiAgICBmcmFtZV9idXJ5IDEKCmRlcG9zaXRMcF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTEzCiAgICAvLyB1c2VyTHBBbW91bnQgKz0gbHBBbW91bnQ7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTE0CiAgICAvLyB0aGlzLmJhbGFuY2UodG8pLnZhbHVlICs9IGxwQW1vdW50OwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMzCiAgICAvLyBiYWxhbmNlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA0IC8vICJiYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExNAogICAgLy8gdGhpcy5iYWxhbmNlKHRvKS52YWx1ZSArPSBscEFtb3VudDsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9kaWcgLTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMwogICAgLy8gYmFsYW5jZSA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNCAvLyAiYmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTQKICAgIC8vIHRoaXMuYmFsYW5jZSh0bykudmFsdWUgKz0gbHBBbW91bnQ7CiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyOQogICAgLy8gdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsU3VwcGx5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTUKICAgIC8vIHRoaXMudG90YWxTdXBwbHkudmFsdWUgKz0gbHBBbW91bnQ7CiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyOQogICAgLy8gdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWMgNyAvLyAidG90YWxTdXBwbHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTE1CiAgICAvLyB0aGlzLnRvdGFsU3VwcGx5LnZhbHVlICs9IGxwQW1vdW50OwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTcKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQodG8pLnZhbHVlID0gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVApIC8gUF9TQ0FMRSk7CiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMAogICAgYioKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyMAogICAgLy8gY29uc3QgUF9TQ0FMRTogYmlndWludCA9IEJpZ1VpbnQoMSA8PCBQKTsKICAgIGJ5dGVjIDkgLy8gMHgwMTAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExNwogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWUgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCkgLyBQX1NDQUxFKTsKICAgIGIvCiAgICBjYWxsc3ViIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbwogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzQKICAgIC8vIHVzZXJSZXdhcmREZWJ0ID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA1IC8vICJ1c2VyUmV3YXJkRGVidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTcKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQodG8pLnZhbHVlID0gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVApIC8gUF9TQ0FMRSk7CiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTgKICAgIC8vIGlmIChwZW5kaW5nID4gMCkgewogICAgZnJhbWVfZGlnIDEKICAgIGJ6IGRlcG9zaXRMcF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTkKICAgIC8vIGFzc2V0VHJhbnNmZXIoeyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsIGFzc2V0QW1vdW50OiBwZW5kaW5nLCBhc3NldFJlY2VpdmVyOiB0byB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTkKICAgIC8vIGFzc2V0VHJhbnNmZXIoeyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsIGFzc2V0QW1vdW50OiBwZW5kaW5nLCBhc3NldFJlY2VpdmVyOiB0byB9KS5zdWJtaXQoKTsKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTIwCiAgICAvLyBlbWl0PFJld2FyZHNDbGFpbWVkPih7IHVzZXI6IG5ldyBBZGRyZXNzKHRvKSwgcGVuZGluZyB9KTsKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAyNSAvLyBtZXRob2QgIlJld2FyZHNDbGFpbWVkKGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCgpkZXBvc2l0THBfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEyMgogICAgLy8gZW1pdDxEZXBvc2l0Pih7IHRvOiBuZXcgQWRkcmVzcyh0byksIGxwQW1vdW50IH0pOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4Y2ZhYjg3MjMgLy8gbWV0aG9kICJEZXBvc2l0KGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo6T3duYWJsZS5vbmx5T3duZXIoKSAtPiB2b2lkOgpvbmx5T3duZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxMwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsICdPbmx5IG93bmVyJyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxMwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsICdPbmx5IG93bmVyJyk7CiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgb3duZXIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjpPd25hYmxlLnRyYW5zZmVyT3duZXJzaGlwKG5ld093bmVyOiBieXRlcykgLT4gdm9pZDoKdHJhbnNmZXJPd25lcnNoaXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxNi0xNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdHJhbnNmZXJPd25lcnNoaXAobmV3T3duZXI6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGJ5dGVjIDE0IC8vICJvd25lciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE5CiAgICAvLyB0aGlzLm93bmVyLnZhbHVlID0gbmV3T3duZXI7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIK",clear:"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="},byteCode:{approval:"CiAFAAEIBJBOJhwMdG9rZW5CYWxhbmNlC3ZVc2RCYWxhbmNlBWFzc2V0CHJlc2VydmVzB2JhbGFuY2UOdXNlclJld2FyZERlYnQBZAt0b3RhbFN1cHBseRJhY2NSZXdhcmRQZXJTaGFyZVAHAQAAAAAAAAEBDmFkbWluRmVlQW1vdW50CmNhbkRlcG9zaXQLY2FuV2l0aGRyYXcFb3duZXIKZmVlU2hhcmVCUBFiYWxhbmNlUmF0aW9NaW5CUAECD2FkbWluRmVlU2hhcmVCUAQVH3x1AWEGcm91dGVyDXN0b3BBdXRob3JpdHkRdG9rZW5BbW91bnRSZWR1Y2UTdG9rZW5BbW91bnRJbmNyZWFzZQS6gYB2AQMJAQAAAAAAAAAAMRhAACgnEoHQD2cnByJnJwiAAGcnCyJnKCJnKSJnKyJnJwYiZycMI2cnDSNnMRtBAKiCFwRRbTR7BAGjo/8EdhCkYAToOoerBJLgOxwEIfHd/wTZeK0UBA0bTAYEdb+aKAT0k9ftBI1ctt8E/gSlzgQCjghZBEH8lm4Eq/IAFAQEsWHxBGZZHM8Epa5r0QSgTFvEBDYbYVkEMruwEQS4d57nBOF7r7Q2GgCOFwFhAVQBSAE/ATMBIwEFAOMA0wDHALcAqwCfAJMAhwB4AGkAXQBNAEEAKQARAAIiQzEZFEQxGEQ2GgGICuAjQzEZFEQxGESADBUffHUAAAAAAAAAA7AjQzEZFEQxGEQ2GgEXwByICbMWJxNMULAjQzEZFEQxGESICXEjQzEZFEQxGEQ2GgEXiAlPI0MxGRREMRhEiAjlI0MxGRREMRhENhoBiAY/I0MxGRREMRhENhoBiAYkI0MxGRREMRhEiAYQI0MxGRREMRhEiAX8I0MxGRREMRhEiAXoI0MxGRREMRhEiAXUI0MxGRREMRhENhoBF4gFsiNDMRkURDEYRIgFfSNDMRkURDEYRDYaAReIBVsjQzEZFEQxGEQ2GgE2GgIXNhoDFzYaBCJTiAR7FicTTFCwI0MxGRREMRhENhoBNhoCFzYaAyJTiAO+FicTTFCwI0MxGRREMRhENhoBF4gCcCNDMRkURDEYRIgBfiNDMRkURDEYRCNDMRkURDEYRIgA4iNDMRkjEkQxGESIAK4jQzEZFEQxGBRENhoBNhoCNhoDFzYaBBc2GgUXNhoGF4gAKiNDigEBi/8VSSQNQQAYiwAkCUmLAElOAw9LAkxNi/9MTwJSF0yJIkL/6IoGACcOi/pnKov9ZycUi/xnJxWL+2cnFov6ZycPi/5nJxCL/2ciKmVEcQFMSU8CRIEDDUEAJ4sAgQMJgQpMlCcXTGeLAIEDDEEADoEDiwAJgQpMlCcYTGeJIkL/9yJC/96KAAAxAEkiJwRjRQFAAAaLACcEImaLACInBWNFAUAABosAJwUiZomICK6xIiplRDIKshQishKyESWyECKyAbOAFlBvb2w6IG9wdC1pbiBjb21wbGV0ZWSwiTEAIicVZUQSRIkxACInFmVEEkSJigAAIihlTElPAkQiKWVMSU4CTgNEDUEAEIsBIQQLiwAKIicQZUQPRImLAIsBDEH/94sAIQQLiwEKIicQZUQPRImKAAAiJwxlREQiJwZlTElPAkQiKmVEMRZEMRYjCUk4ECUSREk4FDIKEkRJOBFPAhJESTggMgMSREk4FTIDEkQ4EogE2klOAklEIitlRAgrTGciKGVMSU4CTgNEIillTElOAk4ERAhMQQAFiwRAADSLASORIihlREsBCChMZyIpZUQIKUxniAQiMQAiJwZlRIsACYgG/CIoZUSBgICAgIAgDESJIihlRIsBFosCFksBo4sEFkxLAaJJFSQORCSvTEsBqxdPBAgoTGciKWVEiwMWTwSjTwOiSRUkDkRPAqsXCClMZ0L/n4oBACInDWVERCInBmVEMQBJIicEY0xJTwJESYv/D0QiJwhlTE4CRCJMQQAWiwIWiwOjJwmiiP2riwEiJwVjRAmMBIsCi/8JiwFJIicEY0SL/wlLAScETwJmIicHZUSL/wknB0xnTBaLA6MnCaKI/XMnBUxmiwRBACOxIiplRIsBSU4CshSLBElOArISshElshAisgGzFlAnGUxQsIv/FosBSwFQgATTr6TxTFCwIihlRCIpZURKCCIoZURPAxZLBKNLAhZMSwGiSRUkDkQkr0xLAasXTwNMCShMZyIpZURPBBZPBaNPA6JJFSQORE8CqxcJKUxnIihlRCIpZUQIDUQiK2VEi/8PRCIrZUSL/wkrTGeIAq8iJwZlRIsADESxIiplRIv/iANBMQCyFLISshElshAisgGziYoDAYAAiP2FIkcDi/5BAGGL/0AADSInD2VEi/4LIQQKjAKL/osCCYgC1kmIAwOL/kwJjAIiKGVESwEIKExnIitlRAgrTGciKGVEiAGbSYwAIillRAxBAAkiKWVEiwAJjAEpiwBniwJJiATIjAOLAYwEiwOLBCIqZUQWi/4WSwIWTwQWi/1PBFBPA1BPAlBMUIAEK7vso0xQsIj9BYwAiYoEAYAASYj85SJHBIv9QQCFIillRIv9CClMZyIpZUSIASdJjAAiKGVMSU4CjAFEDEEADYsBiwAJSYwCiAJUjAMiK2VEiwJJTwIORCIrZURMCStMZ4v/QAANIicPZUSLAwshBAqMBIsDiwRJTgIJKIsAZ0mL/g9EsSIqZUSL/LIUSwGyErIRJbIQIrIBs0sBiAQCjAaMBYsFiwYiKmVEFov9FksCFk8EFov8TwRQTwNQTwJQTFCABNPx1UJMULCI/EGMAImKAQCIBKOL/yEEDkQnD4v/Z4mKAACIBJEiJwZlTElPAkQiJwdlTElOAk4DRA1BAAoxAIsAiwEJiAPWiYoBAIgEaIv/IQQORCcQi/9niYj75CcMImeJiARRJwwjZ4mI+9QnDSJniYgEQScNI2eJigEAiAQ2JxaL/2eJigEAiAQqJxWL/2eJigEBIkmL/xZJIicGZUQWSU4CIicUZUSBApAWSU4DJxGjTgKmSUEAdIsDiwKhiwSjjACLBkEAWosAiwOnQQBHiwCLA6GMASOLBIsDSU4Co0sBo6OLAUmjiwJJTwKjTwKgo4gBFkxBABWLAosBo6CLBYsCo6InCqCI+kmMAImLAosBo6FC/+iLA4sAoYwBIkL/tosAiwOgjAEiQv+riwKLA6FC/4mKAAAiKGVEFiIpZUQWSqMiJxRlRBZJSwKjTwRPBKCjSU4CTgOAAQSjJwqhTwKjJxqiSwFLAqNLAUsCo08Co6CIAJRJTgJKoIgA8k4DpEEAFYsAoYgA5osBTAmMAYsBI5AnBkxniYsATKGIANCLAQiMAUL/6IoBASInF2VMSU8CRCInGGVMTgJEQQAIi/+LAAqMAImLAUEACIv/iwELjACJi/+MAImKAQEiJxdlTElPAkQiJxhlTE4CREEACIv/iwALjACJiwFBAAiL/4sBCowAiYv/jACJigEBIkmL/4AApUSL/4AAqEEABYAAjACJi/8nGqZBAAUnCowAiYv/kyMIgQIKgQJMlUwWTBZMJxujoEmMAIv/SwGioCcRoowBiwGLAKRBABWL/4sBSU4CoksBoCcRoowBjABC/+OJigEBIkcDi/+AAKhBAAQijACJi/+AAQikQQAEI4wAiYv/k4ECCIEDCoECTJVMFkwWTCcbo6CMAYsBSaNJjAOAAKhAACcnEYsBSU4Co4v/iwOioCcaokmMAKhAAAuLAScKoYsAqEEAPYsAjAGLAScKoEmMAklLAaOji/+mQQAHiwKMAUL/5osBSUsBo6OL/6VBAAqLAScKoYwBQv/piwGI+EKMAImLAIwBQv+MigAAgABJMQBJIicEY0xJTwJEQQBIiwMWIicIZUSjJwmiiPgUSYwBiwIiJwVjRAlJjABBACiLAkknBYsBZrEiKmVESwGyFIsASU4CshKyESWyECKyAbMWUCcZTFCwiYoBAIgBNYv/IQQORCcSi/9niYoAAIgBIyInC2VMSU8CREEAHbEiKmVEIicOZUSyFIsAshKyESWyECKyAbMnCyJniYoBAYv/IicEY0QWIicIZUSjJwmiiPeBi/8iJwVjRAmJigEAIicHZUxJTwJEQQAwIicSZUSL/wshBAqL/0sBCYz/IicIZUSL/xYnCaOLABaioCcITGciJwtlRAgnC0xniYoCACInCGVEIov+IicEY0xJTwJEQQAWiwIWiwCjJwmiiPcVi/4iJwVjRAmMAYsCi/8Ii/4iJwRjRIv/CIv+JwRPAmYiJwdlRIv/CCcHTGcWiwCjJwmiiPbfi/4nBU8CZosBQQAjsSIqZUSL/rIUiwFJTgKyErIRJbIQIrIBsxaL/kxQJxlMULCL/xaL/kxQgATPq4cjTFCwiTEAIicOZUQSRImKAQCI//AnDov/Z4k=",clear:"CoEBQw=="},events:[{name:"RewardsClaimed",args:[{type:"address",name:"user"},{type:"uint64",name:"pending"}]},{name:"Deposit",args:[{type:"address",name:"to"},{type:"uint64",name:"lpAmount"}]},{name:"Withdraw",args:[{type:"address",name:"from"},{type:"uint64",name:"lpAmount"}]},{name:"SwappedToVUsd",args:[{type:"address",name:"sender"},{type:"uint64",name:"tokenId"},{type:"uint64",name:"amount"},{type:"uint64",name:"vUsdAmount"},{type:"uint64",name:"fee"}]},{name:"SwappedFromVUsd",args:[{type:"address",name:"recipient"},{type:"uint64",name:"tokenId"},{type:"uint64",name:"vUsdAmount"},{type:"uint64",name:"amount"},{type:"uint64",name:"fee"}]}],templateVariables:{}},Dn=class{constructor(i){this.value=i}asByteArray(){return this.value}asString(){return this.value!==void 0?Buffer.from(this.value).toString("utf-8"):void 0}},v=class r{static get create(){return{_resolveByMethod(i){switch(i.method){case"createApplication":case"createApplication(address,address,uint64,uint64,uint64,uint64)void":return r.create.createApplication(i)}throw new Error("Unknown ' + verb + ' method")},createApplication(i){return{...i,method:"createApplication(address,address,uint64,uint64,uint64,uint64)void",args:Array.isArray(i.args)?i.args:[i.args.owner,i.args.router,i.args.a,i.args.assetId,i.args.feeShareBp,i.args.balanceRatioMinBp]}}}}static get optIn(){return{optInToApplication(i){return{...i,method:"optInToApplication()void",args:Array.isArray(i.args)?i.args:[]}}}}static optInAsset(i){return{...i,method:"optInAsset()void",args:Array.isArray(i.args)?i.args:[]}}static noop(i){return{...i,method:"noop()void",args:Array.isArray(i.args)?i.args:[]}}static deposit(i){return{...i,method:"deposit()void",args:Array.isArray(i.args)?i.args:[]}}static withdraw(i){return{...i,method:"withdraw(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.amountLp]}}static swapToVUsd(i){return{...i,method:"swapToVUsd(address,uint64,bool)uint64",args:Array.isArray(i.args)?i.args:[i.args.user,i.args.amount,i.args.zeroFee]}}static swapFromVUsd(i){return{...i,method:"swapFromVUsd(address,uint64,uint64,bool)uint64",args:Array.isArray(i.args)?i.args:[i.args.user,i.args.amount,i.args.receiveAmountMin,i.args.zeroFee]}}static setFeeShare(i){return{...i,method:"setFeeShare(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.feeShareBp]}}static adjustTotalLpAmount(i){return{...i,method:"adjustTotalLpAmount()void",args:Array.isArray(i.args)?i.args:[]}}static setBalanceRatioMinBp(i){return{...i,method:"setBalanceRatioMinBP(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.balanceRatioMinBp]}}static stopDeposit(i){return{...i,method:"stopDeposit()void",args:Array.isArray(i.args)?i.args:[]}}static startDeposit(i){return{...i,method:"startDeposit()void",args:Array.isArray(i.args)?i.args:[]}}static stopWithdraw(i){return{...i,method:"stopWithdraw()void",args:Array.isArray(i.args)?i.args:[]}}static startWithdraw(i){return{...i,method:"startWithdraw()void",args:Array.isArray(i.args)?i.args:[]}}static setStopAuthority(i){return{...i,method:"setStopAuthority(address)void",args:Array.isArray(i.args)?i.args:[i.args.stopAuthority]}}static setRouter(i){return{...i,method:"setRouter(address)void",args:Array.isArray(i.args)?i.args:[i.args.router]}}static claimRewards(i){return{...i,method:"claimRewards()void",args:Array.isArray(i.args)?i.args:[]}}static setAdminFeeShare(i){return{...i,method:"setAdminFeeShare(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.adminFeeShareBp]}}static claimAdminFee(i){return{...i,method:"claimAdminFee()void",args:Array.isArray(i.args)?i.args:[]}}static pendingReward(i){return{...i,method:"pendingReward(account)uint64",args:Array.isArray(i.args)?i.args:[i.args.user]}}static decimals(i){return{...i,method:"decimals()uint64",args:Array.isArray(i.args)?i.args:[]}}static transferOwnership(i){return{...i,method:"transferOwnership(address)void",args:Array.isArray(i.args)?i.args:[i.args.newOwner]}}};var En=class r{appClient;constructor(i){this.appClient=i instanceof Kn?i:new Kn({...i,appSpec:Un})}decodeReturnValue(i,a){return a!==void 0?ss(a,this.appClient.getABIMethod(i),Un.structs):void 0}static async fromCreatorAndName(i){return new r(await Kn.fromCreatorAndName({...i,appSpec:Un}))}static async fromNetwork(i){return new r(await Kn.fromNetwork({...i,appSpec:Un}))}get appId(){return this.appClient.appId}get appAddress(){return this.appClient.appAddress}get appName(){return this.appClient.appName}get appSpec(){return this.appClient.appSpec}get algorand(){return this.appClient.algorand}params={optIn:{optInToApplication:(i={args:[]})=>this.appClient.params.optIn(v.optIn.optInToApplication(i))},clearState:i=>this.appClient.params.bare.clearState(i),optInAsset:(i={args:[]})=>this.appClient.params.call(v.optInAsset(i)),noop:(i={args:[]})=>this.appClient.params.call(v.noop(i)),deposit:(i={args:[]})=>this.appClient.params.call(v.deposit(i)),withdraw:i=>this.appClient.params.call(v.withdraw(i)),swapToVUsd:i=>this.appClient.params.call(v.swapToVUsd(i)),swapFromVUsd:i=>this.appClient.params.call(v.swapFromVUsd(i)),setFeeShare:i=>this.appClient.params.call(v.setFeeShare(i)),adjustTotalLpAmount:(i={args:[]})=>this.appClient.params.call(v.adjustTotalLpAmount(i)),setBalanceRatioMinBp:i=>this.appClient.params.call(v.setBalanceRatioMinBp(i)),stopDeposit:(i={args:[]})=>this.appClient.params.call(v.stopDeposit(i)),startDeposit:(i={args:[]})=>this.appClient.params.call(v.startDeposit(i)),stopWithdraw:(i={args:[]})=>this.appClient.params.call(v.stopWithdraw(i)),startWithdraw:(i={args:[]})=>this.appClient.params.call(v.startWithdraw(i)),setStopAuthority:i=>this.appClient.params.call(v.setStopAuthority(i)),setRouter:i=>this.appClient.params.call(v.setRouter(i)),claimRewards:(i={args:[]})=>this.appClient.params.call(v.claimRewards(i)),setAdminFeeShare:i=>this.appClient.params.call(v.setAdminFeeShare(i)),claimAdminFee:(i={args:[]})=>this.appClient.params.call(v.claimAdminFee(i)),pendingReward:i=>this.appClient.params.call(v.pendingReward(i)),decimals:(i={args:[]})=>this.appClient.params.call(v.decimals(i)),transferOwnership:i=>this.appClient.params.call(v.transferOwnership(i))};createTransaction={optIn:{optInToApplication:(i={args:[]})=>this.appClient.createTransaction.optIn(v.optIn.optInToApplication(i))},clearState:i=>this.appClient.createTransaction.bare.clearState(i),optInAsset:(i={args:[]})=>this.appClient.createTransaction.call(v.optInAsset(i)),noop:(i={args:[]})=>this.appClient.createTransaction.call(v.noop(i)),deposit:(i={args:[]})=>this.appClient.createTransaction.call(v.deposit(i)),withdraw:i=>this.appClient.createTransaction.call(v.withdraw(i)),swapToVUsd:i=>this.appClient.createTransaction.call(v.swapToVUsd(i)),swapFromVUsd:i=>this.appClient.createTransaction.call(v.swapFromVUsd(i)),setFeeShare:i=>this.appClient.createTransaction.call(v.setFeeShare(i)),adjustTotalLpAmount:(i={args:[]})=>this.appClient.createTransaction.call(v.adjustTotalLpAmount(i)),setBalanceRatioMinBp:i=>this.appClient.createTransaction.call(v.setBalanceRatioMinBp(i)),stopDeposit:(i={args:[]})=>this.appClient.createTransaction.call(v.stopDeposit(i)),startDeposit:(i={args:[]})=>this.appClient.createTransaction.call(v.startDeposit(i)),stopWithdraw:(i={args:[]})=>this.appClient.createTransaction.call(v.stopWithdraw(i)),startWithdraw:(i={args:[]})=>this.appClient.createTransaction.call(v.startWithdraw(i)),setStopAuthority:i=>this.appClient.createTransaction.call(v.setStopAuthority(i)),setRouter:i=>this.appClient.createTransaction.call(v.setRouter(i)),claimRewards:(i={args:[]})=>this.appClient.createTransaction.call(v.claimRewards(i)),setAdminFeeShare:i=>this.appClient.createTransaction.call(v.setAdminFeeShare(i)),claimAdminFee:(i={args:[]})=>this.appClient.createTransaction.call(v.claimAdminFee(i)),pendingReward:i=>this.appClient.createTransaction.call(v.pendingReward(i)),decimals:(i={args:[]})=>this.appClient.createTransaction.call(v.decimals(i)),transferOwnership:i=>this.appClient.createTransaction.call(v.transferOwnership(i))};send={optIn:{optInToApplication:async(i={args:[]})=>{let a=await this.appClient.send.optIn(v.optIn.optInToApplication(i));return{...a,return:a.return}}},clearState:i=>this.appClient.send.bare.clearState(i),optInAsset:async(i={args:[]})=>{let a=await this.appClient.send.call(v.optInAsset(i));return{...a,return:a.return}},noop:async(i={args:[]})=>{let a=await this.appClient.send.call(v.noop(i));return{...a,return:a.return}},deposit:async(i={args:[]})=>{let a=await this.appClient.send.call(v.deposit(i));return{...a,return:a.return}},withdraw:async i=>{let a=await this.appClient.send.call(v.withdraw(i));return{...a,return:a.return}},swapToVUsd:async i=>{let a=await this.appClient.send.call(v.swapToVUsd(i));return{...a,return:a.return}},swapFromVUsd:async i=>{let a=await this.appClient.send.call(v.swapFromVUsd(i));return{...a,return:a.return}},setFeeShare:async i=>{let a=await this.appClient.send.call(v.setFeeShare(i));return{...a,return:a.return}},adjustTotalLpAmount:async(i={args:[]})=>{let a=await this.appClient.send.call(v.adjustTotalLpAmount(i));return{...a,return:a.return}},setBalanceRatioMinBp:async i=>{let a=await this.appClient.send.call(v.setBalanceRatioMinBp(i));return{...a,return:a.return}},stopDeposit:async(i={args:[]})=>{let a=await this.appClient.send.call(v.stopDeposit(i));return{...a,return:a.return}},startDeposit:async(i={args:[]})=>{let a=await this.appClient.send.call(v.startDeposit(i));return{...a,return:a.return}},stopWithdraw:async(i={args:[]})=>{let a=await this.appClient.send.call(v.stopWithdraw(i));return{...a,return:a.return}},startWithdraw:async(i={args:[]})=>{let a=await this.appClient.send.call(v.startWithdraw(i));return{...a,return:a.return}},setStopAuthority:async i=>{let a=await this.appClient.send.call(v.setStopAuthority(i));return{...a,return:a.return}},setRouter:async i=>{let a=await this.appClient.send.call(v.setRouter(i));return{...a,return:a.return}},claimRewards:async(i={args:[]})=>{let a=await this.appClient.send.call(v.claimRewards(i));return{...a,return:a.return}},setAdminFeeShare:async i=>{let a=await this.appClient.send.call(v.setAdminFeeShare(i));return{...a,return:a.return}},claimAdminFee:async(i={args:[]})=>{let a=await this.appClient.send.call(v.claimAdminFee(i));return{...a,return:a.return}},pendingReward:async i=>{let a=await this.appClient.send.call(v.pendingReward(i));return{...a,return:a.return}},decimals:async(i={args:[]})=>{let a=await this.appClient.send.call(v.decimals(i));return{...a,return:a.return}},transferOwnership:async i=>{let a=await this.appClient.send.call(v.transferOwnership(i));return{...a,return:a.return}}};clone(i){return new r(this.appClient.clone(i))}async pendingReward(i){return(await this.appClient.send.call(v.pendingReward(i))).return}async decimals(i={args:[]}){return(await this.appClient.send.call(v.decimals(i))).return}state={global:{getAll:async()=>{let i=await this.appClient.state.global.getAll();return{feeShareBp:i.feeShareBP,router:i.router,tokenBalance:i.tokenBalance,vUsdBalance:i.vUsdBalance,balanceRatioMinBp:i.balanceRatioMinBP,reserves:i.reserves,a:i.a,d:i.d,tokenAmountReduce:i.tokenAmountReduce,tokenAmountIncrease:i.tokenAmountIncrease,stopAuthority:i.stopAuthority,canDeposit:i.canDeposit,canWithdraw:i.canWithdraw,asset:i.asset,adminFeeShareBp:i.adminFeeShareBP,totalSupply:i.totalSupply,accRewardPerShareP:new Dn(i.accRewardPerShareP),adminFeeAmount:i.adminFeeAmount,owner:i.owner}},feeShareBp:async()=>await this.appClient.state.global.getValue("feeShareBP"),router:async()=>await this.appClient.state.global.getValue("router"),tokenBalance:async()=>await this.appClient.state.global.getValue("tokenBalance"),vUsdBalance:async()=>await this.appClient.state.global.getValue("vUsdBalance"),balanceRatioMinBp:async()=>await this.appClient.state.global.getValue("balanceRatioMinBP"),reserves:async()=>await this.appClient.state.global.getValue("reserves"),a:async()=>await this.appClient.state.global.getValue("a"),d:async()=>await this.appClient.state.global.getValue("d"),tokenAmountReduce:async()=>await this.appClient.state.global.getValue("tokenAmountReduce"),tokenAmountIncrease:async()=>await this.appClient.state.global.getValue("tokenAmountIncrease"),stopAuthority:async()=>await this.appClient.state.global.getValue("stopAuthority"),canDeposit:async()=>await this.appClient.state.global.getValue("canDeposit"),canWithdraw:async()=>await this.appClient.state.global.getValue("canWithdraw"),asset:async()=>await this.appClient.state.global.getValue("asset"),adminFeeShareBp:async()=>await this.appClient.state.global.getValue("adminFeeShareBP"),totalSupply:async()=>await this.appClient.state.global.getValue("totalSupply"),accRewardPerShareP:async()=>new Dn(await this.appClient.state.global.getValue("accRewardPerShareP")),adminFeeAmount:async()=>await this.appClient.state.global.getValue("adminFeeAmount"),owner:async()=>await this.appClient.state.global.getValue("owner")},local:i=>{let a=typeof i=="string"?i:ds(i.publicKey);return{getAll:async()=>{let o=await this.appClient.state.local(a).getAll();return{balance:o.balance,userRewardDebt:o.userRewardDebt}},balance:async()=>await this.appClient.state.local(a).getValue("balance"),userRewardDebt:async()=>await this.appClient.state.local(a).getValue("userRewardDebt")}}};newGroup(){let i=this,a=this.algorand.newGroup(),o=Promise.resolve(),s=[];return{optInAsset(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.optInAsset(d))),s.push(void 0),this},noop(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.noop(d))),s.push(void 0),this},deposit(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.deposit(d))),s.push(void 0),this},withdraw(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.withdraw(d))),s.push(void 0),this},swapToVUsd(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.swapToVUsd(d))),s.push(A=>i.decodeReturnValue("swapToVUsd(address,uint64,bool)uint64",A)),this},swapFromVUsd(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.swapFromVUsd(d))),s.push(A=>i.decodeReturnValue("swapFromVUsd(address,uint64,uint64,bool)uint64",A)),this},setFeeShare(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setFeeShare(d))),s.push(void 0),this},adjustTotalLpAmount(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.adjustTotalLpAmount(d))),s.push(void 0),this},setBalanceRatioMinBp(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setBalanceRatioMinBp(d))),s.push(void 0),this},stopDeposit(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.stopDeposit(d))),s.push(void 0),this},startDeposit(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.startDeposit(d))),s.push(void 0),this},stopWithdraw(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.stopWithdraw(d))),s.push(void 0),this},startWithdraw(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.startWithdraw(d))),s.push(void 0),this},setStopAuthority(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setStopAuthority(d))),s.push(void 0),this},setRouter(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setRouter(d))),s.push(void 0),this},claimRewards(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.claimRewards(d))),s.push(void 0),this},setAdminFeeShare(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setAdminFeeShare(d))),s.push(void 0),this},claimAdminFee(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.claimAdminFee(d))),s.push(void 0),this},pendingReward(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.pendingReward(d))),s.push(A=>i.decodeReturnValue("pendingReward(account)uint64",A)),this},decimals(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.decimals(d))),s.push(A=>i.decodeReturnValue("decimals()uint64",A)),this},transferOwnership(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.transferOwnership(d))),s.push(void 0),this},get optIn(){return{optInToApplication:d=>(o=o.then(async()=>a.addAppCallMethodCall(await i.params.optIn.optInToApplication(d))),s.push(void 0),this)}},clearState(d){return o=o.then(()=>a.addAppCall(i.params.clearState(d))),this},addTransaction(d,A){return o=o.then(()=>a.addTransaction(d,A)),this},async composer(){return await o,a},async simulate(d){await o;let A=await(d?a.simulate(d):a.simulate());return{...A,returns:A.returns?.map((g,c)=>s[c]!==void 0?s[c](g):g.returnValue)}},async send(d){await o;let A=await a.send(d);return{...A,returns:A.returns?.map((g,c)=>s[c]!==void 0?s[c](g):g.returnValue)}}}}};var q=class{lpAmount;rewardDebt;constructor(i){this.lpAmount=i.lpAmount,this.rewardDebt=i.rewardDebt}get userLiquidity(){return F(this.lpAmount,3).toFixed()}earned(i,a){let o=va(this.lpAmount,this.rewardDebt,i.accRewardPerShareP,i.p);return a?F(o,a).toFixed():o}};var ce=class{};var tn=class extends ce{constructor(a,o){super();this.algorand=a;this.api=o}chainType="ALG";P=48;async buildRawTransactionClaimRewards(a){let o=a.accountAddress,s=BigInt(a.token.tokenAddress),d=BigInt(a.token.poolAddress),A=this.getPool(d),g=this.algorand.newGroup();g.addAppCallMethodCall(await A.params.claimRewards({args:[],sender:o,extraFee:dt(1),assetReferences:[s]}));let{transactions:c}=await g.buildTransactions();return c=ra(c),_e(...c)}async buildRawTransactionDeposit(a){let o=a.accountAddress,s=BigInt(a.amount),d=BigInt(a.token.tokenAddress),A=BigInt(a.token.poolAddress),g=this.getPool(A),c=await Fn(A,o,this.algorand),l=this.algorand.newGroup();c||l.addAppCallMethodCall(await g.params.optIn.optInToApplication({args:[],sender:o})),l.addAssetTransfer({assetId:d,amount:s,sender:o,receiver:g.appAddress}),l.addAppCallMethodCall(await g.params.deposit({args:[],sender:o,extraFee:dt(1)})),yt({composer:l,appId:A,sender:o,count:4});let{transactions:u}=await l.buildTransactions();return u=ra(u),_e(...u)}async buildRawTransactionWithdraw(a){let o=a.accountAddress,s=BigInt(a.amount),d=BigInt(a.token.tokenAddress),A=BigInt(a.token.poolAddress),g=this.getPool(A),c=this.algorand.newGroup();c.addAppCallMethodCall(await g.params.withdraw({args:{amountLp:s},sender:o,extraFee:dt(2),assetReferences:[d]})),yt({composer:c,appId:A,sender:o,count:4});let{transactions:l}=await c.buildTransactions();return l=ra(l),_e(...l)}async getPoolInfoFromChain(a){let s=await this.getPool(BigInt(a.poolAddress)).state.global.getAll(),d=s.a?.toString(),A=s.d?.toString(),g=s.tokenBalance?.toString(),c=s.vUsdBalance?.toString(),l=s.totalSupply?.toString(),u=As(s.accRewardPerShareP?.asByteArray()??Uint8Array.from([])).toString();if(d&&A&&g&&c&&l&&u){let m=te({tokenBalance:g,vUsdBalance:c});return{aValue:d,dValue:A,tokenBalance:g,vUsdBalance:c,totalLpAmount:l,accRewardPerShareP:u,p:this.P,imbalance:m}}throw new I("Unable to pool info from chain")}async getUserBalanceInfo(a,o){let s=BigInt(o.poolAddress),d=this.getPool(s);try{let{balance:A,userRewardDebt:g}=await d.state.local(a).getAll();if(A!==void 0&&g!==void 0)return new q({lpAmount:A.toString(),rewardDebt:g.toString()})}catch{let c=(await this.algorand.account.getInformation(a)).appsLocalState;if(c&&!c.find(({id:u})=>u===s))return new q({lpAmount:"0",rewardDebt:"0"})}throw new I("Unable to get user balance")}getPool(a){return this.algorand.client.getTypedAppClientById(En,{appId:a})}};import{Web3 as ot}from"web3";var gs={abi:[{inputs:[{internalType:"address",name:"_router",type:"address"},{internalType:"uint256",name:"_a",type:"uint256"},{internalType:"contract ERC20",name:"_token",type:"address"},{internalType:"uint16",name:"_feeShareBP",type:"uint16"},{internalType:"uint256",name:"_balanceRatioMinBP",type:"uint256"},{internalType:"string",name:"lpName",type:"string"},{internalType:"string",name:"lpSymbol",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Deposit",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"RewardsClaimed",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"recipient",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"vUsdAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"fee",type:"uint256"}],name:"SwappedFromVUsd",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"vUsdAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"fee",type:"uint256"}],name:"SwappedToVUsd",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[],name:"a",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"accRewardPerShareP",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"adjustTotalLpAmount",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"adminFeeAmount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"adminFeeShareBP",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"balanceRatioMinBP",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"canDeposit",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"canWithdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"claimAdminFee",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"claimRewards",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"d",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"}],name:"deposit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"feeShareBP",outputs:[{internalType:"uint16",name:"",type:"uint16"}],stateMutability:"view",type:"function"},{inputs:[],name:"getPrice",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"x",type:"uint256"}],name:"getY",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"pendingReward",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"reserves",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"router",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"_adminFeeShareBP",type:"uint256"}],name:"setAdminFeeShare",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_balanceRatioMinBP",type:"uint256"}],name:"setBalanceRatioMinBP",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint16",name:"_feeShareBP",type:"uint16"}],name:"setFeeShare",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_router",type:"address"}],name:"setRouter",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_stopAuthority",type:"address"}],name:"setStopAuthority",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"startDeposit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"startWithdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"stopDeposit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"stopWithdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"receiveAmountMin",type:"uint256"},{internalType:"bool",name:"zeroFee",type:"bool"}],name:"swapFromVUsd",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bool",name:"zeroFee",type:"bool"}],name:"swapToVUsd",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"token",outputs:[{internalType:"contract ERC20",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"tokenBalance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"userRewardDebt",outputs:[{internalType:"uint256",name:"amount",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"vUsdBalance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amountLp",type:"uint256"}],name:"withdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},nn=gs;var an=class extends ce{constructor(a,o){super();this.web3=a;this.api=o}chainType="EVM";P=52;async getUserBalanceInfo(a,o){let s;try{s=await Rn(this.getUserBalanceInfoByBatch(a,o),`Cannot get UserBalanceInfo for ${o.name} on ${o.chainSymbol}`,5e3)}catch{s=await wi(()=>this.getUserBalanceInfoPerProperty(a,o),`Cannot get UserBalanceInfo for ${o.name} on ${o.chainSymbol}`,5,2e3)}return s}async getPoolInfoFromChain(a){let o;try{o=await Rn(this.getPoolInfoByBatch(a),`Cannot get PoolInfo for ${a.name} on ${a.chainSymbol}`,5e3)}catch{o=await wi(()=>this.getPoolInfoPerProperty(a),`Cannot get PoolInfo for ${a.name} on ${a.chainSymbol}`,5,2e3)}return o}async getUserBalanceInfoByBatch(a,o){let s=new this.web3.eth.BatchRequest,d=this.getPoolContract(o.poolAddress),A=d.methods.userRewardDebt(a).encodeABI(),g=d.methods.balanceOf(a).encodeABI();s.add({method:"eth_call",params:[{to:o.poolAddress,data:A},"latest"]}),s.add({method:"eth_call",params:[{to:o.poolAddress,data:g},"latest"]});let[c,l]=await s.execute();if(c&&l&&!c.error&&!l.error)return new q({lpAmount:ot.utils.toBigInt(l.result).toString(),rewardDebt:ot.utils.toBigInt(c.result).toString()});throw new Error("Batched failed")}async getUserBalanceInfoPerProperty(a,o){let s=(await this.getPoolContract(o.poolAddress).methods.userRewardDebt(a).call()).toString(),d=(await this.getPoolContract(o.poolAddress).methods.balanceOf(a).call()).toString();return new q({lpAmount:d,rewardDebt:s})}async getPoolInfoByBatch(a){let o=new this.web3.eth.BatchRequest,s=this.getPoolContract(a.poolAddress),d=s.methods.a().encodeABI(),A=s.methods.d().encodeABI(),g=s.methods.tokenBalance().encodeABI(),c=s.methods.vUsdBalance().encodeABI(),l=s.methods.totalSupply().encodeABI(),u=s.methods.accRewardPerShareP().encodeABI();o.add({method:"eth_call",params:[{to:a.poolAddress,data:d},"latest"]}),o.add({method:"eth_call",params:[{to:a.poolAddress,data:A},"latest"]}),o.add({method:"eth_call",params:[{to:a.poolAddress,data:g},"latest"]}),o.add({method:"eth_call",params:[{to:a.poolAddress,data:c},"latest"]}),o.add({method:"eth_call",params:[{to:a.poolAddress,data:l},"latest"]}),o.add({method:"eth_call",params:[{to:a.poolAddress,data:u},"latest"]});let[m,p,b,W,y,Y]=await o.execute();if(m&&p&&b&&W&&y&&Y&&!m.error&&!p.error&&!b.error&&!W.error&&!y.error&&!Y.error){let B=ot.utils.toBigInt(b.result).toString(),h=ot.utils.toBigInt(W.result).toString(),Z=te({tokenBalance:B,vUsdBalance:h});return{aValue:ot.utils.toBigInt(m.result).toString(),dValue:ot.utils.toBigInt(p.result).toString(),tokenBalance:B,vUsdBalance:h,totalLpAmount:ot.utils.toBigInt(y.result).toString(),accRewardPerShareP:ot.utils.toBigInt(Y.result).toString(),p:this.P,imbalance:Z}}throw new Error("Batched failed")}async getPoolInfoPerProperty(a){let o=this.getPoolContract(a.poolAddress),s=(await o.methods.a().call()).toString(),d=(await o.methods.d().call()).toString(),A=(await o.methods.tokenBalance().call()).toString(),g=(await o.methods.vUsdBalance().call()).toString(),c=(await o.methods.totalSupply().call()).toString(),l=(await o.methods.accRewardPerShareP().call()).toString(),u=te({tokenBalance:A,vUsdBalance:g});return{aValue:s,dValue:d,tokenBalance:A,vUsdBalance:g,totalLpAmount:c,accRewardPerShareP:l,p:this.P,imbalance:u}}async buildRawTransactionDeposit(a){return Promise.resolve({...this.buildTxParams(a),data:this.getPoolContract(a.token.poolAddress).methods.deposit(a.amount).encodeABI()})}async buildRawTransactionWithdraw(a){return Promise.resolve({...this.buildTxParams(a),data:this.getPoolContract(a.token.poolAddress).methods.withdraw(a.amount).encodeABI()})}async buildRawTransactionClaimRewards(a){return Promise.resolve({...this.buildTxParams(a),data:this.getPoolContract(a.token.poolAddress).methods.claimRewards().encodeABI()})}buildTxParams(a){return{from:a.accountAddress,to:a.token.poolAddress,value:"0"}}getPoolContract(a){return new this.web3.eth.Contract(nn.abi,a)}};var _n=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s}async approve(i,a){if(a){let o=i,s=a;return this.tokenService.buildRawTransactionApprove({...s,spender:s.token.poolAddress},o)}else{let o=i;return this.tokenService.buildRawTransactionApprove({...o,spender:o.token.poolAddress})}}async deposit(i,a){return V(i.amount),H("amount",i.amount,i.token.decimals),i.amount=f(i.amount,i.token.decimals).toFixed(),Ft(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionDeposit(i)}async withdraw(i,a){return V(i.amount),H("amount",i.amount,i.token.decimals),i.amount=f(i.amount,3).toFixed(),Ft(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionWithdraw(i)}async claimRewards(i,a){return Ft(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionClaimRewards(i)}};import{AnchorProvider as cs,BN as Wo,Program as ls,Spl as us,web3 as ms}from"@project-serum/anchor";import{Connection as ps,PublicKey as rt}from"@solana/web3.js";var $n=class extends ce{constructor(a,o){super();this.solanaRpcUrl=a;this.api=o}chainType="SOLANA";P=48;async getUserBalanceInfo(a,o){let s=this.buildAnchorProvider(a),d=this.getBridge(o.bridgeAddress,s),A=new rt(o.poolAddress),g=await d.account.pool.fetch(A);try{let c=await ji(new rt(a),g.mint,d.programId),{lpAmount:l,rewardDebt:u}=await d.account.userDeposit.fetch(c);return new q({lpAmount:l.toString(),rewardDebt:u.toString()})}catch{return new q({lpAmount:"0",rewardDebt:"0"})}}async getPoolInfoFromChain(a){let o=this.buildAnchorProvider(a.bridgeAddress),s=await this.getBridge(a.bridgeAddress,o).account.pool.fetch(a.poolAddress),d=s.vUsdBalance.toString(),A=s.tokenBalance.toString(),g=te({tokenBalance:A,vUsdBalance:d});return{dValue:s.d.toString(),aValue:s.a.toString(),totalLpAmount:s.totalLpAmount.toString(),vUsdBalance:d,tokenBalance:A,accRewardPerShareP:s.accRewardPerShareP.toString(),p:this.P,imbalance:g}}async buildRawTransactionDeposit(a){let{bridge:o,accounts:s,preInstructions:d}=await this.prepareDataForTransaction(a),A=await o.methods.deposit(new Wo(a.amount)).accounts(s).preInstructions(d).transaction();return A.recentBlockhash=(await this.buildAnchorProvider(a.accountAddress).connection.getLatestBlockhash()).blockhash,A.feePayer=new rt(a.accountAddress),await Wt(A,a.txFeeParams,this.solanaRpcUrl),A}async buildRawTransactionWithdraw(a){let{bridge:o,accounts:s,preInstructions:d}=await this.prepareDataForTransaction(a),A=await o.methods.withdraw(new Wo(a.amount)).accounts(s).preInstructions(d).transaction();return A.recentBlockhash=(await this.buildAnchorProvider(a.accountAddress).connection.getLatestBlockhash()).blockhash,A.feePayer=new rt(a.accountAddress),await Wt(A,a.txFeeParams,this.solanaRpcUrl),A}async buildRawTransactionClaimRewards(a){let{bridge:o,accounts:s,preInstructions:d}=await this.prepareDataForTransaction(a),A=await o.methods.claimRewards().accounts(s).preInstructions(d).transaction();return A.recentBlockhash=(await this.buildAnchorProvider(a.accountAddress).connection.getLatestBlockhash()).blockhash,A.feePayer=new rt(a.accountAddress),await Wt(A,a.txFeeParams,this.solanaRpcUrl),A}async prepareDataForTransaction(a){let o=this.buildAnchorProvider(a.accountAddress),s=this.getBridge(a.token.bridgeAddress,o),{accounts:d,preInstructions:A}=await this._getLPTransactionData(s,a.token.poolAddress,a.accountAddress,o);return{bridge:s,accounts:d,preInstructions:A}}getBridge(a,o){return new ls(_t,a,o)}buildAnchorProvider(a){let o=new ps(this.solanaRpcUrl,"confirmed"),s=new rt(a);return new cs(o,{publicKey:s},{preflightCommitment:"confirmed",commitment:"confirmed"})}async _getLPTransactionData(a,o,s,d){let A=new rt(s),g=await qe(a.programId),c=await vt(a.programId),l=new rt(o),m=(await a.account.pool.fetch(l)).mint,p=await we(A,m),b=await Yt(m,a.programId),W=await ji(A,m,a.programId),y=[ms.ComputeBudgetProgram.setComputeUnitLimit({units:1e6})];try{await Rt(p,d)}catch{let Z=await us.associatedToken(d).methods.create().accounts({mint:m,owner:A,associatedAccount:p}).instruction();y.push(Z)}try{await a.account.userDeposit.fetch(W)}catch{let h=await a.methods.initDepositAccount().accounts({mint:m,user:A,userDeposit:W}).instruction();y.push(h)}return{accounts:{mint:m,user:A,config:g,pool:l,bridgeAuthority:c,userDeposit:W,userToken:p,bridgeToken:b},preInstructions:y}}};import{contract as ZW}from"@stellar/stellar-sdk";import{contract as t}from"@stellar/stellar-sdk";var Cs=t.Spec,Is=t.Client;var qn=class extends Is{constructor(a){super(new Cs(["AAAAAAAAAAAAAAAKaW5pdGlhbGl6ZQAAAAAABwAAAAAAAAAFYWRtaW4AAAAAAAATAAAAAAAAAAZicmlkZ2UAAAAAABMAAAAAAAAAAWEAAAAAAAAKAAAAAAAAAAV0b2tlbgAAAAAAABMAAAAAAAAADGZlZV9zaGFyZV9icAAAAAoAAAAAAAAAFGJhbGFuY2VfcmF0aW9fbWluX2JwAAAACgAAAAAAAAASYWRtaW5fZmVlX3NoYXJlX2JwAAAAAAAKAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAHZGVwb3NpdAAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABmFtb3VudAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAId2l0aGRyYXcAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAACWFtb3VudF9scAAAAAAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAANc3dhcF90b192X3VzZAAAAAAAAAMAAAAAAAAABHVzZXIAAAATAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAACHplcm9fZmVlAAAAAQAAAAEAAAPpAAAACgAAAAM=","AAAAAAAAAAAAAAAPc3dhcF9mcm9tX3ZfdXNkAAAAAAQAAAAAAAAABHVzZXIAAAATAAAAAAAAAAt2dXNkX2Ftb3VudAAAAAAKAAAAAAAAABJyZWNlaXZlX2Ftb3VudF9taW4AAAAAAAoAAAAAAAAACHplcm9fZmVlAAAAAQAAAAEAAAPpAAAACgAAAAM=","AAAAAAAAAAAAAAANY2xhaW1fcmV3YXJkcwAAAAAAAAEAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAdgYWRtaW5gAAAAAA1zZXRfZmVlX3NoYXJlAAAAAAAAAQAAAAAAAAAMZmVlX3NoYXJlX2JwAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAWYWRqdXN0X3RvdGFsX2xwX2Ftb3VudAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAYc2V0X2JhbGFuY2VfcmF0aW9fbWluX2JwAAAAAQAAAAAAAAAUYmFsYW5jZV9yYXRpb19taW5fYnAAAAAKAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAMc3RvcF9kZXBvc2l0AAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAANc3RhcnRfZGVwb3NpdAAAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAANc3RvcF93aXRoZHJhdwAAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAAOc3RhcnRfd2l0aGRyYXcAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAASc2V0X3N0b3BfYXV0aG9yaXR5AAAAAAABAAAAAAAAAA5zdG9wX2F1dGhvcml0eQAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAKc2V0X2JyaWRnZQAAAAAAAQAAAAAAAAAGYnJpZGdlAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAJc2V0X2FkbWluAAAAAAAAAQAAAAAAAAAJbmV3X2FkbWluAAAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAATc2V0X2FkbWluX2ZlZV9zaGFyZQAAAAABAAAAAAAAABJhZG1pbl9mZWVfc2hhcmVfYnAAAAAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAAPY2xhaW1fYWRtaW5fZmVlAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAZgdmlld2AAAAAAAA5wZW5kaW5nX3Jld2FyZAAAAAAAAQAAAAAAAAAEdXNlcgAAABMAAAABAAAD6QAAAAoAAAAD","AAAAAAAAAAAAAAAIZ2V0X3Bvb2wAAAAAAAAAAQAAA+kAAAfQAAAABFBvb2wAAAAD","AAAAAAAAAAAAAAAJZ2V0X2FkbWluAAAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=","AAAAAAAAAAAAAAASZ2V0X3N0b3BfYXV0aG9yaXR5AAAAAAAAAAAAAQAAA+kAAAATAAAAAw==","AAAAAAAAAAAAAAAKZ2V0X2JyaWRnZQAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=","AAAAAAAAAAAAAAAQZ2V0X3VzZXJfZGVwb3NpdAAAAAEAAAAAAAAABHVzZXIAAAATAAAAAQAAA+kAAAfQAAAAC1VzZXJEZXBvc2l0AAAAAAM=","AAAAAAAAAAAAAAAHdXBncmFkZQAAAAABAAAAAAAAAA1uZXdfd2FzbV9oYXNoAAAAAAAD7gAAACAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAQAAAAAAAAAAAAAAD1N3YXBwZWRGcm9tVlVzZAAAAAAFAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAA2ZlZQAAAAAKAAAAAAAAAAlyZWNpcGllbnQAAAAAAAATAAAAAAAAAAV0b2tlbgAAAAAAABMAAAAAAAAAC3Z1c2RfYW1vdW50AAAAAAo=","AAAAAQAAAAAAAAAAAAAADVN3YXBwZWRUb1ZVc2QAAAAAAAAFAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAA2ZlZQAAAAAKAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABXRva2VuAAAAAAAAEwAAAAAAAAALdnVzZF9hbW91bnQAAAAACg==","AAAAAQAAAAAAAAAAAAAAB0RlcG9zaXQAAAAAAgAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAR1c2VyAAAAEw==","AAAAAQAAAAAAAAAAAAAACFdpdGhkcmF3AAAAAgAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAR1c2VyAAAAEw==","AAAAAQAAAAAAAAAAAAAADlJld2FyZHNDbGFpbWVkAAAAAAACAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAABHVzZXIAAAAT","AAAAAQAAAAAAAAAAAAAABkJyaWRnZQAAAAAAAQAAAAAAAAABMAAAAAAAABM=","AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAQAAAAEAAAAAAAAAC1VzZXJEZXBvc2l0AAAAAAEAAAAT","AAAAAQAAAAAAAAAAAAAABFBvb2wAAAAPAAAAAAAAAAFhAAAAAAAACgAAAAAAAAAWYWNjX3Jld2FyZF9wZXJfc2hhcmVfcAAAAAAACgAAAAAAAAAQYWRtaW5fZmVlX2Ftb3VudAAAAAoAAAAAAAAAEmFkbWluX2ZlZV9zaGFyZV9icAAAAAAACgAAAAAAAAAUYmFsYW5jZV9yYXRpb19taW5fYnAAAAAKAAAAAAAAAAtjYW5fZGVwb3NpdAAAAAABAAAAAAAAAAxjYW5fd2l0aGRyYXcAAAABAAAAAAAAAAFkAAAAAAAACgAAAAAAAAAIZGVjaW1hbHMAAAAEAAAAAAAAAAxmZWVfc2hhcmVfYnAAAAAKAAAAAAAAAAhyZXNlcnZlcwAAAAoAAAAAAAAABXRva2VuAAAAAAAAEwAAAAAAAAANdG9rZW5fYmFsYW5jZQAAAAAAAAoAAAAAAAAAD3RvdGFsX2xwX2Ftb3VudAAAAAAKAAAAAAAAAA12X3VzZF9iYWxhbmNlAAAAAAAACg==","AAAAAQAAAAAAAAAAAAAAC1VzZXJEZXBvc2l0AAAAAAIAAAAAAAAACWxwX2Ftb3VudAAAAAAAAAoAAAAAAAAAC3Jld2FyZF9kZWJ0AAAAAAo=","AAAAAQAAAAAAAAAAAAAABUFkbWluAAAAAAAAAQAAAAAAAAABMAAAAAAAABM=","AAAAAQAAAAAAAAAAAAAAEEdhc09yYWNsZUFkZHJlc3MAAAABAAAAAAAAAAEwAAAAAAAAEw==","AAAAAQAAAAAAAAAAAAAACEdhc1VzYWdlAAAAAQAAAAAAAAABMAAAAAAAA+wAAAAEAAAACg==","AAAAAQAAAAAAAAAAAAAAC05hdGl2ZVRva2VuAAAAAAEAAAAAAAAAATAAAAAAAAAT","AAAAAQAAAAAAAAAAAAAADVN0b3BBdXRob3JpdHkAAAAAAAABAAAAAAAAAAEwAAAAAAAAEw==","AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAKAAAAAAAAAANVW5pbXBsZW1lbnRlZAAAAAAAAAAAAAAAAAAAC0luaXRpYWxpemVkAAAAAAEAAAAAAAAADVVuaW5pdGlhbGl6ZWQAAAAAAAACAAAAAAAAAAxVbmF1dGhvcml6ZWQAAAADAAAAAAAAAApJbnZhbGlkQXJnAAAAAAAEAAAAAAAAAA5JbnZhbGlkQ2hhaW5JZAAAAAAABQAAAAAAAAATSW52YWxpZE90aGVyQ2hhaW5JZAAAAAAGAAAAAAAAAA5HYXNVc2FnZU5vdFNldAAAAAAABwAAAAAAAAANQnJva2VuQWRkcmVzcwAAAAAAAAgAAAAAAAAACE5vdEZvdW5kAAAACQAAAAAAAAAYVG9rZW5JbnN1ZmZpY2llbnRCYWxhbmNlAAAACgAAAAAAAAAKQ2FzdEZhaWxlZAAAAAAACwAAAAAAAAAMVTI1Nk92ZXJmbG93AAAADAAAAAAAAAAKWmVyb0Ftb3VudAAAAAAAZwAAAAAAAAAMUG9vbE92ZXJmbG93AAAAaAAAAAAAAAALWmVyb0NoYW5nZXMAAAAAaQAAAAAAAAARUmVzZXJ2ZXNFeGhhdXN0ZWQAAAAAAABqAAAAAAAAABpJbnN1ZmZpY2llbnRSZWNlaXZlZEFtb3VudAAAAAAAawAAAAAAAAAUQmFsYW5jZVJhdGlvRXhjZWVkZWQAAABsAAAAAAAAAAlGb3JiaWRkZW4AAAAAAABtAAAAAAAAABlVbmF1dGhvcml6ZWRTdG9wQXV0aG9yaXR5AAAAAAAAywAAAAAAAAAOU3dhcFByb2hpYml0ZWQAAAAAAMwAAAAAAAAAEkFtb3VudFRvb0xvd0ZvckZlZQAAAAAAzQAAAAAAAAAWQnJpZGdlVG9UaGVaZXJvQWRkcmVzcwAAAAAAzgAAAAAAAAAORW1wdHlSZWNpcGllbnQAAAAAAM8AAAAAAAAAE1NvdXJjZU5vdFJlZ2lzdGVyZWQAAAAA0AAAAAAAAAAVV3JvbmdEZXN0aW5hdGlvbkNoYWluAAAAAAAA0QAAAAAAAAATVW5rbm93bkFub3RoZXJDaGFpbgAAAADSAAAAAAAAABFUb2tlbnNBbHJlYWR5U2VudAAAAAAAANMAAAAAAAAAEE1lc3NhZ2VQcm9jZXNzZWQAAADUAAAAAAAAAAxOb3RFbm91Z2hGZWUAAADWAAAAAAAAAAlOb01lc3NhZ2UAAAAAAADXAAAAAAAAAA1Ob1JlY2VpdmVQb29sAAAAAAAA2AAAAAAAAAAGTm9Qb29sAAAAAADZAAAAAAAAABNVbmtub3duQW5vdGhlclRva2VuAAAAANoAAAAAAAAAD1dyb25nQnl0ZUxlbmd0aAAAAAEsAAAAAAAAAApIYXNNZXNzYWdlAAAAAAEtAAAAAAAAABdJbnZhbGlkUHJpbWFyeVNpZ25hdHVyZQAAAAEuAAAAAAAAABlJbnZhbGlkU2Vjb25kYXJ5U2lnbmF0dXJlAAAAAAABLwAAAAAAAAARTm9HYXNEYXRhRm9yQ2hhaW4AAAAAAAGQ"]),a);this.options=a}fromJSON={initialize:this.txFromJSON,deposit:this.txFromJSON,withdraw:this.txFromJSON,swap_to_v_usd:this.txFromJSON,swap_from_v_usd:this.txFromJSON,claim_rewards:this.txFromJSON,set_fee_share:this.txFromJSON,adjust_total_lp_amount:this.txFromJSON,set_balance_ratio_min_bp:this.txFromJSON,stop_deposit:this.txFromJSON,start_deposit:this.txFromJSON,stop_withdraw:this.txFromJSON,start_withdraw:this.txFromJSON,set_stop_authority:this.txFromJSON,set_bridge:this.txFromJSON,set_admin:this.txFromJSON,set_admin_fee_share:this.txFromJSON,claim_admin_fee:this.txFromJSON,pending_reward:this.txFromJSON,get_pool:this.txFromJSON,get_admin:this.txFromJSON,get_stop_authority:this.txFromJSON,get_bridge:this.txFromJSON,get_user_deposit:this.txFromJSON,upgrade:this.txFromJSON}};import{contract as pC,rpc as bs}from"@stellar/stellar-sdk";var Bo=bs.Api;function ft(r){let{simulation:i,options:a}=r;if(!i)throw new Error("Soroban assembled transaction does not have simulation");if(Bo.isSimulationSuccess(i))return i.result==null?void 0:a.parseResultXdr(i.result.retval);throw new Error(i.error)}function Nt(r){let{simulation:i}=r;if(!i)throw new Error("Soroban assembled transaction does not have simulation");return Bo.isSimulationError(i)}var ei=class extends ce{constructor(a,o,s){super();this.nodeRpcUrlsConfig=a;this.params=o;this.api=s}chainType="SRB";P=48;async getUserBalanceInfo(a,o){let d=await this.getContract(o.poolAddress).get_user_deposit({user:a});if(Nt(d))throw new I;let A=ft(d);if(!A)throw new I;let g=A.unwrap();return new q({lpAmount:g.lp_amount.toString(),rewardDebt:g.reward_debt.toString()})}async getPoolInfoFromChain(a){let s=await this.getContract(a.poolAddress).get_pool();if(Nt(s))throw new I;let d=ft(s);if(!d)throw new I;let A=d.unwrap();return{aValue:A.a.toString(),accRewardPerShareP:A.acc_reward_per_share_p.toString(),dValue:A.d.toString(),tokenBalance:A.token_balance.toString(),p:this.P,totalLpAmount:A.total_lp_amount.toString(),vUsdBalance:A.v_usd_balance.toString(),imbalance:te({tokenBalance:A.token_balance.toString(),vUsdBalance:A.v_usd_balance.toString()})}}async buildRawTransactionDeposit(a){return(await this.getContract(a.token.poolAddress,a.accountAddress).deposit({sender:a.accountAddress,amount:BigInt(a.amount)})).toXDR()}async buildRawTransactionWithdraw(a){return(await this.getContract(a.token.poolAddress,a.accountAddress).withdraw({sender:a.accountAddress,amount_lp:BigInt(a.amount)})).toXDR()}async buildRawTransactionClaimRewards(a){return(await this.getContract(a.token.poolAddress,a.accountAddress).claim_rewards({sender:a.accountAddress})).toXDR()}getContract(a,o){let s={publicKey:o,contractId:a,networkPassphrase:this.params.sorobanNetworkPassphrase,rpcUrl:this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")};return new qn(s)}};import{SuiClient as Bs}from"@mysten/sui/client";import{Transaction as Ai}from"@mysten/sui/transactions";var wt=Ne(nt());ne();ne();import{bcs as Zo}from"@mysten/sui/bcs";import{fromB64 as ys}from"@mysten/sui/utils";function ti(r){return r=G(r),r.startsWith(`${at}::balance::Balance<`)}var re=class r{__StructClass=!0;static get $typeName(){return`${at}::balance::Balance`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;value;constructor(i,a){this.$fullTypeName=j(r.$typeName,...i),this.$typeArgs=i,this.value=a.value}static reified(i){return{typeName:r.$typeName,fullTypeName:j(r.$typeName,T(i)),typeArgs:[T(i)],isPhantom:r.$isPhantom,reifiedTypeArgs:[i],fromFields:a=>r.fromFields(i,a),fromFieldsWithTypes:a=>r.fromFieldsWithTypes(i,a),fromBcs:a=>r.fromBcs(i,a),bcs:r.bcs,fromJSONField:a=>r.fromJSONField(i,a),fromJSON:a=>r.fromJSON(i,a),fromSuiParsedData:a=>r.fromSuiParsedData(i,a),fromSuiObjectData:a=>r.fromSuiObjectData(i,a),fetch:async(a,o)=>r.fetch(a,i,o),new:a=>new r([T(i)],a),kind:"StructClassReified"}}static get r(){return r.reified}static phantom(i){return U(r.reified(i))}static get p(){return r.phantom}static get bcs(){return Zo.struct("Balance",{value:Zo.u64()})}static fromFields(i,a){return r.reified(i).new({value:L("u64",a.value)})}static fromFieldsWithTypes(i,a){if(!ti(a.type))throw new Error("not a Balance type");return ze(a,[i]),r.reified(i).new({value:S("u64",a.fields.value)})}static fromBcs(i,a){return r.fromFields(i,r.bcs.parse(a))}toJSONField(){return{value:this.value.toString()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i,a){return r.reified(i).new({value:M("u64",a.value)})}static fromJSON(i,a){if(a.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return Ve(j(r.$typeName,T(i)),a.$typeArgs,[i]),r.fromJSONField(i,a)}static fromSuiParsedData(i,a){if(a.dataType!=="moveObject")throw new Error("not an object");if(!ti(a.type))throw new Error(`object at ${a.fields.id} is not a Balance object`);return r.fromFieldsWithTypes(i,a)}static fromSuiObjectData(i,a){if(a.bcs){if(a.bcs.dataType!=="moveObject"||!ti(a.bcs.type))throw new Error("object at is not a Balance object");let o=oe(a.bcs.type).typeArgs;if(o.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${o.length}'`);let s=G(o[0]),d=G(T(i));if(s!==G(T(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,ys(a.bcs.bcsBytes))}if(a.content)return r.fromSuiParsedData(i,a.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a,o){let s=await i.getObject({id:o,options:{showBcs:!0}});if(s.error)throw new Error(`error fetching Balance object at id ${o}: ${s.error.code}`);if(s.data?.bcs?.dataType!=="moveObject"||!ti(s.data.bcs.type))throw new Error(`object at id ${o} is not a Balance object`);return r.fromSuiObjectData(a,s.data)}};var Aa=Ne(nt());ne();var sa=Ne(nt());import{bcs as ni}from"@mysten/sui/bcs";import{fromB64 as hs}from"@mysten/sui/utils";function ii(r){return r=G(r),r.startsWith(`${sa.PKG_V1}::pool_rewards::PoolRewards<`)}var mt=class r{__StructClass=!0;static get $typeName(){return`${sa.PKG_V1}::pool_rewards::PoolRewards`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;accRewardPerShareP;adminFeeShareBp;adminFee;rewards;lpSupply;constructor(i,a){this.$fullTypeName=j(r.$typeName,...i),this.$typeArgs=i,this.accRewardPerShareP=a.accRewardPerShareP,this.adminFeeShareBp=a.adminFeeShareBp,this.adminFee=a.adminFee,this.rewards=a.rewards,this.lpSupply=a.lpSupply}static reified(i){return{typeName:r.$typeName,fullTypeName:j(r.$typeName,T(i)),typeArgs:[T(i)],isPhantom:r.$isPhantom,reifiedTypeArgs:[i],fromFields:a=>r.fromFields(i,a),fromFieldsWithTypes:a=>r.fromFieldsWithTypes(i,a),fromBcs:a=>r.fromBcs(i,a),bcs:r.bcs,fromJSONField:a=>r.fromJSONField(i,a),fromJSON:a=>r.fromJSON(i,a),fromSuiParsedData:a=>r.fromSuiParsedData(i,a),fromSuiObjectData:a=>r.fromSuiObjectData(i,a),fetch:async(a,o)=>r.fetch(a,i,o),new:a=>new r([T(i)],a),kind:"StructClassReified"}}static get r(){return r.reified}static phantom(i){return U(r.reified(i))}static get p(){return r.phantom}static get bcs(){return ni.struct("PoolRewards",{acc_reward_per_share_p:ni.u128(),admin_fee_share_bp:ni.u64(),admin_fee:re.bcs,rewards:re.bcs,lp_supply:ni.u64()})}static fromFields(i,a){return r.reified(i).new({accRewardPerShareP:L("u128",a.acc_reward_per_share_p),adminFeeShareBp:L("u64",a.admin_fee_share_bp),adminFee:L(re.reified(i),a.admin_fee),rewards:L(re.reified(i),a.rewards),lpSupply:L("u64",a.lp_supply)})}static fromFieldsWithTypes(i,a){if(!ii(a.type))throw new Error("not a PoolRewards type");return ze(a,[i]),r.reified(i).new({accRewardPerShareP:S("u128",a.fields.acc_reward_per_share_p),adminFeeShareBp:S("u64",a.fields.admin_fee_share_bp),adminFee:S(re.reified(i),a.fields.admin_fee),rewards:S(re.reified(i),a.fields.rewards),lpSupply:S("u64",a.fields.lp_supply)})}static fromBcs(i,a){return r.fromFields(i,r.bcs.parse(a))}toJSONField(){return{accRewardPerShareP:this.accRewardPerShareP.toString(),adminFeeShareBp:this.adminFeeShareBp.toString(),adminFee:this.adminFee.toJSONField(),rewards:this.rewards.toJSONField(),lpSupply:this.lpSupply.toString()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i,a){return r.reified(i).new({accRewardPerShareP:M("u128",a.accRewardPerShareP),adminFeeShareBp:M("u64",a.adminFeeShareBp),adminFee:M(re.reified(i),a.adminFee),rewards:M(re.reified(i),a.rewards),lpSupply:M("u64",a.lpSupply)})}static fromJSON(i,a){if(a.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return Ve(j(r.$typeName,T(i)),a.$typeArgs,[i]),r.fromJSONField(i,a)}static fromSuiParsedData(i,a){if(a.dataType!=="moveObject")throw new Error("not an object");if(!ii(a.type))throw new Error(`object at ${a.fields.id} is not a PoolRewards object`);return r.fromFieldsWithTypes(i,a)}static fromSuiObjectData(i,a){if(a.bcs){if(a.bcs.dataType!=="moveObject"||!ii(a.bcs.type))throw new Error("object at is not a PoolRewards object");let o=oe(a.bcs.type).typeArgs;if(o.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${o.length}'`);let s=G(o[0]),d=G(T(i));if(s!==G(T(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,hs(a.bcs.bcsBytes))}if(a.content)return r.fromSuiParsedData(i,a.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a,o){let s=await i.getObject({id:o,options:{showBcs:!0}});if(s.error)throw new Error(`error fetching PoolRewards object at id ${o}: ${s.error.code}`);if(s.data?.bcs?.dataType!=="moveObject"||!ii(s.data.bcs.type))throw new Error(`object at id ${o} is not a PoolRewards object`);return r.fromSuiObjectData(a,s.data)}};ne();var da=Ne(nt());import{bcs as Tt}from"@mysten/sui/bcs";import{fromB64 as vs}from"@mysten/sui/utils";function ai(r){return r=G(r),r.startsWith(`${da.PKG_V1}::pool_state::PoolState<`)}var pt=class r{__StructClass=!0;static get $typeName(){return`${da.PKG_V1}::pool_state::PoolState`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;tokenBalance;vusdBalance;d;a;balanceRatioMinBp;constructor(i,a){this.$fullTypeName=j(r.$typeName,...i),this.$typeArgs=i,this.tokenBalance=a.tokenBalance,this.vusdBalance=a.vusdBalance,this.d=a.d,this.a=a.a,this.balanceRatioMinBp=a.balanceRatioMinBp}static reified(i){return{typeName:r.$typeName,fullTypeName:j(r.$typeName,T(i)),typeArgs:[T(i)],isPhantom:r.$isPhantom,reifiedTypeArgs:[i],fromFields:a=>r.fromFields(i,a),fromFieldsWithTypes:a=>r.fromFieldsWithTypes(i,a),fromBcs:a=>r.fromBcs(i,a),bcs:r.bcs,fromJSONField:a=>r.fromJSONField(i,a),fromJSON:a=>r.fromJSON(i,a),fromSuiParsedData:a=>r.fromSuiParsedData(i,a),fromSuiObjectData:a=>r.fromSuiObjectData(i,a),fetch:async(a,o)=>r.fetch(a,i,o),new:a=>new r([T(i)],a),kind:"StructClassReified"}}static get r(){return r.reified}static phantom(i){return U(r.reified(i))}static get p(){return r.phantom}static get bcs(){return Tt.struct("PoolState",{token_balance:Tt.u64(),vusd_balance:Tt.u64(),d:Tt.u64(),a:Tt.u64(),balance_ratio_min_bp:Tt.u64()})}static fromFields(i,a){return r.reified(i).new({tokenBalance:L("u64",a.token_balance),vusdBalance:L("u64",a.vusd_balance),d:L("u64",a.d),a:L("u64",a.a),balanceRatioMinBp:L("u64",a.balance_ratio_min_bp)})}static fromFieldsWithTypes(i,a){if(!ai(a.type))throw new Error("not a PoolState type");return ze(a,[i]),r.reified(i).new({tokenBalance:S("u64",a.fields.token_balance),vusdBalance:S("u64",a.fields.vusd_balance),d:S("u64",a.fields.d),a:S("u64",a.fields.a),balanceRatioMinBp:S("u64",a.fields.balance_ratio_min_bp)})}static fromBcs(i,a){return r.fromFields(i,r.bcs.parse(a))}toJSONField(){return{tokenBalance:this.tokenBalance.toString(),vusdBalance:this.vusdBalance.toString(),d:this.d.toString(),a:this.a.toString(),balanceRatioMinBp:this.balanceRatioMinBp.toString()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i,a){return r.reified(i).new({tokenBalance:M("u64",a.tokenBalance),vusdBalance:M("u64",a.vusdBalance),d:M("u64",a.d),a:M("u64",a.a),balanceRatioMinBp:M("u64",a.balanceRatioMinBp)})}static fromJSON(i,a){if(a.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return Ve(j(r.$typeName,T(i)),a.$typeArgs,[i]),r.fromJSONField(i,a)}static fromSuiParsedData(i,a){if(a.dataType!=="moveObject")throw new Error("not an object");if(!ai(a.type))throw new Error(`object at ${a.fields.id} is not a PoolState object`);return r.fromFieldsWithTypes(i,a)}static fromSuiObjectData(i,a){if(a.bcs){if(a.bcs.dataType!=="moveObject"||!ai(a.bcs.type))throw new Error("object at is not a PoolState object");let o=oe(a.bcs.type).typeArgs;if(o.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${o.length}'`);let s=G(o[0]),d=G(T(i));if(s!==G(T(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,vs(a.bcs.bcsBytes))}if(a.content)return r.fromSuiParsedData(i,a.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a,o){let s=await i.getObject({id:o,options:{showBcs:!0}});if(s.error)throw new Error(`error fetching PoolState object at id ${o}: ${s.error.code}`);if(s.data?.bcs?.dataType!=="moveObject"||!ai(s.data.bcs.type))throw new Error(`object at id ${o} is not a PoolState object`);return r.fromSuiObjectData(a,s.data)}};import{bcs as on}from"@mysten/sui/bcs";import{fromB64 as Ys}from"@mysten/sui/utils";function oi(r){return r=G(r),r.startsWith(`${Aa.PKG_V1}::pool::Pool<`)}var ri=class r{__StructClass=!0;static get $typeName(){return`${Aa.PKG_V1}::pool::Pool`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;id;state;rewards;feeShareBp;canDeposit;canWithdraw;decimals;balance;constructor(i,a){this.$fullTypeName=j(r.$typeName,...i),this.$typeArgs=i,this.id=a.id,this.state=a.state,this.rewards=a.rewards,this.feeShareBp=a.feeShareBp,this.canDeposit=a.canDeposit,this.canWithdraw=a.canWithdraw,this.decimals=a.decimals,this.balance=a.balance}static reified(i){return{typeName:r.$typeName,fullTypeName:j(r.$typeName,T(i)),typeArgs:[T(i)],isPhantom:r.$isPhantom,reifiedTypeArgs:[i],fromFields:a=>r.fromFields(i,a),fromFieldsWithTypes:a=>r.fromFieldsWithTypes(i,a),fromBcs:a=>r.fromBcs(i,a),bcs:r.bcs,fromJSONField:a=>r.fromJSONField(i,a),fromJSON:a=>r.fromJSON(i,a),fromSuiParsedData:a=>r.fromSuiParsedData(i,a),fromSuiObjectData:a=>r.fromSuiObjectData(i,a),fetch:async(a,o)=>r.fetch(a,i,o),new:a=>new r([T(i)],a),kind:"StructClassReified"}}static get r(){return r.reified}static phantom(i){return U(r.reified(i))}static get p(){return r.phantom}static get bcs(){return on.struct("Pool",{id:Ze.bcs,state:pt.bcs,rewards:mt.bcs,fee_share_bp:on.u64(),can_deposit:on.bool(),can_withdraw:on.bool(),decimals:on.u8(),balance:re.bcs})}static fromFields(i,a){return r.reified(i).new({id:L(Ze.reified(),a.id),state:L(pt.reified(i),a.state),rewards:L(mt.reified(i),a.rewards),feeShareBp:L("u64",a.fee_share_bp),canDeposit:L("bool",a.can_deposit),canWithdraw:L("bool",a.can_withdraw),decimals:L("u8",a.decimals),balance:L(re.reified(i),a.balance)})}static fromFieldsWithTypes(i,a){if(!oi(a.type))throw new Error("not a Pool type");return ze(a,[i]),r.reified(i).new({id:S(Ze.reified(),a.fields.id),state:S(pt.reified(i),a.fields.state),rewards:S(mt.reified(i),a.fields.rewards),feeShareBp:S("u64",a.fields.fee_share_bp),canDeposit:S("bool",a.fields.can_deposit),canWithdraw:S("bool",a.fields.can_withdraw),decimals:S("u8",a.fields.decimals),balance:S(re.reified(i),a.fields.balance)})}static fromBcs(i,a){return r.fromFields(i,r.bcs.parse(a))}toJSONField(){return{id:this.id,state:this.state.toJSONField(),rewards:this.rewards.toJSONField(),feeShareBp:this.feeShareBp.toString(),canDeposit:this.canDeposit,canWithdraw:this.canWithdraw,decimals:this.decimals,balance:this.balance.toJSONField()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i,a){return r.reified(i).new({id:M(Ze.reified(),a.id),state:M(pt.reified(i),a.state),rewards:M(mt.reified(i),a.rewards),feeShareBp:M("u64",a.feeShareBp),canDeposit:M("bool",a.canDeposit),canWithdraw:M("bool",a.canWithdraw),decimals:M("u8",a.decimals),balance:M(re.reified(i),a.balance)})}static fromJSON(i,a){if(a.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return Ve(j(r.$typeName,T(i)),a.$typeArgs,[i]),r.fromJSONField(i,a)}static fromSuiParsedData(i,a){if(a.dataType!=="moveObject")throw new Error("not an object");if(!oi(a.type))throw new Error(`object at ${a.fields.id} is not a Pool object`);return r.fromFieldsWithTypes(i,a)}static fromSuiObjectData(i,a){if(a.bcs){if(a.bcs.dataType!=="moveObject"||!oi(a.bcs.type))throw new Error("object at is not a Pool object");let o=oe(a.bcs.type).typeArgs;if(o.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${o.length}'`);let s=G(o[0]),d=G(T(i));if(s!==G(T(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,Ys(a.bcs.bcsBytes))}if(a.content)return r.fromSuiParsedData(i,a.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a,o){let s=await i.getObject({id:o,options:{showBcs:!0}});if(s.error)throw new Error(`error fetching Pool object at id ${o}: ${s.error.code}`);if(s.data?.bcs?.dataType!=="moveObject"||!oi(s.data.bcs.type))throw new Error(`object at id ${o} is not a Pool object`);return r.fromSuiObjectData(a,s.data)}};ne();var ca=Ne(nt());import{bcs as ga}from"@mysten/sui/bcs";import{fromB64 as Rs}from"@mysten/sui/utils";function si(r){return r=G(r),r.startsWith(`${ca.PKG_V1}::user_deposit::UserDeposit<`)}var di=class r{__StructClass=!0;static get $typeName(){return`${ca.PKG_V1}::user_deposit::UserDeposit`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;id;lpAmount;rewardDebt;constructor(i,a){this.$fullTypeName=j(r.$typeName,...i),this.$typeArgs=i,this.id=a.id,this.lpAmount=a.lpAmount,this.rewardDebt=a.rewardDebt}static reified(i){return{typeName:r.$typeName,fullTypeName:j(r.$typeName,T(i)),typeArgs:[T(i)],isPhantom:r.$isPhantom,reifiedTypeArgs:[i],fromFields:a=>r.fromFields(i,a),fromFieldsWithTypes:a=>r.fromFieldsWithTypes(i,a),fromBcs:a=>r.fromBcs(i,a),bcs:r.bcs,fromJSONField:a=>r.fromJSONField(i,a),fromJSON:a=>r.fromJSON(i,a),fromSuiParsedData:a=>r.fromSuiParsedData(i,a),fromSuiObjectData:a=>r.fromSuiObjectData(i,a),fetch:async(a,o)=>r.fetch(a,i,o),new:a=>new r([T(i)],a),kind:"StructClassReified"}}static get r(){return r.reified}static phantom(i){return U(r.reified(i))}static get p(){return r.phantom}static get bcs(){return ga.struct("UserDeposit",{id:Ze.bcs,lp_amount:ga.u64(),reward_debt:ga.u64()})}static fromFields(i,a){return r.reified(i).new({id:L(Ze.reified(),a.id),lpAmount:L("u64",a.lp_amount),rewardDebt:L("u64",a.reward_debt)})}static fromFieldsWithTypes(i,a){if(!si(a.type))throw new Error("not a UserDeposit type");return ze(a,[i]),r.reified(i).new({id:S(Ze.reified(),a.fields.id),lpAmount:S("u64",a.fields.lp_amount),rewardDebt:S("u64",a.fields.reward_debt)})}static fromBcs(i,a){return r.fromFields(i,r.bcs.parse(a))}toJSONField(){return{id:this.id,lpAmount:this.lpAmount.toString(),rewardDebt:this.rewardDebt.toString()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i,a){return r.reified(i).new({id:M(Ze.reified(),a.id),lpAmount:M("u64",a.lpAmount),rewardDebt:M("u64",a.rewardDebt)})}static fromJSON(i,a){if(a.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return Ve(j(r.$typeName,T(i)),a.$typeArgs,[i]),r.fromJSONField(i,a)}static fromSuiParsedData(i,a){if(a.dataType!=="moveObject")throw new Error("not an object");if(!si(a.type))throw new Error(`object at ${a.fields.id} is not a UserDeposit object`);return r.fromFieldsWithTypes(i,a)}static fromSuiObjectData(i,a){if(a.bcs){if(a.bcs.dataType!=="moveObject"||!si(a.bcs.type))throw new Error("object at is not a UserDeposit object");let o=oe(a.bcs.type).typeArgs;if(o.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${o.length}'`);let s=G(o[0]),d=G(T(i));if(s!==G(T(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,Rs(a.bcs.bcsBytes))}if(a.content)return r.fromSuiParsedData(i,a.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a,o){let s=await i.getObject({id:o,options:{showBcs:!0}});if(s.error)throw new Error(`error fetching UserDeposit object at id ${o}: ${s.error.code}`);if(s.data?.bcs?.dataType!=="moveObject"||!si(s.data.bcs.type))throw new Error(`object at id ${o} is not a UserDeposit object`);return r.fromSuiObjectData(a,s.data)}};function Fo(r,i,a){if(i.length===0||!i[0])return[];let o=i[0],s=r.reduce((g,c)=>g+BigInt(c),BigInt(0)),d=BigInt(o.balance),A=[];for(let g of i.slice(1)){if(d>s)return Go(a,o,A,r);d+=BigInt(g.balance),A.push(g)}return d>=s?Go(a,o,A,r):[]}function Go(r,i,a,o){let s=o.map(d=>r.pure.u64(d));return a.length>0&&r.mergeCoins(i.coinObjectId,a.map(d=>d.coinObjectId)),r.splitCoins(i.coinObjectId,s)}var Ws="0x0000000000000000000000000000000000000000000000000000000000000000";async function fo(r,i,a){let o=await r.devInspectTransactionBlock({sender:Ws,transactionBlock:i});if(o.effects.status.status!=="success")throw new Error(`inspectionResult failed. ${JSON.stringify(o,null,2)}`);let s=o.results?.pop()?.returnValues?.pop();if(!s)throw new Error(`Something with inspectionResult went wrong. ${JSON.stringify(o,null,2)}`);let[d,A]=s;return typeof a=="object"?a.fromBcs(Uint8Array.from(d)).toJSONField():qt(a).parse(Uint8Array.from(d))}var gi=class extends ce{constructor(a,o){super();this.suiRpcUrl=a;this.api=o;this.client=new Bs({url:a})}chainType="SUI";client;async getUserBalanceInfo(a,o){if(!o.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let s=o.suiAddresses;if(!s)throw new I("SUI token must contain 'suiAddresses'");(0,wt.setAddress)(s.bridgeAddress,s.bridgeAddressOrigin);let A=(await this.fetchDeposits(a,o.originTokenAddress)).reduce((g,c)=>{if(c.data)return g.lpAmount+=BigInt(c.data.content.fields.lp_amount),g.rewardDebt+=BigInt(c.data.content.fields.reward_debt),g;throw new I("Deposits fetch failed")},{lpAmount:BigInt(0),rewardDebt:BigInt(0)});return new q({lpAmount:A.lpAmount.toString(),rewardDebt:A.rewardDebt.toString()})}async fetchDeposits(a,o){return await xe(s=>this.client.getOwnedObjects({owner:a,filter:{StructType:di.phantom(U(o)).phantomType},options:{showContent:!0},cursor:s}))}async getPoolInfoFromChain(a){let o=a.suiAddresses;if(!o)throw new I("SUI token must contain 'suiAddresses'");if((0,wt.setAddress)(o.bridgeAddress,o.bridgeAddressOrigin),!a.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let s=48,d=new Ai;Ao(d,a.originTokenAddress,o.bridgeObjectAddress);let A=await fo(this.client,d,ri.reified(U(a.originTokenAddress))),g=A.state.tokenBalance,c=A.state.vusdBalance,l=te({tokenBalance:g,vUsdBalance:c});return{dValue:A.state.d,aValue:A.state.a,totalLpAmount:A.rewards.lpSupply,vUsdBalance:c,tokenBalance:g,accRewardPerShareP:A.rewards.accRewardPerShareP,p:s,imbalance:l}}async buildRawTransactionDeposit(a){let o=a.token.suiAddresses;if(!o)throw new I("SUI token must contain 'suiAddresses'");if((0,wt.setAddress)(o.bridgeAddress,o.bridgeAddressOrigin),!a.token.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let s=await xe(m=>this.client.getCoins({owner:a.accountAddress,coinType:a.token.originTokenAddress,cursor:m}));if(s.length===0||!s[0])throw new Qe("No coins to deposit");let d=s[0],A=new Ai;A.setSender(a.accountAddress);let{depositObj:g,isNewDeposit:c}=await this.getDepositObject(a.accountAddress,a.token.originTokenAddress,A),[l]=Fo([a.amount],s,A);if(!l)throw new Qe("No coins to deposit");if(!a.token.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let u=oo(A,a.token.originTokenAddress,{bridge:o.bridgeObjectAddress,userDeposit:g,coin:l});return A.mergeCoins(d.coinObjectId,[u]),c&&A.transferObjects([g],a.accountAddress),await A.toJSON({client:this.client})}async getDepositObject(a,o,s){let d=await this.fetchDeposits(a,o);if(d.length===0||!d[0]){let A=U(o).phantomType;return{depositObj:go(s,A),isNewDeposit:!0}}else{if(d[0].data?.objectId)return{depositObj:d[0].data.objectId,isNewDeposit:!1};throw new I("Something went wrong while deposit")}}async buildRawTransactionWithdraw(a){let o=a.token.suiAddresses;if(!o)throw new I("SUI token must contain 'suiAddresses'");if((0,wt.setAddress)(o.bridgeAddress,o.bridgeAddressOrigin),!a.token.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let s=U(a.token.originTokenAddress).phantomType,d=new Ai;d.setSender(a.accountAddress);let{depositObj:A,isNewDeposit:g}=await this.getDepositObject(a.accountAddress,a.token.originTokenAddress,d);if(g)throw new Qe("No deposit found");let c=ro(d,s,{bridge:o.bridgeObjectAddress,userDeposit:A,amountLp:BigInt(a.amount)}),l=await xe(u=>this.client.getCoins({owner:a.accountAddress,coinType:a.token.originTokenAddress,cursor:u}));if(!c[0]||!c[1])throw new I("No rewards found");return l[0]?d.mergeCoins(l[0].coinObjectId,[c[0],c[1]]):(d.mergeCoins(c[0],[c[1]]),d.transferObjects([c[0]],a.accountAddress)),await d.toJSON({client:this.client})}async buildRawTransactionClaimRewards(a){let o=a.token.suiAddresses;if(!o)throw new I("SUI token must contain 'suiAddresses'");if((0,wt.setAddress)(o.bridgeAddress,o.bridgeAddressOrigin),!a.token.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let s=U(a.token.originTokenAddress).phantomType,d=new Ai;d.setSender(a.accountAddress);let{depositObj:A,isNewDeposit:g}=await this.getDepositObject(a.accountAddress,a.token.originTokenAddress,d);if(g)throw new Qe("No deposit found");let c=so(d,s,{bridge:o.bridgeObjectAddress,userDeposit:A}),l=await xe(u=>this.client.getCoins({owner:a.accountAddress,coinType:a.token.originTokenAddress,cursor:u}));return l[0]?d.mergeCoins(l[0].coinObjectId,[c]):d.transferObjects([c],a.accountAddress),await d.toJSON({client:this.client})}};import{Web3 as ci}from"web3";import{encodeFunctionCall as Zs}from"web3-eth-abi";var rn=class extends ce{constructor(a,o,s){super();this.tronWeb=a;this.api=o;this.tronJsonRpc=s}chainType="TRX";P=52;async getUserBalanceInfo(a,o){let s;if(this.tronJsonRpc)try{s=await this.getUserBalanceInfoByBatch(this.tronJsonRpc,a,o)}catch{s=await this.getUserBalanceInfoPerProperty(a,o)}else s=await this.getUserBalanceInfoPerProperty(a,o);return s}async getUserBalanceInfoByBatch(a,o,s){let d=Qt(s.poolAddress),A=Qt(o),g=[{jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:d,data:this.getFunctionAbi("userRewardDebt",A)},"latest"]},{jsonrpc:"2.0",id:2,method:"eth_call",params:[{to:d,data:this.getFunctionAbi("balanceOf",A)},"latest"]}],l=await(await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)})).json();if(Array.isArray(l)&&l.length===2){let u=m=>{let p=l.find(b=>b.id===m);if(!p||!p.result)throw new Error(`Missing or invalid result for id ${m}`);return ci.utils.toBigInt(p.result).toString()};return new q({lpAmount:ci.utils.toBigInt(u(2)).toString(),rewardDebt:ci.utils.toBigInt(u(1)).toString()})}throw new Error("Batched HTTP call failed")}async getUserBalanceInfoPerProperty(a,o){this.tronWeb.defaultAddress.base58||this.tronWeb.setAddress(a);let s=this.getContract(o.poolAddress),d=(await s.methods.userRewardDebt(a).call()).toString(),A=(await s.methods.balanceOf(a).call()).toString();return new q({lpAmount:A,rewardDebt:d})}async getPoolInfoFromChain(a){let o;if(this.tronJsonRpc)try{o=await this.getPoolInfoByBatch(this.tronJsonRpc,a)}catch{o=await this.getPoolInfoPerProperty(a)}else o=await this.getPoolInfoPerProperty(a);return o}async getPoolInfoByBatch(a,o){let s=Qt(o.poolAddress),d=[{jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:s,data:this.getFunctionAbi("a")},"latest"]},{jsonrpc:"2.0",id:2,method:"eth_call",params:[{to:s,data:this.getFunctionAbi("d")},"latest"]},{jsonrpc:"2.0",id:3,method:"eth_call",params:[{to:s,data:this.getFunctionAbi("tokenBalance")},"latest"]},{jsonrpc:"2.0",id:4,method:"eth_call",params:[{to:s,data:this.getFunctionAbi("vUsdBalance")},"latest"]},{jsonrpc:"2.0",id:5,method:"eth_call",params:[{to:s,data:this.getFunctionAbi("totalSupply")},"latest"]},{jsonrpc:"2.0",id:6,method:"eth_call",params:[{to:s,data:this.getFunctionAbi("accRewardPerShareP")},"latest"]}],g=await(await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d)})).json();if(Array.isArray(g)&&g.length===6){let c=p=>{let b=g.find(W=>W.id===p);if(!b||!b.result)throw new Error(`Missing or invalid result for id ${p}`);return ci.utils.toBigInt(b.result).toString()},l=c(3),u=c(4),m=te({tokenBalance:l,vUsdBalance:u});return{aValue:c(1),dValue:c(2),tokenBalance:l,vUsdBalance:u,totalLpAmount:c(5),accRewardPerShareP:c(6),p:this.P,imbalance:m}}throw new Error("Batched pool info call failed")}async getPoolInfoPerProperty(a){this.tronWeb.defaultAddress.base58||this.tronWeb.setAddress(a.poolAddress);let o=this.getContract(a.poolAddress),[s,d,A,g,c,l]=await Promise.all([o.methods.a().call(),o.methods.d().call(),o.methods.tokenBalance().call(),o.methods.vUsdBalance().call(),o.methods.totalSupply().call(),o.methods.accRewardPerShareP().call()]),u=A.toString(),m=g.toString(),p=te({tokenBalance:u,vUsdBalance:m});return{aValue:s.toString(),dValue:d.toString(),tokenBalance:u,vUsdBalance:m,totalLpAmount:c.toString(),accRewardPerShareP:l.toString(),p:this.P,imbalance:p}}buildRawTransactionDeposit(a){let{amount:o,accountAddress:s}=a,d=[{type:"uint256",value:o}];return this.buildRawTransaction(a.token.poolAddress,"deposit(uint256)",d,"0",s)}buildRawTransactionWithdraw(a){let{amount:o,accountAddress:s}=a,d=[{type:"uint256",value:o}];return this.buildRawTransaction(a.token.poolAddress,"withdraw(uint256)",d,"0",s)}buildRawTransactionClaimRewards(a){let{accountAddress:o}=a,s=[];return this.buildRawTransaction(a.token.poolAddress,"claimRewards()",s,"0",o)}async buildRawTransaction(a,o,s,d,A){let g=await this.tronWeb.transactionBuilder.triggerSmartContract(a,o,{callValue:+d},s,A);if(!g?.result?.result)throw new I("Unknown error: "+JSON.stringify(g,null,2));return g.transaction}getContract(a){return this.tronWeb.contract(nn.abi,a)}getFunctionAbi(a,...o){let s=nn.abi.find(d=>d.type==="function"&&"name"in d&&d.name===a);if(!s)throw new Error(`${a} method not found in Pool ABI`);return Zs(s,o)}};var li=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s;this.rawTxBuilder=new _n(i,a,this.params,s);let d=o.cachePoolInfoChainSec>0?o.cachePoolInfoChainSec*1e3:20*1e3;this.cache=new Fs({defaultTtl:d})}rawTxBuilder;cache;async getAllowance(i,a){if(a){let o=i,s=a;return await this.tokenService.getAllowance({...s,spender:s.token.poolAddress},o)}else{let o=i;return await this.tokenService.getAllowance({...o,spender:o.token.poolAddress})}}async checkAllowance(i,a){if(a){let o=i,s=a;return this.tokenService.checkAllowance({...s,spender:s.token.poolAddress},o)}else{let o=i;return this.tokenService.checkAllowance({...o,spender:o.token.poolAddress})}}async approve(i,a){return this.tokenService.approve(i,{...a,spender:a.token.poolAddress})}async getAmountToBeDeposited(i,a,o){V(i),H("amount",i,a.decimals);let s=await this.getPoolInfoFromChain(a,o),{vUsdBalance:d,tokenBalance:A,aValue:g,dValue:c}=s,l=Yo(i,g,c,A,d);return F(l,3).toFixed()}async getAmountToBeWithdrawn(i,a,o,s){V(i),H("amount",i,o.decimals);let d=await this.getPoolInfoFromChain(o,s),A=Ro(i),g=be(A,o.decimals),l=(await this.getUserBalanceInfo(a,o,s)).earned(d)||"0",u=Gs(g).plus(l).toFixed();return F(u,o.decimals).toFixed()}async getUserBalanceInfo(i,a,o){return Ft(a.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,o).getUserBalanceInfo(i,a)}async getPoolInfoFromChain(i,a){let o={chainSymbol:i.chainSymbol,poolAddress:i.poolAddress},s=this.cache.get(o);if(s)return s;{let d=await Ft(i.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).getPoolInfoFromChain(i);return this.cache.put(o,d),this.api.cachePut({chainSymbol:i.chainSymbol,poolAddress:i.poolAddress},d),d}}};function Ft(r,i,a,o,s){switch(X.getChainProperty(r).chainType){case"EVM":{if(s)return new an(s,i);{let d=a.getNodeRpcUrl(r),A=new ws(d);return A.defaultReturnFormat={number:Ts.STR,bytes:Ns.HEX},new an(A,i)}}case"TRX":{let d=a.getNodeRpcUrl(r),A=o.tronJsonRpc;if(s)return new rn(s,i,A);{let g=new fs({fullHost:d});return new rn(g,i,A)}}case"SOLANA":{let d=a.getNodeRpcUrl(r);return new $n(d,i)}case"SRB":return new ei(a,o,i);case"SUI":return new gi(a.getNodeRpcUrl(r),i);case"ALG":if(s){let d=s,A=No.fromClients({algod:d});return new tn(A,i)}else{let d=a.getNodeRpcUrl(r),A=No.fromConfig({algodConfig:{server:d}});return new tn(A,i)}}}import{TronWeb as Ss}from"tronweb";import{FMT_BYTES as Ms,FMT_NUMBER as Hs,Web3 as Ls}from"web3";var Xs={abi:[{inputs:[{internalType:"string",name:"tokenName_",type:"string"},{internalType:"string",name:"tokenSymbol_",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"lpAmount",type:"uint256"}],name:"Deposited",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"address",name:"token",type:"address"}],name:"DepositedRewards",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256[4]",name:"values",type:"uint256[4]"}],name:"MultiTransfer",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdrawn",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[],name:"NUM_TOKENS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"},{internalType:"uint256",name:"minVirtualAmount",type:"uint256"}],name:"deposit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"depositRewards",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"}],name:"getEstimatedAmountOnDeposit",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"index",type:"uint256"}],name:"getRewardsAmount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"},{internalType:"uint256",name:"virtualAmount",type:"uint256"}],name:"getWithdrawProportionAmount",outputs:[{internalType:"uint256[4]",name:"",type:"uint256[4]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"pools",outputs:[{internalType:"contract IPool",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"index",type:"uint256"},{internalType:"contract IPool",name:"pool",type:"address"}],name:"setPool",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"index",type:"uint256"}],name:"subBalanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"index",type:"uint256"}],name:"subDepositRewards",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"index",type:"uint256"}],name:"subTotalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"}],name:"subTransfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"}],name:"subTransferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"virtualAmount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"}],name:"subWithdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"tokens",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"virtualAmount",type:"uint256"}],name:"withdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},ui=Xs;var Ct=class{};var sn=class extends Ct{constructor(a,o){super();this.web3=a;this.api=o}chainType="EVM";async balanceOf(a){let o=(await this.getYieldContract(a.token.yieldAddress).methods.balanceOf(a.owner).call()).toString();return F(o,3).toFixed()}async getEstimatedAmountOnDeposit(a){let o=f(a.amount,a.token.decimals).toFixed(),s=(await this.getYieldContract(a.token.yieldAddress).methods.getEstimatedAmountOnDeposit(o,a.token.yieldId).call()).toString();return F(s,3).toFixed()}async getWithdrawProportionAmount(a){let o=f(a.amount,3).toFixed();return await this.getYieldContract(a.cydToken.yieldAddress).methods.getWithdrawProportionAmount(a.owner,o).call()}async buildRawTransactionDeposit(a){return Promise.resolve({...this.buildTxParams({owner:a.owner,yieldAddress:a.token.yieldAddress}),data:this.getYieldContract(a.token.yieldAddress).methods.deposit(a.amount,a.token.yieldId,a.minVirtualAmount).encodeABI()})}async buildRawTransactionWithdraw(a){return Promise.resolve({...this.buildTxParams({owner:a.owner,yieldAddress:a.token.yieldAddress}),data:this.getYieldContract(a.token.yieldAddress).methods.withdraw(a.amount).encodeABI()})}buildTxParams(a){return{from:a.owner,to:a.yieldAddress,value:"0"}}getYieldContract(a){return new this.web3.eth.Contract(ui.abi,a)}};var mi=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s}async approve(i,a){return this.tokenService.buildRawTransactionApprove({...i,spender:i.token.yieldAddress},a)}async deposit(i,a){return V(i.amount),H("amount",i.amount,i.token.decimals),V(i.minVirtualAmount),H("minVirtualAmount",i.minVirtualAmount,3),i.amount=f(i.amount,i.token.decimals).toFixed(),i.minVirtualAmount=f(i.minVirtualAmount,3).toFixed(),Xt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.owner,a).buildRawTransactionDeposit(i)}async withdraw(i,a){return V(i.amount),H("amount",i.amount,3),i.amount=f(i.amount,3).toFixed(),Xt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.owner,a).buildRawTransactionWithdraw(i)}};var dn=class extends Ct{constructor(a,o){super();this.tronWeb=a;this.api=o}chainType="TRX";async balanceOf(a){let o=(await(await this.getContract(a.token.yieldAddress)).methods.balanceOf(a.owner).call()).toString();return F(o,3).toFixed()}async getEstimatedAmountOnDeposit(a){let o=f(a.amount,a.token.decimals).toFixed(),s=(await(await this.getContract(a.token.yieldAddress)).methods.getEstimatedAmountOnDeposit(o,a.token.yieldId).call()).toString();return F(s,3).toFixed()}async getWithdrawProportionAmount(a){let o=f(a.amount,3).toFixed();return(await(await this.getContract(a.cydToken.yieldAddress)).methods.getWithdrawProportionAmount(a.owner,o).call()).toString().split(",")}async buildRawTransactionDeposit(a){let{amount:o,owner:s,token:d,minVirtualAmount:A}=a,g=[{type:"uint256",value:o},{type:"uint256",value:d.yieldId},{type:"uint256",value:A}];return this.buildRawTransaction(a.token.yieldAddress,"deposit(uint256,uint256,uint256)",g,"0",s)}async buildRawTransactionWithdraw(a){let{amount:o,owner:s}=a,d=[{type:"uint256",value:o}];return this.buildRawTransaction(a.token.yieldAddress,"withdraw(uint256)",d,"0",s)}async buildRawTransaction(a,o,s,d,A){let g=await this.tronWeb.transactionBuilder.triggerSmartContract(a,o,{callValue:+d},s,A);if(!g?.result?.result)throw new I("Unknown error: "+JSON.stringify(g,null,2));return g.transaction}getContract(a){return this.tronWeb.contract(ui.abi,a)}};function Vs(r){if(!pi(r))throw new vn("Token does not support Yield")}function pi(r){return!!r.yieldAddress&&r.yieldId!==void 0}var Ci=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s;this.rawTxBuilder=new mi(i,a,o,s)}rawTxBuilder;async getCYDTokens(){let i=[],a=await this.api.getChainDetailsMap("pool");return Object.values(a).forEach(o=>{if(o.yieldAddress){let s=o.tokens.find(A=>A.tokenAddress===o.yieldAddress),d=o.tokens.filter(pi);if(d.length>0){let A=s??{allbridgeChainId:o.allbridgeChainId,apr:"",apr30d:"",apr7d:"",bridgeId:o.bridgeId,bridgeAddress:o.bridgeAddress,chainId:o.chainId,chainName:o.name,chainSymbol:o.chainSymbol,chainType:o.chainType,confirmations:o.confirmations,decimals:3,feeShare:"",lpRate:"",name:"Core Yield",poolAddress:"",symbol:"CYD",tokenAddress:o.yieldAddress,transferTime:{},txCostAmount:{maxAmount:"0",swap:"0",transfer:"0"},yieldAddress:o.yieldAddress};i.push({...A,yieldAddress:o.yieldAddress,tokens:d})}}}),i}async getAllowance(i,a){return await this.tokenService.getAllowance({...i,spender:i.token.yieldAddress},a)}async checkAllowance(i,a){return this.tokenService.checkAllowance({...i,spender:i.token.yieldAddress},a)}async balanceOf(i,a){return Xt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.owner,a).balanceOf(i)}async getEstimatedAmountOnDeposit(i,a){return V(i.amount),H("amount",i.amount,i.token.decimals),Xt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.token.yieldAddress,a).getEstimatedAmountOnDeposit(i)}async getWithdrawAmounts(i,a){V(i.amount),H("amount",i.amount,3);let o=await Xt(i.cydToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.owner,a).getWithdrawProportionAmount(i);return i.cydToken.tokens.filter(s=>o[s.yieldId]!==void 0).map(s=>({amount:F(o[s.yieldId],s.decimals).toFixed(),token:s}))}};function Xt(r,i,a,o,s){switch(X.getChainProperty(r).chainType){case"EVM":{if(s)return new sn(s,i);{let d=a.getNodeRpcUrl(r),A=new Ls(d);return A.defaultReturnFormat={number:Hs.STR,bytes:Ms.HEX},new sn(A,i)}}case"TRX":{if(s)return new dn(s,i);{let d=a.getNodeRpcUrl(r),A=new Ss({fullHost:d});return A.setAddress(o),new dn(A,i)}}case"SOLANA":throw new k;case"SRB":throw new k;case"SUI":throw new k;case"ALG":throw new k}}import{Big as E}from"big.js";function Xo(r,i,a){let o=Ps(r,{decimals:i.decimals,feeShare:i.feeShare},i.poolInfo),s=js(o.amountIncludingCommissionInSystemPrecision,{decimals:a.decimals,feeShare:a.feeShare},a.poolInfo);return{swapToVUsdCalcResult:o,swapFromVUsdCalcResult:s}}function Vo(r,i,a){let o=Js(r,{decimals:a.decimals,feeShare:a.feeShare},a.poolInfo),s=ks(o.amountIncludingCommissionInSystemPrecision,{decimals:i.decimals,feeShare:i.feeShare},i.poolInfo);return{swapToVUsdCalcResult:o,swapFromVUsdCalcResult:s}}function Ps(r,{feeShare:i,decimals:a},o){let s=E(r),d=s.times(i),A=s.minus(d);return{bridgeFeeInTokenPrecision:d.round().toFixed(),amountIncludingCommissionInSystemPrecision:To(At(A,a),o),amountExcludingCommissionInSystemPrecision:To(At(s,a),o)}}function To(r,i){if(r.eq(0))return"0";let a=E(i.tokenBalance).plus(r),o=Je(a.toFixed(),i.aValue,i.dValue);return E(i.vUsdBalance).minus(o).round().toFixed()}function js(r,{feeShare:i,decimals:a},o){if(E(r).eq(0))return{bridgeFeeInTokenPrecision:"0",amountIncludingCommissionInTokenPrecision:"0",amountExcludingCommissionInTokenPrecision:"0"};let d=E(r).plus(o.vUsdBalance),A=Je(d,o.aValue,o.dValue),g=be(E(o.tokenBalance).minus(A),a),c=E(g).times(i),l=E(g).minus(c).round();return{bridgeFeeInTokenPrecision:c.round().toFixed(),amountIncludingCommissionInTokenPrecision:l.toFixed(),amountExcludingCommissionInTokenPrecision:g.toFixed()}}function Js(r,{feeShare:i,decimals:a},o){let s=E(i).div(E(1).minus(i)),d=E(r).times(s),A=E(r).plus(d);return{bridgeFeeInTokenPrecision:d.round().toFixed(),amountIncludingCommissionInSystemPrecision:wo(At(A,a),o),amountExcludingCommissionInSystemPrecision:wo(At(r,a),o)}}function wo(r,i){let a=E(i.tokenBalance).minus(r),o=Je(a.toFixed(),i.aValue,i.dValue);return E(o).minus(i.vUsdBalance).round().toFixed()}function ks(r,{feeShare:i,decimals:a},o){if(E(r).eq(0))return{bridgeFeeInTokenPrecision:"0",amountIncludingCommissionInTokenPrecision:"0",amountExcludingCommissionInTokenPrecision:"0"};let s=E(o.vUsdBalance).minus(r),d=Je(s.toFixed(),o.aValue,o.dValue),A=E(d).minus(o.tokenBalance),g=be(A.toFixed(),a),c=E(i).div(E(1).minus(i)),l=E(g).times(c),u=E(g).plus(l);return{bridgeFeeInTokenPrecision:l.round().toFixed(),amountIncludingCommissionInTokenPrecision:u.round().toFixed(),amountExcludingCommissionInTokenPrecision:g.toFixed()}}import{Big as st}from"big.js";function So(r,i,a,o,s){let d=je(r,i,a),A=be(d,i.decimals),g=Ot(d,o,s),c=st(r).times(i.feeShare),l=st(g).div(st(1).minus(o.feeShare)).minus(g);return{sourceLPSwap:{fee:F(c,i.decimals).neg().round(i.decimals,st.roundUp).toFixed(),swap:F(st(r).minus(A).minus(c),i.decimals).neg().round(i.decimals,st.roundUp).toFixed()},destLPSwap:{fee:F(l,o.decimals).neg().round(o.decimals,st.roundUp).toFixed(),swap:F(be(d,o.decimals).minus(g).minus(l),o.decimals).neg().round(o.decimals,st.roundUp).toFixed()}}}import{AlgorandClient as Mo}from"@algorandfoundation/algokit-utils";import{ABIMethod as zs,OnApplicationComplete as xs}from"algosdk";var Ii=class{constructor(i){this.nodeRpcUrlsConfig=i}async checkAssetOptIn(i,a,o){let s=this.getAlgorand(o);return Gn(i,a,s)}async buildRawTransactionAssetOptIn(i,a,o){let s=this.getAlgorand(o);typeof i=="string"&&(i=BigInt(i));let d=await s.createTransaction.assetOptIn({assetId:i,sender:a});return _e(d)}async checkAppOptIn(i,a,o){let s=this.getAlgorand(o);return Fn(i,a,s)}async buildRawTransactionAppOptIn(i,a,o){let s=this.getAlgorand(o);typeof i=="string"&&(i=BigInt(i));let d=s.newGroup(),A=s.account.random();d.addAppCallMethodCall({appId:i,method:new zs({name:"optInToApplication",desc:void 0,args:[],returns:{type:"void",desc:void 0},events:[],readonly:!1}),args:[],sender:a,signer:A,onComplete:xs.OptInOC});let{transactions:g}=await d.buildTransactions();return _e(...g)}getAlgorand(i){if(i)return Mo.fromClients({algod:i});{let a=this.nodeRpcUrlsConfig.getNodeRpcUrl("ALG");return Mo.fromConfig({algodConfig:{server:a}})}}};import Es from"axios";var Ho="3.26.0-alpha.10";function Lo(r){return Object.entries(r).reduce((i,a)=>{let o=a[0],s=a[1],d=Ds(o,s);return d&&(i[o]=d),i},{})}function Po(r){let i={};for(let[a,o]of Object.entries(r)){let s=a;for(let d of o.tokens){let A=Vt({chainSymbol:s,poolAddress:d.poolAddress}),g=te(d.poolInfo);i[A]={...d.poolInfo,imbalance:g}}}return i}function Os(r,i){let{name:a,...o}=r,{poolInfo:s,...d}=i;return{...d,...o,chainName:a}}function Qs(r){switch(r){case"allbridge":return 1;case"wormhole":return 2;case"cctp":return 3;case"cctpV2":return 4;case"oft":return 5}}function Ks(r){return Object.entries(r).reduce((i,[a,o])=>(i[a]=Us(o),i),{})}function Us(r){return Object.entries(r).reduce((i,[a,o])=>{let s=Qs(a);return s&&o!=null&&(i[s]=o),i},{})}function Ds(r,i){let a=X.getChainsProperties()[r];if(!a)return null;let o={...a,allbridgeChainId:i.chainId,bridgeId:i.bridgeId,bridgeAddress:i.bridgeAddress,oftBridgeAddress:i.oftBridgeAddress,yieldAddress:i.yieldAddress,transferTime:Ks(i.transferTime),txCostAmount:i.txCostAmount,confirmations:i.confirmations,suiAddresses:i.suiAddresses};return{...o,tokens:i.tokens.map(s=>Os(o,s))}}function Vt(r){return r.chainSymbol+"_"+r.poolAddress}function jo(r){let i=[];for(let[a,o]of Object.entries(r)){let s=a;for(let d of o.tokens)i.push({chainSymbol:s,poolAddress:d.poolAddress})}return i}function Jo(r){let i={};for(let[a,o]of Object.entries(r)){let s=a;for(let[d,A]of Object.entries(o))A.imbalance=te(A),i[Vt({chainSymbol:s,poolAddress:d})]=A}return i}var St=class{api;constructor(i){this.api=Es.create({baseURL:i.coreApiUrl,headers:{Accept:"application/json",...i.coreApiHeaders,"x-Sdk-Agent":"AllbridgeCoreSDK/"+Ho},params:i.coreApiQueryParams})}async getTokenInfo(){let{data:i}=await this.api.get("/token-info",{params:{filter:"all"}});return{chainDetailsMap:Lo(i),poolInfoMap:Po(i)}}async getPendingInfo(){let{data:i}=await this.api.get("/pending-info");return i}async getGasBalance(i,a){let{data:o}=await this.api.get(`/check/${i}/${a}`);return o}async getTransferStatus(i,a){let{data:o}=await this.api.get(`/chain/${i}/${a}`);return o}async getReceiveTransactionCost(i){if(i.messenger===5&&!i.sourceToken)throw new In("For OFT sourceToken required");let{data:a}=await this.api.post("/receive-fee",i,{headers:{"Content-Type":"application/json"}});return{exchangeRate:a.exchangeRate,fee:a.fee,sourceNativeTokenPrice:a.sourceNativeTokenPrice,adminFeeShareWithExtras:a.adminFeeShareWithExtras}}async getPoolInfoMap(i){let a=i instanceof Array?i:[i],{data:o}=await this.api.post("/pool-info",{pools:a},{headers:{"Content-Type":"application/json"}});return Jo(o)}};import bi from"timed-cache";var la=20*1e3,_s=55*1e3,Mt=class{constructor(i){this.apiClient=i;this.tokenInfoCache=new bi({defaultTtl:_s}),this.receivedTransactionCache=new bi({defaultTtl:la}),this.pendingInfoCache=new bi({defaultTtl:la}),this.gasBalanceCache=new bi({defaultTtl:la})}tokenInfoCache;pendingInfoCache;gasBalanceCache;receivedTransactionCache;getTokenInfo(){let i="TOKEN_INFO_CACHE_KEY",a=this.tokenInfoCache.get(i);if(a)return a;let o=this.apiClient.getTokenInfo();return this.tokenInfoCache.put(i,o),o}async getGasBalance(i,a){let o=`GAS_BALANCE_${i}_${a}`,s=this.gasBalanceCache.get(o);if(s)return s;let d=this.apiClient.getGasBalance(i,a);return this.gasBalanceCache.put(o,d),d}async getPendingInfo(){let i="PENDING_INFO_CACHE_KEY",a=this.pendingInfoCache.get(i);if(a)return a;let o=this.apiClient.getPendingInfo();return this.pendingInfoCache.put(i,o),o}async getReceiveTransactionCost(i){let a=`RECEIVE_TX_COST_${i.sourceChainId}_${i.destinationChainId}_${i.messenger}${i.sourceToken?"_"+i.sourceToken:""}`,o=this.receivedTransactionCache.get(a);if(o)return o;let s=await this.apiClient.getReceiveTransactionCost(i);return this.receivedTransactionCache.put(a,s),s}async getTransferStatus(i,a){return this.apiClient.getTransferStatus(i,a)}async getPoolInfoMap(i){return this.apiClient.getPoolInfoMap(i)}};var Ht=class{constructor(i){this.apiClient=i}async getChainDetailsMap(){return(await this.apiClient.getTokenInfo()).chainDetailsMap}async tokens(){let i=await this.getChainDetailsMap();return Object.values(i).flatMap(a=>a.tokens)}async getPendingInfo(){return this.apiClient.getPendingInfo()}async getGasBalance(i,a){return this.apiClient.getGasBalance(i,a)}async getChainDetailsMapAndPoolInfoMap(){return await this.apiClient.getTokenInfo()}async getTransferStatus(i,a){return await this.apiClient.getTransferStatus(i,a)}async getReceiveTransactionCost(i){return await this.apiClient.getReceiveTransactionCost(i)}async getPoolInfoMap(i){return await this.apiClient.getPoolInfoMap(i)}};var Lt=class{constructor(i,a){this.client=i;this.isStaging=a.coreApiQueryParams?.staging==="true"}isStaging;async getChainDetailsMap(i){let a=await this.client.getChainDetailsMap(),o={};for(let s in a){let d=a[s];d&&(o[s]={...d,tokens:ko(d.tokens,i,this.isStaging)})}return o}async tokens(i){return ko(await this.client.tokens(),i,this.isStaging)}async getPendingInfo(){return this.client.getPendingInfo()}async getGasBalance(i,a){return this.client.getGasBalance(i,a)}async getTransferStatus(i,a){return await this.client.getTransferStatus(i,a)}async getReceiveTransactionCost(i){return await this.client.getReceiveTransactionCost(i)}cachePut(i,a){return this.client.cachePut(i,a)}getPoolInfoByKey(i){return this.client.getPoolInfoByKey(i)}refreshPoolInfo(i){return this.client.refreshPoolInfo(i)}};function ko(r,i,a){return r.filter(o=>a?!0:o.flags[i]).map($s)}function $s(r){let{flags:i,...a}=r;return a}import qs from"timed-cache";var ed=55*1e3,Pt=class{constructor(i){this.client=i;this.poolInfoCache=new ua}poolInfoCache;async getChainDetailsMap(){return(await this.client.getChainDetailsMapAndPoolInfoMap()).chainDetailsMap}async tokens(){return await this.client.tokens()}getTransferStatus(i,a){return this.client.getTransferStatus(i,a)}getReceiveTransactionCost(i){return this.client.getReceiveTransactionCost(i)}getPendingInfo(){return this.client.getPendingInfo()}getGasBalance(i,a){return this.client.getGasBalance(i,a)}async getPoolInfoByKey(i){this.poolInfoCache.putAllIfNotExists((await this.client.getChainDetailsMapAndPoolInfoMap()).poolInfoMap);let a=this.poolInfoCache.get(i);if(a)return a;{let o=await this.client.getPoolInfoMap(i);this.poolInfoCache.putAll(o);let s=o[Vt(i)];if(s)return s;throw new I("Cannot find pool info for "+i.poolAddress+" on chain "+i.chainSymbol)}}async refreshPoolInfo(i){let a;if(i)this.poolInfoCache.putAllIfNotExists((await this.client.getChainDetailsMapAndPoolInfoMap()).poolInfoMap),a=await this.client.getPoolInfoMap(i);else{let o=await this.client.getChainDetailsMapAndPoolInfoMap();a=await this.client.getPoolInfoMap(jo(o.chainDetailsMap))}this.poolInfoCache.putAll(a)}cachePut(i,a){this.poolInfoCache.put(Vt(i),a)}},ua=class{cache;constructor(){this.cache=new qs({defaultTtl:ed})}putAll(i){for(let[a,o]of Object.entries(i))this.cache.put(a,o)}putAllIfNotExists(i){for(let[a,o]of Object.entries(i))this.cache.get(a)||this.cache.put(a,o)}put(i,a){this.cache.put(i,a)}get(i){let a=Vt(i);return this.cache.get(a)}};import{AlgorandClient as xo}from"@algorandfoundation/algokit-utils";import{Big as gd}from"big.js";import{TronWeb as cd}from"tronweb";import{Web3 as ld}from"web3";import{Big as zo}from"big.js";var le=class{async checkAllowance(i){let a=await this.getAllowance(i);return zo(a).gte(zo(i.amount))}};var An=class extends le{constructor(a,o){super();this.algorand=a;this.api=o}chainType="SUI";approve(a){throw new k}buildRawTransactionApprove(a){throw new k}getAllowance(a){throw new k}async getNativeTokenBalance(a){let{account:o}=a;return(await this.algorand.account.getInformation(o)).balance.microAlgo.toString()}async getTokenBalance(a){let{account:o,token:s}=a;try{return(await this.algorand.asset.getAccountInformation(o,BigInt(s.tokenAddress))).balance.toString()}catch(d){if(d instanceof Error)return d.message.includes("account asset info not found"),"0";throw d}}};var td={abi:[{inputs:[{internalType:"string",name:"name_",type:"string"},{internalType:"string",name:"symbol_",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"}]},yi=td;var nd="0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",id="0xdac17f958d2ee523a2206206994597c13d831ec7",ad=1e5,gn=class extends le{constructor(a,o){super();this.web3=a;this.api=o}chainType="EVM";getAllowance(a){let o=a.token.tokenAddress,s=a.owner,d=a.spender;return this.getAllowanceByTokenAddress(o,s,d)}getAllowanceByTokenAddress(a,o,s){return this.getERC20Contract(a).methods.allowance(o,s).call()}async getTokenBalance(a){return await this.getERC20Contract(a.token.tokenAddress).methods.balanceOf(a.account).call()}async getNativeTokenBalance(a){return(await this.web3.eth.getBalance(a.account)).toString()}async approve(a){if(this.isUsdt(a.tokenAddress)&&await this.getAllowanceByTokenAddress(a.tokenAddress,a.owner,a.spender)!=="0"){let d=await this.buildRawTransactionApprove({...a,amount:"0"});await this.sendRawTransaction(d,a.chainSymbol)}let o=await this.buildRawTransactionApprove(a);return await this.sendRawTransaction(o,a.chainSymbol)}isUsdt(a){return a.toLowerCase()===id}buildRawTransactionApprove(a){let{tokenAddress:o,spender:s,owner:d,amount:A}=a,c=this.getERC20Contract(o).methods.approve(s,A==null?nd:xn(A));return Promise.resolve({from:d,to:o,value:"0",data:c.encodeABI()})}async sendRawTransaction(a,o){let s=a,d={maxPriorityFeePerGas:void 0,maxFeePerGas:void 0};o==="POL"?s.gas=ad:s.gas=await this.web3.eth.estimateGas(a);let{transactionHash:A}=await this.web3.eth.sendTransaction({...s,...d});return{txId:A.toString()}}getERC20Contract(a){return new this.web3.eth.Contract(yi.abi,a)}};import{AnchorProvider as od}from"@project-serum/anchor";import{Connection as rd,PublicKey as hi}from"@solana/web3.js";var vi=class extends le{constructor(a,o){super();this.solanaRpcUrl=a;this.api=o}chainType="SOLANA";approve(a){throw new k}buildRawTransactionApprove(a){throw new k}buildAnchorProvider(a){let o=new rd(this.solanaRpcUrl,"confirmed"),s=new hi(a);return new od(o,{publicKey:s},{preflightCommitment:"confirmed",commitment:"confirmed"})}getAllowance(a){throw new k}async getTokenBalance(a){let{account:o,token:s}=a;try{let d=await we(new hi(o),new hi(s.tokenAddress));return(await Rt(d,this.buildAnchorProvider(o))).amount.toString()}catch(d){if(d instanceof Error)return d.message.startsWith("Account does not exist"),"0";throw d}}async getNativeTokenBalance(a){return(await this.buildAnchorProvider(a.account).connection.getBalance(new hi(a.account))).toString()}};import{Horizon as w2,NotFoundError as sd}from"@stellar/stellar-sdk";var Yi=class extends le{constructor(a,o,s){super();this.nodeRpcUrlsConfig=a;this.params=o;this.api=s}chainType="SRB";getAllowance(){throw new k}async getTokenBalance(a){if(!a.token.originTokenAddress)throw new I("OriginTokenAddress missing");let[o,s]=a.token.originTokenAddress.split(":"),d=new w2.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")),A;try{A=await d.loadAccount(a.account)}catch(l){if(l instanceof sd)return"0";throw l}let c=A.balances.find(l=>(l.asset_type==="credit_alphanum4"||l.asset_type==="credit_alphanum12")&&l.asset_code==o&&l.asset_issuer==s);return c?.balance?f(c.balance,X.getChainDecimalsByType(X.getChainProperty(a.token.chainSymbol).chainType)).toFixed():"0"}async getNativeTokenBalance(a){let A=(await new w2.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")).loadAccount(a.account)).balances.find(g=>g.asset_type==="native");return A?.balance?f(A.balance,X.getChainDecimalsByType(X.getChainProperty(a.chainSymbol).chainType)).toFixed():"0"}approve(){throw new k}buildRawTransactionApprove(){throw new k}};import{SuiClient as dd}from"@mysten/sui/client";var Ri=class extends le{constructor(a,o){super();this.suiRpcUrl=a;this.api=o;this.suiClient=new dd({url:this.suiRpcUrl})}chainType="SUI";suiClient;approve(a){throw new k}buildRawTransactionApprove(a){throw new k}getAllowance(a){throw new k}async getTokenBalance(a){if(!a.token.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");return(await this.suiClient.getBalance({owner:a.account,coinType:a.token.originTokenAddress})).totalBalance}async getNativeTokenBalance(a){let o=await xe(s=>this.suiClient.getCoins({owner:a.account,cursor:s}));return o.length===0?"0":o.reduce((s,d)=>s+BigInt(d.balance),BigInt(0)).toString()}};var Ad="0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",cn=class extends le{constructor(a,o){super();this.tronWeb=a;this.api=o}chainType="TRX";async getAllowance(a){let{token:{tokenAddress:o},owner:s}=a;return(await(await this.getContract(o)).methods.allowance(s,a.spender).call()).toString()}async getTokenBalance(a){return(await(await this.getContract(a.token.tokenAddress)).balanceOf(a.account).call()).toString()}async getNativeTokenBalance(a){return(await this.tronWeb.trx.getBalance(a.account)).toString()}async approve(a){let o=await this.buildRawTransactionApprove(a);return await On(this.tronWeb,o)}async buildRawTransactionApprove(a){let{tokenAddress:o,spender:s,owner:d,amount:A}=a,g=A==null?Ad:xn(A),c=[{type:"address",value:s},{type:"uint256",value:g}];return this.buildRawTransaction(o,"approve(address,uint256)",c,"0",d)}getContract(a){return this.tronWeb.contract(yi.abi,a)}async buildRawTransaction(a,o,s,d,A){let g=await this.tronWeb.transactionBuilder.triggerSmartContract(a,o,{callValue:+d},s,A);if(!g?.result?.result)throw new I("Unknown error: "+JSON.stringify(g,null,2));return g.transaction}};var jt=class{constructor(i,a,o){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o}async getAllowance(i,a){let o=await this.getChainTokenService(i.token.chainSymbol,i.owner,a).getAllowance(i);return F(o,i.token.decimals).toFixed()}async checkAllowance(i,a){return V(i.amount),H("amount",i.amount,i.token.decimals),this.getChainTokenService(i.token.chainSymbol,i.owner,a).checkAllowance(this.prepareCheckAllowanceParams(i))}async approve(i,a){return a.amount&&(V(a.amount),H("amount",a.amount,a.token.decimals)),this.getChainTokenService(a.token.chainSymbol,a.owner,i).approve(this.prepareApproveParams(a))}async buildRawTransactionApprove(i,a){return i.amount&&(V(i.amount),H("amount",i.amount,i.token.decimals)),this.getChainTokenService(i.token.chainSymbol,i.owner,a).buildRawTransactionApprove(this.prepareApproveParams(i))}async getTokenBalance(i,a){let o=await this.getChainTokenService(i.token.chainSymbol,i.account,a).getTokenBalance(i);return i.token.decimals?F(o,i.token.decimals).toFixed():o}async getNativeTokenBalance(i,a){let o=await this.getChainTokenService(i.chainSymbol,i.account,a).getNativeTokenBalance(i);return{int:o,float:F(o,X.getChainDecimalsByType(X.getChainProperty(i.chainSymbol).chainType)).toFixed()}}getChainTokenService(i,a,o){switch(X.getChainProperty(i).chainType){case"EVM":{if(o)return new gn(o,this.api);{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i);return new gn(new ld(s),this.api)}}case"TRX":{if(o)return new cn(o,this.api);{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i),d=new cd({fullHost:s});return d.setAddress(a),new cn(d,this.api)}}case"SOLANA":{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i);return new vi(s,this.api)}case"SRB":return new Yi(this.nodeRpcUrlsConfig,this.params,this.api);case"SUI":return new Ri(this.nodeRpcUrlsConfig.getNodeRpcUrl(i),this.api);case"ALG":if(o){let s=o,d=xo.fromClients({algod:s});return new An(d,this.api)}else{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i),d=xo.fromConfig({algodConfig:{server:s}});return new An(d,this.api)}}}prepareCheckAllowanceParams(i){return{...i,amount:f(i.amount,i.token.decimals)}}prepareApproveParams(i){return{tokenAddress:i.token.tokenAddress,owner:i.owner,spender:i.spender,chainSymbol:i.token.chainSymbol,amount:i.amount==null?void 0:gd(i.amount).toFixed()}}};var Wi=class{constructor(i,a){this.nodeRpcUrlsConfig=i;this.params=a;let o=new St(a),s=new Mt(o),d=new Ht(s),A=new Pt(d);this.api=new Lt(A,a),this.tokenService=new jt(this.api,i,a)}api;tokenService;buildRawTransactionApprove(i,a){return this.tokenService.buildRawTransactionApprove(i,a)}checkAllowance(i,a){return this.tokenService.checkAllowance(i,a)}getAllowance(i,a){return this.tokenService.getAllowance(i,a)}};import{Connection as ud,PublicKey as md,TransactionMessage as pd}from"@solana/web3.js";var Bi=class{constructor(i,a){this.nodeRpcUrlsConfig=i;this.params=a}async addMemoToTx(i,a){if(a.length>28)throw new I("InvalidArgumentException memo cannot be more than 28 characters");let o=new ud(this.nodeRpcUrlsConfig.getNodeRpcUrl("SOL"),"confirmed"),s=await ct(i,o),d=pd.decompile(i.message,{addressLookupTableAccounts:s}),A=d.instructions[d.instructions.length-1];if(!A?.keys)throw new I("Last instruction or its keys are invalid.");A.keys.push({pubkey:new md(Buffer.from(a)),isSigner:!1,isWritable:!1}),i.message=d.compileToV0Message(s)}};import{Asset as bd,BASE_FEE as yd,contract as GW,Horizon as Oo,Operation as hd,Operation as vd,rpc as un,TimeoutInfinite as Yd,TransactionBuilder as ma,TransactionBuilder as Qo}from"@stellar/stellar-sdk";import{contract as e}from"@stellar/stellar-sdk";var Cd=e.Spec,Id=e.Client;var ln=class extends Id{constructor(a){super(new Cd(["AAAAAAAAAYlSZXR1cm5zIHRoZSBhbGxvd2FuY2UgZm9yIGBzcGVuZGVyYCB0byB0cmFuc2ZlciBmcm9tIGBmcm9tYC4KClRoZSBhbW91bnQgcmV0dXJuZWQgaXMgdGhlIGFtb3VudCB0aGF0IHNwZW5kZXIgaXMgYWxsb3dlZCB0byB0cmFuc2ZlcgpvdXQgb2YgZnJvbSdzIGJhbGFuY2UuIFdoZW4gdGhlIHNwZW5kZXIgdHJhbnNmZXJzIGFtb3VudHMsIHRoZSBhbGxvd2FuY2UKd2lsbCBiZSByZWR1Y2VkIGJ5IHRoZSBhbW91bnQgdHJhbnNmZXJlZC4KCiMgQXJndW1lbnRzCgoqIGBmcm9tYCAtIFRoZSBhZGRyZXNzIGhvbGRpbmcgdGhlIGJhbGFuY2Ugb2YgdG9rZW5zIHRvIGJlIGRyYXduIGZyb20uCiogYHNwZW5kZXJgIC0gVGhlIGFkZHJlc3Mgc3BlbmRpbmcgdGhlIHRva2VucyBoZWxkIGJ5IGBmcm9tYC4AAAAAAAAJYWxsb3dhbmNlAAAAAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAAB3NwZW5kZXIAAAAAEwAAAAEAAAAL","AAAAAAAAAIlSZXR1cm5zIHRydWUgaWYgYGlkYCBpcyBhdXRob3JpemVkIHRvIHVzZSBpdHMgYmFsYW5jZS4KCiMgQXJndW1lbnRzCgoqIGBpZGAgLSBUaGUgYWRkcmVzcyBmb3Igd2hpY2ggdG9rZW4gYXV0aG9yaXphdGlvbiBpcyBiZWluZyBjaGVja2VkLgAAAAAAAAphdXRob3JpemVkAAAAAAABAAAAAAAAAAJpZAAAAAAAEwAAAAEAAAAB","AAAAAAAAA55TZXQgdGhlIGFsbG93YW5jZSBieSBgYW1vdW50YCBmb3IgYHNwZW5kZXJgIHRvIHRyYW5zZmVyL2J1cm4gZnJvbQpgZnJvbWAuCgpUaGUgYW1vdW50IHNldCBpcyB0aGUgYW1vdW50IHRoYXQgc3BlbmRlciBpcyBhcHByb3ZlZCB0byB0cmFuc2ZlciBvdXQgb2YKZnJvbSdzIGJhbGFuY2UuIFRoZSBzcGVuZGVyIHdpbGwgYmUgYWxsb3dlZCB0byB0cmFuc2ZlciBhbW91bnRzLCBhbmQKd2hlbiBhbiBhbW91bnQgaXMgdHJhbnNmZXJyZWQgdGhlIGFsbG93YW5jZSB3aWxsIGJlIHJlZHVjZWQgYnkgdGhlCmFtb3VudCB0cmFuc2ZlcmVkLgoKIyBBcmd1bWVudHMKCiogYGZyb21gIC0gVGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgYmFsYW5jZSBvZiB0b2tlbnMgdG8gYmUgZHJhd24gZnJvbS4KKiBgc3BlbmRlcmAgLSBUaGUgYWRkcmVzcyBiZWluZyBhdXRob3JpemVkIHRvIHNwZW5kIHRoZSB0b2tlbnMgaGVsZCBieQpgZnJvbWAuCiogYGFtb3VudGAgLSBUaGUgdG9rZW5zIHRvIGJlIG1hZGUgYXZhaWxhYmxlIHRvIGBzcGVuZGVyYC4KKiBgZXhwaXJhdGlvbl9sZWRnZXJgIC0gVGhlIGxlZGdlciBudW1iZXIgd2hlcmUgdGhpcyBhbGxvd2FuY2UgZXhwaXJlcy4gQ2Fubm90CmJlIGxlc3MgdGhhbiB0aGUgY3VycmVudCBsZWRnZXIgbnVtYmVyIHVubGVzcyB0aGUgYW1vdW50IGlzIGJlaW5nIHNldCB0byAwLgpBbiBleHBpcmVkIGVudHJ5ICh3aGVyZSBleHBpcmF0aW9uX2xlZGdlciA8IHRoZSBjdXJyZW50IGxlZGdlciBudW1iZXIpCnNob3VsZCBiZSB0cmVhdGVkIGFzIGEgMCBhbW91bnQgYWxsb3dhbmNlLgoKIyBFdmVudHMKCkVtaXRzIGFuIGV2ZW50IHdpdGggdG9waWNzIGBbImFwcHJvdmUiLCBmcm9tOiBBZGRyZXNzLApzcGVuZGVyOiBBZGRyZXNzXSwgZGF0YSA9IFthbW91bnQ6IGkxMjgsIGV4cGlyYXRpb25fbGVkZ2VyOiB1MzJdYAAAAAAAB2FwcHJvdmUAAAAABAAAAAAAAAAEZnJvbQAAABMAAAAAAAAAB3NwZW5kZXIAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAAAAABFleHBpcmF0aW9uX2xlZGdlcgAAAAAAAAQAAAAA","AAAAAAAAAJhSZXR1cm5zIHRoZSBiYWxhbmNlIG9mIGBpZGAuCgojIEFyZ3VtZW50cwoKKiBgaWRgIC0gVGhlIGFkZHJlc3MgZm9yIHdoaWNoIGEgYmFsYW5jZSBpcyBiZWluZyBxdWVyaWVkLiBJZiB0aGUKYWRkcmVzcyBoYXMgbm8gZXhpc3RpbmcgYmFsYW5jZSwgcmV0dXJucyAwLgAAAAdiYWxhbmNlAAAAAAEAAAAAAAAAAmlkAAAAAAATAAAAAQAAAAs=","AAAAAAAAAWRCdXJuIGBhbW91bnRgIGZyb20gYGZyb21gLgoKUmVkdWNlcyBmcm9tJ3MgYmFsYW5jZSBieSB0aGUgYW1vdW50LCB3aXRob3V0IHRyYW5zZmVycmluZyB0aGUgYmFsYW5jZQp0byBhbm90aGVyIGhvbGRlcidzIGJhbGFuY2UuCgojIEFyZ3VtZW50cwoKKiBgZnJvbWAgLSBUaGUgYWRkcmVzcyBob2xkaW5nIHRoZSBiYWxhbmNlIG9mIHRva2VucyB3aGljaCB3aWxsIGJlCmJ1cm5lZCBmcm9tLgoqIGBhbW91bnRgIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdG8gYmUgYnVybmVkLgoKIyBFdmVudHMKCkVtaXRzIGFuIGV2ZW50IHdpdGggdG9waWNzIGBbImJ1cm4iLCBmcm9tOiBBZGRyZXNzXSwgZGF0YSA9IFthbW91bnQ6CmkxMjhdYAAAAARidXJuAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=","AAAAAAAAAtxCdXJuIGBhbW91bnRgIGZyb20gYGZyb21gLCBjb25zdW1pbmcgdGhlIGFsbG93YW5jZSBvZiBgc3BlbmRlcmAuCgpSZWR1Y2VzIGZyb20ncyBiYWxhbmNlIGJ5IHRoZSBhbW91bnQsIHdpdGhvdXQgdHJhbnNmZXJyaW5nIHRoZSBiYWxhbmNlCnRvIGFub3RoZXIgaG9sZGVyJ3MgYmFsYW5jZS4KClRoZSBzcGVuZGVyIHdpbGwgYmUgYWxsb3dlZCB0byBidXJuIHRoZSBhbW91bnQgZnJvbSBmcm9tJ3MgYmFsYW5jZSwgaWYKdGhlIGFtb3VudCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGFsbG93YW5jZSB0aGF0IHRoZSBzcGVuZGVyIGhhcwpvbiB0aGUgZnJvbSdzIGJhbGFuY2UuIFRoZSBzcGVuZGVyJ3MgYWxsb3dhbmNlIG9uIGZyb20ncyBiYWxhbmNlIHdpbGwgYmUKcmVkdWNlZCBieSB0aGUgYW1vdW50LgoKIyBBcmd1bWVudHMKCiogYHNwZW5kZXJgIC0gVGhlIGFkZHJlc3MgYXV0aG9yaXppbmcgdGhlIGJ1cm4sIGFuZCBoYXZpbmcgaXRzIGFsbG93YW5jZQpjb25zdW1lZCBkdXJpbmcgdGhlIGJ1cm4uCiogYGZyb21gIC0gVGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgYmFsYW5jZSBvZiB0b2tlbnMgd2hpY2ggd2lsbCBiZQpidXJuZWQgZnJvbS4KKiBgYW1vdW50YCAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIHRvIGJlIGJ1cm5lZC4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJidXJuIiwgZnJvbTogQWRkcmVzc10sIGRhdGEgPSBbYW1vdW50OgppMTI4XWAAAAAJYnVybl9mcm9tAAAAAAAAAwAAAAAAAAAHc3BlbmRlcgAAAAATAAAAAAAAAARmcm9tAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA==","AAAAAAAAAVNDbGF3YmFjayBgYW1vdW50YCBmcm9tIGBmcm9tYCBhY2NvdW50LiBgYW1vdW50YCBpcyBidXJuZWQgaW4gdGhlCmNsYXdiYWNrIHByb2Nlc3MuCgojIEFyZ3VtZW50cwoKKiBgZnJvbWAgLSBUaGUgYWRkcmVzcyBob2xkaW5nIHRoZSBiYWxhbmNlIGZyb20gd2hpY2ggdGhlIGNsYXdiYWNrIHdpbGwKdGFrZSB0b2tlbnMuCiogYGFtb3VudGAgLSBUaGUgYW1vdW50IG9mIHRva2VucyB0byBiZSBjbGF3ZWQgYmFjay4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJjbGF3YmFjayIsIGFkbWluOiBBZGRyZXNzLCB0bzogQWRkcmVzc10sCmRhdGEgPSBbYW1vdW50OiBpMTI4XWAAAAAACGNsYXdiYWNrAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=","AAAAAAAAAIBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGVjaW1hbHMgdXNlZCB0byByZXByZXNlbnQgYW1vdW50cyBvZiB0aGlzIHRva2VuLgoKIyBQYW5pY3MKCklmIHRoZSBjb250cmFjdCBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLgAAAAhkZWNpbWFscwAAAAAAAAABAAAABA==","AAAAAAAAAPVNaW50cyBgYW1vdW50YCB0byBgdG9gLgoKIyBBcmd1bWVudHMKCiogYHRvYCAtIFRoZSBhZGRyZXNzIHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgbWludGVkIHRva2Vucy4KKiBgYW1vdW50YCAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIHRvIGJlIG1pbnRlZC4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJtaW50IiwgYWRtaW46IEFkZHJlc3MsIHRvOiBBZGRyZXNzXSwgZGF0YQo9IFthbW91bnQ6IGkxMjhdYAAAAAAAAARtaW50AAAAAgAAAAAAAAACdG8AAAAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=","AAAAAAAAAFlSZXR1cm5zIHRoZSBuYW1lIGZvciB0aGlzIHRva2VuLgoKIyBQYW5pY3MKCklmIHRoZSBjb250cmFjdCBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLgAAAAAAAARuYW1lAAAAAAAAAAEAAAAQ","AAAAAAAAAQxTZXRzIHRoZSBhZG1pbmlzdHJhdG9yIHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBgbmV3X2FkbWluYC4KCiMgQXJndW1lbnRzCgoqIGBuZXdfYWRtaW5gIC0gVGhlIGFkZHJlc3Mgd2hpY2ggd2lsbCBoZW5jZWZvcnRoIGJlIHRoZSBhZG1pbmlzdHJhdG9yCm9mIHRoaXMgdG9rZW4gY29udHJhY3QuCgojIEV2ZW50cwoKRW1pdHMgYW4gZXZlbnQgd2l0aCB0b3BpY3MgYFsic2V0X2FkbWluIiwgYWRtaW46IEFkZHJlc3NdLCBkYXRhID0KW25ld19hZG1pbjogQWRkcmVzc11gAAAACXNldF9hZG1pbgAAAAAAAAEAAAAAAAAACW5ld19hZG1pbgAAAAAAABMAAAAA","AAAAAAAAAEZSZXR1cm5zIHRoZSBhZG1pbiBvZiB0aGUgY29udHJhY3QuCgojIFBhbmljcwoKSWYgdGhlIGFkbWluIGlzIG5vdCBzZXQuAAAAAAAFYWRtaW4AAAAAAAAAAAAAAQAAABM=","AAAAAAAAAVBTZXRzIHdoZXRoZXIgdGhlIGFjY291bnQgaXMgYXV0aG9yaXplZCB0byB1c2UgaXRzIGJhbGFuY2UuIElmCmBhdXRob3JpemVkYCBpcyB0cnVlLCBgaWRgIHNob3VsZCBiZSBhYmxlIHRvIHVzZSBpdHMgYmFsYW5jZS4KCiMgQXJndW1lbnRzCgoqIGBpZGAgLSBUaGUgYWRkcmVzcyBiZWluZyAoZGUtKWF1dGhvcml6ZWQuCiogYGF1dGhvcml6ZWAgLSBXaGV0aGVyIG9yIG5vdCBgaWRgIGNhbiB1c2UgaXRzIGJhbGFuY2UuCgojIEV2ZW50cwoKRW1pdHMgYW4gZXZlbnQgd2l0aCB0b3BpY3MgYFsic2V0X2F1dGhvcml6ZWQiLCBpZDogQWRkcmVzc10sIGRhdGEgPQpbYXV0aG9yaXplOiBib29sXWAAAAAOc2V0X2F1dGhvcml6ZWQAAAAAAAIAAAAAAAAAAmlkAAAAAAATAAAAAAAAAAlhdXRob3JpemUAAAAAAAABAAAAAA==","AAAAAAAAAFtSZXR1cm5zIHRoZSBzeW1ib2wgZm9yIHRoaXMgdG9rZW4uCgojIFBhbmljcwoKSWYgdGhlIGNvbnRyYWN0IGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQuAAAAAAZzeW1ib2wAAAAAAAAAAAABAAAAEA==","AAAAAAAAAWRUcmFuc2ZlciBgYW1vdW50YCBmcm9tIGBmcm9tYCB0byBgdG9gLgoKIyBBcmd1bWVudHMKCiogYGZyb21gIC0gVGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgYmFsYW5jZSBvZiB0b2tlbnMgd2hpY2ggd2lsbCBiZQp3aXRoZHJhd24gZnJvbS4KKiBgdG9gIC0gVGhlIGFkZHJlc3Mgd2hpY2ggd2lsbCByZWNlaXZlIHRoZSB0cmFuc2ZlcnJlZCB0b2tlbnMuCiogYGFtb3VudGAgLSBUaGUgYW1vdW50IG9mIHRva2VucyB0byBiZSB0cmFuc2ZlcnJlZC4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJ0cmFuc2ZlciIsIGZyb206IEFkZHJlc3MsIHRvOiBBZGRyZXNzXSwKZGF0YSA9IFthbW91bnQ6IGkxMjhdYAAAAAh0cmFuc2ZlcgAAAAMAAAAAAAAABGZyb20AAAATAAAAAAAAAAJ0bwAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA==","AAAAAAAAAzNUcmFuc2ZlciBgYW1vdW50YCBmcm9tIGBmcm9tYCB0byBgdG9gLCBjb25zdW1pbmcgdGhlIGFsbG93YW5jZSB0aGF0CmBzcGVuZGVyYCBoYXMgb24gYGZyb21gJ3MgYmFsYW5jZS4gQXV0aG9yaXplZCBieSBzcGVuZGVyCihgc3BlbmRlci5yZXF1aXJlX2F1dGgoKWApLgoKVGhlIHNwZW5kZXIgd2lsbCBiZSBhbGxvd2VkIHRvIHRyYW5zZmVyIHRoZSBhbW91bnQgZnJvbSBmcm9tJ3MgYmFsYW5jZQppZiB0aGUgYW1vdW50IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgYWxsb3dhbmNlIHRoYXQgdGhlIHNwZW5kZXIKaGFzIG9uIHRoZSBmcm9tJ3MgYmFsYW5jZS4gVGhlIHNwZW5kZXIncyBhbGxvd2FuY2Ugb24gZnJvbSdzIGJhbGFuY2UKd2lsbCBiZSByZWR1Y2VkIGJ5IHRoZSBhbW91bnQuCgojIEFyZ3VtZW50cwoKKiBgc3BlbmRlcmAgLSBUaGUgYWRkcmVzcyBhdXRob3JpemluZyB0aGUgdHJhbnNmZXIsIGFuZCBoYXZpbmcgaXRzCmFsbG93YW5jZSBjb25zdW1lZCBkdXJpbmcgdGhlIHRyYW5zZmVyLgoqIGBmcm9tYCAtIFRoZSBhZGRyZXNzIGhvbGRpbmcgdGhlIGJhbGFuY2Ugb2YgdG9rZW5zIHdoaWNoIHdpbGwgYmUKd2l0aGRyYXduIGZyb20uCiogYHRvYCAtIFRoZSBhZGRyZXNzIHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgdHJhbnNmZXJyZWQgdG9rZW5zLgoqIGBhbW91bnRgIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdG8gYmUgdHJhbnNmZXJyZWQuCgojIEV2ZW50cwoKRW1pdHMgYW4gZXZlbnQgd2l0aCB0b3BpY3MgYFsidHJhbnNmZXIiLCBmcm9tOiBBZGRyZXNzLCB0bzogQWRkcmVzc10sCmRhdGEgPSBbYW1vdW50OiBpMTI4XWAAAAAADXRyYW5zZmVyX2Zyb20AAAAAAAAEAAAAAAAAAAdzcGVuZGVyAAAAABMAAAAAAAAABGZyb20AAAATAAAAAAAAAAJ0bwAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA=="]),a);this.options=a}fromJSON={allowance:this.txFromJSON,authorized:this.txFromJSON,approve:this.txFromJSON,balance:this.txFromJSON,burn:this.txFromJSON,burn_from:this.txFromJSON,clawback:this.txFromJSON,decimals:this.txFromJSON,mint:this.txFromJSON,name:this.txFromJSON,set_admin:this.txFromJSON,admin:this.txFromJSON,set_authorized:this.txFromJSON,symbol:this.txFromJSON,transfer:this.txFromJSON,transfer_from:this.txFromJSON}};var Rd=100,Wd=180,Zi=class{constructor(i,a){this.nodeRpcUrlsConfig=i;this.params=a}async buildChangeTrustLineXdrTx(i){let o=await new Oo.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")).loadAccount(i.sender),d=await this.getContract(ln,i.tokenAddress).name();if(Nt(d))throw new I;let A=ft(d);if(!A)throw new I;let[g,c]=A.split(":");if(g===void 0||c===void 0)throw new I("Invalid token name format. Expected format 'symbol:srbTokenAddress'");let l=new bd(g,c),u=vd.changeTrust({asset:l,limit:i.limit});return new Qo(o,{fee:Rd.toString(10),networkPassphrase:this.params.sorobanNetworkPassphrase}).addOperation(u).setTimeout(Wd).build().toXDR()}async getBalanceLine(i,a){let s=await this.getContract(ln,a).name();if(Nt(s))throw new I;let d=ft(s);if(!d)throw new I;let[A,g]=d.split(":"),c=this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR");return(await new Oo.Server(c).loadAccount(i)).balances.find(p=>(p.asset_type==="credit_alphanum4"||p.asset_type==="credit_alphanum12")&&p.asset_code==A&&p.asset_issuer==g)}async submitTransactionStellar(i){let a=new Oo.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")),o=Qo.fromXDR(i,this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR"));return await a.submitTransaction(o)}async simulateAndCheckRestoreTxRequiredSoroban(i,a){let o=new un.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")),s=await o.getAccount(a),d=ma.fromXDR(i,this.params.sorobanNetworkPassphrase),A=await o.simulateTransaction(d);if(un.Api.isSimulationRestore(A))return new ma(s,{fee:(+yd+ +A.restorePreamble.minResourceFee).toString(),networkPassphrase:this.params.sorobanNetworkPassphrase}).setSorobanData(A.restorePreamble.transactionData.build()).addOperation(hd.restoreFootprint({})).setTimeout(Yd).build().toXDR()}async sendTransactionSoroban(i){let a=new un.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")),o=ma.fromXDR(i,this.params.sorobanNetworkPassphrase);return a.sendTransaction(o)}async confirmTx(i,a=15){let o=new un.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")),s=await Ia(()=>o.getTransaction(i),A=>A.status===un.Api.GetTransactionStatus.NOT_FOUND,a);if(s.length===0)throw new I("No transaction responses found.");let d=s[s.length-1];if(!d)throw new I("Unexpected error: last response is undefined.");return d}getContract(i,a){let o={contractId:a,networkPassphrase:this.params.sorobanNetworkPassphrase,rpcUrl:this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")};return new i(o)}};var Gi=class{constructor(i,a){this.nodeRpcUrlsConfig=i;this.api=a}_suiBridgeService;async buildSendTxFromCustomTx(i,a,o){return this.suiBridgeService.buildRawTransactionSendFromCustomTx(i,a,o)}get suiBridgeService(){return this._suiBridgeService||(this._suiBridgeService=new Gt(this.nodeRpcUrlsConfig,this.api)),this._suiBridgeService}};var Fi=class{constructor(i){this.service=i;this.srb=new Zi(i.nodeRpcUrlsConfig,i.params),this.sol=new Bi(i.nodeRpcUrlsConfig,i.params),this.sui=new Gi(i.nodeRpcUrlsConfig,i.api),this.evm=new Wi(i.nodeRpcUrlsConfig,i.params),this.alg=new Ii(i.nodeRpcUrlsConfig)}srb;sol;sui;evm;alg};var $e=(a=>(a.WITH_NATIVE_CURRENCY="native",a.WITH_STABLECOIN="stablecoin",a))($e||{}),fn=(a=>(a.INT="int",a.FLOAT="float",a))(fn||{});import{Big as ee}from"big.js";var mn=class{constructor(i){this.nodeRpcUrls=i}getNodeRpcUrl(i){let a=this.nodeRpcUrls[i];if(a!==void 0)return a;throw new hn(i)}},fi=class{constructor(i,a=Cn){this.nodeRpcUrlsConfig=i;X.addChainsProperties(a.additionalChainsProperties);let o=new St(a),s=new Mt(o),d=new Ht(s),A=new Pt(d);this.api=new Lt(A,a),this.tokenService=new jt(this.api,i,a),this.bridge=new Qn(this.api,i,a,this.tokenService),this.pool=new li(this.api,i,a,this.tokenService),this.yield=new Ci(this.api,i,a,this.tokenService),this.params=a}api;tokenService;params;bridge;pool;yield;async chainDetailsMap(i){return this.api.getChainDetailsMap(i)}async tokens(i){return this.api.tokens(i)}async tokensByChain(i,a){let s=(await this.api.getChainDetailsMap(a))[i];return s?s.tokens:[]}async getTransferStatus(i,a){return this.api.getTransferStatus(i,a)}async getGasBalance(i,a){return this.api.getGasBalance(i,a)}async checkAddress(){return new Promise(i=>{i({status:"OK",gasBalance:null})})}async getPendingStatusInfo(i,a,o,s){V(i);let d;a=="float"?(H("amount",i,o.decimals),d=f(i,o.decimals).toFixed()):d=i;let A=je(d,o,await $(this.api,o)),g=await $(this.api,s),c=this.getAmountFromVUsdFormatted(A,s,g),l,u=await this.api.getPendingInfo();for(let m in u[s.chainSymbol]){let p=u[s.chainSymbol];if(!p)throw new I("Cannot find pending info for "+s.chainSymbol);l=p[m]}if(l){let m=ba(l.totalSentAmount,g),p=this.getAmountFromVUsdFormatted(A,s,m),b;return ee(p.int).gt(c.int)?b={min:c,max:p}:b={min:p,max:c},{pendingTxs:l.pendingTxs,pendingAmount:{int:Re(l.totalSentAmount,3,s.decimals).toFixed(0),float:F(l.totalSentAmount,3).toFixed()},estimatedAmount:b}}return{pendingTxs:0,pendingAmount:{int:"0",float:"0"},estimatedAmount:{min:c,max:c}}}async getTokenBalance(i,a){return this.tokenService.getTokenBalance(i,a)}async getNativeTokenBalance(i,a){return this.tokenService.getNativeTokenBalance(i,a)}async calculateFeePercentOnSourceChain(i,a){V(i),H("amountFloat",i,a.decimals);let o=f(i,a.decimals);if(o.eq(0))return 0;let s=je(o,a,await $(this.api,a)),d=be(s,a.decimals);return Si(o,d)}async calculateFeePercentOnDestinationChain(i,a,o){V(i),H("amountFloat",i,a.decimals);let s=f(i,a.decimals);if(s.eq(0))return 0;let d=je(s,a,await $(this.api,a)),A=Ot(d,o,await $(this.api,o)),g=be(d,o.decimals);return Si(g,A)}async getAmountToBeReceivedAndGasFeeOptions(i,a,o,s){return V(i),H("amountToSendFloat",i,a.decimals),{amountToSendFloat:ee(i).toFixed(),amountToBeReceivedFloat:await this.getAmountToBeReceived(i,a,o,s),gasFeeOptions:await this.getGasFeeOptions(a,o,s)}}async getAmountToSendAndGasFeeOptions(i,a,o,s){return V(i),H("amountToBeReceivedFloat",i,o.decimals),{amountToSendFloat:await this.getAmountToSend(i,a,o,s),amountToBeReceivedFloat:ee(i).toFixed(),gasFeeOptions:await this.getGasFeeOptions(a,o,s)}}async getAmountToBeReceived(i,a,o,s){return this.getAmountToBeReceivedCompute(i,a,o,s,async()=>await $(this.api,a),async()=>await $(this.api,o))}async getAmountToBeReceivedFromChain(i,a,o,s,d,A){return this.getAmountToBeReceivedCompute(i,a,o,s,async()=>await this.pool.getPoolInfoFromChain(a,d),async()=>await this.pool.getPoolInfoFromChain(o,A))}async getAmountToBeReceivedCompute(i,a,o,s=1,d,A){switch(s){case 1:case 2:return this.getAmountToBeReceivedComputeWithPools(i,a,o,await d(),await A());case 3:case 4:return this.getAmountToBeReceivedComputeCctp(i,a,o,s);case 5:return this.getAmountToBeReceivedComputeOft(i,a,o)}}getAmountToBeReceivedComputeWithPools(i,a,o,s,d){V(i),H("amountToSendFloat",i,a.decimals);let A=f(i,a.decimals),g=je(A,a,s);return this.getAmountFromVUsdFormatted(g,o,d).float}getAmountToBeReceivedComputeCctp(i,a,o,s){V(i),H("amountToSendFloat",i,a.decimals);let d=f(i,a.decimals);switch(s){case 3:{if(!a.cctpAddress||!o.cctpAddress||!a.cctpFeeShare)throw new se("Such route does not support CCTP protocol");let A=d.mul(ee(1).minus(a.cctpFeeShare)).round(0,ee.roundUp),g=Re(A,a.decimals,o.decimals).round(0);return F(g,o.decimals).toFixed()}case 4:{if(!a.cctpV2Address||!o.cctpV2Address||!a.cctpV2FeeShare)throw new se("Such route does not support CCTP V2 protocol");let A=d.mul(ee(1).minus(a.cctpV2FeeShare)).round(0,ee.roundUp),g=Re(A,a.decimals,o.decimals).round(0);return F(g,o.decimals).toFixed()}}}async getAmountToBeReceivedComputeOft(i,a,o){V(i),H("amountToSendFloat",i,a.decimals);let s=f(i,a.decimals);if(!a.oftBridgeAddress||!o.oftBridgeAddress||a.oftId!==o.oftId)throw new de("Such route does not support OFT protocol");let{adminFeeShareWithExtras:d}=await this.api.getReceiveTransactionCost({sourceChainId:a.allbridgeChainId,destinationChainId:o.allbridgeChainId,messenger:5,sourceToken:a.tokenAddress});if(!d)throw new de("Such route does not support OFT protocol");let A=s.mul(ee(1).minus(d)).round(0,ee.roundUp),g=Re(A,a.decimals,o.decimals).round(0);return F(g,o.decimals).toFixed()}async getAmountToSend(i,a,o,s){return this.getAmountToSendCompute(i,a,o,s,()=>$(this.api,a),()=>$(this.api,o))}async getAmountToSendFromChain(i,a,o,s,d,A){return this.getAmountToSendCompute(i,a,o,s,()=>this.pool.getPoolInfoFromChain(a,d),()=>this.pool.getPoolInfoFromChain(o,A))}async getAmountToSendCompute(i,a,o,s=1,d,A){switch(s){case 1:case 2:return this.getAmountToSendComputeWithPools(i,a,o,await d(),await A());case 3:case 4:return this.getAmountToSendComputeCctp(i,a,o,s);case 5:return this.getAmountToSendComputeOft(i,a,o)}}getAmountToSendComputeWithPools(i,a,o,s,d){V(i),H("amountToBeReceivedFloat",i,o.decimals);let A=f(i,o.decimals),g=ha(A,o,d),c=ya(g,a,s);if(ee(c).lte(0))throw new Ke;return F(c,a.decimals).toFixed()}getAmountToSendComputeCctp(i,a,o,s){V(i),H("amountToBeReceivedFloat",i,o.decimals);let d=f(i,o.decimals);switch(s){case 3:{if(!a.cctpAddress||!o.cctpAddress||!a.cctpFeeShare)throw new se("Such route does not support CCTP protocol");let A=d.div(ee(1).minus(a.cctpFeeShare)).round(0,ee.roundDown),g=Re(A,o.decimals,a.decimals).round(0);return F(g,a.decimals).toFixed()}case 4:{if(!a.cctpV2Address||!o.cctpV2Address||!a.cctpV2FeeShare)throw new se("Such route does not support CCTP V2 protocol");let A=d.div(ee(1).minus(a.cctpV2FeeShare)).round(0,ee.roundDown),g=Re(A,o.decimals,a.decimals).round(0);return F(g,a.decimals).toFixed()}}}async getAmountToSendComputeOft(i,a,o){V(i),H("amountToBeReceivedFloat",i,o.decimals);let s=f(i,o.decimals);if(!a.oftId||!o.oftId||!a.oftBridgeAddress||a.oftId!==o.oftId)throw new de("Such route does not support OFT protocol");let{adminFeeShareWithExtras:d}=await this.api.getReceiveTransactionCost({sourceChainId:a.allbridgeChainId,destinationChainId:o.allbridgeChainId,messenger:5,sourceToken:a.tokenAddress});if(!d)throw new de("Such route does not support OFT protocol");let A=s.div(ee(1).minus(d)).round(0,ee.roundDown),g=Re(A,o.decimals,a.decimals).round(0);return F(g,a.decimals).toFixed()}async getGasFeeOptions(i,a,o){return Mi(i,a.allbridgeChainId,o,this.api)}getAverageTransferTime(i,a,o){return i.transferTime?.[a.chainSymbol]?.[o]??null}async getPoolInfoByToken(i){return await this.api.getPoolInfoByKey({chainSymbol:i.chainSymbol,poolAddress:i.poolAddress})}async refreshPoolInfo(i){if(i){let o=(i instanceof Array?i:[i]).map(s=>({chainSymbol:s.chainSymbol,poolAddress:s.poolAddress}));return this.api.refreshPoolInfo(o)}return this.api.refreshPoolInfo()}aprInPercents(i){return Ya(i)}async getExtraGasMaxLimits(i,a,o){return await Hi(i,a,o,this.api)}async getVUsdFromAmount(i,a,o){V(i);let s;a=="float"?(H("amount",i,o.decimals),s=f(i,o.decimals).toFixed()):s=i;let d=je(s,o,await $(this.api,o));return{int:d,float:F(d,3).toFixed()}}async getAmountFromVUsd(i,a){return this.getAmountFromVUsdFormatted(i,a,await $(this.api,a))}getAmountFromVUsdFormatted(i,a,o){V(i);let s=Ot(i,a,o);if(ee(s).lt(0))throw new Ke;return{int:s,float:F(s,a.decimals).toFixed()}}async swapAndBridgeFeeCalculation(i,a,o){return Xo(i,{decimals:a.decimals,feeShare:a.feeShare,poolInfo:await $(this.api,a)},{decimals:o.decimals,feeShare:o.feeShare,poolInfo:await $(this.api,o)})}async swapAndBridgeFeeCalculationReverse(i,a,o){let s=Vo(i,{decimals:a.decimals,feeShare:a.feeShare,poolInfo:await $(this.api,a)},{decimals:o.decimals,feeShare:o.feeShare,poolInfo:await $(this.api,o)}),d=s.swapFromVUsdCalcResult.amountIncludingCommissionInTokenPrecision;if(ee(d).lt(0))throw new Ke;return s}async getSendAmountDetails(i,a,o,s){V(i);let d;return a=="float"?(H("amount",i,o.decimals),d=f(i,o.decimals).toFixed()):d=i,So(d,o,await $(this.api,o),s,await $(this.api,s))}};function Bd(r){return"solanaRpcUrl"in r}var Ko=class{params;bridge;pool;yield;utils;service;constructor(i,a=Cn){let o;Bd(i)?o=new mn({SOL:i.solanaRpcUrl,TRX:i.tronRpcUrl}):o=new mn(i),this.service=new fi(o,a),this.bridge=this.service.bridge,this.pool=this.service.pool,this.yield=this.service.yield,this.utils=new Fi(this.service),this.params=a}async chainDetailsMap(i="swap"){return this.service.chainDetailsMap(i)}async tokens(i="swap"){return this.service.tokens(i)}async tokensByChain(i,a="swap"){return this.service.tokensByChain(i,a)}async getTransferStatus(i,a){return this.service.getTransferStatus(i,a)}async getGasBalance(i,a){return this.service.getGasBalance(i,a)}async checkAddress(i,a,o){return await this.service.checkAddress()}async getPendingStatusInfo(i,a,o,s){return this.service.getPendingStatusInfo(i,a,o,s)}async getTokenBalance(i,a){return this.service.getTokenBalance(i,a)}async getNativeTokenBalance(i,a){return this.service.getNativeTokenBalance(i,a)}async calculateFeePercentOnSourceChain(i,a){return this.service.calculateFeePercentOnSourceChain(i,a)}async calculateFeePercentOnDestinationChain(i,a,o){return this.service.calculateFeePercentOnDestinationChain(i,a,o)}async getAmountToBeReceivedAndGasFeeOptions(i,a,o,s){return this.service.getAmountToBeReceivedAndGasFeeOptions(i,a,o,s)}async getAmountToSendAndGasFeeOptions(i,a,o,s){return this.service.getAmountToSendAndGasFeeOptions(i,a,o,s)}async getAmountToBeReceived(i,a,o,s=1){return this.service.getAmountToBeReceived(i,a,o,s)}async getAmountToBeReceivedFromChain(i,a,o,s=1,d,A){return this.service.getAmountToBeReceivedFromChain(i,a,o,s,d,A)}getAmountToBeReceivedFromPools(i,a,o,s,d,A=1){switch(A){case 1:case 2:return this.service.getAmountToBeReceivedComputeWithPools(i,a,o,s,d);case 3:case 4:return this.service.getAmountToBeReceivedComputeCctp(i,a,o,A)}}async getAmountToSend(i,a,o,s=1){return this.service.getAmountToSend(i,a,o,s)}async getAmountToSendFromChain(i,a,o,s=1,d,A){return this.service.getAmountToSendFromChain(i,a,o,s,d,A)}getAmountToSendFromPools(i,a,o,s,d,A=1){switch(A){case 1:case 2:return this.service.getAmountToSendComputeWithPools(i,a,o,s,d);case 3:case 4:return this.service.getAmountToSendComputeCctp(i,a,o,A)}}async getGasFeeOptions(i,a,o){return this.service.getGasFeeOptions(i,a,o)}getAverageTransferTime(i,a,o){return this.service.getAverageTransferTime(i,a,o)}async getPoolInfoByToken(i){return this.service.getPoolInfoByToken(i)}async refreshPoolInfo(i){return this.service.refreshPoolInfo(i)}aprInPercents(i){return this.service.aprInPercents(i)}async getExtraGasMaxLimits(i,a,o=1){return this.service.getExtraGasMaxLimits(i,a,o)}async getVUsdFromAmount(i,a,o){return this.service.getVUsdFromAmount(i,a,o)}async getAmountFromVUsd(i,a){return this.service.getAmountFromVUsd(i,a)}async swapAndBridgeFeeCalculation(i,a,o){return this.service.swapAndBridgeFeeCalculation(i,a,o)}async swapAndBridgeFeeCalculationReverse(i,a,o){return this.service.swapAndBridgeFeeCalculationReverse(i,a,o)}async getSendAmountDetails(i,a,o,s){return this.service.getSendAmountDetails(i,a,o,s)}};export{Ti as AddressStatus,Ko as AllbridgeCoreSdk,fn as AmountFormat,It as AmountNotEnoughError,yn as ArgumentInvalidDecimalsError,se as CCTPDoesNotSupportedError,Ie as ChainSymbol,z as ChainType,nr as ErrorCode,bn as ExtraGasMaxLimitExceededError,$e as FeePaymentMethod,Ke as InsufficientPoolLiquidityError,Qe as InvalidAmountError,Jt as InvalidGasFeePaymentOptionError,In as InvalidMessengerOptionError,bt as InvalidTxError,ie as JupiterError,Ye as Messenger,k as MethodNotSupportedError,hn as NodeRpcUrlNotInitializedError,de as OFTDoesNotSupportedError,I as SdkError,K as SdkRootError,Ji as SolanaAutoTxFee,zt as TimeoutError,Yn as TxTooLargeError,kt as VerifyTxError,vn as YieldDoesNotSupportedError,Vs as assertYieldIsSupported,pi as isYieldSupported,Cn as mainnet,Fd as nodeRpcUrlsDefault,Gd as nodeUrlsDefault};
|
|
2
7
|
//# sourceMappingURL=index.js.map
|